@sapui5/sap.fe.core 1.136.0 → 1.136.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +4 -6
  4. package/src/sap/fe/core/AppComponent.ts +4 -4
  5. package/src/sap/fe/core/CommonUtils.js +41 -14
  6. package/src/sap/fe/core/CommonUtils.ts +47 -16
  7. package/src/sap/fe/core/IRowBindingInterface.js +1 -1
  8. package/src/sap/fe/core/IRowBindingInterface.ts +1 -1
  9. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +4 -1
  10. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +3 -0
  11. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +12 -4
  12. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +10 -3
  13. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +139 -5
  14. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +169 -4
  15. package/src/sap/fe/core/controllerextensions/EditFlow.js +48 -43
  16. package/src/sap/fe/core/controllerextensions/EditFlow.ts +54 -51
  17. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +39 -5
  18. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +38 -1
  19. package/src/sap/fe/core/controllerextensions/InternalRouting.js +12 -13
  20. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +10 -11
  21. package/src/sap/fe/core/controllerextensions/MessageHandler.js +32 -21
  22. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +31 -20
  23. package/src/sap/fe/core/controllerextensions/PageReady.js +6 -3
  24. package/src/sap/fe/core/controllerextensions/PageReady.ts +6 -2
  25. package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -2
  26. package/src/sap/fe/core/controllerextensions/Recommendations.ts +7 -5
  27. package/src/sap/fe/core/controllerextensions/Share.js +6 -6
  28. package/src/sap/fe/core/controllerextensions/Share.ts +3 -4
  29. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +9 -11
  30. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +8 -13
  31. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +9 -9
  32. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +20 -10
  33. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +31 -8
  34. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +46 -9
  35. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +2 -2
  36. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +1 -1
  37. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +20 -18
  38. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +37 -23
  39. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +4 -3
  40. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +6 -1
  41. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +6 -3
  42. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +11 -3
  43. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +5 -2
  44. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +3 -2
  45. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +2 -2
  46. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +1 -1
  47. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  48. package/src/sap/fe/core/controls/CommandExecution.ts +1 -1
  49. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +3 -2
  50. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +2 -0
  51. package/src/sap/fe/core/converters/controls/Common/Action.js +5 -2
  52. package/src/sap/fe/core/converters/controls/Common/Action.ts +4 -1
  53. package/src/sap/fe/core/converters/controls/Common/Chart.js +7 -2
  54. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -1
  55. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +41 -58
  56. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +43 -111
  57. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +14 -6
  58. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -6
  59. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +6 -3
  60. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +5 -2
  61. package/src/sap/fe/core/formatters/ValueFormatter.js +21 -1
  62. package/src/sap/fe/core/formatters/ValueFormatter.ts +19 -0
  63. package/src/sap/fe/core/fpm/manifest.json +1 -1
  64. package/src/sap/fe/core/helpers/DeleteHelper.js +2 -2
  65. package/src/sap/fe/core/helpers/DeleteHelper.ts +1 -1
  66. package/src/sap/fe/core/helpers/ModelHelper.js +2 -2
  67. package/src/sap/fe/core/helpers/ModelHelper.ts +1 -1
  68. package/src/sap/fe/core/helpers/PasteHelper.js +2 -2
  69. package/src/sap/fe/core/helpers/PasteHelper.ts +1 -1
  70. package/src/sap/fe/core/helpers/StableIdHelper.js +2 -2
  71. package/src/sap/fe/core/helpers/StableIdHelper.ts +4 -1
  72. package/src/sap/fe/core/helpers/TitleHelper.js +13 -6
  73. package/src/sap/fe/core/helpers/TitleHelper.ts +19 -6
  74. package/src/sap/fe/core/library.js +1 -1
  75. package/src/sap/fe/core/messagebundle.properties +0 -1
  76. package/src/sap/fe/core/rootView/Fcl.controller.js +9 -15
  77. package/src/sap/fe/core/rootView/Fcl.controller.ts +9 -15
  78. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +9 -6
  79. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +7 -6
  80. package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -2
  81. package/src/sap/fe/core/templating/DataModelPathHelper.ts +1 -1
  82. package/src/sap/fe/core/templating/EntitySetHelper.js +60 -48
  83. package/src/sap/fe/core/templating/EntitySetHelper.ts +80 -58
  84. package/src/sap/fe/core/templating/SemanticObjectHelper.js +6 -4
  85. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +5 -5
  86. package/src/sap/fe/core/templating/UIFormatters.js +7 -1
  87. package/src/sap/fe/core/templating/UIFormatters.ts +4 -0
@@ -349,6 +349,12 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/MetaModelCo
349
349
  constraintOptions = getConstraintOptions(oPropertyDataModelPath.targetObject);
350
350
  }
351
351
  }
352
+ if (forDisplayMode) {
353
+ formatOptions = {
354
+ ...formatOptions,
355
+ emptyString: ""
356
+ };
357
+ }
352
358
  return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType, undefined, formatOptions, constraintOptions);
353
359
  };
354
360
 
@@ -733,4 +739,4 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/MetaModelCo
733
739
  _exports.isQuickViewFacetVisible = isQuickViewFacetVisible;
734
740
  return _exports;
735
741
  }, false);
