@sapui5/sap.fe.macros 1.142.0 → 1.143.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/macros/.library +1 -1
  3. package/src/sap/fe/macros/CollaborativeDraftHandler.js +1 -7
  4. package/src/sap/fe/macros/CollaborativeDraftHandler.tsx +0 -6
  5. package/src/sap/fe/macros/ConditionalSwitch.js +1 -2
  6. package/src/sap/fe/macros/ConditionalSwitch.tsx +0 -1
  7. package/src/sap/fe/macros/ConditionalSwitchProperty.js +1 -3
  8. package/src/sap/fe/macros/ConditionalSwitchProperty.tsx +0 -2
  9. package/src/sap/fe/macros/Field.js +5 -5
  10. package/src/sap/fe/macros/Field.ts +5 -3
  11. package/src/sap/fe/macros/FooterContent.js +3 -2
  12. package/src/sap/fe/macros/FooterContent.tsx +2 -10
  13. package/src/sap/fe/macros/KPITag.js +6 -6
  14. package/src/sap/fe/macros/KPITag.tsx +5 -5
  15. package/src/sap/fe/macros/MacroAPI.js +2 -2
  16. package/src/sap/fe/macros/MacroAPI.ts +1 -1
  17. package/src/sap/fe/macros/MessageButton.js +3 -3
  18. package/src/sap/fe/macros/MessageButton.tsx +3 -2
  19. package/src/sap/fe/macros/MicroChart.js +3 -2
  20. package/src/sap/fe/macros/MicroChart.tsx +1 -1
  21. package/src/sap/fe/macros/Share.js +7 -7
  22. package/src/sap/fe/macros/Share.tsx +9 -6
  23. package/src/sap/fe/macros/Status.js +6 -5
  24. package/src/sap/fe/macros/Status.tsx +3 -4
  25. package/src/sap/fe/macros/ai/EasyFillDialog.js +2 -1
  26. package/src/sap/fe/macros/ai/EasyFillDialog.tsx +1 -0
  27. package/src/sap/fe/macros/ai/SummarizationButton.js +6 -4
  28. package/src/sap/fe/macros/ai/SummarizationButton.tsx +5 -3
  29. package/src/sap/fe/macros/chart/ChartDelegate.js +22 -1
  30. package/src/sap/fe/macros/chart/ChartDelegate.ts +29 -2
  31. package/src/sap/fe/macros/chart/MdcChartTemplate.js +5 -2
  32. package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +5 -2
  33. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.js +7 -7
  34. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.ts +3 -2
  35. package/src/sap/fe/macros/controls/FileWrapper.js +11 -5
  36. package/src/sap/fe/macros/controls/FileWrapper.ts +10 -4
  37. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.js +3 -1
  38. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.tsx +2 -0
  39. package/src/sap/fe/macros/coreUI/CreateDialog.js +2 -2
  40. package/src/sap/fe/macros/coreUI/CreateDialog.tsx +1 -1
  41. package/src/sap/fe/macros/coreUI/OperationParameterDialog.js +4 -4
  42. package/src/sap/fe/macros/coreUI/OperationParameterDialog.tsx +3 -3
  43. package/src/sap/fe/macros/field/FieldFormatOptions.js +2 -2
  44. package/src/sap/fe/macros/field/FieldFormatOptions.ts +1 -1
  45. package/src/sap/fe/macros/field/FieldRuntime.js +7 -2
  46. package/src/sap/fe/macros/field/FieldRuntime.ts +7 -1
  47. package/src/sap/fe/macros/filter/FilterUtils.js +31 -5
  48. package/src/sap/fe/macros/filter/FilterUtils.ts +40 -6
  49. package/src/sap/fe/macros/filterBar/FilterBarAPI.js +6 -3
  50. package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +5 -1
  51. package/src/sap/fe/macros/filterBar/FilterBarDelegate.js +19 -9
  52. package/src/sap/fe/macros/filterBar/FilterBarDelegate.ts +76 -61
  53. package/src/sap/fe/macros/filterBar/UOMValidationDelegate.js +376 -0
  54. package/src/sap/fe/macros/filterBar/UOMValidationDelegate.ts +463 -0
  55. package/src/sap/fe/macros/form/FormContainer.block.js +22 -6
  56. package/src/sap/fe/macros/form/FormContainer.block.ts +24 -6
  57. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +2 -2
  58. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +2 -1
  59. package/src/sap/fe/macros/library.js +5 -6
  60. package/src/sap/fe/macros/{library.ts → library.tsx} +1 -1
  61. package/src/sap/fe/macros/messagebundle.properties +6 -0
  62. package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +1 -1
  63. package/src/sap/fe/macros/messages/MessageButton.js +21 -12
  64. package/src/sap/fe/macros/messages/MessageButton.ts +21 -11
  65. package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.js +7 -3
  66. package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.ts +8 -2
  67. package/src/sap/fe/macros/quickView/QuickView.js +5 -4
  68. package/src/sap/fe/macros/quickView/QuickView.tsx +10 -3
  69. package/src/sap/fe/macros/table/Action.js +7 -4
  70. package/src/sap/fe/macros/table/Action.ts +3 -3
  71. package/src/sap/fe/macros/table/Column.js +3 -2
  72. package/src/sap/fe/macros/table/Column.ts +1 -1
  73. package/src/sap/fe/macros/table/MdcTableTemplate.js +6 -9
  74. package/src/sap/fe/macros/table/MdcTableTemplate.tsx +5 -7
  75. package/src/sap/fe/macros/table/Table.block.js +6 -3
  76. package/src/sap/fe/macros/table/Table.block.tsx +13 -3
  77. package/src/sap/fe/macros/table/TableAPI.js +13 -8
  78. package/src/sap/fe/macros/table/TableAPI.ts +10 -3
  79. package/src/sap/fe/macros/table/TableDefinition.js +2 -2
  80. package/src/sap/fe/macros/table/TableDefinition.ts +1 -1
  81. package/src/sap/fe/macros/table/TableEventHandlerProvider.js +3 -1
  82. package/src/sap/fe/macros/table/TableEventHandlerProvider.ts +4 -0
  83. package/src/sap/fe/macros/table/TableRuntime.js +24 -12
  84. package/src/sap/fe/macros/table/TableRuntime.ts +27 -11
  85. package/src/sap/fe/macros/table/Utils.js +9 -3
  86. package/src/sap/fe/macros/table/Utils.ts +14 -8
  87. package/src/sap/fe/macros/table/delegates/TableDelegate.js +6 -4
  88. package/src/sap/fe/macros/table/delegates/TableDelegate.ts +6 -5
  89. package/src/sap/fe/macros/table/massEdit/MassEditDialog.js +41 -15
  90. package/src/sap/fe/macros/table/massEdit/MassEditDialog.tsx +41 -22
  91. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.js +14 -5
  92. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.tsx +13 -4
  93. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.js +2 -3
  94. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.ts +3 -2
  95. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.js +37 -10
  96. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.ts +39 -15
  97. package/src/sap/fe/macros/table/mixin/TableHierarchy.js +3 -4
  98. package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +2 -3
  99. package/src/sap/fe/macros/table/uploadTable/UploadTableRuntime.js +5 -4
  100. package/src/sap/fe/macros/table/uploadTable/UploadTableRuntime.ts +6 -3
  101. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +17 -10
  102. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +24 -9
@@ -315,12 +315,15 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
315
315
  // LR FilterBar or LR AdaptFilter
316
316
  for (const outParameter of outParameters) {
317
317
  const filterBarProperty = this._findFilterBarPropertyByAnnotationPath(outParameter, payload.propertyPath, metaModel, filterBarProperties);
318
- if (filterBarProperty && stateItems?.find(item => item.name === filterBarProperty.name)) {
318
+ if (filterBarProperty && stateItems?.find(item => item.name === filterBarProperty.name && (filterBarProperty.maxConditions === undefined || filterBarProperty.maxConditions === 1))) {
319
+ // if the target field is single-value field, reset the existing conditions
320
+ // maxConditions is ensured to be 1 for single-value field
321
+ // maxConditions = -1 means multiple values allowed
319
322
  /* Reset the conditions before create new conditions otherwise it gets not updated */
320
323
  const conditionPath = filterBarProperty.conditionPath;
321
- state.filter[conditionPath]?.forEach(condition => {
322
- condition.filtered = false;
323
- });
324
+ if (state.filter[conditionPath]?.[0]) {
325
+ state.filter[conditionPath][0].filtered = false;
326
+ }
324
327
  }
325
328
  }
326
329
  // Propagate OUT parameter for each conditions
@@ -336,11 +339,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
336
339
  const conditionPath = filterBarProperty.conditionPath;
337
340
  const conditionAlreadyExists = state.filter[conditionPath]?.find(testCondition => {
338
341
  delete testCondition.filtered;
339
- if (this.checkConditionsEqual(testCondition, newCondition)) {
342
+ const {
343
+ filtered: _filtered,
344
+ ...conditionToCompare
345
+ } = testCondition;
346
+ if (this.checkConditionsEqual(conditionToCompare, newCondition)) {
347
+ testCondition.filtered = true;
340
348
  return true;
341
349
  }
342
- // reset filtered to false
343
- testCondition.filtered = false;
344
350
  return false;
345
351
  });
346
352
  if (!conditionAlreadyExists) {
@@ -626,7 +632,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
626
632
  ) => relativePathParts[-index]?.partner !== part); // relativePathParts to match from the end (=> "-index") to localDataParts from the beginning
627
633
  // last part of localData is a property name, thus it cannot match. Otherwise matchCount could be -1 if everything matches
628
634
  // (if we want to additionally secure against this situation, the most appropriate would be to set matchCount = localDataParts.length – 1)
629
- return relativePathParts.slice(0, -matchCount) // remove all matched parts (from the end)
635
+ return relativePathParts.slice(0, -matchCount ? -matchCount : undefined) // remove all matched parts (from the end)
630
636
  .map(part => part.part).concat(localDataParts.slice(matchCount)) // remove the matched parts from localData (from the beginning)
631
637
  .join("/"); // transfer back to string (but only once at the end ;) )
632
638
  });
@@ -796,8 +802,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
796
802
  return context?.getObject(keyPath) === value;
797
803
  } else {
798
804
  const contextKeys = Object.keys(context.getObject());
805
+ const conditionSelectedRowKeys = Object.keys(conditionSelectedRow);
799
806
  return vhKeys.every(function (vhKey) {
800
- return !contextKeys.includes(vhKey) || context?.getObject(vhKey) === conditionSelectedRow[vhKey];
807
+ return !contextKeys.includes(vhKey) || !conditionSelectedRowKeys.includes(vhKey) || context?.getObject(vhKey) === conditionSelectedRow[vhKey];
801
808
  });
802
809
  }
803
810
  };
@@ -1070,4 +1077,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
1070
1077
  }
1071
1078
  });
1072
1079
  }, false);
1073
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGZUNvcmVDb250cm9sc0ZpbHRlckJhciIsIkFubm90YXRpb25Jc0RpZ2l0U2VxdWVuY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJWYWx1ZUhlbHBEZWxlZ2F0ZSIsImFwaVZlcnNpb24iLCJ1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzIiwiV2Vha01hcCIsImlzU2VhcmNoU3VwcG9ydGVkIiwidmFsdWVIZWxwIiwiY29udGVudCIsIl9saXN0QmluZGluZyIsImRhdGEiLCJ1cGRhdGVCaW5kaW5nSW5mbyIsImJpbmRpbmdJbmZvIiwic2VhcmNoIiwiZ2V0RmlsdGVyVmFsdWUiLCJub3JtYWxpemVkU2VhcmNoIiwiQ29tbW9uVXRpbHMiLCJub3JtYWxpemVTZWFyY2hUZXJtIiwicGFyYW1ldGVycyIsIiRzZWFyY2giLCJ1bmRlZmluZWQiLCJfZ2V0VmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UiLCJjb250cm9sIiwiYXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0VGFyZ2V0VmlldyIsImdldFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlIiwiY2hlY2tDb25kaXRpb25zRXF1YWwiLCJvbGRDb25kaXRpb24iLCJuZXdDb25kaXRpb24iLCJvcGVyYXRvciIsInZhbHVlczEiLCJ2YWx1ZXMiLCJ2YWx1ZXMyIiwibGVuZ3RoIiwic29ydGVkVmFsdWVzMSIsInNvcnQiLCJmaXJzdFZhbHVlIiwic2Vjb25kVmFsdWUiLCJTdHJpbmciLCJsb2NhbGVDb21wYXJlIiwic29ydGVkVmFsdWVzMiIsImV2ZXJ5IiwidmFsdWUiLCJpbmRleCIsIl9nZXRIaXN0b3J5RGF0YSIsInBheWxvYWQiLCJoaXN0b3J5IiwiZW5hYmxlZCIsImlzUG90ZW50aWFsbHlTZW5zaXRpdmUiLCJ2YWx1ZUxpc3RIaXN0b3J5U2VydmljZSIsImZpZWxkRGF0YSIsImdldEZpZWxkRGF0YSIsInByb3BlcnR5UGF0aCIsInZhbHVlSGVscFF1YWxpZmllciIsImVyciIsIkxvZyIsImVycm9yIiwiRXJyb3IiLCJtZXNzYWdlIiwiX3NldEhpc3RvcnlEYXRhIiwiY29uZGl0aW9ucyIsInZhbHVlTGlzdFByb3BlcnR5IiwiX2dldFZhbHVlTGlzdFByb3BlcnR5RnJvbVBheWxvYWRRdWFsaWZpZXIiLCJjb25kaXRpb24iLCJpc1VuaXRWYWx1ZUhlbHAiLCJ2YWxpZGF0ZWQiLCJDb25kaXRpb25WYWxpZGF0ZWQiLCJWYWxpZGF0ZWQiLCJjb25kaXRpb25QYXlsb2FkTWFwIiwiX2dldENvbmRpdGlvblBheWxvYWRMaXN0IiwicHVzaCIsImNvbnZlcnRDb25kaXRpb25QYXlsb2FkVG9OZXN0ZWRPYmplY3QiLCJzZXRGaWVsZERhdGEiLCJjb25kaXRpb25QYXlsb2FkIiwibmVzdGVkT2JqZWN0Iiwia2V5IiwiT2JqZWN0UGF0aCIsInNldCIsInNwbGl0IiwiX2lzRW1wdHlEaWdpdFNlcXVlbmNlIiwiaXNEaWdpdFNlcXVlbmNlIiwiaXNFbXB0eURpZ2l0U2VxdWVuY2UiLCJjaGFyIiwidXBkYXRlQmluZGluZyIsImxpc3RCaW5kaW5nIiwiaXNBIiwiZ2V0UGF5bG9hZCIsImlzVHlwZWFoZWFkIiwidXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZSIsIm5ld1Byb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsImV4aXN0aW5nVXBkYXRlQmluZGluZ0RvbmVQcm9taXNlIiwiZ2V0IiwidGhlbiIsImZpZWxkIiwiZ2V0Q29udHJvbCIsImlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQiLCJmaWVsZFZhbHVlIiwiZ2V0VmFsdWUiLCJhZGRpdGlvbmFsVmFsdWVzIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJnZXRPYmplY3QiLCJoYXNQZW5kaW5nVXNlcklucHV0IiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMiLCJncm91cEtleSIsIkFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5IiwicmVjb21tZW5kYXRpb24iLCJ0YWJsZSIsImdldFRhYmxlIiwic29ydGVyc0N1c3RvbURhdGEiLCJnZXRDdXN0b21EYXRhIiwiZmlsdGVyIiwiZ2V0S2V5Iiwic29ydGVycyIsIl91cGRhdGVCaW5kaW5nV2l0aFRyYW5zaWVudENvbnRleHRzIiwiX3VwZGF0ZUJpbmRpbmciLCJleGVjdXRlRmlsdGVyIiwicmVxdWVzdGVkSXRlbXMiLCJnZXRDb250ZXh0cyIsImNoZWNrTGlzdEJpbmRpbmdQZW5kaW5nIiwiX3ZhbHVlSGVscCIsImlzUGVuZGluZyIsImhhcyIsImlzU3VzcGVuZGVkIiwiY29udGV4dHMiLCJyZXF1ZXN0Q29udGV4dHMiLCJjYW5jZWxlZCIsImdldFR5cGVNYXAiLCJUeXBlTWFwIiwicmV0cmlldmVDb250ZW50IiwiY29udGFpbmVyIiwiY29udGVudElkIiwiVmFsdWVMaXN0SGVscGVyIiwic2hvd1ZhbHVlTGlzdCIsInZhbHVlSGVscFF1YWxpZmllcnMiLCJrZXlzIiwiY29uZGl0aW9uUGF5bG9hZExpc3QiLCJwYXJhbXMiLCJxdWFsaWZpZXJzIiwidmhQYXJhbWV0ZXJzIiwidmhLZXlzIiwicHJvcGVydHlLZXlQYXRoIiwidmFsdWVIZWxwS2V5UGF0aCIsImZpbHRlcmVkS2V5cyIsImhlbHBQYXRocyIsImZvckVhY2giLCJwYXJhbSIsImhlbHBQYXRoIiwiaW5jbHVkZXMiLCJfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvRmlsdGVyQmFyIiwib3V0UGFyYW1ldGVycyIsImZpbHRlckJhciIsImxpc3RSZXBvcnRGaWx0ZXJCYXIiLCJzdGF0ZSIsIlN0YXRlVXRpbCIsInJldHJpZXZlRXh0ZXJuYWxTdGF0ZSIsInN0YXRlSXRlbXMiLCJpdGVtcyIsImZpbHRlckJhclByb3BlcnRpZXMiLCJGaWx0ZXJVdGlscyIsImdldEZpbHRlclByb3BlcnR5SW5mbyIsIm1ldGFNb2RlbCIsIm91dFBhcmFtZXRlciIsImZpbHRlckJhclByb3BlcnR5IiwiX2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGgiLCJmaW5kIiwiaXRlbSIsIm5hbWUiLCJjb25kaXRpb25QYXRoIiwiZmlsdGVyZWQiLCJDb25kaXRpb24iLCJjcmVhdGVDb25kaXRpb24iLCJjb25kaXRpb25BbHJlYWR5RXhpc3RzIiwidGVzdENvbmRpdGlvbiIsImFwcGx5RXh0ZXJuYWxTdGF0ZSIsImNvbnRleHRQYXRoIiwiZmlsdGVyVGFyZ2V0Iiwic291cmNlIiwicG9wIiwibGFzdEluZGV4IiwibGFzdEluZGV4T2YiLCJmaWx0ZXJUYXJnZXRQYXRoIiwic3Vic3RyaW5nIiwiYW5ub3RhdGlvblBhdGgiLCJnZXRSZWR1Y2VkUGF0aCIsIl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9CaW5kaW5nQ29udGV4dCIsImNvbnRleHQiLCJvdXRWYWx1ZXMiLCJ3YXJuaW5nIiwiX29uQ29uZGl0aW9uUHJvcGFnYXRpb25VcGRhdGVQcm9wZXJ0eSIsImNvbnZlcnRlZE1ldGFkYXRhIiwiY29udmVydFR5cGVzIiwicm9vdFBhdGgiLCJnZXRNZXRhQ29udGV4dCIsImdldFBhdGgiLCJjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzIiwiaXNUcmFuc2llbnQiLCJpc0luYWN0aXZlIiwib3V0UGFyYW1ldGVyU291cmNlcyIsIl91cGRhdGVQcm9wZXJ0eVZpYU91dFBhcmFtZXRlciIsInZpZXciLCJjb2xsYWJvcmF0aXZlRHJhZnQiLCJnZXRDb250cm9sbGVyIiwiaXNDb25uZWN0ZWQiLCJiaW5kaW5nIiwiZ2V0QmluZGluZyIsImdldEJpbmRpbmdDb250ZXh0IiwiYXR0YWNoRXZlbnRPbmNlIiwic2VuZCIsImFjdGlvbiIsIkFjdGl2aXR5IiwiQ2hhbmdlIiwibWFwIiwidGFyZ2V0UHJvcGVydHkiLCJyZXNvbHZlUGF0aCIsInRhcmdldCIsImZpZWxkQ29udHJvbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRmllbGRDb250cm9sIiwiZHluYW1pY1JlYWRPbmx5IiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJnZXRQcm9wZXJ0eSIsInBhdGgiLCJzaWRlRWZmZWN0UGF0aCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImN1cnJlbnRWYWwiLCJuZXdWYWwiLCJzZXRQcm9wZXJ0eSIsInRleHRQYXRoIiwiVGV4dCIsImdldEZpbHRlckNvbmRpdGlvbnMiLCJjb25maWciLCJnZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9ucyIsIm9uQ29uZGl0aW9uUHJvcGFnYXRpb24iLCJyZWFzb24iLCJfY29uZmlnIiwiaXNEZWZpbmVDb25kaXRpb25WYWx1ZUhlbHAiLCJxdWFsaWZpZXIiLCJnZXRPdXRQYXJhbWV0ZXJzIiwiZmllbGRQYXJlbnQiLCJnZXRQYXJlbnQiLCJnZXRDb25kaXRpb25zIiwiaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMiLCJwcm9wZXJ0eU5hbWUiLCJwYXlsb2FkS2V5cyIsInBheWxvYWRLZXkiLCJjb25kaXRpb25WYWx1ZWtleXMiLCJjb25kaXRpb25WYWx1ZWtleSIsInZhbHVlS2V5Iiwia2V5VmFsdWUiLCJfY3JlYXRlSW5pdGlhbEZpbHRlckNvbmRpdGlvbiIsImluaXRpYWxWYWx1ZUlzU2lnbmlmaWNhbnQiLCJfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tQmluZGluZyIsImluQ29uZGl0aW9ucyIsImluUGFyYW1ldGVycyIsImJpbmRpbmdDb250ZXh0IiwiZ2V0TWV0YVBhdGgiLCJwcm9wZXJ0aWVzVG9SZXF1ZXN0IiwiaW5QYXJhbWV0ZXIiLCJtZXRhRGF0YUVycm9yIiwibmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsInJlcGxhY2UiLCIkUGFydG5lciIsIiRraW5kIiwiX2J1aWxkUHJvcGVydGllc1RvUmVxdWVzdCIsImNvbnRleHRVbmRlckNyZWF0aW9uIiwiZ2V0VXBkYXRlR3JvdXBJZCIsInN0YXJ0c1dpdGgiLCJlcnJvck1lc3NhZ2VzSW5Db250ZXh0IiwiZ2V0TWVzc2FnZXMiLCJnZXRUeXBlIiwiTWVzc2FnZVR5cGUiLCJjcmVhdGVkIiwicmVxdWVzdFByb3BlcnR5IiwiaSIsIm1ldGFNb2RlbENvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsInJlbGF0aXZlUGF0aFBhcnRzIiwic2xpY2UiLCJwYXJ0IiwicGFydG5lciIsImxvY2FsRGF0YVBhdGgiLCJsb2NhbERhdGFQYXJ0cyIsIm1hdGNoQ291bnQiLCJmaW5kSW5kZXgiLCJjb25jYXQiLCJqb2luIiwiX2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUZpbHRlckJhciIsInNvdXJjZUZpZWxkIiwiX2dldENvbmRpdGlvbnNGcm9tSW5QYXJhbWV0ZXIiLCJfcGFydGl0aW9uSW5QYXJhbWV0ZXJzIiwiaW5QYXJhbWV0ZXJNYXAiLCJjb25zdGFudCIsImNvbnN0YW50VmFsdWUiLCJpbmRleE9mIiwiX3RhYmxlQWZ0ZXJSZW5kZXJEZWxlZ2F0ZSIsIm9uQWZ0ZXJSZW5kZXJpbmciLCJldmVudCIsInNyY0NvbnRyb2wiLCJ0YWJsZUNlbGxzRG9tUmVmcyIsIiQiLCJtZGNNVGFibGUiLCJoaWdobGlnaHRET01FbGVtZW50cyIsInBvcG92ZXJUYWJsZSIsInJlbW92ZUV2ZW50RGVsZWdhdGUiLCJhZGRFdmVudERlbGVnYXRlIiwiZ2V0SW5QYXJhbWV0ZXJzIiwiaXNPYmplY3RQYWdlIiwiY3JlYXRlQ29uZGl0aW9uUGF5bG9hZCIsIl92YWx1ZXMiLCJlbnRyeSIsImlzTXVsdGlWYWx1ZUZpZWxkIiwiZXh0ZXJuYWxJZFBhdGgiLCJ2aEtleVByb3BlcnR5IiwidmhLZXlWYWx1ZSIsInZoUHJvcGVydGllcyIsInZoS2V5IiwibW9kaWZ5U2VsZWN0aW9uQmVoYXZpb3VyIiwiY2hhbmdlIiwib2xkQ29uZGl0aW9ucyIsImlzUXVpY2tTZWxlY3RBY3RpdmUiLCJmaW5kQ29uZGl0aW9uc0ZvckNvbnRleHQiLCJrZXlQYXRoIiwiZ2V0S2V5UGF0aCIsImZpbmRDb25kaXRpb24iLCJjb25kaXRpb25TZWxlY3RlZFJvdyIsInVzZU11bHRpVmFsdWVGaWVsZCIsImNvbnRleHRLZXlzIiwic2VsZWN0ZWRDb25kaXRpb24iLCJfdXBkYXRlQmluZGluZ0F0dHJpYnV0ZXMiLCJyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhIiwicmVjZW50VmFsdWVzQ29udGV4dERhdGEiLCJvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSIsIl9nZXRSZWxldmFudEFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhIiwiaGFzUmVsZXZhbnREYXRhIiwicmVzZXRDaGFuZ2VzIiwiZGVidWciLCJhZGRpdGlvbmFsVmFsdWVIZWxwZXIiLCJjcmVhdGVUcmFuc2llbnRDb250ZXh0c0ZvckFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhIiwicm9vdEJpbmRpbmciLCJnZXRSb290QmluZGluZyIsInN1c3BlbmQiLCJzb3J0QW5kRmlsdGVyTGlzdEJpbmRpbmciLCJjaGFuZ2VQYXJhbWV0ZXJzIiwicmVzdW1lVmFsdWVMaXN0QmluZGluZ0FuZFJlc2V0Q2hhbmdlcyIsInJlcXVlc3RGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsInZhbHVlSGVscEtleXMiLCJnZXRSZWxldmFudFJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEiLCJnZXRSZWxldmFudFJlY2VudFZhbHVlc0NvbnRleHREYXRhIiwicmVwbGFjZUFsbCIsImdldFJlbGV2YW50T3RoZXJzVmFsdWVzQ29udGV4dERhdGEiLCJmaWx0ZXJzIiwiRmlsdGVyVHlwZSIsIkFwcGxpY2F0aW9uIiwic29ydGVyIiwicmVzdW1lIiwiX2NoZWNrSWZBZGRpdGlvbmFsVmFsdWVzRXhpc3RzIiwiY2hlY2tSZWNvbW1lbmRhdGlvbnMiLCJhcmd1bWVudHMiLCJyZWNvbW1lbmRhdGlvblZhbHVlcyIsInJlY2VudFZhbHVlcyIsImNvbnRlbnRNb2RlbCIsImxvY2FsQW5ub3RhdGlvbk1vZGVsIiwiZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwiLCJiaW5kaW5nQ29udGV4dFBhdGgiLCJmaWVsZFBhdGgiLCJpbnB1dFZhbHVlcyIsInR5cGVBaGVhZEZvckZpbHRlcmFibGVDb250ZW50Iiwic2hvd0l0IiwidHlwZUFoZWFkQ29udGVudCIsImdldENvbnRlbnQiLCJmaWx0ZXJWYWx1ZSIsImZpZWxkVGV4dFZhbHVlIiwiZ2V0QWRkaXRpb25hbFZhbHVlIiwiY29uZGl0aW9uRm9yUmVxdWVzdFNob3dDb250YWluZXIiLCJwYXJlbnRDb250cm9sIiwiZmllbGRJZCIsImdldElkIiwiaXNWaXN1YWxGaWx0ZXIiLCJ2YWx1ZUhlbHBUYWJsZSIsImdldFBhcmVudERpYWxvZyIsImlubmVyQ29udGVudCIsImdldERvbVJlZiIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiaWQiLCJnZXRJbml0aWFsRm9jdXMiLCJjaGVja0hpc3RvcnlFbmFibGVkIiwicmVxdWVzdFNob3dDb250YWluZXIiLCJyZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbiIsIlJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uIiwiVGFiIiwiVGFwIiwiVHlwaW5nIiwiRmlsdGVyIiwiVmFsdWVIZWxwUmVxdWVzdCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVmFsdWVIZWxwRGVsZWdhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb252ZXJ0ZWRNZXRhZGF0YSwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IE9iamVjdFBhdGggZnJvbSBcInNhcC9iYXNlL3V0aWwvT2JqZWN0UGF0aFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHsgQWN0aXZpdHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9Db2xsYWJvcmF0aW9uQ29tbW9uXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgUHJvcGVydHlJbmZvIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvTGlzdFJlcG9ydC9GaWx0ZXJCYXJcIjtcbmltcG9ydCB7IGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgeyBGaWVsZERhdGFUeXBlLCBWYWx1ZUhlbHBIaXN0b3J5U2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9WYWx1ZUhlbHBIaXN0b3J5U2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIHsgSUZpbHRlckNvbnRyb2wgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXIvRmlsdGVyVXRpbHNcIjtcbmltcG9ydCBGaWx0ZXJVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXIvRmlsdGVyVXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgSW5PdXRQYXJhbWV0ZXIsIFNvcnRlclR5cGUsIFZhbHVlSGVscFBheWxvYWQgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyXCI7XG5pbXBvcnQgVmFsdWVMaXN0SGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ludGVybmFsL3ZhbHVlaGVscC9WYWx1ZUxpc3RIZWxwZXJcIjtcbmltcG9ydCB0eXBlIERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL20vVGFibGVcIjtcbmltcG9ydCBoaWdobGlnaHRET01FbGVtZW50cyBmcm9tIFwic2FwL20vaW5wdXRVdGlscy9oaWdobGlnaHRET01FbGVtZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mbyB9IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBVSTVFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBNZXNzYWdlVHlwZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlVHlwZVwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIEZpZWxkIH0gZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIEZpbHRlckJhciBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJCYXJcIjtcbmltcG9ydCB0eXBlIEZpbHRlckZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL0ZpbHRlckZpZWxkXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGQgZnJvbSBcInNhcC91aS9tZGMvTXVsdGlWYWx1ZUZpZWxkXCI7XG5pbXBvcnQgdHlwZSBWYWx1ZUhlbHAgZnJvbSBcInNhcC91aS9tZGMvVmFsdWVIZWxwXCI7XG5pbXBvcnQgVmFsdWVIZWxwRGVsZWdhdGUgZnJvbSBcInNhcC91aS9tZGMvVmFsdWVIZWxwRGVsZWdhdGVcIjtcbmltcG9ydCB0eXBlIHsgQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvblwiO1xuaW1wb3J0IENvbmRpdGlvbiBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vQ29uZGl0aW9uXCI7XG5pbXBvcnQgQ29uZGl0aW9uVmFsaWRhdGVkIGZyb20gXCJzYXAvdWkvbWRjL2VudW1zL0NvbmRpdGlvblZhbGlkYXRlZFwiO1xuaW1wb3J0IFJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uIGZyb20gXCJzYXAvdWkvbWRjL2VudW1zL1JlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uXCI7XG5pbXBvcnQgdHlwZSBGaWVsZEJhc2UgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvRmllbGRCYXNlXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJCYXJCYXNlIGZyb20gXCJzYXAvdWkvbWRjL2ZpbHRlcmJhci9GaWx0ZXJCYXJCYXNlXCI7XG5pbXBvcnQgVHlwZU1hcCBmcm9tIFwic2FwL3VpL21kYy9vZGF0YS92NC9UeXBlTWFwXCI7XG5pbXBvcnQgU3RhdGVVdGlsIGZyb20gXCJzYXAvdWkvbWRjL3AxM24vU3RhdGVVdGlsXCI7XG5pbXBvcnQgdHlwZSBNRENQb3BvdmVyIGZyb20gXCJzYXAvdWkvbWRjL3ZhbHVlaGVscC9Qb3BvdmVyXCI7XG5pbXBvcnQgdHlwZSBDb250YWluZXIgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2Jhc2UvQ29udGFpbmVyXCI7XG5pbXBvcnQgdHlwZSBDb250ZW50IGZyb20gXCJzYXAvdWkvbWRjL3ZhbHVlaGVscC9iYXNlL0NvbnRlbnRcIjtcbmltcG9ydCB0eXBlIEZpbHRlcmFibGVMaXN0Q29udGVudCBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvYmFzZS9GaWx0ZXJhYmxlTGlzdENvbnRlbnRcIjtcbmltcG9ydCB0eXBlIFZhbHVlSGVscERpYWxvZyBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvYmFzZS9WYWx1ZUhlbHBEaWFsb2dcIjtcbmltcG9ydCB0eXBlIE1UYWJsZSBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvY29udGVudC9NVGFibGVcIjtcbmltcG9ydCBGaWx0ZXJUeXBlIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyVHlwZVwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IFZhbHVlIH0gZnJvbSBcIi4uL2ZpZWxkL0ZpZWxkQmFzZURlbGVnYXRlXCI7XG5pbXBvcnQgdHlwZSB7IEFkZGl0aW9uYWxWYWx1ZVR5cGUsIEJpbmRpbmdJbmZvUGFyYW1ldGVycyB9IGZyb20gXCIuLi9pbnRlcm5hbC92YWx1ZWhlbHAvQWRkaXRpb25hbFZhbHVlSGVscGVyXCI7XG5pbXBvcnQgeyBBZGRpdGlvbmFsVmFsdWVHcm91cEtleSwgYWRkaXRpb25hbFZhbHVlSGVscGVyIH0gZnJvbSBcIi4uL2ludGVybmFsL3ZhbHVlaGVscC9BZGRpdGlvbmFsVmFsdWVIZWxwZXJcIjtcblxuY29uc3QgRmVDb3JlQ29udHJvbHNGaWx0ZXJCYXIgPSBcInNhcC5mZS5tYWNyb3MuY29udHJvbHMuRmlsdGVyQmFyXCI7XG5jb25zdCBBbm5vdGF0aW9uSXNEaWdpdFNlcXVlbmNlID0gXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGlnaXRTZXF1ZW5jZVwiO1xuXG5leHBvcnQgdHlwZSBDb25kaXRpb25PYmplY3RNYXAgPSBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25PYmplY3RbXT47XG5cbmV4cG9ydCB0eXBlIEV4dGVybmFsU3RhdGVUeXBlID0ge1xuXHRpdGVtczogeyBuYW1lOiBzdHJpbmcgfVtdO1xuXHRmaWx0ZXI6IENvbmRpdGlvbk9iamVjdE1hcDtcbn07XG5cbnR5cGUgU2VsZWN0aW9uQ2hhbmdlID0ge1xuXHRjb25kaXRpb25zOiBvYmplY3RbXTtcblx0dHlwZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uUGF5bG9hZFR5cGUgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIENvbmRpdGlvblBheWxvYWRNYXAgPSBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25QYXlsb2FkVHlwZVtdPjtcblxudHlwZSBNRENDb25maWdUeXBlID0ge1xuXHR2YWx1ZTogdW5rbm93bjtcblx0cGFyc2VkVmFsdWU6IHVua25vd247XG5cdGNvbnRleHQ6IG9iamVjdDtcblx0Y29udHJvbDogQ29udHJvbDsgLy8gSW5zdGFuY2Ugb2YgdGhlIGNhbGxpbmcgY29udHJvbFxuXHRiaW5kaW5nQ29udGV4dDogT0RhdGFWNENvbnRleHQ7XG5cdGNoZWNrS2V5OiBib29sZWFuO1xuXHRjaGVja0Rlc2NyaXB0aW9uOiBib29sZWFuO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbih7fSwgVmFsdWVIZWxwRGVsZWdhdGUsIHtcblx0YXBpVmVyc2lvbjogMixcblx0dXBkYXRlQmluZGluZ0RvbmVQcm9taXNlczogbmV3IFdlYWtNYXA8b2JqZWN0LCBQcm9taXNlPHZvaWQ+PigpLFxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSA8Y29kZT5MaXN0QmluZGluZzwvY29kZT4gc3VwcG9ydHMgJFNlYXJjaC5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBDb250ZW50IGVsZW1lbnRcblx0ICogQHBhcmFtIF9saXN0QmluZGluZ1xuXHQgKiBAcmV0dXJucyBUcnVlIGlmICRzZWFyY2ggaXMgc3VwcG9ydGVkXG5cdCAqL1xuXHRpc1NlYXJjaFN1cHBvcnRlZDogZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBGaWx0ZXJhYmxlTGlzdENvbnRlbnQsIF9saXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZykge1xuXHRcdHJldHVybiAhIWNvbnRlbnQuZGF0YShcInNlYXJjaFN1cHBvcnRlZFwiKTtcblx0fSxcblxuXHQvKlxuXHQgKiBBZGp1c3RhYmxlIGZpbHRlcmluZyBmb3IgbGlzdC1iYXNlZCBjb250ZW50cy5cblx0ICpcblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBWYWx1ZUhlbHAgY29udGVudCByZXF1ZXN0aW5nIGNvbmRpdGlvbnMgY29uZmlndXJhdGlvblxuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKi9cblx0dXBkYXRlQmluZGluZ0luZm86IGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogRmlsdGVyYWJsZUxpc3RDb250ZW50LCBiaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8pIHtcblx0XHRWYWx1ZUhlbHBEZWxlZ2F0ZS51cGRhdGVCaW5kaW5nSW5mbyh2YWx1ZUhlbHAsIGNvbnRlbnQsIGJpbmRpbmdJbmZvKTtcblxuXHRcdGlmIChjb250ZW50LmRhdGEoXCJzZWFyY2hTdXBwb3J0ZWRcIikpIHtcblx0XHRcdGNvbnN0IHNlYXJjaCA9IGNvbnRlbnQuZ2V0RmlsdGVyVmFsdWUoKTtcblx0XHRcdGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBDb21tb25VdGlscy5ub3JtYWxpemVTZWFyY2hUZXJtKHNlYXJjaCk7IC8vIGFkanVzdFNlYXJjaFxuXG5cdFx0XHRpZiAoYmluZGluZ0luZm8ucGFyYW1ldGVycykge1xuXHRcdFx0XHQoYmluZGluZ0luZm8ucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuJHNlYXJjaCA9IG5vcm1hbGl6ZWRTZWFyY2ggfHwgdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRoZSB2YWx1ZSBoZWxwIGhpc3Rvcnkgc2VydmljZSBmcm9tIHRoZSBhcHAgY29tcG9uZW50LlxuXHQgKiBAcGFyYW0gY29udHJvbCBDb250cm9sIHRvIGZpbmQgdGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgVmFsdWVIZWxwSGlzdG9yeVNlcnZpY2Vcblx0ICovXG5cdF9nZXRWYWx1ZUhlbHBIaXN0b3J5U2VydmljZShjb250cm9sOiBDb250cm9sKTogVmFsdWVIZWxwSGlzdG9yeVNlcnZpY2Uge1xuXHRcdC8vIEZvciBzb21lIHJlYXNvbiB3ZSBjYW5ub3QgdXNlIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChjb250cm9sKSBoZXJlIGJ1dCBuZWVkIHRvIGdldCB0aGUgVmlldyBmaXJzdC5cblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQoQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0Vmlldyhjb250cm9sKSk7XG5cdFx0cmV0dXJuIGFwcENvbXBvbmVudC5nZXRWYWx1ZUhlbHBIaXN0b3J5U2VydmljZSgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDb21wYXJlcyB0d28gY29uZGl0aW9uIG9iamVjdHMgZm9yIGVxdWFsaXR5IGJhc2VkIG9uIG9wZXJhdG9yIGFuZCB2YWx1ZXMuXG5cdCAqIEBwYXJhbSBvbGRDb25kaXRpb24gRmlyc3QgY29uZGl0aW9uIHRvIGNvbXBhcmVcblx0ICogQHBhcmFtIG5ld0NvbmRpdGlvbiBTZWNvbmQgY29uZGl0aW9uIHRvIGNvbXBhcmVcblx0ICogQHJldHVybnMgVHJ1ZSBpZiBjb25kaXRpb25zIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRjaGVja0NvbmRpdGlvbnNFcXVhbChvbGRDb25kaXRpb246IENvbmRpdGlvbk9iamVjdCwgbmV3Q29uZGl0aW9uOiBDb25kaXRpb25PYmplY3QpOiBib29sZWFuIHtcblx0XHQvLyBDb21wYXJlIG9wZXJhdG9yc1xuXHRcdGlmIChvbGRDb25kaXRpb24ub3BlcmF0b3IgIT09IG5ld0NvbmRpdGlvbi5vcGVyYXRvcikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIENvbXBhcmUgdmFsdWVzIGFycmF5c1xuXHRcdGNvbnN0IHZhbHVlczEgPSBvbGRDb25kaXRpb24udmFsdWVzID8/IFtdO1xuXHRcdGNvbnN0IHZhbHVlczIgPSBuZXdDb25kaXRpb24udmFsdWVzID8/IFtdO1xuXG5cdFx0aWYgKHZhbHVlczEubGVuZ3RoICE9PSB2YWx1ZXMyLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIFNvcnQgdmFsdWVzIGZvciBjb21wYXJpc29uIHRvIGhhbmRsZSBvcmRlciBkaWZmZXJlbmNlc1xuXHRcdGNvbnN0IHNvcnRlZFZhbHVlczEgPSBbLi4udmFsdWVzMV0uc29ydCgoZmlyc3RWYWx1ZSwgc2Vjb25kVmFsdWUpID0+IFN0cmluZyhmaXJzdFZhbHVlKS5sb2NhbGVDb21wYXJlKFN0cmluZyhzZWNvbmRWYWx1ZSkpKTtcblx0XHRjb25zdCBzb3J0ZWRWYWx1ZXMyID0gWy4uLnZhbHVlczJdLnNvcnQoKGZpcnN0VmFsdWUsIHNlY29uZFZhbHVlKSA9PiBTdHJpbmcoZmlyc3RWYWx1ZSkubG9jYWxlQ29tcGFyZShTdHJpbmcoc2Vjb25kVmFsdWUpKSk7XG5cblx0XHRyZXR1cm4gc29ydGVkVmFsdWVzMS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gc29ydGVkVmFsdWVzMltpbmRleF0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGhpc3RvcnkgZGF0YSBmb3IgdGhlIHZhbHVlIGxpc3QgcHJvcGVydHkgZnJvbSB0aGUgaGlzdG9yeSBzZXJ2aWNlLlxuXHQgKiBObyBoaXN0b3J5IGRhdGEgaXMgZmV0Y2hlZCBmb3IgZmllbGRzIGFubm90YXRlZCB3aXRoIElzUG90ZW50aWFsbHlTZW5zaXRpdmUuXG5cdCAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgZm9yIFZhbHVlSGVscFxuXHQgKiBAcGFyYW0gY29udHJvbCBDb250cm9sIHRvIGZpbmQgdGhlIGFwcCBjb21wb25lbnQsIGUuZy4gdGhlIGZpZWxkXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgdG8gYSBsaXN0IG9mIGZpZWxkIGRhdGEgZm9yIHRoZSB2YWx1ZSBsaXN0IHByb3BlcnR5XG5cdCAqL1xuXHRfZ2V0SGlzdG9yeURhdGE6IGFzeW5jIGZ1bmN0aW9uIChwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLCBjb250cm9sOiBDb250cm9sKTogUHJvbWlzZTxGaWVsZERhdGFUeXBlW10+IHtcblx0XHRpZiAocGF5bG9hZC5oaXN0b3J5Py5lbmFibGVkICYmIHBheWxvYWQuaXNQb3RlbnRpYWxseVNlbnNpdGl2ZSAhPT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgdmFsdWVMaXN0SGlzdG9yeVNlcnZpY2UgPSB0aGlzLl9nZXRWYWx1ZUhlbHBIaXN0b3J5U2VydmljZShjb250cm9sKTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGZpZWxkRGF0YSA9IGF3YWl0IHZhbHVlTGlzdEhpc3RvcnlTZXJ2aWNlLmdldEZpZWxkRGF0YShwYXlsb2FkLnByb3BlcnR5UGF0aCArIFwiL1wiICsgcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXIpO1xuXHRcdFx0XHRwYXlsb2FkLmhpc3RvcnkuZGF0YSA9IGZpZWxkRGF0YTtcblx0XHRcdFx0cmV0dXJuIGZpZWxkRGF0YTtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRMb2cuZXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFtdO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGhpc3RvcnkgZGF0YSBmb3IgdGhlIHZhbHVlIGxpc3QgcHJvcGVydHkgaW4gdGhlIGhpc3Rvcnkgc2VydmljZS5cblx0ICogTm8gaGlzdG9yeSBkYXRhIGlzIHN0b3JlZCBmb3IgZmllbGRzIGFubm90YXRlZCB3aXRoIElzUG90ZW50aWFsbHlTZW5zaXRpdmUuXG5cdCAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgZm9yIFZhbHVlSGVscFxuXHQgKiBAcGFyYW0gY29uZGl0aW9ucyBUaGUgY29uZGl0aW9uIG9iamVjdCB0byBnZXQgdGhlIHNlbGVjdGVkIGRhdGEgZnJvbVxuXHQgKiBAcGFyYW0gY29udHJvbCBDb250cm9sIHRvIGZpbmQgdGhlIGFwcCBjb21wb25lbnQsIGUuZy4gdGhlIGZpZWxkXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgd2hlbiB0aGUgZGF0YSBpcyBzZXQgaW4gdGhlIGhpc3Rvcnkgc2VydmljZVxuXHQgKi9cblx0X3NldEhpc3RvcnlEYXRhOiBhc3luYyBmdW5jdGlvbiAocGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCwgY29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0W10sIGNvbnRyb2w6IENvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAocGF5bG9hZC5oaXN0b3J5Py5lbmFibGVkICYmIHBheWxvYWQuaXNQb3RlbnRpYWxseVNlbnNpdGl2ZSAhPT0gdHJ1ZSAmJiBjb25kaXRpb25zLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgdmFsdWVMaXN0UHJvcGVydHkgPSB0aGlzLl9nZXRWYWx1ZUxpc3RQcm9wZXJ0eUZyb21QYXlsb2FkUXVhbGlmaWVyKHBheWxvYWQpO1xuXHRcdFx0aWYgKHZhbHVlTGlzdFByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IGRhdGE6IEZpZWxkRGF0YVR5cGVbXSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcblx0XHRcdFx0XHRpZiAocGF5bG9hZC5pc1VuaXRWYWx1ZUhlbHAgfHwgY29uZGl0aW9uLnZhbGlkYXRlZCA9PT0gQ29uZGl0aW9uVmFsaWRhdGVkLlZhbGlkYXRlZCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uUGF5bG9hZE1hcCA9IHRoaXMuX2dldENvbmRpdGlvblBheWxvYWRMaXN0KGNvbmRpdGlvbik/LlswXTtcblx0XHRcdFx0XHRcdGlmIChjb25kaXRpb25QYXlsb2FkTWFwKSB7XG5cdFx0XHRcdFx0XHRcdGRhdGEucHVzaCh0aGlzLmNvbnZlcnRDb25kaXRpb25QYXlsb2FkVG9OZXN0ZWRPYmplY3QoY29uZGl0aW9uUGF5bG9hZE1hcCkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkYXRhLmxlbmd0aCkge1xuXHRcdFx0XHRcdGNvbnN0IHZhbHVlTGlzdEhpc3RvcnlTZXJ2aWNlID0gdGhpcy5fZ2V0VmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UoY29udHJvbCk7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdmFsdWVMaXN0SGlzdG9yeVNlcnZpY2Uuc2V0RmllbGREYXRhKHBheWxvYWQucHJvcGVydHlQYXRoICsgXCIvXCIgKyBwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllciwgZGF0YSk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENvbnZlcnRpbmcgdGhlIGNvbmRpdGlvbiBwYXlsb2FkIHRvIGEgbmVzdGVkIG9iamVjdC5cblx0ICogQHBhcmFtIGNvbmRpdGlvblBheWxvYWQgVGhlIGNvbmRpdGlvbiBwYXlsb2FkIG9iamVjdCB0byBiZSBjb252ZXJ0ZWRcblx0ICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBuZXN0ZWQgb2JqZWN0XG5cdCAqL1xuXHRjb252ZXJ0Q29uZGl0aW9uUGF5bG9hZFRvTmVzdGVkT2JqZWN0OiBmdW5jdGlvbiAoY29uZGl0aW9uUGF5bG9hZDogQ29uZGl0aW9uUGF5bG9hZFR5cGUpOiBDb25kaXRpb25QYXlsb2FkVHlwZSB7XG5cdFx0Y29uc3QgbmVzdGVkT2JqZWN0OiBDb25kaXRpb25QYXlsb2FkVHlwZSA9IHt9O1xuXHRcdGZvciAoY29uc3Qga2V5IGluIGNvbmRpdGlvblBheWxvYWQpIHtcblx0XHRcdE9iamVjdFBhdGguc2V0KGtleS5zcGxpdChcIi9cIiksIGNvbmRpdGlvblBheWxvYWRba2V5XSwgbmVzdGVkT2JqZWN0KTtcblx0XHR9XG5cdFx0cmV0dXJuIG5lc3RlZE9iamVjdDtcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2sgaWYgdmFsdWUgaXMgZGlnaXQgc2VxdWVuY2Ugd2l0aCBubyB2YWx1ZS5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVja1xuXHQgKiBAcGFyYW0gaXNEaWdpdFNlcXVlbmNlIEluZGljYXRlcyBpZiB0aGUgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgYSBkaWdpdCBzZXF1ZW5jZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBlbXB0eSBkaWdpdCBzZXF1ZW5jZSwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRfaXNFbXB0eURpZ2l0U2VxdWVuY2U6IGZ1bmN0aW9uICh2YWx1ZTogVmFsdWUsIGlzRGlnaXRTZXF1ZW5jZTogYm9vbGVhbik6IGJvb2xlYW4ge1xuXHRcdGxldCBpc0VtcHR5RGlnaXRTZXF1ZW5jZSA9IGZhbHNlO1xuXHRcdGlmIChpc0RpZ2l0U2VxdWVuY2UpIHtcblx0XHRcdGlzRW1wdHlEaWdpdFNlcXVlbmNlID1cblx0XHRcdFx0dHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiXG5cdFx0XHRcdFx0PyB2YWx1ZS5zcGxpdChcIlwiKS5ldmVyeSgoY2hhcikgPT4gY2hhciA9PT0gXCIwXCIpID8/IHZhbHVlID09PSBcIlwiXG5cdFx0XHRcdFx0OiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAwO1xuXHRcdH1cblx0XHRyZXR1cm4gaXNFbXB0eURpZ2l0U2VxdWVuY2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBmaWVsZCBpcyByZWNvbW1lbmRhdGlvbiByZWxldmFudCBhbmQgY2FsbHMgZWl0aGVyIF91cGRhdGVCaW5kaW5nIG9yIF91cGRhdGVCaW5kaW5nRm9yUmVjb21tZW5kYXRpb25zLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICogQHBhcmFtIGNvbnRlbnQgRmlsdGVyYWJsZSBMaXN0IENvbnRlbnRcblx0ICovXG5cdHVwZGF0ZUJpbmRpbmc6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscCxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRiaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8sXG5cdFx0Y29udGVudDogTVRhYmxlXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIGxpc3RCaW5kaW5nIHNob3VsZCBiZSBvZiB0eXBlIE9EYXRhTGlzdEJpbmRpbmdcblx0XHRpZiAoIWxpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly9XZSBmZXRjaCB0aGUgdmFsdWVsaXN0IHByb3BlcnR5IGZyb20gdGhlIHBheWxvYWQgdG8gbWFrZSBzdXJlIHdlIHBhc3MgdGhlIHJpZ2h0IHByb3BlcnR5IHdoaWxlIG1ha2luZyBhIGNhbGwgb24gdmFsdWVsaXN0IGVudGl0eSBzZXRcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdGlmIChjb250ZW50LmlzVHlwZWFoZWFkKCkpIHtcblx0XHRcdGxldCB1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VSZXNvbHZlOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5cblx0XHRcdC8vIGNyZWF0ZSBhIHByb21pc2UgdG8gbWFrZSBzdXJlIGNoZWNrTGlzdEJpbmRpbmdQZW5kaW5nIGlzIG9ubHkgY29tcGxldGVkIG9uY2UgdGhpcyBwcm9taXNlIGlzIHJlc29sdmVkXG5cdFx0XHRjb25zdCBuZXdQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0XHRcdFx0dXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgZXhpc3RpbmdVcGRhdGVCaW5kaW5nRG9uZVByb21pc2UgPSB0aGlzLnVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZXMuZ2V0KGxpc3RCaW5kaW5nKTtcblx0XHRcdC8vYnVpbGQgYSBwcm9taXNlIGNoYWluIGlmIG5lY2Vzc2FyeVxuXHRcdFx0dGhpcy51cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzLnNldChcblx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdGV4aXN0aW5nVXBkYXRlQmluZGluZ0RvbmVQcm9taXNlID8gZXhpc3RpbmdVcGRhdGVCaW5kaW5nRG9uZVByb21pc2UudGhlbihhc3luYyAoKSA9PiBuZXdQcm9taXNlKSA6IG5ld1Byb21pc2Vcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IHZhbHVlTGlzdFByb3BlcnR5ID0gdGhpcy5fZ2V0VmFsdWVMaXN0UHJvcGVydHlGcm9tUGF5bG9hZFF1YWxpZmllcihwYXlsb2FkKTtcblx0XHRcdGNvbnN0IGZpZWxkID0gY29udGVudC5nZXRDb250cm9sKCkgYXMgRmlsdGVyRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgfCBGaWVsZDtcblx0XHRcdGNvbnN0IGlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQgPVxuXHRcdFx0XHRmaWVsZC5pc0E8RmlsdGVyRmllbGQ+KFwic2FwLnVpLm1kYy5GaWx0ZXJGaWVsZFwiKSB8fCBmaWVsZC5pc0E8TXVsdGlWYWx1ZUZpZWxkPihcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpO1xuXHRcdFx0Y29uc3QgZmllbGRWYWx1ZSA9ICFpc0ZpbHRlckZpZWxkT3JNdWx0aVZhbHVlZEZpZWxkICYmIGZpZWxkLmdldFZhbHVlKCk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsVmFsdWVzOiBBZGRpdGlvbmFsVmFsdWVUeXBlW10gPSBbXTtcblxuXHRcdFx0Ly8gV2UgbmVlZCB0byBzaG93IHJlY29tbWVuZGF0aW9ucyBvbmx5IHdoZW4gdGhlIGZpZWxkIGhhcyBlbXB0eSB2YWx1ZSBvciB3aGVuIHVzZXIgaXMgdHlwaW5nIGEgdmFsdWUuIE90aGVyIHRpbWVzIHdlIHNob3VsZCBub3Qgc2hvdyByZWNvbW1lbmRhdGlvbnMuXG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgZmllbGQgaGFzIGFueSBwZW5kaW5nIHVzZXIgaW5wdXQgYW5kIGlmIGl0IGlzIHRoZW4gd2Ugc2hvdyByZWNvbW1lbmRhdGlvbnMgaWYgYW55LlxuXHRcdFx0Y29uc3QgaXNEaWdpdFNlcXVlbmNlID1cblx0XHRcdFx0KGZpZWxkLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCkuZ2V0T2JqZWN0KGAke3BheWxvYWQucHJvcGVydHlQYXRofSR7QW5ub3RhdGlvbklzRGlnaXRTZXF1ZW5jZX1gKSA/PyBmYWxzZTtcblx0XHRcdGlmICghZmllbGRWYWx1ZSB8fCBmaWVsZC5oYXNQZW5kaW5nVXNlcklucHV0KCkgfHwgdGhpcy5faXNFbXB0eURpZ2l0U2VxdWVuY2UoZmllbGRWYWx1ZSwgaXNEaWdpdFNlcXVlbmNlKSkge1xuXHRcdFx0XHQvL2dldCB0aGUgcmVjb21tZW5kYXRpb24gZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBtb2RlbFxuXHRcdFx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zKGNvbnRlbnQsIHBheWxvYWQpO1xuXG5cdFx0XHRcdC8vaWYgdGhlcmUgYXJlIHJlbGV2YW50IHJlY29tbWVuZGF0aW9ucyB0aGVuIGNyZWF0ZSBhZGRpdGlvbmFsIHZhbHVlIHN0cnVjdHVyZSBhbmQgY2FsbCBfdXBkYXRlQmluZGluZ0ZvclJlY29tbWVuZGF0aW9uc1xuXHRcdFx0XHRpZiAodmFsdWVzLmxlbmd0aCkge1xuXHRcdFx0XHRcdGFkZGl0aW9uYWxWYWx1ZXMucHVzaCh7IHByb3BlcnR5UGF0aDogdmFsdWVMaXN0UHJvcGVydHksIHZhbHVlcywgZ3JvdXBLZXk6IEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5LnJlY29tbWVuZGF0aW9uIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHRhYmxlID0gY29udGVudC5nZXRUYWJsZSgpO1xuXHRcdFx0Y29uc3Qgc29ydGVyc0N1c3RvbURhdGEgPSB0YWJsZS5nZXRDdXN0b21EYXRhKCkuZmlsdGVyKChkYXRhKSA9PiBkYXRhLmdldEtleSgpID09PSBcInNvcnRlcnNcIik7XG5cdFx0XHRsZXQgc29ydGVyczogU29ydGVyVHlwZVtdID0gW107XG5cdFx0XHRpZiAoc29ydGVyc0N1c3RvbURhdGEubGVuZ3RoKSBzb3J0ZXJzID0gc29ydGVyc0N1c3RvbURhdGFbMF0uZ2V0VmFsdWUoKS5zb3J0ZXJzO1xuXG5cdFx0XHRhd2FpdCB0aGlzLl91cGRhdGVCaW5kaW5nV2l0aFRyYW5zaWVudENvbnRleHRzKFxuXHRcdFx0XHRwYXlsb2FkLFxuXHRcdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdFx0YmluZGluZ0luZm8sXG5cdFx0XHRcdGFkZGl0aW9uYWxWYWx1ZXMsXG5cdFx0XHRcdHZhbHVlTGlzdFByb3BlcnR5LFxuXHRcdFx0XHRmaWVsZCxcblx0XHRcdFx0c29ydGVycyxcblx0XHRcdFx0dGFibGVcblx0XHRcdCk7XG5cdFx0XHRpZiAodXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZSkge1xuXHRcdFx0XHQvL3Jlc29sdmUgdGhlIHByb21pc2UgYXMgZXZlcnl0aGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdFx0dXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZSgpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvL2NhbGwgX3VwZGF0ZUJpbmRpbmcgaWYgdGhlcmUgYXJlIG5vIHJlbGV2YW50IHJlY29tbWVuZGF0aW9uc1xuXHRcdFx0dGhpcy5fdXBkYXRlQmluZGluZyhsaXN0QmluZGluZywgYmluZGluZ0luZm8pO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGEgZmlsdGVyIGluIGEgPGNvZGU+TGlzdEJpbmRpbmc8L2NvZGU+LlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIHJlcXVlc3RlZEl0ZW1zIE51bWJlciBvZiByZXF1ZXN0ZWQgaXRlbXNcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIGlmIHNlYXJjaCBpcyBleGVjdXRlZFxuXHQgKi9cblx0ZXhlY3V0ZUZpbHRlcjogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgcmVxdWVzdGVkSXRlbXM6IG51bWJlcikge1xuXHRcdGxpc3RCaW5kaW5nLmdldENvbnRleHRzKDAsIHJlcXVlc3RlZEl0ZW1zKTtcblxuXHRcdGF3YWl0IHRoaXMuY2hlY2tMaXN0QmluZGluZ1BlbmRpbmcodmFsdWVIZWxwLCBsaXN0QmluZGluZywgcmVxdWVzdGVkSXRlbXMpO1xuXHRcdHJldHVybiBsaXN0QmluZGluZztcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSA8Y29kZT5MaXN0QmluZGluZzwvY29kZT4gaXMgd2FpdGluZyBmb3IgYW4gdXBkYXRlLlxuXHQgKiBBcyBsb25nIGFzIHRoZSBjb250ZXh0IGhhcyBub3QgYmVlbiBzZXQgZm9yIDxjb2RlPkxpc3RCaW5kaW5nPC9jb2RlPixcblx0ICogPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBuZWVkcyB0byB3YWl0LlxuXHQgKiBAcGFyYW0gX3ZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdEJpbmRpbmcgdG8gY2hlY2tcblx0ICogQHBhcmFtIHJlcXVlc3RlZEl0ZW1zIE51bWJlciBvZiByZXF1ZXN0ZWQgaXRlbXNcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9uY2UgTGlzdEJpbmRpbmcgaGFzIGJlZW4gdXBkYXRlZFxuXHQgKi9cblx0Y2hlY2tMaXN0QmluZGluZ1BlbmRpbmc6IGFzeW5jIGZ1bmN0aW9uIChfdmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkLCByZXF1ZXN0ZWRJdGVtczogbnVtYmVyKSB7XG5cdFx0bGV0IGlzUGVuZGluZyA9IGZhbHNlO1xuXHRcdGlmIChsaXN0QmluZGluZyAmJiB0aGlzLnVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZXMuaGFzKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0YXdhaXQgdGhpcy51cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzLmdldChsaXN0QmluZGluZyk7XG5cdFx0fVxuXHRcdGlmIChsaXN0QmluZGluZyAmJiAhbGlzdEJpbmRpbmcuaXNTdXNwZW5kZWQoKSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgY29udGV4dHMgPSBhd2FpdCBsaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgcmVxdWVzdGVkSXRlbXMpO1xuXHRcdFx0XHRpc1BlbmRpbmcgPSBjb250ZXh0cy5sZW5ndGggPT09IDA7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRpZiAoZXJyb3IgJiYgKGVycm9yIGFzIHsgY2FuY2VsZWQ/OiBib29sZWFuIH0pPy5jYW5jZWxlZCkge1xuXHRcdFx0XHRcdHJldHVybiBpc1BlbmRpbmc7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBpc1BlbmRpbmc7XG5cdH0sXG5cblx0Z2V0VHlwZU1hcDogZnVuY3Rpb24gKF92YWx1ZUhlbHA6IFZhbHVlSGVscCkge1xuXHRcdHJldHVybiBUeXBlTWFwO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgY29udGVudCBvZiB0aGUgdmFsdWUgaGVscC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgaGVscCBpcyBvcGVuZWQgb3IgYSBrZXkgb3IgZGVzY3JpcHRpb24gaXMgcmVxdWVzdGVkLlxuXHQgKlxuXHQgKiBTbywgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBoZWxwIGNvbnRlbnQgdXNlZCwgYWxsIGNvbnRlbnQgY29udHJvbHMgYW5kIGRhdGEgbmVlZCB0byBiZSBhc3NpZ25lZC5cblx0ICogT25jZSB0aGV5IGFyZSBhc3NpZ25lZCBhbmQgdGhlIGRhdGEgaXMgc2V0LCB0aGUgcmV0dXJuZWQgPGNvZGU+UHJvbWlzZTwvY29kZT4gbmVlZHMgdG8gYmUgcmVzb2x2ZWQuXG5cdCAqIE9ubHkgdGhlbiBkb2VzIHRoZSB2YWx1ZSBoZWxwIGNvbnRpbnVlIG9wZW5pbmcgb3IgcmVhZGluZyBkYXRhLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250YWluZXIgQ29udGFpbmVyIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50SWQgSWQgb2YgdGhlIGNvbnRlbnQgc2hvd24gYWZ0ZXIgdGhpcyBjYWxsIHRvIHJldHJpZXZlQ29udGVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgaWYgYWxsIGNvbnRlbnQgaXMgYXZhaWxhYmxlXG5cdCAqL1xuXHRyZXRyaWV2ZUNvbnRlbnQ6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGFpbmVyOiBDb250YWluZXIsIGNvbnRlbnRJZDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRyZXR1cm4gVmFsdWVMaXN0SGVscGVyLnNob3dWYWx1ZUxpc3QocGF5bG9hZCwgY29udGFpbmVyLCBjb250ZW50SWQpO1xuXHR9LFxuXG5cdF9nZXRDb25kaXRpb25QYXlsb2FkTGlzdDogZnVuY3Rpb24gKGNvbmRpdGlvbjogQ29uZGl0aW9uT2JqZWN0KSB7XG5cdFx0Y29uc3QgY29uZGl0aW9uUGF5bG9hZE1hcCA9IChjb25kaXRpb24ucGF5bG9hZCB8fCB7fSkgYXMgQ29uZGl0aW9uUGF5bG9hZE1hcCxcblx0XHRcdHZhbHVlSGVscFF1YWxpZmllcnMgPSBPYmplY3Qua2V5cyhjb25kaXRpb25QYXlsb2FkTWFwKSxcblx0XHRcdGNvbmRpdGlvblBheWxvYWRMaXN0ID0gdmFsdWVIZWxwUXVhbGlmaWVycy5sZW5ndGggPyBjb25kaXRpb25QYXlsb2FkTWFwW3ZhbHVlSGVscFF1YWxpZmllcnNbMF1dIDogW107XG5cblx0XHRyZXR1cm4gY29uZGl0aW9uUGF5bG9hZExpc3Q7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIFZhbHVlTGlzdFByb3BlcnR5IGZyb20gUGF5bG9hZCBiYXNlZCBvbiBkYXRhIGZyb20gcGF5bG9hZCBrZXlzIGFuZCBwYXJhbWV0ZXJzLlxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcmV0dXJucyBWYWx1ZUxpc3RQcm9wZXJ0eVxuXHQgKi9cblx0X2dldFZhbHVlTGlzdFByb3BlcnR5RnJvbVBheWxvYWRRdWFsaWZpZXI6IGZ1bmN0aW9uIChwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkKSB7XG5cdFx0Y29uc3QgcGFyYW1zID0gcGF5bG9hZC5xdWFsaWZpZXJzW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXT8udmhQYXJhbWV0ZXJzIHx8IFtdO1xuXHRcdGNvbnN0IGtleXMgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdPy52aEtleXMgfHwgW107XG5cdFx0Y29uc3QgcHJvcGVydHlLZXlQYXRoID0gcGF5bG9hZC52YWx1ZUhlbHBLZXlQYXRoO1xuXHRcdGxldCBmaWx0ZXJlZEtleXM6IHN0cmluZ1tdID0gWy4uLmtleXNdO1xuXHRcdGNvbnN0IGhlbHBQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRpZiAocGFyYW1zLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vY3JlYXRlIGhlbHBQYXRocyBhcnJheSB3aGljaCB3aWxsIG9ubHkgY29uc2lzdCBvZiBwYXJhbXMgaGVscHBhdGhcblx0XHRcdHBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbTogSW5PdXRQYXJhbWV0ZXIpIHtcblx0XHRcdFx0aGVscFBhdGhzLnB1c2gocGFyYW0uaGVscFBhdGgpO1xuXHRcdFx0fSk7XG5cdFx0XHQvL2ZpbHRlciB0aGUga2V5cyBiYXNlZCBvbiBoZWxwUGF0aHMuIElmIGtleSBpcyBub3QgcHJlc2VudCBpbiBoZWxwUGF0aCB0aGVuIGl0IGlzIHZhbHVlbGlzdHByb3BlcnR5XG5cdFx0XHRmaWx0ZXJlZEtleXMgPSBrZXlzLmZpbHRlcigoa2V5OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0cmV0dXJuICFoZWxwUGF0aHMuaW5jbHVkZXMoa2V5KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIGZyb20gZmlsdGVyZWRLZXlzIHJldHVybiB0aGUga2V5IHRoYXQgbWF0Y2hlcyB0aGUgcHJvcGVydHkgbmFtZVxuXHRcdHJldHVybiBwcm9wZXJ0eUtleVBhdGggJiYgZmlsdGVyZWRLZXlzLmluY2x1ZGVzKHByb3BlcnR5S2V5UGF0aCkgPyBwcm9wZXJ0eUtleVBhdGggOiBcIlwiO1xuXHR9LFxuXG5cdF9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9GaWx0ZXJCYXI6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRjb25kaXRpb25zOiBDb25kaXRpb25PYmplY3RbXSxcblx0XHRvdXRQYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdGZpbHRlckJhcjogRmlsdGVyQmFyLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0bGlzdFJlcG9ydEZpbHRlckJhcjogRmlsdGVyQmFyXG5cdCkge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBzdGF0ZTogRXh0ZXJuYWxTdGF0ZVR5cGUgPSBhd2FpdCBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKGxpc3RSZXBvcnRGaWx0ZXJCYXIpO1xuXHRcdFx0Y29uc3Qgc3RhdGVJdGVtcyA9IHN0YXRlLml0ZW1zOyAvLyBWaXNpYmxlIEZpbHRlckl0ZW1zIGluIHRoZSBMUi1GaWx0ZXJCYXJcblx0XHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnRpZXMgPSBGaWx0ZXJVdGlscy5nZXRGaWx0ZXJQcm9wZXJ0eUluZm8oZmlsdGVyQmFyIGFzIHVua25vd24gYXMgSUZpbHRlckNvbnRyb2wpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gZmlsdGVyQmFyLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdFx0Ly8gUHJvcGFnYXRlIE9VVCBwYXJhbWV0ZXIgb25seSBpZiB0aGUgZmlsdGVyIGZpZWxkIGlzIHZpc2libGUgaW4gdGhlIExSIGZpbHRlcmJhclxuXHRcdFx0Ly8gTFIgRmlsdGVyQmFyIG9yIExSIEFkYXB0RmlsdGVyXG5cdFx0XHRmb3IgKGNvbnN0IG91dFBhcmFtZXRlciBvZiBvdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnR5ID0gdGhpcy5fZmluZEZpbHRlckJhclByb3BlcnR5QnlBbm5vdGF0aW9uUGF0aChcblx0XHRcdFx0XHRvdXRQYXJhbWV0ZXIsXG5cdFx0XHRcdFx0cGF5bG9hZC5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0bWV0YU1vZGVsLFxuXHRcdFx0XHRcdGZpbHRlckJhclByb3BlcnRpZXNcblx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKGZpbHRlckJhclByb3BlcnR5ICYmIHN0YXRlSXRlbXM/LmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gZmlsdGVyQmFyUHJvcGVydHkubmFtZSkpIHtcblx0XHRcdFx0XHQvKiBSZXNldCB0aGUgY29uZGl0aW9ucyBiZWZvcmUgY3JlYXRlIG5ldyBjb25kaXRpb25zIG90aGVyd2lzZSBpdCBnZXRzIG5vdCB1cGRhdGVkICovXG5cdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uUGF0aCA9IGZpbHRlckJhclByb3BlcnR5LmNvbmRpdGlvblBhdGggYXMgc3RyaW5nO1xuXHRcdFx0XHRcdHN0YXRlLmZpbHRlcltjb25kaXRpb25QYXRoXT8uZm9yRWFjaCgoY29uZGl0aW9uKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25kaXRpb24uZmlsdGVyZWQgPSBmYWxzZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gUHJvcGFnYXRlIE9VVCBwYXJhbWV0ZXIgZm9yIGVhY2ggY29uZGl0aW9uc1xuXHRcdFx0Zm9yIChjb25zdCBjb25kaXRpb24gb2YgY29uZGl0aW9ucykge1xuXHRcdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkTGlzdCA9IHRoaXMuX2dldENvbmRpdGlvblBheWxvYWRMaXN0KGNvbmRpdGlvbik7XG5cdFx0XHRcdGZvciAoY29uc3Qgb3V0UGFyYW1ldGVyIG9mIG91dFBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRjb25zdCBmaWx0ZXJCYXJQcm9wZXJ0eSA9IHRoaXMuX2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGgoXG5cdFx0XHRcdFx0XHRvdXRQYXJhbWV0ZXIsXG5cdFx0XHRcdFx0XHRwYXlsb2FkLnByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGZpbHRlckJhclByb3BlcnRpZXNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdC8vIFByb3BhZ2F0ZSBPVVQgcGFyYW1ldGVyIG9ubHkgaWYgdGhlIGZpbHRlciBmaWVsZCBpcyB2aXNpYmxlIGluIHRoZSBMUiBmaWx0ZXJiYXJcblx0XHRcdFx0XHQvLyBMUiBGaWx0ZXJCYXIgb3IgTFIgQWRhcHRGaWx0ZXJcblx0XHRcdFx0XHRpZiAoZmlsdGVyQmFyUHJvcGVydHkgJiYgc3RhdGVJdGVtcz8uZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBmaWx0ZXJCYXJQcm9wZXJ0eS5uYW1lKSkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb25kaXRpb25QYXlsb2FkIG9mIGNvbmRpdGlvblBheWxvYWRMaXN0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0NvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVDb25kaXRpb24oXG5cdFx0XHRcdFx0XHRcdFx0XCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcdFtjb25kaXRpb25QYXlsb2FkW291dFBhcmFtZXRlci5oZWxwUGF0aF1dLFxuXHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBhdGggPSBmaWx0ZXJCYXJQcm9wZXJ0eS5jb25kaXRpb25QYXRoIGFzIHN0cmluZztcblx0XHRcdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uQWxyZWFkeUV4aXN0cyA9IHN0YXRlLmZpbHRlcltjb25kaXRpb25QYXRoXT8uZmluZCgodGVzdENvbmRpdGlvbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSB0ZXN0Q29uZGl0aW9uLmZpbHRlcmVkO1xuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLmNoZWNrQ29uZGl0aW9uc0VxdWFsKHRlc3RDb25kaXRpb24sIG5ld0NvbmRpdGlvbikpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyByZXNldCBmaWx0ZXJlZCB0byBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdHRlc3RDb25kaXRpb24uZmlsdGVyZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRpZiAoIWNvbmRpdGlvbkFscmVhZHlFeGlzdHMpIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS5maWx0ZXJbY29uZGl0aW9uUGF0aF0gfHw9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdHN0YXRlLmZpbHRlcltjb25kaXRpb25QYXRoXS5wdXNoKG5ld0NvbmRpdGlvbik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIEFwcGx5IHRvIHRoZSBwYXJlbnQgb2YgdGhlIEZpbHRlckZpZWxkXG5cdFx0XHRTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKGZpbHRlckJhciwgc3RhdGUpO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcblx0XHRcdExvZy5lcnJvcihgVmFsdWVIZWxwRGVsZWdhdGU6ICR7bWVzc2FnZX1gKTtcblx0XHR9XG5cdH0sXG5cblx0X2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGg6IGZ1bmN0aW9uIChcblx0XHRvdXRQYXJhbWV0ZXI6IEluT3V0UGFyYW1ldGVyLFxuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRcdG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdFx0ZmlsdGVyQmFyUHJvcGVydGllczogUHJvcGVydHlJbmZvW11cblx0KSB7XG5cdFx0Y29uc3QgY29udGV4dFBhdGggPSBgLyR7cHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKVsxXX1gO1xuXHRcdGNvbnN0IGZpbHRlclRhcmdldCA9IG91dFBhcmFtZXRlci5zb3VyY2Uuc3BsaXQoXCJjb25kaXRpb25zL1wiKS5wb3AoKSB8fCBcIlwiO1xuXHRcdGNvbnN0IGxhc3RJbmRleCA9IHByb3BlcnR5UGF0aC5sYXN0SW5kZXhPZihcIi9cIik7XG5cdFx0Y29uc3QgZmlsdGVyVGFyZ2V0UGF0aCA9IGxhc3RJbmRleCA+IDAgPyBgJHtwcm9wZXJ0eVBhdGguc3Vic3RyaW5nKDAsIGxhc3RJbmRleCl9LyR7ZmlsdGVyVGFyZ2V0fWAgOiBmaWx0ZXJUYXJnZXQ7XG5cdFx0Y29uc3QgYW5ub3RhdGlvblBhdGggPSBtZXRhTW9kZWw/LmdldFJlZHVjZWRQYXRoKGZpbHRlclRhcmdldFBhdGgsIGNvbnRleHRQYXRoKTtcblx0XHRyZXR1cm4gZmlsdGVyQmFyUHJvcGVydGllcy5maW5kKChpdGVtKSA9PiBpdGVtLmFubm90YXRpb25QYXRoID09PSBhbm5vdGF0aW9uUGF0aCk7XG5cdH0sXG5cblx0X29uQ29uZGl0aW9uUHJvcGFnYXRpb25Ub0JpbmRpbmdDb250ZXh0OiBmdW5jdGlvbiAoXG5cdFx0Y29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0W10sXG5cdFx0b3V0UGFyYW1ldGVyczogSW5PdXRQYXJhbWV0ZXJbXSxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscFxuXHQpIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkTGlzdCA9IHRoaXMuX2dldENvbmRpdGlvblBheWxvYWRMaXN0KGNvbmRpdGlvbiksXG5cdFx0XHRcdG91dFZhbHVlcyA9IGNvbmRpdGlvblBheWxvYWRMaXN0Lmxlbmd0aCA9PT0gMSA/IGNvbmRpdGlvblBheWxvYWRMaXN0WzBdIDogdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoY29uZGl0aW9uUGF5bG9hZExpc3QubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRMb2cud2FybmluZyhcIlZhbHVlSGVscERlbGVnYXRlOiBQYXJhbWV0ZXJPdXQgaW4gbXVsdGktdmFsdWUtZmllbGQgbm90IHN1cHBvcnRlZFwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChvdXRWYWx1ZXMpIHtcblx0XHRcdFx0dGhpcy5fb25Db25kaXRpb25Qcm9wYWdhdGlvblVwZGF0ZVByb3BlcnR5KG1ldGFNb2RlbCwgb3V0VmFsdWVzLCBvdXRQYXJhbWV0ZXJzLCBjb250ZXh0LCB2YWx1ZUhlbHApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRfb25Db25kaXRpb25Qcm9wYWdhdGlvblVwZGF0ZVByb3BlcnR5OiBmdW5jdGlvbiAoXG5cdFx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRvdXRWYWx1ZXM6IENvbmRpdGlvblBheWxvYWRUeXBlLFxuXHRcdG91dFBhcmFtZXRlcnM6IEluT3V0UGFyYW1ldGVyW10sXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0dmFsdWVIZWxwOiBWYWx1ZUhlbHBcblx0KSB7XG5cdFx0Y29uc3QgY29udmVydGVkTWV0YWRhdGEgPSBjb252ZXJ0VHlwZXMobWV0YU1vZGVsKTtcblx0XHRjb25zdCByb290UGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSkuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IGNvbnRleHRDYW5SZXF1ZXN0U2lkZUVmZmVjdHMgPSBjb250ZXh0LmlzVHJhbnNpZW50KCkgIT09IHRydWUgJiYgIWNvbnRleHQuaXNJbmFjdGl2ZSgpO1xuXHRcdGNvbnN0IG91dFBhcmFtZXRlclNvdXJjZXM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBvdXRQYXJhbWV0ZXIgb2Ygb3V0UGFyYW1ldGVycykge1xuXHRcdFx0LyogVXBkYXRlZCBwcm9wZXJ0eSB2aWEgb3V0LXBhcmFtZXRlciBpZiB2YWx1ZSBjaGFuZ2VkICovXG5cdFx0XHR0aGlzLl91cGRhdGVQcm9wZXJ0eVZpYU91dFBhcmFtZXRlcihcblx0XHRcdFx0Y29udmVydGVkTWV0YWRhdGEsXG5cdFx0XHRcdHJvb3RQYXRoLFxuXHRcdFx0XHRvdXRWYWx1ZXMsXG5cdFx0XHRcdG91dFBhcmFtZXRlcixcblx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0Y29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0c1xuXHRcdFx0KTtcblx0XHRcdG91dFBhcmFtZXRlclNvdXJjZXMucHVzaChvdXRQYXJhbWV0ZXIuc291cmNlKTtcblx0XHR9XG5cdFx0Y29uc3QgdmlldyA9IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcodmFsdWVIZWxwKTtcblx0XHRjb25zdCBjb2xsYWJvcmF0aXZlRHJhZnQgPSB2aWV3LmdldENvbnRyb2xsZXIoKS5jb2xsYWJvcmF0aXZlRHJhZnQ7XG5cdFx0aWYgKGNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpICYmIG91dFBhcmFtZXRlclNvdXJjZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly8gd2UgZGV0ZXJtaW5lIHRoZSBiaW5kaW5nIHRoYXQgc2VuZHMgdGhlIHJlcXVlc3Rcblx0XHRcdGxldCBiaW5kaW5nO1xuXHRcdFx0aWYgKGNvbnRleHQuZ2V0QmluZGluZygpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGJpbmRpbmcgPSBjb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJpbmRpbmcgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkuZ2V0QmluZGluZygpO1xuXHRcdFx0fVxuXHRcdFx0LyogVGhlIG91dCB2YWx1ZXMgaGF2ZSBiZWVuIGNoYW5nZWQgLS0+IHdhaXQgdW50aWwgdGhlIHJlcXVlc3QgaXMgc2VudCB0byB0aGUgc2VydmVyIGJlZm9yZSBzZW5kaW5nIGEgbm90aWZpY2F0aW9uIHRvIHRoZSBvdGhlciBjb2xsYWJvcmF0b3JzXG5cdFx0XHRcdFx0XHRcdCBXZSBhdHRhY2ggdGhlIGV2ZW50IG9uIHRoZSByaWdodCBiaW5kaW5nICovXG5cdFx0XHRiaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcInBhdGNoQ29tcGxldGVkXCIsICgpID0+IHtcblx0XHRcdFx0Y29sbGFib3JhdGl2ZURyYWZ0LnNlbmQoe1xuXHRcdFx0XHRcdGFjdGlvbjogQWN0aXZpdHkuQ2hhbmdlLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG91dFBhcmFtZXRlclNvdXJjZXMubWFwKChzb3VyY2UpID0+IGNvbnRleHQuZ2V0UGF0aCgpICsgXCIvXCIgKyBzb3VyY2UpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdF91cGRhdGVQcm9wZXJ0eVZpYU91dFBhcmFtZXRlcjogZnVuY3Rpb24gKFxuXHRcdGNvbnZlcnRlZE1ldGFkYXRhOiBDb252ZXJ0ZWRNZXRhZGF0YSxcblx0XHRyb290UGF0aDogc3RyaW5nLFxuXHRcdG91dFZhbHVlczogQ29uZGl0aW9uUGF5bG9hZFR5cGUsXG5cdFx0b3V0UGFyYW1ldGVyOiBJbk91dFBhcmFtZXRlcixcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzOiBib29sZWFuXG5cdCkge1xuXHRcdC8qIFVwZGF0ZWQgcHJvcGVydHkgdmlhIG91dC1wYXJhbWV0ZXIgaWYgdmFsdWUgY2hhbmdlZCAqL1xuXHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IGAke3Jvb3RQYXRofS8ke291dFBhcmFtZXRlci5zb3VyY2V9YDtcblx0XHRjb25zdCB0YXJnZXRQcm9wZXJ0eSA9IGNvbnZlcnRlZE1ldGFkYXRhLnJlc29sdmVQYXRoPFByb3BlcnR5Pihwcm9wZXJ0eVBhdGgpLnRhcmdldDtcblx0XHRjb25zdCBmaWVsZENvbnRyb2wgPSB0YXJnZXRQcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRmllbGRDb250cm9sO1xuXHRcdGNvbnN0IGR5bmFtaWNSZWFkT25seSA9IGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGZpZWxkQ29udHJvbCkgPyBjb250ZXh0LmdldFByb3BlcnR5KGZpZWxkQ29udHJvbC5wYXRoKSA9PT0gMSA6IGZhbHNlO1xuXHRcdGlmIChkeW5hbWljUmVhZE9ubHkgJiYgY29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0LyogTm9uLVRyYW5zaWVudCBhbmQgYWN0aXZlIGNvbnRleHQgKi9cblx0XHRcdGNvbnN0IGxhc3RJbmRleCA9IG91dFBhcmFtZXRlci5zb3VyY2UubGFzdEluZGV4T2YoXCIvXCIpO1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdFBhdGggPSBsYXN0SW5kZXggPiAwID8gb3V0UGFyYW1ldGVyLnNvdXJjZS5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KSA6IG91dFBhcmFtZXRlci5zb3VyY2U7XG5cdFx0XHQvKiBXZSBzZW5kIFs8cHJvcGVydHlOYW1lPl0gaW4gY2FzZSBvZiBhIHByb3BlcnR5IHBhdGggd2l0aG91dCBhbnkgbmF2aWdhdGlvbiBpbnZvbHZlZCAqL1xuXHRcdFx0LyogSW4gY2FzZSBvZiBhIHBhdGggaW52b2x2aW5nIG5hdmlnYXRpb25zLCB3ZSBzZW5kIFs8bmF2aWdhdGlvblBhdGg+XSBlbmRpbmcgd2l0aCBhIG5hdmlnYXRpb24gcHJvcGVydHkgYW5kIG5vdCB3aXRoIGEgcHJvcGVydHkgKi9cblx0XHRcdGNvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFtzaWRlRWZmZWN0UGF0aF0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvKiBUaGUgZmFzdCBjcmVhdGlvbiByb3cgKHRyYW5zaWVudCBjb250ZXh0KSBjYW7CtHQgaGF2ZSBpbnN0YW50IHNwZWNpZmljIChkeW5hbWljKSByZWFkLW9ubHkgZmllbGRzLCB0aGVyZWZvcmUgd2UgZG9uwrR0IG5lZWQgdG8gaGFuZGxlL2NvbnNpZGVyIHRoaXMgY2FzZSBzcGVjaWZpY2FsbHkgKi9cblx0XHRcdC8qIEFkZGl0aW9uYWwgaW5mb3M6ICovXG5cdFx0XHQvKiBUaGUgZmFzdCBjcmVhdGlvbiByb3cgaXMgb25seSB1c2VkIGJ5IFNEICovXG5cdFx0XHQvKiBUaGUgZ3JvdXAgSUQgKHRoaXJkIGFyZ3VtZW50IG9mIHNldFByb3BlcnR5IGRlc2NyaWJlZCBhcGkgZG9jdW1lbnRhdGlvbiBvZiB0aGUgQ29udGV4dCkgaXMgdXNlZCBmb3IgdGhlIFBBVENIIHJlcXVlc3QsIGlmIG5vdCBzcGVjaWZpZWQsIHRoZSB1cGRhdGUgZ3JvdXAgSUQgZm9yIHRoZSBjb250ZXh0J3MgYmluZGluZyBpcyB1c2VkLCAnbnVsbCcgdG8gcHJldmVudCB0aGUgUEFUQ0ggcmVxdWVzdCAqL1xuXHRcdFx0LyogVGhlIFRyYW5zaWVudCBjb250ZXh0IGNhbm5vdCByZXF1ZXN0IFNpZGVFZmZlY3RzIGFuZCAgY2Fubm90IHBhdGNoIHZpYSBncm91cCAnbnVsbCcgKi9cblx0XHRcdGNvbnN0IGN1cnJlbnRWYWwgPSBjb250ZXh0LmdldFByb3BlcnR5KG91dFBhcmFtZXRlci5zb3VyY2UpO1xuXHRcdFx0Y29uc3QgbmV3VmFsID0gb3V0VmFsdWVzW291dFBhcmFtZXRlci5oZWxwUGF0aF07XG5cdFx0XHRpZiAoY3VycmVudFZhbCAhPT0gbmV3VmFsKSB7XG5cdFx0XHRcdGNvbnRleHQuc2V0UHJvcGVydHkob3V0UGFyYW1ldGVyLnNvdXJjZSwgbnVsbCk7XG5cdFx0XHRcdGNvbnRleHQuc2V0UHJvcGVydHkob3V0UGFyYW1ldGVyLnNvdXJjZSwgb3V0VmFsdWVzW291dFBhcmFtZXRlci5oZWxwUGF0aF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvKiBJZiB0aGUga2V5IGdldHMgdXBkYXRlZCB2aWEgb3V0LXBhcmFtZXRlciwgdGhlbiB0aGUgZGVzY3JpcHRpb24gbmVlZHMgYWxzbyByZXRyaWV2ZWQgd2l0aCByZXF1ZXN0U2lkZUVmZmVjdHMgKi9cblx0XHRjb25zdCB0ZXh0UGF0aCA9IGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHRhcmdldFByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0KVxuXHRcdFx0PyB0YXJnZXRQcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dC5wYXRoXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRpZiAodGV4dFBhdGggIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRjb25zdCBsYXN0SW5kZXggPSB0ZXh0UGF0aC5sYXN0SW5kZXhPZihcIi9cIik7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0UGF0aCA9IGxhc3RJbmRleCA+IDAgPyB0ZXh0UGF0aC5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KSA6IHRleHRQYXRoO1xuXHRcdFx0LyogVGhlIHNpZGVFZmZlY3RQYXRoIGNhbiBiZSBbPHByb3BlcnR5TmFtZT5dIG9yIFs8bmF2aWdhdGlvblBhdGg+XSAqL1xuXHRcdFx0Y29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3NpZGVFZmZlY3RQYXRoXSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBQcm92aWRlcyBhIG1hcCBvZiBjb25kaXRpb25zIGZvciB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbnM6XG5cdCAqIEluaXRpYWwgc2V0IG9mIGNvbmRpdGlvbnMgYXBwbGllZCBldmVyeSB0aW1lIHZhbHVlIGhlbHAgY29udGVudCBpcyBzaG93biBmb3IgdGhlIGZpcnN0IHRpbWUgc2luY2Ugb3BlbmluZyBpdHMgY29udGFpbmVyLlxuXHQgKiBEZXRhaWxlZCBzZXQgb2YgY29uZGl0aW9ucyBpbiBnZXRJdGVtRm9yVmFsdWUgc2NlbmFyaW9zIHRoYXQgYWxsb3cgeW91IHRvIGZpbmQgYSBzcGVjaWZpYyB2YWx1ZSBoZWxwIGl0ZW0gKGluZGljYXRlZCBieSBjb25maWcgYXZhaWxhYmlsaXR5KS5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgVmFsdWVIZWxwIGNvbnRyb2wgaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgVmFsdWVIZWxwIGNvbnRlbnQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9uIG9iamVjdFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIGEgcHJvbWlzZSByZXNvbHZpbmcgdG8gYSBtYXAgb2YgY29uZGl0aW9uc1xuXHQgKi9cblx0Z2V0RmlsdGVyQ29uZGl0aW9uczogZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBDb250ZW50LCBjb25maWc/OiBNRENDb25maWdUeXBlKSB7XG5cdFx0aWYgKHRoaXMuZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnMpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zKHZhbHVlSGVscCwgY29udGVudCwgKGNvbmZpZyAmJiBjb25maWcuY29udHJvbCkgfHwgKGNvbnRlbnQgJiYgY29udGVudC5nZXRDb250cm9sKCkpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHt9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxsYmFjayBpbnZva2VkIGV2ZXJ5IHRpbWUgYSB7QGxpbmsgc2FwLnVpLm1kYy5WYWx1ZUhlbHAgVmFsdWVIZWxwfSBmaXJlcyBhIHNlbGVjdCBldmVudCBvciB0aGUgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgY2hhbmdlc1xuXHQgKiBUaGlzIGNhbGxiYWNrIG1heSBiZSB1c2VkIHRvIHVwZGF0ZSBleHRlcm5hbCBmaWVsZHMuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVmFsdWVIZWxwIGNvbnRyb2wgaW5zdGFuY2UgcmVjZWl2aW5nIHRoZSA8Y29kZT5jb250cm9sQ2hhbmdlPC9jb2RlPlxuXHQgKiBAcGFyYW0gcmVhc29uIFJlYXNvbiB3aHkgdGhlIG1ldGhvZCB3YXMgaW52b2tlZFxuXHQgKiBAcGFyYW0gX2NvbmZpZyBDdXJyZW50IGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgdGhlIGNhbGxpbmcgY29udHJvbFxuXHQgKiBAc2luY2UgMS4xMDEuMFxuXHQgKi9cblx0b25Db25kaXRpb25Qcm9wYWdhdGlvbjogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCByZWFzb246IHN0cmluZywgX2NvbmZpZzogdW5rbm93bikge1xuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0aWYgKHJlYXNvbiAhPT0gXCJDb250cm9sQ2hhbmdlXCIgfHwgcGF5bG9hZC5pc0RlZmluZUNvbmRpdGlvblZhbHVlSGVscCkge1xuXHRcdFx0Ly8gaGFuZGxlIG9ubHkgQ29udHJvbENoYW5nZSByZWFzb25cblx0XHRcdC8vIGFsc28gZG9uJ3QgaGFuZGxlIGZvciBkZWZpbmUgY29uZGl0aW9uIHZhbHVlIGhlbHAgYXMgcHJvcGFnYXRpbmcgY29uZGl0aW9ucyBvbiB0aGUgdmFsdWUgaGVscFxuXHRcdFx0Ly8gdG8gZGVmaW5lIGNvbmRpdGlvbnMgZG9lcyBub3QgbWFrZSBzZW5zZSBidXQgd291bGQgb25seSBjb25mdXNlIHVzZXJzIGJ5IGFsbG93aW5nIHJlY3Vyc2l2ZSB1c2Vcblx0XHRcdC8vIG9mIHRoZSBjb25kaXRpb24gdmFsdWUgaGVscFxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBxdWFsaWZpZXIgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdO1xuXHRcdGNvbnN0IG91dFBhcmFtZXRlcnMgPSBxdWFsaWZpZXI/LnZoUGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkID8gVmFsdWVMaXN0SGVscGVyLmdldE91dFBhcmFtZXRlcnMocXVhbGlmaWVyLnZoUGFyYW1ldGVycykgOiBbXSxcblx0XHRcdGZpZWxkID0gdmFsdWVIZWxwLmdldENvbnRyb2woKSBhcyBGaWVsZEJhc2UsXG5cdFx0XHRmaWVsZFBhcmVudCA9IGZpZWxkLmdldFBhcmVudCgpIGFzIEZpbHRlckJhckJhc2UgfCBDb250cm9sO1xuXG5cdFx0bGV0IGNvbmRpdGlvbnMgPSBmaWVsZC5nZXRDb25kaXRpb25zKCkgYXMgQ29uZGl0aW9uT2JqZWN0W107XG5cdFx0aWYgKCFwYXlsb2FkLmlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzKSB7XG5cdFx0XHR0aGlzLl9zZXRIaXN0b3J5RGF0YShwYXlsb2FkLCBjb25kaXRpb25zLCBmaWVsZCk7XG5cdFx0fVxuXHRcdGNvbmRpdGlvbnMgPSBjb25kaXRpb25zLmZpbHRlcihmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkTWFwID0gKGNvbmRpdGlvbi5wYXlsb2FkIHx8IHt9KSBhcyBDb25kaXRpb25QYXlsb2FkTWFwO1xuXHRcdFx0cmV0dXJuIGNvbmRpdGlvblBheWxvYWRNYXBbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdO1xuXHRcdH0pO1xuXG5cdFx0Y29uc3QgbGlzdFJlcG9ydEZpbHRlckJhciA9IGZpZWxkLmdldFBhcmVudCgpIGFzIEZpbHRlckJhckJhc2UgfCBDb250cm9sOyAvLyBDb250cm9sIGUuZy4gRm9ybUNvbnRhaW5lclxuXHRcdGlmIChsaXN0UmVwb3J0RmlsdGVyQmFyLmlzQShGZUNvcmVDb250cm9sc0ZpbHRlckJhcikgJiYgb3V0UGFyYW1ldGVycy5sZW5ndGggJiYgY29uZGl0aW9ucy5sZW5ndGgpIHtcblx0XHRcdC8vIFByb3BhZ2F0ZSB0aGUgdmFsdWUgb25seSBpZiB0aGUgRmlsdGVyRmllbGQgaXMgcGFydCBvZiB0aGUgTFItRmlsdGVyQmFyIGFsc28gaW5zaWRlIGluIEFkYXB0IEZpbHRlcnMgZGlhbG9nXG5cdFx0XHRhd2FpdCB0aGlzLl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9GaWx0ZXJCYXIoXG5cdFx0XHRcdGNvbmRpdGlvbnMsXG5cdFx0XHRcdG91dFBhcmFtZXRlcnMsXG5cdFx0XHRcdGZpZWxkUGFyZW50IGFzIEZpbHRlckJhcixcblx0XHRcdFx0cGF5bG9hZCxcblx0XHRcdFx0bGlzdFJlcG9ydEZpbHRlckJhciBhcyBGaWx0ZXJCYXJcblx0XHRcdCk7XG5cdFx0XHQvLyBMUiBTZXR0aW5ncyBEaWFsb2cgb3IgT1AgU2V0dGluZ3MgRGlhbG9nIHNoYWxsIG5vdCBwcm9wYWdhdGUgdmFsdWUgdG8gdGhlIGRpYWxvZyBmaWx0ZXJmaWVsZHMgb3IgY29udGV4dFxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPYmplY3QgUGFnZVxuXHRcdFx0LyogVG8gYXZvaWQgdGltaW5nIGlzc3VlIHdlIHVzZSB0aGUgQmluZGluZ0NvbnRleHQgb2YgdGhlIGNvbnRyb2wgaW5zdGVhZCBvZiB0aGUgVmFsdWVIZWxwIChCQ1AgMjM4MDA1NzIyNykgKi9cblx0XHRcdGNvbnN0IGNvbnRleHQgPSBmaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKGNvbnRleHQpIHtcblx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gKGZpZWxkLmdldE1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBtZXRhTW9kZWw/LmdldE9iamVjdChgJHtwYXlsb2FkLnByb3BlcnR5UGF0aH1Ac2FwdWkubmFtZWApO1xuXHRcdFx0XHRjb25zdCBjb25kaXRpb24gPSBjb25kaXRpb25zLmxlbmd0aCA+IDAgPyBjb25kaXRpb25zWzBdIDogKHt9IGFzIENvbmRpdGlvbk9iamVjdCk7XG5cdFx0XHRcdGNvbnN0IHBheWxvYWRLZXlzID0gY29uZGl0aW9uPy5wYXlsb2FkID8gT2JqZWN0LmtleXMoY29uZGl0aW9uLnBheWxvYWQpIDogW107XG5cdFx0XHRcdHBheWxvYWRLZXlzLmZvckVhY2goKHBheWxvYWRLZXkpID0+IHtcblx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkTWFwID0gY29uZGl0aW9uLnBheWxvYWQgYXMgQ29uZGl0aW9uUGF5bG9hZE1hcCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkID0gY29uZGl0aW9uUGF5bG9hZE1hcD8uW3BheWxvYWRLZXldPy5bMF0gfHwge307XG5cdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uVmFsdWVrZXlzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uUGF5bG9hZCk7XG5cdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uVmFsdWVrZXkgPSBjb25kaXRpb25WYWx1ZWtleXMuZmluZCgodmFsdWVLZXkpID0+IHZhbHVlS2V5LmluY2x1ZGVzKFwiQCR1aTUuZmUuQENvbW1vbi9FeHRlcm5hbElEXCIpKTtcblx0XHRcdFx0XHRpZiAoY29uZGl0aW9uVmFsdWVrZXkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGtleVZhbHVlID0gY29uZGl0aW9uUGF5bG9hZFtjb25kaXRpb25WYWx1ZWtleV07XG5cdFx0XHRcdFx0XHRjb250ZXh0LnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwga2V5VmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHRoaXMuX29uQ29uZGl0aW9uUHJvcGFnYXRpb25Ub0JpbmRpbmdDb250ZXh0KGNvbmRpdGlvbnMsIG91dFBhcmFtZXRlcnMsIGNvbnRleHQsIHZhbHVlSGVscCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGluaXRpYWwgZmlsdGVyIGNvbmRpdGlvbiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsdWUgYW5kIGZsYWcgaW5kaWNhdGluZyBpZiB0aGUgaW5pdGlhbCB2YWx1ZSBpcyBzaWduaWZpY2FudC5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBmb3IgdGhlIGZpbHRlciBjb25kaXRpb24uXG5cdCAqIEBwYXJhbSBpbml0aWFsVmFsdWVJc1NpZ25pZmljYW50IEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgaW5pdGlhbCB2YWx1ZSBpcyBzaWduaWZpY2FudC5cblx0ICogQHJldHVybnMgVGhlIGZpbHRlciBjb25kaXRpb24uXG5cdCAqL1xuXHRfY3JlYXRlSW5pdGlhbEZpbHRlckNvbmRpdGlvbjogZnVuY3Rpb24gKHZhbHVlOiBWYWx1ZSwgaW5pdGlhbFZhbHVlSXNTaWduaWZpY2FudDogYm9vbGVhbikge1xuXHRcdGxldCBjb25kaXRpb246IENvbmRpdGlvbk9iamVjdCB8IHVuZGVmaW5lZDtcblxuXHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJWYWx1ZUhlbHBEZWxlZ2F0ZTogdmFsdWUgb2YgdGhlIHByb3BlcnR5IGNvdWxkIG5vdCBiZSByZXF1ZXN0ZWRcIik7XG5cdFx0fSBlbHNlIGlmICgodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUgPT09IG51bGwpICYmIGluaXRpYWxWYWx1ZUlzU2lnbmlmaWNhbnQpIHtcblx0XHRcdGNvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVDb25kaXRpb24oXCJFbXB0eVwiLCBbXSwgbnVsbCwgbnVsbCwgQ29uZGl0aW9uVmFsaWRhdGVkLlZhbGlkYXRlZCk7XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBcIlwiICYmIHZhbHVlICE9PSBudWxsKSB7XG5cdFx0XHRjb25kaXRpb24gPSBDb25kaXRpb24uY3JlYXRlQ29uZGl0aW9uKFwiRVFcIiwgW3ZhbHVlXSwgbnVsbCwgbnVsbCwgQ29uZGl0aW9uVmFsaWRhdGVkLlZhbGlkYXRlZCk7XG5cdFx0fVxuXHRcdHJldHVybiBjb25kaXRpb247XG5cdH0sXG5cblx0X2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUJpbmRpbmc6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRpbkNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdE1hcCxcblx0XHRjb250cm9sOiBDb250cm9sLFxuXHRcdGluUGFyYW1ldGVyczogSW5PdXRQYXJhbWV0ZXJbXSxcblx0XHRwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkXG5cdCkge1xuXHRcdGNvbnN0IGJpbmRpbmdDb250ZXh0ID0gY29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdGlmICghYmluZGluZ0NvbnRleHQpIHtcblx0XHRcdExvZy5lcnJvcihcIlZhbHVlSGVscERlbGVnYXRlOiBObyBCaW5kaW5nQ29udGV4dFwiKTtcblx0XHRcdHJldHVybiBpbkNvbmRpdGlvbnM7XG5cdFx0fVxuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRyb2wuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0Y29uc3Qgcm9vdFBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRsZXQgcHJvcGVydGllc1RvUmVxdWVzdCA9IGluUGFyYW1ldGVycy5tYXAoKGluUGFyYW1ldGVyKSA9PiBpblBhcmFtZXRlci5zb3VyY2UpO1xuXHRcdC8qIEluIGNhc2Ugb2YgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2csIHdoaWNoIGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXRoIFwiJFBhcmFtZXRlclwiLCB0aGUgYmluZGluZyBjb250ZXh0IGlzIGFsd2F5cyByZWxhdGl2ZSB0byB0aGUgaW4tcGFyYW1ldGVycy4gKi9cblx0XHQvKiBXZSBuZWVkIHRvIHJlcXVlc3QgdGhlIGluLXBhcmFtZXRlciB2YWx1ZXMgcmVsYXRpdmUgdG8gdGhlIGJpbmRpbmcgY29udGV4dC5cbkluIHNvbWUgY2FzZXMgKGUuZy4gbXVsdGkgdmFsdWUgZmllbGQpLCB0aGUgYmluZGluZyBjb250ZXh0IGRvZXMgbm90IHBvaW50IHRvIHRoZVxuVkggYW5ub3RhdGlvbiB0YXJnZXQsIHRodXMgd2UgaWRlbnRpZnkgdGhlIG5lZWRlZCBuYXZpZ2F0aW9uIHJlbGF0aW9uIGJ5XG5yZWR1Y2luZyB0aGUgcGF5bG9hZC5wcm9wZXJ0eVBhdGggYnkgdGhlIHBhdGggZGVyaXZlZCBmcm9tIGJpbmRpbmcgY29udGV4dC5cblRoaXMgY2Fubm90IGhhcHBlbiBpbiBjYXNlIG9mIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nLCB3aGljaCBjYW4gYmUgaWRlbnRpZmllZCBieSB0aGUgcGF0aCBcIiRQYXJhbWV0ZXJcIi5cbiovXG5cblx0XHQvLyBDaGVjayB3aGV0aGVyIHRoZSBmaWx0ZXIgcHJvcGVydHkgd2l0aCBuYXZpZ2F0aW9uIHBhdGggZXhpc3RzLCBvdGhlcndpc2UgdGhlIG1ldGFkYXRhIGFyZSBub3Qgd2VsbCBkZWZpbmVkXG5cdFx0bGV0IG1ldGFEYXRhRXJyb3IgPSBmYWxzZTtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBwYXlsb2FkLnByb3BlcnR5UGF0aC5zcGxpdChcIi9cIikucG9wKCk7XG5cdFx0bGV0IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg7XG5cdFx0bGV0IG5hdmlnYXRpb25Qcm9wZXJ0eTtcblxuXHRcdC8vRm9yIGEgVkggb24gYW4gYWN0aW9uIGRpYWxvZyBwYXJhbWV0ZXIgdGhlIGZvbGxvd2luZyBjb2RlIHdvdWxkIGZpbGwgbmF2aWdhdGlvblByb3BlcnR5UGF0aFxuXHRcdC8vd2l0aCB0aGUgYWN0aW9uIGV2ZW4gdGhvdWdoIG5vIG5hdmlnYXRpb24gcHJvcGVydHkgZXhpc3RzIC0+IGxlYXZlIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggZW1wdHlcblx0XHRpZiAoYmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLmdldFBhdGgoKSAhPT0gXCIkUGFyYW1ldGVyXCIpIHtcblx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPSBwYXlsb2FkLnByb3BlcnR5UGF0aC5yZXBsYWNlKGAvJHtwcm9wZXJ0eU5hbWV9YCwgXCJcIik7XG5cdFx0XHRuYXZpZ2F0aW9uUHJvcGVydHkgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRcdH1cblxuXHRcdGlmIChjb250cm9sLmlzQShcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpICYmIG5hdmlnYXRpb25Qcm9wZXJ0eSAmJiBuYXZpZ2F0aW9uUHJvcGVydHkuJFBhcnRuZXIgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly9DYXNlIG1kYy5NdWx0aVZhbHVlRmllbGQ6IHRoZSAkUGFydG5lciAoYXNzb2NpYXRpb24gdG8gb25lKSBpcyBhIHByZWNvbmRpdGlvbiB0byByZXF1ZXN0IHRoZSBmaWx0ZXIgdmFsdWVcblx0XHRcdC8vRXhjZXB0aW9uOiBXaGVuIHRoZSBNdWx0aVZhbHVlRmllbGQgaXMgYW4gYWN0aW9uIHBhcmFtZXRlciB0aGVuIHRoZSBjb250ZXh0IG9mIHRoZSBhY3Rpb24gaXMgdXNlZCB0byBmaWxsIHRoZSBpbiBwYXJhbWV0ZXIgYW5kXG5cdFx0XHQvL25vICRQYXJ0bmVyIGFzc29jaWF0aW9uIGlzIG5lZWRlZC4gRm9yIHN1Y2ggY2FzZXMgbmF2aWdhdGlvblByb3BlcnR5UGF0aCBpcyBubyBmaWxsZWRcblx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0YFZhbHVlSGVscERlbGVnYXRlOiBCZWNhdXNlIG9mIG1pc3NpbmcgcGFydG5lciBkZWZpbml0aW9uLCB0aGUgZmlsdGVyIHZhbHVlIGZvciBWYWx1ZUxpc3RQYXJhbWV0ZXJJbiBwcm9wZXJ0eSBjYW4gbm90IHJlcXVlc3RlZC5gXG5cdFx0XHQpO1xuXHRcdFx0bWV0YURhdGFFcnJvciA9IHRydWU7XG5cdFx0fSBlbHNlIGlmIChuYXZpZ2F0aW9uUHJvcGVydHkgJiYgbmF2aWdhdGlvblByb3BlcnR5LiRraW5kID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmIG5hdmlnYXRpb25Qcm9wZXJ0eS4kUGFydG5lciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwcm9wZXJ0aWVzVG9SZXF1ZXN0ID0gdGhpcy5fYnVpbGRQcm9wZXJ0aWVzVG9SZXF1ZXN0KHByb3BlcnRpZXNUb1JlcXVlc3QsIHJvb3RQYXRoLCBtZXRhTW9kZWwsIHBheWxvYWQucHJvcGVydHlQYXRoKTtcblx0XHR9XG5cdFx0aWYgKCFtZXRhRGF0YUVycm9yKSB7XG5cdFx0XHQvLyBVcGRhdGVHcm91cElkIGlzICRhdXRvIGlzIHVzZWQgaW4gY2FzZSBvZiBjcmVhdGlvbiByb3cuXG5cdFx0XHQvLyBVcGRhdGVHcm91cElkIGlzIHN1Ym1pdExhdGVyIGluIGNhc2Ugb2YgY3JlYXRlIGRpYWxvZy5cblx0XHRcdC8vIFdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGNhc2Ugb2YgaXNJbmFjdGl2ZSBjb250ZXh0LCB3aGljaCBpcyBub3QgeWV0IGNyZWF0ZWQuXG5cdFx0XHRjb25zdCBjb250ZXh0VW5kZXJDcmVhdGlvbiA9XG5cdFx0XHRcdGJpbmRpbmdDb250ZXh0LmlzVHJhbnNpZW50KCkgPT09IHRydWUgJiZcblx0XHRcdFx0IWJpbmRpbmdDb250ZXh0LmlzSW5hY3RpdmUoKSAmJlxuXHRcdFx0XHRiaW5kaW5nQ29udGV4dC5nZXRVcGRhdGVHcm91cElkKCk/LnN0YXJ0c1dpdGgoXCIkYXV0b1wiKTtcblx0XHRcdGxldCBlcnJvck1lc3NhZ2VzSW5Db250ZXh0ID0gW107XG5cdFx0XHRlcnJvck1lc3NhZ2VzSW5Db250ZXh0ID0gKGJpbmRpbmdDb250ZXh0LmdldE1lc3NhZ2VzKCkgPz8gW10pLmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZS5nZXRUeXBlKCkgPT09IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHRcdFx0fSk7XG5cdFx0XHQvLyBXZSBhd2FpdCBjcmVhdGlvbiBpZiBpdCBpcyBzdGlsbCBpbiBwcm9jZXNzLlxuXHRcdFx0aWYgKGNvbnRleHRVbmRlckNyZWF0aW9uICYmICFlcnJvck1lc3NhZ2VzSW5Db250ZXh0Py5sZW5ndGgpIHtcblx0XHRcdFx0YXdhaXQgYmluZGluZ0NvbnRleHQ/LmNyZWF0ZWQoKTtcblx0XHRcdH1cblx0XHRcdC8vIEFjY29yZGluZyB0byBvZGF0YSB2NCBhcGkgZG9jdW1lbnRhdGlvbiBmb3IgcmVxdWVzdFByb3BlcnR5OiBQcm9wZXJ0eSB2YWx1ZXMgdGhhdCBhcmUgbm90IGNhY2hlZCB5ZXQgYXJlIHJlcXVlc3RlZCBmcm9tIHRoZSBiYWNrIGVuZFxuXHRcdFx0Y29uc3QgdmFsdWVzID0gYXdhaXQgYmluZGluZ0NvbnRleHQucmVxdWVzdFByb3BlcnR5KHByb3BlcnRpZXNUb1JlcXVlc3QpO1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGluUGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBpblBhcmFtZXRlciA9IGluUGFyYW1ldGVyc1tpXTtcblx0XHRcdFx0Y29uc3QgY29uZGl0aW9uID0gdGhpcy5fY3JlYXRlSW5pdGlhbEZpbHRlckNvbmRpdGlvbih2YWx1ZXNbaV0sIGluUGFyYW1ldGVyLmluaXRpYWxWYWx1ZUlzU2lnbmlmaWNhbnQpO1xuXG5cdFx0XHRcdGlmIChjb25kaXRpb24pIHtcblx0XHRcdFx0XHRpbkNvbmRpdGlvbnNbaW5QYXJhbWV0ZXIuaGVscFBhdGhdID0gW2NvbmRpdGlvbl07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0fSxcblxuXHRfYnVpbGRQcm9wZXJ0aWVzVG9SZXF1ZXN0OiBmdW5jdGlvbiAocHJvcGVydGllc1RvUmVxdWVzdDogc3RyaW5nW10sIHJvb3RQYXRoOiBzdHJpbmcsIG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHByb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdFx0Lypcblx0XHRcdFx0VGhlIGluUGFyYW1ldGVycyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIGhlbHAgZGVmaW5pdGlvbiwgaS5lLiB0aGVpciBzb3VyY2UgaXMgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBhbm5vdGF0aW9uIHRhcmdldCAob3IgbW9yZSBwcmVjaXNlbHkgdGhlIEVudGl0eVNldCB0aGUgYW5ub3RhdGlvbiB0YXJnZXQgYmVsb25ncyB0bykuIFRoZSBhbm5vdGF0aW9uIHRhcmdldCBpcyB0aGUgcHJvcGVydHkgdGhlIHZhbHVlIGhlbHAgaXMgZGVmaW5lZCBmb3IuXG5cdFx0XHRcdFRvIHJlcXVlc3QgdGhlIHZhbHVlcyBmb3IgdGhlIGluUGFyYW1ldGVycyBmcm9tIHRoZSBiaW5kaW5nQ29udGV4dCAodGhlIGNvbnRyb2wgaXMgYm91bmQgdG8pLCB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSB0aGlzIHRvIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgYmluZGluZ0NvbnRleHQuIFRoaXMgZGlmZmVycywgaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkIGZvciBhIGRpcmVjdCBwcm9wZXJ0eSwgYnV0IHdpdGggYSBwYXRoIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIChlc3AuIG5lY2Vzc2FyeSB0byBkZWZpbmUgbXVsdGkgdmFsdWUgZmllbGRzKS5cblx0XHRcdFx0VG8gbWFrZSB0aGlzIHRyYW5zbGF0aW9uIHBvc3NpYmxlLCB0aGUgcGF5bG9hZCBwcm92aWRlcyB0aGUgcHJvcGVydHlQYXRoLCB3aGljaCBpcyBhbiBhYnNvbHV0ZSBtZXRhUGF0aCB0byB0aGUgcHJvcGVydHkgKGkuZS4gaW5jbHVkaW5nIHRoZSBjb3JyZXNwb25kaW5nIG1ldGFQYXRoIGZvciB0aGUgYmluZGluZyBjb250ZXh0IGFuZCB0aGUgYWRkaXRpb25hbCBwYXRoIHRoZSBwcm9wZXJ0eSBpcyBib3VuZCB0bykuXG5cblx0XHRcdFx0U28gZmFyLCB0aGlzIG1lYW5zIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIG1ldGFQYXRoIG9mIHRoZSBiaW5kaW5nQ29udGV4dCBmcm9tIHRoZSBsZWZ0IHNpZGUsIGFuZCB0aGUgbGFzdCBzZWdtZW50ICh0aGUgcHJvcGVydHkgaXRzZWxmKSBmcm9tIHRoZSB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgcHJvcGVydHlQYXRoIHByb3ZpZGVkIGluIHRoZSBwYXlsb2FkLCB0byBnZXQgYSBtZXRhUGF0aCBmcm9tIHRoZSBiaW5kaW5nIGNvbnRleHQgdG8gdGhlIGFubm90YXRpb24gdGFyZ2V0LlxuXHRcdFx0XHRJZiB0aGlzIG1ldGFQYXRoIGNvbnRhaW5zIDE6bi1uYXZpZ2F0aW9ucyAod2hpY2ggY2Fubm90IGJlIHRyYW5zbGF0ZWQgYmFjayB0byBhIHBhdGgsIGFzIHRoaXMgd291bGQgbWVhbiB0byBhZGQgY29ycmVzcG9uZGluZyBrZXlzLCB3aGljaCBhcmUgbm90IGtub3duKSwgdGhlIHNvdXJjZSBwYXRoIGluIHRoZSBpblBhcmFtZXRlciBkZWZpbml0aW9uIG9mIHRoZSB2YWx1ZSBuZWVkcyB0byBwb2ludCBiYWNrIHVzaW5nIHRoZSBjb3JyZXNwb25kaW5nIHBhcnRuZXIgbmF2aWdhdGlvbihzKSB0byBhdm9pZCBhbWJpZ3VvdXMgZGVmaW5pdGlvbiBvZiBob3cgdG8gZ2V0IGl0cyB2YWx1ZS5cblx0XHRcdFx0VGh1cywgd2UgY2FuIGFuZCBuZWVkIHRvIG1hdGNoIGFuZCByZWR1Y2UgdGhlIHBhcnRzIG9mIHRoaXMgcmVsYXRpdmUgbWV0YVBhdGggZnJvbSB0aGUgcmlnaHQgc2lkZSBhZ2FpbnN0IHRoZSBjb3JyZXNwb25kaW5nIHBhcnRzIG9mIHRoZSBpblBhcmFtZXRlcnMgc291cmNlIGRlZmluaXRpb24gZnJvbSB0aGUgbGVmdCBzaWRlIGJ5IGNoZWNraW5nIHdoZXRoZXIgdGhleSBhcmUgY29ycmVzcG9uZGluZyBwYXJ0bmVyIG5hdmlnYXRpb25zLiBXaGVuIHdlIGFyZSBkb25lIChubyBtb3JlIHBhcnRzIGluIHJlZHVjZWQgcmVsYXRpdmUgbWV0YVBhdGgsIG5vIG1vcmUgcGFydHMgaW4gcmVkdWNlZCBpblBhcmFtZXRlciBzb3VyY2UgcGF0aCwgb3IgbW9zdCByaWdodCBwYXJ0IGluIHJlZHVjZWQgcmVsYXRpdmUgbWV0YVBhdGggaXMgbm90IHRoZSBwYXJ0bmVyIG9mIG1vc3QgbGVmdCBwYXJ0IGluIHJlZHVjZWQgaW5QYXJhbWV0ZXIgc291cmNlKSwgbmVpdGhlciByZWR1Y2VkIHJlbGF0aXZlIG1ldGFQYXRoIG5vciByZWR1Y2VkIGluUGFyYW1ldGVyIHNvdXJjZSBwYXRoIG1heSBjb250YWluIGFueSAxOm4tbmF2aWdhdGlvbiBwcm9wZXJ0aWVzLlxuXHRcdFx0XHRJZiB0aGlzIGNvbmRpdGlvbiBpcyBmdWxmaWxsZWQsIHdlIGNhbiBjb21iaW5lIHRoZSBhbmQgcmVxdWVzdCBmcm9tIHRoZSBnaXZlbiBiaW5kaW5nIGNvbnRleHQuIElmIG5vdCwgdGhlIHZhbHVlIGhlbHAgZGVmaW5pdGlvbiBkb2VzIG5vdCBhbGxvdyB0byByZXRyaWV2ZSB0aGUgaW5QYXJhbWV0ZXJzIHZhbHVlIGluIGFuIHVuYW1iaWd1b3VzIHdheSwgaS50LiB0aGUgdmFsdWUgaGVscCBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkuXG5cdFx0XHRcdCovXG5cdFx0Ly8gY29tbW9uIGZvciBhbGwgaW5QYXJhbWV0ZXJzXG5cdFx0bGV0IG1ldGFNb2RlbENvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQocm9vdFBhdGgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRcdGNvbnN0IHJlbGF0aXZlUGF0aFBhcnRzID0gcHJvcGVydHlQYXRoXG5cdFx0XHQuc2xpY2Uocm9vdFBhdGgubGVuZ3RoKSAvLyByZW1vdmUgcm9vdCBwYXRoXG5cdFx0XHQuc3BsaXQoXCIvXCIpIC8vIHRyYW5zZm9ybSB0byBhcnJheVxuXHRcdFx0LnNsaWNlKDEsIC0xKSAvLyByZW1vdmUgZmlyc3QgKGVtcHR5LCBhcyByb290UGF0aCBwcm92aWRlZCB3aXRob3V0IGVuZGluZyBcIi9cIiksIGFuZCBsYXN0IChwcm9wZXJ0eSB0aGUgVkggaXMgYXR0YWNoZWQgdG8pIHBhcnRcblx0XHRcdC5tYXAoKHBhcnQpID0+IHtcblx0XHRcdFx0Ly8gZGV0ZXJtaW5lIG5hdmlnYXRpb24gcHJvcGVydHkgbmFtZSBhbmQgY29ycmVzcG9uZGluZyBwYXJ0bmVyIGZvciBlYWNoIG5hdmlnYXRpb24gc3RlcFxuXHRcdFx0XHRtZXRhTW9kZWxDb250ZXh0ID0gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHBhcnQsIG1ldGFNb2RlbENvbnRleHQpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHBhcnQ6IHBhcnQsXG5cdFx0XHRcdFx0cGFydG5lcjogbWV0YU1vZGVsQ29udGV4dC5nZXRPYmplY3QoKS4kUGFydG5lclxuXHRcdFx0XHR9O1xuXHRcdFx0fSk7XG5cdFx0Ly8gYWN0dWFsIHJlZHVjdGlvbiBwZXIgaW5QYXJhbWV0ZXJcblx0XHRyZXR1cm4gcHJvcGVydGllc1RvUmVxdWVzdC5tYXAoKGxvY2FsRGF0YVBhdGgpID0+IHtcblx0XHRcdGNvbnN0IGxvY2FsRGF0YVBhcnRzID0gbG9jYWxEYXRhUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRjb25zdCBtYXRjaENvdW50ID0gbG9jYWxEYXRhUGFydHMuZmluZEluZGV4KFxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0cGFydCxcblx0XHRcdFx0XHRpbmRleCAvLyBmaW5kIGZpcnN0IG5vbi1tYXRjaGluZyBpbmRleFxuXHRcdFx0XHQpID0+IHJlbGF0aXZlUGF0aFBhcnRzWy1pbmRleF0/LnBhcnRuZXIgIT09IHBhcnRcblx0XHRcdCk7IC8vIHJlbGF0aXZlUGF0aFBhcnRzIHRvIG1hdGNoIGZyb20gdGhlIGVuZCAoPT4gXCItaW5kZXhcIikgdG8gbG9jYWxEYXRhUGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nXG5cdFx0XHQvLyBsYXN0IHBhcnQgb2YgbG9jYWxEYXRhIGlzIGEgcHJvcGVydHkgbmFtZSwgdGh1cyBpdCBjYW5ub3QgbWF0Y2guIE90aGVyd2lzZSBtYXRjaENvdW50IGNvdWxkIGJlIC0xIGlmIGV2ZXJ5dGhpbmcgbWF0Y2hlc1xuXHRcdFx0Ly8gKGlmIHdlIHdhbnQgdG8gYWRkaXRpb25hbGx5IHNlY3VyZSBhZ2FpbnN0IHRoaXMgc2l0dWF0aW9uLCB0aGUgbW9zdCBhcHByb3ByaWF0ZSB3b3VsZCBiZSB0byBzZXQgbWF0Y2hDb3VudCA9IGxvY2FsRGF0YVBhcnRzLmxlbmd0aCDigJMgMSlcblx0XHRcdHJldHVybiByZWxhdGl2ZVBhdGhQYXJ0c1xuXHRcdFx0XHQuc2xpY2UoMCwgLW1hdGNoQ291bnQpIC8vIHJlbW92ZSBhbGwgbWF0Y2hlZCBwYXJ0cyAoZnJvbSB0aGUgZW5kKVxuXHRcdFx0XHQubWFwKChwYXJ0KSA9PiBwYXJ0LnBhcnQpXG5cdFx0XHRcdC5jb25jYXQobG9jYWxEYXRhUGFydHMuc2xpY2UobWF0Y2hDb3VudCkpIC8vIHJlbW92ZSB0aGUgbWF0Y2hlZCBwYXJ0cyBmcm9tIGxvY2FsRGF0YSAoZnJvbSB0aGUgYmVnaW5uaW5nKVxuXHRcdFx0XHQuam9pbihcIi9cIik7IC8vIHRyYW5zZmVyIGJhY2sgdG8gc3RyaW5nIChidXQgb25seSBvbmNlIGF0IHRoZSBlbmQgOykgKVxuXHRcdH0pO1xuXHR9LFxuXG5cdF9nZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9uc0Zyb21GaWx0ZXJCYXI6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRpbkNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdE1hcCxcblx0XHRjb250cm9sOiBDb250cm9sLFxuXHRcdGluUGFyYW1ldGVyczogSW5PdXRQYXJhbWV0ZXJbXSxcblx0XHRwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkXG5cdCkge1xuXHRcdGNvbnN0IGZpbHRlckJhciA9IGNvbnRyb2wuZ2V0UGFyZW50KCkgYXMgRmlsdGVyQmFyQmFzZTtcblx0XHRjb25zdCBmaWx0ZXJCYXJQcm9wZXJ0aWVzID0gRmlsdGVyVXRpbHMuZ2V0RmlsdGVyUHJvcGVydHlJbmZvKGZpbHRlckJhciBhcyB1bmtub3duIGFzIElGaWx0ZXJDb250cm9sKTtcblx0XHRjb25zdCBzdGF0ZTogRXh0ZXJuYWxTdGF0ZVR5cGUgPSBhd2FpdCBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKGZpbHRlckJhcik7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gKGZpbHRlckJhci5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGZvciAoY29uc3QgaW5QYXJhbWV0ZXIgb2YgaW5QYXJhbWV0ZXJzKSB7XG5cdFx0XHRjb25zdCBmaWx0ZXJCYXJQcm9wZXJ0eSA9IHRoaXMuX2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGgoXG5cdFx0XHRcdGluUGFyYW1ldGVyLFxuXHRcdFx0XHRwYXlsb2FkLnByb3BlcnR5UGF0aCxcblx0XHRcdFx0bWV0YU1vZGVsLFxuXHRcdFx0XHRmaWx0ZXJCYXJQcm9wZXJ0aWVzXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgc291cmNlRmllbGQgPSBmaWx0ZXJCYXJQcm9wZXJ0eSA/IGZpbHRlckJhclByb3BlcnR5LmNvbmRpdGlvblBhdGggOiBpblBhcmFtZXRlci5zb3VyY2Uuc3BsaXQoXCJjb25kaXRpb25zL1wiKS5wb3AoKTtcblxuXHRcdFx0Y29uc3QgY29uZGl0aW9ucyA9IHRoaXMuX2dldENvbmRpdGlvbnNGcm9tSW5QYXJhbWV0ZXIoc291cmNlRmllbGQgYXMgc3RyaW5nLCBzdGF0ZSk7XG5cdFx0XHRpZiAoY29uZGl0aW9ucykge1xuXHRcdFx0XHRpbkNvbmRpdGlvbnNbaW5QYXJhbWV0ZXIuaGVscFBhdGhdID0gY29uZGl0aW9ucztcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgZmlsdGVyIGNvbmRpdGlvbnMuXG5cdCAqIFJlZ2FyZGluZyBhIG5hdmlnYXRpb24gcGF0aCBpbiB0aGUgSW5PdXQgcGFyYW1ldGVycyBhbmQgZGlzcmVnYXJkaW5nIHByZWZpeGVzIGluIHRoZSBuYXZpZ2F0aW9uIHBhdGggbGlrZSBlLmcuICckZmlsdGVycz4vY29uZGl0aW9ucy8nIG9yICdvd25lcicuXG5cdCAqIEBwYXJhbSBzb3VyY2VGaWVsZCBJblBhcmFtZXRlciBwcm9wZXJ0eSBvZiB0aGUgZmlsdGVyIGZpZWxkIHZhbHVlIGhlbHBcblx0ICogQHBhcmFtIHN0YXRlIFRoZSBleHRlcm5hbCBmaWx0ZXIgc3RhdGVcblx0ICogQHJldHVybnMgVGhlIGZpbHRlciBjb25kaXRpb25zXG5cdCAqIEBzaW5jZSAxLjExNC4wXG5cdCAqL1xuXHRfZ2V0Q29uZGl0aW9uc0Zyb21JblBhcmFtZXRlcjogZnVuY3Rpb24gKHNvdXJjZUZpZWxkOiBzdHJpbmcsIHN0YXRlOiBFeHRlcm5hbFN0YXRlVHlwZSkge1xuXHRcdGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKHN0YXRlLmZpbHRlcikuZmluZCgoa2V5KSA9PiBrZXkgPT09IHNvdXJjZUZpZWxkKTsgLy8gY29uZGl0aW9uIHBhdGggb2YgdGhlIGZpbHRlciBmaWVsZFxuXHRcdHJldHVybiBrZXkgJiYgc3RhdGUuZmlsdGVyW2tleV07XG5cdH0sXG5cblx0X3BhcnRpdGlvbkluUGFyYW1ldGVyczogZnVuY3Rpb24gKGluUGFyYW1ldGVyczogSW5PdXRQYXJhbWV0ZXJbXSkge1xuXHRcdGNvbnN0IGluUGFyYW1ldGVyTWFwOiBSZWNvcmQ8c3RyaW5nLCBJbk91dFBhcmFtZXRlcltdPiA9IHtcblx0XHRcdGNvbnN0YW50OiBbXSxcblx0XHRcdGJpbmRpbmc6IFtdLFxuXHRcdFx0ZmlsdGVyOiBbXVxuXHRcdH07XG5cblx0XHRmb3IgKGNvbnN0IGluUGFyYW1ldGVyIG9mIGluUGFyYW1ldGVycykge1xuXHRcdFx0aWYgKGluUGFyYW1ldGVyLmNvbnN0YW50VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpblBhcmFtZXRlck1hcC5jb25zdGFudC5wdXNoKGluUGFyYW1ldGVyKTtcblx0XHRcdH0gZWxzZSBpZiAoaW5QYXJhbWV0ZXIuc291cmNlLmluZGV4T2YoXCIkZmlsdGVyXCIpID09PSAwKSB7XG5cdFx0XHRcdGluUGFyYW1ldGVyTWFwLmZpbHRlci5wdXNoKGluUGFyYW1ldGVyKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGluUGFyYW1ldGVyTWFwLmJpbmRpbmcucHVzaChpblBhcmFtZXRlcik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBpblBhcmFtZXRlck1hcDtcblx0fSxcblxuXHRfdGFibGVBZnRlclJlbmRlckRlbGVnYXRlOiB7XG5cdFx0b25BZnRlclJlbmRlcmluZzogZnVuY3Rpb24gKGV2ZW50OiBqUXVlcnkuRXZlbnQgJiB7IHNyY0NvbnRyb2w6IENvbnRyb2wgfSkge1xuXHRcdFx0Y29uc3QgdGFibGUgPSBldmVudC5zcmNDb250cm9sLCAvLyBtLlRhYmxlXG5cdFx0XHRcdHRhYmxlQ2VsbHNEb21SZWZzID0gdGFibGUuJCgpLmZpbmQoXCJ0Ym9keSAuc2FwTVRleHRcIiksXG5cdFx0XHRcdG1kY01UYWJsZSA9IHRhYmxlLmdldFBhcmVudCgpIGFzIE1UYWJsZTtcblxuXHRcdFx0aGlnaGxpZ2h0RE9NRWxlbWVudHModGFibGVDZWxsc0RvbVJlZnMsIG1kY01UYWJsZS5nZXRGaWx0ZXJWYWx1ZSgpLCB0cnVlKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIGFuIGluaXRpYWwgY29uZGl0aW9uIGNvbmZpZ3VyYXRpb24gZXZlcnl0aW1lIGEgdmFsdWUgaGVscCBjb250ZW50IGlzIHNob3duLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IFZhbHVlSGVscCBjb250ZW50IHJlcXVlc3RpbmcgY29uZGl0aW9ucyBjb25maWd1cmF0aW9uXG5cdCAqIEBwYXJhbSBjb250cm9sIEluc3RhbmNlIG9mIHRoZSBjYWxsaW5nIGNvbnRyb2xcblx0ICogQHJldHVybnMgUmV0dXJucyBhIG1hcCBvZiBjb25kaXRpb25zIHN1aXRhYmxlIGZvciBhIHNhcC51aS5tZGMuRmlsdGVyQmFyIGNvbnRyb2xcblx0ICogQHNpbmNlIDEuMTAxLjBcblx0ICovXG5cdGdldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zOiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IENvbnRlbnQsIGNvbnRyb2w6IENvbnRyb2wgfCB1bmRlZmluZWQpIHtcblx0XHQvLyBoaWdobGlnaHQgdGV4dCBpbiBWYWx1ZUhlbHAgcG9wb3ZlclxuXHRcdGlmIChjb250ZW50Py5pc0E8TVRhYmxlPihcInNhcC51aS5tZGMudmFsdWVoZWxwLmNvbnRlbnQuTVRhYmxlXCIpKSB7XG5cdFx0XHRjb25zdCBwb3BvdmVyVGFibGUgPSBjb250ZW50LmdldFRhYmxlKCk7XG5cdFx0XHRwb3BvdmVyVGFibGU/LnJlbW92ZUV2ZW50RGVsZWdhdGUodGhpcy5fdGFibGVBZnRlclJlbmRlckRlbGVnYXRlKTtcblx0XHRcdHBvcG92ZXJUYWJsZT8uYWRkRXZlbnREZWxlZ2F0ZSh0aGlzLl90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGUsIHRoaXMpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0Y29uc3QgaW5Db25kaXRpb25zOiBDb25kaXRpb25PYmplY3RNYXAgPSB7fTtcblxuXHRcdGlmICghY29udHJvbCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVmFsdWVIZWxwRGVsZWdhdGU6IENvbnRyb2wgdW5kZWZpbmVkXCIpO1xuXHRcdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0XHR9XG5cblx0XHRjb25zdCBxdWFsaWZpZXIgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdO1xuXHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHF1YWxpZmllcj8udmhQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgPyBWYWx1ZUxpc3RIZWxwZXIuZ2V0SW5QYXJhbWV0ZXJzKHF1YWxpZmllci52aFBhcmFtZXRlcnMpIDogW107XG5cdFx0Y29uc3QgaW5QYXJhbWV0ZXJNYXAgPSB0aGlzLl9wYXJ0aXRpb25JblBhcmFtZXRlcnMoaW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBpc09iamVjdFBhZ2UgPSBjb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRmb3IgKGNvbnN0IGluUGFyYW1ldGVyIG9mIGluUGFyYW1ldGVyTWFwLmNvbnN0YW50KSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb24gPSB0aGlzLl9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uKFxuXHRcdFx0XHRpblBhcmFtZXRlci5jb25zdGFudFZhbHVlLFxuXHRcdFx0XHRpc09iamVjdFBhZ2UgPyBpblBhcmFtZXRlci5pbml0aWFsVmFsdWVJc1NpZ25pZmljYW50IDogZmFsc2UgLy8gbm8gZmlsdGVyIHdpdGggXCJlbXB0eVwiIG9uIExpc3RSZXBvcnRcblx0XHRcdCk7XG5cdFx0XHRpZiAoY29uZGl0aW9uKSB7XG5cdFx0XHRcdGluQ29uZGl0aW9uc1tpblBhcmFtZXRlci5oZWxwUGF0aF0gPSBbY29uZGl0aW9uXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaW5QYXJhbWV0ZXJNYXAuYmluZGluZy5sZW5ndGgpIHtcblx0XHRcdGF3YWl0IHRoaXMuX2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUJpbmRpbmcoaW5Db25kaXRpb25zLCBjb250cm9sLCBpblBhcmFtZXRlck1hcC5iaW5kaW5nLCBwYXlsb2FkKTtcblx0XHR9XG5cblx0XHRpZiAoaW5QYXJhbWV0ZXJNYXAuZmlsdGVyLmxlbmd0aCkge1xuXHRcdFx0YXdhaXQgdGhpcy5fZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tRmlsdGVyQmFyKGluQ29uZGl0aW9ucywgY29udHJvbCwgaW5QYXJhbWV0ZXJNYXAuZmlsdGVyLCBwYXlsb2FkKTtcblx0XHR9XG5cdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0fSxcblxuXHQvKipcblx0ICogUHJvdmlkZXMgdGhlIHBvc3NpYmlsaXR5IHRvIGNvbnZleSBjdXN0b20gZGF0YSBpbiBjb25kaXRpb25zLlxuXHQgKiBUaGlzIGVuYWJsZXMgYW4gYXBwbGljYXRpb24gdG8gZW5oYW5jZSBjb25kaXRpb25zIHdpdGggZGF0YSByZWxldmFudCBmb3IgY29tYmluZWQga2V5IG9yIG91dHBhcmFtZXRlciBzY2VuYXJpb3MuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgVmFsdWVIZWxwIGNvbnRlbnQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIF92YWx1ZXMgRGVzY3JpcHRpb24gcGFpciBmb3IgdGhlIGNvbmRpdGlvbiB3aGljaCBpcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IE9wdGlvbmFsIGFkZGl0aW9uYWwgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPcHRpb25hbGx5IHJldHVybnMgYSBzZXJpYWxpemFibGUgb2JqZWN0IHRvIGJlIHN0b3JlZCBpbiB0aGUgY29uZGl0aW9uIHBheWxvYWQgZmllbGRcblx0ICogQHNpbmNlIDEuMTAxLjBcblx0ICovXG5cdGNyZWF0ZUNvbmRpdGlvblBheWxvYWQ6IGZ1bmN0aW9uIChcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscCxcblx0XHRjb250ZW50OiBDb250ZW50LFxuXHRcdF92YWx1ZXM6IHVua25vd25bXSxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dFxuXHQpOiBDb25kaXRpb25QYXlsb2FkTWFwIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdGNvbnN0IHF1YWxpZmllciA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0sXG5cdFx0XHRlbnRyeTogQ29uZGl0aW9uUGF5bG9hZFR5cGUgPSB7fSxcblx0XHRcdGNvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRNYXAgPSB7fTtcblx0XHRjb25zdCBjb250cm9sID0gY29udGVudC5nZXRDb250cm9sKCk7XG5cdFx0Y29uc3QgaXNNdWx0aVZhbHVlRmllbGQgPSBjb250cm9sPy5pc0EoXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKTtcblxuXHRcdC8qIEVYVEVSTkFMSUQ6IHdlIGFkZCB0aGUgdmFsdWUgb2YgdGhlIEZpbHRlckZpZWxkIHRvIHRoZSBjb25kaXRpb25QYXlsb2FkICovXG5cdFx0aWYgKHBheWxvYWQuZXh0ZXJuYWxJZFBhdGggJiYgcGF5bG9hZC52YWx1ZUhlbHBLZXlQYXRoKSB7XG5cdFx0XHRjb25zdCB2aEtleVByb3BlcnR5ID0gcGF5bG9hZC52YWx1ZUhlbHBLZXlQYXRoO1xuXHRcdFx0Y29uc3QgdmhLZXlWYWx1ZSA9IHF1YWxpZmllci52aEtleXMgJiYgY29udGV4dC5nZXRPYmplY3QocXVhbGlmaWVyLnZoS2V5c1swXSB8fCB2aEtleVByb3BlcnR5KTtcblx0XHRcdGVudHJ5W3BheWxvYWQucHJvcGVydHlQYXRoICsgXCJAJHVpNS5mZS5AQ29tbW9uL0V4dGVybmFsSURcIl0gPSB2aEtleVZhbHVlO1xuXHRcdFx0Y29uZGl0aW9uUGF5bG9hZFtwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0gPSBbZW50cnldO1xuXHRcdH0gZWxzZSBpZiAoIXF1YWxpZmllci52aFByb3BlcnRpZXMgfHwgaXNNdWx0aVZhbHVlRmllbGQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHF1YWxpZmllci52aFByb3BlcnRpZXM/LmZvckVhY2goZnVuY3Rpb24gKHZoS2V5KSB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IGNvbnRleHQuZ2V0T2JqZWN0KHZoS2V5KTtcblx0XHRcdGlmICh2YWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRcdGVudHJ5W3ZoS2V5XSA9IHZhbHVlPy5sZW5ndGggPT09IDAgPyBcIlwiIDogdmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbnRyeVt2aEtleV0gPSBudWxsOyAvLyBudWxsIHZhbHVlIGlzIGFsc28gdmFsaWRcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoZW50cnkpLmxlbmd0aCkge1xuXHRcdFx0LyogdmggcXVhbGlmaWVyIGFzIGtleSBmb3IgcmVsZXZhbnQgY29uZGl0aW9uICovXG5cdFx0XHRjb25kaXRpb25QYXlsb2FkW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXSA9IFtlbnRyeV07XG5cdFx0fVxuXHRcdHJldHVybiBjb25kaXRpb25QYXlsb2FkO1xuXHR9LFxuXG5cdG1vZGlmeVNlbGVjdGlvbkJlaGF2aW91cjogZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBNVGFibGUsIGNoYW5nZTogU2VsZWN0aW9uQ2hhbmdlKTogU2VsZWN0aW9uQ2hhbmdlIHtcblx0XHRjb25zdCBjb25kaXRpb25zID0gY2hhbmdlLmNvbmRpdGlvbnM7XG5cdFx0Y29uc3Qgb2xkQ29uZGl0aW9ucyA9IGNvbnRlbnQuZ2V0Q29uZGl0aW9ucygpO1xuXHRcdC8vIFByZXZlbnQgZGUtc2VsZWN0IGluIGRpYWxvZyBzY2VuYXJpb3Ncblx0XHRpZiAoKGNvbnRlbnQ/LmdldFBhcmVudCgpIGFzIHVua25vd24gYXMgVmFsdWVIZWxwRGlhbG9nKT8uaXNRdWlja1NlbGVjdEFjdGl2ZT8uKCkgJiYgIWNvbmRpdGlvbnMubGVuZ3RoICYmIG9sZENvbmRpdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRjaGFuZ2UuY29uZGl0aW9ucyA9IG9sZENvbmRpdGlvbnM7XG5cdFx0fVxuXHRcdHJldHVybiBjaGFuZ2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIHRoZSBwb3NzaWJpbGl0eSB0byBjdXN0b21pemUgc2VsZWN0aW9ucyBpbiAnU2VsZWN0IGZyb20gbGlzdCcgc2NlbmFyaW9zLlxuXHQgKiBCeSBkZWZhdWx0LCBvbmx5IGNvbmRpdGlvbiBrZXlzIGFyZSBjb25zaWRlcmVkLiBUaGlzIG1heSBiZSBleHRlbmRlZCB3aXRoIHBheWxvYWQgZGVwZW5kZW50IGZpbHRlcnMuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgVmFsdWVIZWxwIGNvbnRlbnQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBvZiB0aGUgc2VsZWN0ZWQgaXRlbVxuXHQgKiBAcGFyYW0gY29uZGl0aW9ucyBDdXJyZW50IGNvbmRpdGlvbnNcblx0ICogQHJldHVybnMgQ29uZGl0aW9ucyBvciBbXVxuXHQgKi9cblx0ZmluZENvbmRpdGlvbnNGb3JDb250ZXh0OiBmdW5jdGlvbiAoXG5cdFx0dmFsdWVIZWxwOiBWYWx1ZUhlbHAsXG5cdFx0Y29udGVudDogRmlsdGVyYWJsZUxpc3RDb250ZW50LFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdGNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdFtdXG5cdCkge1xuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0LyogRG8gbm90IGNvbnNpZGVyIFwiTm90VmFsaWRhdGVkXCIgY29uZGl0aW9ucyAqL1xuXHRcdGNvbmRpdGlvbnMgPSBjb25kaXRpb25zLmZpbHRlcigoY29uZGl0aW9uKSA9PiBjb25kaXRpb24udmFsaWRhdGVkID09PSBDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkKTtcblxuXHRcdGNvbnN0IHZoS2V5cyA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0/LnZoS2V5cyB8fCBbXTtcblx0XHRjb25zdCBrZXlQYXRoID0gY29udGVudC5nZXRLZXlQYXRoKCk7XG5cdFx0Y29uc3QgdmFsdWVIZWxwUXVhbGlmaWVyID0gcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXIgfHwgXCJcIjtcblx0XHRjb25zdCBmaW5kQ29uZGl0aW9uID0gKGNvbmRpdGlvblBheWxvYWRNYXA6IENvbmRpdGlvblBheWxvYWRNYXAsIHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCk6IGJvb2xlYW4gPT4ge1xuXHRcdFx0Y29uc3QgY29uZGl0aW9uU2VsZWN0ZWRSb3cgPSBjb25kaXRpb25QYXlsb2FkTWFwPy5bdmFsdWVIZWxwUXVhbGlmaWVyXT8uWzBdIHx8IHt9O1xuXHRcdFx0aWYgKHZoS2V5cy5sZW5ndGggPT09IDEgfHwgcGF5bG9hZD8udXNlTXVsdGlWYWx1ZUZpZWxkIHx8ICFjb25kaXRpb25QYXlsb2FkTWFwKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0Py5nZXRPYmplY3Qoa2V5UGF0aCkgPT09IHZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dEtleXMgPSBPYmplY3Qua2V5cyhjb250ZXh0LmdldE9iamVjdCgpKTtcblx0XHRcdFx0cmV0dXJuIHZoS2V5cy5ldmVyeShmdW5jdGlvbiAodmhLZXkpIHtcblx0XHRcdFx0XHRyZXR1cm4gIWNvbnRleHRLZXlzLmluY2x1ZGVzKHZoS2V5KSB8fCBjb250ZXh0Py5nZXRPYmplY3QodmhLZXkpID09PSBjb25kaXRpb25TZWxlY3RlZFJvd1t2aEtleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29uc3Qgc2VsZWN0ZWRDb25kaXRpb24gPSBjb25kaXRpb25zLmZpbmQoZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuXHRcdFx0Y29uc3QgY29uZGl0aW9uUGF5bG9hZE1hcCA9IGNvbmRpdGlvbi5wYXlsb2FkIGFzIENvbmRpdGlvblBheWxvYWRNYXA7XG5cdFx0XHRpZiAoY29udGV4dD8uZ2V0T2JqZWN0KGtleVBhdGgpID09PSBjb25kaXRpb25QYXlsb2FkTWFwPy5bdmFsdWVIZWxwUXVhbGlmaWVyXT8uWzBdPy5ba2V5UGF0aF0pIHtcblx0XHRcdFx0cmV0dXJuIGZpbmRDb25kaXRpb24oY29uZGl0aW9uUGF5bG9hZE1hcCwgY29uZGl0aW9uUGF5bG9hZE1hcD8uW3ZhbHVlSGVscFF1YWxpZmllcl0/LlswXT8uW2tleVBhdGhdKTtcblx0XHRcdH0gZWxzZSBpZiAoY29udGV4dD8uZ2V0T2JqZWN0KGtleVBhdGgpID09PSBjb25kaXRpb24/LnZhbHVlc1swXSkge1xuXHRcdFx0XHRyZXR1cm4gZmluZENvbmRpdGlvbihjb25kaXRpb25QYXlsb2FkTWFwLCBjb25kaXRpb24/LnZhbHVlc1swXSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gc2VsZWN0ZWRDb25kaXRpb24gPyBbc2VsZWN0ZWRDb25kaXRpb25dIDogW107XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgY29udGV4dHMgZm9yIGFkZGl0aW9uYWwgdmFsdWVzIGFuZCByZXN1bWVzIHRoZSBsaXN0IGJpbmRpbmcuXG5cdCAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgZm9yIGRlbGVnYXRlXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICogQHBhcmFtIGFkZGl0aW9uYWxWYWx1ZXMgQXJyYXkgb2YgQWRkaXRpb25hbFZhbHVlc1xuXHQgKiBAcGFyYW0gdmFsdWVMaXN0UHJvcGVydHkgVmFsdWVMaXN0UHJvcGVydHkgb2YgdGhlIHBheWxvYWRcblx0ICogQHBhcmFtIGZpZWxkIENvbnRyb2wgY29ubmVjdGVkIHRvIHZhbHVlIGhlbHBcblx0ICogQHBhcmFtIHNvcnRlcnMgU29ydGVycyBvZiB0aGUgdmFsdWUgaGVscCBsaXN0IGJpbmRpbmdcblx0ICovXG5cdF91cGRhdGVCaW5kaW5nV2l0aFRyYW5zaWVudENvbnRleHRzOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0cGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRiaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8sXG5cdFx0YWRkaXRpb25hbFZhbHVlczogQWRkaXRpb25hbFZhbHVlVHlwZVtdLFxuXHRcdHZhbHVlTGlzdFByb3BlcnR5OiBzdHJpbmcsXG5cdFx0ZmllbGQ6IEZpbHRlckZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkIHwgRmllbGQsXG5cdFx0c29ydGVyczogU29ydGVyVHlwZVtdLFxuXHRcdHRhYmxlOiBUYWJsZVxuXHQpIHtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5fdXBkYXRlQmluZGluZ0F0dHJpYnV0ZXMobGlzdEJpbmRpbmcsIGJpbmRpbmdJbmZvLCBzb3J0ZXJzKTtcblxuXHRcdFx0Y29uc3QgeyByZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLCByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSwgb3RoZXJzVmFsdWVzQ29udGV4dERhdGEgfSA9XG5cdFx0XHRcdGF3YWl0IHRoaXMuX2dldFJlbGV2YW50QWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGEoXG5cdFx0XHRcdFx0YWRkaXRpb25hbFZhbHVlcyxcblx0XHRcdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdFx0XHRiaW5kaW5nSW5mbyxcblx0XHRcdFx0XHRwYXlsb2FkLFxuXHRcdFx0XHRcdHZhbHVlTGlzdFByb3BlcnR5LFxuXHRcdFx0XHRcdGZpZWxkLFxuXHRcdFx0XHRcdHNvcnRlcnMsXG5cdFx0XHRcdFx0dGFibGVcblx0XHRcdFx0KTtcblxuXHRcdFx0Ly8gbm8gZ3JvdXBpbmcgc2hvdWxkIGJlIHNob3duIGluIHRoZSBzdWdnZXN0aW9uIGxpc3QgaWYgdGhlIHNlYXJjaCByZXN1bHQgb25seSBjb250YWlucyB2YWx1ZXMgZnJvbSB0aGUgJ090aGVycycgZ3JvdXBcblx0XHRcdGlmIChyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLmxlbmd0aCA9PT0gMCAmJiByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0bGlzdEJpbmRpbmcuc29ydCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocGF5bG9hZD8uaGlzdG9yeT8uZW5hYmxlZCkge1xuXHRcdFx0XHRwYXlsb2FkLmhpc3RvcnkuaGFzUmVsZXZhbnREYXRhID0gcmVjZW50VmFsdWVzQ29udGV4dERhdGEubGVuZ3RoICE9PSAwO1xuXHRcdFx0fVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gTm93IHdlIG1ha2Ugc3VyZSB0byByZXNldCB0aGUgbGlzdGJpbmRpbmcsIGJlZm9yZSB0aGUgdHJhbnNpZW50IGNvbnRleHRzIGFyZSBjcmVhdGVkXG5cdFx0XHRcdGF3YWl0IGxpc3RCaW5kaW5nLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmRlYnVnKGBFcnJvciB3aGlsZSBjbGVhcmluZyB0aGUgbGlzdCBiaW5kaW5nOiAke2Vycm9yfWApO1xuXHRcdFx0fVxuXHRcdFx0Ly8gYWRkIHRyYW5zaWVudCBjb250ZXh0IHRvIGxpc3QgYmluZGluZyBhZnRlciBiYWNrZW5kIHF1ZXJ5IGlzIGRvbmVcblx0XHRcdGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5jcmVhdGVUcmFuc2llbnRDb250ZXh0c0ZvckFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhKFxuXHRcdFx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRcdGxpc3RCaW5kaW5nXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvL0RvIG5vdGhpbmcgYXMgd2Uga25vdyB0aGF0IHJlc2V0IGNoYW5nZXMgd291bGQgdGhyb3cgYW4gZXJyb3IgaW4gY29uc29sZSBhbmQgdGhpcyB3aWxsIHBpbGUgdXAgYSBsb3Qgb2YgY29uc29sZSBlcnJvcnNcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gY2hhbmdlIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSB2YWx1ZSBoZWxwLCBzdWNoIGFzIHNvcnQsIGZpbHRlciwgcGFyYW1ldGVycyBldGMuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICogQHBhcmFtIHNvcnRlcnMgU29ydGVycyBvZiB0aGUgdmFsdWUgaGVscCBsaXN0IGJpbmRpbmdcblx0ICovXG5cdF91cGRhdGVCaW5kaW5nQXR0cmlidXRlczogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGJpbmRpbmdJbmZvOiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mbyxcblx0XHRzb3J0ZXJzOiBTb3J0ZXJUeXBlW11cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgcm9vdEJpbmRpbmcgPSBsaXN0QmluZGluZy5nZXRSb290QmluZGluZygpIHx8IGxpc3RCaW5kaW5nO1xuXHRcdGlmICghcm9vdEJpbmRpbmcuaXNTdXNwZW5kZWQoKSkge1xuXHRcdFx0cm9vdEJpbmRpbmcuc3VzcGVuZCgpO1xuXHRcdH1cblx0XHQvL3NvcnQgYW5kIGZpbHRlciB2YWx1ZSBoZWxwIGJpbmRpbmcgdG8gbWFrZSBzdXJlIHdlIHJlbmRlciBvdGhlcnMgZ3JvdXBcblx0XHRhZGRpdGlvbmFsVmFsdWVIZWxwZXIuc29ydEFuZEZpbHRlckxpc3RCaW5kaW5nKGxpc3RCaW5kaW5nLCBzb3J0ZXJzKTtcblx0XHRpZiAoYmluZGluZ0luZm8ucGFyYW1ldGVycykge1xuXHRcdFx0bGlzdEJpbmRpbmcuY2hhbmdlUGFyYW1ldGVycyhiaW5kaW5nSW5mby5wYXJhbWV0ZXJzKTtcblx0XHR9XG5cdFx0Ly9yZXN1bWUgdGhlIGxpc3QgYmluZGluZyBhbmQgdGhlbiByZXNldCB0aGUgY2hhbmdlc1xuXHRcdGF3YWl0IGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5yZXN1bWVWYWx1ZUxpc3RCaW5kaW5nQW5kUmVzZXRDaGFuZ2VzKGxpc3RCaW5kaW5nKTtcblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB1c2VkIHRvIGRldGVybWluZSB0aGUgZmluYWwgbGlzdCBvZiBhbGwgdHlwZXMgb2YgYWRkaXRpb25hbCB2YWx1ZSBjb250ZXh0IGRhdGEgKHJlY29tbWVuZGF0aW9uLCByZWNlbnRseSB1c2VkIGFuZCBvdGhlcnMpIHRvIGJlIHVzZWQuXG5cdCAqIEBwYXJhbSBhZGRpdGlvbmFsVmFsdWVzIEFycmF5IG9mIEFkZGl0aW9uYWxWYWx1ZXNcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcGFyYW0gdmFsdWVMaXN0UHJvcGVydHkgVmFsdWVMaXN0UHJvcGVydHkgb2YgdGhlIHBheWxvYWRcblx0ICogQHBhcmFtIGZpZWxkIENvbnRyb2wgY29ubmVjdGVkIHRvIHZhbHVlIGhlbHBcblx0ICogQHBhcmFtIHNvcnRlcnMgU29ydGVycyBvZiB0aGUgdmFsdWUgaGVscCBsaXN0IGJpbmRpbmdcblx0ICogQHJldHVybnMgT2JqZWN0IHdoaWNoIGNvbnRhaW5zIHJlY29tbWVuZGF0aW9ucywgcmVjZW50bHkgdXNlZCwgYW5kIG90aGVycyBjb250ZXh0IGRhdGEuXG5cdCAqL1xuXHRfZ2V0UmVsZXZhbnRBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YTogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGFkZGl0aW9uYWxWYWx1ZXM6IEFkZGl0aW9uYWxWYWx1ZVR5cGVbXSxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRiaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8sXG5cdFx0cGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCxcblx0XHR2YWx1ZUxpc3RQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdGZpZWxkOiBGaWx0ZXJGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCB8IEZpZWxkLFxuXHRcdHNvcnRlcnM6IFNvcnRlclR5cGVbXSxcblx0XHR0YWJsZTogVGFibGVcblx0KTogUHJvbWlzZTx7XG5cdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdO1xuXHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW107XG5cdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXTtcblx0fT4ge1xuXHRcdGxldCB7IHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEsIG90aGVyc1ZhbHVlc0NvbnRleHREYXRhIH0gPSBhd2FpdCBhZGRpdGlvbmFsVmFsdWVIZWxwZXIucmVxdWVzdEZvckFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhKFxuXHRcdFx0YWRkaXRpb25hbFZhbHVlcyxcblx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0YmluZGluZ0luZm8sXG5cdFx0XHRwYXlsb2FkLFxuXHRcdFx0c29ydGVycyxcblx0XHRcdHRhYmxlXG5cdFx0KTtcblxuXHRcdC8vIGFwcGx5IHNlYXJjaCBhbmQgZmlsdGVycyB0byBhZGRpdGlvbmFsIHZhbHVlcyBjb250ZXh0IGRhdGFcblx0XHRjb25zdCB2YWx1ZUhlbHBLZXlzID0gcGF5bG9hZC5xdWFsaWZpZXJzW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXS52aEtleXMgfHwgW107XG5cdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSA9IGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5nZXRSZWxldmFudFJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEoXG5cdFx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0YWRkaXRpb25hbFZhbHVlc1swXT8udmFsdWVzLFxuXHRcdFx0dmFsdWVMaXN0UHJvcGVydHlcblx0XHQpO1xuXG5cdFx0bGV0IHJlY2VudFZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10gPSBbXTtcblx0XHRpZiAoIXBheWxvYWQuaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMpIHtcblx0XHRcdC8vIG5vIGhpc3RvcnkgZm9yIHZhbHVlcyBsaXN0cyB3aXRoIGZpeGVkIHZhbHVlcyAodGhleSBhcmUgdXN1YWxseSBzaG9ydClcblx0XHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhID0gYXdhaXQgdGhpcy5fZ2V0SGlzdG9yeURhdGEocGF5bG9hZCwgZmllbGQpO1xuXHRcdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGEgPSBhZGRpdGlvbmFsVmFsdWVIZWxwZXIuZ2V0UmVsZXZhbnRSZWNlbnRWYWx1ZXNDb250ZXh0RGF0YShcblx0XHRcdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0XHR2YWx1ZUhlbHBLZXlzLFxuXHRcdFx0XHQoYmluZGluZ0luZm8ucGFyYW1ldGVycyBhcyBCaW5kaW5nSW5mb1BhcmFtZXRlcnMpLiRzZWFyY2g/LnJlcGxhY2VBbGwoJ1wiJywgXCJcIiksXG5cdFx0XHRcdGJpbmRpbmdJbmZvXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhID0gYWRkaXRpb25hbFZhbHVlSGVscGVyLmdldFJlbGV2YW50T3RoZXJzVmFsdWVzQ29udGV4dERhdGEoXG5cdFx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdHZhbHVlSGVscEtleXNcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhXG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGEgZmlsdGVyIGluIGEgPGNvZGU+TGlzdEJpbmRpbmc8L2NvZGU+IGFuZCByZXN1bWVzIGl0LCBpZiBzdXNwZW5kZWQuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICovXG5cdF91cGRhdGVCaW5kaW5nOiBmdW5jdGlvbiAobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIGJpbmRpbmdJbmZvOiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mbykge1xuXHRcdGNvbnN0IHJvb3RCaW5kaW5nID0gbGlzdEJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKSB8fCBsaXN0QmluZGluZztcblx0XHRpZiAoIXJvb3RCaW5kaW5nLmlzU3VzcGVuZGVkKCkpIHtcblx0XHRcdHJvb3RCaW5kaW5nLnN1c3BlbmQoKTtcblx0XHR9XG5cdFx0aWYgKGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMpIHtcblx0XHRcdGxpc3RCaW5kaW5nLmNoYW5nZVBhcmFtZXRlcnMoYmluZGluZ0luZm8ucGFyYW1ldGVycyk7XG5cdFx0fVxuXHRcdGxpc3RCaW5kaW5nLmZpbHRlcihiaW5kaW5nSW5mby5maWx0ZXJzLCBGaWx0ZXJUeXBlLkFwcGxpY2F0aW9uKTtcblx0XHRsaXN0QmluZGluZy5zb3J0KGJpbmRpbmdJbmZvLnNvcnRlcik7XG5cblx0XHRpZiAocm9vdEJpbmRpbmcuaXNTdXNwZW5kZWQoKSkge1xuXHRcdFx0cm9vdEJpbmRpbmcucmVzdW1lKCk7XG5cdFx0XHRyb290QmluZGluZy5yZXNldENoYW5nZXMoKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFuIGJvb2xlYW4gdmFsdWUgaWYgYWRkaXRpb25hbHZhbHVlcyBleGlzdHMgd2hpY2ggd2lsbCBjb250YWluIGRpZmZlcmVudCBncm91cHMgbGlrZSByZWNvbW1lbmRhdGlvbnMuXG5cdCAqIEBwYXJhbSBjb250ZW50IEZpbHRlcmFibGUgTGlzdCBDb250ZW50XG5cdCAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgZm9yIGRlbGVnYXRlXG5cdCAqIEBwYXJhbSBjaGVja1JlY29tbWVuZGF0aW9ucyBEZWZpbmVzIGlmIHdlIHNoYWxsIGNoZWNrIGZvciByZWNvbW1lbmRhdGlvbnNcblx0ICogQHJldHVybnMgQm9vbGVhbiB2YWx1ZVxuXHQgKi9cblx0X2NoZWNrSWZBZGRpdGlvbmFsVmFsdWVzRXhpc3RzOiBhc3luYyBmdW5jdGlvbiAoY29udGVudDogTVRhYmxlLCBwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLCBjaGVja1JlY29tbWVuZGF0aW9ucyA9IHRydWUpIHtcblx0XHQvLyBGb3IgZGVmaW5lIGNvbmRpdGlvbnMgdmFsdWVoZWxwIHJlY29tbWVuZGF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBiZWNhdXNlIFwiaW50ZXJuYWxcIiBtb2RlbCBpcyBub3QgYXZhaWxhYmxlLlxuXHRcdGlmIChwYXlsb2FkLmlzRGVmaW5lQ29uZGl0aW9uVmFsdWVIZWxwKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVjb21tZW5kYXRpb25WYWx1ZXMgPSBjaGVja1JlY29tbWVuZGF0aW9ucyA/IHRoaXMuZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMoY29udGVudCwgcGF5bG9hZCkgOiBbXTtcblx0XHRpZiAocmVjb21tZW5kYXRpb25WYWx1ZXM/Lmxlbmd0aCA+IDApIHtcblx0XHRcdC8vaWYgdGhlcmUgYXJlIHJlbGV2YW50IHJlY29tbWVuZGF0aW9ucyB0aGVuIHJldHVybiB0cnVlXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAocGF5bG9hZC5oaXN0b3J5Py5lbmFibGVkKSB7XG5cdFx0XHQvLyBub3cgY2hlY2sgZm9yIHJlY2VudCB2YWx1ZXNcblx0XHRcdGlmIChwYXlsb2FkLmhpc3RvcnkuaGFzUmVsZXZhbnREYXRhICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIHBheWxvYWQuaGlzdG9yeS5oYXNSZWxldmFudERhdGE7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCByZWNlbnRWYWx1ZXMgPSBhd2FpdCB0aGlzLl9nZXRIaXN0b3J5RGF0YShwYXlsb2FkLCBjb250ZW50LmdldENvbnRyb2woKSk7XG5cdFx0XHRpZiAocmVjZW50VmFsdWVzLmxlbmd0aCkge1xuXHRcdFx0XHQvL2lmIHRoZXJlIGFyZSByZWNlbnRseSBlbnRlcmVkIHZhbHVlcyByZXR1cm4gdHJ1ZVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSByZWxldmFudCByZWNvbW1lbmRhdGlvbnMuXG5cdCAqIEBwYXJhbSBjb250ZW50IEZpbHRlcmFibGUgTGlzdCBDb250ZW50XG5cdCAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgZm9yIGRlbGVnYXRlXG5cdCAqIEByZXR1cm5zIFJlbGV2YW50IHJlY29tbWVuZGF0aW9uc1xuXHQgKi9cblx0Z2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMoY29udGVudDogTVRhYmxlLCBwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG5cdFx0bGV0IHZhbHVlczogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdO1xuXHRcdGNvbnN0IGlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQgPVxuXHRcdFx0Y29udGVudC5nZXRDb250cm9sKCkuaXNBKFwic2FwLnVpLm1kYy5GaWx0ZXJGaWVsZFwiKSB8fCBjb250ZW50LmdldENvbnRyb2woKS5pc0EoXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKTtcblxuXHRcdGlmICghaXNGaWx0ZXJGaWVsZE9yTXVsdGlWYWx1ZWRGaWVsZCkge1xuXHRcdFx0Y29uc3QgY29udGVudE1vZGVsID0gY29udGVudC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwgJiB7IGdldExvY2FsQW5ub3RhdGlvbk1vZGVsOiBGdW5jdGlvbiB9O1xuXHRcdFx0Y29uc3QgbG9jYWxBbm5vdGF0aW9uTW9kZWwgPSBjb250ZW50TW9kZWwuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwgJiYgY29udGVudE1vZGVsLmdldExvY2FsQW5ub3RhdGlvbk1vZGVsKCk7XG5cdFx0XHRpZiAobG9jYWxBbm5vdGF0aW9uTW9kZWwpIHtcblx0XHRcdFx0Y29uc3QgYmluZGluZ0NvbnRleHRQYXRoID0gY29udGVudC5nZXRDb250cm9sKCkuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpO1xuXHRcdFx0XHRjb25zdCBmaWVsZFBhdGggPSBjb250ZW50LmdldENvbnRyb2woKS5nZXRCaW5kaW5nKFwidmFsdWVcIik/LmdldFBhdGgoKTtcblx0XHRcdFx0dmFsdWVzID0gbG9jYWxBbm5vdGF0aW9uTW9kZWwuZ2V0T2JqZWN0KGAke2JpbmRpbmdDb250ZXh0UGF0aH0vJHtmaWVsZFBhdGh9QCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnR5cGVBaGVhZFZhbHVlc2ApID8/IFtdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCF2YWx1ZXMubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IGlucHV0VmFsdWVzID0gKGNvbnRlbnQuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWwpLmdldFByb3BlcnR5KFwiL3JlY29tbWVuZGF0aW9uc0RhdGFcIikgfHwge307XG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdDb250ZXh0ID0gY29udGVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0XHR2YWx1ZXMgPVxuXHRcdFx0XHRcdGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5nZXRSZWxldmFudFJlY29tbWVuZGF0aW9ucyhcblx0XHRcdFx0XHRcdGlucHV0VmFsdWVzLFxuXHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHQsXG5cdFx0XHRcdFx0XHRwYXlsb2FkLnByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdGNvbnRlbnQuZ2V0Q29udHJvbCgpLmdldEJpbmRpbmcoXCJ2YWx1ZVwiKT8uZ2V0UGF0aCgpXG5cdFx0XHRcdFx0KSB8fCBbXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHZhbHVlcztcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgd2hpY2ggd2lsbCB0ZWxsIHdoZXRoZXIgdHlwZWFoZWFkIHNob3VsZCBiZSBvcGVuZWQgb3Igbm90LlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IEZpbHRlcmFibGUgTGlzdCBDb250ZW50XG5cdCAqIEByZXR1cm5zIEJvb2xlYW4gdmFsdWUgd2hldGhlciB0byBzaG93IHR5cGVhaGVhZCBvciBub3Rcblx0ICovXG5cdHR5cGVBaGVhZEZvckZpbHRlcmFibGVDb250ZW50OiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IE1EQ1BvcG92ZXIpIHtcblx0XHRsZXQgc2hvd0l0ID0gdHJ1ZTtcblx0XHRjb25zdCB0eXBlQWhlYWRDb250ZW50ID0gY29udGVudD8uZ2V0Q29udGVudCgpWzBdIGFzIE1UYWJsZTtcblx0XHRjb25zdCBmaWx0ZXJWYWx1ZSA9IHZhbHVlSGVscD8uZ2V0RmlsdGVyVmFsdWUoKTtcblx0XHRjb25zdCBmaWVsZCA9IHR5cGVBaGVhZENvbnRlbnQuZ2V0Q29udHJvbCgpIGFzIEZpbHRlckZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkIHwgRmllbGQ7XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblxuXHRcdGlmIChmaWVsZC5pc0E8RmlsdGVyRmllbGQ+KFwic2FwLnVpLm1kYy5GaWx0ZXJGaWVsZFwiKSB8fCBmaWVsZC5pc0E8TXVsdGlWYWx1ZUZpZWxkPihcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpKSB7XG5cdFx0XHRpZiAoIWZpbHRlclZhbHVlKSB7XG5cdFx0XHRcdC8vIGFjY29yZGluZyB0byB0aGUgY3VycmVudCByZWNvbW1lbmRhdGlvbiBVWCB3ZSBkb24ndCBjaGVjayBmb3IgcmVjb21tZW5kYXRpb25zIGJ1dCByZWNlbnRseSBlbnRlcmVkIHZhbHVlcyBvbmx5XG5cdFx0XHRcdHNob3dJdCA9IGF3YWl0IHRoaXMuX2NoZWNrSWZBZGRpdGlvbmFsVmFsdWVzRXhpc3RzKHR5cGVBaGVhZENvbnRlbnQsIHBheWxvYWQsIGZhbHNlKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgZmllbGRWYWx1ZSA9IGZpZWxkLmdldFZhbHVlKCk7XG5cdFx0XHRjb25zdCBmaWVsZFRleHRWYWx1ZSA9IGZpZWxkLmdldEFkZGl0aW9uYWxWYWx1ZSgpO1xuXHRcdFx0aWYgKGZpZWxkVmFsdWUgfHwgZmllbGRUZXh0VmFsdWUpIHtcblx0XHRcdFx0Ly8gdmFsdWVoZWxwIGhhZCBzb21lIHZhbHVlLCBidXQgdXNlciBjbGVhcmVkIHRoZSB2YWx1ZVxuXHRcdFx0XHQvLyBpbiBzdWNoIGNhc2Ugd2UgZ2V0IGlucHV0IHZhbHVlIGFzICcnIGFuZCB3ZSB3aWxsIHJldHVybiBmYWxzZVxuXHRcdFx0XHQvL05vdGU6IEluIFNEcyB1c2VjYXNlIHdlIHdhbnRlZCB0byBvcGVuIHRoZSB0eXBlQWhlYWQgaWYgdGhlcmUgYXJlIHJlY29tbWVuZGF0aW9ucyBhbmQgdmFsdWUgaXMgYmxhbmssIHRoZXkgc2hvdWxkIHBhc3MgdXMgYSBmbGFnIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSB0aGlzIGFjY29yZGluZ2x5XG5cdFx0XHRcdGNvbnN0IGlzRGlnaXRTZXF1ZW5jZSA9XG5cdFx0XHRcdFx0KGZpZWxkLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCkuZ2V0T2JqZWN0KGAke3BheWxvYWQucHJvcGVydHlQYXRofSR7QW5ub3RhdGlvbklzRGlnaXRTZXF1ZW5jZX1gKSA/P1xuXHRcdFx0XHRcdGZhbHNlO1xuXHRcdFx0XHRpZiAoZmllbGQuaGFzUGVuZGluZ1VzZXJJbnB1dCgpIHx8IHRoaXMuX2lzRW1wdHlEaWdpdFNlcXVlbmNlKGZpZWxkVmFsdWUsIGlzRGlnaXRTZXF1ZW5jZSkpIHtcblx0XHRcdFx0XHRzaG93SXQgPSBmaWx0ZXJWYWx1ZSAhPT0gXCJcIiB8fCAoYXdhaXQgdGhpcy5fY2hlY2tJZkFkZGl0aW9uYWxWYWx1ZXNFeGlzdHModHlwZUFoZWFkQ29udGVudCwgcGF5bG9hZCkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGNoZWNrIHJlY2VudGx5IHVzZWQgb25seVxuXHRcdFx0XHRcdHNob3dJdCA9IGF3YWl0IHRoaXMuX2NoZWNrSWZBZGRpdGlvbmFsVmFsdWVzRXhpc3RzKHR5cGVBaGVhZENvbnRlbnQsIHBheWxvYWQsIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICghZmlsdGVyVmFsdWUpIHtcblx0XHRcdFx0c2hvd0l0ID0gYXdhaXQgdGhpcy5fY2hlY2tJZkFkZGl0aW9uYWxWYWx1ZXNFeGlzdHModHlwZUFoZWFkQ29udGVudCwgcGF5bG9hZCk7XG5cdFx0XHRcdC8vIGVsc2U6IHRoZSB1c2VyIHR5cGVzLCB3ZSBzaGFsbCBhbHdheXMgc2hvdyB0aGUgb3RoZXIgdmFsdWVzXG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBzaG93SXQ7XG5cdH0sXG5cblx0Y29uZGl0aW9uRm9yUmVxdWVzdFNob3dDb250YWluZXI6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogTURDUG9wb3Zlcikge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBwYXJlbnRDb250cm9sID0gdmFsdWVIZWxwLmdldENvbnRyb2woKTtcblx0XHRcdGlmIChwYXJlbnRDb250cm9sICYmIHBhcmVudENvbnRyb2w/LmlzQTxGaWx0ZXJGaWVsZD4oXCJzYXAudWkubWRjLkZpbHRlckZpZWxkXCIpKSB7XG5cdFx0XHRcdGNvbnN0IGZpZWxkSWQgPSBwYXJlbnRDb250cm9sLmdldENvbnRlbnQoKT8uZ2V0SWQoKTtcblx0XHRcdFx0Y29uc3QgaXNWaXN1YWxGaWx0ZXIgPSBmaWVsZElkID8gZmllbGRJZC5pbmNsdWRlcyhcIlZpc3VhbEZpbHRlclwiKSA6IGZhbHNlO1xuXHRcdFx0XHQvL1Zpc3VhbCBGaWx0ZXIgY29udGFpbmluZyB2YWx1ZUhlbHAgc2hvdWxkIG5vdCBvcGVuIG9uIGZvY3VzIGZvciByZWNlbnRseSBzZWxlY3RlZCB2YWx1ZXMgbyByIHJlY29tbWVuZGF0aW9uc1xuXHRcdFx0XHRpZiAoaXNWaXN1YWxGaWx0ZXIpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgdmFsdWVIZWxwVGFibGUgPSBjb250ZW50Py5nZXRDb250ZW50KClbMF0gYXMgTVRhYmxlO1xuXHRcdFx0bGV0IGNvbnRyb2w6IFVJNUVsZW1lbnQgfCBEaWFsb2cgfCB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBnZXRQYXJlbnREaWFsb2cgPSBmdW5jdGlvbiAoaW5uZXJDb250ZW50OiBVSTVFbGVtZW50KTogRGlhbG9nIHwgdW5kZWZpbmVkIHtcblx0XHRcdFx0Y29udHJvbCA9IGlubmVyQ29udGVudD8uZ2V0UGFyZW50KCkgYXMgVUk1RWxlbWVudDtcblx0XHRcdFx0aWYgKGNvbnRyb2wgJiYgY29udHJvbC5pc0E8RGlhbG9nPihcInNhcC5tLkRpYWxvZ1wiKSkge1xuXHRcdFx0XHRcdHJldHVybiBjb250cm9sO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wgPT09IHVuZGVmaW5lZCB8fCBjb250cm9sID09PSBudWxsKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZ2V0UGFyZW50RGlhbG9nKGNvbnRyb2wpO1xuXHRcdFx0fTtcblx0XHRcdGNvbnRyb2wgPSBnZXRQYXJlbnREaWFsb2coY29udGVudCk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGNvbnRyb2wgJiZcblx0XHRcdFx0Y29udHJvbC5kYXRhKFwiZmVfSW5pdGlhbFR5cGVBaGVhZEZvY3VzRG9uZVwiKSA9PT0gbnVsbCAmJlxuXHRcdFx0XHRjb250ZW50LmdldENvbnRyb2woKS5nZXREb21SZWYoKT8uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpbnB1dFwiKVswXS5pZCA9PT0gKGNvbnRyb2wgYXMgRGlhbG9nKS5nZXRJbml0aWFsRm9jdXMoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRyb2wuZGF0YShcImZlX0luaXRpYWxUeXBlQWhlYWRGb2N1c0RvbmVcIiwgdHJ1ZSk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0XHRcdHBheWxvYWQuaGlzdG9yeSA9IHBheWxvYWQuaGlzdG9yeSB8fCB7fTtcblx0XHRcdFx0cGF5bG9hZC5oaXN0b3J5Lmhhc1JlbGV2YW50RGF0YSA9IHVuZGVmaW5lZDsgLy8gbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZVxuXHRcdFx0XHRwYXlsb2FkLmhpc3RvcnkuZW5hYmxlZCA9IHBheWxvYWQuaGlzdG9yeS5lbmFibGVkID8/IFZhbHVlTGlzdEhlbHBlci5jaGVja0hpc3RvcnlFbmFibGVkKHZhbHVlSGVscCwgcGF5bG9hZCk7XG5cdFx0XHRcdHJldHVybiBhd2FpdCB0aGlzLl9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyh2YWx1ZUhlbHBUYWJsZSwgcGF5bG9hZCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBib29sZWFuIHZhbHVlIGRldGVybWluaW5nIGlmIHJlcXVlc3RTaG93Q29udGFpbmVyIHNoYWxsIG9wZW4gdGhlIHBvcG92ZXIgb3Igbm90LlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250YWluZXIgRmlsdGVyYWJsZSBMaXN0IENvbnRlbnRcblx0ICogQHBhcmFtIHJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uIEVudW0gZGVmaW5pbmcgdGhlIHJlYXNvbiBmb3IgcG9zc2libGUgdHJpZ2dlclxuXHQgKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlXG5cdCAqL1xuXHRyZXF1ZXN0U2hvd0NvbnRhaW5lcjogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250YWluZXI6IE1EQ1BvcG92ZXIsIHJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uOiBzdHJpbmcpIHtcblx0XHQvLyBFbnN1cmUgdGhlIHZhbHVlIGhlbHAgcG9wb3ZlciBvcGVucyBmb3IgdHlwaW5nLCBmaWx0ZXIsIHRhcCBldmVudHMgYW5kIHRhYiBuYXZpZ2F0aW9uXG5cdFx0aWYgKFtSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbi5UYWIsIFJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uLlRhcF0uaW5jbHVkZXMocmVxdWVzdFNob3dDb250YWluZXJSZWFzb24pKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5jb25kaXRpb25Gb3JSZXF1ZXN0U2hvd0NvbnRhaW5lcih2YWx1ZUhlbHAsIGNvbnRhaW5lcik7XG5cdFx0fSBlbHNlIGlmIChbUmVxdWVzdFNob3dDb250YWluZXJSZWFzb24uVHlwaW5nLCBSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbi5GaWx0ZXJdLmluY2x1ZGVzKHJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudHlwZUFoZWFkRm9yRmlsdGVyYWJsZUNvbnRlbnQodmFsdWVIZWxwLCBjb250YWluZXIpO1xuXHRcdH1cblx0XHRyZXR1cm4gUmVxdWVzdFNob3dDb250YWluZXJSZWFzb24uVmFsdWVIZWxwUmVxdWVzdCA9PT0gcmVxdWVzdFNob3dDb250YWluZXJSZWFzb247XG5cdH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7RUFtREEsTUFBTUEsdUJBQXVCLEdBQUcsa0NBQWtDO0VBQ2xFLE1BQU1DLHlCQUF5QixHQUFHLGlEQUFpRDtFQUFDLE9BNEJyRUMsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVDLGlCQUFpQixFQUFFO0lBQ25EQyxVQUFVLEVBQUUsQ0FBQztJQUNiQyx5QkFBeUIsRUFBRSxJQUFJQyxPQUFPLENBQXdCLENBQUM7SUFFL0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0MsaUJBQWlCLEVBQUUsU0FBQUEsQ0FBVUMsU0FBb0IsRUFBRUMsT0FBOEIsRUFBRUMsWUFBOEIsRUFBRTtNQUNsSCxPQUFPLENBQUMsQ0FBQ0QsT0FBTyxDQUFDRSxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDekMsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLGlCQUFpQixFQUFFLFNBQUFBLENBQVVKLFNBQW9CLEVBQUVDLE9BQThCLEVBQUVJLFdBQXVDLEVBQUU7TUFDM0hWLGlCQUFpQixDQUFDUyxpQkFBaUIsQ0FBQ0osU0FBUyxFQUFFQyxPQUFPLEVBQUVJLFdBQVcsQ0FBQztNQUVwRSxJQUFJSixPQUFPLENBQUNFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxF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
1080
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGZUNvcmVDb250cm9sc0ZpbHRlckJhciIsIkFubm90YXRpb25Jc0RpZ2l0U2VxdWVuY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJWYWx1ZUhlbHBEZWxlZ2F0ZSIsImFwaVZlcnNpb24iLCJ1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzIiwiV2Vha01hcCIsImlzU2VhcmNoU3VwcG9ydGVkIiwidmFsdWVIZWxwIiwiY29udGVudCIsIl9saXN0QmluZGluZyIsImRhdGEiLCJ1cGRhdGVCaW5kaW5nSW5mbyIsImJpbmRpbmdJbmZvIiwic2VhcmNoIiwiZ2V0RmlsdGVyVmFsdWUiLCJub3JtYWxpemVkU2VhcmNoIiwiQ29tbW9uVXRpbHMiLCJub3JtYWxpemVTZWFyY2hUZXJtIiwicGFyYW1ldGVycyIsIiRzZWFyY2giLCJ1bmRlZmluZWQiLCJfZ2V0VmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UiLCJjb250cm9sIiwiYXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0VGFyZ2V0VmlldyIsImdldFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlIiwiY2hlY2tDb25kaXRpb25zRXF1YWwiLCJvbGRDb25kaXRpb24iLCJuZXdDb25kaXRpb24iLCJvcGVyYXRvciIsInZhbHVlczEiLCJ2YWx1ZXMiLCJ2YWx1ZXMyIiwibGVuZ3RoIiwic29ydGVkVmFsdWVzMSIsInNvcnQiLCJmaXJzdFZhbHVlIiwic2Vjb25kVmFsdWUiLCJTdHJpbmciLCJsb2NhbGVDb21wYXJlIiwic29ydGVkVmFsdWVzMiIsImV2ZXJ5IiwidmFsdWUiLCJpbmRleCIsIl9nZXRIaXN0b3J5RGF0YSIsInBheWxvYWQiLCJoaXN0b3J5IiwiZW5hYmxlZCIsImlzUG90ZW50aWFsbHlTZW5zaXRpdmUiLCJ2YWx1ZUxpc3RIaXN0b3J5U2VydmljZSIsImZpZWxkRGF0YSIsImdldEZpZWxkRGF0YSIsInByb3BlcnR5UGF0aCIsInZhbHVlSGVscFF1YWxpZmllciIsImVyciIsIkxvZyIsImVycm9yIiwiRXJyb3IiLCJtZXNzYWdlIiwiX3NldEhpc3RvcnlEYXRhIiwiY29uZGl0aW9ucyIsInZhbHVlTGlzdFByb3BlcnR5IiwiX2dldFZhbHVlTGlzdFByb3BlcnR5RnJvbVBheWxvYWRRdWFsaWZpZXIiLCJjb25kaXRpb24iLCJpc1VuaXRWYWx1ZUhlbHAiLCJ2YWxpZGF0ZWQiLCJDb25kaXRpb25WYWxpZGF0ZWQiLCJWYWxpZGF0ZWQiLCJjb25kaXRpb25QYXlsb2FkTWFwIiwiX2dldENvbmRpdGlvblBheWxvYWRMaXN0IiwicHVzaCIsImNvbnZlcnRDb25kaXRpb25QYXlsb2FkVG9OZXN0ZWRPYmplY3QiLCJzZXRGaWVsZERhdGEiLCJjb25kaXRpb25QYXlsb2FkIiwibmVzdGVkT2JqZWN0Iiwia2V5IiwiT2JqZWN0UGF0aCIsInNldCIsInNwbGl0IiwiX2lzRW1wdHlEaWdpdFNlcXVlbmNlIiwiaXNEaWdpdFNlcXVlbmNlIiwiaXNFbXB0eURpZ2l0U2VxdWVuY2UiLCJjaGFyIiwidXBkYXRlQmluZGluZyIsImxpc3RCaW5kaW5nIiwiaXNBIiwiZ2V0UGF5bG9hZCIsImlzVHlwZWFoZWFkIiwidXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZSIsIm5ld1Byb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsImV4aXN0aW5nVXBkYXRlQmluZGluZ0RvbmVQcm9taXNlIiwiZ2V0IiwidGhlbiIsImZpZWxkIiwiZ2V0Q29udHJvbCIsImlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQiLCJmaWVsZFZhbHVlIiwiZ2V0VmFsdWUiLCJhZGRpdGlvbmFsVmFsdWVzIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJnZXRPYmplY3QiLCJoYXNQZW5kaW5nVXNlcklucHV0IiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMiLCJncm91cEtleSIsIkFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5IiwicmVjb21tZW5kYXRpb24iLCJ0YWJsZSIsImdldFRhYmxlIiwic29ydGVyc0N1c3RvbURhdGEiLCJnZXRDdXN0b21EYXRhIiwiZmlsdGVyIiwiZ2V0S2V5Iiwic29ydGVycyIsIl91cGRhdGVCaW5kaW5nV2l0aFRyYW5zaWVudENvbnRleHRzIiwiX3VwZGF0ZUJpbmRpbmciLCJleGVjdXRlRmlsdGVyIiwicmVxdWVzdGVkSXRlbXMiLCJnZXRDb250ZXh0cyIsImNoZWNrTGlzdEJpbmRpbmdQZW5kaW5nIiwiX3ZhbHVlSGVscCIsImlzUGVuZGluZyIsImhhcyIsImlzU3VzcGVuZGVkIiwiY29udGV4dHMiLCJyZXF1ZXN0Q29udGV4dHMiLCJjYW5jZWxlZCIsImdldFR5cGVNYXAiLCJUeXBlTWFwIiwicmV0cmlldmVDb250ZW50IiwiY29udGFpbmVyIiwiY29udGVudElkIiwiVmFsdWVMaXN0SGVscGVyIiwic2hvd1ZhbHVlTGlzdCIsInZhbHVlSGVscFF1YWxpZmllcnMiLCJrZXlzIiwiY29uZGl0aW9uUGF5bG9hZExpc3QiLCJwYXJhbXMiLCJxdWFsaWZpZXJzIiwidmhQYXJhbWV0ZXJzIiwidmhLZXlzIiwicHJvcGVydHlLZXlQYXRoIiwidmFsdWVIZWxwS2V5UGF0aCIsImZpbHRlcmVkS2V5cyIsImhlbHBQYXRocyIsImZvckVhY2giLCJwYXJhbSIsImhlbHBQYXRoIiwiaW5jbHVkZXMiLCJfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvRmlsdGVyQmFyIiwib3V0UGFyYW1ldGVycyIsImZpbHRlckJhciIsImxpc3RSZXBvcnRGaWx0ZXJCYXIiLCJzdGF0ZSIsIlN0YXRlVXRpbCIsInJldHJpZXZlRXh0ZXJuYWxTdGF0ZSIsInN0YXRlSXRlbXMiLCJpdGVtcyIsImZpbHRlckJhclByb3BlcnRpZXMiLCJGaWx0ZXJVdGlscyIsImdldEZpbHRlclByb3BlcnR5SW5mbyIsIm1ldGFNb2RlbCIsIm91dFBhcmFtZXRlciIsImZpbHRlckJhclByb3BlcnR5IiwiX2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGgiLCJmaW5kIiwiaXRlbSIsIm5hbWUiLCJtYXhDb25kaXRpb25zIiwiY29uZGl0aW9uUGF0aCIsImZpbHRlcmVkIiwiQ29uZGl0aW9uIiwiY3JlYXRlQ29uZGl0aW9uIiwiY29uZGl0aW9uQWxyZWFkeUV4aXN0cyIsInRlc3RDb25kaXRpb24iLCJfZmlsdGVyZWQiLCJjb25kaXRpb25Ub0NvbXBhcmUiLCJhcHBseUV4dGVybmFsU3RhdGUiLCJjb250ZXh0UGF0aCIsImZpbHRlclRhcmdldCIsInNvdXJjZSIsInBvcCIsImxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwiZmlsdGVyVGFyZ2V0UGF0aCIsInN1YnN0cmluZyIsImFubm90YXRpb25QYXRoIiwiZ2V0UmVkdWNlZFBhdGgiLCJfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvQmluZGluZ0NvbnRleHQiLCJjb250ZXh0Iiwib3V0VmFsdWVzIiwid2FybmluZyIsIl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVXBkYXRlUHJvcGVydHkiLCJjb252ZXJ0ZWRNZXRhZGF0YSIsImNvbnZlcnRUeXBlcyIsInJvb3RQYXRoIiwiZ2V0TWV0YUNvbnRleHQiLCJnZXRQYXRoIiwiY29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0cyIsImlzVHJhbnNpZW50IiwiaXNJbmFjdGl2ZSIsIm91dFBhcmFtZXRlclNvdXJjZXMiLCJfdXBkYXRlUHJvcGVydHlWaWFPdXRQYXJhbWV0ZXIiLCJ2aWV3IiwiY29sbGFib3JhdGl2ZURyYWZ0IiwiZ2V0Q29udHJvbGxlciIsImlzQ29ubmVjdGVkIiwiYmluZGluZyIsImdldEJpbmRpbmciLCJnZXRCaW5kaW5nQ29udGV4dCIsImF0dGFjaEV2ZW50T25jZSIsInNlbmQiLCJhY3Rpb24iLCJBY3Rpdml0eSIsIkNoYW5nZSIsIm1hcCIsInRhcmdldFByb3BlcnR5IiwicmVzb2x2ZVBhdGgiLCJ0YXJnZXQiLCJmaWVsZENvbnRyb2wiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIkZpZWxkQ29udHJvbCIsImR5bmFtaWNSZWFkT25seSIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiZ2V0UHJvcGVydHkiLCJwYXRoIiwic2lkZUVmZmVjdFBhdGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJjdXJyZW50VmFsIiwibmV3VmFsIiwic2V0UHJvcGVydHkiLCJ0ZXh0UGF0aCIsIlRleHQiLCJnZXRGaWx0ZXJDb25kaXRpb25zIiwiY29uZmlnIiwiZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnMiLCJvbkNvbmRpdGlvblByb3BhZ2F0aW9uIiwicmVhc29uIiwiX2NvbmZpZyIsImlzRGVmaW5lQ29uZGl0aW9uVmFsdWVIZWxwIiwicXVhbGlmaWVyIiwiZ2V0T3V0UGFyYW1ldGVycyIsImZpZWxkUGFyZW50IiwiZ2V0UGFyZW50IiwiZ2V0Q29uZGl0aW9ucyIsImlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzIiwicHJvcGVydHlOYW1lIiwicGF5bG9hZEtleXMiLCJwYXlsb2FkS2V5IiwiY29uZGl0aW9uVmFsdWVrZXlzIiwiY29uZGl0aW9uVmFsdWVrZXkiLCJ2YWx1ZUtleSIsImtleVZhbHVlIiwiX2NyZWF0ZUluaXRpYWxGaWx0ZXJDb25kaXRpb24iLCJpbml0aWFsVmFsdWVJc1NpZ25pZmljYW50IiwiX2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUJpbmRpbmciLCJpbkNvbmRpdGlvbnMiLCJpblBhcmFtZXRlcnMiLCJiaW5kaW5nQ29udGV4dCIsImdldE1ldGFQYXRoIiwicHJvcGVydGllc1RvUmVxdWVzdCIsImluUGFyYW1ldGVyIiwibWV0YURhdGFFcnJvciIsIm5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJuYXZpZ2F0aW9uUHJvcGVydHkiLCJyZXBsYWNlIiwiJFBhcnRuZXIiLCIka2luZCIsIl9idWlsZFByb3BlcnRpZXNUb1JlcXVlc3QiLCJjb250ZXh0VW5kZXJDcmVhdGlvbiIsImdldFVwZGF0ZUdyb3VwSWQiLCJzdGFydHNXaXRoIiwiZXJyb3JNZXNzYWdlc0luQ29udGV4dCIsImdldE1lc3NhZ2VzIiwiZ2V0VHlwZSIsIk1lc3NhZ2VUeXBlIiwiY3JlYXRlZCIsInJlcXVlc3RQcm9wZXJ0eSIsImkiLCJtZXRhTW9kZWxDb250ZXh0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJyZWxhdGl2ZVBhdGhQYXJ0cyIsInNsaWNlIiwicGFydCIsInBhcnRuZXIiLCJsb2NhbERhdGFQYXRoIiwibG9jYWxEYXRhUGFydHMiLCJtYXRjaENvdW50IiwiZmluZEluZGV4IiwiY29uY2F0Iiwiam9pbiIsIl9nZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9uc0Zyb21GaWx0ZXJCYXIiLCJzb3VyY2VGaWVsZCIsIl9nZXRDb25kaXRpb25zRnJvbUluUGFyYW1ldGVyIiwiX3BhcnRpdGlvbkluUGFyYW1ldGVycyIsImluUGFyYW1ldGVyTWFwIiwiY29uc3RhbnQiLCJjb25zdGFudFZhbHVlIiwiaW5kZXhPZiIsIl90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGUiLCJvbkFmdGVyUmVuZGVyaW5nIiwiZXZlbnQiLCJzcmNDb250cm9sIiwidGFibGVDZWxsc0RvbVJlZnMiLCIkIiwibWRjTVRhYmxlIiwiaGlnaGxpZ2h0RE9NRWxlbWVudHMiLCJwb3BvdmVyVGFibGUiLCJyZW1vdmVFdmVudERlbGVnYXRlIiwiYWRkRXZlbnREZWxlZ2F0ZSIsImdldEluUGFyYW1ldGVycyIsImlzT2JqZWN0UGFnZSIsImNyZWF0ZUNvbmRpdGlvblBheWxvYWQiLCJfdmFsdWVzIiwiZW50cnkiLCJpc011bHRpVmFsdWVGaWVsZCIsImV4dGVybmFsSWRQYXRoIiwidmhLZXlQcm9wZXJ0eSIsInZoS2V5VmFsdWUiLCJ2aFByb3BlcnRpZXMiLCJ2aEtleSIsIm1vZGlmeVNlbGVjdGlvbkJlaGF2aW91ciIsImNoYW5nZSIsIm9sZENvbmRpdGlvbnMiLCJpc1F1aWNrU2VsZWN0QWN0aXZlIiwiZmluZENvbmRpdGlvbnNGb3JDb250ZXh0Iiwia2V5UGF0aCIsImdldEtleVBhdGgiLCJmaW5kQ29uZGl0aW9uIiwiY29uZGl0aW9uU2VsZWN0ZWRSb3ciLCJ1c2VNdWx0aVZhbHVlRmllbGQiLCJjb250ZXh0S2V5cyIsImNvbmRpdGlvblNlbGVjdGVkUm93S2V5cyIsInNlbGVjdGVkQ29uZGl0aW9uIiwiX3VwZGF0ZUJpbmRpbmdBdHRyaWJ1dGVzIiwicmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSIsInJlY2VudFZhbHVlc0NvbnRleHREYXRhIiwib3RoZXJzVmFsdWVzQ29udGV4dERhdGEiLCJfZ2V0UmVsZXZhbnRBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsImhhc1JlbGV2YW50RGF0YSIsInJlc2V0Q2hhbmdlcyIsImRlYnVnIiwiYWRkaXRpb25hbFZhbHVlSGVscGVyIiwiY3JlYXRlVHJhbnNpZW50Q29udGV4dHNGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsInJvb3RCaW5kaW5nIiwiZ2V0Um9vdEJpbmRpbmciLCJzdXNwZW5kIiwic29ydEFuZEZpbHRlckxpc3RCaW5kaW5nIiwiY2hhbmdlUGFyYW1ldGVycyIsInJlc3VtZVZhbHVlTGlzdEJpbmRpbmdBbmRSZXNldENoYW5nZXMiLCJyZXF1ZXN0Rm9yQWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGEiLCJ2YWx1ZUhlbHBLZXlzIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhIiwiZ2V0UmVsZXZhbnRSZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSIsInJlcGxhY2VBbGwiLCJnZXRSZWxldmFudE90aGVyc1ZhbHVlc0NvbnRleHREYXRhIiwiZmlsdGVycyIsIkZpbHRlclR5cGUiLCJBcHBsaWNhdGlvbiIsInNvcnRlciIsInJlc3VtZSIsIl9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyIsImNoZWNrUmVjb21tZW5kYXRpb25zIiwiYXJndW1lbnRzIiwicmVjb21tZW5kYXRpb25WYWx1ZXMiLCJyZWNlbnRWYWx1ZXMiLCJjb250ZW50TW9kZWwiLCJsb2NhbEFubm90YXRpb25Nb2RlbCIsImdldExvY2FsQW5ub3RhdGlvbk1vZGVsIiwiYmluZGluZ0NvbnRleHRQYXRoIiwiZmllbGRQYXRoIiwiaW5wdXRWYWx1ZXMiLCJ0eXBlQWhlYWRGb3JGaWx0ZXJhYmxlQ29udGVudCIsInNob3dJdCIsInR5cGVBaGVhZENvbnRlbnQiLCJnZXRDb250ZW50IiwiZmlsdGVyVmFsdWUiLCJmaWVsZFRleHRWYWx1ZSIsImdldEFkZGl0aW9uYWxWYWx1ZSIsImNvbmRpdGlvbkZvclJlcXVlc3RTaG93Q29udGFpbmVyIiwicGFyZW50Q29udHJvbCIsImZpZWxkSWQiLCJnZXRJZCIsImlzVmlzdWFsRmlsdGVyIiwidmFsdWVIZWxwVGFibGUiLCJnZXRQYXJlbnREaWFsb2ciLCJpbm5lckNvbnRlbnQiLCJnZXREb21SZWYiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImlkIiwiZ2V0SW5pdGlhbEZvY3VzIiwiY2hlY2tIaXN0b3J5RW5hYmxlZCIsInJlcXVlc3RTaG93Q29udGFpbmVyIiwicmVxdWVzdFNob3dDb250YWluZXJSZWFzb24iLCJSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbiIsIlRhYiIsIlRhcCIsIlR5cGluZyIsIkZpbHRlciIsIlZhbHVlSGVscFJlcXVlc3QiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlZhbHVlSGVscERlbGVnYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29udmVydGVkTWV0YWRhdGEsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBPYmplY3RQYXRoIGZyb20gXCJzYXAvYmFzZS91dGlsL09iamVjdFBhdGhcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IEFjdGl2aXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IFByb3BlcnR5SW5mbyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0xpc3RSZXBvcnQvRmlsdGVyQmFyXCI7XG5pbXBvcnQgeyBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgRmllbGREYXRhVHlwZSwgVmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvVmFsdWVIZWxwSGlzdG9yeVNlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSB7IElGaWx0ZXJDb250cm9sIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyL0ZpbHRlclV0aWxzXCI7XG5pbXBvcnQgRmlsdGVyVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyL0ZpbHRlclV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEluT3V0UGFyYW1ldGVyLCBTb3J0ZXJUeXBlLCBWYWx1ZUhlbHBQYXlsb2FkIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvdmFsdWVoZWxwL1ZhbHVlTGlzdEhlbHBlclwiO1xuaW1wb3J0IFZhbHVlTGlzdEhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC9tL1RhYmxlXCI7XG5pbXBvcnQgaGlnaGxpZ2h0RE9NRWxlbWVudHMgZnJvbSBcInNhcC9tL2lucHV0VXRpbHMvaGlnaGxpZ2h0RE9NRWxlbWVudHNcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8gfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBGaWVsZCB9IGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJCYXIgZnJvbSBcInNhcC91aS9tZGMvRmlsdGVyQmFyXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJGaWVsZFwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL011bHRpVmFsdWVGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVmFsdWVIZWxwIGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscFwiO1xuaW1wb3J0IFZhbHVlSGVscERlbGVnYXRlIGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscERlbGVnYXRlXCI7XG5pbXBvcnQgdHlwZSB7IENvbmRpdGlvbk9iamVjdCB9IGZyb20gXCJzYXAvdWkvbWRjL2NvbmRpdGlvbi9Db25kaXRpb25cIjtcbmltcG9ydCBDb25kaXRpb24gZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvblwiO1xuaW1wb3J0IENvbmRpdGlvblZhbGlkYXRlZCBmcm9tIFwic2FwL3VpL21kYy9lbnVtcy9Db25kaXRpb25WYWxpZGF0ZWRcIjtcbmltcG9ydCBSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbiBmcm9tIFwic2FwL3VpL21kYy9lbnVtcy9SZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvblwiO1xuaW1wb3J0IHR5cGUgRmllbGRCYXNlIGZyb20gXCJzYXAvdWkvbWRjL2ZpZWxkL0ZpZWxkQmFzZVwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyQmFzZSBmcm9tIFwic2FwL3VpL21kYy9maWx0ZXJiYXIvRmlsdGVyQmFyQmFzZVwiO1xuaW1wb3J0IFR5cGVNYXAgZnJvbSBcInNhcC91aS9tZGMvb2RhdGEvdjQvVHlwZU1hcFwiO1xuaW1wb3J0IFN0YXRlVXRpbCBmcm9tIFwic2FwL3VpL21kYy9wMTNuL1N0YXRlVXRpbFwiO1xuaW1wb3J0IHR5cGUgTURDUG9wb3ZlciBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvUG9wb3ZlclwiO1xuaW1wb3J0IHR5cGUgQ29udGFpbmVyIGZyb20gXCJzYXAvdWkvbWRjL3ZhbHVlaGVscC9iYXNlL0NvbnRhaW5lclwiO1xuaW1wb3J0IHR5cGUgQ29udGVudCBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvYmFzZS9Db250ZW50XCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJhYmxlTGlzdENvbnRlbnQgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2Jhc2UvRmlsdGVyYWJsZUxpc3RDb250ZW50XCI7XG5pbXBvcnQgdHlwZSBWYWx1ZUhlbHBEaWFsb2cgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2Jhc2UvVmFsdWVIZWxwRGlhbG9nXCI7XG5pbXBvcnQgdHlwZSBNVGFibGUgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2NvbnRlbnQvTVRhYmxlXCI7XG5pbXBvcnQgRmlsdGVyVHlwZSBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclR5cGVcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZSB9IGZyb20gXCIuLi9maWVsZC9GaWVsZEJhc2VEZWxlZ2F0ZVwiO1xuaW1wb3J0IHR5cGUgeyBBZGRpdGlvbmFsVmFsdWVUeXBlLCBCaW5kaW5nSW5mb1BhcmFtZXRlcnMgfSBmcm9tIFwiLi4vaW50ZXJuYWwvdmFsdWVoZWxwL0FkZGl0aW9uYWxWYWx1ZUhlbHBlclwiO1xuaW1wb3J0IHsgQWRkaXRpb25hbFZhbHVlR3JvdXBLZXksIGFkZGl0aW9uYWxWYWx1ZUhlbHBlciB9IGZyb20gXCIuLi9pbnRlcm5hbC92YWx1ZWhlbHAvQWRkaXRpb25hbFZhbHVlSGVscGVyXCI7XG5cbmNvbnN0IEZlQ29yZUNvbnRyb2xzRmlsdGVyQmFyID0gXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzLkZpbHRlckJhclwiO1xuY29uc3QgQW5ub3RhdGlvbklzRGlnaXRTZXF1ZW5jZSA9IFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0RpZ2l0U2VxdWVuY2VcIjtcblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uT2JqZWN0TWFwID0gUmVjb3JkPHN0cmluZywgQ29uZGl0aW9uT2JqZWN0W10+O1xuXG5leHBvcnQgdHlwZSBFeHRlcm5hbFN0YXRlVHlwZSA9IHtcblx0aXRlbXM6IHsgbmFtZTogc3RyaW5nIH1bXTtcblx0ZmlsdGVyOiBDb25kaXRpb25PYmplY3RNYXA7XG59O1xuXG50eXBlIFNlbGVjdGlvbkNoYW5nZSA9IHtcblx0Y29uZGl0aW9uczogb2JqZWN0W107XG5cdHR5cGU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIENvbmRpdGlvblBheWxvYWRUeXBlID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IG51bGw+O1xuXG5leHBvcnQgdHlwZSBDb25kaXRpb25QYXlsb2FkTWFwID0gUmVjb3JkPHN0cmluZywgQ29uZGl0aW9uUGF5bG9hZFR5cGVbXT47XG5cbnR5cGUgTURDQ29uZmlnVHlwZSA9IHtcblx0dmFsdWU6IHVua25vd247XG5cdHBhcnNlZFZhbHVlOiB1bmtub3duO1xuXHRjb250ZXh0OiBvYmplY3Q7XG5cdGNvbnRyb2w6IENvbnRyb2w7IC8vIEluc3RhbmNlIG9mIHRoZSBjYWxsaW5nIGNvbnRyb2xcblx0YmluZGluZ0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0O1xuXHRjaGVja0tleTogYm9vbGVhbjtcblx0Y2hlY2tEZXNjcmlwdGlvbjogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oe30sIFZhbHVlSGVscERlbGVnYXRlLCB7XG5cdGFwaVZlcnNpb246IDIsXG5cdHVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZXM6IG5ldyBXZWFrTWFwPG9iamVjdCwgUHJvbWlzZTx2b2lkPj4oKSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgPGNvZGU+TGlzdEJpbmRpbmc8L2NvZGU+IHN1cHBvcnRzICRTZWFyY2guXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgQ29udGVudCBlbGVtZW50XG5cdCAqIEBwYXJhbSBfbGlzdEJpbmRpbmdcblx0ICogQHJldHVybnMgVHJ1ZSBpZiAkc2VhcmNoIGlzIHN1cHBvcnRlZFxuXHQgKi9cblx0aXNTZWFyY2hTdXBwb3J0ZWQ6IGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogRmlsdGVyYWJsZUxpc3RDb250ZW50LCBfbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpIHtcblx0XHRyZXR1cm4gISFjb250ZW50LmRhdGEoXCJzZWFyY2hTdXBwb3J0ZWRcIik7XG5cdH0sXG5cblx0Lypcblx0ICogQWRqdXN0YWJsZSBmaWx0ZXJpbmcgZm9yIGxpc3QtYmFzZWQgY29udGVudHMuXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgVmFsdWVIZWxwIGNvbnRlbnQgcmVxdWVzdGluZyBjb25kaXRpb25zIGNvbmZpZ3VyYXRpb25cblx0ICogQHBhcmFtIGJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICovXG5cdHVwZGF0ZUJpbmRpbmdJbmZvOiBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IEZpbHRlcmFibGVMaXN0Q29udGVudCwgYmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvKSB7XG5cdFx0VmFsdWVIZWxwRGVsZWdhdGUudXBkYXRlQmluZGluZ0luZm8odmFsdWVIZWxwLCBjb250ZW50LCBiaW5kaW5nSW5mbyk7XG5cblx0XHRpZiAoY29udGVudC5kYXRhKFwic2VhcmNoU3VwcG9ydGVkXCIpKSB7XG5cdFx0XHRjb25zdCBzZWFyY2ggPSBjb250ZW50LmdldEZpbHRlclZhbHVlKCk7XG5cdFx0XHRjb25zdCBub3JtYWxpemVkU2VhcmNoID0gQ29tbW9uVXRpbHMubm9ybWFsaXplU2VhcmNoVGVybShzZWFyY2gpOyAvLyBhZGp1c3RTZWFyY2hcblxuXHRcdFx0aWYgKGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMpIHtcblx0XHRcdFx0KGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLiRzZWFyY2ggPSBub3JtYWxpemVkU2VhcmNoIHx8IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0aGUgdmFsdWUgaGVscCBoaXN0b3J5IHNlcnZpY2UgZnJvbSB0aGUgYXBwIGNvbXBvbmVudC5cblx0ICogQHBhcmFtIGNvbnRyb2wgQ29udHJvbCB0byBmaW5kIHRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEByZXR1cm5zIFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlXG5cdCAqL1xuXHRfZ2V0VmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UoY29udHJvbDogQ29udHJvbCk6IFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlIHtcblx0XHQvLyBGb3Igc29tZSByZWFzb24gd2UgY2Fubm90IHVzZSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQoY29udHJvbCkgaGVyZSBidXQgbmVlZCB0byBnZXQgdGhlIFZpZXcgZmlyc3QuXG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcoY29udHJvbCkpO1xuXHRcdHJldHVybiBhcHBDb21wb25lbnQuZ2V0VmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UoKTtcblx0fSxcblxuXHQvKipcblx0ICogQ29tcGFyZXMgdHdvIGNvbmRpdGlvbiBvYmplY3RzIGZvciBlcXVhbGl0eSBiYXNlZCBvbiBvcGVyYXRvciBhbmQgdmFsdWVzLlxuXHQgKiBAcGFyYW0gb2xkQ29uZGl0aW9uIEZpcnN0IGNvbmRpdGlvbiB0byBjb21wYXJlXG5cdCAqIEBwYXJhbSBuZXdDb25kaXRpb24gU2Vjb25kIGNvbmRpdGlvbiB0byBjb21wYXJlXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgY29uZGl0aW9ucyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0Y2hlY2tDb25kaXRpb25zRXF1YWwob2xkQ29uZGl0aW9uOiBDb25kaXRpb25PYmplY3QsIG5ld0NvbmRpdGlvbjogQ29uZGl0aW9uT2JqZWN0KTogYm9vbGVhbiB7XG5cdFx0Ly8gQ29tcGFyZSBvcGVyYXRvcnNcblx0XHRpZiAob2xkQ29uZGl0aW9uLm9wZXJhdG9yICE9PSBuZXdDb25kaXRpb24ub3BlcmF0b3IpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBDb21wYXJlIHZhbHVlcyBhcnJheXNcblx0XHRjb25zdCB2YWx1ZXMxID0gb2xkQ29uZGl0aW9uLnZhbHVlcyA/PyBbXTtcblx0XHRjb25zdCB2YWx1ZXMyID0gbmV3Q29uZGl0aW9uLnZhbHVlcyA/PyBbXTtcblxuXHRcdGlmICh2YWx1ZXMxLmxlbmd0aCAhPT0gdmFsdWVzMi5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBTb3J0IHZhbHVlcyBmb3IgY29tcGFyaXNvbiB0byBoYW5kbGUgb3JkZXIgZGlmZmVyZW5jZXNcblx0XHRjb25zdCBzb3J0ZWRWYWx1ZXMxID0gWy4uLnZhbHVlczFdLnNvcnQoKGZpcnN0VmFsdWUsIHNlY29uZFZhbHVlKSA9PiBTdHJpbmcoZmlyc3RWYWx1ZSkubG9jYWxlQ29tcGFyZShTdHJpbmcoc2Vjb25kVmFsdWUpKSk7XG5cdFx0Y29uc3Qgc29ydGVkVmFsdWVzMiA9IFsuLi52YWx1ZXMyXS5zb3J0KChmaXJzdFZhbHVlLCBzZWNvbmRWYWx1ZSkgPT4gU3RyaW5nKGZpcnN0VmFsdWUpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKHNlY29uZFZhbHVlKSkpO1xuXG5cdFx0cmV0dXJuIHNvcnRlZFZhbHVlczEuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IHNvcnRlZFZhbHVlczJbaW5kZXhdKTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRoZSBoaXN0b3J5IGRhdGEgZm9yIHRoZSB2YWx1ZSBsaXN0IHByb3BlcnR5IGZyb20gdGhlIGhpc3Rvcnkgc2VydmljZS5cblx0ICogTm8gaGlzdG9yeSBkYXRhIGlzIGZldGNoZWQgZm9yIGZpZWxkcyBhbm5vdGF0ZWQgd2l0aCBJc1BvdGVudGlhbGx5U2Vuc2l0aXZlLlxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBWYWx1ZUhlbHBcblx0ICogQHBhcmFtIGNvbnRyb2wgQ29udHJvbCB0byBmaW5kIHRoZSBhcHAgY29tcG9uZW50LCBlLmcuIHRoZSBmaWVsZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIHRvIGEgbGlzdCBvZiBmaWVsZCBkYXRhIGZvciB0aGUgdmFsdWUgbGlzdCBwcm9wZXJ0eVxuXHQgKi9cblx0X2dldEhpc3RvcnlEYXRhOiBhc3luYyBmdW5jdGlvbiAocGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCwgY29udHJvbDogQ29udHJvbCk6IFByb21pc2U8RmllbGREYXRhVHlwZVtdPiB7XG5cdFx0aWYgKHBheWxvYWQuaGlzdG9yeT8uZW5hYmxlZCAmJiBwYXlsb2FkLmlzUG90ZW50aWFsbHlTZW5zaXRpdmUgIT09IHRydWUpIHtcblx0XHRcdGNvbnN0IHZhbHVlTGlzdEhpc3RvcnlTZXJ2aWNlID0gdGhpcy5fZ2V0VmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UoY29udHJvbCk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBmaWVsZERhdGEgPSBhd2FpdCB2YWx1ZUxpc3RIaXN0b3J5U2VydmljZS5nZXRGaWVsZERhdGEocGF5bG9hZC5wcm9wZXJ0eVBhdGggKyBcIi9cIiArIHBheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyKTtcblx0XHRcdFx0cGF5bG9hZC5oaXN0b3J5LmRhdGEgPSBmaWVsZERhdGE7XG5cdFx0XHRcdHJldHVybiBmaWVsZERhdGE7XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0TG9nLmVycm9yKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBbXTtcblx0fSxcblxuXHQvKipcblx0ICogU2V0IHRoZSBoaXN0b3J5IGRhdGEgZm9yIHRoZSB2YWx1ZSBsaXN0IHByb3BlcnR5IGluIHRoZSBoaXN0b3J5IHNlcnZpY2UuXG5cdCAqIE5vIGhpc3RvcnkgZGF0YSBpcyBzdG9yZWQgZm9yIGZpZWxkcyBhbm5vdGF0ZWQgd2l0aCBJc1BvdGVudGlhbGx5U2Vuc2l0aXZlLlxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBWYWx1ZUhlbHBcblx0ICogQHBhcmFtIGNvbmRpdGlvbnMgVGhlIGNvbmRpdGlvbiBvYmplY3QgdG8gZ2V0IHRoZSBzZWxlY3RlZCBkYXRhIGZyb21cblx0ICogQHBhcmFtIGNvbnRyb2wgQ29udHJvbCB0byBmaW5kIHRoZSBhcHAgY29tcG9uZW50LCBlLmcuIHRoZSBmaWVsZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIHdoZW4gdGhlIGRhdGEgaXMgc2V0IGluIHRoZSBoaXN0b3J5IHNlcnZpY2Vcblx0ICovXG5cdF9zZXRIaXN0b3J5RGF0YTogYXN5bmMgZnVuY3Rpb24gKHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsIGNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdFtdLCBjb250cm9sOiBDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHBheWxvYWQuaGlzdG9yeT8uZW5hYmxlZCAmJiBwYXlsb2FkLmlzUG90ZW50aWFsbHlTZW5zaXRpdmUgIT09IHRydWUgJiYgY29uZGl0aW9ucy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IHZhbHVlTGlzdFByb3BlcnR5ID0gdGhpcy5fZ2V0VmFsdWVMaXN0UHJvcGVydHlGcm9tUGF5bG9hZFF1YWxpZmllcihwYXlsb2FkKTtcblx0XHRcdGlmICh2YWx1ZUxpc3RQcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBkYXRhOiBGaWVsZERhdGFUeXBlW10gPSBbXTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG5cdFx0XHRcdFx0aWYgKHBheWxvYWQuaXNVbml0VmFsdWVIZWxwIHx8IGNvbmRpdGlvbi52YWxpZGF0ZWQgPT09IENvbmRpdGlvblZhbGlkYXRlZC5WYWxpZGF0ZWQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSB0aGlzLl9nZXRDb25kaXRpb25QYXlsb2FkTGlzdChjb25kaXRpb24pPy5bMF07XG5cdFx0XHRcdFx0XHRpZiAoY29uZGl0aW9uUGF5bG9hZE1hcCkge1xuXHRcdFx0XHRcdFx0XHRkYXRhLnB1c2godGhpcy5jb252ZXJ0Q29uZGl0aW9uUGF5bG9hZFRvTmVzdGVkT2JqZWN0KGNvbmRpdGlvblBheWxvYWRNYXApKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YS5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb25zdCB2YWx1ZUxpc3RIaXN0b3J5U2VydmljZSA9IHRoaXMuX2dldFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlKGNvbnRyb2wpO1xuXG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IHZhbHVlTGlzdEhpc3RvcnlTZXJ2aWNlLnNldEZpZWxkRGF0YShwYXlsb2FkLnByb3BlcnR5UGF0aCArIFwiL1wiICsgcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXIsIGRhdGEpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0aW5nIHRoZSBjb25kaXRpb24gcGF5bG9hZCB0byBhIG5lc3RlZCBvYmplY3QuXG5cdCAqIEBwYXJhbSBjb25kaXRpb25QYXlsb2FkIFRoZSBjb25kaXRpb24gcGF5bG9hZCBvYmplY3QgdG8gYmUgY29udmVydGVkXG5cdCAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgbmVzdGVkIG9iamVjdFxuXHQgKi9cblx0Y29udmVydENvbmRpdGlvblBheWxvYWRUb05lc3RlZE9iamVjdDogZnVuY3Rpb24gKGNvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRUeXBlKTogQ29uZGl0aW9uUGF5bG9hZFR5cGUge1xuXHRcdGNvbnN0IG5lc3RlZE9iamVjdDogQ29uZGl0aW9uUGF5bG9hZFR5cGUgPSB7fTtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBjb25kaXRpb25QYXlsb2FkKSB7XG5cdFx0XHRPYmplY3RQYXRoLnNldChrZXkuc3BsaXQoXCIvXCIpLCBjb25kaXRpb25QYXlsb2FkW2tleV0sIG5lc3RlZE9iamVjdCk7XG5cdFx0fVxuXHRcdHJldHVybiBuZXN0ZWRPYmplY3Q7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIHZhbHVlIGlzIGRpZ2l0IHNlcXVlbmNlIHdpdGggbm8gdmFsdWUuXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2tcblx0ICogQHBhcmFtIGlzRGlnaXRTZXF1ZW5jZSBJbmRpY2F0ZXMgaWYgdGhlIHZhbHVlIGlzIGV4cGVjdGVkIHRvIGJlIGEgZGlnaXQgc2VxdWVuY2Vcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gZW1wdHkgZGlnaXQgc2VxdWVuY2UsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0X2lzRW1wdHlEaWdpdFNlcXVlbmNlOiBmdW5jdGlvbiAodmFsdWU6IFZhbHVlLCBpc0RpZ2l0U2VxdWVuY2U6IGJvb2xlYW4pOiBib29sZWFuIHtcblx0XHRsZXQgaXNFbXB0eURpZ2l0U2VxdWVuY2UgPSBmYWxzZTtcblx0XHRpZiAoaXNEaWdpdFNlcXVlbmNlKSB7XG5cdFx0XHRpc0VtcHR5RGlnaXRTZXF1ZW5jZSA9XG5cdFx0XHRcdHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIlxuXHRcdFx0XHRcdD8gdmFsdWUuc3BsaXQoXCJcIikuZXZlcnkoKGNoYXIpID0+IGNoYXIgPT09IFwiMFwiKSA/PyB2YWx1ZSA9PT0gXCJcIlxuXHRcdFx0XHRcdDogdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gMDtcblx0XHR9XG5cdFx0cmV0dXJuIGlzRW1wdHlEaWdpdFNlcXVlbmNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgZmllbGQgaXMgcmVjb21tZW5kYXRpb24gcmVsZXZhbnQgYW5kIGNhbGxzIGVpdGhlciBfdXBkYXRlQmluZGluZyBvciBfdXBkYXRlQmluZGluZ0ZvclJlY29tbWVuZGF0aW9ucy5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEBwYXJhbSBjb250ZW50IEZpbHRlcmFibGUgTGlzdCBDb250ZW50XG5cdCAqL1xuXHR1cGRhdGVCaW5kaW5nOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0dmFsdWVIZWxwOiBWYWx1ZUhlbHAsXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0YmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdGNvbnRlbnQ6IE1UYWJsZVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBsaXN0QmluZGluZyBzaG91bGQgYmUgb2YgdHlwZSBPRGF0YUxpc3RCaW5kaW5nXG5cdFx0aWYgKCFsaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vV2UgZmV0Y2ggdGhlIHZhbHVlbGlzdCBwcm9wZXJ0eSBmcm9tIHRoZSBwYXlsb2FkIHRvIG1ha2Ugc3VyZSB3ZSBwYXNzIHRoZSByaWdodCBwcm9wZXJ0eSB3aGlsZSBtYWtpbmcgYSBjYWxsIG9uIHZhbHVlbGlzdCBlbnRpdHkgc2V0XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRpZiAoY29udGVudC5pc1R5cGVhaGVhZCgpKSB7XG5cdFx0XHRsZXQgdXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBjcmVhdGUgYSBwcm9taXNlIHRvIG1ha2Ugc3VyZSBjaGVja0xpc3RCaW5kaW5nUGVuZGluZyBpcyBvbmx5IGNvbXBsZXRlZCBvbmNlIHRoaXMgcHJvbWlzZSBpcyByZXNvbHZlZFxuXHRcdFx0Y29uc3QgbmV3UHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cdFx0XHRcdHVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZVJlc29sdmUgPSByZXNvbHZlO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGV4aXN0aW5nVXBkYXRlQmluZGluZ0RvbmVQcm9taXNlID0gdGhpcy51cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzLmdldChsaXN0QmluZGluZyk7XG5cdFx0XHQvL2J1aWxkIGEgcHJvbWlzZSBjaGFpbiBpZiBuZWNlc3Nhcnlcblx0XHRcdHRoaXMudXBkYXRlQmluZGluZ0RvbmVQcm9taXNlcy5zZXQoXG5cdFx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0XHRleGlzdGluZ1VwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZSA/IGV4aXN0aW5nVXBkYXRlQmluZGluZ0RvbmVQcm9taXNlLnRoZW4oYXN5bmMgKCkgPT4gbmV3UHJvbWlzZSkgOiBuZXdQcm9taXNlXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCB2YWx1ZUxpc3RQcm9wZXJ0eSA9IHRoaXMuX2dldFZhbHVlTGlzdFByb3BlcnR5RnJvbVBheWxvYWRRdWFsaWZpZXIocGF5bG9hZCk7XG5cdFx0XHRjb25zdCBmaWVsZCA9IGNvbnRlbnQuZ2V0Q29udHJvbCgpIGFzIEZpbHRlckZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkIHwgRmllbGQ7XG5cdFx0XHRjb25zdCBpc0ZpbHRlckZpZWxkT3JNdWx0aVZhbHVlZEZpZWxkID1cblx0XHRcdFx0ZmllbGQuaXNBPEZpbHRlckZpZWxkPihcInNhcC51aS5tZGMuRmlsdGVyRmllbGRcIikgfHwgZmllbGQuaXNBPE11bHRpVmFsdWVGaWVsZD4oXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKTtcblx0XHRcdGNvbnN0IGZpZWxkVmFsdWUgPSAhaXNGaWx0ZXJGaWVsZE9yTXVsdGlWYWx1ZWRGaWVsZCAmJiBmaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25hbFZhbHVlczogQWRkaXRpb25hbFZhbHVlVHlwZVtdID0gW107XG5cblx0XHRcdC8vIFdlIG5lZWQgdG8gc2hvdyByZWNvbW1lbmRhdGlvbnMgb25seSB3aGVuIHRoZSBmaWVsZCBoYXMgZW1wdHkgdmFsdWUgb3Igd2hlbiB1c2VyIGlzIHR5cGluZyBhIHZhbHVlLiBPdGhlciB0aW1lcyB3ZSBzaG91bGQgbm90IHNob3cgcmVjb21tZW5kYXRpb25zLlxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIGZpZWxkIGhhcyBhbnkgcGVuZGluZyB1c2VyIGlucHV0IGFuZCBpZiBpdCBpcyB0aGVuIHdlIHNob3cgcmVjb21tZW5kYXRpb25zIGlmIGFueS5cblx0XHRcdGNvbnN0IGlzRGlnaXRTZXF1ZW5jZSA9XG5cdFx0XHRcdChmaWVsZC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpLmdldE9iamVjdChgJHtwYXlsb2FkLnByb3BlcnR5UGF0aH0ke0Fubm90YXRpb25Jc0RpZ2l0U2VxdWVuY2V9YCkgPz8gZmFsc2U7XG5cdFx0XHRpZiAoIWZpZWxkVmFsdWUgfHwgZmllbGQuaGFzUGVuZGluZ1VzZXJJbnB1dCgpIHx8IHRoaXMuX2lzRW1wdHlEaWdpdFNlcXVlbmNlKGZpZWxkVmFsdWUsIGlzRGlnaXRTZXF1ZW5jZSkpIHtcblx0XHRcdFx0Ly9nZXQgdGhlIHJlY29tbWVuZGF0aW9uIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwgbW9kZWxcblx0XHRcdFx0Y29uc3QgdmFsdWVzID0gdGhpcy5nZXRSZWxldmFudFJlY29tbWVuZGF0aW9ucyhjb250ZW50LCBwYXlsb2FkKTtcblxuXHRcdFx0XHQvL2lmIHRoZXJlIGFyZSByZWxldmFudCByZWNvbW1lbmRhdGlvbnMgdGhlbiBjcmVhdGUgYWRkaXRpb25hbCB2YWx1ZSBzdHJ1Y3R1cmUgYW5kIGNhbGwgX3VwZGF0ZUJpbmRpbmdGb3JSZWNvbW1lbmRhdGlvbnNcblx0XHRcdFx0aWYgKHZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRhZGRpdGlvbmFsVmFsdWVzLnB1c2goeyBwcm9wZXJ0eVBhdGg6IHZhbHVlTGlzdFByb3BlcnR5LCB2YWx1ZXMsIGdyb3VwS2V5OiBBZGRpdGlvbmFsVmFsdWVHcm91cEtleS5yZWNvbW1lbmRhdGlvbiB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCB0YWJsZSA9IGNvbnRlbnQuZ2V0VGFibGUoKTtcblx0XHRcdGNvbnN0IHNvcnRlcnNDdXN0b21EYXRhID0gdGFibGUuZ2V0Q3VzdG9tRGF0YSgpLmZpbHRlcigoZGF0YSkgPT4gZGF0YS5nZXRLZXkoKSA9PT0gXCJzb3J0ZXJzXCIpO1xuXHRcdFx0bGV0IHNvcnRlcnM6IFNvcnRlclR5cGVbXSA9IFtdO1xuXHRcdFx0aWYgKHNvcnRlcnNDdXN0b21EYXRhLmxlbmd0aCkgc29ydGVycyA9IHNvcnRlcnNDdXN0b21EYXRhWzBdLmdldFZhbHVlKCkuc29ydGVycztcblxuXHRcdFx0YXdhaXQgdGhpcy5fdXBkYXRlQmluZGluZ1dpdGhUcmFuc2llbnRDb250ZXh0cyhcblx0XHRcdFx0cGF5bG9hZCxcblx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdGJpbmRpbmdJbmZvLFxuXHRcdFx0XHRhZGRpdGlvbmFsVmFsdWVzLFxuXHRcdFx0XHR2YWx1ZUxpc3RQcm9wZXJ0eSxcblx0XHRcdFx0ZmllbGQsXG5cdFx0XHRcdHNvcnRlcnMsXG5cdFx0XHRcdHRhYmxlXG5cdFx0XHQpO1xuXHRcdFx0aWYgKHVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZVJlc29sdmUpIHtcblx0XHRcdFx0Ly9yZXNvbHZlIHRoZSBwcm9taXNlIGFzIGV2ZXJ5dGhpbmcgaXMgY29tcGxldGVkXG5cdFx0XHRcdHVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZVJlc29sdmUoKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly9jYWxsIF91cGRhdGVCaW5kaW5nIGlmIHRoZXJlIGFyZSBubyByZWxldmFudCByZWNvbW1lbmRhdGlvbnNcblx0XHRcdHRoaXMuX3VwZGF0ZUJpbmRpbmcobGlzdEJpbmRpbmcsIGJpbmRpbmdJbmZvKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBhIGZpbHRlciBpbiBhIDxjb2RlPkxpc3RCaW5kaW5nPC9jb2RlPi5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSByZXF1ZXN0ZWRJdGVtcyBOdW1iZXIgb2YgcmVxdWVzdGVkIGl0ZW1zXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBpZiBzZWFyY2ggaXMgZXhlY3V0ZWRcblx0ICovXG5cdGV4ZWN1dGVGaWx0ZXI6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIHJlcXVlc3RlZEl0ZW1zOiBudW1iZXIpIHtcblx0XHRsaXN0QmluZGluZy5nZXRDb250ZXh0cygwLCByZXF1ZXN0ZWRJdGVtcyk7XG5cblx0XHRhd2FpdCB0aGlzLmNoZWNrTGlzdEJpbmRpbmdQZW5kaW5nKHZhbHVlSGVscCwgbGlzdEJpbmRpbmcsIHJlcXVlc3RlZEl0ZW1zKTtcblx0XHRyZXR1cm4gbGlzdEJpbmRpbmc7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgPGNvZGU+TGlzdEJpbmRpbmc8L2NvZGU+IGlzIHdhaXRpbmcgZm9yIGFuIHVwZGF0ZS5cblx0ICogQXMgbG9uZyBhcyB0aGUgY29udGV4dCBoYXMgbm90IGJlZW4gc2V0IGZvciA8Y29kZT5MaXN0QmluZGluZzwvY29kZT4sXG5cdCAqIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gbmVlZHMgdG8gd2FpdC5cblx0ICogQHBhcmFtIF92YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3RCaW5kaW5nIHRvIGNoZWNrXG5cdCAqIEBwYXJhbSByZXF1ZXN0ZWRJdGVtcyBOdW1iZXIgb2YgcmVxdWVzdGVkIGl0ZW1zXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvbmNlIExpc3RCaW5kaW5nIGhhcyBiZWVuIHVwZGF0ZWRcblx0ICovXG5cdGNoZWNrTGlzdEJpbmRpbmdQZW5kaW5nOiBhc3luYyBmdW5jdGlvbiAoX3ZhbHVlSGVscDogVmFsdWVIZWxwLCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHVuZGVmaW5lZCwgcmVxdWVzdGVkSXRlbXM6IG51bWJlcikge1xuXHRcdGxldCBpc1BlbmRpbmcgPSBmYWxzZTtcblx0XHRpZiAobGlzdEJpbmRpbmcgJiYgdGhpcy51cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzLmhhcyhsaXN0QmluZGluZykpIHtcblx0XHRcdGF3YWl0IHRoaXMudXBkYXRlQmluZGluZ0RvbmVQcm9taXNlcy5nZXQobGlzdEJpbmRpbmcpO1xuXHRcdH1cblx0XHRpZiAobGlzdEJpbmRpbmcgJiYgIWxpc3RCaW5kaW5nLmlzU3VzcGVuZGVkKCkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRzID0gYXdhaXQgbGlzdEJpbmRpbmcucmVxdWVzdENvbnRleHRzKDAsIHJlcXVlc3RlZEl0ZW1zKTtcblx0XHRcdFx0aXNQZW5kaW5nID0gY29udGV4dHMubGVuZ3RoID09PSAwO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0aWYgKGVycm9yICYmIChlcnJvciBhcyB7IGNhbmNlbGVkPzogYm9vbGVhbiB9KT8uY2FuY2VsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gaXNQZW5kaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaXNQZW5kaW5nO1xuXHR9LFxuXG5cdGdldFR5cGVNYXA6IGZ1bmN0aW9uIChfdmFsdWVIZWxwOiBWYWx1ZUhlbHApIHtcblx0XHRyZXR1cm4gVHlwZU1hcDtcblx0fSxcblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIGNvbnRlbnQgb2YgdGhlIHZhbHVlIGhlbHAuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHZhbHVlIGhlbHAgaXMgb3BlbmVkIG9yIGEga2V5IG9yIGRlc2NyaXB0aW9uIGlzIHJlcXVlc3RlZC5cblx0ICpcblx0ICogU28sIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgaGVscCBjb250ZW50IHVzZWQsIGFsbCBjb250ZW50IGNvbnRyb2xzIGFuZCBkYXRhIG5lZWQgdG8gYmUgYXNzaWduZWQuXG5cdCAqIE9uY2UgdGhleSBhcmUgYXNzaWduZWQgYW5kIHRoZSBkYXRhIGlzIHNldCwgdGhlIHJldHVybmVkIDxjb2RlPlByb21pc2U8L2NvZGU+IG5lZWRzIHRvIGJlIHJlc29sdmVkLlxuXHQgKiBPbmx5IHRoZW4gZG9lcyB0aGUgdmFsdWUgaGVscCBjb250aW51ZSBvcGVuaW5nIG9yIHJlYWRpbmcgZGF0YS5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGFpbmVyIENvbnRhaW5lciBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudElkIElkIG9mIHRoZSBjb250ZW50IHNob3duIGFmdGVyIHRoaXMgY2FsbCB0byByZXRyaWV2ZUNvbnRlbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIGlmIGFsbCBjb250ZW50IGlzIGF2YWlsYWJsZVxuXHQgKi9cblx0cmV0cmlldmVDb250ZW50OiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRhaW5lcjogQ29udGFpbmVyLCBjb250ZW50SWQ6IHN0cmluZykge1xuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0cmV0dXJuIFZhbHVlTGlzdEhlbHBlci5zaG93VmFsdWVMaXN0KHBheWxvYWQsIGNvbnRhaW5lciwgY29udGVudElkKTtcblx0fSxcblxuXHRfZ2V0Q29uZGl0aW9uUGF5bG9hZExpc3Q6IGZ1bmN0aW9uIChjb25kaXRpb246IENvbmRpdGlvbk9iamVjdCkge1xuXHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSAoY29uZGl0aW9uLnBheWxvYWQgfHwge30pIGFzIENvbmRpdGlvblBheWxvYWRNYXAsXG5cdFx0XHR2YWx1ZUhlbHBRdWFsaWZpZXJzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uUGF5bG9hZE1hcCksXG5cdFx0XHRjb25kaXRpb25QYXlsb2FkTGlzdCA9IHZhbHVlSGVscFF1YWxpZmllcnMubGVuZ3RoID8gY29uZGl0aW9uUGF5bG9hZE1hcFt2YWx1ZUhlbHBRdWFsaWZpZXJzWzBdXSA6IFtdO1xuXG5cdFx0cmV0dXJuIGNvbmRpdGlvblBheWxvYWRMaXN0O1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyBWYWx1ZUxpc3RQcm9wZXJ0eSBmcm9tIFBheWxvYWQgYmFzZWQgb24gZGF0YSBmcm9tIHBheWxvYWQga2V5cyBhbmQgcGFyYW1ldGVycy5cblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBmb3IgZGVsZWdhdGVcblx0ICogQHJldHVybnMgVmFsdWVMaXN0UHJvcGVydHlcblx0ICovXG5cdF9nZXRWYWx1ZUxpc3RQcm9wZXJ0eUZyb21QYXlsb2FkUXVhbGlmaWVyOiBmdW5jdGlvbiAocGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCkge1xuXHRcdGNvbnN0IHBhcmFtcyA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0/LnZoUGFyYW1ldGVycyB8fCBbXTtcblx0XHRjb25zdCBrZXlzID0gcGF5bG9hZC5xdWFsaWZpZXJzW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXT8udmhLZXlzIHx8IFtdO1xuXHRcdGNvbnN0IHByb3BlcnR5S2V5UGF0aCA9IHBheWxvYWQudmFsdWVIZWxwS2V5UGF0aDtcblx0XHRsZXQgZmlsdGVyZWRLZXlzOiBzdHJpbmdbXSA9IFsuLi5rZXlzXTtcblx0XHRjb25zdCBoZWxwUGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0aWYgKHBhcmFtcy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL2NyZWF0ZSBoZWxwUGF0aHMgYXJyYXkgd2hpY2ggd2lsbCBvbmx5IGNvbnNpc3Qgb2YgcGFyYW1zIGhlbHBwYXRoXG5cdFx0XHRwYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW06IEluT3V0UGFyYW1ldGVyKSB7XG5cdFx0XHRcdGhlbHBQYXRocy5wdXNoKHBhcmFtLmhlbHBQYXRoKTtcblx0XHRcdH0pO1xuXHRcdFx0Ly9maWx0ZXIgdGhlIGtleXMgYmFzZWQgb24gaGVscFBhdGhzLiBJZiBrZXkgaXMgbm90IHByZXNlbnQgaW4gaGVscFBhdGggdGhlbiBpdCBpcyB2YWx1ZWxpc3Rwcm9wZXJ0eVxuXHRcdFx0ZmlsdGVyZWRLZXlzID0ga2V5cy5maWx0ZXIoKGtleTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdHJldHVybiAhaGVscFBhdGhzLmluY2x1ZGVzKGtleSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyBmcm9tIGZpbHRlcmVkS2V5cyByZXR1cm4gdGhlIGtleSB0aGF0IG1hdGNoZXMgdGhlIHByb3BlcnR5IG5hbWVcblx0XHRyZXR1cm4gcHJvcGVydHlLZXlQYXRoICYmIGZpbHRlcmVkS2V5cy5pbmNsdWRlcyhwcm9wZXJ0eUtleVBhdGgpID8gcHJvcGVydHlLZXlQYXRoIDogXCJcIjtcblx0fSxcblxuXHRfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvRmlsdGVyQmFyOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0Y29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0W10sXG5cdFx0b3V0UGFyYW1ldGVyczogSW5PdXRQYXJhbWV0ZXJbXSxcblx0XHRmaWx0ZXJCYXI6IEZpbHRlckJhcixcblx0XHRwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLFxuXHRcdGxpc3RSZXBvcnRGaWx0ZXJCYXI6IEZpbHRlckJhclxuXHQpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgc3RhdGU6IEV4dGVybmFsU3RhdGVUeXBlID0gYXdhaXQgU3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShsaXN0UmVwb3J0RmlsdGVyQmFyKTtcblx0XHRcdGNvbnN0IHN0YXRlSXRlbXMgPSBzdGF0ZS5pdGVtczsgLy8gVmlzaWJsZSBGaWx0ZXJJdGVtcyBpbiB0aGUgTFItRmlsdGVyQmFyXG5cdFx0XHRjb25zdCBmaWx0ZXJCYXJQcm9wZXJ0aWVzID0gRmlsdGVyVXRpbHMuZ2V0RmlsdGVyUHJvcGVydHlJbmZvKGZpbHRlckJhciBhcyB1bmtub3duIGFzIElGaWx0ZXJDb250cm9sKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGZpbHRlckJhci5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdC8vIFByb3BhZ2F0ZSBPVVQgcGFyYW1ldGVyIG9ubHkgaWYgdGhlIGZpbHRlciBmaWVsZCBpcyB2aXNpYmxlIGluIHRoZSBMUiBmaWx0ZXJiYXJcblx0XHRcdC8vIExSIEZpbHRlckJhciBvciBMUiBBZGFwdEZpbHRlclxuXHRcdFx0Zm9yIChjb25zdCBvdXRQYXJhbWV0ZXIgb2Ygb3V0UGFyYW1ldGVycykge1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJCYXJQcm9wZXJ0eSA9IHRoaXMuX2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGgoXG5cdFx0XHRcdFx0b3V0UGFyYW1ldGVyLFxuXHRcdFx0XHRcdHBheWxvYWQucHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdG1ldGFNb2RlbCxcblx0XHRcdFx0XHRmaWx0ZXJCYXJQcm9wZXJ0aWVzXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRmaWx0ZXJCYXJQcm9wZXJ0eSAmJlxuXHRcdFx0XHRcdHN0YXRlSXRlbXM/LmZpbmQoXG5cdFx0XHRcdFx0XHQoaXRlbSkgPT5cblx0XHRcdFx0XHRcdFx0aXRlbS5uYW1lID09PSBmaWx0ZXJCYXJQcm9wZXJ0eS5uYW1lICYmXG5cdFx0XHRcdFx0XHRcdChmaWx0ZXJCYXJQcm9wZXJ0eS5tYXhDb25kaXRpb25zID09PSB1bmRlZmluZWQgfHwgZmlsdGVyQmFyUHJvcGVydHkubWF4Q29uZGl0aW9ucyA9PT0gMSlcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vIGlmIHRoZSB0YXJnZXQgZmllbGQgaXMgIHNpbmdsZS12YWx1ZSBmaWVsZCwgcmVzZXQgdGhlIGV4aXN0aW5nIGNvbmRpdGlvbnNcblx0XHRcdFx0XHQvLyBtYXhDb25kaXRpb25zIGlzIGVuc3VyZWQgdG8gYmUgMSBmb3Igc2luZ2xlLXZhbHVlIGZpZWxkXG5cdFx0XHRcdFx0Ly8gbWF4Q29uZGl0aW9ucyA9IC0xIG1lYW5zIG11bHRpcGxlIHZhbHVlcyBhbGxvd2VkXG5cdFx0XHRcdFx0LyogUmVzZXQgdGhlIGNvbmRpdGlvbnMgYmVmb3JlIGNyZWF0ZSBuZXcgY29uZGl0aW9ucyBvdGhlcndpc2UgaXQgZ2V0cyBub3QgdXBkYXRlZCAqL1xuXHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBhdGggPSBmaWx0ZXJCYXJQcm9wZXJ0eS5jb25kaXRpb25QYXRoIGFzIHN0cmluZztcblx0XHRcdFx0XHRpZiAoc3RhdGUuZmlsdGVyW2NvbmRpdGlvblBhdGhdPy5bMF0pIHtcblx0XHRcdFx0XHRcdHN0YXRlLmZpbHRlcltjb25kaXRpb25QYXRoXVswXS5maWx0ZXJlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gUHJvcGFnYXRlIE9VVCBwYXJhbWV0ZXIgZm9yIGVhY2ggY29uZGl0aW9uc1xuXHRcdFx0Zm9yIChjb25zdCBjb25kaXRpb24gb2YgY29uZGl0aW9ucykge1xuXHRcdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkTGlzdCA9IHRoaXMuX2dldENvbmRpdGlvblBheWxvYWRMaXN0KGNvbmRpdGlvbik7XG5cdFx0XHRcdGZvciAoY29uc3Qgb3V0UGFyYW1ldGVyIG9mIG91dFBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRjb25zdCBmaWx0ZXJCYXJQcm9wZXJ0eSA9IHRoaXMuX2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGgoXG5cdFx0XHRcdFx0XHRvdXRQYXJhbWV0ZXIsXG5cdFx0XHRcdFx0XHRwYXlsb2FkLnByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGZpbHRlckJhclByb3BlcnRpZXNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdC8vIFByb3BhZ2F0ZSBPVVQgcGFyYW1ldGVyIG9ubHkgaWYgdGhlIGZpbHRlciBmaWVsZCBpcyB2aXNpYmxlIGluIHRoZSBMUiBmaWx0ZXJiYXJcblx0XHRcdFx0XHQvLyBMUiBGaWx0ZXJCYXIgb3IgTFIgQWRhcHRGaWx0ZXJcblx0XHRcdFx0XHRpZiAoZmlsdGVyQmFyUHJvcGVydHkgJiYgc3RhdGVJdGVtcz8uZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBmaWx0ZXJCYXJQcm9wZXJ0eS5uYW1lKSkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb25kaXRpb25QYXlsb2FkIG9mIGNvbmRpdGlvblBheWxvYWRMaXN0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0NvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVDb25kaXRpb24oXG5cdFx0XHRcdFx0XHRcdFx0XCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcdFtjb25kaXRpb25QYXlsb2FkW291dFBhcmFtZXRlci5oZWxwUGF0aF1dLFxuXHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBhdGggPSBmaWx0ZXJCYXJQcm9wZXJ0eS5jb25kaXRpb25QYXRoIGFzIHN0cmluZztcblx0XHRcdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uQWxyZWFkeUV4aXN0cyA9IHN0YXRlLmZpbHRlcltjb25kaXRpb25QYXRoXT8uZmluZCgodGVzdENvbmRpdGlvbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSB0ZXN0Q29uZGl0aW9uLmZpbHRlcmVkO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHsgZmlsdGVyZWQ6IF9maWx0ZXJlZCwgLi4uY29uZGl0aW9uVG9Db21wYXJlIH0gPSB0ZXN0Q29uZGl0aW9uO1xuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLmNoZWNrQ29uZGl0aW9uc0VxdWFsKGNvbmRpdGlvblRvQ29tcGFyZSwgbmV3Q29uZGl0aW9uKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGVzdENvbmRpdGlvbi5maWx0ZXJlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0aWYgKCFjb25kaXRpb25BbHJlYWR5RXhpc3RzKSB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUuZmlsdGVyW2NvbmRpdGlvblBhdGhdIHx8PSBbXTtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS5maWx0ZXJbY29uZGl0aW9uUGF0aF0ucHVzaChuZXdDb25kaXRpb24pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBBcHBseSB0byB0aGUgcGFyZW50IG9mIHRoZSBGaWx0ZXJGaWVsZFxuXHRcdFx0U3RhdGVVdGlsLmFwcGx5RXh0ZXJuYWxTdGF0ZShmaWx0ZXJCYXIsIHN0YXRlKTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG5cdFx0XHRMb2cuZXJyb3IoYFZhbHVlSGVscERlbGVnYXRlOiAke21lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9LFxuXG5cdF9maW5kRmlsdGVyQmFyUHJvcGVydHlCeUFubm90YXRpb25QYXRoOiBmdW5jdGlvbiAoXG5cdFx0b3V0UGFyYW1ldGVyOiBJbk91dFBhcmFtZXRlcixcblx0XHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0XHRtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRcdGZpbHRlckJhclByb3BlcnRpZXM6IFByb3BlcnR5SW5mb1tdXG5cdCkge1xuXHRcdGNvbnN0IGNvbnRleHRQYXRoID0gYC8ke3Byb3BlcnR5UGF0aC5zcGxpdChcIi9cIilbMV19YDtcblx0XHRjb25zdCBmaWx0ZXJUYXJnZXQgPSBvdXRQYXJhbWV0ZXIuc291cmNlLnNwbGl0KFwiY29uZGl0aW9ucy9cIikucG9wKCkgfHwgXCJcIjtcblx0XHRjb25zdCBsYXN0SW5kZXggPSBwcm9wZXJ0eVBhdGgubGFzdEluZGV4T2YoXCIvXCIpO1xuXHRcdGNvbnN0IGZpbHRlclRhcmdldFBhdGggPSBsYXN0SW5kZXggPiAwID8gYCR7cHJvcGVydHlQYXRoLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpfS8ke2ZpbHRlclRhcmdldH1gIDogZmlsdGVyVGFyZ2V0O1xuXHRcdGNvbnN0IGFubm90YXRpb25QYXRoID0gbWV0YU1vZGVsPy5nZXRSZWR1Y2VkUGF0aChmaWx0ZXJUYXJnZXRQYXRoLCBjb250ZXh0UGF0aCk7XG5cdFx0cmV0dXJuIGZpbHRlckJhclByb3BlcnRpZXMuZmluZCgoaXRlbSkgPT4gaXRlbS5hbm5vdGF0aW9uUGF0aCA9PT0gYW5ub3RhdGlvblBhdGgpO1xuXHR9LFxuXG5cdF9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9CaW5kaW5nQ29udGV4dDogZnVuY3Rpb24gKFxuXHRcdGNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdFtdLFxuXHRcdG91dFBhcmFtZXRlcnM6IEluT3V0UGFyYW1ldGVyW10sXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0dmFsdWVIZWxwOiBWYWx1ZUhlbHBcblx0KSB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXG5cdFx0Zm9yIChjb25zdCBjb25kaXRpb24gb2YgY29uZGl0aW9ucykge1xuXHRcdFx0Y29uc3QgY29uZGl0aW9uUGF5bG9hZExpc3QgPSB0aGlzLl9nZXRDb25kaXRpb25QYXlsb2FkTGlzdChjb25kaXRpb24pLFxuXHRcdFx0XHRvdXRWYWx1ZXMgPSBjb25kaXRpb25QYXlsb2FkTGlzdC5sZW5ndGggPT09IDEgPyBjb25kaXRpb25QYXlsb2FkTGlzdFswXSA6IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKGNvbmRpdGlvblBheWxvYWRMaXN0Lmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXCJWYWx1ZUhlbHBEZWxlZ2F0ZTogUGFyYW1ldGVyT3V0IGluIG11bHRpLXZhbHVlLWZpZWxkIG5vdCBzdXBwb3J0ZWRcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0VmFsdWVzKSB7XG5cdFx0XHRcdHRoaXMuX29uQ29uZGl0aW9uUHJvcGFnYXRpb25VcGRhdGVQcm9wZXJ0eShtZXRhTW9kZWwsIG91dFZhbHVlcywgb3V0UGFyYW1ldGVycywgY29udGV4dCwgdmFsdWVIZWxwKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0X29uQ29uZGl0aW9uUHJvcGFnYXRpb25VcGRhdGVQcm9wZXJ0eTogZnVuY3Rpb24gKFxuXHRcdG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdFx0b3V0VmFsdWVzOiBDb25kaXRpb25QYXlsb2FkVHlwZSxcblx0XHRvdXRQYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdHZhbHVlSGVscDogVmFsdWVIZWxwXG5cdCkge1xuXHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFkYXRhID0gY29udmVydFR5cGVzKG1ldGFNb2RlbCk7XG5cdFx0Y29uc3Qgcm9vdFBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpLmdldFBhdGgoKTtcblx0XHRjb25zdCBjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzID0gY29udGV4dC5pc1RyYW5zaWVudCgpICE9PSB0cnVlICYmICFjb250ZXh0LmlzSW5hY3RpdmUoKTtcblx0XHRjb25zdCBvdXRQYXJhbWV0ZXJTb3VyY2VzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGZvciAoY29uc3Qgb3V0UGFyYW1ldGVyIG9mIG91dFBhcmFtZXRlcnMpIHtcblx0XHRcdC8qIFVwZGF0ZWQgcHJvcGVydHkgdmlhIG91dC1wYXJhbWV0ZXIgaWYgdmFsdWUgY2hhbmdlZCAqL1xuXHRcdFx0dGhpcy5fdXBkYXRlUHJvcGVydHlWaWFPdXRQYXJhbWV0ZXIoXG5cdFx0XHRcdGNvbnZlcnRlZE1ldGFkYXRhLFxuXHRcdFx0XHRyb290UGF0aCxcblx0XHRcdFx0b3V0VmFsdWVzLFxuXHRcdFx0XHRvdXRQYXJhbWV0ZXIsXG5cdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdGNvbnRleHRDYW5SZXF1ZXN0U2lkZUVmZmVjdHNcblx0XHRcdCk7XG5cdFx0XHRvdXRQYXJhbWV0ZXJTb3VyY2VzLnB1c2gob3V0UGFyYW1ldGVyLnNvdXJjZSk7XG5cdFx0fVxuXHRcdGNvbnN0IHZpZXcgPSBDb21tb25VdGlscy5nZXRUYXJnZXRWaWV3KHZhbHVlSGVscCk7XG5cdFx0Y29uc3QgY29sbGFib3JhdGl2ZURyYWZ0ID0gdmlldy5nZXRDb250cm9sbGVyKCkuY29sbGFib3JhdGl2ZURyYWZ0O1xuXHRcdGlmIChjb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSAmJiBvdXRQYXJhbWV0ZXJTb3VyY2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vIHdlIGRldGVybWluZSB0aGUgYmluZGluZyB0aGF0IHNlbmRzIHRoZSByZXF1ZXN0XG5cdFx0XHRsZXQgYmluZGluZztcblx0XHRcdGlmIChjb250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRiaW5kaW5nID0gY29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRiaW5kaW5nID0gdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldEJpbmRpbmcoKTtcblx0XHRcdH1cblx0XHRcdC8qIFRoZSBvdXQgdmFsdWVzIGhhdmUgYmVlbiBjaGFuZ2VkIC0tPiB3YWl0IHVudGlsIHRoZSByZXF1ZXN0IGlzIHNlbnQgdG8gdGhlIHNlcnZlciBiZWZvcmUgc2VuZGluZyBhIG5vdGlmaWNhdGlvbiB0byB0aGUgb3RoZXIgY29sbGFib3JhdG9yc1xuXHRcdFx0XHRcdFx0XHQgV2UgYXR0YWNoIHRoZSBldmVudCBvbiB0aGUgcmlnaHQgYmluZGluZyAqL1xuXHRcdFx0YmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCAoKSA9PiB7XG5cdFx0XHRcdGNvbGxhYm9yYXRpdmVEcmFmdC5zZW5kKHtcblx0XHRcdFx0XHRhY3Rpb246IEFjdGl2aXR5LkNoYW5nZSxcblx0XHRcdFx0XHRjb250ZW50OiBvdXRQYXJhbWV0ZXJTb3VyY2VzLm1hcCgoc291cmNlKSA9PiBjb250ZXh0LmdldFBhdGgoKSArIFwiL1wiICsgc291cmNlKVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblxuXHRfdXBkYXRlUHJvcGVydHlWaWFPdXRQYXJhbWV0ZXI6IGZ1bmN0aW9uIChcblx0XHRjb252ZXJ0ZWRNZXRhZGF0YTogQ29udmVydGVkTWV0YWRhdGEsXG5cdFx0cm9vdFBhdGg6IHN0cmluZyxcblx0XHRvdXRWYWx1ZXM6IENvbmRpdGlvblBheWxvYWRUeXBlLFxuXHRcdG91dFBhcmFtZXRlcjogSW5PdXRQYXJhbWV0ZXIsXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0Y29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0czogYm9vbGVhblxuXHQpIHtcblx0XHQvKiBVcGRhdGVkIHByb3BlcnR5IHZpYSBvdXQtcGFyYW1ldGVyIGlmIHZhbHVlIGNoYW5nZWQgKi9cblx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSBgJHtyb290UGF0aH0vJHtvdXRQYXJhbWV0ZXIuc291cmNlfWA7XG5cdFx0Y29uc3QgdGFyZ2V0UHJvcGVydHkgPSBjb252ZXJ0ZWRNZXRhZGF0YS5yZXNvbHZlUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlQYXRoKS50YXJnZXQ7XG5cdFx0Y29uc3QgZmllbGRDb250cm9sID0gdGFyZ2V0UHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LkZpZWxkQ29udHJvbDtcblx0XHRjb25zdCBkeW5hbWljUmVhZE9ubHkgPSBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihmaWVsZENvbnRyb2wpID8gY29udGV4dC5nZXRQcm9wZXJ0eShmaWVsZENvbnRyb2wucGF0aCkgPT09IDEgOiBmYWxzZTtcblx0XHRpZiAoZHluYW1pY1JlYWRPbmx5ICYmIGNvbnRleHRDYW5SZXF1ZXN0U2lkZUVmZmVjdHMpIHtcblx0XHRcdC8qIE5vbi1UcmFuc2llbnQgYW5kIGFjdGl2ZSBjb250ZXh0ICovXG5cdFx0XHRjb25zdCBsYXN0SW5kZXggPSBvdXRQYXJhbWV0ZXIuc291cmNlLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RQYXRoID0gbGFzdEluZGV4ID4gMCA/IG91dFBhcmFtZXRlci5zb3VyY2Uuc3Vic3RyaW5nKDAsIGxhc3RJbmRleCkgOiBvdXRQYXJhbWV0ZXIuc291cmNlO1xuXHRcdFx0LyogV2Ugc2VuZCBbPHByb3BlcnR5TmFtZT5dIGluIGNhc2Ugb2YgYSBwcm9wZXJ0eSBwYXRoIHdpdGhvdXQgYW55IG5hdmlnYXRpb24gaW52b2x2ZWQgKi9cblx0XHRcdC8qIEluIGNhc2Ugb2YgYSBwYXRoIGludm9sdmluZyBuYXZpZ2F0aW9ucywgd2Ugc2VuZCBbPG5hdmlnYXRpb25QYXRoPl0gZW5kaW5nIHdpdGggYSBuYXZpZ2F0aW9uIHByb3BlcnR5IGFuZCBub3Qgd2l0aCBhIHByb3BlcnR5ICovXG5cdFx0XHRjb250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhbc2lkZUVmZmVjdFBhdGhdKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0LyogVGhlIGZhc3QgY3JlYXRpb24gcm93ICh0cmFuc2llbnQgY29udGV4dCkgY2FuwrR0IGhhdmUgaW5zdGFudCBzcGVjaWZpYyAoZHluYW1pYykgcmVhZC1vbmx5IGZpZWxkcywgdGhlcmVmb3JlIHdlIGRvbsK0dCBuZWVkIHRvIGhhbmRsZS9jb25zaWRlciB0aGlzIGNhc2Ugc3BlY2lmaWNhbGx5ICovXG5cdFx0XHQvKiBBZGRpdGlvbmFsIGluZm9zOiAqL1xuXHRcdFx0LyogVGhlIGZhc3QgY3JlYXRpb24gcm93IGlzIG9ubHkgdXNlZCBieSBTRCAqL1xuXHRcdFx0LyogVGhlIGdyb3VwIElEICh0aGlyZCBhcmd1bWVudCBvZiBzZXRQcm9wZXJ0eSBkZXNjcmliZWQgYXBpIGRvY3VtZW50YXRpb24gb2YgdGhlIENvbnRleHQpIGlzIHVzZWQgZm9yIHRoZSBQQVRDSCByZXF1ZXN0LCBpZiBub3Qgc3BlY2lmaWVkLCB0aGUgdXBkYXRlIGdyb3VwIElEIGZvciB0aGUgY29udGV4dCdzIGJpbmRpbmcgaXMgdXNlZCwgJ251bGwnIHRvIHByZXZlbnQgdGhlIFBBVENIIHJlcXVlc3QgKi9cblx0XHRcdC8qIFRoZSBUcmFuc2llbnQgY29udGV4dCBjYW5ub3QgcmVxdWVzdCBTaWRlRWZmZWN0cyBhbmQgIGNhbm5vdCBwYXRjaCB2aWEgZ3JvdXAgJ251bGwnICovXG5cdFx0XHRjb25zdCBjdXJyZW50VmFsID0gY29udGV4dC5nZXRQcm9wZXJ0eShvdXRQYXJhbWV0ZXIuc291cmNlKTtcblx0XHRcdGNvbnN0IG5ld1ZhbCA9IG91dFZhbHVlc1tvdXRQYXJhbWV0ZXIuaGVscFBhdGhdO1xuXHRcdFx0aWYgKGN1cnJlbnRWYWwgIT09IG5ld1ZhbCkge1xuXHRcdFx0XHRjb250ZXh0LnNldFByb3BlcnR5KG91dFBhcmFtZXRlci5zb3VyY2UsIG51bGwpO1xuXHRcdFx0XHRjb250ZXh0LnNldFByb3BlcnR5KG91dFBhcmFtZXRlci5zb3VyY2UsIG91dFZhbHVlc1tvdXRQYXJhbWV0ZXIuaGVscFBhdGhdKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0LyogSWYgdGhlIGtleSBnZXRzIHVwZGF0ZWQgdmlhIG91dC1wYXJhbWV0ZXIsIHRoZW4gdGhlIGRlc2NyaXB0aW9uIG5lZWRzIGFsc28gcmV0cmlldmVkIHdpdGggcmVxdWVzdFNpZGVFZmZlY3RzICovXG5cdFx0Y29uc3QgdGV4dFBhdGggPSBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRQcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dClcblx0XHRcdD8gdGFyZ2V0UHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQucGF0aFxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0aWYgKHRleHRQYXRoICE9PSB1bmRlZmluZWQgJiYgY29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0Y29uc3QgbGFzdEluZGV4ID0gdGV4dFBhdGgubGFzdEluZGV4T2YoXCIvXCIpO1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdFBhdGggPSBsYXN0SW5kZXggPiAwID8gdGV4dFBhdGguc3Vic3RyaW5nKDAsIGxhc3RJbmRleCkgOiB0ZXh0UGF0aDtcblx0XHRcdC8qIFRoZSBzaWRlRWZmZWN0UGF0aCBjYW4gYmUgWzxwcm9wZXJ0eU5hbWU+XSBvciBbPG5hdmlnYXRpb25QYXRoPl0gKi9cblx0XHRcdGNvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFtzaWRlRWZmZWN0UGF0aF0pO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUHJvdmlkZXMgYSBtYXAgb2YgY29uZGl0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBzaXR1YXRpb25zOlxuXHQgKiBJbml0aWFsIHNldCBvZiBjb25kaXRpb25zIGFwcGxpZWQgZXZlcnkgdGltZSB2YWx1ZSBoZWxwIGNvbnRlbnQgaXMgc2hvd24gZm9yIHRoZSBmaXJzdCB0aW1lIHNpbmNlIG9wZW5pbmcgaXRzIGNvbnRhaW5lci5cblx0ICogRGV0YWlsZWQgc2V0IG9mIGNvbmRpdGlvbnMgaW4gZ2V0SXRlbUZvclZhbHVlIHNjZW5hcmlvcyB0aGF0IGFsbG93IHlvdSB0byBmaW5kIGEgc3BlY2lmaWMgdmFsdWUgaGVscCBpdGVtIChpbmRpY2F0ZWQgYnkgY29uZmlnIGF2YWlsYWJpbGl0eSkuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIFZhbHVlSGVscCBjb250cm9sIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IFZhbHVlSGVscCBjb250ZW50IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb25maWcgQ29uZmlndXJhdGlvbiBvYmplY3Rcblx0ICogQHJldHVybnMgUmV0dXJucyBhIHByb21pc2UgcmVzb2x2aW5nIHRvIGEgbWFwIG9mIGNvbmRpdGlvbnNcblx0ICovXG5cdGdldEZpbHRlckNvbmRpdGlvbnM6IGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogQ29udGVudCwgY29uZmlnPzogTURDQ29uZmlnVHlwZSkge1xuXHRcdGlmICh0aGlzLmdldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9ucyh2YWx1ZUhlbHAsIGNvbnRlbnQsIChjb25maWcgJiYgY29uZmlnLmNvbnRyb2wpIHx8IChjb250ZW50ICYmIGNvbnRlbnQuZ2V0Q29udHJvbCgpKSk7XG5cdFx0fVxuXHRcdHJldHVybiB7fTtcblx0fSxcblxuXHQvKipcblx0ICogQ2FsbGJhY2sgaW52b2tlZCBldmVyeSB0aW1lIGEge0BsaW5rIHNhcC51aS5tZGMuVmFsdWVIZWxwIFZhbHVlSGVscH0gZmlyZXMgYSBzZWxlY3QgZXZlbnQgb3IgdGhlIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGNoYW5nZXNcblx0ICogVGhpcyBjYWxsYmFjayBtYXkgYmUgdXNlZCB0byB1cGRhdGUgZXh0ZXJuYWwgZmllbGRzLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFZhbHVlSGVscCBjb250cm9sIGluc3RhbmNlIHJlY2VpdmluZyB0aGUgPGNvZGU+Y29udHJvbENoYW5nZTwvY29kZT5cblx0ICogQHBhcmFtIHJlYXNvbiBSZWFzb24gd2h5IHRoZSBtZXRob2Qgd2FzIGludm9rZWRcblx0ICogQHBhcmFtIF9jb25maWcgQ3VycmVudCBjb25maWd1cmF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBjYWxsaW5nIGNvbnRyb2xcblx0ICogQHNpbmNlIDEuMTAxLjBcblx0ICovXG5cdG9uQ29uZGl0aW9uUHJvcGFnYXRpb246IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgcmVhc29uOiBzdHJpbmcsIF9jb25maWc6IHVua25vd24pIHtcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdGlmIChyZWFzb24gIT09IFwiQ29udHJvbENoYW5nZVwiIHx8IHBheWxvYWQuaXNEZWZpbmVDb25kaXRpb25WYWx1ZUhlbHApIHtcblx0XHRcdC8vIGhhbmRsZSBvbmx5IENvbnRyb2xDaGFuZ2UgcmVhc29uXG5cdFx0XHQvLyBhbHNvIGRvbid0IGhhbmRsZSBmb3IgZGVmaW5lIGNvbmRpdGlvbiB2YWx1ZSBoZWxwIGFzIHByb3BhZ2F0aW5nIGNvbmRpdGlvbnMgb24gdGhlIHZhbHVlIGhlbHBcblx0XHRcdC8vIHRvIGRlZmluZSBjb25kaXRpb25zIGRvZXMgbm90IG1ha2Ugc2Vuc2UgYnV0IHdvdWxkIG9ubHkgY29uZnVzZSB1c2VycyBieSBhbGxvd2luZyByZWN1cnNpdmUgdXNlXG5cdFx0XHQvLyBvZiB0aGUgY29uZGl0aW9uIHZhbHVlIGhlbHBcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgcXVhbGlmaWVyID0gcGF5bG9hZC5xdWFsaWZpZXJzW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXTtcblx0XHRjb25zdCBvdXRQYXJhbWV0ZXJzID0gcXVhbGlmaWVyPy52aFBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCA/IFZhbHVlTGlzdEhlbHBlci5nZXRPdXRQYXJhbWV0ZXJzKHF1YWxpZmllci52aFBhcmFtZXRlcnMpIDogW10sXG5cdFx0XHRmaWVsZCA9IHZhbHVlSGVscC5nZXRDb250cm9sKCkgYXMgRmllbGRCYXNlLFxuXHRcdFx0ZmllbGRQYXJlbnQgPSBmaWVsZC5nZXRQYXJlbnQoKSBhcyBGaWx0ZXJCYXJCYXNlIHwgQ29udHJvbDtcblxuXHRcdGxldCBjb25kaXRpb25zID0gZmllbGQuZ2V0Q29uZGl0aW9ucygpIGFzIENvbmRpdGlvbk9iamVjdFtdO1xuXHRcdGlmICghcGF5bG9hZC5pc1ZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcykge1xuXHRcdFx0dGhpcy5fc2V0SGlzdG9yeURhdGEocGF5bG9hZCwgY29uZGl0aW9ucywgZmllbGQpO1xuXHRcdH1cblx0XHRjb25kaXRpb25zID0gY29uZGl0aW9ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuXHRcdFx0Y29uc3QgY29uZGl0aW9uUGF5bG9hZE1hcCA9IChjb25kaXRpb24ucGF5bG9hZCB8fCB7fSkgYXMgQ29uZGl0aW9uUGF5bG9hZE1hcDtcblx0XHRcdHJldHVybiBjb25kaXRpb25QYXlsb2FkTWFwW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXTtcblx0XHR9KTtcblxuXHRcdGNvbnN0IGxpc3RSZXBvcnRGaWx0ZXJCYXIgPSBmaWVsZC5nZXRQYXJlbnQoKSBhcyBGaWx0ZXJCYXJCYXNlIHwgQ29udHJvbDsgLy8gQ29udHJvbCBlLmcuIEZvcm1Db250YWluZXJcblx0XHRpZiAobGlzdFJlcG9ydEZpbHRlckJhci5pc0EoRmVDb3JlQ29udHJvbHNGaWx0ZXJCYXIpICYmIG91dFBhcmFtZXRlcnMubGVuZ3RoICYmIGNvbmRpdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHQvLyBQcm9wYWdhdGUgdGhlIHZhbHVlIG9ubHkgaWYgdGhlIEZpbHRlckZpZWxkIGlzIHBhcnQgb2YgdGhlIExSLUZpbHRlckJhciBhbHNvIGluc2lkZSBpbiBBZGFwdCBGaWx0ZXJzIGRpYWxvZ1xuXHRcdFx0YXdhaXQgdGhpcy5fb25Db25kaXRpb25Qcm9wYWdhdGlvblRvRmlsdGVyQmFyKFxuXHRcdFx0XHRjb25kaXRpb25zLFxuXHRcdFx0XHRvdXRQYXJhbWV0ZXJzLFxuXHRcdFx0XHRmaWVsZFBhcmVudCBhcyBGaWx0ZXJCYXIsXG5cdFx0XHRcdHBheWxvYWQsXG5cdFx0XHRcdGxpc3RSZXBvcnRGaWx0ZXJCYXIgYXMgRmlsdGVyQmFyXG5cdFx0XHQpO1xuXHRcdFx0Ly8gTFIgU2V0dGluZ3MgRGlhbG9nIG9yIE9QIFNldHRpbmdzIERpYWxvZyBzaGFsbCBub3QgcHJvcGFnYXRlIHZhbHVlIHRvIHRoZSBkaWFsb2cgZmlsdGVyZmllbGRzIG9yIGNvbnRleHRcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gT2JqZWN0IFBhZ2Vcblx0XHRcdC8qIFRvIGF2b2lkIHRpbWluZyBpc3N1ZSB3ZSB1c2UgdGhlIEJpbmRpbmdDb250ZXh0IG9mIHRoZSBjb250cm9sIGluc3RlYWQgb2YgdGhlIFZhbHVlSGVscCAoQkNQIDIzODAwNTcyMjcpICovXG5cdFx0XHRjb25zdCBjb250ZXh0ID0gZmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChjb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IChmaWVsZC5nZXRNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gbWV0YU1vZGVsPy5nZXRPYmplY3QoYCR7cGF5bG9hZC5wcm9wZXJ0eVBhdGh9QHNhcHVpLm5hbWVgKTtcblx0XHRcdFx0Y29uc3QgY29uZGl0aW9uID0gY29uZGl0aW9ucy5sZW5ndGggPiAwID8gY29uZGl0aW9uc1swXSA6ICh7fSBhcyBDb25kaXRpb25PYmplY3QpO1xuXHRcdFx0XHRjb25zdCBwYXlsb2FkS2V5cyA9IGNvbmRpdGlvbj8ucGF5bG9hZCA/IE9iamVjdC5rZXlzKGNvbmRpdGlvbi5wYXlsb2FkKSA6IFtdO1xuXHRcdFx0XHRwYXlsb2FkS2V5cy5mb3JFYWNoKChwYXlsb2FkS2V5KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uUGF5bG9hZE1hcCA9IGNvbmRpdGlvbi5wYXlsb2FkIGFzIENvbmRpdGlvblBheWxvYWRNYXAgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uUGF5bG9hZCA9IGNvbmRpdGlvblBheWxvYWRNYXA/LltwYXlsb2FkS2V5XT8uWzBdIHx8IHt9O1xuXHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblZhbHVla2V5cyA9IE9iamVjdC5rZXlzKGNvbmRpdGlvblBheWxvYWQpO1xuXHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblZhbHVla2V5ID0gY29uZGl0aW9uVmFsdWVrZXlzLmZpbmQoKHZhbHVlS2V5KSA9PiB2YWx1ZUtleS5pbmNsdWRlcyhcIkAkdWk1LmZlLkBDb21tb24vRXh0ZXJuYWxJRFwiKSk7XG5cdFx0XHRcdFx0aWYgKGNvbmRpdGlvblZhbHVla2V5KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBrZXlWYWx1ZSA9IGNvbmRpdGlvblBheWxvYWRbY29uZGl0aW9uVmFsdWVrZXldO1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGtleVZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9CaW5kaW5nQ29udGV4dChjb25kaXRpb25zLCBvdXRQYXJhbWV0ZXJzLCBjb250ZXh0LCB2YWx1ZUhlbHApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBpbml0aWFsIGZpbHRlciBjb25kaXRpb24gYmFzZWQgb24gdGhlIHByb3ZpZGVkIHZhbHVlIGFuZCBmbGFnIGluZGljYXRpbmcgaWYgdGhlIGluaXRpYWwgdmFsdWUgaXMgc2lnbmlmaWNhbnQuXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgZm9yIHRoZSBmaWx0ZXIgY29uZGl0aW9uLlxuXHQgKiBAcGFyYW0gaW5pdGlhbFZhbHVlSXNTaWduaWZpY2FudCBGbGFnIGluZGljYXRpbmcgaWYgdGhlIGluaXRpYWwgdmFsdWUgaXMgc2lnbmlmaWNhbnQuXG5cdCAqIEByZXR1cm5zIFRoZSBmaWx0ZXIgY29uZGl0aW9uLlxuXHQgKi9cblx0X2NyZWF0ZUluaXRpYWxGaWx0ZXJDb25kaXRpb246IGZ1bmN0aW9uICh2YWx1ZTogVmFsdWUsIGluaXRpYWxWYWx1ZUlzU2lnbmlmaWNhbnQ6IGJvb2xlYW4pIHtcblx0XHRsZXQgY29uZGl0aW9uOiBDb25kaXRpb25PYmplY3QgfCB1bmRlZmluZWQ7XG5cblx0XHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVmFsdWVIZWxwRGVsZWdhdGU6IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBjb3VsZCBub3QgYmUgcmVxdWVzdGVkXCIpO1xuXHRcdH0gZWxzZSBpZiAoKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlID09PSBudWxsKSAmJiBpbml0aWFsVmFsdWVJc1NpZ25pZmljYW50KSB7XG5cdFx0XHRjb25kaXRpb24gPSBDb25kaXRpb24uY3JlYXRlQ29uZGl0aW9uKFwiRW1wdHlcIiwgW10sIG51bGwsIG51bGwsIENvbmRpdGlvblZhbGlkYXRlZC5WYWxpZGF0ZWQpO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gXCJcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuXHRcdFx0Y29uZGl0aW9uID0gQ29uZGl0aW9uLmNyZWF0ZUNvbmRpdGlvbihcIkVRXCIsIFt2YWx1ZV0sIG51bGwsIG51bGwsIENvbmRpdGlvblZhbGlkYXRlZC5WYWxpZGF0ZWQpO1xuXHRcdH1cblx0XHRyZXR1cm4gY29uZGl0aW9uO1xuXHR9LFxuXG5cdF9nZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9uc0Zyb21CaW5kaW5nOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0aW5Db25kaXRpb25zOiBDb25kaXRpb25PYmplY3RNYXAsXG5cdFx0Y29udHJvbDogQ29udHJvbCxcblx0XHRpblBhcmFtZXRlcnM6IEluT3V0UGFyYW1ldGVyW10sXG5cdFx0cGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZFxuXHQpIHtcblx0XHRjb25zdCBiaW5kaW5nQ29udGV4dCA9IGNvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRpZiAoIWJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJWYWx1ZUhlbHBEZWxlZ2F0ZTogTm8gQmluZGluZ0NvbnRleHRcIik7XG5cdFx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHRcdH1cblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250cm9sLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdGNvbnN0IHJvb3RQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0bGV0IHByb3BlcnRpZXNUb1JlcXVlc3QgPSBpblBhcmFtZXRlcnMubWFwKChpblBhcmFtZXRlcikgPT4gaW5QYXJhbWV0ZXIuc291cmNlKTtcblx0XHQvKiBJbiBjYXNlIG9mIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nLCB3aGljaCBjYW4gYmUgaWRlbnRpZmllZCBieSB0aGUgcGF0aCBcIiRQYXJhbWV0ZXJcIiwgdGhlIGJpbmRpbmcgY29udGV4dCBpcyBhbHdheXMgcmVsYXRpdmUgdG8gdGhlIGluLXBhcmFtZXRlcnMuICovXG5cdFx0LyogV2UgbmVlZCB0byByZXF1ZXN0IHRoZSBpbi1wYXJhbWV0ZXIgdmFsdWVzIHJlbGF0aXZlIHRvIHRoZSBiaW5kaW5nIGNvbnRleHQuXG5JbiBzb21lIGNhc2VzIChlLmcuIG11bHRpIHZhbHVlIGZpZWxkKSwgdGhlIGJpbmRpbmcgY29udGV4dCBkb2VzIG5vdCBwb2ludCB0byB0aGVcblZIIGFubm90YXRpb24gdGFyZ2V0LCB0aHVzIHdlIGlkZW50aWZ5IHRoZSBuZWVkZWQgbmF2aWdhdGlvbiByZWxhdGlvbiBieVxucmVkdWNpbmcgdGhlIHBheWxvYWQucHJvcGVydHlQYXRoIGJ5IHRoZSBwYXRoIGRlcml2ZWQgZnJvbSBiaW5kaW5nIGNvbnRleHQuXG5UaGlzIGNhbm5vdCBoYXBwZW4gaW4gY2FzZSBvZiBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZywgd2hpY2ggY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdGggXCIkUGFyYW1ldGVyXCIuXG4qL1xuXG5cdFx0Ly8gQ2hlY2sgd2hldGhlciB0aGUgZmlsdGVyIHByb3BlcnR5IHdpdGggbmF2aWdhdGlvbiBwYXRoIGV4aXN0cywgb3RoZXJ3aXNlIHRoZSBtZXRhZGF0YSBhcmUgbm90IHdlbGwgZGVmaW5lZFxuXHRcdGxldCBtZXRhRGF0YUVycm9yID0gZmFsc2U7XG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gcGF5bG9hZC5wcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpLnBvcCgpO1xuXHRcdGxldCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoO1xuXHRcdGxldCBuYXZpZ2F0aW9uUHJvcGVydHk7XG5cblx0XHQvL0ZvciBhIFZIIG9uIGFuIGFjdGlvbiBkaWFsb2cgcGFyYW1ldGVyIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCBmaWxsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcblx0XHQvL3dpdGggdGhlIGFjdGlvbiBldmVuIHRob3VnaCBubyBuYXZpZ2F0aW9uIHByb3BlcnR5IGV4aXN0cyAtPiBsZWF2ZSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGVtcHR5XG5cdFx0aWYgKGJpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKS5nZXRQYXRoKCkgIT09IFwiJFBhcmFtZXRlclwiKSB7XG5cdFx0XHRuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gcGF5bG9hZC5wcm9wZXJ0eVBhdGgucmVwbGFjZShgLyR7cHJvcGVydHlOYW1lfWAsIFwiXCIpO1xuXHRcdFx0bmF2aWdhdGlvblByb3BlcnR5ID0gbWV0YU1vZGVsLmdldE9iamVjdChuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0XHR9XG5cblx0XHRpZiAoY29udHJvbC5pc0EoXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKSAmJiBuYXZpZ2F0aW9uUHJvcGVydHkgJiYgbmF2aWdhdGlvblByb3BlcnR5LiRQYXJ0bmVyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vQ2FzZSBtZGMuTXVsdGlWYWx1ZUZpZWxkOiB0aGUgJFBhcnRuZXIgKGFzc29jaWF0aW9uIHRvIG9uZSkgaXMgYSBwcmVjb25kaXRpb24gdG8gcmVxdWVzdCB0aGUgZmlsdGVyIHZhbHVlXG5cdFx0XHQvL0V4Y2VwdGlvbjogV2hlbiB0aGUgTXVsdGlWYWx1ZUZpZWxkIGlzIGFuIGFjdGlvbiBwYXJhbWV0ZXIgdGhlbiB0aGUgY29udGV4dCBvZiB0aGUgYWN0aW9uIGlzIHVzZWQgdG8gZmlsbCB0aGUgaW4gcGFyYW1ldGVyIGFuZFxuXHRcdFx0Ly9ubyAkUGFydG5lciBhc3NvY2lhdGlvbiBpcyBuZWVkZWQuIEZvciBzdWNoIGNhc2VzIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggaXMgbm8gZmlsbGVkXG5cdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdGBWYWx1ZUhlbHBEZWxlZ2F0ZTogQmVjYXVzZSBvZiBtaXNzaW5nIHBhcnRuZXIgZGVmaW5pdGlvbiwgdGhlIGZpbHRlciB2YWx1ZSBmb3IgVmFsdWVMaXN0UGFyYW1ldGVySW4gcHJvcGVydHkgY2FuIG5vdCByZXF1ZXN0ZWQuYFxuXHRcdFx0KTtcblx0XHRcdG1ldGFEYXRhRXJyb3IgPSB0cnVlO1xuXHRcdH0gZWxzZSBpZiAobmF2aWdhdGlvblByb3BlcnR5ICYmIG5hdmlnYXRpb25Qcm9wZXJ0eS4ka2luZCA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJiBuYXZpZ2F0aW9uUHJvcGVydHkuJFBhcnRuZXIgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cHJvcGVydGllc1RvUmVxdWVzdCA9IHRoaXMuX2J1aWxkUHJvcGVydGllc1RvUmVxdWVzdChwcm9wZXJ0aWVzVG9SZXF1ZXN0LCByb290UGF0aCwgbWV0YU1vZGVsLCBwYXlsb2FkLnByb3BlcnR5UGF0aCk7XG5cdFx0fVxuXHRcdGlmICghbWV0YURhdGFFcnJvcikge1xuXHRcdFx0Ly8gVXBkYXRlR3JvdXBJZCBpcyAkYXV0byBpcyB1c2VkIGluIGNhc2Ugb2YgY3JlYXRpb24gcm93LlxuXHRcdFx0Ly8gVXBkYXRlR3JvdXBJZCBpcyBzdWJtaXRMYXRlciBpbiBjYXNlIG9mIGNyZWF0ZSBkaWFsb2cuXG5cdFx0XHQvLyBXZSBuZWVkIHRvIGNvbnNpZGVyIHRoZSBjYXNlIG9mIGlzSW5hY3RpdmUgY29udGV4dCwgd2hpY2ggaXMgbm90IHlldCBjcmVhdGVkLlxuXHRcdFx0Y29uc3QgY29udGV4dFVuZGVyQ3JlYXRpb24gPVxuXHRcdFx0XHRiaW5kaW5nQ29udGV4dC5pc1RyYW5zaWVudCgpID09PSB0cnVlICYmXG5cdFx0XHRcdCFiaW5kaW5nQ29udGV4dC5pc0luYWN0aXZlKCkgJiZcblx0XHRcdFx0YmluZGluZ0NvbnRleHQuZ2V0VXBkYXRlR3JvdXBJZCgpPy5zdGFydHNXaXRoKFwiJGF1dG9cIik7XG5cdFx0XHRsZXQgZXJyb3JNZXNzYWdlc0luQ29udGV4dCA9IFtdO1xuXHRcdFx0ZXJyb3JNZXNzYWdlc0luQ29udGV4dCA9IChiaW5kaW5nQ29udGV4dC5nZXRNZXNzYWdlcygpID8/IFtdKS5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VHlwZSgpID09PSBNZXNzYWdlVHlwZS5FcnJvcjtcblx0XHRcdH0pO1xuXHRcdFx0Ly8gV2UgYXdhaXQgY3JlYXRpb24gaWYgaXQgaXMgc3RpbGwgaW4gcHJvY2Vzcy5cblx0XHRcdGlmIChjb250ZXh0VW5kZXJDcmVhdGlvbiAmJiAhZXJyb3JNZXNzYWdlc0luQ29udGV4dD8ubGVuZ3RoKSB7XG5cdFx0XHRcdGF3YWl0IGJpbmRpbmdDb250ZXh0Py5jcmVhdGVkKCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBBY2NvcmRpbmcgdG8gb2RhdGEgdjQgYXBpIGRvY3VtZW50YXRpb24gZm9yIHJlcXVlc3RQcm9wZXJ0eTogUHJvcGVydHkgdmFsdWVzIHRoYXQgYXJlIG5vdCBjYWNoZWQgeWV0IGFyZSByZXF1ZXN0ZWQgZnJvbSB0aGUgYmFjayBlbmRcblx0XHRcdGNvbnN0IHZhbHVlcyA9IGF3YWl0IGJpbmRpbmdDb250ZXh0LnJlcXVlc3RQcm9wZXJ0eShwcm9wZXJ0aWVzVG9SZXF1ZXN0KTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBpblBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y29uc3QgaW5QYXJhbWV0ZXIgPSBpblBhcmFtZXRlcnNbaV07XG5cdFx0XHRcdGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMuX2NyZWF0ZUluaXRpYWxGaWx0ZXJDb25kaXRpb24odmFsdWVzW2ldLCBpblBhcmFtZXRlci5pbml0aWFsVmFsdWVJc1NpZ25pZmljYW50KTtcblxuXHRcdFx0XHRpZiAoY29uZGl0aW9uKSB7XG5cdFx0XHRcdFx0aW5Db25kaXRpb25zW2luUGFyYW1ldGVyLmhlbHBQYXRoXSA9IFtjb25kaXRpb25dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBpbkNvbmRpdGlvbnM7XG5cdH0sXG5cblx0X2J1aWxkUHJvcGVydGllc1RvUmVxdWVzdDogZnVuY3Rpb24gKHByb3BlcnRpZXNUb1JlcXVlc3Q6IHN0cmluZ1tdLCByb290UGF0aDogc3RyaW5nLCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBwcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdC8qXG5cdFx0XHRcdFRoZSBpblBhcmFtZXRlcnMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBoZWxwIGRlZmluaXRpb24sIGkuZS4gdGhlaXIgc291cmNlIGlzIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgYW5ub3RhdGlvbiB0YXJnZXQgKG9yIG1vcmUgcHJlY2lzZWx5IHRoZSBFbnRpdHlTZXQgdGhlIGFubm90YXRpb24gdGFyZ2V0IGJlbG9uZ3MgdG8pLiBUaGUgYW5ub3RhdGlvbiB0YXJnZXQgaXMgdGhlIHByb3BlcnR5IHRoZSB2YWx1ZSBoZWxwIGlzIGRlZmluZWQgZm9yLlxuXHRcdFx0XHRUbyByZXF1ZXN0IHRoZSB2YWx1ZXMgZm9yIHRoZSBpblBhcmFtZXRlcnMgZnJvbSB0aGUgYmluZGluZ0NvbnRleHQgKHRoZSBjb250cm9sIGlzIGJvdW5kIHRvKSwgd2UgbmVlZCB0byB0cmFuc2xhdGUgdGhpcyB0byBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIGJpbmRpbmdDb250ZXh0LiBUaGlzIGRpZmZlcnMsIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZCBmb3IgYSBkaXJlY3QgcHJvcGVydHksIGJ1dCB3aXRoIGEgcGF0aCBjb250YWluaW5nIG9uZSBvciBtb3JlIG5hdmlnYXRpb24gcHJvcGVydGllcyAoZXNwLiBuZWNlc3NhcnkgdG8gZGVmaW5lIG11bHRpIHZhbHVlIGZpZWxkcykuXG5cdFx0XHRcdFRvIG1ha2UgdGhpcyB0cmFuc2xhdGlvbiBwb3NzaWJsZSwgdGhlIHBheWxvYWQgcHJvdmlkZXMgdGhlIHByb3BlcnR5UGF0aCwgd2hpY2ggaXMgYW4gYWJzb2x1dGUgbWV0YVBhdGggdG8gdGhlIHByb3BlcnR5IChpLmUuIGluY2x1ZGluZyB0aGUgY29ycmVzcG9uZGluZyBtZXRhUGF0aCBmb3IgdGhlIGJpbmRpbmcgY29udGV4dCBhbmQgdGhlIGFkZGl0aW9uYWwgcGF0aCB0aGUgcHJvcGVydHkgaXMgYm91bmQgdG8pLlxuXG5cdFx0XHRcdFNvIGZhciwgdGhpcyBtZWFucyB3ZSBoYXZlIHRvIHJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBtZXRhUGF0aCBvZiB0aGUgYmluZGluZ0NvbnRleHQgZnJvbSB0aGUgbGVmdCBzaWRlLCBhbmQgdGhlIGxhc3Qgc2VnbWVudCAodGhlIHByb3BlcnR5IGl0c2VsZikgZnJvbSB0aGUgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHByb3BlcnR5UGF0aCBwcm92aWRlZCBpbiB0aGUgcGF5bG9hZCwgdG8gZ2V0IGEgbWV0YVBhdGggZnJvbSB0aGUgYmluZGluZyBjb250ZXh0IHRvIHRoZSBhbm5vdGF0aW9uIHRhcmdldC5cblx0XHRcdFx0SWYgdGhpcyBtZXRhUGF0aCBjb250YWlucyAxOm4tbmF2aWdhdGlvbnMgKHdoaWNoIGNhbm5vdCBiZSB0cmFuc2xhdGVkIGJhY2sgdG8gYSBwYXRoLCBhcyB0aGlzIHdvdWxkIG1lYW4gdG8gYWRkIGNvcnJlc3BvbmRpbmcga2V5cywgd2hpY2ggYXJlIG5vdCBrbm93biksIHRoZSBzb3VyY2UgcGF0aCBpbiB0aGUgaW5QYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiB0aGUgdmFsdWUgbmVlZHMgdG8gcG9pbnQgYmFjayB1c2luZyB0aGUgY29ycmVzcG9uZGluZyBwYXJ0bmVyIG5hdmlnYXRpb24ocykgdG8gYXZvaWQgYW1iaWd1b3VzIGRlZmluaXRpb24gb2YgaG93IHRvIGdldCBpdHMgdmFsdWUuXG5cdFx0XHRcdFRodXMsIHdlIGNhbiBhbmQgbmVlZCB0byBtYXRjaCBhbmQgcmVkdWNlIHRoZSBwYXJ0cyBvZiB0aGlzIHJlbGF0aXZlIG1ldGFQYXRoIGZyb20gdGhlIHJpZ2h0IHNpZGUgYWdhaW5zdCB0aGUgY29ycmVzcG9uZGluZyBwYXJ0cyBvZiB0aGUgaW5QYXJhbWV0ZXJzIHNvdXJjZSBkZWZpbml0aW9uIGZyb20gdGhlIGxlZnQgc2lkZSBieSBjaGVja2luZyB3aGV0aGVyIHRoZXkgYXJlIGNvcnJlc3BvbmRpbmcgcGFydG5lciBuYXZpZ2F0aW9ucy4gV2hlbiB3ZSBhcmUgZG9uZSAobm8gbW9yZSBwYXJ0cyBpbiByZWR1Y2VkIHJlbGF0aXZlIG1ldGFQYXRoLCBubyBtb3JlIHBhcnRzIGluIHJlZHVjZWQgaW5QYXJhbWV0ZXIgc291cmNlIHBhdGgsIG9yIG1vc3QgcmlnaHQgcGFydCBpbiByZWR1Y2VkIHJlbGF0aXZlIG1ldGFQYXRoIGlzIG5vdCB0aGUgcGFydG5lciBvZiBtb3N0IGxlZnQgcGFydCBpbiByZWR1Y2VkIGluUGFyYW1ldGVyIHNvdXJjZSksIG5laXRoZXIgcmVkdWNlZCByZWxhdGl2ZSBtZXRhUGF0aCBub3IgcmVkdWNlZCBpblBhcmFtZXRlciBzb3VyY2UgcGF0aCBtYXkgY29udGFpbiBhbnkgMTpuLW5hdmlnYXRpb24gcHJvcGVydGllcy5cblx0XHRcdFx0SWYgdGhpcyBjb25kaXRpb24gaXMgZnVsZmlsbGVkLCB3ZSBjYW4gY29tYmluZSB0aGUgYW5kIHJlcXVlc3QgZnJvbSB0aGUgZ2l2ZW4gYmluZGluZyBjb250ZXh0LiBJZiBub3QsIHRoZSB2YWx1ZSBoZWxwIGRlZmluaXRpb24gZG9lcyBub3QgYWxsb3cgdG8gcmV0cmlldmUgdGhlIGluUGFyYW1ldGVycyB2YWx1ZSBpbiBhbiB1bmFtYmlndW91cyB3YXksIGkudC4gdGhlIHZhbHVlIGhlbHAgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5LlxuXHRcdFx0XHQqL1xuXHRcdC8vIGNvbW1vbiBmb3IgYWxsIGluUGFyYW1ldGVyc1xuXHRcdGxldCBtZXRhTW9kZWxDb250ZXh0ID0gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHJvb3RQYXRoKSBhcyBPRGF0YVY0Q29udGV4dDtcblx0XHRjb25zdCByZWxhdGl2ZVBhdGhQYXJ0cyA9IHByb3BlcnR5UGF0aFxuXHRcdFx0LnNsaWNlKHJvb3RQYXRoLmxlbmd0aCkgLy8gcmVtb3ZlIHJvb3QgcGF0aFxuXHRcdFx0LnNwbGl0KFwiL1wiKSAvLyB0cmFuc2Zvcm0gdG8gYXJyYXlcblx0XHRcdC5zbGljZSgxLCAtMSkgLy8gcmVtb3ZlIGZpcnN0IChlbXB0eSwgYXMgcm9vdFBhdGggcHJvdmlkZWQgd2l0aG91dCBlbmRpbmcgXCIvXCIpLCBhbmQgbGFzdCAocHJvcGVydHkgdGhlIFZIIGlzIGF0dGFjaGVkIHRvKSBwYXJ0XG5cdFx0XHQubWFwKChwYXJ0KSA9PiB7XG5cdFx0XHRcdC8vIGRldGVybWluZSBuYXZpZ2F0aW9uIHByb3BlcnR5IG5hbWUgYW5kIGNvcnJlc3BvbmRpbmcgcGFydG5lciBmb3IgZWFjaCBuYXZpZ2F0aW9uIHN0ZXBcblx0XHRcdFx0bWV0YU1vZGVsQ29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChwYXJ0LCBtZXRhTW9kZWxDb250ZXh0KSBhcyBPRGF0YVY0Q29udGV4dDtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRwYXJ0OiBwYXJ0LFxuXHRcdFx0XHRcdHBhcnRuZXI6IG1ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KCkuJFBhcnRuZXJcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXHRcdC8vIGFjdHVhbCByZWR1Y3Rpb24gcGVyIGluUGFyYW1ldGVyXG5cdFx0cmV0dXJuIHByb3BlcnRpZXNUb1JlcXVlc3QubWFwKChsb2NhbERhdGFQYXRoKSA9PiB7XG5cdFx0XHRjb25zdCBsb2NhbERhdGFQYXJ0cyA9IGxvY2FsRGF0YVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0Y29uc3QgbWF0Y2hDb3VudCA9IGxvY2FsRGF0YVBhcnRzLmZpbmRJbmRleChcblx0XHRcdFx0KFxuXHRcdFx0XHRcdHBhcnQsXG5cdFx0XHRcdFx0aW5kZXggLy8gZmluZCBmaXJzdCBub24tbWF0Y2hpbmcgaW5kZXhcblx0XHRcdFx0KSA9PiByZWxhdGl2ZVBhdGhQYXJ0c1staW5kZXhdPy5wYXJ0bmVyICE9PSBwYXJ0XG5cdFx0XHQpOyAvLyByZWxhdGl2ZVBhdGhQYXJ0cyB0byBtYXRjaCBmcm9tIHRoZSBlbmQgKD0+IFwiLWluZGV4XCIpIHRvIGxvY2FsRGF0YVBhcnRzIGZyb20gdGhlIGJlZ2lubmluZ1xuXHRcdFx0Ly8gbGFzdCBwYXJ0IG9mIGxvY2FsRGF0YSBpcyBhIHByb3BlcnR5IG5hbWUsIHRodXMgaXQgY2Fubm90IG1hdGNoLiBPdGhlcndpc2UgbWF0Y2hDb3VudCBjb3VsZCBiZSAtMSBpZiBldmVyeXRoaW5nIG1hdGNoZXNcblx0XHRcdC8vIChpZiB3ZSB3YW50IHRvIGFkZGl0aW9uYWxseSBzZWN1cmUgYWdhaW5zdCB0aGlzIHNpdHVhdGlvbiwgdGhlIG1vc3QgYXBwcm9wcmlhdGUgd291bGQgYmUgdG8gc2V0IG1hdGNoQ291bnQgPSBsb2NhbERhdGFQYXJ0cy5sZW5ndGgg4oCTIDEpXG5cdFx0XHRyZXR1cm4gcmVsYXRpdmVQYXRoUGFydHNcblx0XHRcdFx0LnNsaWNlKDAsIC1tYXRjaENvdW50ID8gLW1hdGNoQ291bnQgOiB1bmRlZmluZWQpIC8vIHJlbW92ZSBhbGwgbWF0Y2hlZCBwYXJ0cyAoZnJvbSB0aGUgZW5kKVxuXHRcdFx0XHQubWFwKChwYXJ0KSA9PiBwYXJ0LnBhcnQpXG5cdFx0XHRcdC5jb25jYXQobG9jYWxEYXRhUGFydHMuc2xpY2UobWF0Y2hDb3VudCkpIC8vIHJlbW92ZSB0aGUgbWF0Y2hlZCBwYXJ0cyBmcm9tIGxvY2FsRGF0YSAoZnJvbSB0aGUgYmVnaW5uaW5nKVxuXHRcdFx0XHQuam9pbihcIi9cIik7IC8vIHRyYW5zZmVyIGJhY2sgdG8gc3RyaW5nIChidXQgb25seSBvbmNlIGF0IHRoZSBlbmQgOykgKVxuXHRcdH0pO1xuXHR9LFxuXG5cdF9nZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9uc0Zyb21GaWx0ZXJCYXI6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRpbkNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdE1hcCxcblx0XHRjb250cm9sOiBDb250cm9sLFxuXHRcdGluUGFyYW1ldGVyczogSW5PdXRQYXJhbWV0ZXJbXSxcblx0XHRwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkXG5cdCkge1xuXHRcdGNvbnN0IGZpbHRlckJhciA9IGNvbnRyb2wuZ2V0UGFyZW50KCkgYXMgRmlsdGVyQmFyQmFzZTtcblx0XHRjb25zdCBmaWx0ZXJCYXJQcm9wZXJ0aWVzID0gRmlsdGVyVXRpbHMuZ2V0RmlsdGVyUHJvcGVydHlJbmZvKGZpbHRlckJhciBhcyB1bmtub3duIGFzIElGaWx0ZXJDb250cm9sKTtcblx0XHRjb25zdCBzdGF0ZTogRXh0ZXJuYWxTdGF0ZVR5cGUgPSBhd2FpdCBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKGZpbHRlckJhcik7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gKGZpbHRlckJhci5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGZvciAoY29uc3QgaW5QYXJhbWV0ZXIgb2YgaW5QYXJhbWV0ZXJzKSB7XG5cdFx0XHRjb25zdCBmaWx0ZXJCYXJQcm9wZXJ0eSA9IHRoaXMuX2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGgoXG5cdFx0XHRcdGluUGFyYW1ldGVyLFxuXHRcdFx0XHRwYXlsb2FkLnByb3BlcnR5UGF0aCxcblx0XHRcdFx0bWV0YU1vZGVsLFxuXHRcdFx0XHRmaWx0ZXJCYXJQcm9wZXJ0aWVzXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgc291cmNlRmllbGQgPSBmaWx0ZXJCYXJQcm9wZXJ0eSA/IGZpbHRlckJhclByb3BlcnR5LmNvbmRpdGlvblBhdGggOiBpblBhcmFtZXRlci5zb3VyY2Uuc3BsaXQoXCJjb25kaXRpb25zL1wiKS5wb3AoKTtcblxuXHRcdFx0Y29uc3QgY29uZGl0aW9ucyA9IHRoaXMuX2dldENvbmRpdGlvbnNGcm9tSW5QYXJhbWV0ZXIoc291cmNlRmllbGQgYXMgc3RyaW5nLCBzdGF0ZSk7XG5cdFx0XHRpZiAoY29uZGl0aW9ucykge1xuXHRcdFx0XHRpbkNvbmRpdGlvbnNbaW5QYXJhbWV0ZXIuaGVscFBhdGhdID0gY29uZGl0aW9ucztcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgZmlsdGVyIGNvbmRpdGlvbnMuXG5cdCAqIFJlZ2FyZGluZyBhIG5hdmlnYXRpb24gcGF0aCBpbiB0aGUgSW5PdXQgcGFyYW1ldGVycyBhbmQgZGlzcmVnYXJkaW5nIHByZWZpeGVzIGluIHRoZSBuYXZpZ2F0aW9uIHBhdGggbGlrZSBlLmcuICckZmlsdGVycz4vY29uZGl0aW9ucy8nIG9yICdvd25lcicuXG5cdCAqIEBwYXJhbSBzb3VyY2VGaWVsZCBJblBhcmFtZXRlciBwcm9wZXJ0eSBvZiB0aGUgZmlsdGVyIGZpZWxkIHZhbHVlIGhlbHBcblx0ICogQHBhcmFtIHN0YXRlIFRoZSBleHRlcm5hbCBmaWx0ZXIgc3RhdGVcblx0ICogQHJldHVybnMgVGhlIGZpbHRlciBjb25kaXRpb25zXG5cdCAqIEBzaW5jZSAxLjExNC4wXG5cdCAqL1xuXHRfZ2V0Q29uZGl0aW9uc0Zyb21JblBhcmFtZXRlcjogZnVuY3Rpb24gKHNvdXJjZUZpZWxkOiBzdHJpbmcsIHN0YXRlOiBFeHRlcm5hbFN0YXRlVHlwZSkge1xuXHRcdGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKHN0YXRlLmZpbHRlcikuZmluZCgoa2V5KSA9PiBrZXkgPT09IHNvdXJjZUZpZWxkKTsgLy8gY29uZGl0aW9uIHBhdGggb2YgdGhlIGZpbHRlciBmaWVsZFxuXHRcdHJldHVybiBrZXkgJiYgc3RhdGUuZmlsdGVyW2tleV07XG5cdH0sXG5cblx0X3BhcnRpdGlvbkluUGFyYW1ldGVyczogZnVuY3Rpb24gKGluUGFyYW1ldGVyczogSW5PdXRQYXJhbWV0ZXJbXSkge1xuXHRcdGNvbnN0IGluUGFyYW1ldGVyTWFwOiBSZWNvcmQ8c3RyaW5nLCBJbk91dFBhcmFtZXRlcltdPiA9IHtcblx0XHRcdGNvbnN0YW50OiBbXSxcblx0XHRcdGJpbmRpbmc6IFtdLFxuXHRcdFx0ZmlsdGVyOiBbXVxuXHRcdH07XG5cblx0XHRmb3IgKGNvbnN0IGluUGFyYW1ldGVyIG9mIGluUGFyYW1ldGVycykge1xuXHRcdFx0aWYgKGluUGFyYW1ldGVyLmNvbnN0YW50VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpblBhcmFtZXRlck1hcC5jb25zdGFudC5wdXNoKGluUGFyYW1ldGVyKTtcblx0XHRcdH0gZWxzZSBpZiAoaW5QYXJhbWV0ZXIuc291cmNlLmluZGV4T2YoXCIkZmlsdGVyXCIpID09PSAwKSB7XG5cdFx0XHRcdGluUGFyYW1ldGVyTWFwLmZpbHRlci5wdXNoKGluUGFyYW1ldGVyKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGluUGFyYW1ldGVyTWFwLmJpbmRpbmcucHVzaChpblBhcmFtZXRlcik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBpblBhcmFtZXRlck1hcDtcblx0fSxcblxuXHRfdGFibGVBZnRlclJlbmRlckRlbGVnYXRlOiB7XG5cdFx0b25BZnRlclJlbmRlcmluZzogZnVuY3Rpb24gKGV2ZW50OiBqUXVlcnkuRXZlbnQgJiB7IHNyY0NvbnRyb2w6IENvbnRyb2wgfSkge1xuXHRcdFx0Y29uc3QgdGFibGUgPSBldmVudC5zcmNDb250cm9sLCAvLyBtLlRhYmxlXG5cdFx0XHRcdHRhYmxlQ2VsbHNEb21SZWZzID0gdGFibGUuJCgpLmZpbmQoXCJ0Ym9keSAuc2FwTVRleHRcIiksXG5cdFx0XHRcdG1kY01UYWJsZSA9IHRhYmxlLmdldFBhcmVudCgpIGFzIE1UYWJsZTtcblxuXHRcdFx0aGlnaGxpZ2h0RE9NRWxlbWVudHModGFibGVDZWxsc0RvbVJlZnMsIG1kY01UYWJsZS5nZXRGaWx0ZXJWYWx1ZSgpLCB0cnVlKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIGFuIGluaXRpYWwgY29uZGl0aW9uIGNvbmZpZ3VyYXRpb24gZXZlcnl0aW1lIGEgdmFsdWUgaGVscCBjb250ZW50IGlzIHNob3duLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IFZhbHVlSGVscCBjb250ZW50IHJlcXVlc3RpbmcgY29uZGl0aW9ucyBjb25maWd1cmF0aW9uXG5cdCAqIEBwYXJhbSBjb250cm9sIEluc3RhbmNlIG9mIHRoZSBjYWxsaW5nIGNvbnRyb2xcblx0ICogQHJldHVybnMgUmV0dXJucyBhIG1hcCBvZiBjb25kaXRpb25zIHN1aXRhYmxlIGZvciBhIHNhcC51aS5tZGMuRmlsdGVyQmFyIGNvbnRyb2xcblx0ICogQHNpbmNlIDEuMTAxLjBcblx0ICovXG5cdGdldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zOiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IENvbnRlbnQsIGNvbnRyb2w6IENvbnRyb2wgfCB1bmRlZmluZWQpIHtcblx0XHQvLyBoaWdobGlnaHQgdGV4dCBpbiBWYWx1ZUhlbHAgcG9wb3ZlclxuXHRcdGlmIChjb250ZW50Py5pc0E8TVRhYmxlPihcInNhcC51aS5tZGMudmFsdWVoZWxwLmNvbnRlbnQuTVRhYmxlXCIpKSB7XG5cdFx0XHRjb25zdCBwb3BvdmVyVGFibGUgPSBjb250ZW50LmdldFRhYmxlKCk7XG5cdFx0XHRwb3BvdmVyVGFibGU/LnJlbW92ZUV2ZW50RGVsZWdhdGUodGhpcy5fdGFibGVBZnRlclJlbmRlckRlbGVnYXRlKTtcblx0XHRcdHBvcG92ZXJUYWJsZT8uYWRkRXZlbnREZWxlZ2F0ZSh0aGlzLl90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGUsIHRoaXMpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0Y29uc3QgaW5Db25kaXRpb25zOiBDb25kaXRpb25PYmplY3RNYXAgPSB7fTtcblxuXHRcdGlmICghY29udHJvbCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVmFsdWVIZWxwRGVsZWdhdGU6IENvbnRyb2wgdW5kZWZpbmVkXCIpO1xuXHRcdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0XHR9XG5cblx0XHRjb25zdCBxdWFsaWZpZXIgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdO1xuXHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHF1YWxpZmllcj8udmhQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgPyBWYWx1ZUxpc3RIZWxwZXIuZ2V0SW5QYXJhbWV0ZXJzKHF1YWxpZmllci52aFBhcmFtZXRlcnMpIDogW107XG5cdFx0Y29uc3QgaW5QYXJhbWV0ZXJNYXAgPSB0aGlzLl9wYXJ0aXRpb25JblBhcmFtZXRlcnMoaW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBpc09iamVjdFBhZ2UgPSBjb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRmb3IgKGNvbnN0IGluUGFyYW1ldGVyIG9mIGluUGFyYW1ldGVyTWFwLmNvbnN0YW50KSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb24gPSB0aGlzLl9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uKFxuXHRcdFx0XHRpblBhcmFtZXRlci5jb25zdGFudFZhbHVlLFxuXHRcdFx0XHRpc09iamVjdFBhZ2UgPyBpblBhcmFtZXRlci5pbml0aWFsVmFsdWVJc1NpZ25pZmljYW50IDogZmFsc2UgLy8gbm8gZmlsdGVyIHdpdGggXCJlbXB0eVwiIG9uIExpc3RSZXBvcnRcblx0XHRcdCk7XG5cdFx0XHRpZiAoY29uZGl0aW9uKSB7XG5cdFx0XHRcdGluQ29uZGl0aW9uc1tpblBhcmFtZXRlci5oZWxwUGF0aF0gPSBbY29uZGl0aW9uXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaW5QYXJhbWV0ZXJNYXAuYmluZGluZy5sZW5ndGgpIHtcblx0XHRcdGF3YWl0IHRoaXMuX2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUJpbmRpbmcoaW5Db25kaXRpb25zLCBjb250cm9sLCBpblBhcmFtZXRlck1hcC5iaW5kaW5nLCBwYXlsb2FkKTtcblx0XHR9XG5cblx0XHRpZiAoaW5QYXJhbWV0ZXJNYXAuZmlsdGVyLmxlbmd0aCkge1xuXHRcdFx0YXdhaXQgdGhpcy5fZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tRmlsdGVyQmFyKGluQ29uZGl0aW9ucywgY29udHJvbCwgaW5QYXJhbWV0ZXJNYXAuZmlsdGVyLCBwYXlsb2FkKTtcblx0XHR9XG5cdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0fSxcblxuXHQvKipcblx0ICogUHJvdmlkZXMgdGhlIHBvc3NpYmlsaXR5IHRvIGNvbnZleSBjdXN0b20gZGF0YSBpbiBjb25kaXRpb25zLlxuXHQgKiBUaGlzIGVuYWJsZXMgYW4gYXBwbGljYXRpb24gdG8gZW5oYW5jZSBjb25kaXRpb25zIHdpdGggZGF0YSByZWxldmFudCBmb3IgY29tYmluZWQga2V5IG9yIG91dHBhcmFtZXRlciBzY2VuYXJpb3MuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgVmFsdWVIZWxwIGNvbnRlbnQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIF92YWx1ZXMgRGVzY3JpcHRpb24gcGFpciBmb3IgdGhlIGNvbmRpdGlvbiB3aGljaCBpcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IE9wdGlvbmFsIGFkZGl0aW9uYWwgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPcHRpb25hbGx5IHJldHVybnMgYSBzZXJpYWxpemFibGUgb2JqZWN0IHRvIGJlIHN0b3JlZCBpbiB0aGUgY29uZGl0aW9uIHBheWxvYWQgZmllbGRcblx0ICogQHNpbmNlIDEuMTAxLjBcblx0ICovXG5cdGNyZWF0ZUNvbmRpdGlvblBheWxvYWQ6IGZ1bmN0aW9uIChcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscCxcblx0XHRjb250ZW50OiBDb250ZW50LFxuXHRcdF92YWx1ZXM6IHVua25vd25bXSxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dFxuXHQpOiBDb25kaXRpb25QYXlsb2FkTWFwIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdGNvbnN0IHF1YWxpZmllciA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0sXG5cdFx0XHRlbnRyeTogQ29uZGl0aW9uUGF5bG9hZFR5cGUgPSB7fSxcblx0XHRcdGNvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRNYXAgPSB7fTtcblx0XHRjb25zdCBjb250cm9sID0gY29udGVudC5nZXRDb250cm9sKCk7XG5cdFx0Y29uc3QgaXNNdWx0aVZhbHVlRmllbGQgPSBjb250cm9sPy5pc0EoXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKTtcblxuXHRcdC8qIEVYVEVSTkFMSUQ6IHdlIGFkZCB0aGUgdmFsdWUgb2YgdGhlIEZpbHRlckZpZWxkIHRvIHRoZSBjb25kaXRpb25QYXlsb2FkICovXG5cdFx0aWYgKHBheWxvYWQuZXh0ZXJuYWxJZFBhdGggJiYgcGF5bG9hZC52YWx1ZUhlbHBLZXlQYXRoKSB7XG5cdFx0XHRjb25zdCB2aEtleVByb3BlcnR5ID0gcGF5bG9hZC52YWx1ZUhlbHBLZXlQYXRoO1xuXHRcdFx0Y29uc3QgdmhLZXlWYWx1ZSA9IHF1YWxpZmllci52aEtleXMgJiYgY29udGV4dC5nZXRPYmplY3QocXVhbGlmaWVyLnZoS2V5c1swXSB8fCB2aEtleVByb3BlcnR5KTtcblx0XHRcdGVudHJ5W3BheWxvYWQucHJvcGVydHlQYXRoICsgXCJAJHVpNS5mZS5AQ29tbW9uL0V4dGVybmFsSURcIl0gPSB2aEtleVZhbHVlO1xuXHRcdFx0Y29uZGl0aW9uUGF5bG9hZFtwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0gPSBbZW50cnldO1xuXHRcdH0gZWxzZSBpZiAoIXF1YWxpZmllci52aFByb3BlcnRpZXMgfHwgaXNNdWx0aVZhbHVlRmllbGQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHF1YWxpZmllci52aFByb3BlcnRpZXM/LmZvckVhY2goZnVuY3Rpb24gKHZoS2V5KSB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IGNvbnRleHQuZ2V0T2JqZWN0KHZoS2V5KTtcblx0XHRcdGlmICh2YWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRcdGVudHJ5W3ZoS2V5XSA9IHZhbHVlPy5sZW5ndGggPT09IDAgPyBcIlwiIDogdmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbnRyeVt2aEtleV0gPSBudWxsOyAvLyBudWxsIHZhbHVlIGlzIGFsc28gdmFsaWRcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoZW50cnkpLmxlbmd0aCkge1xuXHRcdFx0LyogdmggcXVhbGlmaWVyIGFzIGtleSBmb3IgcmVsZXZhbnQgY29uZGl0aW9uICovXG5cdFx0XHRjb25kaXRpb25QYXlsb2FkW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXSA9IFtlbnRyeV07XG5cdFx0fVxuXHRcdHJldHVybiBjb25kaXRpb25QYXlsb2FkO1xuXHR9LFxuXG5cdG1vZGlmeVNlbGVjdGlvbkJlaGF2aW91cjogZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBNVGFibGUsIGNoYW5nZTogU2VsZWN0aW9uQ2hhbmdlKTogU2VsZWN0aW9uQ2hhbmdlIHtcblx0XHRjb25zdCBjb25kaXRpb25zID0gY2hhbmdlLmNvbmRpdGlvbnM7XG5cdFx0Y29uc3Qgb2xkQ29uZGl0aW9ucyA9IGNvbnRlbnQuZ2V0Q29uZGl0aW9ucygpO1xuXHRcdC8vIFByZXZlbnQgZGUtc2VsZWN0IGluIGRpYWxvZyBzY2VuYXJpb3Ncblx0XHRpZiAoKGNvbnRlbnQ/LmdldFBhcmVudCgpIGFzIHVua25vd24gYXMgVmFsdWVIZWxwRGlhbG9nKT8uaXNRdWlja1NlbGVjdEFjdGl2ZT8uKCkgJiYgIWNvbmRpdGlvbnMubGVuZ3RoICYmIG9sZENvbmRpdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRjaGFuZ2UuY29uZGl0aW9ucyA9IG9sZENvbmRpdGlvbnM7XG5cdFx0fVxuXHRcdHJldHVybiBjaGFuZ2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIHRoZSBwb3NzaWJpbGl0eSB0byBjdXN0b21pemUgc2VsZWN0aW9ucyBpbiAnU2VsZWN0IGZyb20gbGlzdCcgc2NlbmFyaW9zLlxuXHQgKiBCeSBkZWZhdWx0LCBvbmx5IGNvbmRpdGlvbiBrZXlzIGFyZSBjb25zaWRlcmVkLiBUaGlzIG1heSBiZSBleHRlbmRlZCB3aXRoIHBheWxvYWQgZGVwZW5kZW50IGZpbHRlcnMuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgVmFsdWVIZWxwIGNvbnRlbnQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBvZiB0aGUgc2VsZWN0ZWQgaXRlbVxuXHQgKiBAcGFyYW0gY29uZGl0aW9ucyBDdXJyZW50IGNvbmRpdGlvbnNcblx0ICogQHJldHVybnMgQ29uZGl0aW9ucyBvciBbXVxuXHQgKi9cblx0ZmluZENvbmRpdGlvbnNGb3JDb250ZXh0OiBmdW5jdGlvbiAoXG5cdFx0dmFsdWVIZWxwOiBWYWx1ZUhlbHAsXG5cdFx0Y29udGVudDogRmlsdGVyYWJsZUxpc3RDb250ZW50LFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdGNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdFtdXG5cdCkge1xuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0LyogRG8gbm90IGNvbnNpZGVyIFwiTm90VmFsaWRhdGVkXCIgY29uZGl0aW9ucyAqL1xuXHRcdGNvbmRpdGlvbnMgPSBjb25kaXRpb25zLmZpbHRlcigoY29uZGl0aW9uKSA9PiBjb25kaXRpb24udmFsaWRhdGVkID09PSBDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkKTtcblxuXHRcdGNvbnN0IHZoS2V5cyA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0/LnZoS2V5cyB8fCBbXTtcblx0XHRjb25zdCBrZXlQYXRoID0gY29udGVudC5nZXRLZXlQYXRoKCk7XG5cdFx0Y29uc3QgdmFsdWVIZWxwUXVhbGlmaWVyID0gcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXIgfHwgXCJcIjtcblx0XHRjb25zdCBmaW5kQ29uZGl0aW9uID0gKGNvbmRpdGlvblBheWxvYWRNYXA6IENvbmRpdGlvblBheWxvYWRNYXAsIHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCk6IGJvb2xlYW4gPT4ge1xuXHRcdFx0Y29uc3QgY29uZGl0aW9uU2VsZWN0ZWRSb3cgPSBjb25kaXRpb25QYXlsb2FkTWFwPy5bdmFsdWVIZWxwUXVhbGlmaWVyXT8uWzBdIHx8IHt9O1xuXHRcdFx0aWYgKHZoS2V5cy5sZW5ndGggPT09IDEgfHwgcGF5bG9hZD8udXNlTXVsdGlWYWx1ZUZpZWxkIHx8ICFjb25kaXRpb25QYXlsb2FkTWFwKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0Py5nZXRPYmplY3Qoa2V5UGF0aCkgPT09IHZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dEtleXMgPSBPYmplY3Qua2V5cyhjb250ZXh0LmdldE9iamVjdCgpKTtcblx0XHRcdFx0Y29uc3QgY29uZGl0aW9uU2VsZWN0ZWRSb3dLZXlzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uU2VsZWN0ZWRSb3cpO1xuXHRcdFx0XHRyZXR1cm4gdmhLZXlzLmV2ZXJ5KGZ1bmN0aW9uICh2aEtleSkge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHQhY29udGV4dEtleXMuaW5jbHVkZXModmhLZXkpIHx8XG5cdFx0XHRcdFx0XHQhY29uZGl0aW9uU2VsZWN0ZWRSb3dLZXlzLmluY2x1ZGVzKHZoS2V5KSB8fFxuXHRcdFx0XHRcdFx0Y29udGV4dD8uZ2V0T2JqZWN0KHZoS2V5KSA9PT0gY29uZGl0aW9uU2VsZWN0ZWRSb3dbdmhLZXldXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRjb25zdCBzZWxlY3RlZENvbmRpdGlvbiA9IGNvbmRpdGlvbnMuZmluZChmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkTWFwID0gY29uZGl0aW9uLnBheWxvYWQgYXMgQ29uZGl0aW9uUGF5bG9hZE1hcDtcblx0XHRcdGlmIChjb250ZXh0Py5nZXRPYmplY3Qoa2V5UGF0aCkgPT09IGNvbmRpdGlvblBheWxvYWRNYXA/Llt2YWx1ZUhlbHBRdWFsaWZpZXJdPy5bMF0/LltrZXlQYXRoXSkge1xuXHRcdFx0XHRyZXR1cm4gZmluZENvbmRpdGlvbihjb25kaXRpb25QYXlsb2FkTWFwLCBjb25kaXRpb25QYXlsb2FkTWFwPy5bdmFsdWVIZWxwUXVhbGlmaWVyXT8uWzBdPy5ba2V5UGF0aF0pO1xuXHRcdFx0fSBlbHNlIGlmIChjb250ZXh0Py5nZXRPYmplY3Qoa2V5UGF0aCkgPT09IGNvbmRpdGlvbj8udmFsdWVzWzBdKSB7XG5cdFx0XHRcdHJldHVybiBmaW5kQ29uZGl0aW9uKGNvbmRpdGlvblBheWxvYWRNYXAsIGNvbmRpdGlvbj8udmFsdWVzWzBdKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBzZWxlY3RlZENvbmRpdGlvbiA/IFtzZWxlY3RlZENvbmRpdGlvbl0gOiBbXTtcblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlcyBjb250ZXh0cyBmb3IgYWRkaXRpb25hbCB2YWx1ZXMgYW5kIHJlc3VtZXMgdGhlIGxpc3QgYmluZGluZy5cblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBmb3IgZGVsZWdhdGVcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKiBAcGFyYW0gYWRkaXRpb25hbFZhbHVlcyBBcnJheSBvZiBBZGRpdGlvbmFsVmFsdWVzXG5cdCAqIEBwYXJhbSB2YWx1ZUxpc3RQcm9wZXJ0eSBWYWx1ZUxpc3RQcm9wZXJ0eSBvZiB0aGUgcGF5bG9hZFxuXHQgKiBAcGFyYW0gZmllbGQgQ29udHJvbCBjb25uZWN0ZWQgdG8gdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gc29ydGVycyBTb3J0ZXJzIG9mIHRoZSB2YWx1ZSBoZWxwIGxpc3QgYmluZGluZ1xuXHQgKi9cblx0X3VwZGF0ZUJpbmRpbmdXaXRoVHJhbnNpZW50Q29udGV4dHM6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGJpbmRpbmdJbmZvOiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mbyxcblx0XHRhZGRpdGlvbmFsVmFsdWVzOiBBZGRpdGlvbmFsVmFsdWVUeXBlW10sXG5cdFx0dmFsdWVMaXN0UHJvcGVydHk6IHN0cmluZyxcblx0XHRmaWVsZDogRmlsdGVyRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgfCBGaWVsZCxcblx0XHRzb3J0ZXJzOiBTb3J0ZXJUeXBlW10sXG5cdFx0dGFibGU6IFRhYmxlXG5cdCkge1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLl91cGRhdGVCaW5kaW5nQXR0cmlidXRlcyhsaXN0QmluZGluZywgYmluZGluZ0luZm8sIHNvcnRlcnMpO1xuXG5cdFx0XHRjb25zdCB7IHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEsIHJlY2VudFZhbHVlc0NvbnRleHREYXRhLCBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSB9ID1cblx0XHRcdFx0YXdhaXQgdGhpcy5fZ2V0UmVsZXZhbnRBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YShcblx0XHRcdFx0XHRhZGRpdGlvbmFsVmFsdWVzLFxuXHRcdFx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdGJpbmRpbmdJbmZvLFxuXHRcdFx0XHRcdHBheWxvYWQsXG5cdFx0XHRcdFx0dmFsdWVMaXN0UHJvcGVydHksXG5cdFx0XHRcdFx0ZmllbGQsXG5cdFx0XHRcdFx0c29ydGVycyxcblx0XHRcdFx0XHR0YWJsZVxuXHRcdFx0XHQpO1xuXG5cdFx0XHQvLyBubyBncm91cGluZyBzaG91bGQgYmUgc2hvd24gaW4gdGhlIHN1Z2dlc3Rpb24gbGlzdCBpZiB0aGUgc2VhcmNoIHJlc3VsdCBvbmx5IGNvbnRhaW5zIHZhbHVlcyBmcm9tIHRoZSAnT3RoZXJzJyBncm91cFxuXHRcdFx0aWYgKHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEubGVuZ3RoID09PSAwICYmIHJlY2VudFZhbHVlc0NvbnRleHREYXRhLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRsaXN0QmluZGluZy5zb3J0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwYXlsb2FkPy5oaXN0b3J5Py5lbmFibGVkKSB7XG5cdFx0XHRcdHBheWxvYWQuaGlzdG9yeS5oYXNSZWxldmFudERhdGEgPSByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YS5sZW5ndGggIT09IDA7XG5cdFx0XHR9XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBOb3cgd2UgbWFrZSBzdXJlIHRvIHJlc2V0IHRoZSBsaXN0YmluZGluZywgYmVmb3JlIHRoZSB0cmFuc2llbnQgY29udGV4dHMgYXJlIGNyZWF0ZWRcblx0XHRcdFx0YXdhaXQgbGlzdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZGVidWcoYEVycm9yIHdoaWxlIGNsZWFyaW5nIHRoZSBsaXN0IGJpbmRpbmc6ICR7ZXJyb3J9YCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBhZGQgdHJhbnNpZW50IGNvbnRleHQgdG8gbGlzdCBiaW5kaW5nIGFmdGVyIGJhY2tlbmQgcXVlcnkgaXMgZG9uZVxuXHRcdFx0YWRkaXRpb25hbFZhbHVlSGVscGVyLmNyZWF0ZVRyYW5zaWVudENvbnRleHRzRm9yQWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGEoXG5cdFx0XHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdFx0bGlzdEJpbmRpbmdcblx0XHRcdCk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vRG8gbm90aGluZyBhcyB3ZSBrbm93IHRoYXQgcmVzZXQgY2hhbmdlcyB3b3VsZCB0aHJvdyBhbiBlcnJvciBpbiBjb25zb2xlIGFuZCB0aGlzIHdpbGwgcGlsZSB1cCBhIGxvdCBvZiBjb25zb2xlIGVycm9yc1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byBjaGFuZ2UgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHZhbHVlIGhlbHAsIHN1Y2ggYXMgc29ydCwgZmlsdGVyLCBwYXJhbWV0ZXJzIGV0Yy5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKiBAcGFyYW0gc29ydGVycyBTb3J0ZXJzIG9mIHRoZSB2YWx1ZSBoZWxwIGxpc3QgYmluZGluZ1xuXHQgKi9cblx0X3VwZGF0ZUJpbmRpbmdBdHRyaWJ1dGVzOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0YmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdHNvcnRlcnM6IFNvcnRlclR5cGVbXVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCByb290QmluZGluZyA9IGxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCkgfHwgbGlzdEJpbmRpbmc7XG5cdFx0aWYgKCFyb290QmluZGluZy5pc1N1c3BlbmRlZCgpKSB7XG5cdFx0XHRyb290QmluZGluZy5zdXNwZW5kKCk7XG5cdFx0fVxuXHRcdC8vc29ydCBhbmQgZmlsdGVyIHZhbHVlIGhlbHAgYmluZGluZyB0byBtYWtlIHN1cmUgd2UgcmVuZGVyIG90aGVycyBncm91cFxuXHRcdGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5zb3J0QW5kRmlsdGVyTGlzdEJpbmRpbmcobGlzdEJpbmRpbmcsIHNvcnRlcnMpO1xuXHRcdGlmIChiaW5kaW5nSW5mby5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRsaXN0QmluZGluZy5jaGFuZ2VQYXJhbWV0ZXJzKGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMpO1xuXHRcdH1cblx0XHQvL3Jlc3VtZSB0aGUgbGlzdCBiaW5kaW5nIGFuZCB0aGVuIHJlc2V0IHRoZSBjaGFuZ2VzXG5cdFx0YXdhaXQgYWRkaXRpb25hbFZhbHVlSGVscGVyLnJlc3VtZVZhbHVlTGlzdEJpbmRpbmdBbmRSZXNldENoYW5nZXMobGlzdEJpbmRpbmcpO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBmaW5hbCBsaXN0IG9mIGFsbCB0eXBlcyBvZiBhZGRpdGlvbmFsIHZhbHVlIGNvbnRleHQgZGF0YSAocmVjb21tZW5kYXRpb24sIHJlY2VudGx5IHVzZWQgYW5kIG90aGVycykgdG8gYmUgdXNlZC5cblx0ICogQHBhcmFtIGFkZGl0aW9uYWxWYWx1ZXMgQXJyYXkgb2YgQWRkaXRpb25hbFZhbHVlc1xuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgZm9yIGRlbGVnYXRlXG5cdCAqIEBwYXJhbSB2YWx1ZUxpc3RQcm9wZXJ0eSBWYWx1ZUxpc3RQcm9wZXJ0eSBvZiB0aGUgcGF5bG9hZFxuXHQgKiBAcGFyYW0gZmllbGQgQ29udHJvbCBjb25uZWN0ZWQgdG8gdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gc29ydGVycyBTb3J0ZXJzIG9mIHRoZSB2YWx1ZSBoZWxwIGxpc3QgYmluZGluZ1xuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2hpY2ggY29udGFpbnMgcmVjb21tZW5kYXRpb25zLCByZWNlbnRseSB1c2VkLCBhbmQgb3RoZXJzIGNvbnRleHQgZGF0YS5cblx0ICovXG5cdF9nZXRSZWxldmFudEFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0YWRkaXRpb25hbFZhbHVlczogQWRkaXRpb25hbFZhbHVlVHlwZVtdLFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGJpbmRpbmdJbmZvOiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mbyxcblx0XHRwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLFxuXHRcdHZhbHVlTGlzdFByb3BlcnR5OiBzdHJpbmcsXG5cdFx0ZmllbGQ6IEZpbHRlckZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkIHwgRmllbGQsXG5cdFx0c29ydGVyczogU29ydGVyVHlwZVtdLFxuXHRcdHRhYmxlOiBUYWJsZVxuXHQpOiBQcm9taXNlPHtcblx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW107XG5cdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXTtcblx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdO1xuXHR9PiB7XG5cdFx0bGV0IHsgcmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSwgb3RoZXJzVmFsdWVzQ29udGV4dERhdGEgfSA9IGF3YWl0IGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5yZXF1ZXN0Rm9yQWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGEoXG5cdFx0XHRhZGRpdGlvbmFsVmFsdWVzLFxuXHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRiaW5kaW5nSW5mbyxcblx0XHRcdHBheWxvYWQsXG5cdFx0XHRzb3J0ZXJzLFxuXHRcdFx0dGFibGVcblx0XHQpO1xuXG5cdFx0Ly8gYXBwbHkgc2VhcmNoIGFuZCBmaWx0ZXJzIHRvIGFkZGl0aW9uYWwgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHRcdGNvbnN0IHZhbHVlSGVscEtleXMgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdLnZoS2V5cyB8fCBbXTtcblx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhID0gYWRkaXRpb25hbFZhbHVlSGVscGVyLmdldFJlbGV2YW50UmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YShcblx0XHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRhZGRpdGlvbmFsVmFsdWVzWzBdPy52YWx1ZXMsXG5cdFx0XHR2YWx1ZUxpc3RQcm9wZXJ0eVxuXHRcdCk7XG5cblx0XHRsZXQgcmVjZW50VmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSA9IFtdO1xuXHRcdGlmICghcGF5bG9hZC5pc1ZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcykge1xuXHRcdFx0Ly8gbm8gaGlzdG9yeSBmb3IgdmFsdWVzIGxpc3RzIHdpdGggZml4ZWQgdmFsdWVzICh0aGV5IGFyZSB1c3VhbGx5IHNob3J0KVxuXHRcdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGEgPSBhd2FpdCB0aGlzLl9nZXRIaXN0b3J5RGF0YShwYXlsb2FkLCBmaWVsZCk7XG5cdFx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSA9IGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5nZXRSZWxldmFudFJlY2VudFZhbHVlc0NvbnRleHREYXRhKFxuXHRcdFx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRcdHZhbHVlSGVscEtleXMsXG5cdFx0XHRcdChiaW5kaW5nSW5mby5wYXJhbWV0ZXJzIGFzIEJpbmRpbmdJbmZvUGFyYW1ldGVycykuJHNlYXJjaD8ucmVwbGFjZUFsbCgnXCInLCBcIlwiKSxcblx0XHRcdFx0YmluZGluZ0luZm9cblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGEgPSBhZGRpdGlvbmFsVmFsdWVIZWxwZXIuZ2V0UmVsZXZhbnRPdGhlcnNWYWx1ZXNDb250ZXh0RGF0YShcblx0XHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0dmFsdWVIZWxwS2V5c1xuXHRcdCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGFcblx0XHR9O1xuXHR9LFxuXHQvKipcblx0ICogRXhlY3V0ZXMgYSBmaWx0ZXIgaW4gYSA8Y29kZT5MaXN0QmluZGluZzwvY29kZT4gYW5kIHJlc3VtZXMgaXQsIGlmIHN1c3BlbmRlZC5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKi9cblx0X3VwZGF0ZUJpbmRpbmc6IGZ1bmN0aW9uIChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgYmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvKSB7XG5cdFx0Y29uc3Qgcm9vdEJpbmRpbmcgPSBsaXN0QmluZGluZy5nZXRSb290QmluZGluZygpIHx8IGxpc3RCaW5kaW5nO1xuXHRcdGlmICghcm9vdEJpbmRpbmcuaXNTdXNwZW5kZWQoKSkge1xuXHRcdFx0cm9vdEJpbmRpbmcuc3VzcGVuZCgpO1xuXHRcdH1cblx0XHRpZiAoYmluZGluZ0luZm8ucGFyYW1ldGVycykge1xuXHRcdFx0bGlzdEJpbmRpbmcuY2hhbmdlUGFyYW1ldGVycyhiaW5kaW5nSW5mby5wYXJhbWV0ZXJzKTtcblx0XHR9XG5cdFx0bGlzdEJpbmRpbmcuZmlsdGVyKGJpbmRpbmdJbmZvLmZpbHRlcnMsIEZpbHRlclR5cGUuQXBwbGljYXRpb24pO1xuXHRcdGxpc3RCaW5kaW5nLnNvcnQoYmluZGluZ0luZm8uc29ydGVyKTtcblxuXHRcdGlmIChyb290QmluZGluZy5pc1N1c3BlbmRlZCgpKSB7XG5cdFx0XHRyb290QmluZGluZy5yZXN1bWUoKTtcblx0XHRcdHJvb3RCaW5kaW5nLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFJldHVybnMgYW4gYm9vbGVhbiB2YWx1ZSBpZiBhZGRpdGlvbmFsdmFsdWVzIGV4aXN0cyB3aGljaCB3aWxsIGNvbnRhaW4gZGlmZmVyZW50IGdyb3VwcyBsaWtlIHJlY29tbWVuZGF0aW9ucy5cblx0ICogQHBhcmFtIGNvbnRlbnQgRmlsdGVyYWJsZSBMaXN0IENvbnRlbnRcblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBmb3IgZGVsZWdhdGVcblx0ICogQHBhcmFtIGNoZWNrUmVjb21tZW5kYXRpb25zIERlZmluZXMgaWYgd2Ugc2hhbGwgY2hlY2sgZm9yIHJlY29tbWVuZGF0aW9uc1xuXHQgKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlXG5cdCAqL1xuXHRfY2hlY2tJZkFkZGl0aW9uYWxWYWx1ZXNFeGlzdHM6IGFzeW5jIGZ1bmN0aW9uIChjb250ZW50OiBNVGFibGUsIHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsIGNoZWNrUmVjb21tZW5kYXRpb25zID0gdHJ1ZSkge1xuXHRcdC8vIEZvciBkZWZpbmUgY29uZGl0aW9ucyB2YWx1ZWhlbHAgcmVjb21tZW5kYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgXCJpbnRlcm5hbFwiIG1vZGVsIGlzIG5vdCBhdmFpbGFibGUuXG5cdFx0aWYgKHBheWxvYWQuaXNEZWZpbmVDb25kaXRpb25WYWx1ZUhlbHApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRjb25zdCByZWNvbW1lbmRhdGlvblZhbHVlcyA9IGNoZWNrUmVjb21tZW5kYXRpb25zID8gdGhpcy5nZXRSZWxldmFudFJlY29tbWVuZGF0aW9ucyhjb250ZW50LCBwYXlsb2FkKSA6IFtdO1xuXHRcdGlmIChyZWNvbW1lbmRhdGlvblZhbHVlcz8ubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly9pZiB0aGVyZSBhcmUgcmVsZXZhbnQgcmVjb21tZW5kYXRpb25zIHRoZW4gcmV0dXJuIHRydWVcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChwYXlsb2FkLmhpc3Rvcnk/LmVuYWJsZWQpIHtcblx0XHRcdC8vIG5vdyBjaGVjayBmb3IgcmVjZW50IHZhbHVlc1xuXHRcdFx0aWYgKHBheWxvYWQuaGlzdG9yeS5oYXNSZWxldmFudERhdGEgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gcGF5bG9hZC5oaXN0b3J5Lmhhc1JlbGV2YW50RGF0YTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHJlY2VudFZhbHVlcyA9IGF3YWl0IHRoaXMuX2dldEhpc3RvcnlEYXRhKHBheWxvYWQsIGNvbnRlbnQuZ2V0Q29udHJvbCgpKTtcblx0XHRcdGlmIChyZWNlbnRWYWx1ZXMubGVuZ3RoKSB7XG5cdFx0XHRcdC8vaWYgdGhlcmUgYXJlIHJlY2VudGx5IGVudGVyZWQgdmFsdWVzIHJldHVybiB0cnVlXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHJlbGV2YW50IHJlY29tbWVuZGF0aW9ucy5cblx0ICogQHBhcmFtIGNvbnRlbnQgRmlsdGVyYWJsZSBMaXN0IENvbnRlbnRcblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBmb3IgZGVsZWdhdGVcblx0ICogQHJldHVybnMgUmVsZXZhbnQgcmVjb21tZW5kYXRpb25zXG5cdCAqL1xuXHRnZXRSZWxldmFudFJlY29tbWVuZGF0aW9ucyhjb250ZW50OiBNVGFibGUsIHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQpOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcblx0XHRsZXQgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG5cdFx0Y29uc3QgaXNGaWx0ZXJGaWVsZE9yTXVsdGlWYWx1ZWRGaWVsZCA9XG5cdFx0XHRjb250ZW50LmdldENvbnRyb2woKS5pc0EoXCJzYXAudWkubWRjLkZpbHRlckZpZWxkXCIpIHx8IGNvbnRlbnQuZ2V0Q29udHJvbCgpLmlzQShcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpO1xuXG5cdFx0aWYgKCFpc0ZpbHRlckZpZWxkT3JNdWx0aVZhbHVlZEZpZWxkKSB7XG5cdFx0XHRjb25zdCBjb250ZW50TW9kZWwgPSBjb250ZW50LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCAmIHsgZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWw6IEZ1bmN0aW9uIH07XG5cdFx0XHRjb25zdCBsb2NhbEFubm90YXRpb25Nb2RlbCA9IGNvbnRlbnRNb2RlbC5nZXRMb2NhbEFubm90YXRpb25Nb2RlbCAmJiBjb250ZW50TW9kZWwuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwoKTtcblx0XHRcdGlmIChsb2NhbEFubm90YXRpb25Nb2RlbCkge1xuXHRcdFx0XHRjb25zdCBiaW5kaW5nQ29udGV4dFBhdGggPSBjb250ZW50LmdldENvbnRyb2woKS5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCk7XG5cdFx0XHRcdGNvbnN0IGZpZWxkUGF0aCA9IGNvbnRlbnQuZ2V0Q29udHJvbCgpLmdldEJpbmRpbmcoXCJ2YWx1ZVwiKT8uZ2V0UGF0aCgpO1xuXHRcdFx0XHR2YWx1ZXMgPSBsb2NhbEFubm90YXRpb25Nb2RlbC5nZXRPYmplY3QoYCR7YmluZGluZ0NvbnRleHRQYXRofS8ke2ZpZWxkUGF0aH1AJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMudHlwZUFoZWFkVmFsdWVzYCkgPz8gW107XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgaW5wdXRWYWx1ZXMgPSAoY29udGVudC5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbCkuZ2V0UHJvcGVydHkoXCIvcmVjb21tZW5kYXRpb25zRGF0YVwiKSB8fCB7fTtcblx0XHRcdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSBjb250ZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdHZhbHVlcyA9XG5cdFx0XHRcdFx0YWRkaXRpb25hbFZhbHVlSGVscGVyLmdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zKFxuXHRcdFx0XHRcdFx0aW5wdXRWYWx1ZXMsXG5cdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dCxcblx0XHRcdFx0XHRcdHBheWxvYWQucHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0Y29udGVudC5nZXRDb250cm9sKCkuZ2V0QmluZGluZyhcInZhbHVlXCIpPy5nZXRQYXRoKClcblx0XHRcdFx0XHQpIHx8IFtdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdmFsdWVzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSB3aGljaCB3aWxsIHRlbGwgd2hldGhlciB0eXBlYWhlYWQgc2hvdWxkIGJlIG9wZW5lZCBvciBub3QuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgRmlsdGVyYWJsZSBMaXN0IENvbnRlbnRcblx0ICogQHJldHVybnMgQm9vbGVhbiB2YWx1ZSB3aGV0aGVyIHRvIHNob3cgdHlwZWFoZWFkIG9yIG5vdFxuXHQgKi9cblx0dHlwZUFoZWFkRm9yRmlsdGVyYWJsZUNvbnRlbnQ6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogTURDUG9wb3Zlcikge1xuXHRcdGxldCBzaG93SXQgPSB0cnVlO1xuXHRcdGNvbnN0IHR5cGVBaGVhZENvbnRlbnQgPSBjb250ZW50Py5nZXRDb250ZW50KClbMF0gYXMgTVRhYmxlO1xuXHRcdGNvbnN0IGZpbHRlclZhbHVlID0gdmFsdWVIZWxwPy5nZXRGaWx0ZXJWYWx1ZSgpO1xuXHRcdGNvbnN0IGZpZWxkID0gdHlwZUFoZWFkQ29udGVudC5nZXRDb250cm9sKCkgYXMgRmlsdGVyRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgfCBGaWVsZDtcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXG5cdFx0aWYgKGZpZWxkLmlzQTxGaWx0ZXJGaWVsZD4oXCJzYXAudWkubWRjLkZpbHRlckZpZWxkXCIpIHx8IGZpZWxkLmlzQTxNdWx0aVZhbHVlRmllbGQ+KFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIikpIHtcblx0XHRcdGlmICghZmlsdGVyVmFsdWUpIHtcblx0XHRcdFx0Ly8gYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHJlY29tbWVuZGF0aW9uIFVYIHdlIGRvbid0IGNoZWNrIGZvciByZWNvbW1lbmRhdGlvbnMgYnV0IHJlY2VudGx5IGVudGVyZWQgdmFsdWVzIG9ubHlcblx0XHRcdFx0c2hvd0l0ID0gYXdhaXQgdGhpcy5fY2hlY2tJZkFkZGl0aW9uYWxWYWx1ZXNFeGlzdHModHlwZUFoZWFkQ29udGVudCwgcGF5bG9hZCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBmaWVsZFZhbHVlID0gZmllbGQuZ2V0VmFsdWUoKTtcblx0XHRcdGNvbnN0IGZpZWxkVGV4dFZhbHVlID0gZmllbGQuZ2V0QWRkaXRpb25hbFZhbHVlKCk7XG5cdFx0XHRpZiAoZmllbGRWYWx1ZSB8fCBmaWVsZFRleHRWYWx1ZSkge1xuXHRcdFx0XHQvLyB2YWx1ZWhlbHAgaGFkIHNvbWUgdmFsdWUsIGJ1dCB1c2VyIGNsZWFyZWQgdGhlIHZhbHVlXG5cdFx0XHRcdC8vIGluIHN1Y2ggY2FzZSB3ZSBnZXQgaW5wdXQgdmFsdWUgYXMgJycgYW5kIHdlIHdpbGwgcmV0dXJuIGZhbHNlXG5cdFx0XHRcdC8vTm90ZTogSW4gU0RzIHVzZWNhc2Ugd2Ugd2FudGVkIHRvIG9wZW4gdGhlIHR5cGVBaGVhZCBpZiB0aGVyZSBhcmUgcmVjb21tZW5kYXRpb25zIGFuZCB2YWx1ZSBpcyBibGFuaywgdGhleSBzaG91bGQgcGFzcyB1cyBhIGZsYWcgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIHRoaXMgYWNjb3JkaW5nbHlcblx0XHRcdFx0Y29uc3QgaXNEaWdpdFNlcXVlbmNlID1cblx0XHRcdFx0XHQoZmllbGQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKS5nZXRPYmplY3QoYCR7cGF5bG9hZC5wcm9wZXJ0eVBhdGh9JHtBbm5vdGF0aW9uSXNEaWdpdFNlcXVlbmNlfWApID8/XG5cdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHRcdGlmIChmaWVsZC5oYXNQZW5kaW5nVXNlcklucHV0KCkgfHwgdGhpcy5faXNFbXB0eURpZ2l0U2VxdWVuY2UoZmllbGRWYWx1ZSwgaXNEaWdpdFNlcXVlbmNlKSkge1xuXHRcdFx0XHRcdHNob3dJdCA9IGZpbHRlclZhbHVlICE9PSBcIlwiIHx8IChhd2FpdCB0aGlzLl9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyh0eXBlQWhlYWRDb250ZW50LCBwYXlsb2FkKSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gY2hlY2sgcmVjZW50bHkgdXNlZCBvbmx5XG5cdFx0XHRcdFx0c2hvd0l0ID0gYXdhaXQgdGhpcy5fY2hlY2tJZkFkZGl0aW9uYWxWYWx1ZXNFeGlzdHModHlwZUFoZWFkQ29udGVudCwgcGF5bG9hZCwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCFmaWx0ZXJWYWx1ZSkge1xuXHRcdFx0XHRzaG93SXQgPSBhd2FpdCB0aGlzLl9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyh0eXBlQWhlYWRDb250ZW50LCBwYXlsb2FkKTtcblx0XHRcdFx0Ly8gZWxzZTogdGhlIHVzZXIgdHlwZXMsIHdlIHNoYWxsIGFsd2F5cyBzaG93IHRoZSBvdGhlciB2YWx1ZXNcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHNob3dJdDtcblx0fSxcblxuXHRjb25kaXRpb25Gb3JSZXF1ZXN0U2hvd0NvbnRhaW5lcjogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBNRENQb3BvdmVyKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHBhcmVudENvbnRyb2wgPSB2YWx1ZUhlbHAuZ2V0Q29udHJvbCgpO1xuXHRcdFx0aWYgKHBhcmVudENvbnRyb2wgJiYgcGFyZW50Q29udHJvbD8uaXNBPEZpbHRlckZpZWxkPihcInNhcC51aS5tZGMuRmlsdGVyRmllbGRcIikpIHtcblx0XHRcdFx0Y29uc3QgZmllbGRJZCA9IHBhcmVudENvbnRyb2wuZ2V0Q29udGVudCgpPy5nZXRJZCgpO1xuXHRcdFx0XHRjb25zdCBpc1Zpc3VhbEZpbHRlciA9IGZpZWxkSWQgPyBmaWVsZElkLmluY2x1ZGVzKFwiVmlzdWFsRmlsdGVyXCIpIDogZmFsc2U7XG5cdFx0XHRcdC8vVmlzdWFsIEZpbHRlciBjb250YWluaW5nIHZhbHVlSGVscCBzaG91bGQgbm90IG9wZW4gb24gZm9jdXMgZm9yIHJlY2VudGx5IHNlbGVjdGVkIHZhbHVlcyBvIHIgcmVjb21tZW5kYXRpb25zXG5cdFx0XHRcdGlmIChpc1Zpc3VhbEZpbHRlcikge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCB2YWx1ZUhlbHBUYWJsZSA9IGNvbnRlbnQ/LmdldENvbnRlbnQoKVswXSBhcyBNVGFibGU7XG5cdFx0XHRsZXQgY29udHJvbDogVUk1RWxlbWVudCB8IERpYWxvZyB8IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGdldFBhcmVudERpYWxvZyA9IGZ1bmN0aW9uIChpbm5lckNvbnRlbnQ6IFVJNUVsZW1lbnQpOiBEaWFsb2cgfCB1bmRlZmluZWQge1xuXHRcdFx0XHRjb250cm9sID0gaW5uZXJDb250ZW50Py5nZXRQYXJlbnQoKSBhcyBVSTVFbGVtZW50O1xuXHRcdFx0XHRpZiAoY29udHJvbCAmJiBjb250cm9sLmlzQTxEaWFsb2c+KFwic2FwLm0uRGlhbG9nXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbnRyb2w7XG5cdFx0XHRcdH0gZWxzZSBpZiAoY29udHJvbCA9PT0gdW5kZWZpbmVkIHx8IGNvbnRyb2wgPT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBnZXRQYXJlbnREaWFsb2coY29udHJvbCk7XG5cdFx0XHR9O1xuXHRcdFx0Y29udHJvbCA9IGdldFBhcmVudERpYWxvZyhjb250ZW50KTtcblx0XHRcdGlmIChcblx0XHRcdFx0Y29udHJvbCAmJlxuXHRcdFx0XHRjb250cm9sLmRhdGEoXCJmZV9Jbml0aWFsVHlwZUFoZWFkRm9jdXNEb25lXCIpID09PSBudWxsICYmXG5cdFx0XHRcdGNvbnRlbnQuZ2V0Q29udHJvbCgpLmdldERvbVJlZigpPy5nZXRFbGVtZW50c0J5VGFnTmFtZShcImlucHV0XCIpWzBdLmlkID09PSAoY29udHJvbCBhcyBEaWFsb2cpLmdldEluaXRpYWxGb2N1cygpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29udHJvbC5kYXRhKFwiZmVfSW5pdGlhbFR5cGVBaGVhZEZvY3VzRG9uZVwiLCB0cnVlKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRcdFx0cGF5bG9hZC5oaXN0b3J5ID0gcGF5bG9hZC5oaXN0b3J5IHx8IHt9O1xuXHRcdFx0XHRwYXlsb2FkLmhpc3RvcnkuaGFzUmVsZXZhbnREYXRhID0gdW5kZWZpbmVkOyAvLyBuZWVkcyB0byBiZSBpbml0aWFsaXplXG5cdFx0XHRcdHBheWxvYWQuaGlzdG9yeS5lbmFibGVkID0gcGF5bG9hZC5oaXN0b3J5LmVuYWJsZWQgPz8gVmFsdWVMaXN0SGVscGVyLmNoZWNrSGlzdG9yeUVuYWJsZWQodmFsdWVIZWxwLCBwYXlsb2FkKTtcblx0XHRcdFx0cmV0dXJuIGF3YWl0IHRoaXMuX2NoZWNrSWZBZGRpdGlvbmFsVmFsdWVzRXhpc3RzKHZhbHVlSGVscFRhYmxlLCBwYXlsb2FkKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFuIGJvb2xlYW4gdmFsdWUgZGV0ZXJtaW5pbmcgaWYgcmVxdWVzdFNob3dDb250YWluZXIgc2hhbGwgb3BlbiB0aGUgcG9wb3ZlciBvciBub3QuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRhaW5lciBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKiBAcGFyYW0gcmVxdWVzdFNob3dDb250YWluZXJSZWFzb24gRW51bSBkZWZpbmluZyB0aGUgcmVhc29uIGZvciBwb3NzaWJsZSB0cmlnZ2VyXG5cdCAqIEByZXR1cm5zIEJvb2xlYW4gdmFsdWVcblx0ICovXG5cdHJlcXVlc3RTaG93Q29udGFpbmVyOiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRhaW5lcjogTURDUG9wb3ZlciwgcmVxdWVzdFNob3dDb250YWluZXJSZWFzb246IHN0cmluZykge1xuXHRcdC8vIEVuc3VyZSB0aGUgdmFsdWUgaGVscCBwb3BvdmVyIG9wZW5zIGZvciB0eXBpbmcsIGZpbHRlciwgdGFwIGV2ZW50cyBhbmQgdGFiIG5hdmlnYXRpb25cblx0XHRpZiAoW1JlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uLlRhYiwgUmVxdWVzdFNob3dDb250YWluZXJSZWFzb24uVGFwXS5pbmNsdWRlcyhyZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbikpIHtcblx0XHRcdHJldHVybiB0aGlzLmNvbmRpdGlvbkZvclJlcXVlc3RTaG93Q29udGFpbmVyKHZhbHVlSGVscCwgY29udGFpbmVyKTtcblx0XHR9IGVsc2UgaWYgKFtSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbi5UeXBpbmcsIFJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uLkZpbHRlcl0uaW5jbHVkZXMocmVxdWVzdFNob3dDb250YWluZXJSZWFzb24pKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50eXBlQWhlYWRGb3JGaWx0ZXJhYmxlQ29udGVudCh2YWx1ZUhlbHAsIGNvbnRhaW5lcik7XG5cdFx0fVxuXHRcdHJldHVybiBSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbi5WYWx1ZUhlbHBSZXF1ZXN0ID09PSByZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbjtcblx0fVxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztFQW1EQSxNQUFNQSx1QkFBdUIsR0FBRyxrQ0FBa0M7RUFDbEUsTUFBTUMseUJBQXlCLEdBQUcsaURBQWlEO0VBQUMsT0E0QnJFQyxNQUFNLENBQUNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRUMsaUJBQWlCLEVBQUU7SUFDbkRDLFVBQVUsRUFBRSxDQUFDO0lBQ2JDLHlCQUF5QixFQUFFLElBQUlDLE9BQU8sQ0FBd0IsQ0FBQztJQUUvRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDQyxpQkFBaUIsRUFBRSxTQUFBQSxDQUFVQyxTQUFvQixFQUFFQyxPQUE4QixFQUFFQyxZQUE4QixFQUFFO01BQ2xILE9BQU8sQ0FBQyxDQUFDRCxPQUFPLENBQUNFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0MsaUJBQWlCLEVBQUUsU0FBQUEsQ0FBVUosU0FBb0IsRUFBRUMsT0FBOEIsRUFBRUksV0FBdUMsRUFBRTtNQUMzSFYsaUJBQWlCLENBQUNTLGlCQUFpQixDQUFDSixTQUFTLEVBQUVDLE9BQU8sRUFBRUksV0FBVyxDQUFDO01BRXBFLElBQUlKLE9BQU8sQ0FBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUU7UUFDcEMsTUFBTUcsTUFBTSxHQUFHTCxPQUFPLENBQUNNLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU1DLGdCQUFnQixHQUFHQyxXQUFXLENBQUNDLG1CQUFtQixDQUFDSixNQUFNLENBQUMsQ0FBQyxDQUFDOztRQUVsRSxJQUFJRCxXQUFXLENBQUNNLFVBQVUsRUFBRTtVQUMxQk4sV0FBVyxDQUFDTSxVQUFVLENBQTZCQyxPQUFPLEdBQUdKLGdCQUFnQixJQUFJSyxTQUFTO1FBQzVGO01BQ0Q7SUFDRCxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDQywyQkFBMkJBLENBQUNDLE9BQWdCLEVBQTJCO01BQ3RFO01BQ0EsTUFBTUMsWUFBWSxHQUFHUCxXQUFXLENBQUNRLGVBQWUsQ0FBQ1IsV0FBVyxDQUFDUyxhQUFhLENBQUNILE9BQU8sQ0FBQyxDQUFDO01BQ3BGLE9BQU9DLFlBQVksQ0FBQ0csMEJBQTBCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLG9CQUFvQkEsQ0FBQ0MsWUFBNkIsRUFBRUMsWUFBNkIsRUFBVztNQUMzRjtNQUNBLElBQUlELFlBQVksQ0FBQ0UsUUFBUSxLQUFLRCxZQUFZLENBQUNDLFFBQVEsRUFBRTtRQUNwRCxPQUFPLEtBQUs7TUFDYjs7TUFFQTtNQUNBLE1BQU1DLE9BQU8sR0FBR0gsWUFBWSxDQUFDSSxNQUFNLElBQUksRUFBRTtNQUN6QyxNQUFNQyxPQUFPLEdBQUdKLFlBQVksQ0FBQ0csTUFBTSxJQUFJLEVBQUU7TUFFekMsSUFBSUQsT0FBTyxDQUFDRyxNQUFNLEtBQUtELE9BQU8sQ0FBQ0MsTUFBTSxFQUFFO1FBQ3RDLE9BQU8sS0FBSztNQUNiOztNQUVBO01BQ0EsTUFBTUMsYUFBYSxHQUFHLENBQUMsR0FBR0osT0FBTyxDQUFDLENBQUNLLElBQUksQ0FBQyxDQUFDQyxVQUFVLEVBQUVDLFdBQVcsS0FBS0MsTUFBTSxDQUFDRixVQUFVLENBQUMsQ0FBQ0csYUFBYSxDQUFDRCxNQUFNLENBQUNELFdBQVcsQ0FBQyxDQUFDLENBQUM7TUFDM0gsTUFBTUcsYUFBYSxHQUFHLENBQUMsR0FBR1IsT0FBTyxDQUFDLENBQUNHLElBQUksQ0FBQyxDQUFDQyxVQUFVLEVBQUVDLFdBQVcsS0FBS0MsTUFBTSxDQUFDRixVQUFVLENBQUMsQ0FBQ0csYUFBYSxDQUFDRCxNQUFNLENBQUNELFdBQVcsQ0FBQyxDQUFDLENBQUM7TUFFM0gsT0FBT0gsYUFBYSxDQUFDTyxLQUFLLENBQUMsQ0FBQ0MsS0FBSyxFQUFFQyxLQUFLLEtBQUtELEtBQUssS0FBS0YsYUFBYSxDQUFDRyxLQUFLLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0MsZUFBZSxFQUFFLGVBQUFBLENBQWdCQyxPQUF5QixFQUFFeEIsT0FBZ0IsRUFBNEI7TUFDdkcsSUFBSXdCLE9BQU8sQ0FBQ0MsT0FBTyxFQUFFQyxPQUFPLElBQUlGLE9BQU8sQ0FBQ0csc0JBQXNCLEtBQUssSUFBSSxFQUFFO1FBQ3hFLE1BQU1DLHVCQUF1QixHQUFHLElBQUksQ0FBQzdCLDJCQUEyQixDQUFDQyxPQUFPLENBQUM7UUFDekUsSUFBSTtVQUNILE1BQU02QixTQUFTLEdBQUcsTUFBTUQsdUJBQXVCLENBQUNFLFlBQVksQ0FBQ04sT0FBTyxDQUFDTyxZQUFZLEdBQUcsR0FBRyxHQUFHUCxPQUFPLENBQUNRLGtCQUFrQixDQUFDO1VBQ3JIUixPQUFPLENBQUNDLE9BQU8sQ0FBQ3JDLElBQUksR0FBR3lDLFNBQVM7VUFDaEMsT0FBT0EsU0FBUztRQUNqQixDQUFDLENBQUMsT0FBT0ksR0FBRyxFQUFFO1VBQ2JDLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDRixHQUFHLFlBQVlHLEtBQUssR0FBR0gsR0FBRyxDQUFDSSxPQUFPLEdBQUdwQixNQUFNLENBQUNnQixHQUFHLENBQUMsQ0FBQztRQUM1RDtNQUNEO01BQ0EsT0FBTyxFQUFFO0lBQ1YsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0ssZUFBZSxFQUFFLGVBQUFBLENBQWdCZCxPQUF5QixFQUFFZSxVQUE2QixFQUFFdkMsT0FBZ0IsRUFBaUI7TUFDM0gsSUFBSXdCLE9BQU8sQ0FBQ0MsT0FBTyxFQUFFQyxPQUFPLElBQUlGLE9BQU8sQ0FBQ0csc0JBQXNCLEtBQUssSUFBSSxJQUFJWSxVQUFVLENBQUMzQixNQUFNLEVBQUU7UUFDN0YsTUFBTTRCLGlCQUFpQixHQUFHLElBQUksQ0FBQ0MseUNBQXlDLENBQUNqQixPQUFPLENBQUM7UUFDakYsSUFBSWdCLGlCQUFpQixFQUFFO1VBQ3RCLE1BQU1wRCxJQUFxQixHQUFHLEVBQUU7VUFFaEMsS0FBSyxNQUFNc0QsU0FBUyxJQUFJSCxVQUFVLEVBQUU7WUFDbkMsSUFBSWYsT0FBTyxDQUFDbUIsZUFBZSxJQUFJRCxTQUFTLENBQUNFLFNBQVMsS0FBS0Msa0JBQWtCLENBQUNDLFNBQVMsRUFBRTtjQUNwRixNQUFNQyxtQkFBbUIsR0FBRyxJQUFJLENBQUNDLHdCQUF3QixDQUFDTixTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7Y0FDekUsSUFBSUssbUJBQW1CLEVBQUU7Z0JBQ3hCM0QsSUFBSSxDQUFDNkQsSUFBSSxDQUFDLElBQUksQ0FBQ0MscUNBQXFDLENBQUNILG1CQUFtQixDQUFDLENBQUM7Y0FDM0U7WUFDRDtVQUNEO1VBRUEsSUFBSTNELElBQUksQ0FBQ3dCLE1BQU0sRUFBRTtZQUNoQixNQUFNZ0IsdUJBQXVCLEdBQUcsSUFBSSxDQUFDN0IsMkJBQTJCLENBQUNDLE9BQU8sQ0FBQztZQUV6RSxJQUFJO2NBQ0gsTUFBTTRCLHVCQUF1QixDQUFDdUIsWUFBWSxDQUFDM0IsT0FBTyxDQUFDTyxZQUFZLEdBQUcsR0FBRyxHQUFHUCxPQUFPLENBQUNRLGtCQUFrQixFQUFFNUMsSUFBSSxDQUFDO1lBQzFHLENBQUMsQ0FBQyxPQUFPNkMsR0FBRyxFQUFFO2NBQ2JDLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDRixHQUFHLFlBQVlHLEtBQUssR0FBR0gsR0FBRyxDQUFDSSxPQUFPLEdBQUdwQixNQUFNLENBQUNnQixHQUFHLENBQUMsQ0FBQztZQUM1RDtVQUNEO1FBQ0Q7TUFDRDtJQUNELENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NpQixxQ0FBcUMsRUFBRSxTQUFBQSxDQUFVRSxnQkFBc0MsRUFBd0I7TUFDOUcsTUFBTUMsWUFBa0MsR0FBRyxDQUFDLENBQUM7TUFDN0MsS0FBSyxNQUFNQyxHQUFHLElBQUlGLGdCQUFnQixFQUFFO1FBQ25DRyxVQUFVLENBQUNDLEdBQUcsQ0FBQ0YsR0FBRyxDQUFDRyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUVMLGdCQUFnQixDQUFDRSxHQUFHLENBQUMsRUFBRUQsWUFBWSxDQUFDO01BQ3BFO01BQ0EsT0FBT0EsWUFBWTtJQUNwQixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NLLHFCQUFxQixFQUFFLFNBQUFBLENBQVVyQyxLQUFZLEVBQUVzQyxlQUF3QixFQUFXO01BQ2pGLElBQUlDLG9CQUFvQixHQUFHLEtBQUs7TUFDaEMsSUFBSUQsZUFBZSxFQUFFO1FBQ3BCQyxvQkFBb0IsR0FDbkIsT0FBT3ZDLEtBQUssS0FBSyxRQUFRLEdBQ3RCQSxLQUFLLENBQUNvQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUNyQyxLQUFLLENBQUV5QyxJQUFJLElBQUtBLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSXhDLEtBQUssS0FBSyxFQUFFLEdBQzdEQSxLQUFLLEtBQUssSUFBSSxJQUFJQSxLQUFLLEtBQUt2QixTQUFTLElBQUl1QixLQUFLLEtBQUssQ0FBQztNQUN6RDtNQUNBLE9BQU91QyxvQkFBb0I7SUFDNUIsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NFLGFBQWEsRUFBRSxlQUFBQSxDQUNkN0UsU0FBb0IsRUFDcEI4RSxXQUE2QixFQUM3QnpFLFdBQXVDLEVBQ3ZDSixPQUFlLEVBQ0M7TUFDaEI7TUFDQSxJQUFJLENBQUM2RSxXQUFXLENBQUNDLEdBQUcsQ0FBQyx3Q0FBd0MsQ0FBQyxFQUFFO1FBQy9EO01BQ0Q7O01BRUE7TUFDQSxNQUFNeEMsT0FBTyxHQUFHdkMsU0FBUyxDQUFDZ0YsVUFBVSxDQUFDLENBQXFCO01BQzFELElBQUkvRSxPQUFPLENBQUNnRixXQUFXLENBQUMsQ0FBQyxFQUFFO1FBQzFCLElBQUlDLCtCQUF5RDs7UUFFN0Q7UUFDQSxNQUFNQyxVQUFVLEdBQUcsSUFBSUMsT0FBTyxDQUFPLFVBQVVDLE9BQU8sRUFBRTtVQUN2REgsK0JBQStCLEdBQUdHLE9BQU87UUFDMUMsQ0FBQyxDQUFDO1FBRUYsTUFBTUMsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDekYseUJBQXlCLENBQUMwRixHQUFHLENBQUNULFdBQVcsQ0FBQztRQUN4RjtRQUNBLElBQUksQ0FBQ2pGLHlCQUF5QixDQUFDMEUsR0FBRyxDQUNqQ08sV0FBVyxFQUNYUSxnQ0FBZ0MsR0FBR0EsZ0NBQWdDLENBQUNFLElBQUksQ0FBQyxZQUFZTCxVQUFVLENBQUMsR0FBR0EsVUFDcEcsQ0FBQztRQUVELE1BQU01QixpQkFBaUIsR0FBRyxJQUFJLENBQUNDLHlDQUF5QyxDQUFDakIsT0FBTyxDQUFDO1FBQ2pGLE1BQU1rRCxLQUFLLEdBQUd4RixPQUFPLENBQUN5RixVQUFVLENBQUMsQ0FBMEM7UUFDM0UsTUFBTUMsK0JBQStCLEdBQ3BDRixLQUFLLENBQUNWLEdBQUcsQ0FBYyx3QkFBd0IsQ0FBQyxJQUFJVSxLQUFLLENBQUNWLEdBQUcsQ0FBa0IsNEJBQTRCLENBQUM7UUFDN0csTUFBTWEsVUFBVSxHQUFHLENBQUNELCtCQUErQixJQUFJRixLQUFLLENBQUNJLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU1DLGdCQUF1QyxHQUFHLEVBQUU7O1FBRWxEO1FBQ0E7UUFDQSxNQUFNcEIsZUFBZSxHQUNuQmUsS0FBSyxDQUFDTSxRQUFRLENBQUMsQ0FBQyxDQUFnQkMsWUFBWSxDQUFDLENBQUMsQ0FBQ0MsU0FBUyxDQUFDLEdBQUcxRCxPQUFPLENBQUNPLFlBQVksR0FBR3RELHlCQUF5QixFQUFFLENBQUMsSUFBSSxLQUFLO1FBQzFILElBQUksQ0FBQ29HLFVBQVUsSUFBSUgsS0FBSyxDQUFDUyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDekIscUJBQXFCLENBQUNtQixVQUFVLEVBQUVsQixlQUFlLENBQUMsRUFBRTtVQUMxRztVQUNBLE1BQU1qRCxNQUFNLEdBQUcsSUFBSSxDQUFDMEUsMEJBQTBCLENBQUNsRyxPQUFPLEVBQUVzQyxPQUFPLENBQUM7O1VBRWhFO1VBQ0EsSUFBSWQsTUFBTSxDQUFDRSxNQUFNLEVBQUU7WUFDbEJtRSxnQkFBZ0IsQ0FBQzlCLElBQUksQ0FBQztjQUFFbEIsWUFBWSxFQUFFUyxpQkFBaUI7Y0FBRTlCLE1BQU07Y0FBRTJFLFFBQVEsRUFBRUMsdUJBQXVCLENBQUNDO1lBQWUsQ0FBQyxDQUFDO1VBQ3JIO1FBQ0Q7UUFFQSxNQUFNQyxLQUFLLEdBQUd0RyxPQUFPLENBQUN1RyxRQUFRLENBQUMsQ0FBQztRQUNoQyxNQUFNQyxpQkFBaUIsR0FBR0YsS0FBSyxDQUFDRyxhQUFhLENBQUMsQ0FBQyxDQUFDQyxNQUFNLENBQUV4RyxJQUFJLElBQUtBLElBQUksQ0FBQ3lHLE1BQU0sQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDO1FBQzdGLElBQUlDLE9BQXFCLEdBQUcsRUFBRTtRQUM5QixJQUFJSixpQkFBaUIsQ0FBQzlFLE1BQU0sRUFBRWtGLE9BQU8sR0FBR0osaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUNaLFFBQVEsQ0FBQyxDQUFDLENBQUNnQixPQUFPO1FBRS9FLE1BQU0sSUFBSSxDQUFDQyxtQ0FBbUMsQ0FDN0N2RSxPQUFPLEVBQ1B1QyxXQUFXLEVBQ1h6RSxXQUFXLEVBQ1h5RixnQkFBZ0IsRUFDaEJ2QyxpQkFBaUIsRUFDakJrQyxLQUFLLEVBQ0xvQixPQUFPLEVBQ1BOLEtBQ0QsQ0FBQztRQUNELElBQUlyQiwrQkFBK0IsRUFBRTtVQUNwQztVQUNBQSwrQkFBK0IsQ0FBQyxDQUFDO1FBQ2xDO01BQ0QsQ0FBQyxNQUFNO1FBQ047UUFDQSxJQUFJLENBQUM2QixjQUFjLENBQUNqQyxXQUFXLEVBQUV6RSxXQUFXLENBQUM7TUFDOUM7SUFDRCxDQUFDO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQzJHLGFBQWEsRUFBRSxlQUFBQSxDQUFnQmhILFNBQW9CLEVBQUU4RSxXQUE2QixFQUFFbUMsY0FBc0IsRUFBRTtNQUMzR25DLFdBQVcsQ0FBQ29DLFdBQVcsQ0FBQyxDQUFDLEVBQUVELGNBQWMsQ0FBQztNQUUxQyxNQUFNLElBQUksQ0FBQ0UsdUJBQXVCLENBQUNuSCxTQUFTLEVBQUU4RSxXQUFXLEVBQUVtQyxjQUFjLENBQUM7TUFDMUUsT0FBT25DLFdBQVc7SUFDbkIsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDcUMsdUJBQXVCLEVBQUUsZUFBQUEsQ0FBZ0JDLFVBQXFCLEVBQUV0QyxXQUF5QyxFQUFFbUMsY0FBc0IsRUFBRTtNQUNsSSxJQUFJSSxTQUFTLEdBQUcsS0FBSztNQUNyQixJQUFJdkMsV0FBVyxJQUFJLElBQUksQ0FBQ2pGLHlCQUF5QixDQUFDeUgsR0FBRyxDQUFDeEMsV0FBVyxDQUFDLEVBQUU7UUFDbkUsTUFBTSxJQUFJLENBQUNqRix5QkFBeUIsQ0FBQzBGLEdBQUcsQ0FBQ1QsV0FBVyxDQUFDO01BQ3REO01BQ0EsSUFBSUEsV0FBVyxJQUFJLENBQUNBLFdBQVcsQ0FBQ3lDLFdBQVcsQ0FBQyxDQUFDLEVBQUU7UUFDOUMsSUFBSTtVQUNILE1BQU1DLFFBQVEsR0FBRyxNQUFNMUMsV0FBVyxDQUFDMkMsZUFBZSxDQUFDLENBQUMsRUFBRVIsY0FBYyxDQUFDO1VBQ3JFSSxTQUFTLEdBQUdHLFFBQVEsQ0FBQzdGLE1BQU0sS0FBSyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxPQUFPdUIsS0FBYyxFQUFFO1VBQ3hCLElBQUlBLEtBQUssSUFBS0EsS0FBSyxFQUE2QndFLFFBQVEsRUFBRTtZQUN6RCxPQUFPTCxTQUFTO1VBQ2pCO1VBQ0EsTUFBTW5FLEtBQUs7UUFDWjtNQUNEO01BQ0EsT0FBT21FLFNBQVM7SUFDakIsQ0FBQztJQUVETSxVQUFVLEVBQUUsU0FBQUEsQ0FBVVAsVUFBcUIsRUFBRTtNQUM1QyxPQUFPUSxPQUFPO0lBQ2YsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLGVBQWUsRUFBRSxlQUFBQSxDQUFnQjdILFNBQW9CLEVBQUU4SCxTQUFvQixFQUFFQyxTQUFpQixFQUFFO01BQy9GLE1BQU14RixPQUFPLEdBQUd2QyxTQUFTLENBQUNnRixVQUFVLENBQUMsQ0FBcUI7TUFDMUQsT0FBT2dELGVBQWUsQ0FBQ0MsYUFBYSxDQUFDMUYsT0FBTyxFQUFFdUYsU0FBUyxFQUFFQyxTQUFTLENBQUM7SUFDcEUsQ0FBQztJQUVEaEUsd0JBQXdCLEVBQUUsU0FBQUEsQ0FBVU4sU0FBMEIsRUFBRTtNQUMvRCxNQUFNSyxtQkFBbUIsR0FBSUwsU0FBUyxDQUFDbEIsT0FBTyxJQUFJLENBQUMsQ0FBeUI7UUFDM0UyRixtQkFBbUIsR0FBR3pJLE1BQU0sQ0FBQzBJLElBQUksQ0FBQ3JFLG1CQUFtQixDQUFDO1FBQ3REc0Usb0JBQW9CLEdBQUdGLG1CQUFtQixDQUFDdkcsTUFBTSxHQUFHbUMsbUJBQW1CLENBQUNvRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7TUFFckcsT0FBT0Usb0JBQW9CO0lBQzVCLENBQUM7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0M1RSx5Q0FBeUMsRUFBRSxTQUFBQSxDQUFVakIsT0FBeUIsRUFBRTtNQUMvRSxNQUFNOEYsTUFBTSxHQUFHOUYsT0FBTyxDQUFDK0YsVUFBVSxDQUFDL0YsT0FBTyxDQUFDUSxrQkFBa0IsQ0FBQyxFQUFFd0YsWUFBWSxJQUFJLEVBQUU7TUFDakYsTUFBTUosSUFBSSxHQUFHNUYsT0FBTyxDQUFDK0YsVUFBVSxDQUFDL0YsT0FBTyxDQUFDUSxrQkFBa0IsQ0FBQyxFQUFFeUYsTUFBTSxJQUFJLEVBQUU7TUFDekUsTUFBTUMsZUFBZSxHQUFHbEcsT0FBTyxDQUFDbUcsZ0JBQWdCO01BQ2hELElBQUlDLFlBQXNCLEdBQUcsQ0FBQyxHQUFHUixJQUFJLENBQUM7TUFDdEMsTUFBTVMsU0FBbUIsR0FBRyxFQUFFO01BQzlCLElBQUlQLE1BQU0sQ0FBQzFHLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDdEI7UUFDQTBHLE1BQU0sQ0FBQ1EsT0FBTyxDQUFDLFVBQVVDLEtBQXFCLEVBQUU7VUFDL0NGLFNBQVMsQ0FBQzVFLElBQUksQ0FBQzhFLEtBQUssQ0FBQ0MsUUFBUSxDQUFDO1FBQy9CLENBQUMsQ0FBQztRQUNGO1FBQ0FKLFlBQVksR0FBR1IsSUFBSSxDQUFDeEIsTUFBTSxDQUFFdEMsR0FBVyxJQUFLO1VBQzNDLE9BQU8sQ0FBQ3VFLFNBQVMsQ0FBQ0ksUUFBUSxDQUFDM0UsR0FBRyxDQUFDO1FBQ2hDLENBQUMsQ0FBQztNQUNIOztNQUVBO01BQ0EsT0FBT29FLGVBQWUsSUFBSUUsWUFBWSxDQUFDSyxRQUFRLENBQUNQLGVBQWUsQ0FBQyxHQUFHQSxlQUFlLEdBQUcsRUFBRTtJQUN4RixDQUFDO0lBRURRLGtDQUFrQyxFQUFFLGVBQUFBLENBQ25DM0YsVUFBNkIsRUFDN0I0RixhQUErQixFQUMvQkMsU0FBb0IsRUFDcEI1RyxPQUF5QixFQUN6QjZHLG1CQUE4QixFQUM3QjtNQUNELElBQUk7UUFDSCxNQUFNQyxLQUF3QixHQUFHLE1BQU1DLFNBQVMsQ0FBQ0MscUJBQXFCLENBQUNILG1CQUFtQixDQUFDO1FBQzNGLE1BQU1JLFVBQVUsR0FBR0gsS0FBSyxDQUFDSSxLQUFLLENBQUMsQ0FBQztRQUNoQyxNQUFNQyxtQkFBbUIsR0FBR0MsV0FBVyxDQUFDQyxxQkFBcUIsQ0FBQ1QsU0FBc0MsQ0FBQztRQUNyRyxNQUFNVSxTQUFTLEdBQUdWLFNBQVMsQ0FBQ3BELFFBQVEsQ0FBQyxDQUFDLEVBQUVDLFlBQVksQ0FBQyxDQUFtQjtRQUN4RTtRQUNBO1FBQ0EsS0FBSyxNQUFNOEQsWUFBWSxJQUFJWixhQUFhLEVBQUU7VUFDekMsTUFBTWEsaUJBQWlCLEdBQUcsSUFBSSxDQUFDQyxzQ0FBc0MsQ0FDcEVGLFlBQVksRUFDWnZILE9BQU8sQ0FBQ08sWUFBWSxFQUNwQitHLFNBQVMsRUFDVEgsbUJBQ0QsQ0FBQztVQUNELElBQ0NLLGlCQUFpQixJQUNqQlAsVUFBVSxFQUFFUyxJQUFJLENBQ2RDLElBQUksSUFDSkEsSUFBSSxDQUFDQyxJQUFJLEtBQUtKLGlCQUFpQixDQUFDSSxJQUFJLEtBQ25DSixpQkFBaUIsQ0FBQ0ssYUFBYSxLQUFLdkosU0FBUyxJQUFJa0osaUJBQWlCLENBQUNLLGFBQWEsS0FBSyxDQUFDLENBQ3pGLENBQUMsRUFDQTtZQUNEO1lBQ0E7WUFDQTtZQUNBO1lBQ0EsTUFBTUMsYUFBYSxHQUFHTixpQkFBaUIsQ0FBQ00sYUFBdUI7WUFDL0QsSUFBSWhCLEtBQUssQ0FBQzFDLE1BQU0sQ0FBQzBELGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2NBQ3JDaEIsS0FBSyxDQUFDMUMsTUFBTSxDQUFDMEQsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNDLFFBQVEsR0FBRyxLQUFLO1lBQ2hEO1VBQ0Q7UUFDRDtRQUNBO1FBQ0EsS0FBSyxNQUFNN0csU0FBUyxJQUFJSCxVQUFVLEVBQUU7VUFDbkMsTUFBTThFLG9CQUFvQixHQUFHLElBQUksQ0FBQ3JFLHdCQUF3QixDQUFDTixTQUFTLENBQUM7VUFDckUsS0FBSyxNQUFNcUcsWUFBWSxJQUFJWixhQUFhLEVBQUU7WUFDekMsTUFBTWEsaUJBQWlCLEdBQUcsSUFBSSxDQUFDQyxzQ0FBc0MsQ0FDcEVGLFlBQVksRUFDWnZILE9BQU8sQ0FBQ08sWUFBWSxFQUNwQitHLFNBQVMsRUFDVEgsbUJBQ0QsQ0FBQztZQUNEO1lBQ0E7WUFDQSxJQUFJSyxpQkFBaUIsSUFBSVAsVUFBVSxFQUFFUyxJQUFJLENBQUVDLElBQUksSUFBS0EsSUFBSSxDQUFDQyxJQUFJLEtBQUtKLGlCQUFpQixDQUFDSSxJQUFJLENBQUMsRUFBRTtjQUMxRixLQUFLLE1BQU1oRyxnQkFBZ0IsSUFBSWlFLG9CQUFvQixFQUFFO2dCQUNwRCxNQUFNOUcsWUFBWSxHQUFHaUosU0FBUyxDQUFDQyxlQUFlLENBQzdDLElBQUksRUFDSixDQUFDckcsZ0JBQWdCLENBQUMyRixZQUFZLENBQUNmLFFBQVEsQ0FBQyxDQUFDLEVBQ3pDLElBQUksRUFDSixJQUFJLEVBQ0puRixrQkFBa0IsQ0FBQ0MsU0FDcEIsQ0FBQztnQkFDRCxNQUFNd0csYUFBYSxHQUFHTixpQkFBaUIsQ0FBQ00sYUFBdUI7Z0JBQy9ELE1BQU1JLHNCQUFzQixHQUFHcEIsS0FBSyxDQUFDMUMsTUFBTSxDQUFDMEQsYUFBYSxDQUFDLEVBQUVKLElBQUksQ0FBRVMsYUFBYSxJQUFLO2tCQUNuRixPQUFPQSxhQUFhLENBQUNKLFFBQVE7a0JBQzdCLE1BQU07b0JBQUVBLFFBQVEsRUFBRUssU0FBUztvQkFBRSxHQUFHQztrQkFBbUIsQ0FBQyxHQUFHRixhQUFhO2tCQUNwRSxJQUFJLElBQUksQ0FBQ3RKLG9CQUFvQixDQUFDd0osa0JBQWtCLEVBQUV0SixZQUFZLENBQUMsRUFBRTtvQkFDaEVvSixhQUFhLENBQUNKLFFBQVEsR0FBRyxJQUFJO29CQUM3QixPQUFPLElBQUk7a0JBQ1o7a0JBQ0EsT0FBTyxLQUFLO2dCQUNiLENBQUMsQ0FBQztnQkFDRixJQUFJLENBQUNHLHNCQUFzQixFQUFFO2tCQUM1QnBCLEtBQUssQ0FBQzFDLE1BQU0sQ0FBQzBELGFBQWEsQ0FBQyxLQUFLLEVBQUU7a0JBQ2xDaEIsS0FBSyxDQUFDMUMsTUFBTSxDQUFDMEQsYUFBYSxDQUFDLENBQUNyRyxJQUFJLENBQUMxQyxZQUFZLENBQUM7Z0JBQy9DO2NBQ0Q7WUFDRDtVQUNEO1FBQ0Q7UUFDQTtRQUNBZ0ksU0FBUyxDQUFDdUIsa0JBQWtCLENBQUMxQixTQUFTLEVBQUVFLEtBQUssQ0FBQztNQUMvQyxDQUFDLENBQUMsT0FBT3JHLEdBQUcsRUFBRTtRQUNiLE1BQU1JLE9BQU8sR0FBR0osR0FBRyxZQUFZRyxLQUFLLEdBQUdILEdBQUcsQ0FBQ0ksT0FBTyxHQUFHcEIsTUFBTSxDQUFDZ0IsR0FBRyxDQUFDO1FBQ2hFQyxHQUFHLENBQUNDLEtBQUssQ0FBQyxzQkFBc0JFLE9BQU8sRUFBRSxDQUFDO01BQzNDO0lBQ0QsQ0FBQztJQUVENEcsc0NBQXNDLEVBQUUsU0FBQUEsQ0FDdkNGLFlBQTRCLEVBQzVCaEgsWUFBb0IsRUFDcEIrRyxTQUF5QixFQUN6QkgsbUJBQW1DLEVBQ2xDO01BQ0QsTUFBTW9CLFdBQVcsR0FBRyxJQUFJaEksWUFBWSxDQUFDMEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO01BQ3BELE1BQU11RyxZQUFZLEdBQUdqQixZQUFZLENBQUNrQixNQUFNLENBQUN4RyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUN5RyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUU7TUFDekUsTUFBTUMsU0FBUyxHQUFHcEksWUFBWSxDQUFDcUksV0FBVyxDQUFDLEdBQUcsQ0FBQztNQUMvQyxNQUFNQyxnQkFBZ0IsR0FBR0YsU0FBUyxHQUFHLENBQUMsR0FBRyxHQUFHcEksWUFBWSxDQUFDdUksU0FBUyxDQUFDLENBQUMsRUFBRUgsU0FBUyxDQUFDLElBQUlILFlBQVksRUFBRSxHQUFHQSxZQUFZO01BQ2pILE1BQU1PLGNBQWMsR0FBR3pCLFNBQVMsRUFBRTBCLGNBQWMsQ0FBQ0gsZ0JBQWdCLEVBQUVOLFdBQVcsQ0FBQztNQUMvRSxPQUFPcEIsbUJBQW1CLENBQUNPLElBQUksQ0FBRUMsSUFBSSxJQUFLQSxJQUFJLENBQUNvQixjQUFjLEtBQUtBLGNBQWMsQ0FBQztJQUNsRixDQUFDO0lBRURFLHVDQUF1QyxFQUFFLFNBQUFBLENBQ3hDbEksVUFBNkIsRUFDN0I0RixhQUErQixFQUMvQnVDLE9BQXVCLEVBQ3ZCekwsU0FBb0IsRUFDbkI7TUFDRCxNQUFNNkosU0FBUyxHQUFHNEIsT0FBTyxDQUFDMUYsUUFBUSxDQUFDLENBQUMsQ0FBQ0MsWUFBWSxDQUFDLENBQUM7TUFFbkQsS0FBSyxNQUFNdkMsU0FBUyxJQUFJSCxVQUFVLEVBQUU7UUFDbkMsTUFBTThFLG9CQUFvQixHQUFHLElBQUksQ0FBQ3JFLHdCQUF3QixDQUFDTixTQUFTLENBQUM7VUFDcEVpSSxTQUFTLEdBQUd0RCxvQkFBb0IsQ0FBQ3pHLE1BQU0sS0FBSyxDQUFDLEdBQUd5RyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsR0FBR3ZILFNBQVM7UUFFcEYsSUFBSXVILG9CQUFvQixDQUFDekcsTUFBTSxHQUFHLENBQUMsRUFBRTtVQUNwQ3NCLEdBQUcsQ0FBQzBJLE9BQU8sQ0FBQyxvRUFBb0UsQ0FBQztRQUNsRjtRQUNBLElBQUlELFNBQVMsRUFBRTtVQUNkLElBQUksQ0FBQ0UscUNBQXFDLENBQUMvQixTQUFTLEVBQUU2QixTQUFTLEVBQUV4QyxhQUFhLEVBQUV1QyxPQUFPLEVBQUV6TCxTQUFTLENBQUM7UUFDcEc7TUFDRDtJQUNELENBQUM7SUFFRDRMLHFDQUFxQyxFQUFFLFNBQUFBLENBQ3RDL0IsU0FBeUIsRUFDekI2QixTQUErQixFQUMvQnhDLGFBQStCLEVBQy9CdUMsT0FBdUIsRUFDdkJ6TCxTQUFvQixFQUNuQjtNQUNELE1BQU02TCxpQkFBaUIsR0FBR0MsWUFBWSxDQUFDakMsU0FBUyxDQUFDO01BQ2pELE1BQU1rQyxRQUFRLEdBQUdsQyxTQUFTLENBQUNtQyxjQUFjLENBQUNQLE9BQU8sQ0FBQ1EsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDQSxPQUFPLENBQUMsQ0FBQztNQUN0RSxNQUFNQyw0QkFBNEIsR0FBR1QsT0FBTyxDQUFDVSxXQUFXLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDVixPQUFPLENBQUNXLFVBQVUsQ0FBQyxDQUFDO01BQzVGLE1BQU1DLG1CQUE2QixHQUFHLEVBQUU7TUFDeEMsS0FBSyxNQUFNdkMsWUFBWSxJQUFJWixhQUFhLEVBQUU7UUFDekM7UUFDQSxJQUFJLENBQUNvRCw4QkFBOEIsQ0FDbENULGlCQUFpQixFQUNqQkUsUUFBUSxFQUNSTCxTQUFTLEVBQ1Q1QixZQUFZLEVBQ1oyQixPQUFPLEVBQ1BTLDRCQUNELENBQUM7UUFDREcsbUJBQW1CLENBQUNySSxJQUFJLENBQUM4RixZQUFZLENBQUNrQixNQUFNLENBQUM7TUFDOUM7TUFDQSxNQUFNdUIsSUFBSSxHQUFHOUwsV0FBVyxDQUFDUyxhQUFhLENBQUNsQixTQUFTLENBQUM7TUFDakQsTUFBTXdNLGtCQUFrQixHQUFHRCxJQUFJLENBQUNFLGFBQWEsQ0FBQyxDQUFDLENBQUNELGtCQUFrQjtNQUNsRSxJQUFJQSxrQkFBa0IsQ0FBQ0UsV0FBVyxDQUFDLENBQUMsSUFBSUwsbUJBQW1CLENBQUMxSyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3ZFO1FBQ0EsSUFBSWdMLE9BQU87UUFDWCxJQUFJbEIsT0FBTyxDQUFDbUIsVUFBVSxDQUFDLENBQUMsQ0FBQzdILEdBQUcsQ0FBQyx3Q0FBd0MsQ0FBQyxFQUFFO1VBQ3ZFNEgsT0FBTyxHQUFHbEIsT0FBTyxDQUFDbUIsVUFBVSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxNQUFNO1VBQ05ELE9BQU8sR0FBR0osSUFBSSxDQUFDTSxpQkFBaUIsQ0FBQyxDQUFDLENBQUNELFVBQVUsQ0FBQyxDQUFDO1FBQ2hEO1FBQ0E7QUFDSDtRQUNHRCxPQUFPLENBQUNHLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNO1VBQy9DTixrQkFBa0IsQ0FBQ08sSUFBSSxDQUFDO1lBQ3ZCQyxNQUFNLEVBQUVDLFFBQVEsQ0FBQ0MsTUFBTTtZQUN2QmpOLE9BQU8sRUFBRW9NLG1CQUFtQixDQUFDYyxHQUFHLENBQUVuQyxNQUFNLElBQUtTLE9BQU8sQ0FBQ1EsT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUdqQixNQUFNO1VBQzlFLENBQUMsQ0FBQztRQUNILENBQUMsQ0FBQztNQUNIO0lBQ0QsQ0FBQztJQUVEc0IsOEJBQThCLEVBQUUsU0FBQUEsQ0FDL0JULGlCQUFvQyxFQUNwQ0UsUUFBZ0IsRUFDaEJMLFNBQStCLEVBQy9CNUIsWUFBNEIsRUFDNUIyQixPQUF1QixFQUN2QlMsNEJBQXFDLEVBQ3BDO01BQ0Q7TUFDQSxNQUFNcEosWUFBWSxHQUFHLEdBQUdpSixRQUFRLElBQUlqQyxZQUFZLENBQUNrQixNQUFNLEVBQUU7TUFDekQsTUFBTW9DLGNBQWMsR0FBR3ZCLGlCQUFpQixDQUFDd0IsV0FBVyxDQUFXdkssWUFBWSxDQUFDLENBQUN3SyxNQUFNO01BQ25GLE1BQU1DLFlBQVksR0FBR0gsY0FBYyxFQUFFSSxXQUFXLEVBQUVDLE1BQU0sRUFBRUMsWUFBWTtNQUN0RSxNQUFNQyxlQUFlLEdBQUdDLDBCQUEwQixDQUFDTCxZQUFZLENBQUMsR0FBRzlCLE9BQU8sQ0FBQ29DLFdBQVcsQ0FBQ04sWUFBWSxDQUFDTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSztNQUN2SCxJQUFJSCxlQUFlLElBQUl6Qiw0QkFBNEIsRUFBRTtRQUNwRDtRQUNBLE1BQU1oQixTQUFTLEdBQUdwQixZQUFZLENBQUNrQixNQUFNLENBQUNHLFdBQVcsQ0FBQyxHQUFHLENBQUM7UUFDdEQsTUFBTTRDLGNBQWMsR0FBRzdDLFNBQVMsR0FBRyxDQUFDLEdBQUdwQixZQUFZLENBQUNrQixNQUFNLENBQUNLLFNBQVMsQ0FBQyxDQUFDLEVBQUVILFNBQVMsQ0FBQyxHQUFHcEIsWUFBWSxDQUFDa0IsTUFBTTtRQUN4RztRQUNBO1FBQ0FTLE9BQU8sQ0FBQ3VDLGtCQUFrQixDQUFDLENBQUNELGNBQWMsQ0FBQyxDQUFDO01BQzdDLENBQUMsTUFBTTtRQUNOO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxNQUFNRSxVQUFVLEdBQUd4QyxPQUFPLENBQUNvQyxXQUFXLENBQUMvRCxZQUFZLENBQUNrQixNQUFNLENBQUM7UUFDM0QsTUFBTWtELE1BQU0sR0FBR3hDLFNBQVMsQ0FBQzVCLFlBQVksQ0FBQ2YsUUFBUSxDQUFDO1FBQy9DLElBQUlrRixVQUFVLEtBQUtDLE1BQU0sRUFBRTtVQUMxQnpDLE9BQU8sQ0FBQzBDLFdBQVcsQ0FBQ3JFLFlBQVksQ0FBQ2tCLE1BQU0sRUFBRSxJQUFJLENBQUM7VUFDOUNTLE9BQU8sQ0FBQzBDLFdBQVcsQ0FBQ3JFLFlBQVksQ0FBQ2tCLE1BQU0sRUFBRVUsU0FBUyxDQUFDNUIsWUFBWSxDQUFDZixRQUFRLENBQUMsQ0FBQztRQUMzRTtNQUNEO01BQ0E7TUFDQSxNQUFNcUYsUUFBUSxHQUFHUiwwQkFBMEIsQ0FBQ1IsY0FBYyxFQUFFSSxXQUFXLEVBQUVDLE1BQU0sRUFBRVksSUFBSSxDQUFDLEdBQ25GakIsY0FBYyxFQUFFSSxXQUFXLEVBQUVDLE1BQU0sRUFBRVksSUFBSSxDQUFDUCxJQUFJLEdBQzlDak4sU0FBUztNQUNaLElBQUl1TixRQUFRLEtBQUt2TixTQUFTLElBQUlxTCw0QkFBNEIsRUFBRTtRQUMzRCxNQUFNaEIsU0FBUyxHQUFHa0QsUUFBUSxDQUFDakQsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUMzQyxNQUFNNEMsY0FBYyxHQUFHN0MsU0FBUyxHQUFHLENBQUMsR0FBR2tELFFBQVEsQ0FBQy9DLFNBQVMsQ0FBQyxDQUFDLEVBQUVILFNBQVMsQ0FBQyxHQUFHa0QsUUFBUTtRQUNsRjtRQUNBM0MsT0FBTyxDQUFDdUMsa0JBQWtCLENBQUMsQ0FBQ0QsY0FBYyxDQUFDLENBQUM7TUFDN0M7SUFDRCxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NPLG1CQUFtQixFQUFFLFNBQUFBLENBQVV0TyxTQUFvQixFQUFFQyxPQUFnQixFQUFFc08sTUFBc0IsRUFBRTtNQUM5RixJQUFJLElBQUksQ0FBQ0MsMEJBQTBCLEVBQUU7UUFDcEMsT0FBTyxJQUFJLENBQUNBLDBCQUEwQixDQUFDeE8sU0FBUyxFQUFFQyxPQUFPLEVBQUdzTyxNQUFNLElBQUlBLE1BQU0sQ0FBQ3hOLE9BQU8sSUFBTWQsT0FBTyxJQUFJQSxPQUFPLENBQUN5RixVQUFVLENBQUMsQ0FBRSxDQUFDO01BQzVIO01BQ0EsT0FBTyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDK0ksc0JBQXNCLEVBQUUsZUFBQUEsQ0FBZ0J6TyxTQUFvQixFQUFFME8sTUFBYyxFQUFFQyxPQUFnQixFQUFFO01BQy9GLE1BQU1wTSxPQUFPLEdBQUd2QyxTQUFTLENBQUNnRixVQUFVLENBQUMsQ0FBcUI7TUFDMUQsSUFBSTBKLE1BQU0sS0FBSyxlQUFlLElBQUluTSxPQUFPLENBQUNxTSwwQkFBMEIsRUFBRTtRQUNyRTtRQUNBO1FBQ0E7UUFDQTtRQUNBO01BQ0Q7TUFDQSxNQUFNQyxTQUFTLEdBQUd0TSxPQUFPLENBQUMrRixVQUFVLENBQUMvRixPQUFPLENBQUNRLGtCQUFrQixDQUFDO01BQ2hFLE1BQU1tRyxhQUFhLEdBQUcyRixTQUFTLEVBQUV0RyxZQUFZLEtBQUsxSCxTQUFTLEdBQUdtSCxlQUFlLENBQUM4RyxnQkFBZ0IsQ0FBQ0QsU0FBUyxDQUFDdEcsWUFBWSxDQUFDLEdBQUcsRUFBRTtRQUMxSDlDLEtBQUssR0FBR3pGLFNBQVMsQ0FBQzBGLFVBQVUsQ0FBQyxDQUFjO1FBQzNDcUosV0FBVyxHQUFHdEosS0FBSyxDQUFDdUosU0FBUyxDQUFDLENBQTRCO01BRTNELElBQUkxTCxVQUFVLEdBQUdtQyxLQUFLLENBQUN3SixhQUFhLENBQUMsQ0FBc0I7TUFDM0QsSUFBSSxDQUFDMU0sT0FBTyxDQUFDMk0sMEJBQTBCLEVBQUU7UUFDeEMsSUFBSSxDQUFDN0wsZUFBZSxDQUFDZCxPQUFPLEVBQUVlLFVBQVUsRUFBRW1DLEtBQUssQ0FBQztNQUNqRDtNQUNBbkMsVUFBVSxHQUFHQSxVQUFVLENBQUNxRCxNQUFNLENBQUMsVUFBVWxELFNBQVMsRUFBRTtRQUNuRCxNQUFNSyxtQkFBbUIsR0FBSUwsU0FBUyxDQUFDbEIsT0FBTyxJQUFJLENBQUMsQ0FBeUI7UUFDNUUsT0FBT3VCLG1CQUFtQixDQUFDdkIsT0FBTyxDQUFDUSxrQkFBa0IsQ0FBQztNQUN2RCxDQUFDLENBQUM7TUFFRixNQUFNcUcsbUJBQW1CLEdBQUczRCxLQUFLLENBQUN1SixTQUFTLENBQUMsQ0FBNEIsQ0FBQyxDQUFDO01BQzFFLElBQUk1RixtQkFBbUIsQ0FBQ3JFLEdBQUcsQ0FBQ3hGLHVCQUF1QixDQUFDLElBQUkySixhQUFhLENBQUN2SCxNQUFNLElBQUkyQixVQUFVLENBQUMzQixNQUFNLEVBQUU7UUFDbEc7UUFDQSxNQUFNLElBQUksQ0FBQ3NILGtDQUFrQyxDQUM1QzNGLFVBQVUsRUFDVjRGLGFBQWEsRUFDYjZGLFdBQVcsRUFDWHhNLE9BQU8sRUFDUDZHLG1CQUNELENBQUM7UUFDRDtNQUNELENBQUMsTUFBTTtRQUNOO1FBQ0E7UUFDQSxNQUFNcUMsT0FBTyxHQUFHaEcsS0FBSyxDQUFDb0gsaUJBQWlCLENBQUMsQ0FBK0I7UUFDdkUsSUFBSXBCLE9BQU8sRUFBRTtVQUNaLE1BQU01QixTQUFTLEdBQUlwRSxLQUFLLENBQUNNLFFBQVEsQ0FBQyxDQUFDLENBQW9CQyxZQUFZLENBQUMsQ0FBQztVQUNyRSxNQUFNbUosWUFBWSxHQUFHdEYsU0FBUyxFQUFFNUQsU0FBUyxDQUFDLEdBQUcxRCxPQUFPLENBQUNPLFlBQVksYUFBYSxDQUFDO1VBQy9FLE1BQU1XLFNBQVMsR0FBR0gsVUFBVSxDQUFDM0IsTUFBTSxHQUFHLENBQUMsR0FBRzJCLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBSSxDQUFDLENBQXFCO1VBQ2pGLE1BQU04TCxXQUFXLEdBQUczTCxTQUFTLEVBQUVsQixPQUFPLEdBQUc5QyxNQUFNLENBQUMwSSxJQUFJLENBQUMxRSxTQUFTLENBQUNsQixPQUFPLENBQUMsR0FBRyxFQUFFO1VBQzVFNk0sV0FBVyxDQUFDdkcsT0FBTyxDQUFFd0csVUFBVSxJQUFLO1lBQ25DLE1BQU12TCxtQkFBbUIsR0FBR0wsU0FBUyxDQUFDbEIsT0FBMEM7WUFDaEYsTUFBTTRCLGdCQUFnQixHQUFHTCxtQkFBbUIsR0FBR3VMLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyRSxNQUFNQyxrQkFBa0IsR0FBRzdQLE1BQU0sQ0FBQzBJLElBQUksQ0FBQ2hFLGdCQUFnQixDQUFDO1lBQ3hELE1BQU1vTCxpQkFBaUIsR0FBR0Qsa0JBQWtCLENBQUNyRixJQUFJLENBQUV1RixRQUFRLElBQUtBLFFBQVEsQ0FBQ3hHLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1lBQ2pILElBQUl1RyxpQkFBaUIsRUFBRTtjQUN0QixNQUFNRSxRQUFRLEdBQUd0TCxnQkFBZ0IsQ0FBQ29MLGlCQUFpQixDQUFDO2NBQ3BEOUQsT0FBTyxDQUFDMEMsV0FBVyxDQUFDZ0IsWUFBWSxFQUFFTSxRQUFRLENBQUM7WUFDNUM7VUFDRCxDQUFDLENBQUM7VUFDRixJQUFJLENBQUNqRSx1Q0FBdUMsQ0FBQ2xJLFVBQVUsRUFBRTRGLGFBQWEsRUFBRXVDLE9BQU8sRUFBRXpMLFNBQVMsQ0FBQztRQUM1RjtNQUNEO0lBQ0QsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDMFAsNkJBQTZCLEVBQUUsU0FBQUEsQ0FBVXROLEtBQVksRUFBRXVOLHlCQUFrQyxFQUFFO01BQzFGLElBQUlsTSxTQUFzQztNQUUxQyxJQUFJckIsS0FBSyxLQUFLdkIsU0FBUyxFQUFFO1FBQ3hCb0MsR0FBRyxDQUFDQyxLQUFLLENBQUMsaUVBQWlFLENBQUM7TUFDN0UsQ0FBQyxNQUFNLElBQUksQ0FBQ2QsS0FBSyxLQUFLLEVBQUUsSUFBSUEsS0FBSyxLQUFLLElBQUksS0FBS3VOLHlCQUF5QixFQUFFO1FBQ3pFbE0sU0FBUyxHQUFHOEcsU0FBUyxDQUFDQyxlQUFlLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFNUcsa0JBQWtCLENBQUNDLFNBQVMsQ0FBQztNQUM3RixDQUFDLE1BQU0sSUFBSXpCLEtBQUssS0FBS3ZCLFNBQVMsSUFBSXVCLEtBQUssS0FBSyxFQUFFLElBQUlBLEtBQUssS0FBSyxJQUFJLEVBQUU7UUFDakVxQixTQUFTLEdBQUc4RyxTQUFTLENBQUNDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQ3BJLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUV3QixrQkFBa0IsQ0FBQ0MsU0FBUyxDQUFDO01BQy9GO01BQ0EsT0FBT0osU0FBUztJQUNqQixDQUFDO0lBRURtTSxzQ0FBc0MsRUFBRSxlQUFBQSxDQUN2Q0MsWUFBZ0MsRUFDaEM5TyxPQUFnQixFQUNoQitPLFlBQThCLEVBQzlCdk4sT0FBeUIsRUFDeEI7TUFDRCxNQUFNd04sY0FBYyxHQUFHaFAsT0FBTyxDQUFDOEwsaUJBQWlCLENBQUMsQ0FBK0I7TUFDaEYsSUFBSSxDQUFDa0QsY0FBYyxFQUFFO1FBQ3BCOU0sR0FBRyxDQUFDQyxLQUFLLENBQUMsc0NBQXNDLENBQUM7UUFDakQsT0FBTzJNLFlBQVk7TUFDcEI7TUFDQSxNQUFNaEcsU0FBUyxHQUFHOUksT0FBTyxDQUFDZ0YsUUFBUSxDQUFDLENBQUMsRUFBRUMsWUFBWSxDQUFDLENBQW1CO01BQ3RFLE1BQU0rRixRQUFRLEdBQUdsQyxTQUFTLENBQUNtRyxXQUFXLENBQUNELGNBQWMsQ0FBQzlELE9BQU8sQ0FBQyxDQUFDLENBQUM7TUFDaEUsSUFBSWdFLG1CQUFtQixHQUFHSCxZQUFZLENBQUMzQyxHQUFHLENBQUUrQyxXQUFXLElBQUtBLFdBQVcsQ0FBQ2xGLE1BQU0sQ0FBQztNQUMvRTtNQUNBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7TUFFRTtNQUNBLElBQUltRixhQUFhLEdBQUcsS0FBSztNQUN6QixNQUFNaEIsWUFBWSxHQUFHNU0sT0FBTyxDQUFDTyxZQUFZLENBQUMwQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUN5RyxHQUFHLENBQUMsQ0FBQztNQUMxRCxJQUFJbUYsc0JBQXNCO01BQzFCLElBQUlDLGtCQUFrQjs7TUFFdEI7TUFDQTtNQUNBLElBQUlOLGNBQWMsQ0FBQ25ELFVBQVUsQ0FBQyxDQUFDLENBQUNYLE9BQU8sQ0FBQyxDQUFDLEtBQUssWUFBWSxFQUFFO1FBQzNEbUUsc0JBQXNCLEdBQUc3TixPQUFPLENBQUNPLFlBQVksQ0FBQ3dOLE9BQU8sQ0FBQyxJQUFJbkIsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzdFa0Isa0JBQWtCLEdBQUd4RyxTQUFTLENBQUM1RCxTQUFTLENBQUNtSyxzQkFBc0IsQ0FBQztNQUNqRTtNQUVBLElBQUlyUCxPQUFPLENBQUNnRSxHQUFHLENBQUMsNEJBQTRCLENBQUMsSUFBSXNMLGtCQUFrQixJQUFJQSxrQkFBa0IsQ0FBQ0UsUUFBUSxLQUFLMVAsU0FBUyxFQUFFO1FBQ2pIO1FBQ0E7UUFDQTtRQUNBb0MsR0FBRyxDQUFDQyxLQUFLLENBQ1IsaUlBQ0QsQ0FBQztRQUNEaU4sYUFBYSxHQUFHLElBQUk7TUFDckIsQ0FBQyxNQUFNLElBQUlFLGtCQUFrQixJQUFJQSxrQkFBa0IsQ0FBQ0csS0FBSyxLQUFLLG9CQUFvQixJQUFJSCxrQkFBa0IsQ0FBQ0UsUUFBUSxLQUFLMVAsU0FBUyxFQUFFO1FBQ2hJb1AsbUJBQW1CLEdBQUcsSUFBSSxDQUFDUSx5QkFBeUIsQ0FBQ1IsbUJBQW1CLEVBQUVsRSxRQUFRLEVBQUVsQyxTQUFTLEVBQUV0SCxPQUFPLENBQUNPLFlBQVksQ0FBQztNQUNySDtNQUNBLElBQUksQ0FBQ3FOLGFBQWEsRUFBRTtRQUNuQjtRQUNBO1FBQ0E7UUFDQSxNQUFNTyxvQkFBb0IsR0FDekJYLGNBQWMsQ0FBQzVELFdBQVcsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUNyQyxDQUFDNEQsY0FBYyxDQUFDM0QsVUFBVSxDQUFDLENBQUMsSUFDNUIyRCxjQUFjLENBQUNZLGdCQUFnQixDQUFDLENBQUMsRUFBRUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUN2RCxJQUFJQyxzQkFBc0IsR0FBRyxFQUFFO1FBQy9CQSxzQkFBc0IsR0FBRyxDQUFDZCxjQUFjLENBQUNlLFdBQVcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFbkssTUFBTSxDQUFFdkQsT0FBZ0IsSUFBSztVQUMxRixPQUFPQSxPQUFPLENBQUMyTixPQUFPLENBQUMsQ0FBQyxLQUFLQyxXQUFXLENBQUM3TixLQUFLO1FBQy9DLENBQUMsQ0FBQztRQUNGO1FBQ0EsSUFBSXVOLG9CQUFvQixJQUFJLENBQUNHLHNCQUFzQixFQUFFbFAsTUFBTSxFQUFFO1VBQzVELE1BQU1vTyxjQUFjLEVBQUVrQixPQUFPLENBQUMsQ0FBQztRQUNoQztRQUNBO1FBQ0EsTUFBTXhQLE1BQU0sR0FBRyxNQUFNc08sY0FBYyxDQUFDbUIsZUFBZSxDQUFDakIsbUJBQW1CLENBQUM7UUFFeEUsS0FBSyxJQUFJa0IsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHckIsWUFBWSxDQUFDbk8sTUFBTSxFQUFFd1AsQ0FBQyxFQUFFLEVBQUU7VUFDN0MsTUFBTWpCLFdBQVcsR0FBR0osWUFBWSxDQUFDcUIsQ0FBQyxDQUFDO1VBQ25DLE1BQU0xTixTQUFTLEdBQUcsSUFBSSxDQUFDaU0sNkJBQTZCLENBQUNqTyxNQUFNLENBQUMwUCxDQUFDLENBQUMsRUFBRWpCLFdBQVcsQ0FBQ1AseUJBQXlCLENBQUM7VUFFdEcsSUFBSWxNLFNBQVMsRUFBRTtZQUNkb00sWUFBWSxDQUFDSyxXQUFXLENBQUNuSCxRQUFRLENBQUMsR0FBRyxDQUFDdEYsU0FBUyxDQUFDO1VBQ2pEO1FBQ0Q7TUFDRDtNQUNBLE9BQU9vTSxZQUFZO0lBQ3BCLENBQUM7SUFFRFkseUJBQXlCLEVBQUUsU0FBQUEsQ0FBVVIsbUJBQTZCLEVBQUVsRSxRQUFnQixFQUFFbEMsU0FBeUIsRUFBRS9HLFlBQW9CLEVBQUU7TUFDdEk7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO01BRUU7TUFDQSxJQUFJc08sZ0JBQWdCLEdBQUd2SCxTQUFTLENBQUN3SCxvQkFBb0IsQ0FBQ3RGLFFBQVEsQ0FBbUI7TUFDakYsTUFBTXVGLGlCQUFpQixHQUFHeE8sWUFBWSxDQUNwQ3lPLEtBQUssQ0FBQ3hGLFFBQVEsQ0FBQ3BLLE1BQU0sQ0FBQyxDQUFDO01BQUEsQ0FDdkI2QyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7TUFBQSxDQUNYK00sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQUEsQ0FDYnBFLEdBQUcsQ0FBRXFFLElBQUksSUFBSztRQUNkO1FBQ0FKLGdCQUFnQixHQUFHdkgsU0FBUyxDQUFDd0gsb0JBQW9CLENBQUNHLElBQUksRUFBRUosZ0JBQWdCLENBQW1CO1FBQzNGLE9BQU87VUFDTkksSUFBSSxFQUFFQSxJQUFJO1VBQ1ZDLE9BQU8sRUFBRUwsZ0JBQWdCLENBQUNuTCxTQUFTLENBQUMsQ0FBQyxDQUFDc0s7UUFDdkMsQ0FBQztNQUNGLENBQUMsQ0FBQztNQUNIO01BQ0EsT0FBT04sbUJBQW1CLENBQUM5QyxHQUFHLENBQUV1RSxhQUFhLElBQUs7UUFDakQsTUFBTUMsY0FBYyxHQUFHRCxhQUFhLENBQUNsTixLQUFLLENBQUMsR0FBRyxDQUFDO1FBQy9DLE1BQU1vTixVQUFVLEdBQUdELGNBQWMsQ0FBQ0UsU0FBUyxDQUMxQyxDQUNDTCxJQUFJLEVBQ0puUCxLQUFLLENBQUM7UUFBQSxLQUNGaVAsaUJBQWlCLENBQUMsQ0FBQ2pQLEtBQUssQ0FBQyxFQUFFb1AsT0FBTyxLQUFLRCxJQUM3QyxDQUFDLENBQUMsQ0FBQztRQUNIO1FBQ0E7UUFDQSxPQUFPRixpQkFBaUIsQ0FDdEJDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQ0ssVUFBVSxHQUFHLENBQUNBLFVBQVUsR0FBRy9RLFNBQVMsQ0FBQyxDQUFDO1FBQUEsQ0FDaERzTSxHQUFHLENBQUVxRSxJQUFJLElBQUtBLElBQUksQ0FBQ0EsSUFBSSxDQUFDLENBQ3hCTSxNQUFNLENBQUNILGNBQWMsQ0FBQ0osS0FBSyxDQUFDSyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQUEsQ0FDekNHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO01BQ2QsQ0FBQyxDQUFDO0lBQ0gsQ0FBQztJQUVEQyx3Q0FBd0MsRUFBRSxlQUFBQSxDQUN6Q25DLFlBQWdDLEVBQ2hDOU8sT0FBZ0IsRUFDaEIrTyxZQUE4QixFQUM5QnZOLE9BQXlCLEVBQ3hCO01BQ0QsTUFBTTRHLFNBQVMsR0FBR3BJLE9BQU8sQ0FBQ2lPLFNBQVMsQ0FBQyxDQUFrQjtNQUN0RCxNQUFNdEYsbUJBQW1CLEdBQUdDLFdBQVcsQ0FBQ0MscUJBQXFCLENBQUNULFNBQXNDLENBQUM7TUFDckcsTUFBTUUsS0FBd0IsR0FBRyxNQUFNQyxTQUFTLENBQUNDLHFCQUFxQixDQUFDSixTQUFTLENBQUM7TUFDakYsTUFBTVUsU0FBUyxHQUFJVixTQUFTLENBQUNwRCxRQUFRLENBQUMsQ0FBQyxDQUFnQkMsWUFBWSxDQUFDLENBQUM7TUFDckUsS0FBSyxNQUFNa0ssV0FBVyxJQUFJSixZQUFZLEVBQUU7UUFDdkMsTUFBTS9GLGlCQUFpQixHQUFHLElBQUksQ0FBQ0Msc0NBQXNDLENBQ3BFa0csV0FBVyxFQUNYM04sT0FBTyxDQUFDTyxZQUFZLEVBQ3BCK0csU0FBUyxFQUNUSCxtQkFDRCxDQUFDO1FBQ0QsTUFBTXVJLFdBQVcsR0FBR2xJLGlCQUFpQixHQUFHQSxpQkFBaUIsQ0FBQ00sYUFBYSxHQUFHNkYsV0FBVyxDQUFDbEYsTUFBTSxDQUFDeEcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDeUcsR0FBRyxDQUFDLENBQUM7UUFFdkgsTUFBTTNILFVBQVUsR0FBRyxJQUFJLENBQUM0Tyw2QkFBNkIsQ0FBQ0QsV0FBVyxFQUFZNUksS0FBSyxDQUFDO1FBQ25GLElBQUkvRixVQUFVLEVBQUU7VUFDZnVNLFlBQVksQ0FBQ0ssV0FBVyxDQUFDbkgsUUFBUSxDQUFDLEdBQUd6RixVQUFVO1FBQ2hEO01BQ0Q7TUFDQSxPQUFPdU0sWUFBWTtJQUNwQixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDcUMsNkJBQTZCLEVBQUUsU0FBQUEsQ0FBVUQsV0FBbUIsRUFBRTVJLEtBQXdCLEVBQUU7TUFDdkYsTUFBTWhGLEdBQUcsR0FBRzVFLE1BQU0sQ0FBQzBJLElBQUksQ0FBQ2tCLEtBQUssQ0FBQzFDLE1BQU0sQ0FBQyxDQUFDc0QsSUFBSSxDQUFFNUYsR0FBRyxJQUFLQSxHQUFHLEtBQUs0TixXQUFXLENBQUMsQ0FBQyxDQUFDO01BQzFFLE9BQU81TixHQUFHLElBQUlnRixLQUFLLENBQUMxQyxNQUFNLENBQUN0QyxHQUFHLENBQUM7SUFDaEMsQ0FBQztJQUVEOE4sc0JBQXNCLEVBQUUsU0FBQUEsQ0FBVXJDLFlBQThCLEVBQUU7TUFDakUsTUFBTXNDLGNBQWdELEdBQUc7UUFDeERDLFFBQVEsRUFBRSxFQUFFO1FBQ1oxRixPQUFPLEVBQUUsRUFBRTtRQUNYaEcsTUFBTSxFQUFFO01BQ1QsQ0FBQztNQUVELEtBQUssTUFBTXVKLFdBQVcsSUFBSUosWUFBWSxFQUFFO1FBQ3ZDLElBQUlJLFdBQVcsQ0FBQ29DLGFBQWEsS0FBS3pSLFNBQVMsRUFBRTtVQUM1Q3VSLGNBQWMsQ0FBQ0MsUUFBUSxDQUFDck8sSUFBSSxDQUFDa00sV0FBVyxDQUFDO1FBQzFDLENBQUMsTUFBTSxJQUFJQSxXQUFXLENBQUNsRixNQUFNLENBQUN1SCxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1VBQ3ZESCxjQUFjLENBQUN6TCxNQUFNLENBQUMzQyxJQUFJLENBQUNrTSxXQUFXLENBQUM7UUFDeEMsQ0FBQyxNQUFNO1VBQ05rQyxjQUFjLENBQUN6RixPQUFPLENBQUMzSSxJQUFJLENBQUNrTSxXQUFXLENBQUM7UUFDekM7TUFDRDtNQUNBLE9BQU9rQyxjQUFjO0lBQ3RCLENBQUM7SUFFREkseUJBQXlCLEVBQUU7TUFDMUJDLGdCQUFnQixFQUFFLFNBQUFBLENBQVVDLEtBQTZDLEVBQUU7UUFDMUUsTUFBTW5NLEtBQUssR0FBR21NLEtBQUssQ0FBQ0MsVUFBVTtVQUFFO1VBQy9CQyxpQkFBaUIsR0FBR3JNLEtBQUssQ0FBQ3NNLENBQUMsQ0FBQyxDQUFDLENBQUM1SSxJQUFJLENBQUMsaUJBQWlCLENBQUM7VUFDckQ2SSxTQUFTLEdBQUd2TSxLQUFLLENBQUN5SSxTQUFTLENBQUMsQ0FBVztRQUV4QytELG9CQUFvQixDQUFDSCxpQkFBaUIsRUFBRUUsU0FBUyxDQUFDdlMsY0FBYyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7TUFDMUU7SUFDRCxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDaU8sMEJBQTBCLEVBQUUsZUFBQUEsQ0FBZ0J4TyxTQUFvQixFQUFFQyxPQUFnQixFQUFFYyxPQUE0QixFQUFFO01BQ2pIO01BQ0EsSUFBSWQsT0FBTyxFQUFFOEUsR0FBRyxDQUFTLHFDQUFxQyxDQUFDLEVBQUU7UUFDaEUsTUFBTWlPLFlBQVksR0FBRy9TLE9BQU8sQ0FBQ3VHLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDd00sWUFBWSxFQUFFQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUNULHlCQUF5QixDQUFDO1FBQ2pFUSxZQUFZLEVBQUVFLGdCQUFnQixDQUFDLElBQUksQ0FBQ1YseUJBQXlCLEVBQUUsSUFBSSxDQUFDO01BQ3JFO01BRUEsTUFBTWpRLE9BQU8sR0FBR3ZDLFNBQVMsQ0FBQ2dGLFVBQVUsQ0FBQyxDQUFxQjtNQUMxRCxNQUFNNkssWUFBZ0MsR0FBRyxDQUFDLENBQUM7TUFFM0MsSUFBSSxDQUFDOU8sT0FBTyxFQUFFO1FBQ2JrQyxHQUFHLENBQUNDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQztRQUNqRCxPQUFPMk0sWUFBWTtNQUNwQjtNQUVBLE1BQU1oQixTQUFTLEdBQUd0TSxPQUFPLENBQUMrRixVQUFVLENBQUMvRixPQUFPLENBQUNRLGtCQUFrQixDQUFDO01BQ2hFLE1BQU0rTSxZQUFZLEdBQUdqQixTQUFTLEVBQUV0RyxZQUFZLEtBQUsxSCxTQUFTLEdBQUdtSCxlQUFlLENBQUNtTCxlQUFlLENBQUN0RSxTQUFTLENBQUN0RyxZQUFZLENBQUMsR0FBRyxFQUFFO01BQ3pILE1BQU02SixjQUFjLEdBQUcsSUFBSSxDQUFDRCxzQkFBc0IsQ0FBQ3JDLFlBQVksQ0FBQztNQUNoRSxNQUFNc0QsWUFBWSxHQUFHclMsT0FBTyxDQUFDOEwsaUJBQWlCLENBQUMsQ0FBQztNQUVoRCxLQUFLLE1BQU1xRCxXQUFXLElBQUlrQyxjQUFjLENBQUNDLFFBQVEsRUFBRTtRQUNsRCxNQUFNNU8sU0FBUyxHQUFHLElBQUksQ0FBQ2lNLDZCQUE2QixDQUNuRFEsV0FBVyxDQUFDb0MsYUFBYSxFQUN6QmMsWUFBWSxHQUFHbEQsV0FBVyxDQUFDUCx5QkFBeUIsR0FBRyxLQUFLLENBQUM7UUFDOUQsQ0FBQztRQUNELElBQUlsTSxTQUFTLEVBQUU7VUFDZG9NLFlBQVksQ0FBQ0ssV0FBVyxDQUFDbkgsUUFBUSxDQUFDLEdBQUcsQ0FBQ3RGLFNBQVMsQ0FBQztRQUNqRDtNQUNEO01BRUEsSUFBSTJPLGNBQWMsQ0FBQ3pGLE9BQU8sQ0FBQ2hMLE1BQU0sRUFBRTtRQUNsQyxNQUFNLElBQUksQ0FBQ2lPLHNDQUFzQyxDQUFDQyxZQUFZLEVBQUU5TyxPQUFPLEVBQUVxUixjQUFjLENBQUN6RixPQUFPLEVBQUVwSyxPQUFPLENBQUM7TUFDMUc7TUFFQSxJQUFJNlAsY0FBYyxDQUFDekwsTUFBTSxDQUFDaEYsTUFBTSxFQUFFO1FBQ2pDLE1BQU0sSUFBSSxDQUFDcVEsd0NBQXdDLENBQUNuQyxZQUFZLEVBQUU5TyxPQUFPLEVBQUVxUixjQUFjLENBQUN6TCxNQUFNLEVBQUVwRSxPQUFPLENBQUM7TUFDM0c7TUFDQSxPQUFPc04sWUFBWTtJQUNwQixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ3dELHNCQUFzQixFQUFFLFNBQUFBLENBQ3ZCclQsU0FBb0IsRUFDcEJDLE9BQWdCLEVBQ2hCcVQsT0FBa0IsRUFDbEI3SCxPQUF1QixFQUNXO01BQ2xDLE1BQU1sSixPQUFPLEdBQUd2QyxTQUFTLENBQUNnRixVQUFVLENBQUMsQ0FBcUI7TUFDMUQsTUFBTTZKLFNBQVMsR0FBR3RNLE9BQU8sQ0FBQytGLFVBQVUsQ0FBQy9GLE9BQU8sQ0FBQ1Esa0JBQWtCLENBQUM7UUFDL0R3USxLQUEyQixHQUFHLENBQUMsQ0FBQztRQUNoQ3BQLGdCQUFxQyxHQUFHLENBQUMsQ0FBQztNQUMzQyxNQUFNcEQsT0FBTyxHQUFHZCxPQUFPLENBQUN5RixVQUFVLENBQUMsQ0FBQztNQUNwQyxNQUFNOE4saUJBQWlCLEdBQUd6UyxPQUFPLEVBQUVnRSxHQUFHLENBQUMsNEJBQTRCLENBQUM7O01BRXBFO01BQ0EsSUFBSXhDLE9BQU8sQ0FBQ2tSLGNBQWMsSUFBSWxSLE9BQU8sQ0FBQ21HLGdCQUFnQixFQUFFO1FBQ3ZELE1BQU1nTCxhQUFhLEdBQUduUixPQUFPLENBQUNtRyxnQkFBZ0I7UUFDOUMsTUFBTWlMLFVBQVUsR0FBRzlFLFNBQVMsQ0FBQ3JHLE1BQU0sSUFBSWlELE9BQU8sQ0FBQ3hGLFNBQVMsQ0FBQzRJLFNBQVMsQ0FBQ3JHLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSWtMLGFBQWEsQ0FBQztRQUM5RkgsS0FBSyxDQUFDaFIsT0FBTyxDQUFDTyxZQUFZLEdBQUcsNkJBQTZCLENBQUMsR0FBRzZRLFVBQVU7UUFDeEV4UCxnQkFBZ0IsQ0FBQzVCLE9BQU8sQ0FBQ1Esa0JBQWtCLENBQUMsR0FBRyxDQUFDd1EsS0FBSyxDQUFDO01BQ3ZELENBQUMsTUFBTSxJQUFJLENBQUMxRSxTQUFTLENBQUMrRSxZQUFZLElBQUlKLGlCQUFpQixFQUFFO1FBQ3hELE9BQU8zUyxTQUFTO01BQ2pCO01BQ0FnTyxTQUFTLENBQUMrRSxZQUFZLEVBQUUvSyxPQUFPLENBQUMsVUFBVWdMLEtBQUssRUFBRTtRQUNoRCxNQUFNelIsS0FBSyxHQUFHcUosT0FBTyxDQUFDeEYsU0FBUyxDQUFDNE4sS0FBSyxDQUFDO1FBQ3RDLElBQUl6UixLQUFLLElBQUksSUFBSSxFQUFFO1VBQ2xCbVIsS0FBSyxDQUFDTSxLQUFLLENBQUMsR0FBR3pSLEtBQUssRUFBRVQsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUdTLEtBQUs7UUFDaEQsQ0FBQyxNQUFNO1VBQ05tUixLQUFLLENBQUNNLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3RCO01BQ0QsQ0FBQyxDQUFDO01BQ0YsSUFBSXBVLE1BQU0sQ0FBQzBJLElBQUksQ0FBQ29MLEtBQUssQ0FBQyxDQUFDNVIsTUFBTSxFQUFFO1FBQzlCO1FBQ0F3QyxnQkFBZ0IsQ0FBQzVCLE9BQU8sQ0FBQ1Esa0JBQWtCLENBQUMsR0FBRyxDQUFDd1EsS0FBSyxDQUFDO01BQ3ZEO01BQ0EsT0FBT3BQLGdCQUFnQjtJQUN4QixDQUFDO0lBRUQyUCx3QkFBd0IsRUFBRSxTQUFBQSxDQUFVOVQsU0FBb0IsRUFBRUMsT0FBZSxFQUFFOFQsTUFBdUIsRUFBbUI7TUFDcEgsTUFBTXpRLFVBQVUsR0FBR3lRLE1BQU0sQ0FBQ3pRLFVBQVU7TUFDcEMsTUFBTTBRLGFBQWEsR0FBRy9ULE9BQU8sQ0FBQ2dQLGFBQWEsQ0FBQyxDQUFDO01BQzdDO01BQ0EsSUFBS2hQLE9BQU8sRUFBRStPLFNBQVMsQ0FBQyxDQUFDLEVBQWlDaUYsbUJBQW1CLEdBQUcsQ0FBQyxJQUFJLENBQUMzUSxVQUFVLENBQUMzQixNQUFNLElBQUlxUyxhQUFhLENBQUNyUyxNQUFNLEVBQUU7UUFDaElvUyxNQUFNLENBQUN6USxVQUFVLEdBQUcwUSxhQUFhO01BQ2xDO01BQ0EsT0FBT0QsTUFBTTtJQUNkLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0csd0JBQXdCLEVBQUUsU0FBQUEsQ0FDekJsVSxTQUFvQixFQUNwQkMsT0FBOEIsRUFDOUJ3TCxPQUF1QixFQUN2Qm5JLFVBQTZCLEVBQzVCO01BQ0QsTUFBTWYsT0FBTyxHQUFHdkMsU0FBUyxDQUFDZ0YsVUFBVSxDQUFDLENBQXFCO01BQzFEO01BQ0ExQixVQUFVLEdBQUdBLFVBQVUsQ0FBQ3FELE1BQU0sQ0FBRWxELFNBQVMsSUFBS0EsU0FBUyxDQUFDRSxTQUFTLEtBQUtDLGtCQUFrQixDQUFDQyxTQUFTLENBQUM7TUFFbkcsTUFBTTJFLE1BQU0sR0FBR2pHLE9BQU8sQ0FBQytGLFVBQVUsQ0FBQy9GLE9BQU8sQ0FBQ1Esa0JBQWtCLENBQUMsRUFBRXlGLE1BQU0sSUFBSSxFQUFFO01BQzNFLE1BQU0yTCxPQUFPLEdBQUdsVSxPQUFPLENBQUNtVSxVQUFVLENBQUMsQ0FBQztNQUNwQyxNQUFNclIsa0JBQWtCLEdBQUdSLE9BQU8sQ0FBQ1Esa0JBQWtCLElBQUksRUFBRTtNQUMzRCxNQUFNc1IsYUFBYSxHQUFHQSxDQUFDdlEsbUJBQXdDLEVBQUUxQixLQUE4QixLQUFjO1FBQzVHLE1BQU1rUyxvQkFBb0IsR0FBR3hRLG1CQUFtQixHQUFHZixrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRixJQUFJeUYsTUFBTSxDQUFDN0csTUFBTSxLQUFLLENBQUMsSUFBSVksT0FBTyxFQUFFZ1Msa0JBQWtCLElBQUksQ0FBQ3pRLG1CQUFtQixFQUFFO1VBQy9FLE9BQU8ySCxPQUFPLEVBQUV4RixTQUFTLENBQUNrTyxPQUFPLENBQUMsS0FBSy9SLEtBQUs7UUFDN0MsQ0FBQyxNQUFNO1VBQ04sTUFBTW9TLFdBQVcsR0FBRy9VLE1BQU0sQ0FBQzBJLElBQUksQ0FBQ3NELE9BQU8sQ0FBQ3hGLFNBQVMsQ0FBQyxDQUFDLENBQUM7VUFDcEQsTUFBTXdPLHdCQUF3QixHQUFHaFYsTUFBTSxDQUFDMEksSUFBSSxDQUFDbU0sb0JBQW9CLENBQUM7VUFDbEUsT0FBTzlMLE1BQU0sQ0FBQ3JHLEtBQUssQ0FBQyxVQUFVMFIsS0FBSyxFQUFFO1lBQ3BDLE9BQ0MsQ0FBQ1csV0FBVyxDQUFDeEwsUUFBUSxDQUFDNkssS0FBSyxDQUFDLElBQzVCLENBQUNZLHdCQUF3QixDQUFDekwsUUFBUSxDQUFDNkssS0FBSyxDQUFDLElBQ3pDcEksT0FBTyxFQUFFeEYsU0FBUyxDQUFDNE4sS0FBSyxDQUFDLEtBQUtTLG9CQUFvQixDQUFDVCxLQUFLLENBQUM7VUFFM0QsQ0FBQyxDQUFDO1FBQ0g7TUFDRCxDQUFDO01BQ0QsTUFBTWEsaUJBQWlCLEdBQUdwUixVQUFVLENBQUMyRyxJQUFJLENBQUMsVUFBVXhHLFNBQVMsRUFBRTtRQUM5RCxNQUFNSyxtQkFBbUIsR0FBR0wsU0FBUyxDQUFDbEIsT0FBOEI7UUFDcEUsSUFBSWtKLE9BQU8sRUFBRXhGLFNBQVMsQ0FBQ2tPLE9BQU8sQ0FBQyxLQUFLclEsbUJBQW1CLEdBQUdmLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUdvUixPQUFPLENBQUMsRUFBRTtVQUM5RixPQUFPRSxhQUFhLENBQUN2USxtQkFBbUIsRUFBRUEsbUJBQW1CLEdBQUdmLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUdvUixPQUFPLENBQUMsQ0FBQztRQUNyRyxDQUFDLE1BQU0sSUFBSTFJLE9BQU8sRUFBRXhGLFNBQVMsQ0FBQ2tPLE9BQU8sQ0FBQyxLQUFLMVEsU0FBUyxFQUFFaEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO1VBQ2hFLE9BQU80UyxhQUFhLENBQUN2USxtQkFBbUIsRUFBRUwsU0FBUyxFQUFFaEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hFO01BQ0QsQ0FBQyxDQUFDO01BRUYsT0FBT2lULGlCQUFpQixHQUFHLENBQUNBLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtJQUNwRCxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQzVOLG1DQUFtQyxFQUFFLGVBQUFBLENBQ3BDdkUsT0FBeUIsRUFDekJ1QyxXQUE2QixFQUM3QnpFLFdBQXVDLEVBQ3ZDeUYsZ0JBQXVDLEVBQ3ZDdkMsaUJBQXlCLEVBQ3pCa0MsS0FBNEMsRUFDNUNvQixPQUFxQixFQUNyQk4sS0FBWSxFQUNYO01BQ0QsSUFBSTtRQUNILE1BQU0sSUFBSSxDQUFDb08sd0JBQXdCLENBQUM3UCxXQUFXLEVBQUV6RSxXQUFXLEVBQUV3RyxPQUFPLENBQUM7UUFFdEUsTUFBTTtVQUFFK04sK0JBQStCO1VBQUVDLHVCQUF1QjtVQUFFQztRQUF3QixDQUFDLEdBQzFGLE1BQU0sSUFBSSxDQUFDQyxzQ0FBc0MsQ0FDaERqUCxnQkFBZ0IsRUFDaEJoQixXQUFXLEVBQ1h6RSxXQUFXLEVBQ1hrQyxPQUFPLEVBQ1BnQixpQkFBaUIsRUFDakJrQyxLQUFLLEVBQ0xvQixPQUFPLEVBQ1BOLEtBQ0QsQ0FBQzs7UUFFRjtRQUNBLElBQUlxTywrQkFBK0IsQ0FBQ2pULE1BQU0sS0FBSyxDQUFDLElBQUlrVCx1QkFBdUIsQ0FBQ2xULE1BQU0sS0FBSyxDQUFDLEVBQUU7VUFDekZtRCxXQUFXLENBQUNqRCxJQUFJLENBQUMsQ0FBQztRQUNuQjtRQUVBLElBQUlVLE9BQU8sRUFBRUMsT0FBTyxFQUFFQyxPQUFPLEVBQUU7VUFDOUJGLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDd1MsZUFBZSxHQUFHSCx1QkFBdUIsQ0FBQ2xULE1BQU0sS0FBSyxDQUFDO1FBQ3ZFO1FBQ0EsSUFBSTtVQUNIO1VBQ0EsTUFBTW1ELFdBQVcsQ0FBQ21RLFlBQVksQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxPQUFPL1IsS0FBYyxFQUFFO1VBQ3hCRCxHQUFHLENBQUNpUyxLQUFLLENBQUMsMENBQTBDaFMsS0FBSyxFQUFFLENBQUM7UUFDN0Q7UUFDQTtRQUNBaVMscUJBQXFCLENBQUNDLG9EQUFvRCxDQUN6RVIsK0JBQStCLEVBQy9CQyx1QkFBdUIsRUFDdkJDLHVCQUF1QixFQUN2QmhRLFdBQ0QsQ0FBQztNQUNGLENBQUMsQ0FBQyxPQUFPNUIsS0FBYyxFQUFFO1FBQ3hCO01BQUE7SUFFRixDQUFDO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0N5Uix3QkFBd0IsRUFBRSxlQUFBQSxDQUN6QjdQLFdBQTZCLEVBQzdCekUsV0FBdUMsRUFDdkN3RyxPQUFxQixFQUNMO01BQ2hCLE1BQU13TyxXQUFXLEdBQUd2USxXQUFXLENBQUN3USxjQUFjLENBQUMsQ0FBQyxJQUFJeFEsV0FBVztNQUMvRCxJQUFJLENBQUN1USxXQUFXLENBQUM5TixXQUFXLENBQUMsQ0FBQyxFQUFFO1FBQy9COE4sV0FBVyxDQUFDRSxPQUFPLENBQUMsQ0FBQztNQUN0QjtNQUNBO01BQ0FKLHFCQUFxQixDQUFDSyx3QkFBd0IsQ0FBQzFRLFdBQVcsRUFBRStCLE9BQU8sQ0FBQztNQUNwRSxJQUFJeEcsV0FBVyxDQUFDTSxVQUFVLEVBQUU7UUFDM0JtRSxXQUFXLENBQUMyUSxnQkFBZ0IsQ0FBQ3BWLFdBQVcsQ0FBQ00sVUFBVSxDQUFDO01BQ3JEO01BQ0E7TUFDQSxNQUFNd1UscUJBQXFCLENBQUNPLHFDQUFxQyxDQUFDNVEsV0FBVyxDQUFDO0lBQy9FLENBQUM7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NpUSxzQ0FBc0MsRUFBRSxlQUFBQSxDQUN2Q2pQLGdCQUF1QyxFQUN2Q2hCLFdBQTZCLEVBQzdCekUsV0FBdUMsRUFDdkNrQyxPQUF5QixFQUN6QmdCLGlCQUF5QixFQUN6QmtDLEtBQTRDLEVBQzVDb0IsT0FBcUIsRUFDckJOLEtBQVksRUFLVjtNQUNGLElBQUk7UUFBRXFPLCtCQUErQjtRQUFFRTtNQUF3QixDQUFDLEdBQUcsTUFBTUsscUJBQXFCLENBQUNRLG9DQUFvQyxDQUNsSTdQLGdCQUFnQixFQUNoQmhCLFdBQVcsRUFDWHpFLFdBQVcsRUFDWGtDLE9BQU8sRUFDUHNFLE9BQU8sRUFDUE4sS0FDRCxDQUFDOztNQUVEO01BQ0EsTUFBTXFQLGFBQWEsR0FBR3JULE9BQU8sQ0FBQytGLFVBQVUsQ0FBQy9GLE9BQU8sQ0FBQ1Esa0JBQWtCLENBQUMsQ0FBQ3lGLE1BQU0sSUFBSSxFQUFFO01BQ2pGb00sK0JBQStCLEdBQUdPLHFCQUFxQixDQUFDVSwwQ0FBMEMsQ0FDakdqQiwrQkFBK0IsRUFDL0I5TyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRXJFLE1BQU0sRUFDM0I4QixpQkFDRCxDQUFDO01BRUQsSUFBSXNSLHVCQUF3QyxHQUFHLEVBQUU7TUFDakQsSUFBSSxDQUFDdFMsT0FBTyxDQUFDMk0sMEJBQTBCLEVBQUU7UUFDeEM7UUFDQTJGLHVCQUF1QixHQUFHLE1BQU0sSUFBSSxDQUFDdlMsZUFBZSxDQUFDQyxPQUFPLEVBQUVrRCxLQUFLLENBQUM7UUFDcEVvUCx1QkFBdUIsR0FBR00scUJBQXFCLENBQUNXLGtDQUFrQyxDQUNqRmhCLHVCQUF1QixFQUN2QkQsdUJBQXVCLEVBQ3ZCZSxhQUFhLEVBQ1p2VixXQUFXLENBQUNNLFVBQVUsQ0FBMkJDLE9BQU8sRUFBRW1WLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQzlFMVYsV0FDRCxDQUFDO01BQ0Y7TUFFQXlVLHVCQUF1QixHQUFHSyxxQkFBcUIsQ0FBQ2Esa0NBQWtDLENBQ2pGcEIsK0JBQStCLEVBQy9CQyx1QkFBdUIsRUFDdkJDLHVCQUF1QixFQUN2QmMsYUFDRCxDQUFDO01BRUQsT0FBTztRQUNOaEIsK0JBQStCO1FBQy9CQyx1QkFBdUI7UUFDdkJDO01BQ0QsQ0FBQztJQUNGLENBQUM7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0MvTixjQUFjLEVBQUUsU0FBQUEsQ0FBVWpDLFdBQTZCLEVBQUV6RSxXQUF1QyxFQUFFO01BQ2pHLE1BQU1nVixXQUFXLEdBQUd2USxXQUFXLENBQUN3USxjQUFjLENBQUMsQ0FBQyxJQUFJeFEsV0FBVztNQUMvRCxJQUFJLENBQUN1USxXQUFXLENBQUM5TixXQUFXLENBQUMsQ0FBQyxFQUFFO1FBQy9COE4sV0FBVyxDQUFDRSxPQUFPLENBQUMsQ0FBQztNQUN0QjtNQUNBLElBQUlsVixXQUFXLENBQUNNLFVBQVUsRUFBRTtRQUMzQm1FLFdBQVcsQ0FBQzJRLGdCQUFnQixDQUFDcFYsV0FBVyxDQUFDTSxVQUFVLENBQUM7TUFDckQ7TUFDQW1FLFdBQVcsQ0FBQzZCLE1BQU0sQ0FBQ3RHLFdBQVcsQ0FBQzRWLE9BQU8sRUFBRUMsVUFBVSxDQUFDQyxXQUFXLENBQUM7TUFDL0RyUixXQUFXLENBQUNqRCxJQUFJLENBQUN4QixXQUFXLENBQUMrVixNQUFNLENBQUM7TUFFcEMsSUFBSWYsV0FBVyxDQUFDOU4sV0FBVyxDQUFDLENBQUMsRUFBRTtRQUM5QjhOLFdBQVcsQ0FBQ2dCLE1BQU0sQ0FBQyxDQUFDO1FBQ3BCaEIsV0FBVyxDQUFDSixZQUFZLENBQUMsQ0FBQztNQUMzQjtJQUNELENBQUM7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDcUIsOEJBQThCLEVBQUUsZUFBQUEsQ0FBZ0JyVyxPQUFlLEVBQUVzQyxPQUF5QixFQUErQjtNQUFBLElBQTdCZ1Usb0JBQW9CLEdBQUFDLFNBQUEsQ0FBQTdVLE1BQUEsUUFBQTZVLFNBQUEsUUFBQTNWLFNBQUEsR0FBQTJWLFNBQUEsTUFBRyxJQUFJO01BQ3RIO01BQ0EsSUFBSWpVLE9BQU8sQ0FBQ3FNLDBCQUEwQixFQUFFO1FBQ3ZDLE9BQU8sS0FBSztNQUNiO01BRUEsTUFBTTZILG9CQUFvQixHQUFHRixvQkFBb0IsR0FBRyxJQUFJLENBQUNwUSwwQkFBMEIsQ0FBQ2xHLE9BQU8sRUFBRXNDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7TUFDMUcsSUFBSWtVLG9CQUFvQixFQUFFOVUsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNyQztRQUNBLE9BQU8sSUFBSTtNQUNaO01BRUEsSUFBSVksT0FBTyxDQUFDQyxPQUFPLEVBQUVDLE9BQU8sRUFBRTtRQUM3QjtRQUNBLElBQUlGLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDd1MsZUFBZSxLQUFLblUsU0FBUyxFQUFFO1VBQ2xELE9BQU8wQixPQUFPLENBQUNDLE9BQU8sQ0FBQ3dTLGVBQWU7UUFDdkM7UUFDQSxNQUFNMEIsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDcFUsZUFBZSxDQUFDQyxPQUFPLEVBQUV0QyxPQUFPLENBQUN5RixVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzlFLElBQUlnUixZQUFZLENBQUMvVSxNQUFNLEVBQUU7VUFDeEI7VUFDQSxPQUFPLElBQUk7UUFDWjtNQUNEO01BQ0EsT0FBTyxLQUFLO0lBQ2IsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDd0UsMEJBQTBCQSxDQUFDbEcsT0FBZSxFQUFFc0MsT0FBeUIsRUFBdUI7TUFDM0YsSUFBSWQsTUFBMkIsR0FBRyxFQUFFO01BQ3BDLE1BQU1rRSwrQkFBK0IsR0FDcEMxRixPQUFPLENBQUN5RixVQUFVLENBQUMsQ0FBQyxDQUFDWCxHQUFHLENBQUMsd0JBQXdCLENBQUMsSUFBSTlFLE9BQU8sQ0FBQ3lGLFVBQVUsQ0FBQyxDQUFDLENBQUNYLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQztNQUU3RyxJQUFJLENBQUNZLCtCQUErQixFQUFFO1FBQ3JDLE1BQU1nUixZQUFZLEdBQUcxVyxPQUFPLENBQUM4RixRQUFRLENBQUMsQ0FBdUQ7UUFDN0YsTUFBTTZRLG9CQUFvQixHQUFHRCxZQUFZLENBQUNFLHVCQUF1QixJQUFJRixZQUFZLENBQUNFLHVCQUF1QixDQUFDLENBQUM7UUFDM0csSUFBSUQsb0JBQW9CLEVBQUU7VUFDekIsTUFBTUUsa0JBQWtCLEdBQUc3VyxPQUFPLENBQUN5RixVQUFVLENBQUMsQ0FBQyxDQUFDbUgsaUJBQWlCLENBQUMsQ0FBQyxFQUFFWixPQUFPLENBQUMsQ0FBQztVQUM5RSxNQUFNOEssU0FBUyxHQUFHOVcsT0FBTyxDQUFDeUYsVUFBVSxDQUFDLENBQUMsQ0FBQ2tILFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRVgsT0FBTyxDQUFDLENBQUM7VUFDckV4SyxNQUFNLEdBQUdtVixvQkFBb0IsQ0FBQzNRLFNBQVMsQ0FBQyxHQUFHNlEsa0JBQWtCLElBQUlDLFNBQVMsMENBQTBDLENBQUMsSUFBSSxFQUFFO1FBQzVIO1FBQ0EsSUFBSSxDQUFDdFYsTUFBTSxDQUFDRSxNQUFNLEVBQUU7VUFDbkIsTUFBTXFWLFdBQVcsR0FBSS9XLE9BQU8sQ0FBQzhGLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBZThILFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztVQUN6RyxNQUFNa0MsY0FBYyxHQUFHOVAsT0FBTyxDQUFDNE0saUJBQWlCLENBQUMsQ0FBbUI7VUFDcEVwTCxNQUFNLEdBQ0wwVCxxQkFBcUIsQ0FBQ2hQLDBCQUEwQixDQUMvQzZRLFdBQVcsRUFDWGpILGNBQWMsRUFDZHhOLE9BQU8sQ0FBQ08sWUFBWSxFQUNwQjdDLE9BQU8sQ0FBQ3lGLFVBQVUsQ0FBQyxDQUFDLENBQUNrSCxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUVYLE9BQU8sQ0FBQyxDQUNuRCxDQUFDLElBQUksRUFBRTtRQUNUO01BQ0Q7TUFDQSxPQUFPeEssTUFBTTtJQUNkLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ3dWLDZCQUE2QixFQUFFLGVBQUFBLENBQWdCalgsU0FBb0IsRUFBRUMsT0FBbUIsRUFBRTtNQUN6RixJQUFJaVgsTUFBTSxHQUFHLElBQUk7TUFDakIsTUFBTUMsZ0JBQWdCLEdBQUdsWCxPQUFPLEVBQUVtWCxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBVztNQUMzRCxNQUFNQyxXQUFXLEdBQUdyWCxTQUFTLEVBQUVPLGNBQWMsQ0FBQyxDQUFDO01BQy9DLE1BQU1rRixLQUFLLEdBQUcwUixnQkFBZ0IsQ0FBQ3pSLFVBQVUsQ0FBQyxDQUEwQztNQUNwRixNQUFNbkQsT0FBTyxHQUFHdkMsU0FBUyxDQUFDZ0YsVUFBVSxDQUFDLENBQXFCO01BRTFELElBQUlTLEtBQUssQ0FBQ1YsR0FBRyxDQUFjLHdCQUF3QixDQUFDLElBQUlVLEtBQUssQ0FBQ1YsR0FBRyxDQUFrQiw0QkFBNEIsQ0FBQyxFQUFFO1FBQ2pILElBQUksQ0FBQ3NTLFdBQVcsRUFBRTtVQUNqQjtVQUNBSCxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUNaLDhCQUE4QixDQUFDYSxnQkFBZ0IsRUFBRTVVLE9BQU8sRUFBRSxLQUFLLENBQUM7UUFDckY7TUFDRCxDQUFDLE1BQU07UUFDTixNQUFNcUQsVUFBVSxHQUFHSCxLQUFLLENBQUNJLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLE1BQU15UixjQUFjLEdBQUc3UixLQUFLLENBQUM4UixrQkFBa0IsQ0FBQyxDQUFDO1FBQ2pELElBQUkzUixVQUFVLElBQUkwUixjQUFjLEVBQUU7VUFDakM7VUFDQTtVQUNBO1VBQ0EsTUFBTTVTLGVBQWUsR0FDbkJlLEtBQUssQ0FBQ00sUUFBUSxDQUFDLENBQUMsQ0FBZ0JDLFlBQVksQ0FBQyxDQUFDLENBQUNDLFNBQVMsQ0FBQyxHQUFHMUQsT0FBTyxDQUFDTyxZQUFZLEdBQUd0RCx5QkFBeUIsRUFBRSxDQUFDLElBQ2hILEtBQUs7VUFDTixJQUFJaUcsS0FBSyxDQUFDUyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDekIscUJBQXFCLENBQUNtQixVQUFVLEVBQUVsQixlQUFlLENBQUMsRUFBRTtZQUMzRndTLE1BQU0sR0FBR0csV0FBVyxLQUFLLEVBQUUsS0FBSyxNQUFNLElBQUksQ0FBQ2YsOEJBQThCLENBQUNhLGdCQUFnQixFQUFFNVUsT0FBTyxDQUFDLENBQUM7VUFDdEcsQ0FBQyxNQUFNO1lBQ047WUFDQTJVLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQ1osOEJBQThCLENBQUNhLGdCQUFnQixFQUFFNVUsT0FBTyxFQUFFLEtBQUssQ0FBQztVQUNyRjtRQUNELENBQUMsTUFBTSxJQUFJLENBQUM4VSxXQUFXLEVBQUU7VUFDeEJILE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQ1osOEJBQThCLENBQUNhLGdCQUFnQixFQUFFNVUsT0FBTyxDQUFDO1VBQzdFO1FBQ0Q7TUFDRDtNQUNBLE9BQU8yVSxNQUFNO0lBQ2QsQ0FBQztJQUVETSxnQ0FBZ0MsRUFBRSxlQUFBQSxDQUFnQnhYLFNBQW9CLEVBQUVDLE9BQW1CLEVBQUU7TUFDNUYsSUFBSTtRQUNILE1BQU13WCxhQUFhLEdBQUd6WCxTQUFTLENBQUMwRixVQUFVLENBQUMsQ0FBQztRQUM1QyxJQUFJK1IsYUFBYSxJQUFJQSxhQUFhLEVBQUUxUyxHQUFHLENBQWMsd0JBQXdCLENBQUMsRUFBRTtVQUMvRSxNQUFNMlMsT0FBTyxHQUFHRCxhQUFhLENBQUNMLFVBQVUsQ0FBQyxDQUFDLEVBQUVPLEtBQUssQ0FBQyxDQUFDO1VBQ25ELE1BQU1DLGNBQWMsR0FBR0YsT0FBTyxHQUFHQSxPQUFPLENBQUMxTyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsS0FBSztVQUN6RTtVQUNBLElBQUk0TyxjQUFjLEVBQUU7WUFDbkIsT0FBTyxLQUFLO1VBQ2I7UUFDRDtRQUVBLE1BQU1DLGNBQWMsR0FBRzVYLE9BQU8sRUFBRW1YLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFXO1FBQ3pELElBQUlyVyxPQUF3QztRQUM1QyxNQUFNK1csZUFBZSxHQUFHLFNBQUFBLENBQVVDLFlBQXdCLEVBQXNCO1VBQy9FaFgsT0FBTyxHQUFHZ1gsWUFBWSxFQUFFL0ksU0FBUyxDQUFDLENBQWU7VUFDakQsSUFBSWpPLE9BQU8sSUFBSUEsT0FBTyxDQUFDZ0UsR0FBRyxDQUFTLGNBQWMsQ0FBQyxFQUFFO1lBQ25ELE9BQU9oRSxPQUFPO1VBQ2YsQ0FBQyxNQUFNLElBQUlBLE9BQU8sS0FBS0YsU0FBUyxJQUFJRSxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ3JELE9BQU9GLFNBQVM7VUFDakI7VUFDQSxPQUFPaVgsZUFBZSxDQUFDL1csT0FBTyxDQUFDO1FBQ2hDLENBQUM7UUFDREEsT0FBTyxHQUFHK1csZUFBZSxDQUFDN1gsT0FBTyxDQUFDO1FBQ2xDLElBQ0NjLE9BQU8sSUFDUEEsT0FBTyxDQUFDWixJQUFJLENBQUMsOEJBQThCLENBQUMsS0FBSyxJQUFJLElBQ3JERixPQUFPLENBQUN5RixVQUFVLENBQUMsQ0FBQyxDQUFDc1MsU0FBUyxDQUFDLENBQUMsRUFBRUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNDLEVBQUUsS0FBTW5YLE9BQU8sQ0FBWW9YLGVBQWUsQ0FBQyxDQUFDLEVBQzlHO1VBQ0RwWCxPQUFPLENBQUNaLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxJQUFJLENBQUM7VUFDbEQsT0FBTyxLQUFLO1FBQ2IsQ0FBQyxNQUFNO1VBQ04sTUFBTW9DLE9BQU8sR0FBR3ZDLFNBQVMsQ0FBQ2dGLFVBQVUsQ0FBQyxDQUFxQjtVQUMxRHpDLE9BQU8sQ0FBQ0MsT0FBTyxHQUFHRCxPQUFPLENBQUNDLE9BQU8sSUFBSSxDQUFDLENBQUM7VUFDdkNELE9BQU8sQ0FBQ0MsT0FBTyxDQUFDd1MsZUFBZSxHQUFHblUsU0FBUyxDQUFDLENBQUM7VUFDN0MwQixPQUFPLENBQUNDLE9BQU8sQ0FBQ0MsT0FBTyxHQUFHRixPQUFPLENBQUNDLE9BQU8sQ0FBQ0MsT0FBTyxJQUFJdUYsZUFBZSxDQUFDb1EsbUJBQW1CLENBQUNwWSxTQUFTLEVBQUV1QyxPQUFPLENBQUM7VUFDNUcsT0FBTyxNQUFNLElBQUksQ0FBQytULDhCQUE4QixDQUFDdUIsY0FBYyxFQUFFdFYsT0FBTyxDQUFDO1FBQzFFO01BQ0QsQ0FBQyxDQUFDLE9BQU9XLEtBQWMsRUFBRTtRQUN4QkQsR0FBRyxDQUFDQyxLQUFLLENBQUNBLEtBQWUsQ0FBQztNQUMzQjtJQUNELENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDbVYsb0JBQW9CLEVBQUUsZUFBQUEsQ0FBZ0JyWSxTQUFvQixFQUFFOEgsU0FBcUIsRUFBRXdRLDBCQUFrQyxFQUFFO01BQ3RIO01BQ0EsSUFBSSxDQUFDQywwQkFBMEIsQ0FBQ0MsR0FBRyxFQUFFRCwwQkFBMEIsQ0FBQ0UsR0FBRyxDQUFDLENBQUN6UCxRQUFRLENBQUNzUCwwQkFBMEIsQ0FBQyxFQUFFO1FBQzFHLE9BQU8sSUFBSSxDQUFDZCxnQ0FBZ0MsQ0FBQ3hYLFNBQVMsRUFBRThILFNBQVMsQ0FBQztNQUNuRSxDQUFDLE1BQU0sSUFBSSxDQUFDeVEsMEJBQTBCLENBQUNHLE1BQU0sRUFBRUgsMEJBQTBCLENBQUNJLE1BQU0sQ0FBQyxDQUFDM1AsUUFBUSxDQUFDc1AsMEJBQTBCLENBQUMsRUFBRTtRQUN2SCxPQUFPLElBQUksQ0FBQ3JCLDZCQUE2QixDQUFDalgsU0FBUyxFQUFFOEgsU0FBUyxDQUFDO01BQ2hFO01BQ0EsT0FBT3lRLDBCQUEwQixDQUFDSyxnQkFBZ0IsS0FBS04sMEJBQTBCO0lBQ2xGO0VBQ0QsQ0FBQyxDQUFDO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=