736
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGaWVsZEVkaXRNb2RlIiwiRGlzYWJsZWQiLCJEaXNwbGF5IiwiRWRpdGFibGUiLCJFZGl0YWJsZURpc3BsYXkiLCJFZGl0YWJsZVJlYWRPbmx5IiwiUmVhZE9ubHkiLCJfZXhwb3J0cyIsImdldERpc3BsYXlNb2RlIiwib0RhdGFNb2RlbE9iamVjdFBhdGgiLCJEaXNwbGF5TW9kZUZvcm1hdHRlciIsInRhcmdldE9iamVjdCIsImdldEVkaXRhYmxlRXhwcmVzc2lvbkFzT2JqZWN0Iiwib1Byb3BlcnR5UGF0aCIsIm9EYXRhRmllbGRDb252ZXJ0ZWQiLCJpc0VkaXRhYmxlIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiVUkiLCJJc0VkaXRhYmxlIiwiY29uc2lkZXJVcGRhdGVSZXN0cmljdGlvbnMiLCJnZXRFZGl0YWJsZUV4cHJlc3Npb24iLCJiQXNPYmplY3QiLCJyZWxhdGl2ZVBhdGgiLCJnZXRSZWxhdGl2ZVBhdGhzIiwiY29tcGlsZUV4cHJlc3Npb24iLCJkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24iLCJjb25zdGFudCIsImlzUHJvcGVydHkiLCJpZkVsc2UiLCJpc05vbkVkaXRhYmxlRXhwcmVzc2lvbiIsIm9Qcm9wZXJ0eSIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiJHRhcmdldCIsImlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24iLCJpc1BhdGhVcGRhdGFibGUiLCJwcm9wZXJ0eVBhdGgiLCJwYXRoVmlzaXRvciIsInBhdGgiLCJuYXZpZ2F0aW9uUGF0aHMiLCJzaW5nbGV0b25QYXRoVmlzaXRvciIsImNvbnZlcnRlZFR5cGVzIiwiZWRpdGFibGVFeHByZXNzaW9uIiwib3IiLCJhbmQiLCJub3QiLCJpc0NvbXB1dGVkIiwiaXNLZXkiLCJpc0ltbXV0YWJsZSIsIklzVHJhbnNpZW50QmluZGluZyIsInVucmVzb2x2YWJsZUV4cHJlc3Npb24iLCJnZXRDb2xsYWJvcmF0aW9uRXhwcmVzc2lvbiIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJmb3JtYXR0ZXIiLCJvYmplY3RQYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsImFjdGl2aXR5RXhwcmVzc2lvbiIsInBhdGhJbk1vZGVsIiwia2V5cyIsImNvbnRleHRMb2NhdGlvbiIsInRhcmdldEVudGl0eVR5cGUiLCJrZXlzRXhwcmVzc2lvbnMiLCJmb3JFYWNoIiwia2V5Iiwia2V5RXhwcmVzc2lvbiIsIm5hbWUiLCJwdXNoIiwiZm9ybWF0UmVzdWx0IiwiZ2V0RW5hYmxlZEV4cHJlc3Npb25Bc09iamVjdCIsImdldEVuYWJsZWRFeHByZXNzaW9uIiwiZGF0YUZpZWxkRW5hYmxlZEV4cHJlc3Npb24iLCJpc0Rpc2FibGVkRXhwcmVzc2lvbiIsImVuYWJsZWRFeHByZXNzaW9uIiwiZ2V0RWRpdE1vZGUiLCJtZWFzdXJlUmVhZE9ubHkiLCJhc09iamVjdCIsImRhdGFGaWVsZENvbnZlcnRlZCIsIiRUeXBlIiwicHJvcGVydHkiLCJhc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5IiwidW5pdFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSIsInJlc3VsdEV4cHJlc3Npb24iLCJpc1VuaXRSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwiaXNDb25zdGFudCIsImFubm90YXRpb25zIiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIlVuaXQiLCJyZWFkT25seUV4cHJlc3Npb24iLCJlZGl0TW9kZUV4cHJlc3Npb24iLCJoYXNWYWxpZEFuYWx5dGljYWxDdXJyZW5jeU9yVW5pdCIsIm9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJvUHJvcGVydHlEZWZpbml0aW9uIiwiZ2V0RXhwcmVzc2lvbkZvck1lYXN1cmVVbml0IiwiY3VycmVuY3kiLCJtZWFzdXJlIiwiaXNUcnV0aHkiLCJnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24iLCJJc1RvdGFsIiwiZ2V0RmllbGREaXNwbGF5Iiwic1RhcmdldERpc3BsYXlNb2RlIiwib0NvbXB1dGVkRWRpdE1vZGUiLCJoYXNUZXh0QW5ub3RhdGlvbiIsIkNvbW1vbiIsIlRleHQiLCJoYXNWYWx1ZUhlbHAiLCJlcXVhbCIsImdldFR5cGVDb25maWciLCJkYXRhVHlwZSIsIm9UYXJnZXRNYXBwaW5nIiwiRURNX1RZUEVfTUFQUElORyIsInR5cGUiLCJwcm9wZXJ0eVR5cGVDb25maWciLCJjb25zdHJhaW50cyIsImZvcm1hdE9wdGlvbnMiLCJzY2FsZSIsIiRTY2FsZSIsInByZWNpc2lvbiIsIiRQcmVjaXNpb24iLCJtYXhMZW5ndGgiLCIkTWF4TGVuZ3RoIiwibnVsbGFibGUiLCIkTnVsbGFibGUiLCJtaW5pbXVtIiwiaXNOYU4iLCJWYWxpZGF0aW9uIiwiTWluaW11bSIsIm1heGltdW0iLCJNYXhpbXVtIiwiaXNEaWdpdFNlcXVlbmNlIiwiSXNEaWdpdFNlcXVlbmNlIiwiVjQiLCIkVjQiLCJwYXJzZUFzU3RyaW5nIiwiaW5kZXhPZiIsImVtcHR5U3RyaW5nIiwicGFyc2VLZWVwc0VtcHR5U3RyaW5nIiwiZ2V0Q29uc3RyYWludE9wdGlvbnMiLCJEb05vdENoZWNrU2NhbGVPZk1lYXN1cmVkUXVhbnRpdHkiLCJ2YWx1ZU9mIiwic2tpcERlY2ltYWxzVmFsaWRhdGlvbiIsImdldEJpbmRpbmdXaXRoVW5pdE9yQ3VycmVuY3kiLCJvUHJvcGVydHlEYXRhTW9kZWxQYXRoIiwicHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiIsImlnbm9yZVVuaXRDb25zdHJhaW50IiwiZm9yRGlzcGxheU1vZGUiLCJzaG93T25seVVuaXREZWNpbWFscyIsInVuaXQiLCJyZWxhdGl2ZUxvY2F0aW9uIiwiZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbiIsImhhc1N0YXRpY1BlcmNlbnRVbml0Iiwic2hvd01lYXN1cmUiLCJ2YWx1ZUZvcm1hdHRlcnMiLCJmb3JtYXRXaXRoUGVyY2VudGFnZSIsImNvbXBsZXhUeXBlIiwidW5pdEJpbmRpbmdFeHByZXNzaW9uIiwiY29uc3RyYWludE9wdGlvbnMiLCJhZGRUeXBlSW5mb3JtYXRpb24iLCJnZXRCaW5kaW5nRm9yRGF0ZVBpY2tlciIsIm1pbkRhdGUiLCIkRGF0ZSIsIm1heERhdGUiLCJtaW5FeHByZXNzaW9uIiwibWF4RXhwcmVzc2lvbiIsImdldEJpbmRpbmdGb3JVbml0T3JDdXJyZW5jeSIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJzaG93TnVtYmVyIiwiZ2V0QmluZGluZ1dpdGhUaW1lem9uZSIsImhpZGVUaW1lem9uZUZvckVtcHR5VmFsdWVzIiwiZmllbGRGb3JtYXRPcHRpb25zIiwidGltZXpvbmUiLCJUaW1lem9uZSIsInN0eWxlIiwiRGF0ZVRpbWVTdHlsZSIsInNob3dUaW1lem9uZUZvckVtcHR5VmFsdWVzIiwiZGF0ZVRpbWVTdHlsZSIsImRhdGVUaW1lUGF0dGVybiIsInBhdHRlcm4iLCJzaG93VGltZSIsInNob3dEYXRlIiwic2hvd1RpbWV6b25lIiwiZ2V0QmluZGluZ0ZvckRhdGVGb3JtYXQiLCJwcm9wZXJ0eURhdGFNb2RlbFBhdGgiLCJmb3JtYXRPcHRpb25zRGF0ZUZvcm1hdCIsInRvU3RyaW5nIiwiZ2V0QmluZGluZ0ZvclRpbWV6b25lIiwicHJvcGVydHlEZWZpbml0aW9uIiwiZ2V0QWxpZ25tZW50RXhwcmVzc2lvbiIsInNBbGlnbkRpc3BsYXkiLCJzQWxpZ25FZGl0IiwiZ2V0Q29udmVydGVyQ29udGV4dCIsIm9Db250ZXh0Iiwib0ludGVyZmFjZSIsImNvbnRleHQiLCJjb252ZXJ0TWV0YU1vZGVsQ29udGV4dCIsInJlcXVpcmVzSUNvbnRleHQiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNNdWx0aVZhbHVlRmllbGQiLCJvRGF0YU1vZGVsUGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiaGFzT25lVG9NYW55TmF2aWdhdGlvbiIsImZpbmRJbmRleCIsIm9OYXYiLCJpc011bHRpcGxlTmF2aWdhdGlvblByb3BlcnR5Iiwib0NvbnRleHROYXYiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb25Bc09iamVjdCIsImZvcmNlRWRpdE1vZGUiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJvUmVxdWlyZWRQcm9wZXJ0aWVzIiwiYVJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMiLCJyZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zIiwiYVJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMiLCJyZXF1aXJlZFByb3BlcnRpZXNGcm9tVXBkYXRlUmVzdHJpY3Rpb25zIiwiZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uIiwiaXNSZXF1aXJlZEV4cHJlc3Npb24iLCJyZXF1aXJlZFByb3BlcnR5RnJvbUluc2VydFJlc3RyaWN0aW9uc0V4cHJlc3Npb24iLCJyZXF1aXJlZFByb3BlcnR5RnJvbVVwZGF0ZVJlc3RyaWN0aW9uc0V4cHJlc3Npb24iLCJyZXF1aXJlZEV4cHJlc3Npb24iLCJlZGl0TW9kZSIsImluY2x1ZGVzIiwiSXNDcmVhdGVNb2RlIiwicmV0dXJuRXhwcmVzc2lvbiIsImdldFJlcXVpcmVkRXhwcmVzc2lvbkZvckNvbm5lY3RlZERhdGFGaWVsZCIsImRhdGFGaWVsZE9iamVjdFBhdGgiLCJkYXRhIiwiRGF0YSIsIk9iamVjdCIsImRhdGFGaWVsZHMiLCJpc1JlcXVpcmVkRXhwcmVzc2lvbnMiLCJkYXRhRmllbGQiLCJWYWx1ZSIsIlRhcmdldCIsImlzQW5ub3RhdGlvbk9mVHlwZSIsImlzVmlzaWJsZSIsIkhpZGRlbiIsImlzTXVsdGlMaW5lIiwiaXNNdWx0aUxpbmVUZXh0IiwiZ2V0QWN0aW9uRW5hYmxlZEV4cHJlc3Npb24iLCJhY3Rpb25UYXJnZXQiLCJwYXRoRnJvbUNvbnRleHRMb2NhdGlvbiIsIm9wZXJhdGlvbkF2YWlsYWJsZUlzQW5ub3RhdGVkIiwiQ29yZSIsIk9wZXJhdGlvbkF2YWlsYWJsZSIsInRlcm0iLCJwcmVmaXgiLCJzb3VyY2VFbnRpdHlUeXBlIiwibmF2aWdhdGlvbnMiLCJzb3VyY2VBY3Rpb25EYXRhTW9kZWxPYmplY3QiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsIm5hdiIsImpvaW4iLCJiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUiLCJpc0JvdW5kIiwicGFyYW1ldGVycyIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsIm9wZXJhdGlvbkF2YWlsYWJsZUV4cHJlc3Npb24iLCJiaW5kaW5nQ29udGV4dFBhdGhWaXNpdG9yIiwiaXNRdWlja1ZpZXdGYWNldFZpc2libGUiLCJmYWNldE1vZGVsUGF0aCIsInRhcmdldFZpc2libGUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlVJRm9ybWF0dGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFjdGlvbiwgQWN0aW9uUGFyYW1ldGVyLCBDb252ZXJ0ZWRNZXRhZGF0YSwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uLCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBBbm5vdGF0aW9uUGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9FZG1cIjtcbmltcG9ydCB7IENvcmVBbm5vdGF0aW9uVGVybXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvcmVcIjtcbmltcG9ydCB0eXBlIHsgVW5pdCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvTWVhc3VyZXNcIjtcbmltcG9ydCB0eXBlIHtcblx0Q29sbGVjdGlvbkZhY2V0LFxuXHRDb25uZWN0ZWRGaWVsZHNUeXBlLFxuXHREYXRhRmllbGQsXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvblR5cGVzLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50VHlwZSxcblx0RGF0YVBvaW50VHlwZVR5cGVzLFxuXHRGaWVsZEdyb3VwLFxuXHRSZWZlcmVuY2VGYWNldFxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHtcblx0QmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbixcblx0Q29tcGxleFR5cGVDb25zdHJhaW50T3B0aW9ucyxcblx0Rm5cbn0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRFRE1fVFlQRV9NQVBQSU5HLFxuXHRhZGRUeXBlSW5mb3JtYXRpb24sXG5cdGFuZCxcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0Zm9ybWF0UmVzdWx0LFxuXHRmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uLFxuXHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24sXG5cdGlmRWxzZSxcblx0aXNDb25zdGFudCxcblx0aXNUcnV0aHksXG5cdG5vdCxcblx0b3IsXG5cdHBhdGhJbk1vZGVsLFxuXHR1bnJlc29sdmFibGVFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgY29udmVydE1ldGFNb2RlbENvbnRleHQsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBQYWdlQ29udGV4dFBhdGhUYXJnZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHZhbHVlRm9ybWF0dGVycyBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9WYWx1ZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgVUksIGJpbmRpbmdDb250ZXh0UGF0aFZpc2l0b3IsIHNpbmdsZXRvblBhdGhWaXNpdG9yIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IHsgaXNBbm5vdGF0aW9uT2ZUeXBlLCBpc011bHRpcGxlTmF2aWdhdGlvblByb3BlcnR5LCBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiwgaXNQcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7XG5cdGVuaGFuY2VEYXRhTW9kZWxQYXRoLFxuXHRnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoLFxuXHRnZXRSZWxhdGl2ZVBhdGhzLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoLFxuXHRpc1BhdGhVcGRhdGFibGVcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0ICogYXMgRGlzcGxheU1vZGVGb3JtYXR0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGlzcGxheU1vZGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7XG5cdGlzRGlzYWJsZWRFeHByZXNzaW9uLFxuXHRpc05vbkVkaXRhYmxlRXhwcmVzc2lvbixcblx0aXNSZWFkT25seUV4cHJlc3Npb24sXG5cdGlzUmVxdWlyZWRFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0ZpZWxkQ29udHJvbEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGhhc1N0YXRpY1BlcmNlbnRVbml0LFxuXHRoYXNWYWx1ZUhlbHAsXG5cdGlzQ29tcHV0ZWQsXG5cdGlzSW1tdXRhYmxlLFxuXHRpc0tleSxcblx0aXNNdWx0aUxpbmVUZXh0XG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBGaWVsZEZvcm1hdE9wdGlvbnMgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRGb3JtYXRPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFQb2ludEZvcm1hdE9wdGlvbnMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC9oZWxwZXJzL0RhdGFQb2ludFRlbXBsYXRpbmdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5cbi8vIEltcG9ydC1leHBvcnQgbWV0aG9kIHVzZWQgYnkgdGhlIGNvbnZlcnRlciB0byB1c2UgdGhlbSBpbiB0aGUgdGVtcGxhdGluZyB0aHJvdWdoIHRoZSBVSUZvcm1hdHRlcnMuXG5leHBvcnQgdHlwZSBEaXNwbGF5TW9kZSA9IERpc3BsYXlNb2RlRm9ybWF0dGVyLkRpc3BsYXlNb2RlO1xuXG5leHBvcnQgdHlwZSBGaWVsZEVkaXRTdHlsZSA9IFwiUmFkaW9CdXR0b25zXCI7XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5T3JQYXRoPFA+ID0gc3RyaW5nIHwgUCB8IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPjtcbmV4cG9ydCB0eXBlIE1ldGFNb2RlbENvbnRleHQgPSB7XG5cdCRraW5kOiBzdHJpbmc7XG5cdCRUeXBlOiBzdHJpbmc7XG5cdCROdWxsYWJsZT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgdGhlIHN0cnVjdHVyZSByZXR1cm5lZCBieSB0aGUgT0RhdGFNZXRhTW9kZWwgd2hlbiB1c2luZyB0aGUgQEAgb3BlcmF0b3IgaW4gWE1MIHRlbXBsYXRlcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlID0ge1xuXHRjb250ZXh0OiBDb250ZXh0O1xuXHRhcmd1bWVudHM/OiB1bmtub3duW107XG5cdCQkdmFsdWVBc1Byb21pc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZUNvbnN0cmFpbnRzID0ge1xuXHRzY2FsZT86IG51bWJlcjtcblx0cHJlY2lzaW9uPzogbnVtYmVyO1xuXHRtYXhMZW5ndGg/OiBudW1iZXI7XG5cdG51bGxhYmxlPzogYm9vbGVhbjtcblx0bWluaW11bT86IHN0cmluZztcblx0bWF4aW11bT86IHN0cmluZztcblx0aXNEaWdpdFNlcXVlbmNlPzogYm9vbGVhbjtcblx0VjQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZWZvcm1hdE9wdGlvbnMgPSB7XG5cdHBhcnNlQXNTdHJpbmc/OiBib29sZWFuO1xuXHRlbXB0eVN0cmluZz86IHN0cmluZztcblx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIENvbmZpZ1R5cGUgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0Y29uc3RyYWludHM6IGNvbmZpZ1R5cGVDb25zdHJhaW50cztcblx0Zm9ybWF0T3B0aW9uczogY29uZmlnVHlwZWZvcm1hdE9wdGlvbnM7XG59O1xuXG5leHBvcnQgdHlwZSBEYXRlVGltZVN0eWxlID0gXCJzaG9ydFwiIHwgXCJtZWRpdW1cIiB8IFwibG9uZ1wiIHwgXCJmdWxsXCI7XG5cbmV4cG9ydCB0eXBlIEZvcm1hdE9wdGlvbnNEYXRlRm9ybWF0ID0gRmllbGRGb3JtYXRPcHRpb25zIHwgRGF0YVBvaW50Rm9ybWF0T3B0aW9ucztcblxuZXhwb3J0IGNvbnN0IEZpZWxkRWRpdE1vZGUgPSB7XG5cdC8qKlxuXHQgKiB7QGxpbmsgc2FwLnVpLm1kYy5GaWVsZCBGaWVsZH0sIHtAbGluayBzYXAudWkubWRjLkZpbHRlckZpZWxkIEZpbHRlckZpZWxkfSBvciB7QGxpbmsgc2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGQgTXVsdGlWYWx1ZUZpZWxkIH1cblx0ICogaXMgcmVuZGVyZWQgaW4gZGlzYWJsZWQgbW9kZVxuXHQgKi9cblx0RGlzYWJsZWQ6IFwiRGlzYWJsZWRcIixcblx0LyoqXG5cdCAqIHtAbGluayBzYXAudWkubWRjLkZpZWxkIEZpZWxkfSwge0BsaW5rIHNhcC51aS5tZGMuRmlsdGVyRmllbGQgRmlsdGVyRmllbGR9IG9yIHtAbGluayBzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZCBNdWx0aVZhbHVlRmllbGQgfVxuXHQgKiBpcyByZW5kZXJlZCBpbiBkaXNwbGF5IG1vZGVcblx0ICovXG5cdERpc3BsYXk6IFwiRGlzcGxheVwiLFxuXHQvKipcblx0ICoge0BsaW5rIHNhcC51aS5tZGMuRmllbGQgRmllbGR9LCB7QGxpbmsgc2FwLnVpLm1kYy5GaWx0ZXJGaWVsZCBGaWx0ZXJGaWVsZH0gb3Ige0BsaW5rIHNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkIE11bHRpVmFsdWVGaWVsZCB9XG5cdCAqIGlzIHJlbmRlcmVkIGluIGVkaXRhYmxlIG1vZGVcblx0ICovXG5cdEVkaXRhYmxlOiBcIkVkaXRhYmxlXCIsXG5cdC8qKlxuXHQgKiBJZiBtb3JlIHRoYW4gb25lIGNvbnRyb2wgaXMgcmVuZGVyZWQgYnkgdGhlIHtAbGluayBzYXAudWkubWRjLkZpZWxkIEZpZWxkfSwge0BsaW5rIHNhcC51aS5tZGMuRmlsdGVyRmllbGQgRmlsdGVyRmllbGQgfVxuXHQgKiBvciB7QGxpbmsgc2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGQgTXVsdGlWYWx1ZUZpZWxkfSBjb250cm9sLCB0aGUgZmlyc3QgcGFydCBpcyBlZGl0YWJsZSwgYW5kIHRoZSBvdGhlclxuXHQgKiBwYXJ0cyBhcmUgaW4gZGlzcGxheSBtb2RlLlxuXHQgKi9cblx0RWRpdGFibGVEaXNwbGF5OiBcIkVkaXRhYmxlRGlzcGxheVwiLFxuXHQvKipcblx0ICogSWYgbW9yZSB0aGFuIG9uZSBjb250cm9sIGlzIHJlbmRlcmVkIGJ5IHRoZSB7QGxpbmsgc2FwLnVpLm1kYy5GaWVsZCBGaWVsZH0sIHtAbGluayBzYXAudWkubWRjLkZpbHRlckZpZWxkIEZpbHRlckZpZWxkIH1cblx0ICogb3Ige0BsaW5rIHNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkIE11bHRpVmFsdWVGaWVsZH0gY29udHJvbCwgdGhlIGZpcnN0IHBhcnQgaXMgZWRpdGFibGUsIGFuZCB0aGUgb3RoZXJcblx0ICogcGFydHMgYXJlIHJlYWQtb25seS5cblx0ICovXG5cdEVkaXRhYmxlUmVhZE9ubHk6IFwiRWRpdGFibGVSZWFkT25seVwiLFxuXHQvKipcblx0ICoge0BsaW5rIHNhcC51aS5tZGMuRmllbGQgRmllbGR9LCB7QGxpbmsgc2FwLnVpLm1kYy5GaWx0ZXJGaWVsZCBGaWx0ZXJGaWVsZH0gb3Ige0BsaW5rIHNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkIE11bHRpVmFsdWVGaWVsZCB9XG5cdCAqIGlzIHJlbmRlcmVkIGluIHJlYWQtb25seSBtb2RlXG5cdCAqL1xuXHRSZWFkT25seTogXCJSZWFkT25seVwiXG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGlzcGxheU1vZGUgPSBmdW5jdGlvbiAoXG5cdG9EYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcz5cbik6IERpc3BsYXlNb2RlIHtcblx0cmV0dXJuIERpc3BsYXlNb2RlRm9ybWF0dGVyLmdldERpc3BsYXlNb2RlKG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCwgb0RhdGFNb2RlbE9iamVjdFBhdGgpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRFZGl0YWJsZUV4cHJlc3Npb25Bc09iamVjdCA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkOiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMgfCB1bmRlZmluZWQsXG5cdG9EYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPHVua25vd24+LFxuXHRpc0VkaXRhYmxlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBVSS5Jc0VkaXRhYmxlLFxuXHRjb25zaWRlclVwZGF0ZVJlc3RyaWN0aW9ucyA9IHRydWVcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBnZXRFZGl0YWJsZUV4cHJlc3Npb24oXG5cdFx0b1Byb3BlcnR5UGF0aCxcblx0XHRvRGF0YUZpZWxkQ29udmVydGVkLFxuXHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdHRydWUsXG5cdFx0aXNFZGl0YWJsZSxcblx0XHRjb25zaWRlclVwZGF0ZVJlc3RyaWN0aW9uc1xuXHQpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZWRpdGFibGVcIiBCb29sZWFuIHZhbHVlLlxuICogQHBhcmFtIG9Qcm9wZXJ0eVBhdGggVGhlIGlucHV0IHByb3BlcnR5XG4gKiBAcGFyYW0gb0RhdGFGaWVsZENvbnZlcnRlZCBUaGUgRGF0YUZpZWxkQ29udmVydGVkIG9iamVjdCB0byByZWFkIHRoZSBmaWVsZENvbnRyb2wgYW5ub3RhdGlvblxuICogQHBhcmFtIG9EYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBwYXRoIHRvIHRoaXMgcHJvcGVydHkgb2JqZWN0XG4gKiBAcGFyYW0gYkFzT2JqZWN0IFdoZXRoZXIgb3Igbm90IHRoaXMgc2hvdWxkIGJlIHJldHVybmVkIGFzIGFuIG9iamVjdCBvciBhIGJpbmRpbmcgc3RyaW5nXG4gKiBAcGFyYW0gaXNFZGl0YWJsZSBXaGV0aGVyIG9yIG5vdCBVSS5Jc0VkaXRhYmxlIGJlIGNvbnNpZGVyZWQuXG4gKiBAcGFyYW0gY29uc2lkZXJVcGRhdGVSZXN0cmljdGlvbnMgV2hldGhlciB3ZSB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IFVwZGF0ZVJlc3RyaWN0aW9ucyB0byBjb21wdXRlIHRoZSBlZGl0YWJsZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB1c2VkIHRvIGRldGVybWluZSBpZiBhIHByb3BlcnR5IGlzIGVkaXRhYmxlIG9yIG5vdFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdGFibGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ6IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcblx0b0RhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj4sXG5cdGJBc09iamVjdCA9IGZhbHNlLFxuXHRpc0VkaXRhYmxlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBVSS5Jc0VkaXRhYmxlLFxuXHRjb25zaWRlclVwZGF0ZVJlc3RyaWN0aW9ucyA9IHRydWVcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgcmVsYXRpdmVQYXRoID0gZ2V0UmVsYXRpdmVQYXRocyhvRGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihmYWxzZSk7XG5cdH1cblx0bGV0IGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQodHJ1ZSk7XG5cdGlmIChvRGF0YUZpZWxkQ29udmVydGVkICE9PSB1bmRlZmluZWQgJiYgIWlzUHJvcGVydHkob0RhdGFGaWVsZENvbnZlcnRlZCkpIHtcblx0XHRkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24gPSBpZkVsc2UoaXNOb25FZGl0YWJsZUV4cHJlc3Npb24ob0RhdGFGaWVsZENvbnZlcnRlZCksIGZhbHNlLCBpc0VkaXRhYmxlKTtcblx0fSBlbHNlIGlmIChvRGF0YUZpZWxkQ29udmVydGVkICE9PSB1bmRlZmluZWQpIHtcblx0XHRkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24gPSBpc0VkaXRhYmxlO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5ID0gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgPyBvUHJvcGVydHlQYXRoLiR0YXJnZXQgOiBvUHJvcGVydHlQYXRoO1xuXG5cdC8vIEVkaXRhYmlsaXR5IGRlcGVuZHMgb24gdGhlIGZpZWxkIGNvbnRyb2wgZXhwcmVzc2lvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBzdGF0aWNhbGx5IGluIFJlYWRPbmx5IG9yIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpIC0+IG5vdCBlZGl0YWJsZVxuXHQvLyBJZiB0aGUgcHJvcGVydHkgaXMgYSBrZXkgLT4gbm90IGVkaXRhYmxlIGV4Y2VwdCBpbiBjcmVhdGlvbiBpZiBub3QgY29tcHV0ZWRcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIGNvbXB1dGVkIC0+IG5vdCBlZGl0YWJsZVxuXHQvLyBJZiB0aGUgcHJvcGVydHkgaXMgbm90IHVwZGF0YWJsZSAtPiBub3QgZWRpdGFibGVcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIGltbXV0YWJsZSAtPiBub3QgZWRpdGFibGUgZXhjZXB0IGluIGNyZWF0aW9uXG5cdC8vIElmIHRoZSBGaWVsZCBjb250cm9sIGlzIGEgcGF0aCByZXNvbHZpbmcgdG8gUmVhZE9ubHkgb3IgSW5hcHBsaWNhYmxlIChkaXNhYmxlZCkgKDw9IDEpIC0+IG5vdCBlZGl0YWJsZVxuXHQvLyBFbHNlLCB0byBiZSBlZGl0YWJsZSB5b3UgbmVlZFxuXHQvLyBpbW11dGFibGUgYW5kIGtleSB3aGlsZSBpbiB0aGUgY3JlYXRpb24gcm93XG5cdC8vIHVpL2lzRWRpdGFibGVcblx0Y29uc3QgaXNQYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiA9IGlzUGF0aFVwZGF0YWJsZShvRGF0YU1vZGVsT2JqZWN0UGF0aCwge1xuXHRcdHByb3BlcnR5UGF0aDogb1Byb3BlcnR5UGF0aCxcblx0XHRwYXRoVmlzaXRvcjogKHBhdGg6IHN0cmluZywgbmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSkgPT5cblx0XHRcdHNpbmdsZXRvblBhdGhWaXNpdG9yKHBhdGgsIG9EYXRhTW9kZWxPYmplY3RQYXRoLmNvbnZlcnRlZFR5cGVzLCBuYXZpZ2F0aW9uUGF0aHMpXG5cdH0pO1xuXHRpZiAoY29tcGlsZUV4cHJlc3Npb24oaXNQYXRoVXBkYXRhYmxlRXhwcmVzc2lvbikgPT09IFwiZmFsc2VcIiAmJiBjb25zaWRlclVwZGF0ZVJlc3RyaWN0aW9ucykge1xuXHRcdHJldHVybiBiQXNPYmplY3QgPyBpc1BhdGhVcGRhdGFibGVFeHByZXNzaW9uIDogXCJmYWxzZVwiO1xuXHR9XG5cdGNvbnN0IGVkaXRhYmxlRXhwcmVzc2lvbiA9XG5cdFx0b1Byb3BlcnR5ICE9PSB1bmRlZmluZWRcblx0XHRcdD8gaWZFbHNlKFxuXHRcdFx0XHRcdG9yKFxuXHRcdFx0XHRcdFx0YW5kKG5vdChpc1BhdGhVcGRhdGFibGVFeHByZXNzaW9uKSwgY29uc2lkZXJVcGRhdGVSZXN0cmljdGlvbnMpLFxuXHRcdFx0XHRcdFx0aXNDb21wdXRlZChvUHJvcGVydHkpLFxuXHRcdFx0XHRcdFx0aXNLZXkob1Byb3BlcnR5KSxcblx0XHRcdFx0XHRcdGlzSW1tdXRhYmxlKG9Qcm9wZXJ0eSksXG5cdFx0XHRcdFx0XHRpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvUHJvcGVydHksIHJlbGF0aXZlUGF0aClcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGlmRWxzZShvcihpc0NvbXB1dGVkKG9Qcm9wZXJ0eSksIGlzTm9uRWRpdGFibGVFeHByZXNzaW9uKG9Qcm9wZXJ0eSwgcmVsYXRpdmVQYXRoKSksIGZhbHNlLCBVSS5Jc1RyYW5zaWVudEJpbmRpbmcpLFxuXHRcdFx0XHRcdGlzRWRpdGFibGVcblx0XHRcdCAgKVxuXHRcdFx0OiB1bnJlc29sdmFibGVFeHByZXNzaW9uO1xuXHRpZiAoYkFzT2JqZWN0KSB7XG5cdFx0cmV0dXJuIGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbik7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbikpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbGxhYm9yYXRpb25FeHByZXNzaW9uID0gZnVuY3Rpb24gPFQ+KFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0Zm9ybWF0dGVyOiBGbjxUPlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+IHtcblx0Y29uc3Qgb2JqZWN0UGF0aCA9IGdldFRhcmdldE9iamVjdFBhdGgoZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdGNvbnN0IGFjdGl2aXR5RXhwcmVzc2lvbiA9IHBhdGhJbk1vZGVsKGAvY29sbGFib3JhdGlvbi9hY3Rpdml0aWVzJHtvYmplY3RQYXRofWAsIFwiaW50ZXJuYWxcIik7XG5cdGNvbnN0IGtleXMgPSBkYXRhTW9kZWxPYmplY3RQYXRoPy5jb250ZXh0TG9jYXRpb24/LnRhcmdldEVudGl0eVR5cGU/LmtleXM7XG5cdGNvbnN0IGtleXNFeHByZXNzaW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHVua25vd24+W10gPSBbXTtcblx0a2V5cz8uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0Y29uc3Qga2V5RXhwcmVzc2lvbiA9IHBhdGhJbk1vZGVsKGtleS5uYW1lKTtcblx0XHRrZXlzRXhwcmVzc2lvbnMucHVzaChrZXlFeHByZXNzaW9uKTtcblx0fSk7XG5cdHJldHVybiBmb3JtYXRSZXN1bHQoW2FjdGl2aXR5RXhwcmVzc2lvbiwgLi4ua2V5c0V4cHJlc3Npb25zXSwgZm9ybWF0dGVyKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RW5hYmxlZEV4cHJlc3Npb25Bc09iamVjdCA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkPzogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzLFxuXHRvRGF0YU1vZGVsT2JqZWN0UGF0aD86IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBnZXRFbmFibGVkRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlLCBvRGF0YU1vZGVsT2JqZWN0UGF0aCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xufTtcbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZW5hYmxlZFwiIEJvb2xlYW4gdmFsdWUuXG4gKiBAcGFyYW0gb1Byb3BlcnR5UGF0aCBUaGUgaW5wdXQgcHJvcGVydHlcbiAqIEBwYXJhbSBvRGF0YUZpZWxkQ29udmVydGVkIFRoZSBEYXRhRmllbGRDb252ZXJ0ZWQgT2JqZWN0IHRvIHJlYWQgdGhlIGZpZWxkQ29udHJvbCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gYkFzT2JqZWN0IFdoZXRoZXIgb3Igbm90IHRoaXMgc2hvdWxkIGJlIHJldHVybmVkIGFzIGFuIG9iamVjdCBvciBhIGJpbmRpbmcgc3RyaW5nXG4gKiBAcGFyYW0gb0RhdGFNb2RlbE9iamVjdFBhdGhcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gZGV0ZXJtaW5lIGlmIGEgcHJvcGVydHkgaXMgZW5hYmxlZCBvciBub3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVuYWJsZWRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMsXG5cdGJBc09iamVjdCA9IGZhbHNlLFxuXHRvRGF0YU1vZGVsT2JqZWN0UGF0aD86IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj5cbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0aWYgKCFvUHJvcGVydHlQYXRoIHx8IHR5cGVvZiBvUHJvcGVydHlQYXRoID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKHRydWUpO1xuXHR9XG5cdGxldCByZWxhdGl2ZVBhdGg7XG5cdGlmIChvRGF0YU1vZGVsT2JqZWN0UGF0aCkge1xuXHRcdHJlbGF0aXZlUGF0aCA9IGdldFJlbGF0aXZlUGF0aHMob0RhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHR9XG5cdGxldCBkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQodHJ1ZSk7XG5cdGlmIChvRGF0YUZpZWxkQ29udmVydGVkICE9PSB1bmRlZmluZWQgJiYgIWlzUHJvcGVydHkob0RhdGFGaWVsZENvbnZlcnRlZCkpIHtcblx0XHRkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbiA9IGlmRWxzZShpc0Rpc2FibGVkRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSwgZmFsc2UsIHRydWUpO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5ID0gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgPyBvUHJvcGVydHlQYXRoLiR0YXJnZXQgOiBvUHJvcGVydHlQYXRoO1xuXHQvLyBFbmFibGVtZW50IGRlcGVuZHMgb24gdGhlIGZpZWxkIGNvbnRyb2wgZXhwcmVzc2lvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBzdGF0aWNhbGx5IGluIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpIC0+IG5vdCBlbmFibGVkXG5cdGNvbnN0IGVuYWJsZWRFeHByZXNzaW9uID1cblx0XHRvUHJvcGVydHkgIT09IHVuZGVmaW5lZCA/IGlmRWxzZShpc0Rpc2FibGVkRXhwcmVzc2lvbihvUHJvcGVydHksIHJlbGF0aXZlUGF0aCksIGZhbHNlLCB0cnVlKSA6IHVucmVzb2x2YWJsZUV4cHJlc3Npb247XG5cdGlmIChiQXNPYmplY3QpIHtcblx0XHRyZXR1cm4gYW5kKGVuYWJsZWRFeHByZXNzaW9uLCBkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbik7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGFuZChlbmFibGVkRXhwcmVzc2lvbiwgZGF0YUZpZWxkRW5hYmxlZEV4cHJlc3Npb24pKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZWRpdE1vZGVcIiBlbnVtIHZhbHVlLlxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgaW5wdXQgcHJvcGVydHlcbiAqIEBwYXJhbSBkYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBsaXN0IG9mIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IGFyZSBpbnZvbHZlZCB0byByZWFjaCB0aGF0IHByb3BlcnR5XG4gKiBAcGFyYW0gbWVhc3VyZVJlYWRPbmx5IFdoZXRoZXIgd2Ugc2hvdWxkIHNldCBVb00gLyBjdXJyZW5jeSBmaWVsZCBtb2RlIHRvIHJlYWQgb25seVxuICogQHBhcmFtIGFzT2JqZWN0IFdoZXRoZXIgd2Ugc2hvdWxkIHJldHVybiB0aGlzIGFzIGFuIGV4cHJlc3Npb24gb3IgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSBkYXRhRmllbGRDb252ZXJ0ZWQgVGhlIGRhdGFGaWVsZCBvYmplY3RcbiAqIEBwYXJhbSBpc0VkaXRhYmxlIFdoZXRoZXIgb3Igbm90IFVJLklzRWRpdGFibGUgYmUgY29uc2lkZXJlZC5cbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHByb3BlcnR5IGVkaXQgbW9kZSwgY29tcGxpYW50IHdpdGggdGhlIE1EQyBGaWVsZCBkZWZpbml0aW9uIG9mIGVkaXRNb2RlLlxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdE1vZGUgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPHVua25vd24+LFxuXHRtZWFzdXJlUmVhZE9ubHkgPSBmYWxzZSxcblx0YXNPYmplY3QgPSBmYWxzZSxcblx0ZGF0YUZpZWxkQ29udmVydGVkOiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG5cdGlzRWRpdGFibGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IFVJLklzRWRpdGFibGVcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRpZiAoXG5cdFx0IXByb3BlcnR5UGF0aCB8fFxuXHRcdHR5cGVvZiBwcm9wZXJ0eVBhdGggPT09IFwic3RyaW5nXCIgfHxcblx0XHQoIWlzUHJvcGVydHkoZGF0YUZpZWxkQ29udmVydGVkKSAmJiBkYXRhRmllbGRDb252ZXJ0ZWQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGgpXG5cdCkge1xuXHRcdHJldHVybiBGaWVsZEVkaXRNb2RlLkRpc3BsYXk7XG5cdH1cblx0Y29uc3QgcHJvcGVydHkgPSBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eVBhdGgpID8gcHJvcGVydHlQYXRoLiR0YXJnZXQgOiBwcm9wZXJ0eVBhdGg7XG5cdGlmICghaXNQcm9wZXJ0eShwcm9wZXJ0eSkpIHtcblx0XHRyZXR1cm4gRmllbGRFZGl0TW9kZS5EaXNwbGF5O1xuXHR9XG5cdGNvbnN0IHJlbGF0aXZlUGF0aCA9IGdldFJlbGF0aXZlUGF0aHMoZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdGNvbnN0IGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24gPSBpc1BhdGhVcGRhdGFibGUoZGF0YU1vZGVsT2JqZWN0UGF0aCwge1xuXHRcdHByb3BlcnR5UGF0aDogcHJvcGVydHksXG5cdFx0cGF0aFZpc2l0b3I6IChwYXRoOiBzdHJpbmcsIG5hdmlnYXRpb25QYXRoczogc3RyaW5nW10pID0+XG5cdFx0XHRzaW5nbGV0b25QYXRoVmlzaXRvcihwYXRoLCBkYXRhTW9kZWxPYmplY3RQYXRoLmNvbnZlcnRlZFR5cGVzLCBuYXZpZ2F0aW9uUGF0aHMpXG5cdH0pO1xuXG5cdC8vIHdlIGdldCB0aGUgZWRpdGFibGUgRXhwcmVzc2lvbiB3aXRob3V0IGNvbnNpZGVyaW5nIHVwZGF0ZSBSZXN0cmljdGlvbnMgYmVjYXVzZSB0aGV5IGFyZSBoYW5kbGVkIHNlcGFyYXRlbHlcblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID0gZ2V0RWRpdGFibGVFeHByZXNzaW9uQXNPYmplY3QocHJvcGVydHlQYXRoLCBkYXRhRmllbGRDb252ZXJ0ZWQsIGRhdGFNb2RlbE9iamVjdFBhdGgsIGlzRWRpdGFibGUsIGZhbHNlKTtcblxuXHRjb25zdCBlbmFibGVkRXhwcmVzc2lvbiA9IGdldEVuYWJsZWRFeHByZXNzaW9uQXNPYmplY3QocHJvcGVydHlQYXRoLCBkYXRhRmllbGRDb252ZXJ0ZWQsIGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRjb25zdCBhc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KHByb3BlcnR5KTtcblx0Y29uc3QgdW5pdFByb3BlcnR5ID0gYXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdGxldCByZXN1bHRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiA9IGNvbnN0YW50KEZpZWxkRWRpdE1vZGUuRWRpdGFibGUpO1xuXHRpZiAodW5pdFByb3BlcnR5KSB7XG5cdFx0Y29uc3QgaXNVbml0UmVhZE9ubHkgPSBpc1JlYWRPbmx5RXhwcmVzc2lvbih1bml0UHJvcGVydHksIHJlbGF0aXZlUGF0aCk7XG5cdFx0cmVzdWx0RXhwcmVzc2lvbiA9IGlmRWxzZShcblx0XHRcdG9yKGlzVW5pdFJlYWRPbmx5LCBpc0NvbXB1dGVkKHVuaXRQcm9wZXJ0eSksIGFuZChpc0ltbXV0YWJsZSh1bml0UHJvcGVydHkpLCBub3QoVUkuSXNUcmFuc2llbnRCaW5kaW5nKSksIG1lYXN1cmVSZWFkT25seSksXG5cdFx0XHRpZkVsc2UoIWlzQ29uc3RhbnQoaXNVbml0UmVhZE9ubHkpICYmIGlzVW5pdFJlYWRPbmx5LCBGaWVsZEVkaXRNb2RlLkVkaXRhYmxlUmVhZE9ubHksIEZpZWxkRWRpdE1vZGUuRWRpdGFibGVEaXNwbGF5KSxcblx0XHRcdEZpZWxkRWRpdE1vZGUuRWRpdGFibGVcblx0XHQpO1xuXHR9XG5cdGlmICghdW5pdFByb3BlcnR5ICYmIChwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSB8fCBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0KSkge1xuXHRcdC8vIG5vIHVuaXQgcHJvcGVydHkgYXNzb2NpYXRlZCBtZWFucyB0aGlzIGlzIGEgc3RhdGljIHVuaXRcblx0XHRyZXN1bHRFeHByZXNzaW9uID0gY29uc3RhbnQoRmllbGRFZGl0TW9kZS5FZGl0YWJsZURpc3BsYXkpO1xuXHR9XG5cdGxldCByZWFkT25seUV4cHJlc3Npb247XG5cdGlmIChkYXRhRmllbGRDb252ZXJ0ZWQgIT0gdW5kZWZpbmVkICYmICFpc1Byb3BlcnR5KGRhdGFGaWVsZENvbnZlcnRlZCkpIHtcblx0XHRyZWFkT25seUV4cHJlc3Npb24gPSBvcihpc1JlYWRPbmx5RXhwcmVzc2lvbihwcm9wZXJ0eSwgcmVsYXRpdmVQYXRoKSwgaXNSZWFkT25seUV4cHJlc3Npb24oZGF0YUZpZWxkQ29udmVydGVkKSk7XG5cdH0gZWxzZSB7XG5cdFx0cmVhZE9ubHlFeHByZXNzaW9uID0gaXNSZWFkT25seUV4cHJlc3Npb24ocHJvcGVydHksIHJlbGF0aXZlUGF0aCk7XG5cdH1cblxuXHQvLyBpZiB0aGVyZSBhcmUgdXBkYXRlIFJlc3RyaWN0aW9ucyBpdCBpcyBhbHdheXMgZGlzcGxheSBtb2RlXG5cdGNvbnN0IGVkaXRNb2RlRXhwcmVzc2lvbiA9IGlmRWxzZShcblx0XHRvcihpc1BhdGhVcGRhdGFibGVFeHByZXNzaW9uLCBVSS5Jc1RyYW5zaWVudEJpbmRpbmcpLFxuXHRcdGlmRWxzZShcblx0XHRcdGVuYWJsZWRFeHByZXNzaW9uLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRlZGl0YWJsZUV4cHJlc3Npb24sXG5cdFx0XHRcdHJlc3VsdEV4cHJlc3Npb24sXG5cdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRhbmQoIWlzQ29uc3RhbnQocmVhZE9ubHlFeHByZXNzaW9uKSAmJiByZWFkT25seUV4cHJlc3Npb24sIGlzRWRpdGFibGUpLFxuXHRcdFx0XHRcdEZpZWxkRWRpdE1vZGUuUmVhZE9ubHksXG5cdFx0XHRcdFx0RmllbGRFZGl0TW9kZS5EaXNwbGF5XG5cdFx0XHRcdClcblx0XHRcdCksXG5cdFx0XHRpZkVsc2UoaXNFZGl0YWJsZSwgRmllbGRFZGl0TW9kZS5EaXNhYmxlZCwgRmllbGRFZGl0TW9kZS5EaXNwbGF5KVxuXHRcdCksXG5cdFx0RmllbGRFZGl0TW9kZS5EaXNwbGF5XG5cdCk7XG5cdGlmIChhc09iamVjdCkge1xuXHRcdHJldHVybiBlZGl0TW9kZUV4cHJlc3Npb247XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGVkaXRNb2RlRXhwcmVzc2lvbik7XG59O1xuXG5leHBvcnQgY29uc3QgaGFzVmFsaWRBbmFseXRpY2FsQ3VycmVuY3lPclVuaXQgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+IHwgdW5kZWZpbmVkXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eURlZmluaXRpb24gPSBvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRPYmplY3Q7XG5cdHJldHVybiBvUHJvcGVydHlEZWZpbml0aW9uICYmIGdldEV4cHJlc3Npb25Gb3JNZWFzdXJlVW5pdChvUHJvcGVydHlEZWZpbml0aW9uKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yTWVhc3VyZVVuaXQgPSBmdW5jdGlvbiAob1Byb3BlcnR5RGVmaW5pdGlvbjogUHJvcGVydHkpOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IGN1cnJlbmN5ID0gb1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeTtcblx0Y29uc3QgbWVhc3VyZSA9IGN1cnJlbmN5ID8gY3VycmVuY3kgOiBvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdGlmIChtZWFzdXJlKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKG9yKGlzVHJ1dGh5KGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihtZWFzdXJlKSksIG5vdChVSS5Jc1RvdGFsKSkpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihjb25zdGFudCh0cnVlKSk7XG5cdH1cbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBmaWVsZERpc3BsYXkuXG4gKiBAcGFyYW0gb1Byb3BlcnR5UGF0aFxuICogQHBhcmFtIHNUYXJnZXREaXNwbGF5TW9kZVxuICogQHBhcmFtIG9Db21wdXRlZEVkaXRNb2RlXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBwcm9wZXJ0eSBkaXNwbGF5IG1vZGUsIGNvbXBsaWFudCB3aXRoIHRoZSBNREMgRmllbGQgZGVmaW5pdGlvbiBvZiBkaXNwbGF5TW9kZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZpZWxkRGlzcGxheSA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRzVGFyZ2V0RGlzcGxheU1vZGU6IHN0cmluZyxcblx0b0NvbXB1dGVkRWRpdE1vZGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+XG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eSA9IChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblx0Y29uc3QgaGFzVGV4dEFubm90YXRpb24gPSBvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCAhPT0gdW5kZWZpbmVkO1xuXG5cdGlmIChoYXNWYWx1ZUhlbHAob1Byb3BlcnR5KSkge1xuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihzVGFyZ2V0RGlzcGxheU1vZGUpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBoYXNUZXh0QW5ub3RhdGlvbiA/IGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShlcXVhbChvQ29tcHV0ZWRFZGl0TW9kZSwgXCJFZGl0YWJsZVwiKSwgXCJWYWx1ZVwiLCBzVGFyZ2V0RGlzcGxheU1vZGUpKSA6IFwiVmFsdWVcIjtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGdldFR5cGVDb25maWcgPSBmdW5jdGlvbiAob1Byb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBDb25maWdUeXBlIHtcblx0Y29uc3Qgb1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWyhvUHJvcGVydHkgYXMgUHJvcGVydHkpPy50eXBlXSB8fCAoZGF0YVR5cGUgPyBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXSA6IHVuZGVmaW5lZCk7XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZzogQ29uZmlnVHlwZSA9IHtcblx0XHR0eXBlOiBvVGFyZ2V0TWFwcGluZy50eXBlLFxuXHRcdGNvbnN0cmFpbnRzOiB7fSxcblx0XHRmb3JtYXRPcHRpb25zOiB7fVxuXHR9O1xuXHRpZiAoaXNQcm9wZXJ0eShvUHJvcGVydHkpKSB7XG5cdFx0cHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzID0ge1xuXHRcdFx0c2NhbGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kU2NhbGUgPyBvUHJvcGVydHkuc2NhbGUgOiB1bmRlZmluZWQsXG5cdFx0XHRwcmVjaXNpb246IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kUHJlY2lzaW9uID8gb1Byb3BlcnR5LnByZWNpc2lvbiA6IHVuZGVmaW5lZCxcblx0XHRcdG1heExlbmd0aDogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRNYXhMZW5ndGggPyBvUHJvcGVydHkubWF4TGVuZ3RoIDogdW5kZWZpbmVkLFxuXHRcdFx0bnVsbGFibGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kTnVsbGFibGUgPyBvUHJvcGVydHkubnVsbGFibGUgOiB1bmRlZmluZWQsXG5cdFx0XHRtaW5pbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1pbmltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRtYXhpbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRpc0RpZ2l0U2VxdWVuY2U6XG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiICYmXG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGlnaXRTZXF1ZW5jZVwiXSAmJlxuXHRcdFx0XHRvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNEaWdpdFNlcXVlbmNlXG5cdFx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRWNDogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRWNCA/IHRydWUgOiB1bmRlZmluZWRcblx0XHR9O1xuXHR9XG5cdHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zID0ge1xuXHRcdHBhcnNlQXNTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IGZhbHNlXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdGVtcHR5U3RyaW5nOlxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHBhcnNlS2VlcHNFbXB0eVN0cmluZzogcHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgPyB0cnVlIDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBwcm9wZXJ0eVR5cGVDb25maWc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29uc3RyYWludE9wdGlvbnMgPSBmdW5jdGlvbiAocHJvcGVydHk6IFByb3BlcnR5IHwgdW5kZWZpbmVkKTogQ29tcGxleFR5cGVDb25zdHJhaW50T3B0aW9ucyB7XG5cdHJldHVybiBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LlVJPy5Eb05vdENoZWNrU2NhbGVPZk1lYXN1cmVkUXVhbnRpdHkgJiZcblx0XHRwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LlVJLkRvTm90Q2hlY2tTY2FsZU9mTWVhc3VyZWRRdWFudGl0eT8udmFsdWVPZigpXG5cdFx0PyB7IHNraXBEZWNpbWFsc1ZhbGlkYXRpb246IHRydWUgfVxuXHRcdDoge307XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QmluZGluZ1dpdGhVbml0T3JDdXJyZW5jeSA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5RGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRpZ25vcmVVbml0Q29uc3RyYWludD86IGJvb2xlYW4sXG5cdGZvcm1hdE9wdGlvbnM/OiB7XG5cdFx0c2hvd01lYXN1cmU/OiBib29sZWFuO1xuXHRcdGRlY2ltYWxQYWRkaW5nPzogbnVtYmVyO1xuXHR9LFxuXHRmb3JEaXNwbGF5TW9kZT86IGJvb2xlYW4sXG5cdHNob3dPbmx5VW5pdERlY2ltYWxzPzogYm9vbGVhblxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdGxldCB1bml0ID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdGNvbnN0IHJlbGF0aXZlTG9jYXRpb24gPSBnZXRSZWxhdGl2ZVBhdGhzKG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgpO1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihvUHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uKTtcblx0aWYgKGhhc1N0YXRpY1BlcmNlbnRVbml0KG9Qcm9wZXJ0eURlZmluaXRpb24pKSB7XG5cdFx0aWYgKGZvcm1hdE9wdGlvbnM/LnNob3dNZWFzdXJlID09PSBmYWxzZSkge1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb247XG5cdFx0fVxuXHRcdHJldHVybiBmb3JtYXRSZXN1bHQoW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb25dLCB2YWx1ZUZvcm1hdHRlcnMuZm9ybWF0V2l0aFBlcmNlbnRhZ2UpO1xuXHR9XG5cdGNvbnN0IGNvbXBsZXhUeXBlID0gdW5pdCA/IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdFwiIDogXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5DdXJyZW5jeVwiO1xuXHR1bml0ID0gdW5pdCA/IHVuaXQgOiAob1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IGFzIHVua25vd24gYXMgVW5pdCB8IHVuZGVmaW5lZCk7XG5cdGNvbnN0IHVuaXRCaW5kaW5nRXhwcmVzc2lvbiA9XG5cdFx0aXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odW5pdCkgJiYgdW5pdC4kdGFyZ2V0XG5cdFx0XHQ/IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24odW5pdC4kdGFyZ2V0LCBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odW5pdCwgcmVsYXRpdmVMb2NhdGlvbiksIGlnbm9yZVVuaXRDb25zdHJhaW50KVxuXHRcdFx0OiBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odW5pdCwgcmVsYXRpdmVMb2NhdGlvbik7XG5cdGxldCBjb25zdHJhaW50T3B0aW9uczogQ29tcGxleFR5cGVDb25zdHJhaW50T3B0aW9ucyB8IHVuZGVmaW5lZDtcblx0aWYgKGNvbXBsZXhUeXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlVuaXRcIikge1xuXHRcdGlmIChmb3JEaXNwbGF5TW9kZSAmJiAhc2hvd09ubHlVbml0RGVjaW1hbHMpIHtcblx0XHRcdGNvbnN0cmFpbnRPcHRpb25zID0geyBza2lwRGVjaW1hbHNWYWxpZGF0aW9uOiB0cnVlIH07XG5cdFx0fSBlbHNlIGlmICghZm9yRGlzcGxheU1vZGUpIHtcblx0XHRcdC8vIENvbnNpZGVyIGFubm90YXRpb24gb25seSBpbiBlZGl0IG1vZGVcblx0XHRcdGNvbnN0cmFpbnRPcHRpb25zID0gZ2V0Q29uc3RyYWludE9wdGlvbnMob1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIHVuaXRCaW5kaW5nRXhwcmVzc2lvbl0sIGNvbXBsZXhUeXBlLCB1bmRlZmluZWQsIGZvcm1hdE9wdGlvbnMsIGNvbnN0cmFpbnRPcHRpb25zKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBkYXRlIHBpY2tlciB3aXRoIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUgcHJlc2VudC5cbiAqIEBwYXJhbSBvUHJvcGVydHlEYXRhTW9kZWxQYXRoIFRoZSBsaXN0IG9mIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IGFyZSBpbnZvbHZlZCB0byByZWFjaCB0aGF0IHByb3BlcnR5XG4gKiBAcGFyYW0gcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiBCaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGRhdGUgcHJvcGVydHkgd2l0aCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlIGZvciB0aGUgc2FtZVxuICovXG5leHBvcnQgY29uc3QgZ2V0QmluZGluZ0ZvckRhdGVQaWNrZXIgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHkgfCBEYXRhRmllbGRUeXBlcz4sXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB8IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3Qgb1Byb3BlcnR5RGVmaW5pdGlvbiA9IG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXHRjb25zdCByZWxhdGl2ZUxvY2F0aW9uID0gZ2V0UmVsYXRpdmVQYXRocyhvUHJvcGVydHlEYXRhTW9kZWxQYXRoKTtcblx0Y29uc3QgZm9ybWF0T3B0aW9ucyA9IHt9O1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihvUHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uKTtcblx0Y29uc3QgY29tcGxleFR5cGUgPSBcInNhcC5mZS5jb3JlLnR5cGUuRGF0ZVwiO1xuXHRjb25zdCBtaW5EYXRlID0gb1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW0/LiREYXRlXG5cdFx0PyBvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bT8uJERhdGVcblx0XHQ6IG9Qcm9wZXJ0eURlZmluaXRpb24/LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtO1xuXHRjb25zdCBtYXhEYXRlID0gb1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW0/LiREYXRlXG5cdFx0PyBvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bT8uJERhdGVcblx0XHQ6IG9Qcm9wZXJ0eURlZmluaXRpb24/LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtO1xuXHRjb25zdCBtaW5FeHByZXNzaW9uID1cblx0XHRtaW5EYXRlICYmIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKG1pbkRhdGUpXG5cdFx0XHQ/IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0b1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW0sXG5cdFx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKG9Qcm9wZXJ0eURlZmluaXRpb24/LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtLCByZWxhdGl2ZUxvY2F0aW9uKVxuXHRcdFx0ICApXG5cdFx0XHQ6IG1pbkRhdGU7XG5cdGNvbnN0IG1heEV4cHJlc3Npb24gPVxuXHRcdG1heERhdGUgJiYgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24obWF4RGF0ZSlcblx0XHRcdD8gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bSxcblx0XHRcdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW0sIHJlbGF0aXZlTG9jYXRpb24pXG5cdFx0XHQgIClcblx0XHRcdDogbWF4RGF0ZTtcblxuXHRyZXR1cm4gKFxuXHRcdChtaW5FeHByZXNzaW9uIHx8IG1heEV4cHJlc3Npb24pICYmXG5cdFx0YWRkVHlwZUluZm9ybWF0aW9uKFtwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLCBtaW5FeHByZXNzaW9uLCBtYXhFeHByZXNzaW9uXSwgY29tcGxleFR5cGUsIHVuZGVmaW5lZCwgZm9ybWF0T3B0aW9ucylcblx0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nRm9yVW5pdE9yQ3VycmVuY3kgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+IHwgdW5kZWZpbmVkLFxuXHRmb3JEaXNwbGF5TW9kZTogYm9vbGVhbixcblx0c2hvd09ubHlVbml0RGVjaW1hbHM6IGJvb2xlYW5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+IHwgc3RyaW5nIHtcblx0Y29uc3Qgb1Byb3BlcnR5RGVmaW5pdGlvbiA9IG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGg/LnRhcmdldE9iamVjdDtcblx0aWYgKCFvUHJvcGVydHlEZWZpbml0aW9uKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHRsZXQgdW5pdCA9IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRpZiAoaGFzU3RhdGljUGVyY2VudFVuaXQob1Byb3BlcnR5RGVmaW5pdGlvbikpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoXCIlXCIpO1xuXHR9XG5cdGNvbnN0IHJlbGF0aXZlTG9jYXRpb24gPSBnZXRSZWxhdGl2ZVBhdGhzKG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgpO1xuXG5cdGNvbnN0IGNvbXBsZXhUeXBlID0gdW5pdCA/IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdFwiIDogXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5DdXJyZW5jeVwiO1xuXHR1bml0ID0gdW5pdCA/IHVuaXQgOiAob1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IGFzIHVua25vd24gYXMgVW5pdCB8IHVuZGVmaW5lZCk7XG5cdGNvbnN0IHVuaXRCaW5kaW5nRXhwcmVzc2lvbiA9XG5cdFx0aXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odW5pdCkgJiYgdW5pdC4kdGFyZ2V0XG5cdFx0XHQ/IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24odW5pdC4kdGFyZ2V0LCBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odW5pdCwgcmVsYXRpdmVMb2NhdGlvbikpXG5cdFx0XHQ6IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih1bml0LCByZWxhdGl2ZUxvY2F0aW9uKTtcblxuXHRsZXQgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IHBhdGhJbk1vZGVsKFxuXHRcdGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgob1Byb3BlcnR5RGF0YU1vZGVsUGF0aClcblx0KSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPjtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiwgdHJ1ZSk7XG5cdGxldCBjb25zdHJhaW50T3B0aW9uczogQ29tcGxleFR5cGVDb25zdHJhaW50T3B0aW9ucyB8IHVuZGVmaW5lZDtcblx0aWYgKGNvbXBsZXhUeXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlVuaXRcIikge1xuXHRcdGlmIChmb3JEaXNwbGF5TW9kZSAmJiAhc2hvd09ubHlVbml0RGVjaW1hbHMpIHtcblx0XHRcdGNvbnN0cmFpbnRPcHRpb25zID0geyBza2lwRGVjaW1hbHNWYWxpZGF0aW9uOiB0cnVlIH07XG5cdFx0fSBlbHNlIGlmICghZm9yRGlzcGxheU1vZGUpIHtcblx0XHRcdGNvbnN0cmFpbnRPcHRpb25zID0gZ2V0Q29uc3RyYWludE9wdGlvbnMob1Byb3BlcnR5RGVmaW5pdGlvbik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oXG5cdFx0W3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIHVuaXRCaW5kaW5nRXhwcmVzc2lvbl0sXG5cdFx0Y29tcGxleFR5cGUsXG5cdFx0dW5kZWZpbmVkLFxuXHRcdHtcblx0XHRcdHBhcnNlS2VlcHNFbXB0eVN0cmluZzogdHJ1ZSxcblx0XHRcdHNob3dOdW1iZXI6IGZhbHNlXG5cdFx0fSxcblx0XHRjb25zdHJhaW50T3B0aW9uc1xuXHQpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nV2l0aFRpbWV6b25lID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4sXG5cdGlnbm9yZVVuaXRDb25zdHJhaW50ID0gZmFsc2UsXG5cdGhpZGVUaW1lem9uZUZvckVtcHR5VmFsdWVzID0gZmFsc2UsXG5cdGZpZWxkRm9ybWF0T3B0aW9ucz86IEZpZWxkRm9ybWF0T3B0aW9uc1xuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdGNvbnN0IHRpbWV6b25lID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UaW1lem9uZTtcblx0Y29uc3Qgc3R5bGUgPSBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5VST8uRGF0ZVRpbWVTdHlsZTtcblx0Y29uc3QgcmVsYXRpdmVMb2NhdGlvbiA9IGdldFJlbGF0aXZlUGF0aHMob1Byb3BlcnR5RGF0YU1vZGVsUGF0aCk7XG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gPSBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKG9Qcm9wZXJ0eURlZmluaXRpb24sIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24pO1xuXG5cdGNvbnN0IGNvbXBsZXhUeXBlID0gXCJzYXAuZmUuY29yZS50eXBlLkRhdGVUaW1lV2l0aFRpbWV6b25lXCI7XG5cdGNvbnN0IHVuaXRCaW5kaW5nRXhwcmVzc2lvbiA9XG5cdFx0aXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odGltZXpvbmUpICYmIHRpbWV6b25lLiR0YXJnZXRcblx0XHRcdD8gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihcblx0XHRcdFx0XHQodGltZXpvbmUgYXMgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPHVua25vd24+KS4kdGFyZ2V0IGFzIFByb3BlcnR5LFxuXHRcdFx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih0aW1lem9uZSwgcmVsYXRpdmVMb2NhdGlvbiksXG5cdFx0XHRcdFx0aWdub3JlVW5pdENvbnN0cmFpbnRcblx0XHRcdCAgKVxuXHRcdFx0OiBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odGltZXpvbmUsIHJlbGF0aXZlTG9jYXRpb24pO1xuXHRsZXQgZm9ybWF0T3B0aW9ucyA9IHt9O1xuXHRpZiAoaGlkZVRpbWV6b25lRm9yRW1wdHlWYWx1ZXMpIHtcblx0XHRmb3JtYXRPcHRpb25zID0ge1xuXHRcdFx0c2hvd1RpbWV6b25lRm9yRW1wdHlWYWx1ZXM6IGZhbHNlXG5cdFx0fTtcblx0fVxuXHQvLyBpZiBzdHlsZSBvciBwYXR0ZXJuIGlzIGFsc28gc2V0XG5cdGlmIChzdHlsZSkge1xuXHRcdGZvcm1hdE9wdGlvbnMgPSB7IC4uLmZvcm1hdE9wdGlvbnMsIC4uLnsgc3R5bGU6IHN0eWxlIH0gfTtcblx0fSBlbHNlIGlmIChmaWVsZEZvcm1hdE9wdGlvbnM/LmRhdGVUaW1lU3R5bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdGZvcm1hdE9wdGlvbnMgPSB7IC4uLmZvcm1hdE9wdGlvbnMsIC4uLnsgc3R5bGU6IGZpZWxkRm9ybWF0T3B0aW9ucy5kYXRlVGltZVN0eWxlIH0gfTtcblx0fVxuXG5cdGlmIChmaWVsZEZvcm1hdE9wdGlvbnM/LmRhdGVUaW1lUGF0dGVybiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Zm9ybWF0T3B0aW9ucyA9IHsgLi4uZm9ybWF0T3B0aW9ucywgLi4ueyBwYXR0ZXJuOiBmaWVsZEZvcm1hdE9wdGlvbnMuZGF0ZVRpbWVQYXR0ZXJuIH0gfTtcblx0fVxuXG5cdGlmIChmaWVsZEZvcm1hdE9wdGlvbnM/LnNob3dUaW1lICE9PSB1bmRlZmluZWQpIHtcblx0XHRmb3JtYXRPcHRpb25zID0geyAuLi5mb3JtYXRPcHRpb25zLCAuLi57IHNob3dUaW1lOiBmaWVsZEZvcm1hdE9wdGlvbnMuc2hvd1RpbWUgfSB9O1xuXHR9XG5cdGlmIChmaWVsZEZvcm1hdE9wdGlvbnM/LnNob3dEYXRlICE9PSB1bmRlZmluZWQpIHtcblx0XHRmb3JtYXRPcHRpb25zID0geyAuLi5mb3JtYXRPcHRpb25zLCAuLi57IHNob3dEYXRlOiBmaWVsZEZvcm1hdE9wdGlvbnMuc2hvd0RhdGUgfSB9O1xuXHR9XG5cdGlmIChmaWVsZEZvcm1hdE9wdGlvbnM/LnNob3dUaW1lem9uZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Zm9ybWF0T3B0aW9ucyA9IHsgLi4uZm9ybWF0T3B0aW9ucywgLi4ueyBzaG93VGltZXpvbmU6IGZpZWxkRm9ybWF0T3B0aW9ucy5zaG93VGltZXpvbmUgfSB9O1xuXHR9XG5cblx0cmV0dXJuIGFkZFR5cGVJbmZvcm1hdGlvbihbcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiwgdW5pdEJpbmRpbmdFeHByZXNzaW9uXSwgY29tcGxleFR5cGUsIHVuZGVmaW5lZCwgZm9ybWF0T3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIGRhdGUgZm9ybWF0IG9mIGEgZGF0ZSwgdGltZSBvciBkYXRlVGltZS5cbiAqIEBwYXJhbSBwcm9wZXJ0eURhdGFNb2RlbFBhdGggVGhlIGxpc3Qgb2YgZGF0YSBtb2RlbCBvYmplY3RzIHRoYXQgYXJlIGludm9sdmVkIHRvIHJlYWNoIHRoYXQgcHJvcGVydHlcbiAqIEBwYXJhbSBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uIEJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0gZm9ybWF0T3B0aW9uc0RhdGVGb3JtYXQgRm9ybWF0IG9wdGlvbnMgd2hpY2ggY29udGFpbiB0aGUgc3R5bGUgb3IgcGF0dGVybiBwcm9wZXJ0eVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYSBkYXRlLCB0aW1lLCBvciBkYXRlLXRpbWUsIHdpdGggdGhlIGdpdmVuIHBhdHRlcm4gb3Igc3R5bGUgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdGb3JEYXRlRm9ybWF0ID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPixcblx0Zm9ybWF0T3B0aW9uc0RhdGVGb3JtYXQ/OiBGb3JtYXRPcHRpb25zRGF0ZUZvcm1hdFxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gcHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eTtcblx0Y29uc3QgcGF0dGVybiA9IGZvcm1hdE9wdGlvbnNEYXRlRm9ybWF0Py5kYXRlVGltZVBhdHRlcm47XG5cdGNvbnN0IHN0eWxlID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uVUk/LkRhdGVUaW1lU3R5bGUgPz8gZm9ybWF0T3B0aW9uc0RhdGVGb3JtYXQ/LmRhdGVUaW1lU3R5bGU7XG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gPSBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKG9Qcm9wZXJ0eURlZmluaXRpb24sIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24pO1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLnR5cGUgPSBFRE1fVFlQRV9NQVBQSU5HW29Qcm9wZXJ0eURlZmluaXRpb24udHlwZV0udHlwZTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zID0ge1xuXHRcdC4uLihzdHlsZSAmJiB7IHN0eWxlOiBzdHlsZS50b1N0cmluZygpIH0pLFxuXHRcdC4uLihwYXR0ZXJuICYmIHsgcGF0dGVybjogcGF0dGVybiB9KVxuXHR9O1xuXG5cdHJldHVybiBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdGb3JUaW1lem9uZSA9IGZ1bmN0aW9uIChcblx0cHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3QgcHJvcGVydHlEZWZpbml0aW9uID0gcHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ocHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uKTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbi50eXBlID0gXCJhbnlcIjtcblx0Y29uc3QgY29tcGxleFR5cGUgPSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRhdGVUaW1lV2l0aFRpbWV6b25lXCI7XG5cdGNvbnN0IGZvcm1hdE9wdGlvbnMgPSB7IHNob3dUaW1lOiBmYWxzZSwgc2hvd0RhdGU6IGZhbHNlLCBzaG93VGltZXpvbmU6IHRydWUgfTtcblxuXHQvLyBudWxsIGlzIHJlcXVpcmVkIGJ5IGZvcm1hdHRlciB3aGVuIHRoZXJlIGlzIGp1c3QgYSB0aW1lem9uZVxuXHRyZXR1cm4gYWRkVHlwZUluZm9ybWF0aW9uKFtudWxsLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uXSwgY29tcGxleFR5cGUsIHVuZGVmaW5lZCwgZm9ybWF0T3B0aW9ucyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QWxpZ25tZW50RXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChcblx0b0NvbXB1dGVkRWRpdE1vZGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRzQWxpZ25EaXNwbGF5ID0gXCJCZWdpblwiLFxuXHRzQWxpZ25FZGl0ID0gXCJCZWdpblwiXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihpZkVsc2UoZXF1YWwob0NvbXB1dGVkRWRpdE1vZGUsIFwiRGlzcGxheVwiKSwgc0FsaWduRGlzcGxheSwgc0FsaWduRWRpdCkpO1xufTtcblxuLyoqXG4gKiBGb3JtYXR0ZXIgaGVscGVyIHRvIHJldHJpZXZlIHRoZSBjb252ZXJ0ZXJDb250ZXh0IGZyb20gdGhlIG1ldGFtb2RlbCBjb250ZXh0LlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBvcmlnaW5hbCBtZXRhbW9kZWwgY29udGV4dFxuICogQHBhcmFtIG9JbnRlcmZhY2UgVGhlIGN1cnJlbnQgdGVtcGxhdGluZyBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgQ29udmVydGVyQ29udGV4dCByZXByZXNlbnRpbmcgdGhhdCBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldENvbnZlcnRlckNvbnRleHQgPSBmdW5jdGlvbiAob0NvbnRleHQ6IE1ldGFNb2RlbENvbnRleHQsIG9JbnRlcmZhY2U6IENvbXB1dGVkQW5ub3RhdGlvbkludGVyZmFjZSk6IG9iamVjdCB8IG51bGwge1xuXHRpZiAob0ludGVyZmFjZSAmJiBvSW50ZXJmYWNlLmNvbnRleHQpIHtcblx0XHRyZXR1cm4gY29udmVydE1ldGFNb2RlbENvbnRleHQob0ludGVyZmFjZS5jb250ZXh0KSBhcyBvYmplY3Q7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59O1xuZ2V0Q29udmVydGVyQ29udGV4dC5yZXF1aXJlc0lDb250ZXh0ID0gdHJ1ZTtcblxuLyoqXG4gKiBGb3JtYXR0ZXIgaGVscGVyIHRvIHJldHJpZXZlIHRoZSBkYXRhIG1vZGVsIG9iamVjdHMgdGhhdCBhcmUgaW52b2x2ZWQgZnJvbSB0aGUgbWV0YW1vZGVsIGNvbnRleHQuXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIG9yaWdpbmFsIE9EYXRhTWV0YU1vZGVsIGNvbnRleHRcbiAqIEBwYXJhbSBvSW50ZXJmYWNlIFRoZSBjdXJyZW50IHRlbXBsYXRpbmcgY29udGV4dFxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgZW50aXR5c2V0cyBhbmQgbmF2cHJvcGVydGllcyB0aGF0IGFyZSBpbnZvbHZlZCB0byBnZXQgdG8gYSBzcGVjaWZpYyBvYmplY3QgaW4gdGhlIG1ldGFtb2RlbFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGZ1bmN0aW9uIDxUPihcblx0b0NvbnRleHQ6IE1ldGFNb2RlbENvbnRleHQsXG5cdG9JbnRlcmZhY2U6IENvbXB1dGVkQW5ub3RhdGlvbkludGVyZmFjZVxuKTogRGF0YU1vZGVsT2JqZWN0UGF0aDxUPiB8IG51bGwge1xuXHRpZiAob0ludGVyZmFjZSAmJiBvSW50ZXJmYWNlLmNvbnRleHQpIHtcblx0XHRyZXR1cm4gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9JbnRlcmZhY2UuY29udGV4dCk7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59O1xuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aC5yZXF1aXJlc0lDb250ZXh0ID0gdHJ1ZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIHJlZmVyZW5jZWQgcHJvcGVydHkgaXMgcGFydCBvZiBhIDEuLm4gbmF2aWdhdGlvbi5cbiAqIEBwYXJhbSBvRGF0YU1vZGVsUGF0aCBUaGUgZGF0YSBtb2RlbCBwYXRoIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBwYXJ0IG9mIGEgMS4ubiBuYXZpZ2F0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBpc011bHRpVmFsdWVGaWVsZCA9IGZ1bmN0aW9uIChvRGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDx1bmtub3duPik6IGJvb2xlYW4ge1xuXHRpZiAob0RhdGFNb2RlbFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdGNvbnN0IGhhc09uZVRvTWFueU5hdmlnYXRpb24gPVxuXHRcdFx0b0RhdGFNb2RlbFBhdGg/Lm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmRJbmRleCgob05hdikgPT4ge1xuXHRcdFx0XHRpZiAoaXNNdWx0aXBsZU5hdmlnYXRpb25Qcm9wZXJ0eShvTmF2KSkge1xuXHRcdFx0XHRcdGlmIChvRGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24/Lm5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vd2UgY2hlY2sgdGhlIG9uZSB0byBtYW55IG5hdiBpcyBub3QgYWxyZWFkeSBwYXJ0IG9mIHRoZSBjb250ZXh0XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRvRGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24/Lm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmRJbmRleChcblx0XHRcdFx0XHRcdFx0XHQob0NvbnRleHROYXYpID0+IG9Db250ZXh0TmF2Lm5hbWUgPT09IG9OYXYubmFtZVxuXHRcdFx0XHRcdFx0XHQpID09PSAtMVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSkgPiAtMTtcblx0XHRpZiAoaGFzT25lVG9NYW55TmF2aWdhdGlvbikge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRFeHByZXNzaW9uQXNPYmplY3QgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFGaWVsZENvbnZlcnRlZD86IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyxcblx0Zm9yY2VFZGl0TW9kZSA9IGZhbHNlXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gZ2V0UmVxdWlyZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgsIG9EYXRhRmllbGRDb252ZXJ0ZWQsIGZvcmNlRWRpdE1vZGUsIHRydWUpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMsXG5cdGZvcmNlRWRpdE1vZGUgPSBmYWxzZSxcblx0YkFzT2JqZWN0ID0gZmFsc2UsXG5cdG9SZXF1aXJlZFByb3BlcnRpZXM6IHtcblx0XHRyZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zPzogdW5rbm93bltdO1xuXHRcdHJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnM/OiB1bmtub3duW107XG5cdH0gPSB7fSxcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aD86IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj5cbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgYVJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMgPSBvUmVxdWlyZWRQcm9wZXJ0aWVzLnJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnM7XG5cdGNvbnN0IGFSZXF1aXJlZFByb3BlcnRpZXNGcm9tVXBkYXRlUmVzdHJpY3Rpb25zID0gb1JlcXVpcmVkUHJvcGVydGllcy5yZXF1aXJlZFByb3BlcnRpZXNGcm9tVXBkYXRlUmVzdHJpY3Rpb25zO1xuXHRpZiAoIW9Qcm9wZXJ0eVBhdGggfHwgdHlwZW9mIG9Qcm9wZXJ0eVBhdGggPT09IFwic3RyaW5nXCIpIHtcblx0XHRpZiAoYkFzT2JqZWN0KSB7XG5cdFx0XHRyZXR1cm4gY29uc3RhbnQoZmFsc2UpO1xuXHRcdH1cblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oY29uc3RhbnQoZmFsc2UpKTtcblx0fVxuXHRsZXQgcmVsYXRpdmVQYXRoO1xuXHRpZiAoZGF0YU1vZGVsT2JqZWN0UGF0aCkge1xuXHRcdHJlbGF0aXZlUGF0aCA9IGdldFJlbGF0aXZlUGF0aHMoZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdH1cblx0bGV0IGRhdGFGaWVsZFJlcXVpcmVkRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQoZmFsc2UpO1xuXHRpZiAob0RhdGFGaWVsZENvbnZlcnRlZCAhPT0gdW5kZWZpbmVkICYmICFpc1Byb3BlcnR5KG9EYXRhRmllbGRDb252ZXJ0ZWQpKSB7XG5cdFx0Ly8gRm9yIHRoZSBkYXRhZmllbGQgZXhwcmVzc2lvbiB3ZSBzaG91bGQgbm90ICBjb25zaWRlciB0aGUgcmVsYXRpdmUgcGF0aFxuXHRcdGRhdGFGaWVsZFJlcXVpcmVkRXhwcmVzc2lvbiA9IGlzUmVxdWlyZWRFeHByZXNzaW9uKG9EYXRhRmllbGRDb252ZXJ0ZWQpO1xuXHR9XG5cdGxldCByZXF1aXJlZFByb3BlcnR5RnJvbUluc2VydFJlc3RyaWN0aW9uc0V4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IGNvbnN0YW50KGZhbHNlKTtcblx0bGV0IHJlcXVpcmVkUHJvcGVydHlGcm9tVXBkYXRlUmVzdHJpY3Rpb25zRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQoZmFsc2UpO1xuXG5cdGNvbnN0IG9Qcm9wZXJ0eTogUHJvcGVydHkgPSAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgJiYgb1Byb3BlcnR5UGF0aC4kdGFyZ2V0KSB8fCAob1Byb3BlcnR5UGF0aCBhcyBQcm9wZXJ0eSk7XG5cdC8vIEVuYWJsZW1lbnQgZGVwZW5kcyBvbiB0aGUgZmllbGQgY29udHJvbCBleHByZXNzaW9uXG5cdC8vIElmIHRoZSBGaWVsZCBjb250cm9sIGlzIHN0YXRpY2FsbHkgaW4gSW5hcHBsaWNhYmxlIChkaXNhYmxlZCkgLT4gbm90IGVuYWJsZWRcblx0Y29uc3QgcmVxdWlyZWRFeHByZXNzaW9uID0gaXNSZXF1aXJlZEV4cHJlc3Npb24ob1Byb3BlcnR5LCByZWxhdGl2ZVBhdGgpO1xuXHRjb25zdCBlZGl0TW9kZSA9IGZvcmNlRWRpdE1vZGUgfHwgVUkuSXNFZGl0YWJsZTtcblx0aWYgKGFSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zPy5pbmNsdWRlcyhvUHJvcGVydHkubmFtZSkpIHtcblx0XHRyZXF1aXJlZFByb3BlcnR5RnJvbUluc2VydFJlc3RyaWN0aW9uc0V4cHJlc3Npb24gPSBVSS5Jc0NyZWF0ZU1vZGU7XG5cdH1cblx0aWYgKGFSZXF1aXJlZFByb3BlcnRpZXNGcm9tVXBkYXRlUmVzdHJpY3Rpb25zPy5pbmNsdWRlcyhvUHJvcGVydHkubmFtZSkpIHtcblx0XHRyZXF1aXJlZFByb3BlcnR5RnJvbVVwZGF0ZVJlc3RyaWN0aW9uc0V4cHJlc3Npb24gPSBhbmQoVUkuSXNFZGl0YWJsZSwgbm90KFVJLklzQ3JlYXRlTW9kZSkpO1xuXHR9XG5cdGNvbnN0IHJldHVybkV4cHJlc3Npb24gPSBvcihcblx0XHRhbmQob3IocmVxdWlyZWRFeHByZXNzaW9uLCBkYXRhRmllbGRSZXF1aXJlZEV4cHJlc3Npb24pLCBlZGl0TW9kZSksXG5cdFx0cmVxdWlyZWRQcm9wZXJ0eUZyb21JbnNlcnRSZXN0cmljdGlvbnNFeHByZXNzaW9uLFxuXHRcdHJlcXVpcmVkUHJvcGVydHlGcm9tVXBkYXRlUmVzdHJpY3Rpb25zRXhwcmVzc2lvblxuXHQpO1xuXHRpZiAoYkFzT2JqZWN0KSB7XG5cdFx0cmV0dXJuIHJldHVybkV4cHJlc3Npb247XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKHJldHVybkV4cHJlc3Npb24pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlcXVpcmVkRXhwcmVzc2lvbkZvckNvbm5lY3RlZERhdGFGaWVsZCA9IGZ1bmN0aW9uIChcblx0ZGF0YUZpZWxkT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxBbm5vdGF0aW9uUGF0aDxDb25uZWN0ZWRGaWVsZHNUeXBlPj5cbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcz4gPSAoZGF0YUZpZWxkT2JqZWN0UGF0aD8udGFyZ2V0T2JqZWN0Py4kdGFyZ2V0Py5EYXRhID8/IHt9KSBhcyBSZWNvcmQ8XG5cdFx0c3RyaW5nLFxuXHRcdERhdGFGaWVsZEFic3RyYWN0VHlwZXNcblx0Pjtcblx0Y29uc3Qga2V5czogQXJyYXk8c3RyaW5nPiA9IE9iamVjdC5rZXlzKGRhdGEpO1xuXHRjb25zdCBkYXRhRmllbGRzID0gW107XG5cdGxldCBwcm9wZXJ0eVBhdGg7XG5cdGNvbnN0IGlzUmVxdWlyZWRFeHByZXNzaW9uczogKENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+KVtdIHwgdW5kZWZpbmVkID0gW107XG5cdGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcblx0XHRpZiAoZGF0YVtrZXldPy5bXCIkVHlwZVwiXSAmJiBkYXRhW2tleV1bXCIkVHlwZVwiXT8uaW5jbHVkZXMoXCJEYXRhRmllbGRcIikpIHtcblx0XHRcdGRhdGFGaWVsZHMucHVzaChkYXRhW2tleV0pO1xuXHRcdH1cblx0fVxuXHRmb3IgKGNvbnN0IGRhdGFGaWVsZCBvZiBkYXRhRmllbGRzKSB7XG5cdFx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRcdGlmICh0eXBlb2YgZGF0YUZpZWxkLlZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoID0gZGF0YUZpZWxkLlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRcdGlmIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0KSB7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0aXNBbm5vdGF0aW9uT2ZUeXBlPERhdGFGaWVsZCB8IERhdGFQb2ludFR5cGU+KGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldCwgW1xuXHRcdFx0XHRcdFx0XHRVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRcdFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGVcblx0XHRcdFx0XHRcdF0pXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC5WYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVBhdGggPSBkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuVGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5UGF0aCA9IGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Ly8gbm8gZGVmYXVsdFxuXHRcdH1cblx0XHRpc1JlcXVpcmVkRXhwcmVzc2lvbnMucHVzaChnZXRSZXF1aXJlZEV4cHJlc3Npb25Bc09iamVjdChwcm9wZXJ0eVBhdGgsIGRhdGFGaWVsZCwgZmFsc2UpKTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24ob3IoLi4uKGlzUmVxdWlyZWRFeHByZXNzaW9ucyBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSkpKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgaGVhZGVyIGZhY2V0IG9yIGFjdGlvbiBpcyB2aXNpYmxlLlxuICogQHBhcmFtIHRhcmdldE9iamVjdCBIZWFkZXIgZmFjZXRzIG9yIEFjdGlvbnNcbiAqIEByZXR1cm5zIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWaXNpYmxlKFxuXHR0YXJnZXRPYmplY3Q6XG5cdFx0fCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzXG5cdFx0fCBEYXRhUG9pbnRUeXBlVHlwZXNcblx0XHR8IFJlZmVyZW5jZUZhY2V0XG5cdFx0fCBDb2xsZWN0aW9uRmFjZXRcblx0XHR8IERhdGFGaWVsZEZvckFjdGlvblR5cGVzXG5cdFx0fCBGaWVsZEdyb3VwXG5cdFx0fCBQcm9wZXJ0eVxuXHRcdHwgdW5kZWZpbmVkLFxuXHRuYXZpZ2F0aW9uUHJvcGVydGllcz86IHN0cmluZ1tdXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gbm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih0YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5VST8uSGlkZGVuLCBuYXZpZ2F0aW9uUHJvcGVydGllcyksIHRydWUpKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhY3Rpb24gcGFyYW1ldGVyIGlzIHN1cHBvcnRzIG11bHRpIGxpbmUgaW5wdXQuXG4gKiBAcGFyYW0gZGF0YU1vZGVsT2JqZWN0UGF0aCBPYmplY3QgcGF0aCB0byB0aGUgYWN0aW9uIHBhcmFtZXRlci5cbiAqIEByZXR1cm5zIEJvb2xlYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzTXVsdGlMaW5lID0gZnVuY3Rpb24gKGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8QWN0aW9uUGFyYW1ldGVyPik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gaXNNdWx0aUxpbmVUZXh0KGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBlbmFibGVkLlxuICogQHBhcmFtIGFjdGlvblRhcmdldCBBY3Rpb25cbiAqIEBwYXJhbSBjb252ZXJ0ZWRUeXBlcyBDb252ZXJ0ZWRNZXRhZGF0YVxuICogQHBhcmFtIGRhdGFNb2RlbE9iamVjdFBhdGggRGF0YU1vZGVsT2JqZWN0UGF0aFxuICogQHBhcmFtIHBhdGhGcm9tQ29udGV4dExvY2F0aW9uIEJvb2xlYW5cbiAqIEByZXR1cm5zIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aW9uRW5hYmxlZEV4cHJlc3Npb24oXG5cdGFjdGlvblRhcmdldDogQWN0aW9uLFxuXHRjb252ZXJ0ZWRUeXBlczogQ29udmVydGVkTWV0YWRhdGEsXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg/OiBEYXRhTW9kZWxPYmplY3RQYXRoPFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHBhdGhGcm9tQ29udGV4dExvY2F0aW9uPzogYm9vbGVhblxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlSXNBbm5vdGF0ZWQgPVxuXHRcdGFjdGlvblRhcmdldC5hbm5vdGF0aW9ucy5Db3JlPy5PcGVyYXRpb25BdmFpbGFibGU/LnRlcm0gPT09IENvcmVBbm5vdGF0aW9uVGVybXMuT3BlcmF0aW9uQXZhaWxhYmxlO1xuXG5cdGlmICghb3BlcmF0aW9uQXZhaWxhYmxlSXNBbm5vdGF0ZWQpIHtcblx0XHQvLyBPcGVyYXRpb25BdmFpbGFibGUgdGVybSBkb2Vzbid0IGV4aXN0IGZvciB0aGUgYWN0aW9uXG5cdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHR9XG5cblx0bGV0IHByZWZpeCA9IFwiXCI7XG5cdGlmIChcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoICYmXG5cdFx0cGF0aEZyb21Db250ZXh0TG9jYXRpb24gJiZcblx0XHRwYXRoRnJvbUNvbnRleHRMb2NhdGlvbiA9PT0gdHJ1ZSAmJlxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGguY29udGV4dExvY2F0aW9uPy50YXJnZXRFbnRpdHlUeXBlICYmXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5jb250ZXh0TG9jYXRpb24udGFyZ2V0RW50aXR5VHlwZSAhPT0gYWN0aW9uVGFyZ2V0LnNvdXJjZUVudGl0eVR5cGVcblx0KSB7XG5cdFx0Y29uc3QgbmF2aWdhdGlvbnMgPSBnZXRSZWxhdGl2ZVBhdGhzKGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRcdGxldCBzb3VyY2VBY3Rpb25EYXRhTW9kZWxPYmplY3QgPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChkYXRhTW9kZWxPYmplY3RQYXRoLmNvbnRleHRMb2NhdGlvbik7XG5cdFx0Ly9TdGFydCBmcm9tIGNvbnRleHRMb2NhdGlvbiBhbmQgbmF2aWdhdGUgdW50aWwgdGhlIHNvdXJjZSBlbnRpdHlUeXBlIG9mIHRoZSBhY3Rpb24gdG8gZ2V0IHRoZSByaWdodCBwcmVmaXhcblx0XHRmb3IgKGNvbnN0IG5hdiBvZiBuYXZpZ2F0aW9ucykge1xuXHRcdFx0c291cmNlQWN0aW9uRGF0YU1vZGVsT2JqZWN0ID0gZW5oYW5jZURhdGFNb2RlbFBhdGgoc291cmNlQWN0aW9uRGF0YU1vZGVsT2JqZWN0LCBuYXYpO1xuXHRcdFx0aWYgKHNvdXJjZUFjdGlvbkRhdGFNb2RlbE9iamVjdC50YXJnZXRFbnRpdHlUeXBlID09PSBhY3Rpb25UYXJnZXQuc291cmNlRW50aXR5VHlwZSkge1xuXHRcdFx0XHRwcmVmaXggPSBgJHtnZXRSZWxhdGl2ZVBhdGhzKHNvdXJjZUFjdGlvbkRhdGFNb2RlbE9iamVjdCkuam9pbihcIi9cIil9L2A7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRjb25zdCBiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUgPSBhY3Rpb25UYXJnZXQuaXNCb3VuZCA/IGFjdGlvblRhcmdldC5wYXJhbWV0ZXJzWzBdPy5mdWxseVF1YWxpZmllZE5hbWUgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IG9wZXJhdGlvbkF2YWlsYWJsZUV4cHJlc3Npb24gPSBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oXG5cdFx0YWN0aW9uVGFyZ2V0LmFubm90YXRpb25zLkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSxcblx0XHRbXSxcblx0XHR1bmRlZmluZWQsXG5cdFx0KHBhdGg6IHN0cmluZykgPT4gYCR7cHJlZml4fSR7YmluZGluZ0NvbnRleHRQYXRoVmlzaXRvcihwYXRoLCBjb252ZXJ0ZWRUeXBlcywgYmluZGluZ1BhcmFtZXRlckZ1bGxOYW1lKX1gXG5cdCk7XG5cblx0cmV0dXJuIGVxdWFsKG9wZXJhdGlvbkF2YWlsYWJsZUV4cHJlc3Npb24sIHRydWUpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgZXhwcmVzc2lvbiB0byBjaGVjayBpZiB0aGUgcXVpY2tWaWV3IGZhY2V0IGlzIHZpc2libGUuXG4gKiBAcGFyYW0gZmFjZXRNb2RlbFBhdGhcbiAqIEByZXR1cm5zIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiBUaGUgYmluZGluZyBleHByZXNzaW9uIG9mIHRoZSB2aXNpYmlsaXR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1F1aWNrVmlld0ZhY2V0VmlzaWJsZShmYWNldE1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxSZWZlcmVuY2VGYWNldD4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGxldCB0YXJnZXRWaXNpYmxlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudCh0cnVlKTtcblx0aWYgKGlzQW5ub3RhdGlvbk9mVHlwZTxGaWVsZEdyb3VwPihmYWNldE1vZGVsUGF0aC50YXJnZXRPYmplY3Q/LlRhcmdldD8uJHRhcmdldCwgVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGUpKSB7XG5cdFx0dGFyZ2V0VmlzaWJsZSA9IGlzVmlzaWJsZShmYWNldE1vZGVsUGF0aC50YXJnZXRPYmplY3Q/LlRhcmdldD8uJHRhcmdldCk7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGFuZChpc1Zpc2libGUoZmFjZXRNb2RlbFBhdGgudGFyZ2V0T2JqZWN0KSwgdGFyZ2V0VmlzaWJsZSkpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTJFQTs7RUFZQTtBQUNBO0FBQ0E7O0VBa0NPLE1BQU1BLGFBQWEs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
742
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGaWVsZEVkaXRNb2RlIiwiRGlzYWJsZWQiLCJEaXNwbGF5IiwiRWRpdGFibGUiLCJFZGl0YWJsZURpc3BsYXkiLCJFZGl0YWJsZVJlYWRPbmx5IiwiUmVhZE9ubHkiLCJfZXhwb3J0cyIsImdldERpc3BsYXlNb2RlIiwib0RhdGFNb2RlbE9iamVjdFBhdGgiLCJEaXNwbGF5TW9kZUZvcm1hdHRlciIsInRhcmdldE9iamVjdCIsImdldEVkaXRhYmxlRXhwcmVzc2lvbkFzT2JqZWN0Iiwib1Byb3BlcnR5UGF0aCIsIm9EYXRhRmllbGRDb252ZXJ0ZWQiLCJpc0VkaXRhYmxlIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiVUkiLCJJc0VkaXRhYmxlIiwiY29uc2lkZXJVcGRhdGVSZXN0cmljdGlvbnMiLCJnZXRFZGl0YWJsZUV4cHJlc3Npb24iLCJiQXNPYmplY3QiLCJyZWxhdGl2ZVBhdGgiLCJnZXRSZWxhdGl2ZVBhdGhzIiwiY29tcGlsZUV4cHJlc3Npb24iLCJkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24iLCJjb25zdGFudCIsImlzUHJvcGVydHkiLCJpZkVsc2UiLCJpc05vbkVkaXRhYmxlRXhwcmVzc2lvbiIsIm9Qcm9wZXJ0eSIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiJHRhcmdldCIsImlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24iLCJpc1BhdGhVcGRhdGFibGUiLCJwcm9wZXJ0eVBhdGgiLCJwYXRoVmlzaXRvciIsInBhdGgiLCJuYXZpZ2F0aW9uUGF0aHMiLCJzaW5nbGV0b25QYXRoVmlzaXRvciIsImNvbnZlcnRlZFR5cGVzIiwiZWRpdGFibGVFeHByZXNzaW9uIiwib3IiLCJhbmQiLCJub3QiLCJpc0NvbXB1dGVkIiwiaXNLZXkiLCJpc0ltbXV0YWJsZSIsIklzVHJhbnNpZW50QmluZGluZyIsInVucmVzb2x2YWJsZUV4cHJlc3Npb24iLCJnZXRDb2xsYWJvcmF0aW9uRXhwcmVzc2lvbiIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJmb3JtYXR0ZXIiLCJvYmplY3RQYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsImFjdGl2aXR5RXhwcmVzc2lvbiIsInBhdGhJbk1vZGVsIiwia2V5cyIsImNvbnRleHRMb2NhdGlvbiIsInRhcmdldEVudGl0eVR5cGUiLCJrZXlzRXhwcmVzc2lvbnMiLCJmb3JFYWNoIiwia2V5Iiwia2V5RXhwcmVzc2lvbiIsIm5hbWUiLCJwdXNoIiwiZm9ybWF0UmVzdWx0IiwiZ2V0RW5hYmxlZEV4cHJlc3Npb25Bc09iamVjdCIsImdldEVuYWJsZWRFeHByZXNzaW9uIiwiZGF0YUZpZWxkRW5hYmxlZEV4cHJlc3Npb24iLCJpc0Rpc2FibGVkRXhwcmVzc2lvbiIsImVuYWJsZWRFeHByZXNzaW9uIiwiZ2V0RWRpdE1vZGUiLCJtZWFzdXJlUmVhZE9ubHkiLCJhc09iamVjdCIsImRhdGFGaWVsZENvbnZlcnRlZCIsIiRUeXBlIiwicHJvcGVydHkiLCJhc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5IiwidW5pdFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSIsInJlc3VsdEV4cHJlc3Npb24iLCJpc1VuaXRSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwiaXNDb25zdGFudCIsImFubm90YXRpb25zIiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIlVuaXQiLCJyZWFkT25seUV4cHJlc3Npb24iLCJlZGl0TW9kZUV4cHJlc3Npb24iLCJoYXNWYWxpZEFuYWx5dGljYWxDdXJyZW5jeU9yVW5pdCIsIm9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJvUHJvcGVydHlEZWZpbml0aW9uIiwiZ2V0RXhwcmVzc2lvbkZvck1lYXN1cmVVbml0IiwiY3VycmVuY3kiLCJtZWFzdXJlIiwiaXNUcnV0aHkiLCJnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24iLCJJc1RvdGFsIiwiZ2V0RmllbGREaXNwbGF5Iiwic1RhcmdldERpc3BsYXlNb2RlIiwib0NvbXB1dGVkRWRpdE1vZGUiLCJoYXNUZXh0QW5ub3RhdGlvbiIsIkNvbW1vbiIsIlRleHQiLCJoYXNWYWx1ZUhlbHAiLCJlcXVhbCIsImdldFR5cGVDb25maWciLCJkYXRhVHlwZSIsIm9UYXJnZXRNYXBwaW5nIiwiRURNX1RZUEVfTUFQUElORyIsInR5cGUiLCJwcm9wZXJ0eVR5cGVDb25maWciLCJjb25zdHJhaW50cyIsImZvcm1hdE9wdGlvbnMiLCJzY2FsZSIsIiRTY2FsZSIsInByZWNpc2lvbiIsIiRQcmVjaXNpb24iLCJtYXhMZW5ndGgiLCIkTWF4TGVuZ3RoIiwibnVsbGFibGUiLCIkTnVsbGFibGUiLCJtaW5pbXVtIiwiaXNOYU4iLCJWYWxpZGF0aW9uIiwiTWluaW11bSIsIm1heGltdW0iLCJNYXhpbXVtIiwiaXNEaWdpdFNlcXVlbmNlIiwiSXNEaWdpdFNlcXVlbmNlIiwiVjQiLCIkVjQiLCJwYXJzZUFzU3RyaW5nIiwiaW5kZXhPZiIsImVtcHR5U3RyaW5nIiwicGFyc2VLZWVwc0VtcHR5U3RyaW5nIiwiZ2V0Q29uc3RyYWludE9wdGlvbnMiLCJEb05vdENoZWNrU2NhbGVPZk1lYXN1cmVkUXVhbnRpdHkiLCJ2YWx1ZU9mIiwic2tpcERlY2ltYWxzVmFsaWRhdGlvbiIsImdldEJpbmRpbmdXaXRoVW5pdE9yQ3VycmVuY3kiLCJvUHJvcGVydHlEYXRhTW9kZWxQYXRoIiwicHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiIsImlnbm9yZVVuaXRDb25zdHJhaW50IiwiZm9yRGlzcGxheU1vZGUiLCJzaG93T25seVVuaXREZWNpbWFscyIsInVuaXQiLCJyZWxhdGl2ZUxvY2F0aW9uIiwiZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbiIsImhhc1N0YXRpY1BlcmNlbnRVbml0Iiwic2hvd01lYXN1cmUiLCJ2YWx1ZUZvcm1hdHRlcnMiLCJmb3JtYXRXaXRoUGVyY2VudGFnZSIsImNvbXBsZXhUeXBlIiwidW5pdEJpbmRpbmdFeHByZXNzaW9uIiwiY29uc3RyYWludE9wdGlvbnMiLCJhZGRUeXBlSW5mb3JtYXRpb24iLCJnZXRCaW5kaW5nRm9yRGF0ZVBpY2tlciIsIm1pbkRhdGUiLCIkRGF0ZSIsIm1heERhdGUiLCJtaW5FeHByZXNzaW9uIiwibWF4RXhwcmVzc2lvbiIsImdldEJpbmRpbmdGb3JVbml0T3JDdXJyZW5jeSIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJzaG93TnVtYmVyIiwiZ2V0QmluZGluZ1dpdGhUaW1lem9uZSIsImhpZGVUaW1lem9uZUZvckVtcHR5VmFsdWVzIiwiZmllbGRGb3JtYXRPcHRpb25zIiwidGltZXpvbmUiLCJUaW1lem9uZSIsInN0eWxlIiwiRGF0ZVRpbWVTdHlsZSIsInNob3dUaW1lem9uZUZvckVtcHR5VmFsdWVzIiwiZGF0ZVRpbWVTdHlsZSIsImRhdGVUaW1lUGF0dGVybiIsInBhdHRlcm4iLCJzaG93VGltZSIsInNob3dEYXRlIiwic2hvd1RpbWV6b25lIiwiZ2V0QmluZGluZ0ZvckRhdGVGb3JtYXQiLCJwcm9wZXJ0eURhdGFNb2RlbFBhdGgiLCJmb3JtYXRPcHRpb25zRGF0ZUZvcm1hdCIsInRvU3RyaW5nIiwiZ2V0QmluZGluZ0ZvclRpbWV6b25lIiwicHJvcGVydHlEZWZpbml0aW9uIiwiZ2V0QWxpZ25tZW50RXhwcmVzc2lvbiIsInNBbGlnbkRpc3BsYXkiLCJzQWxpZ25FZGl0IiwiZ2V0Q29udmVydGVyQ29udGV4dCIsIm9Db250ZXh0Iiwib0ludGVyZmFjZSIsImNvbnRleHQiLCJjb252ZXJ0TWV0YU1vZGVsQ29udGV4dCIsInJlcXVpcmVzSUNvbnRleHQiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNNdWx0aVZhbHVlRmllbGQiLCJvRGF0YU1vZGVsUGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiaGFzT25lVG9NYW55TmF2aWdhdGlvbiIsImZpbmRJbmRleCIsIm9OYXYiLCJpc011bHRpcGxlTmF2aWdhdGlvblByb3BlcnR5Iiwib0NvbnRleHROYXYiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb25Bc09iamVjdCIsImZvcmNlRWRpdE1vZGUiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJvUmVxdWlyZWRQcm9wZXJ0aWVzIiwiYVJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMiLCJyZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zIiwiYVJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMiLCJyZXF1aXJlZFByb3BlcnRpZXNGcm9tVXBkYXRlUmVzdHJpY3Rpb25zIiwiZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uIiwiaXNSZXF1aXJlZEV4cHJlc3Npb24iLCJyZXF1aXJlZFByb3BlcnR5RnJvbUluc2VydFJlc3RyaWN0aW9uc0V4cHJlc3Npb24iLCJyZXF1aXJlZFByb3BlcnR5RnJvbVVwZGF0ZVJlc3RyaWN0aW9uc0V4cHJlc3Npb24iLCJyZXF1aXJlZEV4cHJlc3Npb24iLCJlZGl0TW9kZSIsImluY2x1ZGVzIiwiSXNDcmVhdGVNb2RlIiwicmV0dXJuRXhwcmVzc2lvbiIsImdldFJlcXVpcmVkRXhwcmVzc2lvbkZvckNvbm5lY3RlZERhdGFGaWVsZCIsImRhdGFGaWVsZE9iamVjdFBhdGgiLCJkYXRhIiwiRGF0YSIsIk9iamVjdCIsImRhdGFGaWVsZHMiLCJpc1JlcXVpcmVkRXhwcmVzc2lvbnMiLCJkYXRhRmllbGQiLCJWYWx1ZSIsIlRhcmdldCIsImlzQW5ub3RhdGlvbk9mVHlwZSIsImlzVmlzaWJsZSIsIkhpZGRlbiIsImlzTXVsdGlMaW5lIiwiaXNNdWx0aUxpbmVUZXh0IiwiZ2V0QWN0aW9uRW5hYmxlZEV4cHJlc3Npb24iLCJhY3Rpb25UYXJnZXQiLCJwYXRoRnJvbUNvbnRleHRMb2NhdGlvbiIsIm9wZXJhdGlvbkF2YWlsYWJsZUlzQW5ub3RhdGVkIiwiQ29yZSIsIk9wZXJhdGlvbkF2YWlsYWJsZSIsInRlcm0iLCJwcmVmaXgiLCJzb3VyY2VFbnRpdHlUeXBlIiwibmF2aWdhdGlvbnMiLCJzb3VyY2VBY3Rpb25EYXRhTW9kZWxPYmplY3QiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsIm5hdiIsImpvaW4iLCJiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUiLCJpc0JvdW5kIiwicGFyYW1ldGVycyIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsIm9wZXJhdGlvbkF2YWlsYWJsZUV4cHJlc3Npb24iLCJiaW5kaW5nQ29udGV4dFBhdGhWaXNpdG9yIiwiaXNRdWlja1ZpZXdGYWNldFZpc2libGUiLCJmYWNldE1vZGVsUGF0aCIsInRhcmdldFZpc2libGUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlVJRm9ybWF0dGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFjdGlvbiwgQWN0aW9uUGFyYW1ldGVyLCBDb252ZXJ0ZWRNZXRhZGF0YSwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uLCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBBbm5vdGF0aW9uUGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9FZG1cIjtcbmltcG9ydCB7IENvcmVBbm5vdGF0aW9uVGVybXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvcmVcIjtcbmltcG9ydCB0eXBlIHsgVW5pdCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvTWVhc3VyZXNcIjtcbmltcG9ydCB0eXBlIHtcblx0Q29sbGVjdGlvbkZhY2V0LFxuXHRDb25uZWN0ZWRGaWVsZHNUeXBlLFxuXHREYXRhRmllbGQsXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvblR5cGVzLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50VHlwZSxcblx0RGF0YVBvaW50VHlwZVR5cGVzLFxuXHRGaWVsZEdyb3VwLFxuXHRSZWZlcmVuY2VGYWNldFxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHtcblx0QmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbixcblx0Q29tcGxleFR5cGVDb25zdHJhaW50T3B0aW9ucyxcblx0Rm5cbn0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRFRE1fVFlQRV9NQVBQSU5HLFxuXHRhZGRUeXBlSW5mb3JtYXRpb24sXG5cdGFuZCxcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0Zm9ybWF0UmVzdWx0LFxuXHRmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uLFxuXHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24sXG5cdGlmRWxzZSxcblx0aXNDb25zdGFudCxcblx0aXNUcnV0aHksXG5cdG5vdCxcblx0b3IsXG5cdHBhdGhJbk1vZGVsLFxuXHR1bnJlc29sdmFibGVFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgY29udmVydE1ldGFNb2RlbENvbnRleHQsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBQYWdlQ29udGV4dFBhdGhUYXJnZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHZhbHVlRm9ybWF0dGVycyBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9WYWx1ZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgVUksIGJpbmRpbmdDb250ZXh0UGF0aFZpc2l0b3IsIHNpbmdsZXRvblBhdGhWaXNpdG9yIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IHsgaXNBbm5vdGF0aW9uT2ZUeXBlLCBpc011bHRpcGxlTmF2aWdhdGlvblByb3BlcnR5LCBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiwgaXNQcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7XG5cdGVuaGFuY2VEYXRhTW9kZWxQYXRoLFxuXHRnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoLFxuXHRnZXRSZWxhdGl2ZVBhdGhzLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoLFxuXHRpc1BhdGhVcGRhdGFibGVcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0ICogYXMgRGlzcGxheU1vZGVGb3JtYXR0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGlzcGxheU1vZGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7XG5cdGlzRGlzYWJsZWRFeHByZXNzaW9uLFxuXHRpc05vbkVkaXRhYmxlRXhwcmVzc2lvbixcblx0aXNSZWFkT25seUV4cHJlc3Npb24sXG5cdGlzUmVxdWlyZWRFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0ZpZWxkQ29udHJvbEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGhhc1N0YXRpY1BlcmNlbnRVbml0LFxuXHRoYXNWYWx1ZUhlbHAsXG5cdGlzQ29tcHV0ZWQsXG5cdGlzSW1tdXRhYmxlLFxuXHRpc0tleSxcblx0aXNNdWx0aUxpbmVUZXh0XG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBGaWVsZEZvcm1hdE9wdGlvbnMgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRGb3JtYXRPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFQb2ludEZvcm1hdE9wdGlvbnMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC9oZWxwZXJzL0RhdGFQb2ludFRlbXBsYXRpbmdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5cbi8vIEltcG9ydC1leHBvcnQgbWV0aG9kIHVzZWQgYnkgdGhlIGNvbnZlcnRlciB0byB1c2UgdGhlbSBpbiB0aGUgdGVtcGxhdGluZyB0aHJvdWdoIHRoZSBVSUZvcm1hdHRlcnMuXG5leHBvcnQgdHlwZSBEaXNwbGF5TW9kZSA9IERpc3BsYXlNb2RlRm9ybWF0dGVyLkRpc3BsYXlNb2RlO1xuXG5leHBvcnQgdHlwZSBGaWVsZEVkaXRTdHlsZSA9IFwiUmFkaW9CdXR0b25zXCI7XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5T3JQYXRoPFA+ID0gc3RyaW5nIHwgUCB8IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPjtcbmV4cG9ydCB0eXBlIE1ldGFNb2RlbENvbnRleHQgPSB7XG5cdCRraW5kOiBzdHJpbmc7XG5cdCRUeXBlOiBzdHJpbmc7XG5cdCROdWxsYWJsZT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgdGhlIHN0cnVjdHVyZSByZXR1cm5lZCBieSB0aGUgT0RhdGFNZXRhTW9kZWwgd2hlbiB1c2luZyB0aGUgQEAgb3BlcmF0b3IgaW4gWE1MIHRlbXBsYXRlcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlID0ge1xuXHRjb250ZXh0OiBDb250ZXh0O1xuXHRhcmd1bWVudHM/OiB1bmtub3duW107XG5cdCQkdmFsdWVBc1Byb21pc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZUNvbnN0cmFpbnRzID0ge1xuXHRzY2FsZT86IG51bWJlcjtcblx0cHJlY2lzaW9uPzogbnVtYmVyO1xuXHRtYXhMZW5ndGg/OiBudW1iZXI7XG5cdG51bGxhYmxlPzogYm9vbGVhbjtcblx0bWluaW11bT86IHN0cmluZztcblx0bWF4aW11bT86IHN0cmluZztcblx0aXNEaWdpdFNlcXVlbmNlPzogYm9vbGVhbjtcblx0VjQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZWZvcm1hdE9wdGlvbnMgPSB7XG5cdHBhcnNlQXNTdHJpbmc/OiBib29sZWFuO1xuXHRlbXB0eVN0cmluZz86IHN0cmluZztcblx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIENvbmZpZ1R5cGUgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0Y29uc3RyYWludHM6IGNvbmZpZ1R5cGVDb25zdHJhaW50cztcblx0Zm9ybWF0T3B0aW9uczogY29uZmlnVHlwZWZvcm1hdE9wdGlvbnM7XG59O1xuXG5leHBvcnQgdHlwZSBEYXRlVGltZVN0eWxlID0gXCJzaG9ydFwiIHwgXCJtZWRpdW1cIiB8IFwibG9uZ1wiIHwgXCJmdWxsXCI7XG5cbmV4cG9ydCB0eXBlIEZvcm1hdE9wdGlvbnNEYXRlRm9ybWF0ID0gRmllbGRGb3JtYXRPcHRpb25zIHwgRGF0YVBvaW50Rm9ybWF0T3B0aW9ucztcblxuZXhwb3J0IGNvbnN0IEZpZWxkRWRpdE1vZGUgPSB7XG5cdC8qKlxuXHQgKiB7QGxpbmsgc2FwLnVpLm1kYy5GaWVsZCBGaWVsZH0sIHtAbGluayBzYXAudWkubWRjLkZpbHRlckZpZWxkIEZpbHRlckZpZWxkfSBvciB7QGxpbmsgc2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGQgTXVsdGlWYWx1ZUZpZWxkIH1cblx0ICogaXMgcmVuZGVyZWQgaW4gZGlzYWJsZWQgbW9kZVxuXHQgKi9cblx0RGlzYWJsZWQ6IFwiRGlzYWJsZWRcIixcblx0LyoqXG5cdCAqIHtAbGluayBzYXAudWkubWRjLkZpZWxkIEZpZWxkfSwge0BsaW5rIHNhcC51aS5tZGMuRmlsdGVyRmllbGQgRmlsdGVyRmllbGR9IG9yIHtAbGluayBzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZCBNdWx0aVZhbHVlRmllbGQgfVxuXHQgKiBpcyByZW5kZXJlZCBpbiBkaXNwbGF5IG1vZGVcblx0ICovXG5cdERpc3BsYXk6IFwiRGlzcGxheVwiLFxuXHQvKipcblx0ICoge0BsaW5rIHNhcC51aS5tZGMuRmllbGQgRmllbGR9LCB7QGxpbmsgc2FwLnVpLm1kYy5GaWx0ZXJGaWVsZCBGaWx0ZXJGaWVsZH0gb3Ige0BsaW5rIHNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkIE11bHRpVmFsdWVGaWVsZCB9XG5cdCAqIGlzIHJlbmRlcmVkIGluIGVkaXRhYmxlIG1vZGVcblx0ICovXG5cdEVkaXRhYmxlOiBcIkVkaXRhYmxlXCIsXG5cdC8qKlxuXHQgKiBJZiBtb3JlIHRoYW4gb25lIGNvbnRyb2wgaXMgcmVuZGVyZWQgYnkgdGhlIHtAbGluayBzYXAudWkubWRjLkZpZWxkIEZpZWxkfSwge0BsaW5rIHNhcC51aS5tZGMuRmlsdGVyRmllbGQgRmlsdGVyRmllbGQgfVxuXHQgKiBvciB7QGxpbmsgc2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGQgTXVsdGlWYWx1ZUZpZWxkfSBjb250cm9sLCB0aGUgZmlyc3QgcGFydCBpcyBlZGl0YWJsZSwgYW5kIHRoZSBvdGhlclxuXHQgKiBwYXJ0cyBhcmUgaW4gZGlzcGxheSBtb2RlLlxuXHQgKi9cblx0RWRpdGFibGVEaXNwbGF5OiBcIkVkaXRhYmxlRGlzcGxheVwiLFxuXHQvKipcblx0ICogSWYgbW9yZSB0aGFuIG9uZSBjb250cm9sIGlzIHJlbmRlcmVkIGJ5IHRoZSB7QGxpbmsgc2FwLnVpLm1kYy5GaWVsZCBGaWVsZH0sIHtAbGluayBzYXAudWkubWRjLkZpbHRlckZpZWxkIEZpbHRlckZpZWxkIH1cblx0ICogb3Ige0BsaW5rIHNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkIE11bHRpVmFsdWVGaWVsZH0gY29udHJvbCwgdGhlIGZpcnN0IHBhcnQgaXMgZWRpdGFibGUsIGFuZCB0aGUgb3RoZXJcblx0ICogcGFydHMgYXJlIHJlYWQtb25seS5cblx0ICovXG5cdEVkaXRhYmxlUmVhZE9ubHk6IFwiRWRpdGFibGVSZWFkT25seVwiLFxuXHQvKipcblx0ICoge0BsaW5rIHNhcC51aS5tZGMuRmllbGQgRmllbGR9LCB7QGxpbmsgc2FwLnVpLm1kYy5GaWx0ZXJGaWVsZCBGaWx0ZXJGaWVsZH0gb3Ige0BsaW5rIHNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkIE11bHRpVmFsdWVGaWVsZCB9XG5cdCAqIGlzIHJlbmRlcmVkIGluIHJlYWQtb25seSBtb2RlXG5cdCAqL1xuXHRSZWFkT25seTogXCJSZWFkT25seVwiXG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGlzcGxheU1vZGUgPSBmdW5jdGlvbiAoXG5cdG9EYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcz5cbik6IERpc3BsYXlNb2RlIHtcblx0cmV0dXJuIERpc3BsYXlNb2RlRm9ybWF0dGVyLmdldERpc3BsYXlNb2RlKG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCwgb0RhdGFNb2RlbE9iamVjdFBhdGgpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRFZGl0YWJsZUV4cHJlc3Npb25Bc09iamVjdCA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkOiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMgfCB1bmRlZmluZWQsXG5cdG9EYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPHVua25vd24+LFxuXHRpc0VkaXRhYmxlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBVSS5Jc0VkaXRhYmxlLFxuXHRjb25zaWRlclVwZGF0ZVJlc3RyaWN0aW9ucyA9IHRydWVcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBnZXRFZGl0YWJsZUV4cHJlc3Npb24oXG5cdFx0b1Byb3BlcnR5UGF0aCxcblx0XHRvRGF0YUZpZWxkQ29udmVydGVkLFxuXHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdHRydWUsXG5cdFx0aXNFZGl0YWJsZSxcblx0XHRjb25zaWRlclVwZGF0ZVJlc3RyaWN0aW9uc1xuXHQpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZWRpdGFibGVcIiBCb29sZWFuIHZhbHVlLlxuICogQHBhcmFtIG9Qcm9wZXJ0eVBhdGggVGhlIGlucHV0IHByb3BlcnR5XG4gKiBAcGFyYW0gb0RhdGFGaWVsZENvbnZlcnRlZCBUaGUgRGF0YUZpZWxkQ29udmVydGVkIG9iamVjdCB0byByZWFkIHRoZSBmaWVsZENvbnRyb2wgYW5ub3RhdGlvblxuICogQHBhcmFtIG9EYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBwYXRoIHRvIHRoaXMgcHJvcGVydHkgb2JqZWN0XG4gKiBAcGFyYW0gYkFzT2JqZWN0IFdoZXRoZXIgb3Igbm90IHRoaXMgc2hvdWxkIGJlIHJldHVybmVkIGFzIGFuIG9iamVjdCBvciBhIGJpbmRpbmcgc3RyaW5nXG4gKiBAcGFyYW0gaXNFZGl0YWJsZSBXaGV0aGVyIG9yIG5vdCBVSS5Jc0VkaXRhYmxlIGJlIGNvbnNpZGVyZWQuXG4gKiBAcGFyYW0gY29uc2lkZXJVcGRhdGVSZXN0cmljdGlvbnMgV2hldGhlciB3ZSB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IFVwZGF0ZVJlc3RyaWN0aW9ucyB0byBjb21wdXRlIHRoZSBlZGl0YWJsZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB1c2VkIHRvIGRldGVybWluZSBpZiBhIHByb3BlcnR5IGlzIGVkaXRhYmxlIG9yIG5vdFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdGFibGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ6IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcblx0b0RhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj4sXG5cdGJBc09iamVjdCA9IGZhbHNlLFxuXHRpc0VkaXRhYmxlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBVSS5Jc0VkaXRhYmxlLFxuXHRjb25zaWRlclVwZGF0ZVJlc3RyaWN0aW9ucyA9IHRydWVcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgcmVsYXRpdmVQYXRoID0gZ2V0UmVsYXRpdmVQYXRocyhvRGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihmYWxzZSk7XG5cdH1cblx0bGV0IGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQodHJ1ZSk7XG5cdGlmIChvRGF0YUZpZWxkQ29udmVydGVkICE9PSB1bmRlZmluZWQgJiYgIWlzUHJvcGVydHkob0RhdGFGaWVsZENvbnZlcnRlZCkpIHtcblx0XHRkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24gPSBpZkVsc2UoaXNOb25FZGl0YWJsZUV4cHJlc3Npb24ob0RhdGFGaWVsZENvbnZlcnRlZCksIGZhbHNlLCBpc0VkaXRhYmxlKTtcblx0fSBlbHNlIGlmIChvRGF0YUZpZWxkQ29udmVydGVkICE9PSB1bmRlZmluZWQpIHtcblx0XHRkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24gPSBpc0VkaXRhYmxlO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5ID0gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgPyBvUHJvcGVydHlQYXRoLiR0YXJnZXQgOiBvUHJvcGVydHlQYXRoO1xuXG5cdC8vIEVkaXRhYmlsaXR5IGRlcGVuZHMgb24gdGhlIGZpZWxkIGNvbnRyb2wgZXhwcmVzc2lvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBzdGF0aWNhbGx5IGluIFJlYWRPbmx5IG9yIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpIC0+IG5vdCBlZGl0YWJsZVxuXHQvLyBJZiB0aGUgcHJvcGVydHkgaXMgYSBrZXkgLT4gbm90IGVkaXRhYmxlIGV4Y2VwdCBpbiBjcmVhdGlvbiBpZiBub3QgY29tcHV0ZWRcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIGNvbXB1dGVkIC0+IG5vdCBlZGl0YWJsZVxuXHQvLyBJZiB0aGUgcHJvcGVydHkgaXMgbm90IHVwZGF0YWJsZSAtPiBub3QgZWRpdGFibGVcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIGltbXV0YWJsZSAtPiBub3QgZWRpdGFibGUgZXhjZXB0IGluIGNyZWF0aW9uXG5cdC8vIElmIHRoZSBGaWVsZCBjb250cm9sIGlzIGEgcGF0aCByZXNvbHZpbmcgdG8gUmVhZE9ubHkgb3IgSW5hcHBsaWNhYmxlIChkaXNhYmxlZCkgKDw9IDEpIC0+IG5vdCBlZGl0YWJsZVxuXHQvLyBFbHNlLCB0byBiZSBlZGl0YWJsZSB5b3UgbmVlZFxuXHQvLyBpbW11dGFibGUgYW5kIGtleSB3aGlsZSBpbiB0aGUgY3JlYXRpb24gcm93XG5cdC8vIHVpL2lzRWRpdGFibGVcblx0Y29uc3QgaXNQYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiA9IGlzUGF0aFVwZGF0YWJsZShvRGF0YU1vZGVsT2JqZWN0UGF0aCwge1xuXHRcdHByb3BlcnR5UGF0aDogb1Byb3BlcnR5UGF0aCxcblx0XHRwYXRoVmlzaXRvcjogKHBhdGg6IHN0cmluZywgbmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSkgPT5cblx0XHRcdHNpbmdsZXRvblBhdGhWaXNpdG9yKHBhdGgsIG9EYXRhTW9kZWxPYmplY3RQYXRoLmNvbnZlcnRlZFR5cGVzLCBuYXZpZ2F0aW9uUGF0aHMpXG5cdH0pO1xuXHRpZiAoY29tcGlsZUV4cHJlc3Npb24oaXNQYXRoVXBkYXRhYmxlRXhwcmVzc2lvbikgPT09IFwiZmFsc2VcIiAmJiBjb25zaWRlclVwZGF0ZVJlc3RyaWN0aW9ucykge1xuXHRcdHJldHVybiBiQXNPYmplY3QgPyBpc1BhdGhVcGRhdGFibGVFeHByZXNzaW9uIDogXCJmYWxzZVwiO1xuXHR9XG5cdGNvbnN0IGVkaXRhYmxlRXhwcmVzc2lvbiA9XG5cdFx0b1Byb3BlcnR5ICE9PSB1bmRlZmluZWRcblx0XHRcdD8gaWZFbHNlKFxuXHRcdFx0XHRcdG9yKFxuXHRcdFx0XHRcdFx0YW5kKG5vdChpc1BhdGhVcGRhdGFibGVFeHByZXNzaW9uKSwgY29uc2lkZXJVcGRhdGVSZXN0cmljdGlvbnMpLFxuXHRcdFx0XHRcdFx0aXNDb21wdXRlZChvUHJvcGVydHkpLFxuXHRcdFx0XHRcdFx0aXNLZXkob1Byb3BlcnR5KSxcblx0XHRcdFx0XHRcdGlzSW1tdXRhYmxlKG9Qcm9wZXJ0eSksXG5cdFx0XHRcdFx0XHRpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvUHJvcGVydHksIHJlbGF0aXZlUGF0aClcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGlmRWxzZShvcihpc0NvbXB1dGVkKG9Qcm9wZXJ0eSksIGlzTm9uRWRpdGFibGVFeHByZXNzaW9uKG9Qcm9wZXJ0eSwgcmVsYXRpdmVQYXRoKSksIGZhbHNlLCBVSS5Jc1RyYW5zaWVudEJpbmRpbmcpLFxuXHRcdFx0XHRcdGlzRWRpdGFibGVcblx0XHRcdCAgKVxuXHRcdFx0OiB1bnJlc29sdmFibGVFeHByZXNzaW9uO1xuXHRpZiAoYkFzT2JqZWN0KSB7XG5cdFx0cmV0dXJuIGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbik7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbikpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbGxhYm9yYXRpb25FeHByZXNzaW9uID0gZnVuY3Rpb24gPFQ+KFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0Zm9ybWF0dGVyOiBGbjxUPlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+IHtcblx0Y29uc3Qgb2JqZWN0UGF0aCA9IGdldFRhcmdldE9iamVjdFBhdGgoZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdGNvbnN0IGFjdGl2aXR5RXhwcmVzc2lvbiA9IHBhdGhJbk1vZGVsKGAvY29sbGFib3JhdGlvbi9hY3Rpdml0aWVzJHtvYmplY3RQYXRofWAsIFwiaW50ZXJuYWxcIik7XG5cdGNvbnN0IGtleXMgPSBkYXRhTW9kZWxPYmplY3RQYXRoPy5jb250ZXh0TG9jYXRpb24/LnRhcmdldEVudGl0eVR5cGU/LmtleXM7XG5cdGNvbnN0IGtleXNFeHByZXNzaW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHVua25vd24+W10gPSBbXTtcblx0a2V5cz8uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0Y29uc3Qga2V5RXhwcmVzc2lvbiA9IHBhdGhJbk1vZGVsKGtleS5uYW1lKTtcblx0XHRrZXlzRXhwcmVzc2lvbnMucHVzaChrZXlFeHByZXNzaW9uKTtcblx0fSk7XG5cdHJldHVybiBmb3JtYXRSZXN1bHQoW2FjdGl2aXR5RXhwcmVzc2lvbiwgLi4ua2V5c0V4cHJlc3Npb25zXSwgZm9ybWF0dGVyKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RW5hYmxlZEV4cHJlc3Npb25Bc09iamVjdCA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkPzogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzLFxuXHRvRGF0YU1vZGVsT2JqZWN0UGF0aD86IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBnZXRFbmFibGVkRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlLCBvRGF0YU1vZGVsT2JqZWN0UGF0aCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xufTtcbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZW5hYmxlZFwiIEJvb2xlYW4gdmFsdWUuXG4gKiBAcGFyYW0gb1Byb3BlcnR5UGF0aCBUaGUgaW5wdXQgcHJvcGVydHlcbiAqIEBwYXJhbSBvRGF0YUZpZWxkQ29udmVydGVkIFRoZSBEYXRhRmllbGRDb252ZXJ0ZWQgT2JqZWN0IHRvIHJlYWQgdGhlIGZpZWxkQ29udHJvbCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gYkFzT2JqZWN0IFdoZXRoZXIgb3Igbm90IHRoaXMgc2hvdWxkIGJlIHJldHVybmVkIGFzIGFuIG9iamVjdCBvciBhIGJpbmRpbmcgc3RyaW5nXG4gKiBAcGFyYW0gb0RhdGFNb2RlbE9iamVjdFBhdGhcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gZGV0ZXJtaW5lIGlmIGEgcHJvcGVydHkgaXMgZW5hYmxlZCBvciBub3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVuYWJsZWRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMsXG5cdGJBc09iamVjdCA9IGZhbHNlLFxuXHRvRGF0YU1vZGVsT2JqZWN0UGF0aD86IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj5cbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0aWYgKCFvUHJvcGVydHlQYXRoIHx8IHR5cGVvZiBvUHJvcGVydHlQYXRoID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKHRydWUpO1xuXHR9XG5cdGxldCByZWxhdGl2ZVBhdGg7XG5cdGlmIChvRGF0YU1vZGVsT2JqZWN0UGF0aCkge1xuXHRcdHJlbGF0aXZlUGF0aCA9IGdldFJlbGF0aXZlUGF0aHMob0RhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHR9XG5cdGxldCBkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQodHJ1ZSk7XG5cdGlmIChvRGF0YUZpZWxkQ29udmVydGVkICE9PSB1bmRlZmluZWQgJiYgIWlzUHJvcGVydHkob0RhdGFGaWVsZENvbnZlcnRlZCkpIHtcblx0XHRkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbiA9IGlmRWxzZShpc0Rpc2FibGVkRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSwgZmFsc2UsIHRydWUpO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5ID0gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgPyBvUHJvcGVydHlQYXRoLiR0YXJnZXQgOiBvUHJvcGVydHlQYXRoO1xuXHQvLyBFbmFibGVtZW50IGRlcGVuZHMgb24gdGhlIGZpZWxkIGNvbnRyb2wgZXhwcmVzc2lvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBzdGF0aWNhbGx5IGluIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpIC0+IG5vdCBlbmFibGVkXG5cdGNvbnN0IGVuYWJsZWRFeHByZXNzaW9uID1cblx0XHRvUHJvcGVydHkgIT09IHVuZGVmaW5lZCA/IGlmRWxzZShpc0Rpc2FibGVkRXhwcmVzc2lvbihvUHJvcGVydHksIHJlbGF0aXZlUGF0aCksIGZhbHNlLCB0cnVlKSA6IHVucmVzb2x2YWJsZUV4cHJlc3Npb247XG5cdGlmIChiQXNPYmplY3QpIHtcblx0XHRyZXR1cm4gYW5kKGVuYWJsZWRFeHByZXNzaW9uLCBkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbik7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGFuZChlbmFibGVkRXhwcmVzc2lvbiwgZGF0YUZpZWxkRW5hYmxlZEV4cHJlc3Npb24pKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZWRpdE1vZGVcIiBlbnVtIHZhbHVlLlxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgaW5wdXQgcHJvcGVydHlcbiAqIEBwYXJhbSBkYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBsaXN0IG9mIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IGFyZSBpbnZvbHZlZCB0byByZWFjaCB0aGF0IHByb3BlcnR5XG4gKiBAcGFyYW0gbWVhc3VyZVJlYWRPbmx5IFdoZXRoZXIgd2Ugc2hvdWxkIHNldCBVb00gLyBjdXJyZW5jeSBmaWVsZCBtb2RlIHRvIHJlYWQgb25seVxuICogQHBhcmFtIGFzT2JqZWN0IFdoZXRoZXIgd2Ugc2hvdWxkIHJldHVybiB0aGlzIGFzIGFuIGV4cHJlc3Npb24gb3IgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSBkYXRhRmllbGRDb252ZXJ0ZWQgVGhlIGRhdGFGaWVsZCBvYmplY3RcbiAqIEBwYXJhbSBpc0VkaXRhYmxlIFdoZXRoZXIgb3Igbm90IFVJLklzRWRpdGFibGUgYmUgY29uc2lkZXJlZC5cbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHByb3BlcnR5IGVkaXQgbW9kZSwgY29tcGxpYW50IHdpdGggdGhlIE1EQyBGaWVsZCBkZWZpbml0aW9uIG9mIGVkaXRNb2RlLlxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdE1vZGUgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPHVua25vd24+LFxuXHRtZWFzdXJlUmVhZE9ubHkgPSBmYWxzZSxcblx0YXNPYmplY3QgPSBmYWxzZSxcblx0ZGF0YUZpZWxkQ29udmVydGVkOiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG5cdGlzRWRpdGFibGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IFVJLklzRWRpdGFibGVcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRpZiAoXG5cdFx0IXByb3BlcnR5UGF0aCB8fFxuXHRcdHR5cGVvZiBwcm9wZXJ0eVBhdGggPT09IFwic3RyaW5nXCIgfHxcblx0XHQoIWlzUHJvcGVydHkoZGF0YUZpZWxkQ29udmVydGVkKSAmJiBkYXRhRmllbGRDb252ZXJ0ZWQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGgpXG5cdCkge1xuXHRcdHJldHVybiBGaWVsZEVkaXRNb2RlLkRpc3BsYXk7XG5cdH1cblx0Y29uc3QgcHJvcGVydHkgPSBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eVBhdGgpID8gcHJvcGVydHlQYXRoLiR0YXJnZXQgOiBwcm9wZXJ0eVBhdGg7XG5cdGlmICghaXNQcm9wZXJ0eShwcm9wZXJ0eSkpIHtcblx0XHRyZXR1cm4gRmllbGRFZGl0TW9kZS5EaXNwbGF5O1xuXHR9XG5cdGNvbnN0IHJlbGF0aXZlUGF0aCA9IGdldFJlbGF0aXZlUGF0aHMoZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdGNvbnN0IGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24gPSBpc1BhdGhVcGRhdGFibGUoZGF0YU1vZGVsT2JqZWN0UGF0aCwge1xuXHRcdHByb3BlcnR5UGF0aDogcHJvcGVydHksXG5cdFx0cGF0aFZpc2l0b3I6IChwYXRoOiBzdHJpbmcsIG5hdmlnYXRpb25QYXRoczogc3RyaW5nW10pID0+XG5cdFx0XHRzaW5nbGV0b25QYXRoVmlzaXRvcihwYXRoLCBkYXRhTW9kZWxPYmplY3RQYXRoLmNvbnZlcnRlZFR5cGVzLCBuYXZpZ2F0aW9uUGF0aHMpXG5cdH0pO1xuXG5cdC8vIHdlIGdldCB0aGUgZWRpdGFibGUgRXhwcmVzc2lvbiB3aXRob3V0IGNvbnNpZGVyaW5nIHVwZGF0ZSBSZXN0cmljdGlvbnMgYmVjYXVzZSB0aGV5IGFyZSBoYW5kbGVkIHNlcGFyYXRlbHlcblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID0gZ2V0RWRpdGFibGVFeHByZXNzaW9uQXNPYmplY3QocHJvcGVydHlQYXRoLCBkYXRhRmllbGRDb252ZXJ0ZWQsIGRhdGFNb2RlbE9iamVjdFBhdGgsIGlzRWRpdGFibGUsIGZhbHNlKTtcblxuXHRjb25zdCBlbmFibGVkRXhwcmVzc2lvbiA9IGdldEVuYWJsZWRFeHByZXNzaW9uQXNPYmplY3QocHJvcGVydHlQYXRoLCBkYXRhRmllbGRDb252ZXJ0ZWQsIGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRjb25zdCBhc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KHByb3BlcnR5KTtcblx0Y29uc3QgdW5pdFByb3BlcnR5ID0gYXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdGxldCByZXN1bHRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiA9IGNvbnN0YW50KEZpZWxkRWRpdE1vZGUuRWRpdGFibGUpO1xuXHRpZiAodW5pdFByb3BlcnR5KSB7XG5cdFx0Y29uc3QgaXNVbml0UmVhZE9ubHkgPSBpc1JlYWRPbmx5RXhwcmVzc2lvbih1bml0UHJvcGVydHksIHJlbGF0aXZlUGF0aCk7XG5cdFx0cmVzdWx0RXhwcmVzc2lvbiA9IGlmRWxzZShcblx0XHRcdG9yKGlzVW5pdFJlYWRPbmx5LCBpc0NvbXB1dGVkKHVuaXRQcm9wZXJ0eSksIGFuZChpc0ltbXV0YWJsZSh1bml0UHJvcGVydHkpLCBub3QoVUkuSXNUcmFuc2llbnRCaW5kaW5nKSksIG1lYXN1cmVSZWFkT25seSksXG5cdFx0XHRpZkVsc2UoIWlzQ29uc3RhbnQoaXNVbml0UmVhZE9ubHkpICYmIGlzVW5pdFJlYWRPbmx5LCBGaWVsZEVkaXRNb2RlLkVkaXRhYmxlUmVhZE9ubHksIEZpZWxkRWRpdE1vZGUuRWRpdGFibGVEaXNwbGF5KSxcblx0XHRcdEZpZWxkRWRpdE1vZGUuRWRpdGFibGVcblx0XHQpO1xuXHR9XG5cdGlmICghdW5pdFByb3BlcnR5ICYmIChwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSB8fCBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0KSkge1xuXHRcdC8vIG5vIHVuaXQgcHJvcGVydHkgYXNzb2NpYXRlZCBtZWFucyB0aGlzIGlzIGEgc3RhdGljIHVuaXRcblx0XHRyZXN1bHRFeHByZXNzaW9uID0gY29uc3RhbnQoRmllbGRFZGl0TW9kZS5FZGl0YWJsZURpc3BsYXkpO1xuXHR9XG5cdGxldCByZWFkT25seUV4cHJlc3Npb247XG5cdGlmIChkYXRhRmllbGRDb252ZXJ0ZWQgIT0gdW5kZWZpbmVkICYmICFpc1Byb3BlcnR5KGRhdGFGaWVsZENvbnZlcnRlZCkpIHtcblx0XHRyZWFkT25seUV4cHJlc3Npb24gPSBvcihpc1JlYWRPbmx5RXhwcmVzc2lvbihwcm9wZXJ0eSwgcmVsYXRpdmVQYXRoKSwgaXNSZWFkT25seUV4cHJlc3Npb24oZGF0YUZpZWxkQ29udmVydGVkKSk7XG5cdH0gZWxzZSB7XG5cdFx0cmVhZE9ubHlFeHByZXNzaW9uID0gaXNSZWFkT25seUV4cHJlc3Npb24ocHJvcGVydHksIHJlbGF0aXZlUGF0aCk7XG5cdH1cblxuXHQvLyBpZiB0aGVyZSBhcmUgdXBkYXRlIFJlc3RyaWN0aW9ucyBpdCBpcyBhbHdheXMgZGlzcGxheSBtb2RlXG5cdGNvbnN0IGVkaXRNb2RlRXhwcmVzc2lvbiA9IGlmRWxzZShcblx0XHRvcihpc1BhdGhVcGRhdGFibGVFeHByZXNzaW9uLCBVSS5Jc1RyYW5zaWVudEJpbmRpbmcpLFxuXHRcdGlmRWxzZShcblx0XHRcdGVuYWJsZWRFeHByZXNzaW9uLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRlZGl0YWJsZUV4cHJlc3Npb24sXG5cdFx0XHRcdHJlc3VsdEV4cHJlc3Npb24sXG5cdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRhbmQoIWlzQ29uc3RhbnQocmVhZE9ubHlFeHByZXNzaW9uKSAmJiByZWFkT25seUV4cHJlc3Npb24sIGlzRWRpdGFibGUpLFxuXHRcdFx0XHRcdEZpZWxkRWRpdE1vZGUuUmVhZE9ubHksXG5cdFx0XHRcdFx0RmllbGRFZGl0TW9kZS5EaXNwbGF5XG5cdFx0XHRcdClcblx0XHRcdCksXG5cdFx0XHRpZkVsc2UoaXNFZGl0YWJsZSwgRmllbGRFZGl0TW9kZS5EaXNhYmxlZCwgRmllbGRFZGl0TW9kZS5EaXNwbGF5KVxuXHRcdCksXG5cdFx0RmllbGRFZGl0TW9kZS5EaXNwbGF5XG5cdCk7XG5cdGlmIChhc09iamVjdCkge1xuXHRcdHJldHVybiBlZGl0TW9kZUV4cHJlc3Npb247XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGVkaXRNb2RlRXhwcmVzc2lvbik7XG59O1xuXG5leHBvcnQgY29uc3QgaGFzVmFsaWRBbmFseXRpY2FsQ3VycmVuY3lPclVuaXQgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+IHwgdW5kZWZpbmVkXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eURlZmluaXRpb24gPSBvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRPYmplY3Q7XG5cdHJldHVybiBvUHJvcGVydHlEZWZpbml0aW9uICYmIGdldEV4cHJlc3Npb25Gb3JNZWFzdXJlVW5pdChvUHJvcGVydHlEZWZpbml0aW9uKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yTWVhc3VyZVVuaXQgPSBmdW5jdGlvbiAob1Byb3BlcnR5RGVmaW5pdGlvbjogUHJvcGVydHkpOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IGN1cnJlbmN5ID0gb1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeTtcblx0Y29uc3QgbWVhc3VyZSA9IGN1cnJlbmN5ID8gY3VycmVuY3kgOiBvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdGlmIChtZWFzdXJlKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKG9yKGlzVHJ1dGh5KGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihtZWFzdXJlKSksIG5vdChVSS5Jc1RvdGFsKSkpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihjb25zdGFudCh0cnVlKSk7XG5cdH1cbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBmaWVsZERpc3BsYXkuXG4gKiBAcGFyYW0gb1Byb3BlcnR5UGF0aFxuICogQHBhcmFtIHNUYXJnZXREaXNwbGF5TW9kZVxuICogQHBhcmFtIG9Db21wdXRlZEVkaXRNb2RlXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBwcm9wZXJ0eSBkaXNwbGF5IG1vZGUsIGNvbXBsaWFudCB3aXRoIHRoZSBNREMgRmllbGQgZGVmaW5pdGlvbiBvZiBkaXNwbGF5TW9kZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZpZWxkRGlzcGxheSA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRzVGFyZ2V0RGlzcGxheU1vZGU6IHN0cmluZyxcblx0b0NvbXB1dGVkRWRpdE1vZGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+XG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eSA9IChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblx0Y29uc3QgaGFzVGV4dEFubm90YXRpb24gPSBvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCAhPT0gdW5kZWZpbmVkO1xuXG5cdGlmIChoYXNWYWx1ZUhlbHAob1Byb3BlcnR5KSkge1xuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihzVGFyZ2V0RGlzcGxheU1vZGUpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBoYXNUZXh0QW5ub3RhdGlvbiA/IGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShlcXVhbChvQ29tcHV0ZWRFZGl0TW9kZSwgXCJFZGl0YWJsZVwiKSwgXCJWYWx1ZVwiLCBzVGFyZ2V0RGlzcGxheU1vZGUpKSA6IFwiVmFsdWVcIjtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGdldFR5cGVDb25maWcgPSBmdW5jdGlvbiAob1Byb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBDb25maWdUeXBlIHtcblx0Y29uc3Qgb1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWyhvUHJvcGVydHkgYXMgUHJvcGVydHkpPy50eXBlXSB8fCAoZGF0YVR5cGUgPyBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXSA6IHVuZGVmaW5lZCk7XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZzogQ29uZmlnVHlwZSA9IHtcblx0XHR0eXBlOiBvVGFyZ2V0TWFwcGluZy50eXBlLFxuXHRcdGNvbnN0cmFpbnRzOiB7fSxcblx0XHRmb3JtYXRPcHRpb25zOiB7fVxuXHR9O1xuXHRpZiAoaXNQcm9wZXJ0eShvUHJvcGVydHkpKSB7XG5cdFx0cHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzID0ge1xuXHRcdFx0c2NhbGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kU2NhbGUgPyBvUHJvcGVydHkuc2NhbGUgOiB1bmRlZmluZWQsXG5cdFx0XHRwcmVjaXNpb246IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kUHJlY2lzaW9uID8gb1Byb3BlcnR5LnByZWNpc2lvbiA6IHVuZGVmaW5lZCxcblx0XHRcdG1heExlbmd0aDogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRNYXhMZW5ndGggPyBvUHJvcGVydHkubWF4TGVuZ3RoIDogdW5kZWZpbmVkLFxuXHRcdFx0bnVsbGFibGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kTnVsbGFibGUgPyBvUHJvcGVydHkubnVsbGFibGUgOiB1bmRlZmluZWQsXG5cdFx0XHRtaW5pbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1pbmltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRtYXhpbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRpc0RpZ2l0U2VxdWVuY2U6XG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiICYmXG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGlnaXRTZXF1ZW5jZVwiXSAmJlxuXHRcdFx0XHRvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNEaWdpdFNlcXVlbmNlXG5cdFx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRWNDogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRWNCA/IHRydWUgOiB1bmRlZmluZWRcblx0XHR9O1xuXHR9XG5cdHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zID0ge1xuXHRcdHBhcnNlQXNTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IGZhbHNlXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdGVtcHR5U3RyaW5nOlxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHBhcnNlS2VlcHNFbXB0eVN0cmluZzogcHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgPyB0cnVlIDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBwcm9wZXJ0eVR5cGVDb25maWc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29uc3RyYWludE9wdGlvbnMgPSBmdW5jdGlvbiAocHJvcGVydHk6IFByb3BlcnR5IHwgdW5kZWZpbmVkKTogQ29tcGxleFR5cGVDb25zdHJhaW50T3B0aW9ucyB7XG5cdHJldHVybiBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LlVJPy5Eb05vdENoZWNrU2NhbGVPZk1lYXN1cmVkUXVhbnRpdHkgJiZcblx0XHRwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LlVJLkRvTm90Q2hlY2tTY2FsZU9mTWVhc3VyZWRRdWFudGl0eT8udmFsdWVPZigpXG5cdFx0PyB7IHNraXBEZWNpbWFsc1ZhbGlkYXRpb246IHRydWUgfVxuXHRcdDoge307XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QmluZGluZ1dpdGhVbml0T3JDdXJyZW5jeSA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5RGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRpZ25vcmVVbml0Q29uc3RyYWludD86IGJvb2xlYW4sXG5cdGZvcm1hdE9wdGlvbnM/OiB7XG5cdFx0c2hvd01lYXN1cmU/OiBib29sZWFuO1xuXHRcdGRlY2ltYWxQYWRkaW5nPzogbnVtYmVyO1xuXHRcdGVtcHR5U3RyaW5nPzogc3RyaW5nIHwgbnVtYmVyO1xuXHR9LFxuXHRmb3JEaXNwbGF5TW9kZT86IGJvb2xlYW4sXG5cdHNob3dPbmx5VW5pdERlY2ltYWxzPzogYm9vbGVhblxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdGxldCB1bml0ID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdGNvbnN0IHJlbGF0aXZlTG9jYXRpb24gPSBnZXRSZWxhdGl2ZVBhdGhzKG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgpO1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihvUHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uKTtcblx0aWYgKGhhc1N0YXRpY1BlcmNlbnRVbml0KG9Qcm9wZXJ0eURlZmluaXRpb24pKSB7XG5cdFx0aWYgKGZvcm1hdE9wdGlvbnM/LnNob3dNZWFzdXJlID09PSBmYWxzZSkge1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb247XG5cdFx0fVxuXHRcdHJldHVybiBmb3JtYXRSZXN1bHQoW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb25dLCB2YWx1ZUZvcm1hdHRlcnMuZm9ybWF0V2l0aFBlcmNlbnRhZ2UpO1xuXHR9XG5cdGNvbnN0IGNvbXBsZXhUeXBlID0gdW5pdCA/IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdFwiIDogXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5DdXJyZW5jeVwiO1xuXHR1bml0ID0gdW5pdCA/IHVuaXQgOiAob1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IGFzIHVua25vd24gYXMgVW5pdCB8IHVuZGVmaW5lZCk7XG5cdGNvbnN0IHVuaXRCaW5kaW5nRXhwcmVzc2lvbiA9XG5cdFx0aXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odW5pdCkgJiYgdW5pdC4kdGFyZ2V0XG5cdFx0XHQ/IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24odW5pdC4kdGFyZ2V0LCBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odW5pdCwgcmVsYXRpdmVMb2NhdGlvbiksIGlnbm9yZVVuaXRDb25zdHJhaW50KVxuXHRcdFx0OiBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odW5pdCwgcmVsYXRpdmVMb2NhdGlvbik7XG5cdGxldCBjb25zdHJhaW50T3B0aW9uczogQ29tcGxleFR5cGVDb25zdHJhaW50T3B0aW9ucyB8IHVuZGVmaW5lZDtcblx0aWYgKGNvbXBsZXhUeXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlVuaXRcIikge1xuXHRcdGlmIChmb3JEaXNwbGF5TW9kZSAmJiAhc2hvd09ubHlVbml0RGVjaW1hbHMpIHtcblx0XHRcdGNvbnN0cmFpbnRPcHRpb25zID0geyBza2lwRGVjaW1hbHNWYWxpZGF0aW9uOiB0cnVlIH07XG5cdFx0fSBlbHNlIGlmICghZm9yRGlzcGxheU1vZGUpIHtcblx0XHRcdC8vIENvbnNpZGVyIGFubm90YXRpb24gb25seSBpbiBlZGl0IG1vZGVcblx0XHRcdGNvbnN0cmFpbnRPcHRpb25zID0gZ2V0Q29uc3RyYWludE9wdGlvbnMob1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QpO1xuXHRcdH1cblx0fVxuXHRpZiAoZm9yRGlzcGxheU1vZGUpIHtcblx0XHRmb3JtYXRPcHRpb25zID0geyAuLi5mb3JtYXRPcHRpb25zLCBlbXB0eVN0cmluZzogXCJcIiB9O1xuXHR9XG5cblx0cmV0dXJuIGFkZFR5cGVJbmZvcm1hdGlvbihbcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiwgdW5pdEJpbmRpbmdFeHByZXNzaW9uXSwgY29tcGxleFR5cGUsIHVuZGVmaW5lZCwgZm9ybWF0T3B0aW9ucywgY29uc3RyYWludE9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIGRhdGUgcGlja2VyIHdpdGggbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSBwcmVzZW50LlxuICogQHBhcmFtIG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGggVGhlIGxpc3Qgb2YgZGF0YSBtb2RlbCBvYmplY3RzIHRoYXQgYXJlIGludm9sdmVkIHRvIHJlYWNoIHRoYXQgcHJvcGVydHlcbiAqIEBwYXJhbSBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uIEJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgZGF0ZSBwcm9wZXJ0eSB3aXRoIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUgZm9yIHRoZSBzYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nRm9yRGF0ZVBpY2tlciA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5RGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eSB8IERhdGFGaWVsZFR5cGVzPixcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+IHwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdGNvbnN0IHJlbGF0aXZlTG9jYXRpb24gPSBnZXRSZWxhdGl2ZVBhdGhzKG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgpO1xuXHRjb25zdCBmb3JtYXRPcHRpb25zID0ge307XG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gPSBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKG9Qcm9wZXJ0eURlZmluaXRpb24sIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24pO1xuXHRjb25zdCBjb21wbGV4VHlwZSA9IFwic2FwLmZlLmNvcmUudHlwZS5EYXRlXCI7XG5cdGNvbnN0IG1pbkRhdGUgPSBvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bT8uJERhdGVcblx0XHQ/IG9Qcm9wZXJ0eURlZmluaXRpb24/LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtPy4kRGF0ZVxuXHRcdDogb1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW07XG5cdGNvbnN0IG1heERhdGUgPSBvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bT8uJERhdGVcblx0XHQ/IG9Qcm9wZXJ0eURlZmluaXRpb24/LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtPy4kRGF0ZVxuXHRcdDogb1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW07XG5cdGNvbnN0IG1pbkV4cHJlc3Npb24gPVxuXHRcdG1pbkRhdGUgJiYgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24obWluRGF0ZSlcblx0XHRcdD8gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bSxcblx0XHRcdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW0sIHJlbGF0aXZlTG9jYXRpb24pXG5cdFx0XHQgIClcblx0XHRcdDogbWluRGF0ZTtcblx0Y29uc3QgbWF4RXhwcmVzc2lvbiA9XG5cdFx0bWF4RGF0ZSAmJiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihtYXhEYXRlKVxuXHRcdFx0PyBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eURlZmluaXRpb24/LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtLFxuXHRcdFx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bSwgcmVsYXRpdmVMb2NhdGlvbilcblx0XHRcdCAgKVxuXHRcdFx0OiBtYXhEYXRlO1xuXG5cdHJldHVybiAoXG5cdFx0KG1pbkV4cHJlc3Npb24gfHwgbWF4RXhwcmVzc2lvbikgJiZcblx0XHRhZGRUeXBlSW5mb3JtYXRpb24oW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIG1pbkV4cHJlc3Npb24sIG1heEV4cHJlc3Npb25dLCBjb21wbGV4VHlwZSwgdW5kZWZpbmVkLCBmb3JtYXRPcHRpb25zKVxuXHQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdGb3JVbml0T3JDdXJyZW5jeSA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5RGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4gfCB1bmRlZmluZWQsXG5cdGZvckRpc3BsYXlNb2RlOiBib29sZWFuLFxuXHRzaG93T25seVVuaXREZWNpbWFsczogYm9vbGVhblxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4gfCBzdHJpbmcge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsUGF0aD8udGFyZ2V0T2JqZWN0O1xuXHRpZiAoIW9Qcm9wZXJ0eURlZmluaXRpb24pIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdGxldCB1bml0ID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdGlmIChoYXNTdGF0aWNQZXJjZW50VW5pdChvUHJvcGVydHlEZWZpbml0aW9uKSkge1xuXHRcdHJldHVybiBjb25zdGFudChcIiVcIik7XG5cdH1cblx0Y29uc3QgcmVsYXRpdmVMb2NhdGlvbiA9IGdldFJlbGF0aXZlUGF0aHMob1Byb3BlcnR5RGF0YU1vZGVsUGF0aCk7XG5cblx0Y29uc3QgY29tcGxleFR5cGUgPSB1bml0ID8gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Vbml0XCIgOiBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkN1cnJlbmN5XCI7XG5cdHVuaXQgPSB1bml0ID8gdW5pdCA6IChvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kgYXMgdW5rbm93biBhcyBVbml0IHwgdW5kZWZpbmVkKTtcblx0Y29uc3QgdW5pdEJpbmRpbmdFeHByZXNzaW9uID1cblx0XHRpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih1bml0KSAmJiB1bml0LiR0YXJnZXRcblx0XHRcdD8gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbih1bml0LiR0YXJnZXQsIGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih1bml0LCByZWxhdGl2ZUxvY2F0aW9uKSlcblx0XHRcdDogZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHVuaXQsIHJlbGF0aXZlTG9jYXRpb24pO1xuXG5cdGxldCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gcGF0aEluTW9kZWwoXG5cdFx0Z2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChvUHJvcGVydHlEYXRhTW9kZWxQYXRoKVxuXHQpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihvUHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLCB0cnVlKTtcblx0bGV0IGNvbnN0cmFpbnRPcHRpb25zOiBDb21wbGV4VHlwZUNvbnN0cmFpbnRPcHRpb25zIHwgdW5kZWZpbmVkO1xuXHRpZiAoY29tcGxleFR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdFwiKSB7XG5cdFx0aWYgKGZvckRpc3BsYXlNb2RlICYmICFzaG93T25seVVuaXREZWNpbWFscykge1xuXHRcdFx0Y29uc3RyYWludE9wdGlvbnMgPSB7IHNraXBEZWNpbWFsc1ZhbGlkYXRpb246IHRydWUgfTtcblx0XHR9IGVsc2UgaWYgKCFmb3JEaXNwbGF5TW9kZSkge1xuXHRcdFx0Y29uc3RyYWludE9wdGlvbnMgPSBnZXRDb25zdHJhaW50T3B0aW9ucyhvUHJvcGVydHlEZWZpbml0aW9uKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFkZFR5cGVJbmZvcm1hdGlvbihcblx0XHRbcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiwgdW5pdEJpbmRpbmdFeHByZXNzaW9uXSxcblx0XHRjb21wbGV4VHlwZSxcblx0XHR1bmRlZmluZWQsXG5cdFx0e1xuXHRcdFx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nOiB0cnVlLFxuXHRcdFx0c2hvd051bWJlcjogZmFsc2Vcblx0XHR9LFxuXHRcdGNvbnN0cmFpbnRPcHRpb25zXG5cdCk7XG59O1xuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdXaXRoVGltZXpvbmUgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPixcblx0aWdub3JlVW5pdENvbnN0cmFpbnQgPSBmYWxzZSxcblx0aGlkZVRpbWV6b25lRm9yRW1wdHlWYWx1ZXMgPSBmYWxzZSxcblx0ZmllbGRGb3JtYXRPcHRpb25zPzogRmllbGRGb3JtYXRPcHRpb25zXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eURlZmluaXRpb24gPSBvUHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eTtcblx0Y29uc3QgdGltZXpvbmUgPSBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5Db21tb24/LlRpbWV6b25lO1xuXHRjb25zdCBzdHlsZSA9IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/LlVJPy5EYXRlVGltZVN0eWxlO1xuXHRjb25zdCByZWxhdGl2ZUxvY2F0aW9uID0gZ2V0UmVsYXRpdmVQYXRocyhvUHJvcGVydHlEYXRhTW9kZWxQYXRoKTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbik7XG5cblx0Y29uc3QgY29tcGxleFR5cGUgPSBcInNhcC5mZS5jb3JlLnR5cGUuRGF0ZVRpbWVXaXRoVGltZXpvbmVcIjtcblx0Y29uc3QgdW5pdEJpbmRpbmdFeHByZXNzaW9uID1cblx0XHRpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0aW1lem9uZSkgJiYgdGltZXpvbmUuJHRhcmdldFxuXHRcdFx0PyBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKFxuXHRcdFx0XHRcdCh0aW1lem9uZSBhcyBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248dW5rbm93bj4pLiR0YXJnZXQgYXMgUHJvcGVydHksXG5cdFx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHRpbWV6b25lLCByZWxhdGl2ZUxvY2F0aW9uKSxcblx0XHRcdFx0XHRpZ25vcmVVbml0Q29uc3RyYWludFxuXHRcdFx0ICApXG5cdFx0XHQ6IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih0aW1lem9uZSwgcmVsYXRpdmVMb2NhdGlvbik7XG5cdGxldCBmb3JtYXRPcHRpb25zID0ge307XG5cdGlmIChoaWRlVGltZXpvbmVGb3JFbXB0eVZhbHVlcykge1xuXHRcdGZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRzaG93VGltZXpvbmVGb3JFbXB0eVZhbHVlczogZmFsc2Vcblx0XHR9O1xuXHR9XG5cdC8vIGlmIHN0eWxlIG9yIHBhdHRlcm4gaXMgYWxzbyBzZXRcblx0aWYgKHN0eWxlKSB7XG5cdFx0Zm9ybWF0T3B0aW9ucyA9IHsgLi4uZm9ybWF0T3B0aW9ucywgLi4ueyBzdHlsZTogc3R5bGUgfSB9O1xuXHR9IGVsc2UgaWYgKGZpZWxkRm9ybWF0T3B0aW9ucz8uZGF0ZVRpbWVTdHlsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Zm9ybWF0T3B0aW9ucyA9IHsgLi4uZm9ybWF0T3B0aW9ucywgLi4ueyBzdHlsZTogZmllbGRGb3JtYXRPcHRpb25zLmRhdGVUaW1lU3R5bGUgfSB9O1xuXHR9XG5cblx0aWYgKGZpZWxkRm9ybWF0T3B0aW9ucz8uZGF0ZVRpbWVQYXR0ZXJuICE9PSB1bmRlZmluZWQpIHtcblx0XHRmb3JtYXRPcHRpb25zID0geyAuLi5mb3JtYXRPcHRpb25zLCAuLi57IHBhdHRlcm46IGZpZWxkRm9ybWF0T3B0aW9ucy5kYXRlVGltZVBhdHRlcm4gfSB9O1xuXHR9XG5cblx0aWYgKGZpZWxkRm9ybWF0T3B0aW9ucz8uc2hvd1RpbWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdGZvcm1hdE9wdGlvbnMgPSB7IC4uLmZvcm1hdE9wdGlvbnMsIC4uLnsgc2hvd1RpbWU6IGZpZWxkRm9ybWF0T3B0aW9ucy5zaG93VGltZSB9IH07XG5cdH1cblx0aWYgKGZpZWxkRm9ybWF0T3B0aW9ucz8uc2hvd0RhdGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdGZvcm1hdE9wdGlvbnMgPSB7IC4uLmZvcm1hdE9wdGlvbnMsIC4uLnsgc2hvd0RhdGU6IGZpZWxkRm9ybWF0T3B0aW9ucy5zaG93RGF0ZSB9IH07XG5cdH1cblx0aWYgKGZpZWxkRm9ybWF0T3B0aW9ucz8uc2hvd1RpbWV6b25lICE9PSB1bmRlZmluZWQpIHtcblx0XHRmb3JtYXRPcHRpb25zID0geyAuLi5mb3JtYXRPcHRpb25zLCAuLi57IHNob3dUaW1lem9uZTogZmllbGRGb3JtYXRPcHRpb25zLnNob3dUaW1lem9uZSB9IH07XG5cdH1cblxuXHRyZXR1cm4gYWRkVHlwZUluZm9ybWF0aW9uKFtwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLCB1bml0QmluZGluZ0V4cHJlc3Npb25dLCBjb21wbGV4VHlwZSwgdW5kZWZpbmVkLCBmb3JtYXRPcHRpb25zKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgZGF0ZSBmb3JtYXQgb2YgYSBkYXRlLCB0aW1lIG9yIGRhdGVUaW1lLlxuICogQHBhcmFtIHByb3BlcnR5RGF0YU1vZGVsUGF0aCBUaGUgbGlzdCBvZiBkYXRhIG1vZGVsIG9iamVjdHMgdGhhdCBhcmUgaW52b2x2ZWQgdG8gcmVhY2ggdGhhdCBwcm9wZXJ0eVxuICogQHBhcmFtIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gQmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBmb3JtYXRPcHRpb25zRGF0ZUZvcm1hdCBGb3JtYXQgb3B0aW9ucyB3aGljaCBjb250YWluIHRoZSBzdHlsZSBvciBwYXR0ZXJuIHByb3BlcnR5XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIHJlcHJlc2VudGluZyBhIGRhdGUsIHRpbWUsIG9yIGRhdGUtdGltZSwgd2l0aCB0aGUgZ2l2ZW4gcGF0dGVybiBvciBzdHlsZSBwcm9wZXJ0eVxuICovXG5leHBvcnQgY29uc3QgZ2V0QmluZGluZ0ZvckRhdGVGb3JtYXQgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnR5RGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRmb3JtYXRPcHRpb25zRGF0ZUZvcm1hdD86IEZvcm1hdE9wdGlvbnNEYXRlRm9ybWF0XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eURlZmluaXRpb24gPSBwcm9wZXJ0eURhdGFNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXHRjb25zdCBwYXR0ZXJuID0gZm9ybWF0T3B0aW9uc0RhdGVGb3JtYXQ/LmRhdGVUaW1lUGF0dGVybjtcblx0Y29uc3Qgc3R5bGUgPSBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5VST8uRGF0ZVRpbWVTdHlsZSA/PyBmb3JtYXRPcHRpb25zRGF0ZUZvcm1hdD8uZGF0ZVRpbWVTdHlsZTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbik7XG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24udHlwZSA9IEVETV9UWVBFX01BUFBJTkdbb1Byb3BlcnR5RGVmaW5pdGlvbi50eXBlXS50eXBlO1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0Li4uKHN0eWxlICYmIHsgc3R5bGU6IHN0eWxlLnRvU3RyaW5nKCkgfSksXG5cdFx0Li4uKHBhdHRlcm4gJiYgeyBwYXR0ZXJuOiBwYXR0ZXJuIH0pXG5cdH07XG5cblx0cmV0dXJuIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb247XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QmluZGluZ0ZvclRpbWV6b25lID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBwcm9wZXJ0eURlZmluaXRpb24gPSBwcm9wZXJ0eURhdGFNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihwcm9wZXJ0eURlZmluaXRpb24sIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24pO1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLnR5cGUgPSBcImFueVwiO1xuXHRjb25zdCBjb21wbGV4VHlwZSA9IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRGF0ZVRpbWVXaXRoVGltZXpvbmVcIjtcblx0Y29uc3QgZm9ybWF0T3B0aW9ucyA9IHsgc2hvd1RpbWU6IGZhbHNlLCBzaG93RGF0ZTogZmFsc2UsIHNob3dUaW1lem9uZTogdHJ1ZSB9O1xuXG5cdC8vIG51bGwgaXMgcmVxdWlyZWQgYnkgZm9ybWF0dGVyIHdoZW4gdGhlcmUgaXMganVzdCBhIHRpbWV6b25lXG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oW251bGwsIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb25dLCBjb21wbGV4VHlwZSwgdW5kZWZpbmVkLCBmb3JtYXRPcHRpb25zKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBbGlnbm1lbnRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvQ29tcHV0ZWRFZGl0TW9kZTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4sXG5cdHNBbGlnbkRpc3BsYXkgPSBcIkJlZ2luXCIsXG5cdHNBbGlnbkVkaXQgPSBcIkJlZ2luXCJcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShlcXVhbChvQ29tcHV0ZWRFZGl0TW9kZSwgXCJEaXNwbGF5XCIpLCBzQWxpZ25EaXNwbGF5LCBzQWxpZ25FZGl0KSk7XG59O1xuXG4vKipcbiAqIEZvcm1hdHRlciBoZWxwZXIgdG8gcmV0cmlldmUgdGhlIGNvbnZlcnRlckNvbnRleHQgZnJvbSB0aGUgbWV0YW1vZGVsIGNvbnRleHQuXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIG9yaWdpbmFsIG1ldGFtb2RlbCBjb250ZXh0XG4gKiBAcGFyYW0gb0ludGVyZmFjZSBUaGUgY3VycmVudCB0ZW1wbGF0aW5nIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBDb252ZXJ0ZXJDb250ZXh0IHJlcHJlc2VudGluZyB0aGF0IG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgZ2V0Q29udmVydGVyQ29udGV4dCA9IGZ1bmN0aW9uIChvQ29udGV4dDogTWV0YU1vZGVsQ29udGV4dCwgb0ludGVyZmFjZTogQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlKTogb2JqZWN0IHwgbnVsbCB7XG5cdGlmIChvSW50ZXJmYWNlICYmIG9JbnRlcmZhY2UuY29udGV4dCkge1xuXHRcdHJldHVybiBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dChvSW50ZXJmYWNlLmNvbnRleHQpIGFzIG9iamVjdDtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn07XG5nZXRDb252ZXJ0ZXJDb250ZXh0LnJlcXVpcmVzSUNvbnRleHQgPSB0cnVlO1xuXG4vKipcbiAqIEZvcm1hdHRlciBoZWxwZXIgdG8gcmV0cmlldmUgdGhlIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IGFyZSBpbnZvbHZlZCBmcm9tIHRoZSBtZXRhbW9kZWwgY29udGV4dC5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgb3JpZ2luYWwgT0RhdGFNZXRhTW9kZWwgY29udGV4dFxuICogQHBhcmFtIG9JbnRlcmZhY2UgVGhlIGN1cnJlbnQgdGVtcGxhdGluZyBjb250ZXh0XG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlbnRpdHlzZXRzIGFuZCBuYXZwcm9wZXJ0aWVzIHRoYXQgYXJlIGludm9sdmVkIHRvIGdldCB0byBhIHNwZWNpZmljIG9iamVjdCBpbiB0aGUgbWV0YW1vZGVsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXREYXRhTW9kZWxPYmplY3RQYXRoID0gZnVuY3Rpb24gPFQ+KFxuXHRvQ29udGV4dDogTWV0YU1vZGVsQ29udGV4dCxcblx0b0ludGVyZmFjZTogQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlXG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoPFQ+IHwgbnVsbCB7XG5cdGlmIChvSW50ZXJmYWNlICYmIG9JbnRlcmZhY2UuY29udGV4dCkge1xuXHRcdHJldHVybiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0ludGVyZmFjZS5jb250ZXh0KTtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn07XG5nZXREYXRhTW9kZWxPYmplY3RQYXRoLnJlcXVpcmVzSUNvbnRleHQgPSB0cnVlO1xuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgcmVmZXJlbmNlZCBwcm9wZXJ0eSBpcyBwYXJ0IG9mIGEgMS4ubiBuYXZpZ2F0aW9uLlxuICogQHBhcmFtIG9EYXRhTW9kZWxQYXRoIFRoZSBkYXRhIG1vZGVsIHBhdGggdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHBhcnQgb2YgYSAxLi5uIG5hdmlnYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGlzTXVsdGlWYWx1ZUZpZWxkID0gZnVuY3Rpb24gKG9EYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPHVua25vd24+KTogYm9vbGVhbiB7XG5cdGlmIChvRGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcz8ubGVuZ3RoKSB7XG5cdFx0Y29uc3QgaGFzT25lVG9NYW55TmF2aWdhdGlvbiA9XG5cdFx0XHRvRGF0YU1vZGVsUGF0aD8ubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZEluZGV4KChvTmF2KSA9PiB7XG5cdFx0XHRcdGlmIChpc011bHRpcGxlTmF2aWdhdGlvblByb3BlcnR5KG9OYXYpKSB7XG5cdFx0XHRcdFx0aWYgKG9EYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbj8ubmF2aWdhdGlvblByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Ly93ZSBjaGVjayB0aGUgb25lIHRvIG1hbnkgbmF2IGlzIG5vdCBhbHJlYWR5IHBhcnQgb2YgdGhlIGNvbnRleHRcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdG9EYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbj8ubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZEluZGV4KFxuXHRcdFx0XHRcdFx0XHRcdChvQ29udGV4dE5hdikgPT4gb0NvbnRleHROYXYubmFtZSA9PT0gb05hdi5uYW1lXG5cdFx0XHRcdFx0XHRcdCkgPT09IC0xXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9KSA+IC0xO1xuXHRcdGlmIChoYXNPbmVUb01hbnlOYXZpZ2F0aW9uKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufTtcbmV4cG9ydCBjb25zdCBnZXRSZXF1aXJlZEV4cHJlc3Npb25Bc09iamVjdCA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkPzogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzLFxuXHRmb3JjZUVkaXRNb2RlID0gZmFsc2Vcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBnZXRSZXF1aXJlZEV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCwgb0RhdGFGaWVsZENvbnZlcnRlZCwgZm9yY2VFZGl0TW9kZSwgdHJ1ZSkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xufTtcbmV4cG9ydCBjb25zdCBnZXRSZXF1aXJlZEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFGaWVsZENvbnZlcnRlZD86IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyxcblx0Zm9yY2VFZGl0TW9kZSA9IGZhbHNlLFxuXHRiQXNPYmplY3QgPSBmYWxzZSxcblx0b1JlcXVpcmVkUHJvcGVydGllczoge1xuXHRcdHJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnM/OiB1bmtub3duW107XG5cdFx0cmVxdWlyZWRQcm9wZXJ0aWVzRnJvbVVwZGF0ZVJlc3RyaWN0aW9ucz86IHVua25vd25bXTtcblx0fSA9IHt9LFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoPzogRGF0YU1vZGVsT2JqZWN0UGF0aDx1bmtub3duPlxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyA9IG9SZXF1aXJlZFByb3BlcnRpZXMucmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucztcblx0Y29uc3QgYVJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMgPSBvUmVxdWlyZWRQcm9wZXJ0aWVzLnJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnM7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdGlmIChiQXNPYmplY3QpIHtcblx0XHRcdHJldHVybiBjb25zdGFudChmYWxzZSk7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihjb25zdGFudChmYWxzZSkpO1xuXHR9XG5cdGxldCByZWxhdGl2ZVBhdGg7XG5cdGlmIChkYXRhTW9kZWxPYmplY3RQYXRoKSB7XG5cdFx0cmVsYXRpdmVQYXRoID0gZ2V0UmVsYXRpdmVQYXRocyhkYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0fVxuXHRsZXQgZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudChmYWxzZSk7XG5cdGlmIChvRGF0YUZpZWxkQ29udmVydGVkICE9PSB1bmRlZmluZWQgJiYgIWlzUHJvcGVydHkob0RhdGFGaWVsZENvbnZlcnRlZCkpIHtcblx0XHQvLyBGb3IgdGhlIGRhdGFmaWVsZCBleHByZXNzaW9uIHdlIHNob3VsZCBub3QgIGNvbnNpZGVyIHRoZSByZWxhdGl2ZSBwYXRoXG5cdFx0ZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uID0gaXNSZXF1aXJlZEV4cHJlc3Npb24ob0RhdGFGaWVsZENvbnZlcnRlZCk7XG5cdH1cblx0bGV0IHJlcXVpcmVkUHJvcGVydHlGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQoZmFsc2UpO1xuXHRsZXQgcmVxdWlyZWRQcm9wZXJ0eUZyb21VcGRhdGVSZXN0cmljdGlvbnNFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudChmYWxzZSk7XG5cblx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblx0Ly8gRW5hYmxlbWVudCBkZXBlbmRzIG9uIHRoZSBmaWVsZCBjb250cm9sIGV4cHJlc3Npb25cblx0Ly8gSWYgdGhlIEZpZWxkIGNvbnRyb2wgaXMgc3RhdGljYWxseSBpbiBJbmFwcGxpY2FibGUgKGRpc2FibGVkKSAtPiBub3QgZW5hYmxlZFxuXHRjb25zdCByZXF1aXJlZEV4cHJlc3Npb24gPSBpc1JlcXVpcmVkRXhwcmVzc2lvbihvUHJvcGVydHksIHJlbGF0aXZlUGF0aCk7XG5cdGNvbnN0IGVkaXRNb2RlID0gZm9yY2VFZGl0TW9kZSB8fCBVSS5Jc0VkaXRhYmxlO1xuXHRpZiAoYVJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnM/LmluY2x1ZGVzKG9Qcm9wZXJ0eS5uYW1lKSkge1xuXHRcdHJlcXVpcmVkUHJvcGVydHlGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zRXhwcmVzc2lvbiA9IFVJLklzQ3JlYXRlTW9kZTtcblx0fVxuXHRpZiAoYVJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnM/LmluY2x1ZGVzKG9Qcm9wZXJ0eS5uYW1lKSkge1xuXHRcdHJlcXVpcmVkUHJvcGVydHlGcm9tVXBkYXRlUmVzdHJpY3Rpb25zRXhwcmVzc2lvbiA9IGFuZChVSS5Jc0VkaXRhYmxlLCBub3QoVUkuSXNDcmVhdGVNb2RlKSk7XG5cdH1cblx0Y29uc3QgcmV0dXJuRXhwcmVzc2lvbiA9IG9yKFxuXHRcdGFuZChvcihyZXF1aXJlZEV4cHJlc3Npb24sIGRhdGFGaWVsZFJlcXVpcmVkRXhwcmVzc2lvbiksIGVkaXRNb2RlKSxcblx0XHRyZXF1aXJlZFByb3BlcnR5RnJvbUluc2VydFJlc3RyaWN0aW9uc0V4cHJlc3Npb24sXG5cdFx0cmVxdWlyZWRQcm9wZXJ0eUZyb21VcGRhdGVSZXN0cmljdGlvbnNFeHByZXNzaW9uXG5cdCk7XG5cdGlmIChiQXNPYmplY3QpIHtcblx0XHRyZXR1cm4gcmV0dXJuRXhwcmVzc2lvbjtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24ocmV0dXJuRXhwcmVzc2lvbik7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRFeHByZXNzaW9uRm9yQ29ubmVjdGVkRGF0YUZpZWxkID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGRPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPEFubm90YXRpb25QYXRoPENvbm5lY3RlZEZpZWxkc1R5cGU+PlxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzPiA9IChkYXRhRmllbGRPYmplY3RQYXRoPy50YXJnZXRPYmplY3Q/LiR0YXJnZXQ/LkRhdGEgPz8ge30pIGFzIFJlY29yZDxcblx0XHRzdHJpbmcsXG5cdFx0RGF0YUZpZWxkQWJzdHJhY3RUeXBlc1xuXHQ+O1xuXHRjb25zdCBrZXlzOiBBcnJheTxzdHJpbmc+ID0gT2JqZWN0LmtleXMoZGF0YSk7XG5cdGNvbnN0IGRhdGFGaWVsZHMgPSBbXTtcblx0bGV0IHByb3BlcnR5UGF0aDtcblx0Y29uc3QgaXNSZXF1aXJlZEV4cHJlc3Npb25zOiAoQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4pW10gfCB1bmRlZmluZWQgPSBbXTtcblx0Zm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuXHRcdGlmIChkYXRhW2tleV0/LltcIiRUeXBlXCJdICYmIGRhdGFba2V5XVtcIiRUeXBlXCJdPy5pbmNsdWRlcyhcIkRhdGFGaWVsZFwiKSkge1xuXHRcdFx0ZGF0YUZpZWxkcy5wdXNoKGRhdGFba2V5XSk7XG5cdFx0fVxuXHR9XG5cdGZvciAoY29uc3QgZGF0YUZpZWxkIG9mIGRhdGFGaWVsZHMpIHtcblx0XHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGggPSBkYXRhRmllbGQuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdFx0aWYgKGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQpIHtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRpc0Fubm90YXRpb25PZlR5cGU8RGF0YUZpZWxkIHwgRGF0YVBvaW50VHlwZT4oZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LCBbXG5cdFx0XHRcdFx0XHRcdFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCxcblx0XHRcdFx0XHRcdFx0VUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZVxuXHRcdFx0XHRcdFx0XSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5UGF0aCA9IGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIGRhdGFGaWVsZC5UYXJnZXQgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlQYXRoID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHQvLyBubyBkZWZhdWx0XG5cdFx0fVxuXHRcdGlzUmVxdWlyZWRFeHByZXNzaW9ucy5wdXNoKGdldFJlcXVpcmVkRXhwcmVzc2lvbkFzT2JqZWN0KHByb3BlcnR5UGF0aCwgZGF0YUZpZWxkLCBmYWxzZSkpO1xuXHR9XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihvciguLi4oaXNSZXF1aXJlZEV4cHJlc3Npb25zIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdKSkpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBoZWFkZXIgZmFjZXQgb3IgYWN0aW9uIGlzIHZpc2libGUuXG4gKiBAcGFyYW0gdGFyZ2V0T2JqZWN0IEhlYWRlciBmYWNldHMgb3IgQWN0aW9uc1xuICogQHJldHVybnMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Zpc2libGUoXG5cdHRhcmdldE9iamVjdDpcblx0XHR8IERhdGFGaWVsZEFic3RyYWN0VHlwZXNcblx0XHR8IERhdGFQb2ludFR5cGVUeXBlc1xuXHRcdHwgUmVmZXJlbmNlRmFjZXRcblx0XHR8IENvbGxlY3Rpb25GYWNldFxuXHRcdHwgRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXNcblx0XHR8IEZpZWxkR3JvdXBcblx0XHR8IFByb3BlcnR5XG5cdFx0fCB1bmRlZmluZWQsXG5cdG5hdmlnYXRpb25Qcm9wZXJ0aWVzPzogc3RyaW5nW11cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBub3QoZXF1YWwoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4sIG5hdmlnYXRpb25Qcm9wZXJ0aWVzKSwgdHJ1ZSkpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGFjdGlvbiBwYXJhbWV0ZXIgaXMgc3VwcG9ydHMgbXVsdGkgbGluZSBpbnB1dC5cbiAqIEBwYXJhbSBkYXRhTW9kZWxPYmplY3RQYXRoIE9iamVjdCBwYXRoIHRvIHRoZSBhY3Rpb24gcGFyYW1ldGVyLlxuICogQHJldHVybnMgQm9vbGVhblxuICovXG5leHBvcnQgY29uc3QgaXNNdWx0aUxpbmUgPSBmdW5jdGlvbiAoZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxBY3Rpb25QYXJhbWV0ZXI+KTogYm9vbGVhbiB7XG5cdHJldHVybiBpc011bHRpTGluZVRleHQoZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIGVuYWJsZWQuXG4gKiBAcGFyYW0gYWN0aW9uVGFyZ2V0IEFjdGlvblxuICogQHBhcmFtIGNvbnZlcnRlZFR5cGVzIENvbnZlcnRlZE1ldGFkYXRhXG4gKiBAcGFyYW0gZGF0YU1vZGVsT2JqZWN0UGF0aCBEYXRhTW9kZWxPYmplY3RQYXRoXG4gKiBAcGFyYW0gcGF0aEZyb21Db250ZXh0TG9jYXRpb24gQm9vbGVhblxuICogQHJldHVybnMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3Rpb25FbmFibGVkRXhwcmVzc2lvbihcblx0YWN0aW9uVGFyZ2V0OiBBY3Rpb24sXG5cdGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZWRNZXRhZGF0YSxcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aD86IERhdGFNb2RlbE9iamVjdFBhdGg8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0cGF0aEZyb21Db250ZXh0TG9jYXRpb24/OiBib29sZWFuXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGVJc0Fubm90YXRlZCA9XG5cdFx0YWN0aW9uVGFyZ2V0LmFubm90YXRpb25zLkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZT8udGVybSA9PT0gQ29yZUFubm90YXRpb25UZXJtcy5PcGVyYXRpb25BdmFpbGFibGU7XG5cblx0aWYgKCFvcGVyYXRpb25BdmFpbGFibGVJc0Fubm90YXRlZCkge1xuXHRcdC8vIE9wZXJhdGlvbkF2YWlsYWJsZSB0ZXJtIGRvZXNuJ3QgZXhpc3QgZm9yIHRoZSBhY3Rpb25cblx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdH1cblxuXHRsZXQgcHJlZml4ID0gXCJcIjtcblx0aWYgKFxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGggJiZcblx0XHRwYXRoRnJvbUNvbnRleHRMb2NhdGlvbiAmJlxuXHRcdHBhdGhGcm9tQ29udGV4dExvY2F0aW9uID09PSB0cnVlICYmXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5jb250ZXh0TG9jYXRpb24/LnRhcmdldEVudGl0eVR5cGUgJiZcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLmNvbnRleHRMb2NhdGlvbi50YXJnZXRFbnRpdHlUeXBlICE9PSBhY3Rpb25UYXJnZXQuc291cmNlRW50aXR5VHlwZVxuXHQpIHtcblx0XHRjb25zdCBuYXZpZ2F0aW9ucyA9IGdldFJlbGF0aXZlUGF0aHMoZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdFx0bGV0IHNvdXJjZUFjdGlvbkRhdGFNb2RlbE9iamVjdCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKGRhdGFNb2RlbE9iamVjdFBhdGguY29udGV4dExvY2F0aW9uKTtcblx0XHQvL1N0YXJ0IGZyb20gY29udGV4dExvY2F0aW9uIGFuZCBuYXZpZ2F0ZSB1bnRpbCB0aGUgc291cmNlIGVudGl0eVR5cGUgb2YgdGhlIGFjdGlvbiB0byBnZXQgdGhlIHJpZ2h0IHByZWZpeFxuXHRcdGZvciAoY29uc3QgbmF2IG9mIG5hdmlnYXRpb25zKSB7XG5cdFx0XHRzb3VyY2VBY3Rpb25EYXRhTW9kZWxPYmplY3QgPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChzb3VyY2VBY3Rpb25EYXRhTW9kZWxPYmplY3QsIG5hdik7XG5cdFx0XHRpZiAoc291cmNlQWN0aW9uRGF0YU1vZGVsT2JqZWN0LnRhcmdldEVudGl0eVR5cGUgPT09IGFjdGlvblRhcmdldC5zb3VyY2VFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdHByZWZpeCA9IGAke2dldFJlbGF0aXZlUGF0aHMoc291cmNlQWN0aW9uRGF0YU1vZGVsT2JqZWN0KS5qb2luKFwiL1wiKX0vYDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGJpbmRpbmdQYXJhbWV0ZXJGdWxsTmFtZSA9IGFjdGlvblRhcmdldC5pc0JvdW5kID8gYWN0aW9uVGFyZ2V0LnBhcmFtZXRlcnNbMF0/LmZ1bGx5UXVhbGlmaWVkTmFtZSA6IHVuZGVmaW5lZDtcblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlRXhwcmVzc2lvbiA9IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihcblx0XHRhY3Rpb25UYXJnZXQuYW5ub3RhdGlvbnMuQ29yZT8uT3BlcmF0aW9uQXZhaWxhYmxlLFxuXHRcdFtdLFxuXHRcdHVuZGVmaW5lZCxcblx0XHQocGF0aDogc3RyaW5nKSA9PiBgJHtwcmVmaXh9JHtiaW5kaW5nQ29udGV4dFBhdGhWaXNpdG9yKHBhdGgsIGNvbnZlcnRlZFR5cGVzLCBiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUpfWBcblx0KTtcblxuXHRyZXR1cm4gZXF1YWwob3BlcmF0aW9uQXZhaWxhYmxlRXhwcmVzc2lvbiwgdHJ1ZSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBleHByZXNzaW9uIHRvIGNoZWNrIGlmIHRoZSBxdWlja1ZpZXcgZmFjZXQgaXMgdmlzaWJsZS5cbiAqIEBwYXJhbSBmYWNldE1vZGVsUGF0aFxuICogQHJldHVybnMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gb2YgdGhlIHZpc2liaWxpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUXVpY2tWaWV3RmFjZXRWaXNpYmxlKGZhY2V0TW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFJlZmVyZW5jZUZhY2V0Pik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0bGV0IHRhcmdldFZpc2libGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IGNvbnN0YW50KHRydWUpO1xuXHRpZiAoaXNBbm5vdGF0aW9uT2ZUeXBlPEZpZWxkR3JvdXA+KGZhY2V0TW9kZWxQYXRoLnRhcmdldE9iamVjdD8uVGFyZ2V0Py4kdGFyZ2V0LCBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZSkpIHtcblx0XHR0YXJnZXRWaXNpYmxlID0gaXNWaXNpYmxlKGZhY2V0TW9kZWxQYXRoLnRhcmdldE9iamVjdD8uVGFyZ2V0Py4kdGFyZ2V0KTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oYW5kKGlzVmlzaWJsZShmYWNldE1vZGVsUGF0aC50YXJnZXRPYmplY3Qp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
@@ -492,6 +492,7 @@ export const getBindingWithUnitOrCurrency = function (
492
492
  formatOptions?: {
493
493
  showMeasure?: boolean;
494
494
  decimalPadding?: number;
495
+ emptyString?: string | number;
495
496
  },
496
497
  forDisplayMode?: boolean,
497
498
  showOnlyUnitDecimals?: boolean
@@ -521,6 +522,9 @@ export const getBindingWithUnitOrCurrency = function (
521
522
  constraintOptions = getConstraintOptions(oPropertyDataModelPath.targetObject);
522
523
  }
523
524
  }
525
+ if (forDisplayMode) {
526
+ formatOptions = { ...formatOptions, emptyString: "" };
527
+ }
524
528
 
525
529
  return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType, undefined, formatOptions, constraintOptions);
526
530
  };