@sapui5/sap.fe.core 1.136.11 → 1.136.13

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 (44) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppStateHandler.js +8 -2
  4. package/src/sap/fe/core/AppStateHandler.ts +9 -1
  5. package/src/sap/fe/core/TemplateComponent.js +1 -1
  6. package/src/sap/fe/core/TemplateComponent.ts +1 -3
  7. package/src/sap/fe/core/controllerextensions/EditFlow.js +73 -23
  8. package/src/sap/fe/core/controllerextensions/EditFlow.ts +113 -43
  9. package/src/sap/fe/core/controllerextensions/InternalRouting.js +7 -4
  10. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +8 -5
  11. package/src/sap/fe/core/controllerextensions/MessageHandler.js +1 -1
  12. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +1 -0
  13. package/src/sap/fe/core/controllerextensions/Routing.js +6 -2
  14. package/src/sap/fe/core/controllerextensions/Routing.ts +4 -1
  15. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +8 -1
  16. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +8 -0
  17. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +2 -1
  18. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +1 -0
  19. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +6 -5
  20. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +15 -5
  21. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +29 -1
  22. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +32 -0
  23. package/src/sap/fe/core/converters/controls/Common/Action.js +3 -2
  24. package/src/sap/fe/core/converters/controls/Common/Action.ts +2 -1
  25. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +31 -36
  26. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +47 -57
  27. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +4 -3
  28. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +3 -2
  29. package/src/sap/fe/core/formatters/FPMFormatter.js +2 -2
  30. package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
  31. package/src/sap/fe/core/fpm/manifest.json +1 -1
  32. package/src/sap/fe/core/helpers/ModelHelper.js +4 -1
  33. package/src/sap/fe/core/helpers/ModelHelper.ts +4 -1
  34. package/src/sap/fe/core/library.js +1 -1
  35. package/src/sap/fe/core/messagebundle_da.properties +1 -1
  36. package/src/sap/fe/core/messagebundle_ko.properties +3 -3
  37. package/src/sap/fe/core/messagebundle_uk.properties +2 -2
  38. package/src/sap/fe/core/messagebundle_vi.properties +4 -4
  39. package/src/sap/fe/core/rootView/Fcl.controller.js +1 -1
  40. package/src/sap/fe/core/rootView/Fcl.controller.ts +6 -1
  41. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +17 -29
  42. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +23 -26
  43. package/src/sap/fe/core/services/RoutingServiceFactory.js +9 -5
  44. package/src/sap/fe/core/services/RoutingServiceFactory.ts +12 -6
@@ -6,6 +6,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
6
6
  "use strict";
7
7
 
8
8
  var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _dec31, _dec32, _dec33, _dec34, _dec35, _dec36, _dec37, _dec38, _dec39, _dec40, _dec41, _dec42, _dec43, _dec44, _dec45, _dec46, _class, _class2;
9
+ var isRejected = TypeGuards.isRejected;
9
10
  var isFulfilled = TypeGuards.isFulfilled;
10
11
  var CreationMode = ManifestSettings.CreationMode;
11
12
  var RecommendationDialogDecision = $ConfirmRecommendationDialog.RecommendationDialogDecision;
@@ -296,12 +297,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
296
297
  _proto.requestSideEffectsForNavigationProperty = function requestSideEffectsForNavigationProperty(listBinding, parentContext) {
297
298
  let ignoreTransientContexts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
298
299
  if (parentContext) {
299
- const listBindingRelativePath = ModelHelper.getRelativeMetaPathForListBinding(parentContext, listBinding);
300
- if ((ignoreTransientContexts || !CommonUtils.hasTransientContext(listBinding)) && listBindingRelativePath) {
300
+ const listBindingRelativePathToPage = ModelHelper.getRelativeMetaPathForListBinding(parentContext, listBinding);
301
+ const listBindingRelativePath = ModelHelper.getRelativeMetaPathForListBinding(listBinding.getContext(), listBinding);
302
+ if (ignoreTransientContexts || !CommonUtils.hasTransientContext(listBinding)) {
301
303
  // if there are transient contexts (and we don't ignore this check), we must avoid requesting side effects
302
304
  // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
303
305
  // if list binding is refreshed, transient contexts might be lost
304
- this.getAppComponent().getSideEffectsService().requestSideEffectsForNavigationProperty(listBindingRelativePath, parentContext);
306
+ if (listBindingRelativePath) {
307
+ this.getAppComponent().getSideEffectsService().requestSideEffectsForNavigationProperty(listBindingRelativePath, listBinding.getContext());
308
+ }
309
+ // if we are triggering side effects for a multivaluefield within a table, listBindingRelativePathToPage is different to listBindingRelativePath
310
+ // so we also ensure page side effects are triggered if need be
311
+ if (listBindingRelativePathToPage && listBindingRelativePathToPage !== listBindingRelativePath) {
312
+ this.getAppComponent().getSideEffectsService().requestSideEffectsForNavigationProperty(listBindingRelativePathToPage, parentContext);
313
+ }
305
314
  return true;
306
315
  }
307
316
  }
@@ -501,6 +510,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
501
510
  * @param mInParameters.selectedContexts The contexts that are selected in the table initiating the creation. Used in case of a TreeTable to determine the parent context of the created document
502
511
  * @param mInParameters.singleDraftForCreate When enabled, an extra request checks if any drafts exist that were never saved. If unsaved drafts are found, the newest one is opened. If no unsaved drafts are found, a new entity is created
503
512
  * @param mInParameters.creationDialogFields Defines the list of properties that are displayed in the creation dialog when the creation mode is set to 'CreationDialog'.<br/>The value is a comma-separated list of property names
513
+ * @param mInParameters.requestAtLeast PRIVATE - Defines the list of properties that should be requested when creating the new document to avoid additional requests later on.<br/>The value is an array of property names
504
514
  * @returns Promise resolves once the object has been created
505
515
  * @public
506
516
  * @since 1.90.0
@@ -575,12 +585,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
575
585
  case CreationMode.External:
576
586
  return this.createExternalDocument(vListBinding, parameters.outbound);
577
587
  case CreationMode.Deferred:
578
- return this.createDeferredDocument(oDataListBinding, parentContext, parameters.data);
588
+ return this.createDeferredDocument({
589
+ parentContext,
590
+ data: parameters.data,
591
+ requestAtLeast: parameters.requestAtLeast
592
+ }, oDataListBinding);
579
593
  case CreationMode.CreationRow:
580
594
  return parameters.creationRow ? this.createCreateRowDocument({
581
595
  creationRow: parameters.creationRow,
582
596
  skipSideEffects: parameters.skipSideEffects,
583
- createAtEnd: parameters.createAtEnd
597
+ createAtEnd: parameters.createAtEnd,
598
+ requestAtLeast: parameters.requestAtLeast
584
599
  }) : undefined;
585
600
  case CreationMode.Inline:
586
601
  return this.createDialogInlineDocument({
@@ -589,7 +604,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
589
604
  createAtEnd: parameters.createAtEnd,
590
605
  skipSideEffects: parameters.skipSideEffects,
591
606
  parentContext,
592
- data: parameters.data
607
+ data: parameters.data,
608
+ requestAtLeast: parameters.requestAtLeast
593
609
  }, oDataListBinding);
594
610
  case CreationMode.CreationDialog:
595
611
  if (oDataListBinding.isRelative()) {
@@ -601,7 +617,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
601
617
  skipSideEffects: parameters.skipSideEffects,
602
618
  parentContext,
603
619
  data: parameters.data,
604
- creationDialogFields: parameters.creationDialogFields
620
+ creationDialogFields: parameters.creationDialogFields,
621
+ requestAtLeast: parameters.requestAtLeast
605
622
  }, oDataListBinding);
606
623
  } else {
607
624
  // Creation with dialog in a ListReport
@@ -622,6 +639,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
622
639
  bFromDeferred: parameters.bFromDeferred,
623
640
  skipSideEffects: parameters.skipSideEffects,
624
641
  createAction: parameters.createAction,
642
+ requestAtLeast: parameters.requestAtLeast,
625
643
  parentContext
626
644
  }, oDataListBinding);
627
645
  default:
@@ -630,7 +648,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
630
648
  }
631
649
 
632
650
  /**
633
- *Executes the mandatory configuration after the document has been created.
651
+ * Executes the mandatory configuration after the document has been created.
634
652
  * @param prerequisite Promise of the document creation and the following navigation
635
653
  * @param listBinding ODataListBinding where the document is created
636
654
  * @returns Promise resolves once the configuration is done
@@ -638,8 +656,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
638
656
  _proto.postDocumentCreation = async function postDocumentCreation(prerequisite, listBinding) {
639
657
  const programmingModel = this.getProgrammingModel(listBinding);
640
658
  const model = listBinding.getModel();
641
- const params = await prerequisite;
642
- const newDocumentContext = params[0];
659
+ const results = await prerequisite;
660
+
661
+ // Check if creation or navigation failed and throw the respective error
662
+ const creation = results[0];
663
+ if (isRejected(creation)) {
664
+ throw creation.reason;
665
+ }
666
+ const navigation = results[1];
667
+ if (isRejected(navigation)) {
668
+ throw navigation.reason;
669
+ }
670
+ const newDocumentContext = creation.value;
643
671
  this._setStickySessionInternalProperties(programmingModel, model);
644
672
  await this.base.editFlow.onAfterCreate({
645
673
  context: newDocumentContext
@@ -681,6 +709,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
681
709
  * @param parameters.createAtEnd The new document is created at the end.
682
710
  * @param parameters.creationRow The creation row
683
711
  * @param parameters.skipSideEffects The sideEffects are requested
712
+ * @param parameters.requestAtLeast Defines the list of properties that should be requested when creating the new document to avoid additional requests later on.
684
713
  * @returns Promise resolves once the document has been created
685
714
  */;
686
715
  _proto.createCreateRowDocument = async function createCreateRowDocument(parameters) {
@@ -740,7 +769,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
740
769
  skipParameterDialog: appComponent.getStartupMode() === StartupMode.AutoCreate,
741
770
  // In case the application was called with preferredMode=autoCreateWith, we want to skip the action parameter dialog
742
771
  createAtEnd: parameters.createAtEnd,
743
- creationMode: CreationMode.CreationRow
772
+ creationMode: CreationMode.CreationRow,
773
+ requestAtLeast: parameters.requestAtLeast
744
774
  }, appComponent, this._getResourceModel(), this.getMessageHandler(), false);
745
775
  // SideEffects on Create
746
776
  // if Save is pressed directly after filling the CreationRow, no SideEffects request
@@ -757,7 +787,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
757
787
  Log.trace("transient fast creation context deleted");
758
788
  });
759
789
  navigation = creationRowContext.delete("$direct");
760
- return await this.postDocumentCreation(Promise.all([creation, navigation]), listBinding);
790
+ return await this.postDocumentCreation(Promise.allSettled([creation, navigation]), listBinding);
761
791
  } catch (error) {
762
792
  // Reset busy indicator after a validation error
763
793
  if (BusyLocker.isLocked(this.base.getView().getModel("ui"))) {
@@ -777,6 +807,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
777
807
  * @param parameters.parentContext Parent context (for TreeTable)
778
808
  * @param parameters.data Intial data for creation
779
809
  * @param parameters.creationDialogFields Fields to be displayed in the creation dialog
810
+ * @param parameters.requestAtLeast Defines the list of properties that should be requested when creating the new document to avoid additional requests later on.
780
811
  * @param listBinding ODataListBinding where the document is created
781
812
  * @returns Promise resolves once the document has been created
782
813
  */;
@@ -832,12 +863,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
832
863
  creationMode: parameters.creationMode,
833
864
  parentContext: parameters.parentContext,
834
865
  data: parameters.data,
835
- creationDialogFields: parameters.creationDialogFields
866
+ creationDialogFields: parameters.creationDialogFields,
867
+ requestAtLeast: parameters.requestAtLeast
836
868
  }, this.getAppComponent(), this._getResourceModel(), this.getMessageHandler(), false);
837
869
  if (!parameters.skipSideEffects) {
838
870
  this.handleSideEffects(listBinding, creation);
839
871
  }
840
- return this.postDocumentCreation(Promise.all([creation, this.syncTask(creation)]), listBinding);
872
+ return this.postDocumentCreation(Promise.allSettled([creation, this.syncTask(creation)]), listBinding);
841
873
  }
842
874
 
843
875
  /**
@@ -928,20 +960,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
928
960
 
929
961
  /**
930
962
  * Creates a deferred document.
963
+ * @param parameters Contains the following attributes:
964
+ * @param parameters.data Data to save on the new document
965
+ * @param parameters.parentContext
966
+ * @param parameters.requestAtLeast Defines the list of properties that should be requested when creating the new document to avoid additional requests later on.
931
967
  * @param listBinding ODataListBinding where the document has to be created
932
- * @param parentContext Optional parent context when creating a node in TreeTable
933
- * @param data
934
968
  * @returns Promise resolves once the navigation is done
935
969
  */;
936
- _proto.createDeferredDocument = async function createDeferredDocument(listBinding, parentContext, data) {
970
+ _proto.createDeferredDocument = async function createDeferredDocument(parameters, listBinding) {
937
971
  const lockObject = this.getGlobalUIModel();
938
972
  BusyLocker.lock(lockObject);
939
973
  await this.getInternalRouting().navigateForwardToContext(listBinding, {
940
974
  createOnNavigateParameters: {
941
975
  mode: "Deferred",
942
- parentContext,
976
+ parentContext: parameters.parentContext,
943
977
  listBinding,
944
- data
978
+ data: parameters.data,
979
+ requestAtLeast: parameters.requestAtLeast
945
980
  },
946
981
  editable: true,
947
982
  forceFocus: true
@@ -958,6 +993,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
958
993
  * @param parameters.data Data to save on the new document
959
994
  * @param parameters.skipSideEffects The sideEffects are requested
960
995
  * @param parameters.parentContext
996
+ * @param parameters.requestAtLeast Defines the list of properties that should be requested when creating the new document to avoid additional requests later on.
961
997
  * @param listBinding ODataListBinding where the document is created
962
998
  * @returns Promise resolves once the document has been created
963
999
  */;
@@ -971,7 +1007,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
971
1007
  ...{
972
1008
  parentControl: this.getView(),
973
1009
  beforeCreateCallBack: this.base.editFlow.onBeforeCreate,
974
- skipParameterDialog: this.getAppComponent().getStartupMode() === StartupMode.AutoCreate // In case the application was called with preferredMode=autoCreateWith, we want to skip the action parameter dialog
1010
+ skipParameterDialog: this.getAppComponent().getStartupMode() === StartupMode.AutoCreate,
1011
+ // In case the application was called with preferredMode=autoCreateWith, we want to skip the action parameter dialog
1012
+ requestAtLeast: this._isFclEnabled() ? parameters.requestAtLeast : undefined // For fullscreen, we don't need to request extra properties as the table will be refreshed when navigating back with the DirtyState
975
1013
  }
976
1014
  }, this.getAppComponent(), this._getResourceModel(), this.getMessageHandler(), false).then(newDocumentContext => {
977
1015
  if (this._isFclEnabled() && newDocumentContext && newDocumentContext.getBinding() !== listBinding) {
@@ -997,9 +1035,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
997
1035
  forceFocus: true
998
1036
  });
999
1037
  } else {
1038
+ const coreResourceBundle = Library.getResourceBundleFor("sap.fe.core");
1000
1039
  navigation = creation.then(async newDocumentContext => {
1001
1040
  if (!newDocumentContext) {
1002
- const coreResourceBundle = Library.getResourceBundleFor("sap.fe.core");
1003
1041
  return routingListener.navigateToMessagePage(coreResourceBundle.getText("C_COMMON_SAPFE_DATA_RECEIVED_ERROR"), {
1004
1042
  title: coreResourceBundle.getText("C_COMMON_SAPFE_ERROR"),
1005
1043
  description: coreResourceBundle.getText("C_EDITFLOW_SAPFE_CREATION_FAILED_DESCRIPTION")
@@ -1014,10 +1052,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
1014
1052
  };
1015
1053
  return parameters.bFromDeferred ? routingListener.navigateToContext(newDocumentContext, navParameters) : routingListener.navigateForwardToContext(newDocumentContext, navParameters);
1016
1054
  }
1055
+ }).catch(async error => {
1056
+ if (typeof error === "string" && error === Constants.CancelActionDialog) {
1057
+ // Creation has been cancelled by the user => no error message page
1058
+ throw error;
1059
+ }
1060
+ Log.error("Creation error: ", error);
1061
+ // Navigate to error message page in case of an error during creation or navigation
1062
+ return routingListener.navigateToMessagePage(coreResourceBundle.getText("C_COMMON_SAPFE_DATA_RECEIVED_ERROR"), {
1063
+ title: coreResourceBundle.getText("C_COMMON_SAPFE_ERROR"),
1064
+ description: coreResourceBundle.getText("C_EDITFLOW_SAPFE_CREATION_FAILED_DESCRIPTION"),
1065
+ showMessagePageOnCreateFailure: true
1066
+ });
1017
1067
  });
1018
1068
  }
1019
1069
  try {
1020
- await this.postDocumentCreation(Promise.all([creation, navigation]), listBinding);
1070
+ await this.postDocumentCreation(Promise.allSettled([creation, navigation]), listBinding);
1021
1071
  } catch (error) {
1022
1072
  // TODO: currently, the only errors handled here are raised as string - should be changed to Error objects
1023
1073
  // creation has been cancelled by user or failed in backend => in case we have navigated to transient context before, navigate back
@@ -3219,4 +3269,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
3219
3269
  }(BaseControllerExtension), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec7, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeExecuteAction", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeExecuteAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterSave", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterCreate", [_dec23, _dec24], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterEdit", [_dec25, _dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDiscard", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDelete", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec31, _dec32], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec33, _dec34], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec35, _dec36], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec37, _dec38], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec39, _dec40], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterActionExecution", [_dec41, _dec42], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterActionExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "customMassEditSave", [_dec43, _dec44], Object.getOwnPropertyDescriptor(_class2.prototype, "customMassEditSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [_dec45, _dec46], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype), _class2)) || _class);
3220
3270
  return EditFlow;
3221
3271
  }, false);
3222
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiRWRpdEZsb3ciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJwdWJsaWNFeHRlbnNpb24iLCJfZGVjNCIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzUiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiX2RlYzExIiwiX2RlYzEyIiwiX2RlYzEzIiwiX2RlYzE0IiwiX2RlYzE1IiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiX2RlYzIzIiwiX2RlYzI0IiwiX2RlYzI1IiwiX2RlYzI2IiwiX2RlYzI3IiwiX2RlYzI4IiwiX2RlYzI5IiwiX2RlYzMwIiwiX2RlYzMxIiwiX2RlYzMyIiwiX2RlYzMzIiwiX2RlYzM0IiwiX2RlYzM1IiwiX2RlYzM2IiwiX2RlYzM3IiwiX2RlYzM4IiwiX2RlYzM5IiwiX2RlYzQwIiwiX2RlYzQxIiwiX2RlYzQyIiwiX2RlYzQzIiwiX2RlYzQ0IiwiSW5zdGVhZCIsIl9kZWM0NSIsIl9kZWM0NiIsIl9jbGFzcyIsIl9jbGFzczIiLCJfQmFzZUNvbnRyb2xsZXJFeHRlbnMiLCJfdGhpcyIsIl9sZW4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY2FsbCIsInN5bmNUYXNrcyIsIlByb21pc2UiLCJyZXNvbHZlIiwiaGFuZGxlU2lkZUVmZmVjdHMiLCJsaXN0QmluZGluZyIsImNyZWF0aW9uUHJvbWlzZSIsInBhcmVudENvbnRleHQiLCJuZXdDb250ZXh0IiwiY3JlYXRlZCIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsImdldFZpZXciLCJnZXRCaW5kaW5nQ29udGV4dCIsImVycm9yIiwiTG9nIiwiY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwidmFsaWRhdGlvbk1lc3NhZ2VzIiwidGFibGUiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJnZXRDcmVhdGlvblJvdyIsImRhdGEiLCJjdXN0b21WYWxpZGl0eSIsImdldFByb3BlcnR5IiwiY3VzdG9tTWVzc2FnZXMiLCJmaWVsZENvbnRyb2wiLCJmaW5hbFRhcmdldCIsIm9sZE1lc3NhZ2VzIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZpbHRlciIsIm1lc3NhZ2UiLCJnZXRDb2RlIiwicmVtb3ZlTWVzc2FnZXMiLCJmb3JFYWNoIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0IiwiRWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwiZmllbGRJZCIsImdldFBhdGgiLCJnZXRCaW5kaW5nUGF0aCIsImdldFRhcmdldHMiLCJzb21lIiwidGFyZ2V0IiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZVRleHQiLCJwcm9jZXNzb3IiLCJnZXRNb2RlbCIsInR5cGUiLCJNZXNzYWdlVHlwZSIsIkVycm9yIiwiY29kZSIsInRlY2huaWNhbCIsInBlcnNpc3RlbnQiLCJleGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyIsImFkZENvbnRyb2xJZCIsInB1c2giLCJ0ZXh0IiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJzaG93TWVzc2FnZURpYWxvZyIsInJlc29sdmVDcmVhdGlvbk1vZGUiLCJpbml0aWFsQ3JlYXRpb25Nb2RlIiwiY3JlYXRlRGF0YSIsIkNyZWF0aW9uTW9kZSIsIk5ld1BhZ2UiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJwcm9ncmFtbWluZ01vZGVsIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsImlzUmVsYXRpdmUiLCJkYXRhTW9kZWxMaXN0QmluZGluZ1BhdGgiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJnZXRNZXRhQ29udGV4dCIsImVudGl0eVNldCIsInRhcmdldEVudGl0eVNldCIsIm5ld0FjdGlvbiIsIkRyYWZ0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIk5ld0FjdGlvbiIsInRvU3RyaW5nIiwidGFyZ2V0RW50aXR5VHlwZSIsImFjdGlvbnMiLCJwYXJhbWV0ZXJzIiwiRGVmZXJyZWQiLCJjcmVhdGlvblBhcmFtZXRlcnMiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsImdldENyZWF0aW9uUGFyYW1ldGVycyIsImdldEFwcENvbXBvbmVudCIsIkFzeW5jIiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJvbkluaXQiLCJfaGlkZGVuRHJhZnQiLCJnZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcyIsImdldENhcGFiaWxpdGllcyIsIkhpZGRlbkRyYWZ0IiwiZ2V0SW50ZXJmYWNlIiwiYmFzZSIsImVkaXREb2N1bWVudCIsImNvbnRleHQiLCJ0cmFuc2FjdGlvbkhlbHBlciIsInJvb3RWaWV3Q29udHJvbGxlciIsIl9nZXRSb290Vmlld0NvbnRyb2xsZXIiLCJtb2RlbCIsInZpZXdEYXRhIiwiZ2V0Vmlld0RhdGEiLCJncm91cElkIiwibWVzc2FnZUhhbmRsaW5nS2V5IiwicmVnaXN0ZXJUb0hvbGRNZXNzYWdlcyIsInJvb3RDb250ZXh0IiwiZ2V0Um9vdENvbnRleHQiLCJlZGl0RmxvdyIsIm9uQmVmb3JlRWRpdCIsInJpZ2h0bW9zdENvbnRleHQiLCJfaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsInVuZGVmaW5lZCIsInRyYW5zYWN0aW9uRGV0YWlscyIsIm5ld0RvY3VtZW50Q29udGV4dFByb21pc2UiLCJyb290Q29udGV4dEluZm8iLCJyb290U2libGluZ1BhdGhQcm9taXNlIiwiX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMiLCJzaWJsaW5nSW5mb1Byb21pc2UiLCJjb21wdXRlU2libGluZ0luZm8iLCJ2aWV3TGV2ZWwiLCJfY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInN1Ym1pdEJhdGNoIiwic2libGluZ0luZm8iLCJuZXdEb2N1bWVudENvbnRleHQiLCJjb250ZXh0VG9OYXZpZ2F0ZSIsIl9nZXROYXZpZ2F0aW9uVGFyZ2V0Rm9yRWRpdCIsIl91cGRhdGVQYXRoc0luSGlzdG9yeSIsIm92ZXJyaWRlTWVzc2FnZVVJRGVjaXNpb24iLCJTdGlja3kiLCJNb2RlbEhlbHBlciIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwiZXhpc3RpbmdEcmFmdFJldXNlZCIsImNvbGxhYm9yYXRpdmVEcmFmdCIsInNldEluaXRpYWxTaGFyZSIsIm9uQWZ0ZXJFZGl0IiwiX2hhbmRsZU5ld0NvbnRleHQiLCJlZGl0YWJsZSIsInJlY3JlYXRlQ29udGV4dCIsImZvcmNlRm9jdXMiLCJzdGlja3lDb250ZXh0IiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsImhhbmRsZVN0aWNreU9uIiwiaGFuZGxlSGlkZGVuRHJhZnRFZGl0Iiwic2V0RWRpdE1vZGUiLCJFZGl0YWJsZSIsInNldERvY3VtZW50TW9kaWZpZWQiLCJ1bkhvbGRLZXkiLCJvdmVycmlkZVVJRGVjaXNpb24iLCJyZWplY3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZSIsImlnbm9yZVRyYW5zaWVudENvbnRleHRzIiwic3RhdGVNZXNzYWdlc1BhdGgiLCJnZXRNZXNzYWdlc1BhdGgiLCJpc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwibGlzdEJpbmRpbmdSZWxhdGl2ZVBhdGgiLCJnZXRSZWxhdGl2ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJDb21tb25VdGlscyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsImNvbnRleHRzVG9EZWxldGUiLCJiZWZvcmVEZWxldGVDYWxsQmFjayIsIm9uQmVmb3JlRGVsZXRlIiwidGFibGVBUEkiLCJpc0lubGluZUNyZWF0aW9uUm93cyIsImxvY2tPYmplY3QiLCJnZXRHbG9iYWxVSU1vZGVsIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJjb250cm9sSWQiLCJpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUiLCJpc0EiLCJnZXRQYXJlbnQiLCJ0YWJsZURlZmluaXRpb24iLCJjb250cm9sIiwiY3JlYXRpb25Nb2RlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwiaXNJbmFjdGl2ZSIsImdldEJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwic2VsZWN0ZWRDb250ZXh0cyIsImRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJyZXN1bHQiLCJjbGVhclNlbGVjdGlvbiIsInZpZXdCaW5kaW5nQ29udGV4dCIsImlzUm9vdCIsInJlZnJlc2hMaXN0QmluZGluZyIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwiaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQiLCJyZWNvbW1lbmRhdGlvbnMiLCJpZ25vcmVSZWNvbW1lbmRhdGlvbkZvckNvbnRleHRzIiwib25BZnRlckRlbGV0ZSIsImNvbnRleHRzIiwicmVtb3ZlRW1wdHlSb3dzTWVzc2FnZXMiLCJzZXRVcEVtcHR5Um93cyIsImdldENvbnRlbnQiLCJfc2VuZEFjdGl2aXR5IiwiQWN0aXZpdHkiLCJEZWxldGUiLCJ1bmxvY2siLCJ1cGRhdGVEb2N1bWVudCIsInVwZGF0ZWRDb250ZXh0IiwidXBkYXRlUHJvbWlzZSIsIm9yaWdpbmFsQmluZGluZ0NvbnRleHQiLCJpc0RyYWZ0IiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwic3luY1Rhc2siLCJzZXREcmFmdFN0YXR1cyIsIlNhdmluZyIsImN1cnJlbnRCaW5kaW5nQ29udGV4dCIsImVudGl0eVNldE5hbWUiLCJnZXRPYmplY3QiLCJzZW1hbnRpY0tleXMiLCJTZW1hbnRpY0tleUhlbHBlciIsImdldFNlbWFudGljS2V5cyIsImN1cnJlbnRTZW1hbnRpY01hcHBpbmciLCJfZ2V0U2VtYW50aWNNYXBwaW5nIiwiY3VycmVudFNlbWFudGljUGF0aCIsInNlbWFudGljUGF0aCIsInNDaGFuZ2VkUGF0aCIsImdldFNlbWFudGljUGF0aCIsIlNhdmVkIiwiQ2xlYXIiLCJzaG93TWVzc2FnZXMiLCJnZXRQYXJlbnRDb250ZXh0RnJvbVNlbGVjdGlvbiIsImNyZWF0ZURvY3VtZW50Iiwic291cmNlIiwibUluUGFyYW1ldGVycyIsIm9EYXRhTGlzdEJpbmRpbmciLCJkYXRhTW9kZWwiLCJzZWxlY3RlZFByb3BlcnRpZXMiLCIkc2VsZWN0IiwiJCRncm91cElkIiwiRXh0ZXJuYWwiLCJsaXN0QmluZGluZ0Zyb21QYXRoIiwiYmluZExpc3QiLCJjcmVhdGVBdEVuZCIsInJlc29sdmVkQ3JlYXRpb25Nb2RlIiwiZ2V0Um91dGVyUHJveHkiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJzaW5nbGVEcmFmdEZvckNyZWF0ZSIsImdldE1hbmlmZXN0IiwiYXBwIiwiZ2V0Um9vdEJpbmRpbmciLCJnZXRIZWFkZXJDb250ZXh0IiwibmV3QmluZGluZyIsImdldENvbnRleHQiLCJTb3J0ZXIiLCJGaWx0ZXIiLCJmaWx0ZXJzIiwicGF0aCIsIm9wZXJhdG9yIiwidmFsdWUxIiwiYW5kIiwicmVxdWVzdENvbnRleHRzIiwidGhlbiIsImRlc3Ryb3kiLCJfaGFuZGxlQ3JlYXRpb25Nb2RlIiwidkxpc3RCaW5kaW5nIiwiY3JlYXRlRXh0ZXJuYWxEb2N1bWVudCIsIm91dGJvdW5kIiwiY3JlYXRlRGVmZXJyZWREb2N1bWVudCIsIkNyZWF0aW9uUm93IiwiY3JlYXRpb25Sb3ciLCJjcmVhdGVDcmVhdGVSb3dEb2N1bWVudCIsInNraXBTaWRlRWZmZWN0cyIsIklubGluZSIsImNyZWF0ZURpYWxvZ0lubGluZURvY3VtZW50IiwidGFibGVJZCIsIkNyZWF0aW9uRGlhbG9nIiwiY3JlYXRpb25EaWFsb2dGaWVsZHMiLCJjcmVhdGVEaWFsb2dBbmRTYXZlRG9jdW1lbnQiLCJTeW5jIiwiY3JlYXRlU3luY0FzeW5jRG9jdW1lbnQiLCJiRnJvbURlZmVycmVkIiwiY3JlYXRlQWN0aW9uIiwicG9zdERvY3VtZW50Q3JlYXRpb24iLCJwcmVyZXF1aXNpdGUiLCJwYXJhbXMiLCJvbkFmdGVyQ3JlYXRlIiwibWV0YUNvbnRleHQiLCJzdGFydGluZ0VudGl0eVNldCIsImdldEludGVybmFsTW9kZWwiLCJzZXRQcm9wZXJ0eSIsImlzTGlzdEJpbmRpbmdBbmFseXRpY2FsIiwiZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQiLCJzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUiLCJDcmVhdGUiLCJpc0RyYWZ0Um9vdCIsImlzQ29ubmVjdGVkIiwiY3JlYXRpb24iLCJhcHBDb21wb25lbnQiLCJuYXZpZ2F0aW9uIiwiY3JlYXRpb25Sb3dDb250ZXh0IiwiZG9jdW1lbnRWYWxpZGF0aW9uIiwiZ2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24iLCJlbnRpdHlUeXBlIiwiY3JlYXRpb25Sb3dQYXlsb2FkIiwiX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyIsImF0dGFjaEV2ZW50T25jZSIsInNjcm9sbFRvSW5kZXgiLCJnZXRMZW5ndGgiLCJoYW5kbGVDcmVhdGVFdmVudHMiLCJPYmplY3QiLCJhc3NpZ24iLCJrZXlzIiwicHJvcGVydHlQYXRoIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJmaW5kSW5kZXgiLCJwcm9wZXJ0eSIsIm5hbWUiLCJtYXAiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJidXN5SWQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJhbm5vdGF0aW9uIiwiaWQiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIm9uQmVmb3JlQ3JlYXRlIiwic2tpcFBhcmFtZXRlckRpYWxvZyIsImdldFN0YXJ0dXBNb2RlIiwiQXV0b0NyZWF0ZSIsIl9nZXRSZXNvdXJjZU1vZGVsIiwiY3JlYXRpb25Sb3dMaXN0QmluZGluZyIsIm5ld1RyYW5zaWVudENvbnRleHQiLCJjcmVhdGUiLCJzZXRCaW5kaW5nQ29udGV4dCIsImNhdGNoIiwidHJhY2UiLCJkZWxldGUiLCJhbGwiLCJpc0xvY2tlZCIsImNvbnRleHRJbmRleCIsImdldEluZGV4IiwiYWdncmVnYXRpb25EYXRhIiwiZ2V0QWdncmVnYXRpb24iLCJpc0NyZWF0ZUluUGxhY2UiLCJjcmVhdGVJblBsYWNlIiwic2V0VGltZW91dCIsImdldEJ1c3kiLCJmb2N1c1JvdyIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJnZXRUZXh0IiwicGFyZW50SW5kZXgiLCJzYXZlZERvY3VtZW50Q29udGV4dCIsImFmdGVyQ3JlYXRlSW5EaWFsb2ciLCJvbkJlZm9yZVNhdmUiLCJzYXZlRG9jdW1lbnQiLCJvbkFmdGVyU2F2ZSIsInJlZnJlc2giLCJpdGVtSW5kZXgiLCJhZnRlckNyZWF0ZUNhbGxCYWNrIiwiZ2V0SW50ZXJuYWxSb3V0aW5nIiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMiLCJtb2RlIiwicm91dGluZ0xpc3RlbmVyIiwiY3JlYXRlQ29udGV4dFByb21pc2UiLCJjb3JlUmVzb3VyY2VCdW5kbGUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibmF2UGFyYW1ldGVycyIsInRyYW5zaWVudCIsIm5hdmlnYXRlVG9Db250ZXh0IiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwiQWN0aW9uRXhlY3V0aW9uRmFpbGVkIiwiQ3JlYXRpb25GYWlsZWQiLCJPbkJlZm9yZUNyZWF0ZUZhaWxlZCIsImluY2x1ZGVzIiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwiY29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJjcmVhdGVQYXRoIiwiZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsInZhbGlkYXRlRG9jdW1lbnQiLCJjcmVhdGlvblJvd09iamVjdHMiLCJjcmVhdGVNdWx0aXBsZURvY3VtZW50cyIsImRhdGFGb3JDcmVhdGUiLCJpc0Zyb21Db3B5UGFzdGUiLCJjcmVhdGVBc0luYWN0aXZlIiwidGFyZ2V0TGlzdEJpbmRpbmciLCJtZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiY3JlYXRpb25Qcm9taXNlcyIsInByb3BlcnR5VmFsdWVzIiwiY3JlYXRlUGFyYW1ldGVycyIsImluYWN0aXZlIiwiJGtpbmQiLCJjcmVhdGVkQ29udGV4dHMiLCJhY3RpdmVDb250ZXh0cyIsImVyciIsIl9tUGFyYW1ldGVycyIsIm9uQmVmb3JlRGlzY2FyZCIsIm9uQmVmb3JlRXhlY3V0ZUFjdGlvbiIsIm9uQWZ0ZXJEaXNjYXJkIiwib0NvbnRleHQiLCJtUGFyYW1ldGVycyIsImlubGluZUVkaXRGbG93IiwiaXNJbmxpbmVFZGl0UG9zc2libGUiLCJpbmxpbmVFZGl0U2F2ZSIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYUJpbmRpbmdzIiwiYmluZGluZ3MiLCJtZXJnZVBhdGNoRHJhZnQiLCJfc3VibWl0T3BlbkNoYW5nZXMiLCJyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4iLCJjaGVja1JlY29tbWVuZGF0aW9uT3B0aW9uIiwic1Byb2dyYW1taW5nTW9kZWwiLCJpc0ZjbEVuYWJsZWQiLCJfc2lkZUVmZmVjdHMiLCJoYW5kbGVQYWdlQ2hhbmdlQ29udGV4dCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiYWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiZ2V0Q3JlYXRpb25Nb2RlIiwiaXNTdGFuZGFyZFNhdmUiLCJfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsImhhbmRsZVNlc3Npb25PZmYiLCJBY3RpdmF0ZSIsImRpc2Nvbm5lY3QiLCJfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkiLCJTdGFuZGFyZEFjdGlvbnMiLCJzYXZlIiwiVHJpZ2dlclR5cGUiLCJzdGFuZGFyZEFjdGlvbiIsIkRpc3BsYXkiLCJzdG9yZURhdGFGb3JUZWxlbWV0cnkiLCJfY3JlYXRlU2libGluZ0luZm8iLCJwcmV2aW91c1NlbWFudGljUGF0aCIsIm5ld1NlbWFudGljUGF0aCIsInBhdGhNYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJzdGF5T25DdXJyZW50UGFnZUFmdGVyU2F2ZSIsInRhcmdldENvbnRleHQiLCJza2lwQmluZGluZ1RvVmlldyIsIm9FcnJvciIsImNhbmNlbGVkIiwidG9nZ2xlRHJhZnRBY3RpdmUiLCJvQ29udGV4dERhdGEiLCJiSXNEcmFmdCIsIklzQWN0aXZlRW50aXR5IiwiSGFzQWN0aXZlRW50aXR5IiwiSGFzRHJhZnRFbnRpdHkiLCJvUm9vdFZpZXdDb250cm9sbGVyIiwib1JpZ2h0bW9zdENvbnRleHQiLCJsYXN0U2VtYW50aWNNYXBwaW5nIiwidGVjaG5pY2FsUGF0aCIsInRhcmdldFBhdGgiLCJjYW5jZWxEb2N1bWVudCIsImlzTmV3RG9jdW1lbnQiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJlbmFibGVkIiwiY2FuY2VsUGFyYW1ldGVycyIsImNhbmNlbEJ1dHRvbiIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwicm9vdENvbnRleHRQYXRoIiwiZ2V0RHJhZnRSb290UGF0aCIsImNhbmNlbFJlc3VsdCIsImlzRG9jdW1lbnRNb2RpZmllZCIsImdldEluc3RhbmNlZFZpZXdzIiwidmlldyIsImlzS2VlcEFsaXZlIiwic2V0S2VlcEFsaXZlIiwiRGlzY2FyZCIsInNraXBCYWNrTmF2aWdhdGlvbiIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0Iiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsInN0YXlPbkN1cnJlbnRQYWdlQWZ0ZXJDYW5jZWwiLCJfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyIsInNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlIiwiYmluZGluZ1BhcmFtZXRlcnMiLCJjcmVhdGVSb290Q29udGV4dCIsImlzUm9vdENvbnRleHROZXciLCJkcmFmdFByb3BlcnRpZXMiLCJyZXF1ZXN0UHJvcGVydHkiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsInNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCIsImNsb3NlT25Ccm93c2VyTmF2aWdhdGlvbiIsImRldGFjaEFmdGVyUm91dGVNYXRjaGVkIiwiZGVsZXRlRG9jdW1lbnQiLCJvQXBwQ29tcG9uZW50Iiwic2libGluZ0NvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsImRyYWZ0UGF0aCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiZHJhZnRDb250ZXh0VG9SZW1vdmUiLCJyZXBsYWNlV2l0aCIsImNvbnRleHRCaW5kaW5nIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwiRGVlcGxpbmsiLCJleGl0RnJvbUFwcCIsImFwcGx5RG9jdW1lbnQiLCJvTG9ja09iamVjdCIsImlzQ29udGludWUiLCJzaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyIsIlJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24iLCJDb250aW51ZSIsImNhbGxFeHRlbnNpb24iLCJpbnZva2VBY3Rpb24iLCJzQWN0aW9uTmFtZSIsIm1FeHRyYVBhcmFtcyIsImFQYXJ0cyIsInNPdmVybG9hZEVudGl0eVR5cGUiLCJvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyIsIm9WaWV3IiwiaXNBcnJheSIsImlzTmF2aWdhYmxlIiwicmVxdWlyZXNOYXZpZ2F0aW9uIiwiY29udmVydGVkTWV0YWRhdGEiLCJjb252ZXJ0VHlwZXMiLCJlbnRpdHlDb250YWluZXIiLCJpc0JvdW5kIiwib0NvbnRyb2wiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImlnbm9yZUVUYWciLCJzcGxpdCIsInJlcGxhY2VBbGwiLCJiU3RhdGljQWN0aW9uIiwiX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgiLCJlbmFibGVBdXRvU2Nyb2xsIiwiY3JlYXRlQWN0aW9uUHJvbWlzZSIsImdldElkIiwicmVzcG9uc2UiLCJjYWxsQWN0aW9uIiwic3VjY2Vzc0Z1bGxFeGVjdXRpb24iLCJpc0Z1bGZpbGxlZCIsImxpc3RSZWZyZXNoZWQiLCJfcmVmcmVzaExpc3RJZlJlcXVpcmVkIiwiZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsIkFjdGlvbiIsInZhbHVlIiwiYm91bmRDb250ZXh0IiwiYWN0aW9uIiwiZlJlc29sdmVyIiwiY29udmVydGVyVHlwZSIsIl9nZXRCb3VuZENvbnRleHQiLCJyZXR1cm5lZENvbnRleHQiLCJvTWV0YU1vZGVsIiwic0NvbnRleHRNZXRhUGF0aCIsIl9mblZhbGlkQ29udGV4dHMiLCJhcHBsaWNhYmxlQ29udGV4dHMiLCJlbGVtZW50Iiwib0FjdGlvbkNvbnRleHQiLCJzQWN0aW9uQ29udGV4dE1ldGFQYXRoIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJpbmZvIiwib25BZnRlckFjdGlvbkV4ZWN1dGlvbiIsIm9SZXN1bHQiLCJmUmVqZWN0b3IiLCJfYWN0aW9uTmFtZSIsImN1c3RvbU1hc3NFZGl0U2F2ZSIsInNlY3VyZWRFeGVjdXRpb24iLCJmbkZ1bmN0aW9uIiwiYkJ1c3lTZXQiLCJidXN5Iiwic2V0IiwiYkJ1c3lDaGVjayIsImNoZWNrIiwiYlVwZGF0ZXNEb2N1bWVudCIsInVwZGF0ZXNEb2N1bWVudCIsImZpbmFsbHkiLCJoYW5kbGVQYXRjaFNlbnQiLCJvRXZlbnQiLCJpbnRlcm5hbENvbnRleHQiLCJ1aUNvbnRleHQiLCJnZXRTb3VyY2UiLCJzZXRJZ25vcmVFVGFnIiwiaGFuZGxlSW5saW5lRWRpdFBhdGNoU2VudCIsInNvdXJjZUJpbmRpbmciLCJvUGF0Y2hQcm9taXNlIiwicGF0Y2hDb21wbGV0ZWRFdmVudCIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaCIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiaGFuZGxlQ3JlYXRlU2VudCIsImV2ZW50IiwibmV3VGFzayIsImRlYnVnIiwiY29tcHV0ZU1vZGVsc0ZvckVkaXRNb2RlIiwiZ2xvYmFsTW9kZWwiLCJmb3JjZURpc3BsYXlNb2RlIiwiaXNBY3RpdmVFbnRpdHkiLCJyZXF1ZXN0T2JqZWN0IiwiYWN0aXZhdGVDb2xsYWJvcmF0aW9uIiwiZmV0Y2hDb2xsYWJvcmF0aXZlRHJhZnRVc2Vyc1Byb21pc2UiLCJoYXNBY3RpdmVFbnRpdHkiLCJsYXN0SW52b2tlZEFjdGlvbk5hbWUiLCJpc05ld0FjdGlvbkZvclN0aWNreSIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsInNvdXJjZUNvbnRyb2wiLCJnZXRSZXNvdXJjZU1vZGVsIiwiVHJhbnNhY3Rpb25IZWxwZXIiLCJtZXNzYWdlSGFuZGxlciIsImdldFBhZ2VJbnRlcm5hbE1vZGVsIiwic2V0Q3JlYXRpb25Nb2RlIiwiYkNyZWF0aW9uTW9kZSIsInBhZ2VJbnRlcm5hbENvbnRleHQiLCJVaU1vZGVsQ29uc3RhbnRzIiwiQ3JlYXRlTW9kZSIsIkRvY3VtZW50TW9kaWZpZWQiLCJtb2RpZmllZCIsImJpbmRpbmciLCJtZXNzYWdlSGFuZGxpbmdLZXlTZXRzIiwiYXR0YWNoRXZlbnQiLCJldmVudEluc3RhbmNlIiwiZmluZCIsInN1Y2Nlc3MiLCJkcmFmdFN0YXR1cyIsImVkaXRNb2RlIiwiaXNDcmVhdGlvbiIsImZvcmNlZCIsInNoYWxsRm9yY2VEcmFmdFNhdmVPckRpc2NhcmQiLCJhY3Rpb25OYW1lIiwic3RpY2t5U2Vzc2lvbiIsIkFkZGl0aW9uYWxOZXdBY3Rpb25zIiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwicmVnaXN0ZXJDYWxsYmFja3MiLCJoYXNoVHJhY2tlciIsImdldEhhc2giLCJpbnRlcm5hbE1vZGVsIiwic2V0TmF2aWdhdGlvbkd1YXJkIiwic3Vic3RyaW5nIiwib25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbiIsImJpbmQiLCJpMThuTW9kZWwiLCJnZXREaXJ0eVN0YXRlUHJvdmlkZXIiLCJnZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbiIsImdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24iLCJoaWRkZW5EcmFmdENvbnRleHQiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwidW5yZWdpc3RlckNhbGxiYWNrcyIsImdldEh0dHBIZWFkZXJzIiwibmF2aWdhdGlvbkNvbnRleHQiLCJ0YXJnZXRIYXNoIiwiaW5uZXJBcHBSb3V0ZSIsInJvdXRlclByb3h5IiwibGNsSGFzaFRyYWNrZXIiLCJpc0RpcnR5IiwiaXNTZXNzaW9uT24iLCJpc05hdmlnYXRpb25GaW5hbGl6ZWQiLCJjaGVja0hhc2hXaXRoR3VhcmQiLCJpc0d1YXJkQ3Jvc3NBbGxvd2VkQnlVc2VyIiwic2V0RGlydHlGbGFnIiwid2FybmluZ0RpYWxvZyIsIkRpYWxvZyIsInN0YXRlIiwiY29udGVudCIsIlRleHQiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInByZXNzIiwiYWZ0ZXJDbG9zZSIsImFkZFN0eWxlQ2xhc3MiLCJzZXRNb2RlbCIsImFkZERlcGVuZGVudCIsIm9wZW4iLCJjb250ZXh0UGF0aCIsImN1cnJlbnRIYXNoIiwiaGFuZGxlSGlkZGVuRHJhZnREaXNjYXJkIiwiZGlzY2FyZFN0aWNreVNlc3Npb24iLCJjbGVhclNlc3Npb25Db250ZXh0IiwiZGlzY2FyZENvbnRleHQiLCJkaXNjYXJkSGlkZGVuRHJhZnRTZXNzaW9uIiwicmVzZXRDaGFuZ2VzIiwiZGlzY2FyZGVkQ29udGV4dCIsInN0aWNreSIsImRpc2NhcmREb2N1bWVudCIsImRyYWZ0RGF0YUxvc3NQb3B1cCIsImRpc2NhcmREcmFmdCIsIl9yb3V0aW5nIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInJlc29sdmVGdW5jdGlvbiIsInJlamVjdEZ1bmN0aW9uIiwiYWN0aW9uUHJvbWlzZSIsImN1cnJlbnRWaWV3IiwibWV0YU1vZGVsRGF0YSIsIm1ldGFNb2RlbEFjdGlvbiIsImFjdGlvblJldHVyblR5cGUiLCIkUmV0dXJuVHlwZSIsIiRUeXBlIiwiJEtleSIsIm9EYXRhIiwiZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsImlzU2F2ZSIsImNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2ciLCJDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2ciLCJfc2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93Iiwicm93QmluZGluZyIsImFjdGl2ZVJvd0luZGV4IiwiZ2V0Q291bnQiLCJhbGxSb3dDb250ZXh0cyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImluZGV4Iiwic2luZ2xlQ29udGV4dCIsImNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzIiwiaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSIsInJlbGF0ZWRDb250ZXh0cyIsInRyaWdnZXJlZEFjdGlvbk5hbWUiLCJhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzIiwic2VuZCIsInRyaWdnZXJUeXBlIiwidHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkiLCJvTW9kZWwiLCJvUmVxdWVzdG9yIiwid2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyIsImNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkIiwicHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uIiwiaGlzdG9yeSIsImJhY2siLCJuYXZpZ2F0aW9uUGFyYW1ldGVycyIsInBlcnNpc3RPUFNjcm9sbCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJFZGl0Rmxvd0FjdGlvbiIsInNob3dQbGFjZWhvbGRlciIsImtlZXBDdXJyZW50TGF5b3V0IiwiYlJlZnJlc2hBZnRlckFjdGlvbiIsInZpc2libGVWaWV3SWRzIiwiX2dldEFsbFZpc2libGVWaWV3cyIsImFNZXNzYWdlcyIsInZhbGlkYXRpb24iLCJnZXRDb250cm9sSWQiLCJvUmVzcG9uc2UiLCJvQmluZGluZyIsImFLZXlzIiwib0N1cnJlbnREYXRhIiwiYlJldHVybmVkQ29udGV4dElzU2FtZSIsImV2ZXJ5Iiwic0tleSIsInNFbnRpdHlTZXROYW1lIiwiYVNlbWFudGljS2V5cyIsInBhdGhzIiwib0tleSIsIiRQcm9wZXJ0eVBhdGgiLCJvdmVybG9hZEVudGl0eVR5cGUiLCJjb250ZXh0U2VnbWVudHMiLCJjdXJyZW50Q29udGV4dCIsInBvcCIsInVuc2hpZnQiLCJwYXJlbnRDb250ZXh0cyIsInBhdGhTZWdtZW50IiwicmV2ZXJzZSIsIm92ZXJsb2FkQ29udGV4dCIsIm1hcHBpbmdzIiwic2V0UGF0aE1hcHBpbmciLCJyb290Q3VycmVudENvbnRleHQiLCJyaWdodG1vc3RDdXJyZW50Q29udGV4dCIsImRvTm90Q29tcHV0ZUlmUm9vdCIsInN0YXJ0c1dpdGgiLCJyaWdodE1vc3RDb250ZXh0VG9Vc2UiLCJkcmFmdCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJjcmVhdGVOZXh0RG9jdW1lbnQiLCJiaW5kaW5nQ29udGV4dFBhdGgiLCJsaXN0QmluZGluZ1BhdGgiLCJsYXN0SW5kZXhPZiIsIkJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIiwiX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBJUm93QmluZGluZ0ludGVyZmFjZSBmcm9tIFwic2FwL2ZlL2NvcmUvSVJvd0JpbmRpbmdJbnRlcmZhY2VcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IEJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CYXNlQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IFN0YW5kYXJkQWN0aW9ucywgVHJpZ2dlclR5cGUsIHRyaWdnZXJDb25maWd1cmVkU3VydmV5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ZlZWRiYWNrXCI7XG5pbXBvcnQgdHlwZSBJbnRlcm5hbFJvdXRpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgdHlwZSB7IEN1c3RvbU1lc3NhZ2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7IEFjdGl2aXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHR5cGUge1xuXHRDYW5jZWxQYXJhbWV0ZXJzLFxuXHRDcmVhdGVQYXJhbWV0ZXJzLFxuXHRFZGl0VHJhbnNhY3Rpb25FeGVjdXRpb25EZXRhaWxzXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9UcmFuc2FjdGlvbkhlbHBlclwiO1xuaW1wb3J0IFRyYW5zYWN0aW9uSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9UcmFuc2FjdGlvbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMsIFJvb3RDb250ZXh0SW5mbywgU2libGluZ0luZm9ybWF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgVWlNb2RlbENvbnN0YW50cyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZWRpdEZsb3dDb25zdGFudHNcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IHR5cGUgeyBIaWRkZW5EcmFmdCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsQWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBEcmFmdFNpYmxpbmdQYWlyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRGVsZXRlSGVscGVyXCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIEZjbENvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L0ZjbC5jb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBSb290Vmlld0Jhc2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9yb290Vmlldy9Sb290Vmlld0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycywgU2VtYW50aWNNYXBwaW5nIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgTWFjcm9UYWJsZSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8gfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGQgZnJvbSBcInNhcC91aS9tZGMvTXVsdGlWYWx1ZUZpZWxkXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ3JlYXRpb25Sb3cgZnJvbSBcInNhcC91aS9tZGMvdGFibGUvQ3JlYXRpb25Sb3dcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgU29ydGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvU29ydGVyXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIENvbnRleHQsIGRlZmF1bHQgYXMgT0RhdGFWNENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFDb250ZXh0QmluZGluZyRQYXRjaFNlbnRFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEVudGl0eVR5cGUgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwiLi4vQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHsgQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nLCBSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIH0gZnJvbSBcIi4uL2NvbnRyb2xzL1JlY29tbWVuZGF0aW9ucy9Db25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dcIjtcbmltcG9ydCB7IENyZWF0aW9uTW9kZSwgdHlwZSBCYXNlTWFuaWZlc3RTZXR0aW5ncyB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IGlzRnVsZmlsbGVkIH0gZnJvbSBcIi4uL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IGRyYWZ0RGF0YUxvc3NQb3B1cCBmcm9tIFwiLi9lZGl0Rmxvdy9kcmFmdERhdGFMb3NzUG9wdXBcIjtcbmltcG9ydCB0eXBlIHsgT3BlcmF0aW9uUmVzdWx0IH0gZnJvbSBcIi4vZWRpdEZsb3cvb3BlcmF0aW9ucy9PRGF0YU9wZXJhdGlvblwiO1xuaW1wb3J0IE5hdmlnYXRpb25SZWFzb24gZnJvbSBcIi4vcm91dGluZy9OYXZpZ2F0aW9uUmVhc29uXCI7XG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdENvbnN0YW50cyA9IEZFTGlicmFyeS5Db25zdGFudHMsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0U3RhcnR1cE1vZGUgPSBGRUxpYnJhcnkuU3RhcnR1cE1vZGU7XG5cbnR5cGUgU2F2ZURvY3VtZW50UGFyYW1ldGVycyA9IHtcblx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3I/OiBib29sZWFuO1xuXHRtZXJnZVBhdGNoRHJhZnQ/OiBib29sZWFuO1xuXHRza2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW47XG5cdGJpbmRpbmdzPzogT0RhdGFMaXN0QmluZGluZ1tdO1xuXHRpc1N0YW5kYXJkU2F2ZT86IGJvb2xlYW47XG59O1xuXG50eXBlIEludGVybmFsQ3JlYXRlUGFyYW1ldGVycyA9IHtcblx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRkYXRhPzogb2JqZWN0O1xuXHR0YWJsZUlkPzogc3RyaW5nO1xuXHRvdXRib3VuZD86IHN0cmluZztcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xufTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqIEBzaW5jZSAxLjkwLjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcIilcbmNsYXNzIEVkaXRGbG93IGV4dGVuZHMgQmFzZUNvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdHByaXZhdGUgc3luY1Rhc2tzOiBQcm9taXNlPHVua25vd24+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0cHJpdmF0ZSBhY3Rpb25Qcm9taXNlPzogUHJvbWlzZTx7IGNvbnRyb2xJZD86IHN0cmluZzsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9PjtcblxuXHRwcml2YXRlIGNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2c/OiBDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2c7XG5cblx0cHJpdmF0ZSBfaGlkZGVuRHJhZnQ6IEhpZGRlbkRyYWZ0IHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgZmV0Y2hDb2xsYWJvcmF0aXZlRHJhZnRVc2Vyc1Byb21pc2U6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuX2hpZGRlbkRyYWZ0ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpLmdldENhcGFiaWxpdGllcygpLkhpZGRlbkRyYWZ0IGFzIEhpZGRlbkRyYWZ0O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHVibGljIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHRnZXRJbnRlcmZhY2UoKTogQmFzZU9iamVjdCB7XG5cdFx0cmV0dXJuIHN1cGVyLmdldEludGVyZmFjZSgpO1xuXHR9XG5cblx0Z2V0QXBwQ29tcG9uZW50KCk6IEFwcENvbXBvbmVudCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZm9yIHRoZSBleGlzdGluZyBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGF2YWlsYWJsZSB3aXRoIHRoZSBlZGl0YWJsZSBjb250ZXh0XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGVkaXREb2N1bWVudChjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHZvaWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCB2aWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3M7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRjb25zdCBncm91cElkID0gXCJlZGl0R3JvdXBcIjtcblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCByb290Q29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Um9vdENvbnRleHQoY29udGV4dCk7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVFZGl0KHsgY29udGV4dDogcm9vdENvbnRleHQgfSk7XG5cblx0XHRcdGxldCByaWdodG1vc3RDb250ZXh0ID0gdGhpcy5faXNGY2xFbmFibGVkKCkgPyAocm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IGNvbnRleHQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHQocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwocmlnaHRtb3N0Q29udGV4dCkgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gd2UgY2hlY2sgdGhlIHJpZ2h0bW9zdENvbnRleHQgY2FuIGJlIHVzZWQgaW4gZHJhZnRcblx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCA9IGNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB0cmFuc2FjdGlvbkRldGFpbHM6IEVkaXRUcmFuc2FjdGlvbkV4ZWN1dGlvbkRldGFpbHMgPSB7fTtcblx0XHRcdGNvbnN0IG5ld0RvY3VtZW50Q29udGV4dFByb21pc2UgPSB0cmFuc2FjdGlvbkhlbHBlci5lZGl0RG9jdW1lbnQoXG5cdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHR0aGlzLmJhc2UuZ2V0VmlldygpLFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdGdyb3VwSWQsXG5cdFx0XHRcdHRyYW5zYWN0aW9uRGV0YWlsc1xuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJvb3RDb250ZXh0SW5mbyA9IHtcblx0XHRcdFx0cm9vdFNpYmxpbmdQYXRoUHJvbWlzZTogbmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZVxuXHRcdFx0fTtcblx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbCwgbW9kZWwpO1xuXG5cdFx0XHRsZXQgc2libGluZ0luZm9Qcm9taXNlO1xuXHRcdFx0Ly8gcmlnaHRtb3N0Q29udGV4dCA9PT0gcm9vdENvbnRleHQgPT4gd2UncmUgaW4gT1AuIElmIG5vdCwgd2UncmUgaW4gbXVsdGktY29sdW1uIGxheW91dCBvZiBGQ0xcblx0XHRcdGNvbnN0IGNvbXB1dGVTaWJsaW5nSW5mbyA9IHJpZ2h0bW9zdENvbnRleHQgIT09IHJvb3RDb250ZXh0IHx8ICh2aWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxO1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbykge1xuXHRcdFx0XHRzaWJsaW5nSW5mb1Byb21pc2UgPSB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQsXG5cdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0SW5mbyxcblx0XHRcdFx0XHRncm91cElkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRjb250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goZ3JvdXBJZCk7XG5cblx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHNpYmxpbmdJbmZvUHJvbWlzZTtcblx0XHRcdGNvbnN0IG5ld0RvY3VtZW50Q29udGV4dCA9IChhd2FpdCBuZXdEb2N1bWVudENvbnRleHRQcm9taXNlKSBhcyBDb250ZXh0O1xuXHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlOiBDb250ZXh0IHwgdW5kZWZpbmVkID0gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbyAmJiBjb250ZXh0VG9OYXZpZ2F0ZSkge1xuXHRcdFx0XHRpZiAoc2libGluZ0luZm8gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCxcblx0XHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0cm9vdENvbnRleHRJbmZvLFxuXHRcdFx0XHRcdFx0XCIkYXV0b1wiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHRoaXMuX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0KGNvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dCwgc2libGluZ0luZm8pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3RvcnkoW10pO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgb3ZlcnJpZGVNZXNzYWdlVUlEZWNpc2lvbiA9IGZhbHNlO1xuXHRcdFx0aWYgKG5ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgJiZcblx0XHRcdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbC5nZXRNZXRhTW9kZWwoKSkgJiZcblx0XHRcdFx0XHR0cmFuc2FjdGlvbkRldGFpbHMuZXhpc3RpbmdEcmFmdFJldXNlZCAhPT0gdHJ1ZVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQvLyBUaGUgaW5pdGlhbCBzaGFyZSBhY3Rpb24gc2hhbGwgYmUgY2FsbGVkICAoZXhjZXB0IGlmIHRoZSBkcmFmdCBhbHJlYWR5IGV4aXN0ZWQpXG5cdFx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5zZXRJbml0aWFsU2hhcmUodHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJFZGl0KHsgY29udGV4dDogY29udGV4dFRvTmF2aWdhdGUgfSk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUgYXMgQ29udGV4dCwge1xuXHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHJlY3JlYXRlQ29udGV4dDogZmFsc2UsXG5cdFx0XHRcdFx0Zm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0Ly8gVGhlIHN0aWNreU9uIGhhbmRsZXIgbXVzdCBiZSBzZXQgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gZG9uZSxcblx0XHRcdFx0XHQvLyBhcyB0aGUgVVJMIG1heSBjaGFuZ2UgaW4gdGhlIGNhc2Ugb2YgRkNMXG5cdFx0XHRcdFx0bGV0IHN0aWNreUNvbnRleHQ6IENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIHVzZSB0aGUga2VwdC1hbGl2ZSBjb250ZXh0IHVzZWQgdG8gYmluZCB0aGUgcGFnZVxuXHRcdFx0XHRcdFx0c3RpY2t5Q29udGV4dCA9IG5ld0RvY3VtZW50Q29udGV4dD8uZ2V0TW9kZWwoKS5nZXRLZWVwQWxpdmVDb250ZXh0KG5ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzdGlja3lDb250ZXh0ID0gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmhhbmRsZVN0aWNreU9uKHN0aWNreUNvbnRleHQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuX2hpZGRlbkRyYWZ0KSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5oYW5kbGVIaWRkZW5EcmFmdEVkaXQobmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvdmVycmlkZU1lc3NhZ2VVSURlY2lzaW9uID0gdHJ1ZTtcblxuXHRcdFx0XHQvLyBXZSBjaGFuZ2UgdGhlIGVkaXQgbW9kZSBhZnRlciB0aGUgcGFnZSBiaW5kaW5nIGhhcyBiZWVuIGRvbmUsIG90aGVyd2lzZSB0aGUgY3JlYXRpb24gb2YgZW1wdHkgcm93cyBtaWdodCBmYWlsIChhcyB0aGUgdGFibGUgaXMgc3RpbGwgb24gdGhlIGFjdGl2ZSB2ZXJzaW9uKVxuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCBmYWxzZSk7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSwgb3ZlcnJpZGVVSURlY2lzaW9uOiBvdmVycmlkZU1lc3NhZ2VVSURlY2lzaW9uIH0pO1xuXHRcdFx0cmV0dXJuIGNvbnRleHRUb05hdmlnYXRlO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGVkaXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgc2lkZSBlZmZlY3RzIHJlcXVpcmVkIGFmdGVyIGRlbGV0aW5nIGFuIG9iamVjdC5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgdGhlIGRlbGV0ZWQgb2JqZWN0IGJlbG9uZ3MgdG9cblx0ICogQHBhcmFtIHBhcmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHBhcmVudCBvYmplY3Qgb2YgdGhlIGRlbGV0ZWQgb2JqZWN0XG5cdCAqIEBwYXJhbSBpZ25vcmVUcmFuc2llbnRDb250ZXh0cyBJZiB0cnVlLCB0cmFuc2llbnQgY29udGV4dHMgYXJlIGlnbm9yZWRcblx0ICovXG5cdHByaXZhdGUgcmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyZW50Q29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZCxcblx0XHRpZ25vcmVUcmFuc2llbnRDb250ZXh0cyA9IGZhbHNlXG5cdCk6IHZvaWQge1xuXHRcdGlmIChwYXJlbnRDb250ZXh0ICYmIHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLCBwYXJlbnRDb250ZXh0LCBpZ25vcmVUcmFuc2llbnRDb250ZXh0cykpIHtcblx0XHRcdGNvbnN0IHN0YXRlTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksIHBhcmVudENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdC8vIEluIGNhc2Ugb2YgYSBUcmVlVGFibGUsIHdlIG5lZWQgdG8gcmVmcmVzaCBzdGF0ZSBtZXNzYWdlcyBmb3IgdGhlIE9iamVjdFBhZ2UsIGFzIHNvbWUgb2YgdGhlc2UgbWVzc2FnZXMgbWlnaHQgYmUgYXR0YWNoZWRcblx0XHRcdC8vIHRvIGNoaWxkcmVuIG9mIGEgZGVsZXRlZCByb3cgd2hpY2ggbWF5IG5vdCBoYXZlIGJlZW4gbG9hZGVkIHlldCwgYW5kIHRoZXJlZm9yZSB0aGUgbW9kZWwgd291bGRuJ3QgY2xlYW4gdXAgdGhlc2UgbWVzc2FnZXNcblx0XHRcdGlmIChzdGF0ZU1lc3NhZ2VzUGF0aCAmJiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3N0YXRlTWVzc2FnZXNQYXRoXSwgcGFyZW50Q29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBzaWRlIGVmZmVjdHMgcmVxdWlyZWQgd2hlbiBzdHJ1Y3R1cmFsIGNoYW5nZSAoY3JlYXRlL2RlbGV0ZSkgaXMgZG9uZSBpbnRvIGEgdGFibGUuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIHRoZSBkZWxldGVkIG9iamVjdCBiZWxvbmdzIHRvXG5cdCAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBwYXJlbnQgb2JqZWN0IG9mIHRoZSBkZWxldGVkIG9iamVjdFxuXHQgKiBAcGFyYW0gaWdub3JlVHJhbnNpZW50Q29udGV4dHMgSWYgdHJ1ZSwgdHJhbnNpZW50IGNvbnRleHRzIGFyZSBpZ25vcmVkXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgc2lkZSBlZmZlY3RzIHdlcmUgcmVxdWVzdGVkLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJlbnRDb250ZXh0OiBDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCxcblx0XHRpZ25vcmVUcmFuc2llbnRDb250ZXh0cyA9IGZhbHNlXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGlmIChwYXJlbnRDb250ZXh0KSB7XG5cdFx0XHRjb25zdCBsaXN0QmluZGluZ1JlbGF0aXZlUGF0aCA9IE1vZGVsSGVscGVyLmdldFJlbGF0aXZlTWV0YVBhdGhGb3JMaXN0QmluZGluZyhwYXJlbnRDb250ZXh0LCBsaXN0QmluZGluZyk7XG5cdFx0XHRpZiAoKGlnbm9yZVRyYW5zaWVudENvbnRleHRzIHx8ICFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KGxpc3RCaW5kaW5nKSkgJiYgbGlzdEJpbmRpbmdSZWxhdGl2ZVBhdGgpIHtcblx0XHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cyAoYW5kIHdlIGRvbid0IGlnbm9yZSB0aGlzIGNoZWNrKSwgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nUmVsYXRpdmVQYXRoLCBwYXJlbnRDb250ZXh0KTtcblxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgc2V2ZXJhbCBkb2N1bWVudHMuXG5cdCAqIEBwYXJhbSBjb250ZXh0c1RvRGVsZXRlIFRoZSBjb250ZXh0cyBvZiB0aGUgZG9jdW1lbnRzIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2tcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5ub0RpYWxvZ1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50cyBhcmUgZGVsZXRlZFxuXHQgKi9cblx0YXN5bmMgZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0Y29udGV4dHNUb0RlbGV0ZTogQ29udGV4dFtdLFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0Y29udHJvbElkOiBzdHJpbmc7XG5cdFx0XHRub0RpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM/OiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGU7XG5cdFx0cGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgPSBwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2U7XG5cdFx0bGV0IHRhYmxlQVBJOiBUYWJsZUFQSSB8IHVuZGVmaW5lZDtcblx0XHRsZXQgaXNJbmxpbmVDcmVhdGlvblJvd3MgPSBmYWxzZTtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgcGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpID8/IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdGxldCBpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGU6IENvbnRleHRbXSA9IFtdO1xuXHRcdGlmIChwYXJlbnRDb250cm9sPy5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0dGFibGVBUEkgPSBwYXJlbnRDb250cm9sLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdFx0aXNJbmxpbmVDcmVhdGlvblJvd3MgPSB0YWJsZUFQSS50YWJsZURlZmluaXRpb24/LmNvbnRyb2w/LmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cztcblx0XHRcdGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZSA9IGNvbnRleHRzVG9EZWxldGUuZmlsdGVyKChjb250ZXh0KSA9PiBjb250ZXh0LmlzSW5hY3RpdmUoKSk7XG5cdFx0fVxuXHRcdGlmICghcGFyZW50Q29udHJvbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwicGFyYW1ldGVyIGNvbnRyb2xJZCBtaXNzaW5nIG9yIGluY29ycmVjdFwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gcGFyZW50Q29udHJvbCBhcyBDb250cm9sO1xuXHRcdH1cblx0XHRjb25zdCBsaXN0QmluZGluZyA9IChwYXJlbnRDb250cm9sLmdldEJpbmRpbmcoXCJpdGVtc1wiKSB8fCAocGFyZW50Q29udHJvbCBhcyBUYWJsZSkuZ2V0Um93QmluZGluZygpKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdHBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cyA9IHRydWU7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmICh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwocGFyYW1ldGVycz8uc2VsZWN0ZWRDb250ZXh0cz8uWzBdID8/IGNvbnRleHRzVG9EZWxldGVbMF0pID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLmRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oY29udGV4dHNUb0RlbGV0ZSwgcGFyYW1ldGVycyk7XG5cblx0XHRcdGxldCByZXN1bHQ7XG5cblx0XHRcdC8vIE11bHRpcGxlIG9iamVjdCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhIGxpc3Rcblx0XHRcdC8vIEZpcnN0IGNsZWFyIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHRhYmxlIGFzIGl0J3Mgbm90IHZhbGlkIGFueSBtb3JlXG5cdFx0XHRpZiAocGFyZW50Q29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRwYXJlbnRDb250cm9sLmNsZWFyU2VsZWN0aW9uKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZW4gcmVmcmVzaCB0aGUgbGlzdC1iaW5kaW5nIChMUiksIG9yIHJlcXVpcmUgc2lkZS1lZmZlY3RzIChPUClcblx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1Jvb3QoKSkge1xuXHRcdFx0XHQvLyBrZWVwIHByb21pc2UgY2hhaW4gcGVuZGluZyB1bnRpbCByZWZyZXNoIG9mIGxpc3RiaW5kaW5nIGlzIGNvbXBsZXRlZFxuXHRcdFx0XHRyZXN1bHQgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkucmVmcmVzaExpc3RCaW5kaW5nKGxpc3RCaW5kaW5nLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdH0gZWxzZSBpZiAocGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0dGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZShsaXN0QmluZGluZywgdmlld0JpbmRpbmdDb250ZXh0LCBpc0lubGluZUNyZWF0aW9uUm93cyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGRlbGV0aW5nIGF0IGxlYXN0IG9uZSBvYmplY3Qgc2hvdWxkIGFsc28gc2V0IHRoZSBVSSB0byBkaXJ0eVxuXHRcdFx0aWYgKCF0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGlzUmVjb21tZW5kYXRpb25FbmFibGVkID0gdGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pc1JlY29tbWVuZGF0aW9uRW5hYmxlZCgpO1xuXHRcdFx0Ly8gV2UgY2xlYXIgcmVjb21tZW5kYXRpb24gZGF0YSBhbmQgY29udGV4dHMgZnJvbSBpbnRlcm5hbCBtb2RlbCBmb3IgdGhlIGRlbGV0ZWQgY29udGV4dHNcblx0XHRcdGlmIChpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCkge1xuXHRcdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMoY29udGV4dHNUb0RlbGV0ZSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBOb3RpZnkgY29uc3VtZXJzIG9mIHdoaWNoIGNvbnRleHRzIHdlcmUgZGVsZXRlZFxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEZWxldGUoeyBjb250ZXh0czogY29udGV4dHNUb0RlbGV0ZSB9KTtcblxuXHRcdFx0aWYgKHRhYmxlQVBJKSB7XG5cdFx0XHRcdGlmIChpc0lubGluZUNyZWF0aW9uUm93cyAmJiBpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHRhYmxlQVBJLnJlbW92ZUVtcHR5Um93c01lc3NhZ2VzKGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZSk7XG5cdFx0XHRcdFx0YXdhaXQgdGFibGVBUEkuc2V0VXBFbXB0eVJvd3ModGFibGVBUEkuZ2V0Q29udGVudCgpLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRlbGV0ZSwgY29udGV4dHNUb0RlbGV0ZSk7XG5cblx0XHRcdHJldHVybiBhd2FpdCByZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFdlIHN0aWxsIHdhbnQgdG8gcmVmcmVzaCB0aGUgbGlzdGJpbmRpbmcgaW4gY2FzZSB3ZSBkZWxldGVkIHNvbWUgaW5mb3JtYXRpb24gYnV0IG5vdCBldmVyeXRoaW5nIChEcmFmdHMgZm9yIGV4YW1wbGUpXG5cdFx0XHRpZiAobGlzdEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0Ly8ga2VlcCBwcm9taXNlIGNoYWluIHBlbmRpbmcgdW50aWwgcmVmcmVzaCBvZiBsaXN0YmluZGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdFx0YXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnJlZnJlc2hMaXN0QmluZGluZyhsaXN0QmluZGluZywgdGhpcy5nZXRBcHBDb21wb25lbnQoKSk7XG5cdFx0XHR9IGVsc2UgaWYgKHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdFx0dGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZShsaXN0QmluZGluZywgdmlld0JpbmRpbmdDb250ZXh0LCBpc0lubGluZUNyZWF0aW9uUm93cyk7XG5cdFx0XHR9XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnQocylcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgZGlzcGxheXMgdGhlIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBlcnJvcnMgZHVyaW5nIGFuIHVwZGF0ZS5cblx0ICogQHBhcmFtIHVwZGF0ZWRDb250ZXh0IENvbnRleHQgb2YgdGhlIHVwZGF0ZWQgZmllbGRcblx0ICogQHBhcmFtIHVwZGF0ZVByb21pc2UgUHJvbWlzZSB0byBkZXRlcm1pbmUgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuIFRoZSBwcm9taXNlIHNob3VsZCBiZSByZXNvbHZlZCB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgc28gdGhlIGRyYWZ0IHN0YXR1cyBjYW4gYmUgdXBkYXRlZC5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRyYWZ0IHN0YXR1cyBoYXMgYmVlbiB1cGRhdGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHVwZGF0ZURvY3VtZW50KHVwZGF0ZWRDb250ZXh0OiBCaW5kaW5nIHwgQ29udGV4dCwgdXBkYXRlUHJvbWlzZTogUHJvbWlzZTx1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9yaWdpbmFsQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGlzRHJhZnQgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwodXBkYXRlZENvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB1cGRhdGVQcm9taXNlO1xuXHRcdFx0XHRjb25zdCBjdXJyZW50QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKCFpc0RyYWZ0IHx8ICFjdXJyZW50QmluZGluZ0NvbnRleHQgfHwgY3VycmVudEJpbmRpbmdDb250ZXh0ICE9PSBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0Ly8gSWYgYSBuYXZpZ2F0aW9uIGhhcHBlbmVkIHdoaWxlIG9Qcm9taXNlIHdhcyBiZWluZyByZXNvbHZlZCwgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBjaGFuZ2VkXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UncmUgc3RpbGwgb24gdGhlIHNhbWUgY29udGV4dFxuXHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0TmFtZSA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKTtcblx0XHRcdFx0Y29uc3Qgc2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG1ldGFNb2RlbCwgZW50aXR5U2V0TmFtZSk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRzZW1hbnRpY0tleXM/Lmxlbmd0aCAmJlxuXHRcdFx0XHRcdGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZSAmJiAvLyBXZSBkb24ndCB1c2UgdGhlIHNlbWFudGljIGtleSBmb3IgYSBuZXcgZG9jdW1lbnQgKGNyZWF0aW9uKVxuXHRcdFx0XHRcdGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSA9PT0gdHJ1ZVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFNlbWFudGljUGF0aCA9IGN1cnJlbnRTZW1hbnRpY01hcHBpbmc/LnNlbWFudGljUGF0aCxcblx0XHRcdFx0XHRcdHNDaGFuZ2VkUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChjdXJyZW50QmluZGluZ0NvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdC8vIGN1cnJlbnRTZW1hbnRpY1BhdGggY291bGQgYmUgbnVsbCBpZiB3ZSBoYXZlIG5hdmlnYXRlZCB2aWEgZGVlcCBsaW5rIHRoZW4gdGhlcmUgYXJlIG5vIHNlbWFudGljTWFwcGluZ3MgdG8gY2FsY3VsYXRlIGl0IGZyb21cblx0XHRcdFx0XHRpZiAoY3VycmVudFNlbWFudGljUGF0aCAmJiBjdXJyZW50U2VtYW50aWNQYXRoICE9PSBzQ2hhbmdlZFBhdGgpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY3VycmVudEJpbmRpbmdDb250ZXh0LCB7IGVkaXRhYmxlOiB0cnVlLCByZWNyZWF0ZUNvbnRleHQ6IGZhbHNlIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgdXBkYXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdGlmIChpc0RyYWZ0ICYmIG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRQYXJlbnRDb250ZXh0RnJvbVNlbGVjdGlvbihzZWxlY3RlZENvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdIHwgdW5kZWZpbmVkKTogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdGlmIChzZWxlY3RlZENvbnRleHRzICYmIHNlbGVjdGVkQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gT25lIHBhcmVudCBhdCBtb3N0ICEhXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUgYSBuZXcgZG9jdW1lbnQgaW4gYSBUcmVlVGFibGUgd2l0aCAke3NlbGVjdGVkQ29udGV4dHMubGVuZ3RofSBwYXJlbnRzYCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNlbGVjdGVkQ29udGV4dHM/Lmxlbmd0aCA9PT0gMSA/IHNlbGVjdGVkQ29udGV4dHNbMF0gOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gKiBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBTeW5jIC0gdGhlIGNyZWF0aW9uIGlzIHRyaWdnZXJlZCBhbmQgb25jZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCwgdGhlIG5hdmlnYXRpb24gaXMgZG9uZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBBc3luYyAtIHRoZSBjcmVhdGlvbiBhbmQgdGhlIG5hdmlnYXRpb24gdG8gdGhlIGluc3RhbmNlIGFyZSBkb25lIGluIHBhcmFsbGVsXG5cdC8vICogICAgICAgICAgICAgICAgICAgIERlZmVycmVkIC0gdGhlIGNyZWF0aW9uIGlzIGRvbmUgb24gdGhlIHRhcmdldCBwYWdlXG5cdC8vICogICAgICAgICAgICAgICAgICAgIENyZWF0aW9uUm93IC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIGFzeW5jIHNvIHRoZSB1c2VyIGlzIG5vdCBibG9ja2VkXG5cdC8vIG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93IEluc3RhbmNlIG9mIHRoZSBjcmVhdGlvbiByb3cgLSAoVE9ETzogZ2V0IHJpZCBidXQgdXNlIGxpc3QgYmluZGluZ3Mgb25seSlcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICogQHBhcmFtIHNvdXJjZSAgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBvciBhIHRhYmxlIGJ1aWxkaW5nIGJsb2NrIGZvciBhIHRlbXBvcmFyeSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6PGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIE5ld1BhZ2UgLSB0aGUgY3JlYXRlZCBkb2N1bWVudCBpcyBzaG93biBpbiBhIG5ldyBwYWdlLCBkZXBlbmRpbmcgb24gd2hldGhlciBtZXRhZGF0YSAnU3luYycsICdBc3luYycsIG9yICdEZWZlcnJlZCcgaXMgdXNlZDxici8+XG5cdCAqICAgICAgICAgICAgICAgICAgICBJbmxpbmUgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSB3aXRoaW4gdGhlIHRhYmxlLiBOb3Qgc3VwcG9ydGVkIG9uIGEgTGlzdCBSZXBvcnQ8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbiBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlciAnb3V0Ym91bmQnPGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIENyZWF0aW9uRGlhbG9nIC0gdGhlIGNyZWF0aW9uIGlzIGRvbmUgaW4gdGhlIHRhYmxlLCB3aXRoIGEgZGlhbG9nIGFsbG93aW5nIHRvIHNwZWNpZnkgc29tZSBpbml0aWFsIHByb3BlcnR5IHZhbHVlcyAodGhlIHByb3BlcnRpZXMgYXJlIGxpc3RlZCBpbiBgY3JlYXRpb25EaWFsb2dGaWVsZHNgKVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy50YWJsZUlkIElEIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5vdXRib3VuZCBUaGUgbmF2aWdhdGlvbiB0YXJnZXQgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0V4dGVybmFsJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGVBdEVuZCBTcGVjaWZpZXMgaWYgdGhlIG5ldyBlbnRyeSBzaG91bGQgYmUgY3JlYXRlZCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiBhIHRhYmxlIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdJbmxpbmUnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRhdGEgVGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iRnJvbURlZmVycmVkIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYnVzeU1vZGUgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGlvblJvdyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzIFRoZSBjb250ZXh0cyB0aGF0IGFyZSBzZWxlY3RlZCBpbiB0aGUgdGFibGUgaW5pdGlhdGluZyB0aGUgY3JlYXRpb24uIFVzZWQgaW4gY2FzZSBvZiBhIFRyZWVUYWJsZSB0byBkZXRlcm1pbmUgdGhlIHBhcmVudCBjb250ZXh0IG9mIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNpbmdsZURyYWZ0Rm9yQ3JlYXRlIFdoZW4gZW5hYmxlZCwgYW4gZXh0cmEgcmVxdWVzdCBjaGVja3MgaWYgYW55IGRyYWZ0cyBleGlzdCB0aGF0IHdlcmUgbmV2ZXIgc2F2ZWQuIElmIHVuc2F2ZWQgZHJhZnRzIGFyZSBmb3VuZCwgdGhlIG5ld2VzdCBvbmUgaXMgb3BlbmVkLiBJZiBubyB1bnNhdmVkIGRyYWZ0cyBhcmUgZm91bmQsIGEgbmV3IGVudGl0eSBpcyBjcmVhdGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzIERlZmluZXMgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyB0aGF0IGFyZSBkaXNwbGF5ZWQgaW4gdGhlIGNyZWF0aW9uIGRpYWxvZyB3aGVuIHRoZSBjcmVhdGlvbiBtb2RlIGlzIHNldCB0byAnQ3JlYXRpb25EaWFsb2cnLjxici8+VGhlIHZhbHVlIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBjcmVhdGVEb2N1bWVudChcblx0XHRzb3VyY2U6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcgfCBNYWNyb1RhYmxlLFxuXHRcdG1JblBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRiRnJvbURlZmVycmVkPzogYm9vbGVhbjtcblx0XHRcdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRcdFx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0Y3JlYXRpb25Sb3c/OiBDcmVhdGlvblJvdztcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0XHR0YWJsZUlkPzogc3RyaW5nO1xuXHRcdFx0b3V0Ym91bmQ/OiBzdHJpbmc7XG5cdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdHNpbmdsZURyYWZ0Rm9yQ3JlYXRlPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgb0RhdGFMaXN0QmluZGluZyE6IE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0bGV0IHBhcmVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3QgZGF0YU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRsZXQgc2VsZWN0ZWRQcm9wZXJ0aWVzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKGRhdGFNb2RlbCAmJiBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChkYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRzZWxlY3RlZFByb3BlcnRpZXMgPSBcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0RyYWZ0QWRtaW5pc3RyYXRpdmVVc2VyLElzQWN0aXZlRW50aXR5LEhhc0FjdGl2ZUVudGl0eVwiO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiICYmIHNvdXJjZS5pc0EgJiYgc291cmNlLmlzQTxJUm93QmluZGluZ0ludGVyZmFjZT4oXCJzYXAuZmUuY29yZS5JUm93QmluZGluZ0ludGVyZmFjZVwiKSkge1xuXHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IHNvdXJjZS5nZXRSb3dCaW5kaW5nKHtcblx0XHRcdFx0JHNlbGVjdDogc2VsZWN0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHQkJGdyb3VwSWQ6IFwiJGF1dG8uV29ya2Vyc1wiXG5cdFx0XHR9KTtcblx0XHRcdHNvdXJjZSA9IG9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0fVxuXG5cdFx0aWYgKG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpIHtcblx0XHRcdGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nRnJvbVBhdGggPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpPy5iaW5kTGlzdChzb3VyY2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcblx0XHRcdFx0XHQkc2VsZWN0OiBzZWxlY3RlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLldvcmtlcnNcIlxuXHRcdFx0XHR9KSBhcyBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoIWxpc3RCaW5kaW5nRnJvbVBhdGgpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IGxpc3RCaW5kaW5nRnJvbVBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGVsZXRlIG1JblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQ7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwib2JqZWN0XCIgJiYgc291cmNlLmlzQSAmJiBzb3VyY2UuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IHNvdXJjZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgb2JqZWN0IG9yIHBhdGggZXhwZWN0ZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChvRGF0YUxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRwYXJlbnRDb250ZXh0ID0gdGhpcy5nZXRQYXJlbnRDb250ZXh0RnJvbVNlbGVjdGlvbihtSW5QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHJlc29sdmVkQ3JlYXRpb25Nb2RlID0gdGhpcy5yZXNvbHZlQ3JlYXRpb25Nb2RlKG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlLCBvRGF0YUxpc3RCaW5kaW5nLCBtSW5QYXJhbWV0ZXJzLmRhdGEpO1xuXG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpLnJlbW92ZUlBcHBTdGF0ZUtleSgpO1xuXG5cdFx0aWYgKFxuXHRcdFx0KG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGUgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGVcblx0XHRcdFx0OiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldE1hbmlmZXN0KClbXCJzYXAuZmVcIl0/LmFwcD8uc2luZ2xlRHJhZnRGb3JDcmVhdGUpICYmXG5cdFx0XHRvRGF0YUxpc3RCaW5kaW5nID09PSBvRGF0YUxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCkgJiZcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpICE9PSBudWxsXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBuZXdCaW5kaW5nID0gb0RhdGFMaXN0QmluZGluZy5nZXRNb2RlbCgpPy5iaW5kTGlzdChcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLFxuXHRcdFx0XHRuZXcgU29ydGVyKFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvTGFzdENoYW5nZURhdGVUaW1lXCIsIHRydWUpLFxuXHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRmaWx0ZXJzOiBbXG5cdFx0XHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdFx0cGF0aDogXCJJc0FjdGl2ZUVudGl0eVwiLFxuXHRcdFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTE6IGZhbHNlXG5cdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0XHRwYXRoOiBcIkhhc0FjdGl2ZUVudGl0eVwiLFxuXHRcdFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTE6IGZhbHNlXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0YW5kOiB0cnVlXG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3QmluZGluZz8ucmVxdWVzdENvbnRleHRzKDAsIDEpO1xuXHRcdFx0aWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KHJlc3VsdFswXSwgeyBlZGl0YWJsZTogdHJ1ZSwgcmVjcmVhdGVDb250ZXh0OiBmYWxzZSB9KS50aGVuKCgpID0+IG5ld0JpbmRpbmc/LmRlc3Ryb3koKSk7XG5cdFx0XHR9XG5cdFx0XHRuZXdCaW5kaW5nPy5kZXN0cm95KCk7XG5cdFx0XHRyZXR1cm4gdGhpcy5faGFuZGxlQ3JlYXRpb25Nb2RlKFxuXHRcdFx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZSxcblx0XHRcdFx0c291cmNlIGFzIHN0cmluZyB8IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0XHRcdG1JblBhcmFtZXRlcnMsXG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0XHRcdHBhcmVudENvbnRleHRcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9oYW5kbGVDcmVhdGlvbk1vZGUoXG5cdFx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZSxcblx0XHRcdHNvdXJjZSBhcyBzdHJpbmcgfCBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0bUluUGFyYW1ldGVycyxcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0XHRwYXJlbnRDb250ZXh0XG5cdFx0KTtcblx0fVxuXG5cdGFzeW5jIF9oYW5kbGVDcmVhdGlvbk1vZGUoXG5cdFx0cmVzb2x2ZWRDcmVhdGlvbk1vZGU6IHN0cmluZyxcblx0XHR2TGlzdEJpbmRpbmc6IHN0cmluZyB8IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyYW1ldGVyczogSW50ZXJuYWxDcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdG9EYXRhTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyZW50Q29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3RvcnkoW10pO1xuXHRcdHN3aXRjaCAocmVzb2x2ZWRDcmVhdGlvbk1vZGUpIHtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkV4dGVybmFsOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFeHRlcm5hbERvY3VtZW50KHZMaXN0QmluZGluZywgcGFyYW1ldGVycy5vdXRib3VuZCk7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5EZWZlcnJlZDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRGVmZXJyZWREb2N1bWVudChvRGF0YUxpc3RCaW5kaW5nLCBwYXJlbnRDb250ZXh0LCBwYXJhbWV0ZXJzLmRhdGEpO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c6XG5cdFx0XHRcdHJldHVybiBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93XG5cdFx0XHRcdFx0PyB0aGlzLmNyZWF0ZUNyZWF0ZVJvd0RvY3VtZW50KHtcblx0XHRcdFx0XHRcdFx0Y3JlYXRpb25Sb3c6IHBhcmFtZXRlcnMuY3JlYXRpb25Sb3csXG5cdFx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kXG5cdFx0XHRcdFx0ICB9KVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuSW5saW5lOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudChcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUsXG5cdFx0XHRcdFx0XHR0YWJsZUlkOiBwYXJhbWV0ZXJzLnRhYmxlSWQsXG5cdFx0XHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdCk7XG5cblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nOlxuXHRcdFx0XHRpZiAob0RhdGFMaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0XHQvLyBDcmVhdGlvbiB3aXRoIGRpYWxvZyBpbiBhbiBPYmplY3RQYWdlXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRGlhbG9nSW5saW5lRG9jdW1lbnQoXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nLFxuXHRcdFx0XHRcdFx0XHR0YWJsZUlkOiBwYXJhbWV0ZXJzLnRhYmxlSWQsXG5cdFx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEsXG5cdFx0XHRcdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOiBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQ3JlYXRpb24gd2l0aCBkaWFsb2cgaW4gYSBMaXN0UmVwb3J0XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRGlhbG9nQW5kU2F2ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWJsZUlkOiBwYXJhbWV0ZXJzLnRhYmxlSWQsXG5cdFx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEsXG5cdFx0XHRcdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOiBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuU3luYzpcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkFzeW5jOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVTeW5jQXN5bmNEb2N1bWVudChcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjcmVhdGlvbk1vZGU6IHJlc29sdmVkQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0XHRcdFx0YkZyb21EZWZlcnJlZDogcGFyYW1ldGVycy5iRnJvbURlZmVycmVkLFxuXHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdGNyZWF0ZUFjdGlvbjogcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdCk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgJHtyZXNvbHZlZENyZWF0aW9uTW9kZX1gKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICpFeGVjdXRlcyB0aGUgbWFuZGF0b3J5IGNvbmZpZ3VyYXRpb24gYWZ0ZXIgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWQuXG5cdCAqIEBwYXJhbSBwcmVyZXF1aXNpdGUgUHJvbWlzZSBvZiB0aGUgZG9jdW1lbnQgY3JlYXRpb24gYW5kIHRoZSBmb2xsb3dpbmcgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNvbmZpZ3VyYXRpb24gaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgcG9zdERvY3VtZW50Q3JlYXRpb24ocHJlcmVxdWlzaXRlOiBQcm9taXNlPFtDb250ZXh0LCB1bmtub3duXT4sIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGxpc3RCaW5kaW5nKTtcblx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgcGFyYW1zID0gYXdhaXQgcHJlcmVxdWlzaXRlO1xuXHRcdGNvbnN0IG5ld0RvY3VtZW50Q29udGV4dCA9IHBhcmFtc1swXTtcblx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWwsIG1vZGVsKTtcblx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckNyZWF0ZSh7IGNvbnRleHQ6IG5ld0RvY3VtZW50Q29udGV4dCB9KTtcblx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTsgLy8gVGhlIGNyZWF0ZU1vZGUgZmxhZyB3aWxsIGJlIHNldCBpbiBjb21wdXRlTW9kZWxzRm9yRWRpdE1vZGVcblx0XHRpZiAoIWxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdC8vIFdvcmthcm91bmQgdG8gdGVsbCB0aGUgT1AgdGhhdCB3ZSd2ZSBjcmVhdGVkIGEgbmV3IG9iamVjdCBmcm9tIHRoZSBMUlxuXHRcdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkuc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdFx0XHRjb25zdCBuZXdBY3Rpb24gPSBlbnRpdHlTZXQ/LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ/Lk5ld0FjdGlvbjtcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgbmV3QWN0aW9uKTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSB8fFxuXHRcdFx0XHR0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0FuYWx5dGljYWwobGlzdEJpbmRpbmcpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gQ3JlYXRpbmcgYSBuZXcgaXRlbSBpbiBhIGhpZXJhcmNoeS9hbmFseXRpY2FsIHRhYmxlIGZyb20gdGhlIExpc3RSZXBvcnQgKHNpbmNlIHRoZSBsaXN0QmluZGluZyBpcyBub3QgcmVsYXRpdmUpXG5cdFx0XHRcdC8vIC0tPiB3ZSB3YW50IHRvIGZvcmNlIHRoZSB1c2VyIHRvIGVpdGhlciBzYXZlIG9yIGRpc2NhcmQgdGhlIGRyYWZ0IGJlZm9yZSBsZWF2aW5nIHRoZSBPUFxuXHRcdFx0XHR0aGlzLmZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAobmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHQvLyBIYW5kbGUgaGlkZGVuIGRyYWZ0IHNlc3Npb24gZm9yIGNyZWF0ZWQgZG9jdW1lbnRzLCBzaW1pbGFyIHRvIGVkaXREb2N1bWVudFxuXHRcdFx0aWYgKHRoaXMuX2hpZGRlbkRyYWZ0ICYmIHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5oYW5kbGVIaWRkZW5EcmFmdEVkaXQobmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUobGlzdEJpbmRpbmcpO1xuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1vZGVsLmdldE1ldGFNb2RlbCgpKSAmJlxuXHRcdFx0XHR0aGlzLmlzRHJhZnRSb290KG5ld0RvY3VtZW50Q29udGV4dCkgJiZcblx0XHRcdFx0IXRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFRoZSBpbml0aWFsIHNoYXJlIGFjdGlvbiBzaGFsbCBiZSBjYWxsZWRcblx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5zZXRJbml0aWFsU2hhcmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgdmlhIHRoZSBjcmVhdGlvblJvdy5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBUaGUgbmV3IGRvY3VtZW50IGlzIGNyZWF0ZWQgYXQgdGhlIGVuZC5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgVGhlIGNyZWF0aW9uIHJvd1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgVGhlIHNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVDcmVhdGVSb3dEb2N1bWVudChwYXJhbWV0ZXJzOiB7XG5cdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdGNyZWF0aW9uUm93OiBDcmVhdGlvblJvdztcblx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHR9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IGNyZWF0aW9uOiBQcm9taXNlPENvbnRleHQ+O1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93O1xuXHRcdGNvbnN0IHRhYmxlID0gcGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRQYXJlbnQoKSBhcyBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRsZXQgbmF2aWdhdGlvbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdGlmICghdGFibGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YWJsZS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCBsaXN0QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgXCJDcmVhdGlvblJvd1wiIHdpdGggYSBUcmVlVGFibGVgKTtcblx0XHR9XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3dDb250ZXh0ID0gY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGNvbnN0IGRvY3VtZW50VmFsaWRhdGlvbiA9IHRoaXMuZ2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24odGFibGUpO1xuXHRcdC8vIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgaXMgc2V0IHRvIGZhbHNlIGluIG1hbmlmZXN0IGNvbnZlcnRlciAoVGFibGUudHMpIGlmIGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiBleGlzdHNcblx0XHRpZiAoY3JlYXRpb25Sb3cuZGF0YShcImRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGFcIikgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHR0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmFsaWRhdGlvbk1lc3NhZ2VzID0gYXdhaXQgdGhpcy5zeW5jVGFzayhkb2N1bWVudFZhbGlkYXRpb24pO1xuXHRcdGlmICh2YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy5jcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXModmFsaWRhdGlvbk1lc3NhZ2VzLCB0YWJsZSk7XG5cdFx0XHRMb2cuZXJyb3IoXCJDdXN0b20gVmFsaWRhdGlvbiBmYWlsZWRcIik7XG5cdFx0XHQvLyBpZiBjdXN0b20gdmFsaWRhdGlvbiBmYWlscywgd2UgbGVhdmUgdGhlIG1ldGhvZCBpbW1lZGlhdGVseVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBlbnRpdHlUeXBlID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjcmVhdGlvblJvd0NvbnRleHQuZ2V0UGF0aCgpKSkudGFyZ2V0RW50aXR5VHlwZTtcblx0XHRjb25zdCBjcmVhdGlvblJvd1BheWxvYWQgPSBjcmVhdGlvblJvd0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cblx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblxuXHRcdC8vbW92ZWQgYWZ0ZXIgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyB0byBhdm9pZCBcIidjcmVhdGlvbicgdXNlIGJlZm9yZSBpbml0aWFsaXphdGlvblwiIGNvbnNvbGUgZXJyb3JzXG5cdFx0Ly9hZnRlciB2YWxpZGF0aW9uIGVycm9ycyBvY2N1cnJlZFxuXHRcdGxpc3RCaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRhd2FpdCBjcmVhdGlvbjtcblx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgocGFyYW1ldGVycy5jcmVhdGVBdEVuZCA/IHRhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRMZW5ndGgoKSA6IDApO1xuXHRcdH0pO1xuXG5cdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMobGlzdEJpbmRpbmcpO1xuXHRcdHRyeSB7XG5cdFx0XHRjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRkYXRhOiBPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdFx0e30sXG5cdFx0XHRcdFx0XHQuLi5PYmplY3Qua2V5cyhjcmVhdGlvblJvd1BheWxvYWQpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoXG5cdFx0XHRcdFx0XHRcdFx0KHByb3BlcnR5UGF0aDogc3RyaW5nKSA9PlxuXHRcdFx0XHRcdFx0XHRcdFx0ZW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcy5maW5kSW5kZXgoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lID09PSBwcm9wZXJ0eVBhdGgpID09PSAtMVxuXHRcdFx0XHRcdFx0XHQpIC8vIGVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRcdC5tYXAoKHBhdGgpID0+ICh7IFtwYXRoXTogY3JlYXRpb25Sb3dQYXlsb2FkW3BhdGhdIH0pKVxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdFx0YnVzeU1vZGU6IFwiTG9jYWxcIiwgLy8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRcdGJ1c3lJZDogKHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZCk/LmdldFRhYmxlRGVmaW5pdGlvbigpPy5hbm5vdGF0aW9uLmlkLFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogYXBwQ29tcG9uZW50LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3dcblx0XHRcdFx0fSxcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdCk7XG5cdFx0XHQvLyBTaWRlRWZmZWN0cyBvbiBDcmVhdGVcblx0XHRcdC8vIGlmIFNhdmUgaXMgcHJlc3NlZCBkaXJlY3RseSBhZnRlciBmaWxsaW5nIHRoZSBDcmVhdGlvblJvdywgbm8gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHRcdFx0aWYgKCFwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IGNyZWF0aW9uO1xuXHRcdFx0Y29uc3QgY3JlYXRpb25Sb3dMaXN0QmluZGluZyA9IGNyZWF0aW9uUm93Q29udGV4dC5nZXRCaW5kaW5nKCkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRcdGNvbnN0IG5ld1RyYW5zaWVudENvbnRleHQgPSBjcmVhdGlvblJvd0xpc3RCaW5kaW5nLmNyZWF0ZSgpO1xuXHRcdFx0Y3JlYXRpb25Sb3cuc2V0QmluZGluZ0NvbnRleHQobmV3VHJhbnNpZW50Q29udGV4dCk7XG5cblx0XHRcdC8vIHRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3JzIFRPIGJlIGNoZWNrZWQgd2l0aCBtb2RlbCBjb2xsZWFndWVzXG5cdFx0XHRuZXdUcmFuc2llbnRDb250ZXh0LmNyZWF0ZWQoKT8uY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgZmFzdCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHR9KTtcblx0XHRcdG5hdmlnYXRpb24gPSBjcmVhdGlvblJvd0NvbnRleHQuZGVsZXRlKFwiJGRpcmVjdFwiKTtcblx0XHRcdHJldHVybiBhd2FpdCB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgbmF2aWdhdGlvbl0pLCBsaXN0QmluZGluZyk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFJlc2V0IGJ1c3kgaW5kaWNhdG9yIGFmdGVyIGEgdmFsaWRhdGlvbiBlcnJvclxuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpO1xuXHRcdFx0fVxuXHRcdFx0TG9nLmVycm9yKFwiQ3JlYXRpb25Sb3cgbmF2aWdhdGlvbiBlcnJvcjogXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgaW4gSW5saW5lIG1vZGUgb3Igd2l0aCBhIGNyZWF0aW9uIGlubGluZSBkaWFsb2cgKE9iamVjdCBwYWdlIGNhc2UpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBUaGUgbmV3IGRvY3VtZW50IGlzIGNyZWF0ZWQgYXQgdGhlIGVuZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgVGhlIHNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMudGFibGVJZCBUaGUgaWQgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQgUGFyZW50IGNvbnRleHQgKGZvciBUcmVlVGFibGUpXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGEgSW50aWFsIGRhdGEgZm9yIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzIEZpZWxkcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGNyZWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZURpYWxvZ0lubGluZURvY3VtZW50KFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLklubGluZSB8IENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZztcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHR0YWJsZUlkPzogc3RyaW5nO1xuXHRcdFx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0ZGF0YT86IG9iamVjdDtcblx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG5cdFx0fSxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgdGFibGU6IFRhYmxlIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChwYXJhbWV0ZXJzLnRhYmxlSWQpIHtcblx0XHRcdHRhYmxlID0gdGhpcy5nZXRWaWV3KCkuYnlJZChwYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlO1xuXHRcdH1cblx0XHRpZiAodGFibGU/LmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0YWJsZS5nZXRSb3dCaW5kaW5nKCkuYXR0YWNoRXZlbnRPbmNlKFwiY3JlYXRlQ29tcGxldGVkXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IGF3YWl0IGNyZWF0aW9uO1xuXHRcdFx0XHRjb25zdCBjb250ZXh0SW5kZXggPSBuZXdDb250ZXh0LmdldEluZGV4KCk7XG5cdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGF0YSA9IGxpc3RCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXMgeyBjcmVhdGVJblBsYWNlPzogYm9vbGVhbiB9IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRjb25zdCBpc0NyZWF0ZUluUGxhY2UgPSBhZ2dyZWdhdGlvbkRhdGE/LmNyZWF0ZUluUGxhY2UgPz8gZmFsc2U7XG5cblx0XHRcdFx0aWYgKGNvbnRleHRJbmRleCAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHRJbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRpZiAoIXRhYmxlPy5nZXRCdXN5KCkpIHtcblx0XHRcdFx0XHRcdFx0dGFibGU/LmZvY3VzUm93KGNvbnRleHRJbmRleCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNDcmVhdGVJblBsYWNlKSB7XG5cdFx0XHRcdFx0Ly8gRm9yIGNyZWF0ZSBpbi1wbGFjZSBtb2RlIChzZXJ2ZXIgcG9zaXRpb24pLCBkaXNwbGF5IGEgd2FybmluZyBtZXNzYWdlIGluIGNhc2UgdGhlIG5ld2x5IGNyZWF0ZWQgbm9kZSBpc24ndCB2aXNpYmxlXG5cdFx0XHRcdFx0TWVzc2FnZVRvYXN0LnNob3codGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLmdldFRleHQoXCJDX05FV19FTEVNRU5UX05PVF9ESVNQTEFZRURcIikpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSAmJiAhaXNDcmVhdGVJblBsYWNlKSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBhIHRyZWUgdGFibGUsIHdlIGFsc28gc2Nyb2xsIHRvIGtlZXAgdGhlIHBhcmVudCB2aXNpYmxlXG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50Q29udGV4dCA9IG5ld0NvbnRleHQuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50SW5kZXggPSBwYXJlbnRDb250ZXh0Py5nZXRJbmRleCgpO1xuXHRcdFx0XHRcdGlmIChwYXJlbnRJbmRleCAhPT0gdW5kZWZpbmVkICYmIHBhcmVudEluZGV4ID49IDApIHtcblx0XHRcdFx0XHRcdHRhYmxlPy5zY3JvbGxUb0luZGV4KHBhcmVudEluZGV4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YWJsZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyB0YWtlIGNhcmUgb24gbWVzc2FnZSBoYW5kbGluZywgZHJhZnQgaW5kaWNhdG9yIChpbiBjYXNlIG9mIGRyYWZ0KVxuXHRcdC8vIEF0dGFjaCB0aGUgY3JlYXRlIHNlbnQgYW5kIGNyZWF0ZSBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyhsaXN0QmluZGluZyk7XG5cdFx0Y29uc3QgY3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdHtcblx0XHRcdFx0Ly9DaGVjayBpZiBBbGwgcGFyYW1ldGVycyBhcmUgbmVlZGVkXG5cdFx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRidXN5TW9kZTogXCJMb2NhbFwiLCAvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdGJ1c3lJZDogKHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZCk/LmdldFRhYmxlRGVmaW5pdGlvbigpPy5hbm5vdGF0aW9uLmlkLFxuXHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZSxcblx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlLCAvLyBJbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiB3YXMgY2FsbGVkIHdpdGggcHJlZmVycmVkTW9kZT1hdXRvQ3JlYXRlV2l0aCwgd2Ugd2FudCB0byBza2lwIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0Y3JlYXRpb25Nb2RlOiBwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSxcblx0XHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOiBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzXG5cdFx0XHR9LFxuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblxuXHRcdGlmICghcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdHRoaXMuaGFuZGxlU2lkZUVmZmVjdHMobGlzdEJpbmRpbmcsIGNyZWF0aW9uKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMucG9zdERvY3VtZW50Q3JlYXRpb24oUHJvbWlzZS5hbGwoW2NyZWF0aW9uLCB0aGlzLnN5bmNUYXNrKGNyZWF0aW9uKV0pLCBsaXN0QmluZGluZyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCB2aWEgYSBkaWFsb2cgYW5kIHNhdmVzIGl0IGltbWVkaWF0ZWx5IChMaXN0UmVwb3J0IGNhc2UpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFRoZSBuZXcgZG9jdW1lbnQgaXMgY3JlYXRlZCBhdCB0aGUgZW5kXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBUaGUgc2lkZUVmZmVjdHMgYXJlIHJlcXVlc3RlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy50YWJsZUlkIFRoZSBpZCBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udGV4dCBQYXJlbnQgY29udGV4dCAoZm9yIFRyZWVUYWJsZSlcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGF0YSBJbnRpYWwgZGF0YSBmb3IgY3JlYXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMgRmllbGRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgY3JlYXRpb24gZGlhbG9nXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRGlhbG9nQW5kU2F2ZURvY3VtZW50KFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHR0YWJsZUlkPzogc3RyaW5nO1xuXHRcdFx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0ZGF0YT86IG9iamVjdDtcblx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG5cdFx0fSxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgdGFibGU6IFRhYmxlIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChwYXJhbWV0ZXJzLnRhYmxlSWQpIHtcblx0XHRcdHRhYmxlID0gdGhpcy5nZXRWaWV3KCkuYnlJZChwYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHRhYmxlPy5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSAhPT0gdHJ1ZSkge1xuXHRcdFx0XHR0YWJsZSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgc2F2ZWREb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3QgYWZ0ZXJDcmVhdGVJbkRpYWxvZyA9IGFzeW5jIChuZXdEb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckNyZWF0ZSh7IGNvbnRleHQ6IG5ld0RvY3VtZW50Q29udGV4dCB9KTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdC8vIEVycm9ycyBpbiBvbkFmdGVyQ3JlYXRlIGFyZSBub3QgY2F1c2luZyB0aGUgb3ZlcmFsbCBmbG93IHRvIGZhaWxcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgYWZ0ZXIgY3JlYXRpb246IFwiICsgZXJyb3IpO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVTYXZlKHsgY29udGV4dDogbmV3RG9jdW1lbnRDb250ZXh0IH0pO1xuXHRcdFx0c2F2ZWREb2N1bWVudENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFtdLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdHRydWVcblx0XHRcdCk7XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyU2F2ZSh7XG5cdFx0XHRcdFx0Y29udGV4dDogc2F2ZWREb2N1bWVudENvbnRleHRcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHQvLyBFcnJvcnMgaW4gb25BZnRlclNhdmUgYXJlIG5vdCBjYXVzaW5nIHRoZSBvdmVyYWxsIGZsb3cgdG8gZmFpbFxuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciBhZnRlciBzYXZlOiBcIiArIGVycm9yKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIGEgVHJlZVRhYmxlLCB3ZSBkb24ndCB1c2UgdGhlIGxpc3RCaW5kaW5nIGZyb20gdGhlIExpc3RSZXBvcnQgdG8gY3JlYXRlIHRoZSBuZXcgaXRlbSxcblx0XHRcdFx0Ly8gU28gd2UgY2FuJ3Qga25vdyB0aGUgcG9zaXRpb24gb2YgdGhlIG5ldyBpdGVtIGluIHRoZSBsaXN0QmluZGluZ1xuXHRcdFx0XHQvLyAtLT4gV2UgcmVmcmVzaCB0aGUgdGFibGUgYW5kIHNjcm9sbCB0byB0aGUgcGFyZW50IHBvc2l0aW9uXG5cdFx0XHRcdGNvbnN0IHRhYmxlQVBJID0gdGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAodGFibGVBUEkpIHtcblx0XHRcdFx0XHRjb25zdCBwYXJlbnRJbmRleCA9IHBhcmFtZXRlcnMucGFyZW50Q29udGV4dD8uZ2V0SW5kZXgoKTtcblx0XHRcdFx0XHR0YWJsZUFQSS5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0aWYgKHBhcmVudEluZGV4ICE9PSB1bmRlZmluZWQgJiYgcGFyZW50SW5kZXggPj0gMCkge1xuXHRcdFx0XHRcdFx0dGFibGU/LnNjcm9sbFRvSW5kZXgocGFyZW50SW5kZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBhIGZsYXQgdGFibGUsIHdlIGNhbiBzY3JvbGwgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgaXRlbVxuXHRcdFx0XHRjb25zdCBpdGVtSW5kZXggPSBzYXZlZERvY3VtZW50Q29udGV4dC5nZXRJbmRleCgpO1xuXHRcdFx0XHRpZiAoaXRlbUluZGV4ICE9PSB1bmRlZmluZWQgJiYgaXRlbUluZGV4ID49IDApIHtcblx0XHRcdFx0XHR0YWJsZT8uc2Nyb2xsVG9JbmRleChpdGVtSW5kZXgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGNvbnN0IGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHR7XG5cdFx0XHRcdC8vQ2hlY2sgaWYgQWxsIHBhcmFtZXRlcnMgYXJlIG5lZWRlZFxuXHRcdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBmYWxzZSwgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0YnVzeU1vZGU6IFwiTG9jYWxcIiwgLy8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRidXN5SWQ6ICh0YWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQpPy5nZXRUYWJsZURlZmluaXRpb24oKT8uYW5ub3RhdGlvbi5pZCxcblx0XHRcdFx0cGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdGFmdGVyQ3JlYXRlQ2FsbEJhY2s6IGFmdGVyQ3JlYXRlSW5EaWFsb2csXG5cdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuQXV0b0NyZWF0ZSwgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nLFxuXHRcdFx0XHRwYXJlbnRDb250ZXh0OiBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQsXG5cdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM6IHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHNcblx0XHRcdH0sXG5cdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoW2NyZWF0aW9uLCB0aGlzLnN5bmNUYXNrKGNyZWF0aW9uKV0pO1xuXHRcdGlmIChzYXZlZERvY3VtZW50Q29udGV4dCAmJiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyAhPT0gdHJ1ZSkge1xuXHRcdFx0dGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcsIHNhdmVkRG9jdW1lbnRDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGRlZmVycmVkIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIHBhcmVudENvbnRleHQgT3B0aW9uYWwgcGFyZW50IGNvbnRleHQgd2hlbiBjcmVhdGluZyBhIG5vZGUgaW4gVHJlZVRhYmxlXG5cdCAqIEBwYXJhbSBkYXRhXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEZWZlcnJlZERvY3VtZW50KGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQsIGRhdGE/OiBvYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KGxpc3RCaW5kaW5nLCB7XG5cdFx0XHRjcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVyczogeyBtb2RlOiBcIkRlZmVycmVkXCIsIHBhcmVudENvbnRleHQsIGxpc3RCaW5kaW5nLCBkYXRhIH0sXG5cdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdGZvcmNlRm9jdXM6IHRydWVcblx0XHR9KTtcblx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3luYyBvciBhc3luYyBkb2N1bWVudC5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIHN5bmMgb3IgYXN5bmMgY3JlYXRpb24gbW9kZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iRnJvbURlZmVycmVkIFRoaXMgZG9jdW1lbnQgaXMgY3JlYXRlZCBhZnRlciBhIGRlZmZlcmVkIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbiAgVGhlIGNyZWF0ZSBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSBjcmVhdGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGEgIERhdGEgdG8gc2F2ZSBvbiB0aGUgbmV3IGRvY3VtZW50XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBUaGUgc2lkZUVmZmVjdHMgYXJlIHJlcXVlc3RlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0XG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlU3luY0FzeW5jRG9jdW1lbnQoXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRiRnJvbURlZmVycmVkPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRcdH0sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmdcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IG5hdmlnYXRpb246IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IHJvdXRpbmdMaXN0ZW5lciA9IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXG5cdFx0Y29uc3QgY3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKClcblx0XHRcdC5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQuLi5wYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdC4uLntcblx0XHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZSxcblx0XHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuQXV0b0NyZWF0ZSAvLyBJbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiB3YXMgY2FsbGVkIHdpdGggcHJlZmVycmVkTW9kZT1hdXRvQ3JlYXRlV2l0aCwgd2Ugd2FudCB0byBza2lwIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpXG5cdFx0XHQudGhlbigobmV3RG9jdW1lbnRDb250ZXh0KSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSAmJiBuZXdEb2N1bWVudENvbnRleHQgJiYgbmV3RG9jdW1lbnRDb250ZXh0LmdldEJpbmRpbmcoKSAhPT0gbGlzdEJpbmRpbmcpIHtcblx0XHRcdFx0XHQvLyBJbiBGQ0wgY2FzZSwgaWYgdGhlIG5ldyBjb250ZXh0IGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCBhbiBhY3Rpb24gKG5vdCB3aXRoIHRoZSBzdGFuZGFyZCBQT1NUIGNyZWF0ZSksIHdlIG5lZWQgdG8gcmVmcmVzaFxuXHRcdFx0XHRcdC8vIHRoZSBvcmlnaW5hbCBsaXN0QmluZGluZyBzbyB0aGF0IGl0IGNvbnRhaW5zIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdCAodGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGxpc3RCaW5kaW5nIGZvciBzdGFuZGFyZCBjcmVhdGUpXG5cdFx0XHRcdFx0bGlzdEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG5ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pO1xuXG5cdFx0Ly8gVGhlIFNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWQgb25seSBpZiB0aGUgY3JlYXRpb24gaW4gdGhlIEZMQyBjYXNlIChkaXJ0eSBzdGF0ZSBpcyBub3Qgc2V0IHRvIHRydWUgc28gU2lkZUVmZmVjdHMgYXJlIHJlbGV2YW50KVxuXHRcdC8vIG9yIGlmIHRoZSBjcmVhdGlvbiBpcyBub3QgZGVmZXJyZWQuXG5cdFx0aWYgKCh0aGlzLl9pc0ZjbEVuYWJsZWQoKSB8fCBwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgIT09IHRydWUpICYmICFwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0dGhpcy5oYW5kbGVTaWRlRWZmZWN0cyhsaXN0QmluZGluZywgY3JlYXRpb24sIHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCA/IGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSA6IHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQXN5bmMpIHtcblx0XHRcdG5hdmlnYXRpb24gPSByb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KGxpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdGNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzOiB7IG1vZGU6IFwiQXN5bmNcIiwgY3JlYXRlQ29udGV4dFByb21pc2U6IGNyZWF0aW9uIH0sXG5cdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmF2aWdhdGlvbiA9IGNyZWF0aW9uLnRoZW4oYXN5bmMgKG5ld0RvY3VtZW50Q29udGV4dCkgPT4ge1xuXHRcdFx0XHRpZiAoIW5ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdGNvbnN0IGNvcmVSZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdFx0XHRcdFx0cmV0dXJuIHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UoY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdFx0XHR0aXRsZTogY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfRURJVEZMT1dfU0FQRkVfQ1JFQVRJT05fRkFJTEVEX0RFU0NSSVBUSU9OXCIpXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgU3luYyBjcmVhdGlvbiB3YXMgdHJpZ2dlcmVkIGZvciBhIGRlZmVycmVkIGNyZWF0aW9uLCB3ZSBkb24ndCBuYXZpZ2F0ZSBmb3J3YXJkXG5cdFx0XHRcdFx0Ly8gYXMgd2UncmUgYWxyZWFkeSBvbiB0aGUgY29ycmVzcG9uZGluZyBPYmplY3RQYWdlXG5cdFx0XHRcdFx0Y29uc3QgbmF2UGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlLFxuXHRcdFx0XHRcdFx0dHJhbnNpZW50OlxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpID09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uID8gdHJ1ZSA6IHVuZGVmaW5lZFxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRyZXR1cm4gcGFyYW1ldGVycy5iRnJvbURlZmVycmVkXG5cdFx0XHRcdFx0XHQ/IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvQ29udGV4dChuZXdEb2N1bWVudENvbnRleHQsIG5hdlBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHQ6IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobmV3RG9jdW1lbnRDb250ZXh0LCBuYXZQYXJhbWV0ZXJzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgbmF2aWdhdGlvbl0pLCBsaXN0QmluZGluZyk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSwgdGhlIG9ubHkgZXJyb3JzIGhhbmRsZWQgaGVyZSBhcmUgcmFpc2VkIGFzIHN0cmluZyAtIHNob3VsZCBiZSBjaGFuZ2VkIHRvIEVycm9yIG9iamVjdHNcblx0XHRcdC8vIGNyZWF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBieSB1c2VyIG9yIGZhaWxlZCBpbiBiYWNrZW5kID0+IGluIGNhc2Ugd2UgaGF2ZSBuYXZpZ2F0ZWQgdG8gdHJhbnNpZW50IGNvbnRleHQgYmVmb3JlLCBuYXZpZ2F0ZSBiYWNrXG5cdFx0XHQvLyB0aGUgc3dpdGNoLXN0YXRlbWVudCBhYm92ZSBzZWVtcyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaGFwcGVucyBpbiBjcmVhdGlvbk1vZGVzIGRlZmVycmVkIGFuZCBhc3luYy4gQnV0IGluIGZhY3QsIGluIHRoZXNlIGNhc2VzIGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGZyb20gcm91dGVNYXRjaGVkIGluIE9QIGNvbXBvbmVudFxuXHRcdFx0Ly8gY3JlYXRlRGVmZXJyZWREb2N1bWVudCBpcyB0cmlnZ2VyZWQsIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIChjcmVhdGVEb2N1bWVudCkgYWdhaW4gLSB0aGlzIHRpbWUgd2l0aCBjcmVhdGlvbk1vZGUgc3luYy4gVGhlcmVmb3JlLCBhbHNvIGluIHRoYXQgbW9kZSB3ZSBuZWVkIHRvIHRyaWdnZXIgYmFjayBuYXZpZ2F0aW9uLlxuXHRcdFx0Ly8gVGhlIG90aGVyIGNhc2VzIG1pZ2h0IHN0aWxsIGJlIG5lZWRlZCBpbiBjYXNlIHRoZSBuYXZpZ2F0aW9uIGZhaWxzLlxuXHRcdFx0aWYgKFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0Q29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyxcblx0XHRcdFx0XHRDb25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkLFxuXHRcdFx0XHRcdENvbnN0YW50cy5DcmVhdGlvbkZhaWxlZCxcblx0XHRcdFx0XHRDb25zdGFudHMuT25CZWZvcmVDcmVhdGVGYWlsZWRcblx0XHRcdFx0XS5pbmNsdWRlcyhlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gZXh0ZXJuYWwgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBoYXMgdG8gYmUgY3JlYXRlZFxuXHQgKiBAcGFyYW0gb3V0Ym91bmQgVGhlIG91dGJvdW5kIGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVFeHRlcm5hbERvY3VtZW50KGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgc3RyaW5nLCBvdXRib3VuZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIFRPRE86IENhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb24gKGN1cnJlbnRseSB1c2luZyB0aGUgc2FtZSBhcyBmb3Igb3V0Ym91bmQgY2hldnJvbiBuYXYsIGFuZCB3aXRob3V0IGFueSBjb250ZXh0IC0gM3JkIHBhcmFtKVxuXHRcdGlmIChvdXRib3VuZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBsaXN0QmluZGluZyAhPT0gXCJzdHJpbmdcIiAmJiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgY3JlYXRpb25Nb2RlIFwiRXh0ZXJuYWxcIiB3aXRoIGEgVHJlZVRhYmxlYCk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXI7XG5cdFx0XHRjb25zdCBjcmVhdGVQYXRoID0gTW9kZWxIZWxwZXIuZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nKHRoaXMuYmFzZS5nZXRWaWV3KCksIGxpc3RCaW5kaW5nKTtcblx0XHRcdGNvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQoY29udHJvbGxlciwgb3V0Ym91bmQsIHVuZGVmaW5lZCwgY3JlYXRlUGF0aCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIFNpZGVFZmZlY3RzIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIGRvY3VtZW50IGNyZWF0aW9uLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIGNyZWF0aW9uUHJvbWlzZSBUaGUgcHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IE9wdGlvbmFsIHBhcmVudCBjb250ZXh0XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgU2lkZUVmZmVjdHMgaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRoYW5kbGVTaWRlRWZmZWN0cyA9IGFzeW5jIChcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRjcmVhdGlvblByb21pc2U6IFByb21pc2U8Q29udGV4dD4sXG5cdFx0cGFyZW50Q29udGV4dD86IENvbnRleHQgfCBudWxsXG5cdCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBuZXdDb250ZXh0ID0gYXdhaXQgY3JlYXRpb25Qcm9taXNlO1xuXHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRhd2FpdCBuZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShcblx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdHBhcmVudENvbnRleHQgPz8gKHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQpXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgY3VzdG9tIHZhbGlkYXRpb24gbWVzc2FnZXMgZm9yIHRoZSBjcmVhdGlvblJvdy5cblx0ICogQHBhcmFtIHZhbGlkYXRpb25NZXNzYWdlcyBUaGUgZXJyb3IgbWVzc2FnZXMgZm9ybSB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB0YXJnZXRlZCBieSB0aGUgbWVzc2FnZXNcblx0ICovXG5cdGNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyA9ICh2YWxpZGF0aW9uTWVzc2FnZXM6IHsgbWVzc2FnZVRhcmdldD86IHN0cmluZzsgbWVzc2FnZVRleHQ6IHN0cmluZyB9W10sIHRhYmxlOiBUYWJsZSk6IHZvaWQgPT4ge1xuXHRcdGNvbnN0IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IHRhYmxlLmdldENyZWF0aW9uUm93KCkuZGF0YShcImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvblwiKTtcblx0XHRjb25zdCBjdXN0b21WYWxpZGl0eSA9IHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiKTtcblx0XHRjb25zdCBjdXN0b21NZXNzYWdlczogQ3VzdG9tTWVzc2FnZVtdID0gW107XG5cdFx0bGV0IGZpZWxkQ29udHJvbDtcblx0XHRsZXQgZmluYWxUYXJnZXQ6IHN0cmluZztcblxuXHRcdC8vIFJlbW92ZSBleGlzdGluZyBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRjb25zdCBvbGRNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0LmdldERhdGEoKVxuXHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRDb2RlKCkgPT09IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbik7XG5cdFx0TWVzc2FnaW5nLnJlbW92ZU1lc3NhZ2VzKG9sZE1lc3NhZ2VzKTtcblxuXHRcdHZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKCh2YWxpZGF0aW9uTWVzc2FnZSkgPT4ge1xuXHRcdFx0Ly8gSGFuZGxlIEJvdW5kIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0aWYgKHZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXQpIHtcblx0XHRcdFx0ZmllbGRDb250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChjdXN0b21WYWxpZGl0eVt2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKSBhcyBDb250cm9sO1xuXHRcdFx0XHRmaW5hbFRhcmdldCA9IGAke2ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCl9LyR7ZmllbGRDb250cm9sLmdldEJpbmRpbmdQYXRoKFwidmFsdWVcIil9YDtcblx0XHRcdFx0Ly8gQWRkIHZhbGlkYXRpb24gbWVzc2FnZSBpZiBzdGlsbCBub3QgZXhpc3RzXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQhTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKChtZXNzYWdlOiBNZXNzYWdlKSA9PiBtZXNzYWdlLmdldFRhcmdldHMoKS5zb21lKCh0YXJnZXQpID0+IHRhcmdldCA9PT0gZmluYWxUYXJnZXQpKS5sZW5ndGhcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0TWVzc2FnaW5nLmFkZE1lc3NhZ2VzKFxuXHRcdFx0XHRcdFx0bmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlOiB2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yOiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XHRcdFx0XHRcdFx0Y29kZTogY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHR0ZWNobmljYWw6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRwZXJzaXN0ZW50OiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0dGFyZ2V0OiBmaW5hbFRhcmdldFxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIEFkZCBjb250cm9sSWQgaW4gb3JkZXIgdG8gZ2V0IHRoZSBmb2N1cyBoYW5kbGluZyBvZiB0aGUgZXJyb3IgcG9wb3ZlclxuXHRcdFx0XHRjb25zdCBleGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0XHQuZmlsdGVyKChtZXNzYWdlOiBNZXNzYWdlKSA9PiBtZXNzYWdlLmdldFRhcmdldHMoKS5zb21lKCh0YXJnZXQpID0+IHRhcmdldCA9PT0gZmluYWxUYXJnZXQpKTtcblx0XHRcdFx0ZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXNbMF0uYWRkQ29udHJvbElkKGN1c3RvbVZhbGlkaXR5W3ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSBVbmJvdW5kIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3VzdG9tTWVzc2FnZXMucHVzaCh7XG5cdFx0XHRcdFx0Y29kZTogY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdHRleHQ6IHZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3Jcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRpZiAoY3VzdG9tTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coe1xuXHRcdFx0XHRjdXN0b21NZXNzYWdlczogY3VzdG9tTWVzc2FnZXNcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogUmVzb2x2ZXMgdGhlIGNyZWF0aW9uIG1vZGVcblx0ICogUHJvdmlkZXMgdGhlIGV4cGVjdGVkIGNyZWF0aW9uIG1vZGU6XG5cdCAqIC0gcHJlc2VydmVzIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZSB3aGVuIHRoaXMgb25lIGlzIG5vdCBhIE5ld1BhZ2Vcblx0ICogLSBjYWxjdWxhdGVzIHRoZSBuZXcgb25lIGlmIHRoZSBjcmVhdGlvbiBtb2RlIGlzIGEgTmV3UGFnZS5cblx0ICogQHBhcmFtIGluaXRpYWxDcmVhdGlvbk1vZGUgVGhlIGluaXRpYWwgY3JlYXRpb24gbW9kZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gY3JlYXRlRGF0YSBUaGUgaW5pdGlhbCBkYXRhIGZvciBvYmplY3QgY3JlYXRpb25cblx0ICogQHJldHVybnMgVGhlIG5ldyBjcmVhdGlvbiBtb2RlXG5cdCAqL1xuXHRyZXNvbHZlQ3JlYXRpb25Nb2RlID0gKGluaXRpYWxDcmVhdGlvbk1vZGU6IHN0cmluZywgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIGNyZWF0ZURhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG5cdFx0aWYgKGluaXRpYWxDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5OZXdQYWdlKSB7XG5cdFx0XHQvLyB1c2UgdGhlIHBhc3NlZCBjcmVhdGlvbiBtb2RlXG5cdFx0XHRyZXR1cm4gaW5pdGlhbENyZWF0aW9uTW9kZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChsaXN0QmluZGluZyk7XG5cdFx0XHQvLyBOZXdBY3Rpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBjb2xsZWN0aW9uXG5cdFx0XHRpZiAoIWxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRjb25zdCBkYXRhTW9kZWxMaXN0QmluZGluZ1BhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSkpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBkYXRhTW9kZWxMaXN0QmluZGluZ1BhdGgudGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldCB8IHVuZGVmaW5lZCxcblx0XHRcdFx0XHQvLyBpZiBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzIGlzIHByZXNlbnQsIHRoZW4gY3JlYXRpb24gaXMgJ0RlZmVycmVkJ1xuXHRcdFx0XHRcdC8vIGluIHRoZSBhYnNlbmNlIG9mIE5ld0FjdGlvbiBvciBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzLCBjcmVhdGlvbiBpcyBhc3luY1xuXHRcdFx0XHRcdG5ld0FjdGlvbiA9IChcblx0XHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHRcdFx0PyBlbnRpdHlTZXQ/LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290XG5cdFx0XHRcdFx0XHRcdDogZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkXG5cdFx0XHRcdFx0KT8uTmV3QWN0aW9uPy50b1N0cmluZygpO1xuXG5cdFx0XHRcdGlmIChuZXdBY3Rpb24gJiYgZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoLnRhcmdldEVudGl0eVR5cGUuYWN0aW9uc1tuZXdBY3Rpb25dLnBhcmFtZXRlcnMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdC8vIGJpbmRpbmcgcGFyYW1ldGVyIChlZzogX2l0KSBpcyBub3QgY29uc2lkZXJlZFxuXHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IGNyZWF0aW9uUGFyYW1ldGVycyA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5nZXRDcmVhdGlvblBhcmFtZXRlcnMobGlzdEJpbmRpbmcsIGNyZWF0ZURhdGEsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0aWYgKGNyZWF0aW9uUGFyYW1ldGVycy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuQXN5bmM7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgYSBkb2N1bWVudC5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICovXG5cblx0YXN5bmMgdmFsaWRhdGVEb2N1bWVudChcblx0XHRjb250ZXh0OiBDb250ZXh0LFxuXHRcdHBhcmFtZXRlcnM6IHsgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uPzogc3RyaW5nOyBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9XG5cdCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkudmFsaWRhdGVEb2N1bWVudChjb250ZXh0LCBwYXJhbWV0ZXJzLCB0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IHByb3ZpZGVzIHRoZSByZXN1bHQgb2Zcblx0ICogYSBjcmVhdGlvbiByb3cncyBjdXN0b20gdmFsaWRhdGlvbiBhcyBhIHByb21pc2UuIElmIG5vIGNyZWF0aW9uIHJvdyBpcyBpbnZvbHZlZFxuXHQgKiB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIHJldHVybnMgYSByZXNvbHZlZCBwcm9taXNlLlxuXHQgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHdpdGggdGhlIGNyZWF0aW9uUm93XG5cdCAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcHJvbWlzZVxuXHQgKi9cblx0Z2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24odGFibGU6IFRhYmxlIHwgdW5kZWZpbmVkKTogKCkgPT4gUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiB7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSB0YWJsZT8uZ2V0Q3JlYXRpb25Sb3coKTtcblx0XHRpZiAoY3JlYXRpb25Sb3cgJiYgdGFibGUpIHtcblx0XHRcdHJldHVybiBhc3luYyAoKTogUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiA9PiB7XG5cdFx0XHRcdGNvbnN0IGNyZWF0aW9uUm93T2JqZWN0cyA9IChjcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpLmdldE9iamVjdCgpO1xuXHRcdFx0XHRkZWxldGUgY3JlYXRpb25Sb3dPYmplY3RzW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdFx0cmV0dXJuIHRoaXMudmFsaWRhdGVEb2N1bWVudCh0YWJsZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQsIHtcblx0XHRcdFx0XHRkYXRhOiBjcmVhdGlvblJvd09iamVjdHMsXG5cdFx0XHRcdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiB0YWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIilcblx0XHRcdFx0fSk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gYXN5bmMgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHNldmVyYWwgZG9jdW1lbnRzLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3RCaW5kaW5nIHVzZWQgdG8gY3JlYXRlIHRoZSBkb2N1bWVudHNcblx0ICogQHBhcmFtIGRhdGFGb3JDcmVhdGUgVGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIG5ldyBkb2N1bWVudHNcblx0ICogQHBhcmFtIGNyZWF0ZUF0RW5kIFRydWUgaWYgdGhlIG5ldyBjb250ZXh0cyBuZWVkIHRvIGJlIGNyZWF0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBpc0Zyb21Db3B5UGFzdGUgVHJ1ZSBpZiB0aGUgY3JlYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgcGFzdGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBiZWZvcmVDcmVhdGVDYWxsQmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjcmVhdGlvblxuXHQgKiBAcGFyYW0gY3JlYXRlQXNJbmFjdGl2ZSBUcnVlIGlmIHRoZSBjb250ZXh0cyBuZWVkIHRvIGJlIGNyZWF0ZWQgYXMgaW5hY3RpdmVcblx0ICogQHBhcmFtIHJlcXVlc3RTaWRlRWZmZWN0cyBUcnVlIGJ5IGRlZmF1bHQsIGZhbHNlIGlmIFNpZGVFZmZlY3RzIHNob3VsZCBub3QgYmUgcmVxdWVzdGVkXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHRzLlxuXHQgKi9cblx0YXN5bmMgY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0ZGF0YUZvckNyZWF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcblx0XHRjcmVhdGVBdEVuZDogYm9vbGVhbixcblx0XHRpc0Zyb21Db3B5UGFzdGU6IGJvb2xlYW4sXG5cdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbixcblx0XHRjcmVhdGVBc0luYWN0aXZlID0gZmFsc2UsXG5cdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhblxuXHQpOiBQcm9taXNlPENvbnRleHRbXT4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCB0YXJnZXRMaXN0QmluZGluZyA9IGxpc3RCaW5kaW5nO1xuXHRcdHJlcXVlc3RTaWRlRWZmZWN0cyA9IHJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2U7XG5cdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IHRhcmdldExpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRsZXQgbWV0YVBhdGg6IHN0cmluZztcblxuXHRcdFx0aWYgKHRhcmdldExpc3RCaW5kaW5nLmdldENvbnRleHQoKSkge1xuXHRcdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHt0YXJnZXRMaXN0QmluZGluZy5nZXRDb250ZXh0KCkuZ2V0UGF0aCgpfS8ke3RhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKX1gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKHRhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKHRhcmdldExpc3RCaW5kaW5nKTtcblxuXHRcdFx0Ly8gSXRlcmF0ZSBvbiBhbGwgaXRlbXMgYW5kIHN0b3JlIHRoZSBjb3JyZXNwb25kaW5nIGNyZWF0aW9uIHByb21pc2Vcblx0XHRcdGNvbnN0IGNyZWF0aW9uUHJvbWlzZXMgPSBkYXRhRm9yQ3JlYXRlLm1hcChhc3luYyAocHJvcGVydHlWYWx1ZXMpID0+IHtcblx0XHRcdFx0Y29uc3QgY3JlYXRlUGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyA9IHsgZGF0YToge30sIHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpIH07XG5cblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID0gZmFsc2U7IC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93O1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kID0gY3JlYXRlQXRFbmQ7XG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuaW5hY3RpdmUgPSBjcmVhdGVBc0luYWN0aXZlO1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrID0gYmVmb3JlQ3JlYXRlQ2FsbEJhY2s7XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcyB3ZSBkb24ndCBzdXBwb3J0IGRlZXAgY3JlYXRlXG5cdFx0XHRcdGZvciAoY29uc3QgcHJvcGVydHlQYXRoIGluIHByb3BlcnR5VmFsdWVzKSB7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydHkgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAke21ldGFQYXRofS8ke3Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eSAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHkuJGtpbmQgIT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiZcblx0XHRcdFx0XHRcdCFwcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpICYmXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eVBhdGhdXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmRhdGEhW3Byb3BlcnR5UGF0aF0gPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdFx0dGFyZ2V0TGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycyxcblx0XHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdFx0aXNGcm9tQ29weVBhc3RlXG5cdFx0XHRcdCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgY3JlYXRlZENvbnRleHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY3JlYXRpb25Qcm9taXNlcyk7XG5cdFx0XHRpZiAoIWNyZWF0ZUFzSW5hY3RpdmUpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUodGFyZ2V0TGlzdEJpbmRpbmcpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRjb25zdCBhY3RpdmVDb250ZXh0cyA9IGNyZWF0ZWRDb250ZXh0cy5maWx0ZXIoKG5ld0NvbnRleHQpID0+ICFuZXdDb250ZXh0LmlzSW5hY3RpdmUoKSk7XG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbChhY3RpdmVDb250ZXh0cy5tYXAoYXN5bmMgKG5ld0NvbnRleHQpID0+IG5ld0NvbnRleHQuY3JlYXRlZCgpKSk7XG5cblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRpZiAocmVxdWVzdFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLCB0aGlzLmJhc2UuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpICYmIGFjdGl2ZUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkNyZWF0ZSwgYWN0aXZlQ29udGV4dHMpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gY3JlYXRlZENvbnRleHRzO1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgbXVsdGlwbGUgZG9jdW1lbnRzLlwiKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0NyZWF0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0NyZWF0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlQ3JlYXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dFBhdGggUGF0aCBwb2ludGluZyB0byB0aGUgY29udGV4dCBvbiB3aGljaCBDcmVhdGUgYWN0aW9uIGlzIHRyaWdnZXJlZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNyZWF0ZVBhcmFtZXRlcnMgQXJyYXkgb2YgdmFsdWVzIHRoYXQgYXJlIGZpbGxlZCBpbiB0aGUgQWN0aW9uIFBhcmFtZXRlciBEaWFsb2dcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25CZWZvcmVDcmVhdGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0UGF0aD86IHN0cmluZzsgY3JlYXRlUGFyYW1ldGVycz86IHVua25vd25bXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0VkaXQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdFZGl0JyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVFZGl0XG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBlZGl0ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKFwiQWZ0ZXJBc3luY1wiKVxuXHRhc3luYyBvbkJlZm9yZUVkaXQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ1NhdmUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdTYXZlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnU2F2ZScgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVTYXZlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBzYXZlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnU2F2ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnU2F2ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoXCJBZnRlckFzeW5jXCIpXG5cdGFzeW5jIG9uQmVmb3JlU2F2ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGlzY2FyZCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGRpc2NhcmRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQmVmb3JlRGlzY2FyZChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGVsZXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWxldGVkXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQmVmb3JlRGVsZXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlIGFjdGlvbiBleGVjdXRpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVFeGVjdXRlQWN0aW9uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgdXNlZCBmb3IgdGhlIGFjdGlvbiBleGVjdXRpb25cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKFwiQWZ0ZXJBc3luY1wiKVxuXHRhc3luYyBvbkJlZm9yZUV4ZWN1dGVBY3Rpb24oX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB8IENvbnRleHQgfCBudWxsIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkFmdGVyU2F2ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgVGhlIGNvbnRleHQgd2Ugb2J0YWluZWQgYWZ0ZXIgc2F2aW5nXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlclNhdmUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ0NyZWF0ZScgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkFmdGVyQ3JlYXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBUaGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0XG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckNyZWF0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnRWRpdCcgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkFmdGVyRWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJFZGl0KF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQWZ0ZXJEaXNjYXJkXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBUaGUgY29udGV4dCBvYnRhaW5lZCBhZnRlciBkaXNjYXJkaW5nIHRoZSBvYmplY3QsIG9yIHVuZGVmaW5lZCBpZiB3ZSBkaXNjYXJkZWQgYSBuZXcgb2JqZWN0XG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckRpc2NhcmQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkFmdGVyRGVsZXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJEZWxldGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIEluZGljYXRlcyB3aGV0aGVyIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIFNhdmUgZHVyaW5nIGFuIElubGluZSBjcmVhdGlvblxuXHQvLyBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMuYmluZGluZ3MgTGlzdCBiaW5kaW5ncyBvZiB0aGUgdGFibGVzIGluIHRoZSB2aWV3LlxuXHQvLyBCb3RoIG9mIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGFyZSBmb3IgdGhlIHNhbWUgcHVycG9zZS4gVXNlciBjYW4gZW50ZXIgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgY3JlYXRpb24gcm93KHMpIGJ1dCBkb2VzIG5vdCAnQWRkIHJvdycsIGluc3RlYWQgY2xpY2tzIFNhdmUuXG5cdC8vIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIGluIHRoZSB2aWV3LlxuXG5cdC8qKlxuXHQgKiBTYXZlcyBhIG5ldyBkb2N1bWVudCBhZnRlciBjaGVja2luZyBpdC5cblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2Ugc2F2ZSBpcyBjb21wbGV0ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBzYXZlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1QYXJhbWV0ZXJzOiBTYXZlRG9jdW1lbnRQYXJhbWV0ZXJzKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gc2F2ZURvY3VtZW50IGlzIGNhbGxlZCBmcm9tIGlubGluZSBlZGl0IGtleWJvYXJkIHNob3J0Y3V0XG5cdFx0aWYgKFxuXHRcdFx0IXRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikgJiZcblx0XHRcdHRoaXMuYmFzZS5pbmxpbmVFZGl0Rmxvdz8uaXNJbmxpbmVFZGl0UG9zc2libGUoKSAmJlxuXHRcdFx0dGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvaXNJbmxpbmVFZGl0QWN0aXZlXCIpXG5cdFx0KSB7XG5cdFx0XHR0aGlzLmJhc2UuaW5saW5lRWRpdEZsb3cuaW5saW5lRWRpdFNhdmUoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGNvbnN0IGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGFCaW5kaW5ncyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzIGFzIE9EYXRhTGlzdEJpbmRpbmdbXTtcblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdC8vIGluIGNhc2Ugb2Ygc2F2aW5nIC8gYWN0aXZhdGluZyB0aGUgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBzaGFsbCBiZSByZW1vdmVkIGJlZm9yZSB0aGUgUEFUQ0gvUE9TVFxuXHRcdFx0Ly8gaXMgc2VudCB0byB0aGUgYmFja2VuZFxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm1lcmdlUGF0Y2hEcmFmdCAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRcdC8vd2UgbmVlZCB0byByZXF1ZXN0IGZvciByZWNvbW1lbmRhdGlvbnMgYW5kIHRoZW4gYnJpbmcgdGhlIGRpYWxvZyBoZXJlXG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblxuXHRcdFx0Y29uc3QgcmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuID0gYXdhaXQgdGhpcy5jaGVja1JlY29tbWVuZGF0aW9uT3B0aW9uKCk7XG5cdFx0XHRjb25zdCByb290Q29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Um9vdENvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlU2F2ZSh7IGNvbnRleHQ6IHJvb3RDb250ZXh0IH0pO1xuXG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiZcblx0XHRcdFx0XHRyb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHx8XG5cdFx0XHRcdCh0aGlzLl9oaWRkZW5EcmFmdCAmJiBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSlcblx0XHRcdCkge1xuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdFx0dGhpcy5faGlkZGVuRHJhZnQgPyBvQ29udGV4dCA6IChyb290Vmlld0NvbnRyb2xsZXIgYXMgRmNsQ29udHJvbGxlcikuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRXhlY3V0ZSB0aGUgcmVnaXN0ZXJlZCBkZWZlcnJlZCBTaWRlRWZmZWN0cyB3aGljaCBoYXZlIG5vdCBiZSBleGVjdXRlZCB5ZXQgZm9yIHRoZSBwYWdlIGNvbnRleHRcblx0XHRcdC8vIENhbiBvY2N1ciB3aGVuIHNob3J0Y3V0IGlzIHVzZWQgdG8gc2F2ZSB0aGUgZG9jdW1lbnQuXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuX3NpZGVFZmZlY3RzLmhhbmRsZVBhZ2VDaGFuZ2VDb250ZXh0KG9Db250ZXh0KTtcblxuXHRcdFx0Ly8gVGhlICRhdXRvIHF1ZXVlIGNhbiBvbmx5IGhhdmUgcGVuZGluZyBjaGFuZ2VzIGF0IHRoaXMgcG9pbnQgd2hlbiBTQVZFIHdhcyBjbGlja2VkIGltbWVkaWF0ZWx5IGFmdGVyIGNoYW5naW5nIGEgZmllbGQuXG5cdFx0XHQvLyBJbiB0aGlzIGNhc2UgdGhlICRhdXRvIHF1ZXVlIGlzIGxvY2tlZCB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBzdWJtaXQgYmF0Y2ggc2hvdWxkIG5vdCBjcmVhdGUgYSBzZXBhcmF0ZSBiYXRjaCByZXF1ZXN0LlxuXHRcdFx0Ly8gSXQgaXMgZG9uZSBpbiBvcmRlciB0byBtYWtlIHN1cmUgdGhhdCBwYXRjaCwgZHJhZnRwcmVwYXJlLCBkcmFmdGFjdGl2YXRlIGVhY2ggaGF2ZSB0aGVpciBvd24gY2hhbmdlc2V0XG5cdFx0XHRpZiAob0NvbnRleHQuZ2V0TW9kZWwoKS5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpICYmIG1QYXJhbWV0ZXJzLm1lcmdlUGF0Y2hEcmFmdCkge1xuXHRcdFx0XHRvQ29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGFjdGl2ZURvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLnNhdmVEb2N1bWVudChcblx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgYXMgYm9vbGVhbixcblx0XHRcdFx0YUJpbmRpbmdzLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCksXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0bVBhcmFtZXRlcnM/LmlzU3RhbmRhcmRTYXZlXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCk7XG5cdFx0XHRpZiAodGhpcy5faGlkZGVuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5oYW5kbGVTZXNzaW9uT2ZmKCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5BY3RpdmF0ZSwgYWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShTdGFuZGFyZEFjdGlvbnMuc2F2ZSwgVHJpZ2dlclR5cGUuc3RhbmRhcmRBY3Rpb24pO1xuXG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJTYXZlKHtcblx0XHRcdFx0Y29udGV4dDogYWN0aXZlRG9jdW1lbnRDb250ZXh0XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gdXBkYXRlIHRlbGVtZXRyeSBkYXRhIGZvciBob3cgcGFnZSB3YXMgc2F2ZWQgYW5kIHRoZW4gZG8gc3RvcmluZyBvZiB0aGlzIGRhdGEgdG8gYmFja2VuZCB0aHJvdWdoIHRoZSBzdG9yZURhdGEgZnVuY3Rpb25cblx0XHRcdHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuc3RvcmVEYXRhRm9yVGVsZW1ldHJ5KHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3Nlbik7XG5cblx0XHRcdGlmIChhY3RpdmVEb2N1bWVudENvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IGFjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgYWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblxuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHQvLyBXaGVuIHNhdmluZywgdGhlIHNlbWFudGljIGtleXMgbWF5IGhhdmUgY2hhbmdlZC5cblx0XHRcdFx0XHQvLyBJbiB0aGlzIGNhc2UsIHdlIGFsc28gbmVlZCB0byBtYW5hZ2UgdGhlIHNlbWFudGljIFVSTCBjaGFuZ2UgaW4gdGhlIGhpc3Rvcnlcblx0XHRcdFx0XHRjb25zdCBwcmV2aW91c1NlbWFudGljUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChvQ29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0Y29uc3QgbmV3U2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKGFjdGl2ZURvY3VtZW50Q29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKHByZXZpb3VzU2VtYW50aWNQYXRoICYmIG5ld1NlbWFudGljUGF0aCAmJiBwcmV2aW91c1NlbWFudGljUGF0aCAhPT0gbmV3U2VtYW50aWNQYXRoKSB7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5wdXNoKHsgb2xkUGF0aDogcHJldmlvdXNTZW1hbnRpY1BhdGgsIG5ld1BhdGg6IG5ld1NlbWFudGljUGF0aCB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdGlmIChyb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkgfHwgdGhpcy5faGlkZGVuRHJhZnQ/LnN0YXlPbkN1cnJlbnRQYWdlQWZ0ZXJTYXZlKSB7XG5cdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9PSBhY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3ICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgeyBlZGl0YWJsZTogZmFsc2UsIHJlY3JlYXRlQ29udGV4dDogZmFsc2UsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0aWYgKCEob0Vycm9yICYmIChvRXJyb3IgYXMgeyBjYW5jZWxlZD86IGJvb2xlYW4gfSkuY2FuY2VsZWQpKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIHRoZSBVSSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBzd2l0Y2ggZnJvbVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIHN3aXRjaCBpcyBkb25lXG5cdCAqL1xuXHRhc3luYyB0b2dnbGVEcmFmdEFjdGl2ZShvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdGxldCBlZGl0YWJsZTogYm9vbGVhbjtcblx0XHRjb25zdCBiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHQvL3RvZ2dsZSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgZm9yIGVkaXQgZHJhZnRzIGFuZCBhY3RpdmUgZG9jdW1lbnRzIHdpdGggZHJhZnQpXG5cdFx0aWYgKFxuXHRcdFx0IWJJc0RyYWZ0IHx8XG5cdFx0XHQhKFxuXHRcdFx0XHQoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB8fFxuXHRcdFx0XHQob0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHQvL3N0YXJ0IFBvaW50OiBlZGl0IGRyYWZ0XG5cdFx0XHRlZGl0YWJsZSA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBzdGFydCBwb2ludCBhY3RpdmUgZG9jdW1lbnRcblx0XHRcdGVkaXRhYmxlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdFx0Y29uc3Qgb1JpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvQ29udGV4dDtcblx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9SaWdodG1vc3RDb250ZXh0LCBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCBmYWxzZSk7XG5cdFx0XHRpZiAoIXNpYmxpbmdJbmZvICYmIG9Db250ZXh0ICE9PSBvUmlnaHRtb3N0Q29udGV4dCkge1xuXHRcdFx0XHQvLyBUcnkgdG8gY29tcHV0ZSBzaWJsaW5nIGluZm8gZm9yIHRoZSByb290IGNvbnRleHQgaWYgaXQgZmFpbHMgZm9yIHRoZSByaWdodG1vc3QgY29udGV4dFxuXHRcdFx0XHQvLyAtLT4gSW4gY2FzZSBvZiBGQ0wsIGlmIHdlIHRyeSB0byBzd2l0Y2ggYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGJ1dCBhIGNoaWxkIGVudGl0eSBoYXMgbm8gc2libGluZywgdGhlIHN3aXRjaCB3aWxsIGNsb3NlIHRoZSBjaGlsZCBjb2x1bW5cblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvQ29udGV4dCwgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNpYmxpbmdJbmZvKSB7XG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdFx0XHRcdGlmIChsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBvQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldFBhdGggPSBzaWJsaW5nSW5mby5wYXRoTWFwcGluZ1tzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8ucGF0aE1hcHBpbmcucHVzaCh7IG9sZFBhdGg6IGxhc3RTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoLCBuZXdQYXRoOiB0YXJnZXRQYXRoIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LCB7IGVkaXRhYmxlLCByZWNyZWF0ZUNvbnRleHQ6IHRydWUsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZSAtIENhbm5vdCBmaW5kIHNpYmxpbmdcIik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlOiR7b0Vycm9yfWApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3NhcC5tLkJ1dHRvbn0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIC0gQ3VycmVudGx5IHRoaXMgaXMgcGFzc2VkIGFzIGNhbmNlbEJ1dHRvbiBpbnRlcm5hbGx5IChyZXBsYWNlZCBieSBtUGFyYW1ldGVycy5jb250cm9sIGluIHRoZSBKU0RvYyBiZWxvdykuIEN1cnJlbnRseSBpdCBpcyBhbHNvIG1hbmRhdG9yeS5cblx0Ly8gUGxhbiAtIFRoaXMgc2hvdWxkIG5vdCBiZSBtYW5kYXRvcnkuIElmIG5vdCBwcm92aWRlZCwgd2Ugc2hvdWxkIGhhdmUgYSBkZWZhdWx0IHRoYXQgY2FuIGFjdCBhcyByZWZlcmVuY2UgY29udHJvbCBmb3IgdGhlIGRpc2NhcmQgcG9wb3ZlciBPUiB3ZSBjYW4gc2hvdyBhIGRpYWxvZyBpbnN0ZWFkIG9mIGEgcG9wb3Zlci5cblxuXHQvKipcblx0ICogRGlzY2FyZCB0aGUgZWRpdGFibGUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRyb2wgVGhpcyBpcyB0aGUgY29udHJvbCB1c2VkIHRvIG9wZW4gdGhlIGRpc2NhcmQgcG9wb3ZlclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgYW5kIGFsbG93cyBjdXN0b20gaGFuZGxpbmdcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBCYWNrTmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGVkaXRhYmxlIGRvY3VtZW50IGhhcyBiZWVuIGRpc2NhcmRlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBjYW5jZWxEb2N1bWVudChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRtUGFyYW1ldGVyczoge1xuXHRcdFx0Y29udHJvbD86IEJ1dHRvbjtcblx0XHRcdGNhbmNlbEJ1dHRvbj86IEJ1dHRvbjtcblx0XHRcdHNraXBEaXNjYXJkUG9wb3Zlcj86IGJvb2xlYW47XG5cdFx0XHRza2lwQmFja05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0c2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRsZXQgaXNOZXdEb2N1bWVudCA9IGZhbHNlO1xuXHRcdG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciA9IHRoaXMuX2hpZGRlbkRyYWZ0Py5lbmFibGVkID8gdHJ1ZSA6IG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3Zlcjtcblx0XHRjb25zdCBjYW5jZWxQYXJhbWV0ZXJzOiBDYW5jZWxQYXJhbWV0ZXJzID0ge1xuXHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiBtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgPT09IHRydWUsXG5cdFx0XHRjYW5jZWxCdXR0b246IChtUGFyYW1ldGVycy5jb250cm9sIHx8IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbikhLFxuXHRcdFx0YmVmb3JlQ2FuY2VsQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURpc2NhcmRcblx0XHR9O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGxldCByb290Q29udGV4dDogQ29udGV4dDtcblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIHRoZSByb290IGNvbnRleHQgYmFzZWQgb24gaGlkZGVuIGRyYWZ0IG1vZGUgYW5kIHByb2dyYW1taW5nIG1vZGVsXG5cdFx0XHRpZiAodGhpcy5faGlkZGVuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgPT09IFwiRHJhZnRcIikge1xuXHRcdFx0XHRjb25zdCByb290Q29udGV4dFBhdGggPSBNb2RlbEhlbHBlci5nZXREcmFmdFJvb3RQYXRoKG9Db250ZXh0KTtcblx0XHRcdFx0cm9vdENvbnRleHQgPSBvQ29udGV4dC5nZXRQYXRoKCkgPT09IHJvb3RDb250ZXh0UGF0aCA/IG9Db250ZXh0IDogYXdhaXQgdGhpcy5nZXRSb290Q29udGV4dChvQ29udGV4dCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyb290Q29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Um9vdENvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCgoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpKSAmJiB0aGlzLl9pc0ZjbEVuYWJsZWQoKSkgfHxcblx0XHRcdFx0dGhpcy5faGlkZGVuRHJhZnRcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cblx0XHRcdFx0Ly8gTm8gbmVlZCB0byB0cnkgdG8gZ2V0IHJpZ2h0bW9zdCBjb250ZXh0IGluIGNhc2Ugb2YgYSBuZXcgb2JqZWN0XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0XHR0aGlzLl9oaWRkZW5EcmFmdCA/IG9Db250ZXh0IDogKG9Sb290Vmlld0NvbnRyb2xsZXIgYXMgRmNsQ29udHJvbGxlcikuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY2FuY2VsUmVzdWx0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuY2FuY2VsRG9jdW1lbnQoXG5cdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRjYW5jZWxQYXJhbWV0ZXJzLFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0dGhpcy5faGlkZGVuRHJhZnQgPyB0aGlzLmdldENyZWF0aW9uTW9kZSgpICYmICFyb290Q29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSA6IHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCksXG5cdFx0XHRcdHRoaXMuaXNEb2N1bWVudE1vZGlmaWVkKCkgfHwgc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IC8vIEluIHN0aWNreSBtb2RlIHdlIGFsd2F5cyBhc2sgZm9yIGNvbmZpcm1hdGlvblxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpXG5cdFx0XHRcdC5nZXRJbnN0YW5jZWRWaWV3cygpXG5cdFx0XHRcdC5mb3JFYWNoKCh2aWV3KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY29udGV4dCA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0aWYgKGNvbnRleHQ/LmlzS2VlcEFsaXZlKCkgPT09IHRydWUpIHtcblx0XHRcdFx0XHRcdGNvbnRleHQuc2V0S2VlcEFsaXZlKGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCk7XG5cdFx0XHRpZiAodGhpcy5faGlkZGVuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5oYW5kbGVTZXNzaW9uT2ZmKCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckRpc2NhcmQoe1xuXHRcdFx0XHRjb250ZXh0OiBjYW5jZWxSZXN1bHRcblx0XHRcdH0pO1xuXHRcdFx0Ly8gd2UgZm9yY2UgdGhlIGVkaXQgc3RhdGUgZXZlbiBmb3IgRkNMIGJlY2F1c2UgdGhlIGRyYWZ0IGRpc2NhcmQgbWlnaHQgbm90IGJlIGltcGxlbWVudGVkXG5cdFx0XHQvLyBhbmQgd2UgbWF5IGp1c3QgZGVsZXRlIHRoZSBkcmFmdFxuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRpZiAoIWNhbmNlbFJlc3VsdCkge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGlzY2FyZCwgb0NvbnRleHQpO1xuXHRcdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0Ly9pbiBjYXNlIG9mIGEgbmV3IGRvY3VtZW50LCBubyBhY3RpdmVDb250ZXh0IGlzIHJldHVybmVkIC0tPiBuYXZpZ2F0ZSBiYWNrLlxuXHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnNraXBCYWNrTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQocm9vdENvbnRleHQpO1xuXHRcdFx0XHRcdGlzTmV3RG9jdW1lbnQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gY2FuY2VsUmVzdWx0O1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGlzY2FyZCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0KHRoaXMuX2lzRmNsRW5hYmxlZCgpIHx8IHRoaXMuX2hpZGRlbkRyYWZ0Py5zdGF5T25DdXJyZW50UGFnZUFmdGVyQ2FuY2VsKSAmJlxuXHRcdFx0XHRcdHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9PSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIGxvYWQgdGhlIHNlbWFudGljIGtleXMgb2YgdGhlIGFjdGl2ZSBjb250ZXh0LCBhcyB3ZSBuZWVkIHRoZW1cblx0XHRcdFx0XHQvLyBmb3IgdGhlIG5hdmlnYXRpb25cblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdC8vIFdlIGZvcmNlIHRoZSByZWNyZWF0aW9uIG9mIHRoZSBjb250ZXh0LCBzbyB0aGF0IGl0J3MgY3JlYXRlZCBhbmQgYm91bmQgaW4gdGhlIHNhbWUgbWljcm90YXNrLFxuXHRcdFx0XHRcdC8vIHNvIHRoYXQgYWxsIHByb3BlcnRpZXMgYXJlIGxvYWRlZCB0b2dldGhlciBieSBhdXRvRXhwYW5kU2VsZWN0LCBzbyB0aGF0IHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gRWRpdCBtb2RlXG5cdFx0XHRcdFx0Ly8gJCRpbmhlcml0RXhwYW5kU2VsZWN0IHRha2VzIGFsbCBsb2FkZWQgcHJvcGVydGllcyBpbnRvIGFjY291bnQgKEJDUCAyMDcwNDYyMjY1KVxuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXcpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHsgZWRpdGFibGU6IGZhbHNlLCByZWNyZWF0ZUNvbnRleHQ6IHRydWUsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBBY3RpdmUgY29udGV4dCBpcyByZXR1cm5lZCBpbiBjYXNlIG9mIGNhbmNlbCBvZiBleGlzdGluZyBkb2N1bWVudCwgYW5kIGl0J3MgdGhlIHNhbWUgYXMgdGhlIGVkaXRlZCBjb250ZXh0XG5cdFx0XHRcdFx0Ly8gU28sIHdlIGZvcmNlIHRoZSByZWNyZWF0aW9uIGFzIGl0IG1heSBoYXZlIGJlZW4gZGVzdHJveWVkIHdoZW4gY2FsbGluZyBzZXRLZWVwQWxpdmUoZmFsc2UpIG9uIGFsbCB2aWV3J3MgY29udGV4dHNcblx0XHRcdFx0XHQvLyBlYXJsaWVyIGluIHRoaXMgbWV0aG9kXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgeyBlZGl0YWJsZTogZmFsc2UsIHJlY3JlYXRlQ29udGV4dDogdHJ1ZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmICF0aGlzLl9oaWRkZW5EcmFmdCkge1xuXHRcdFx0XHQvL3Nob3cgRHJhZnQgZGlzY2FyZGVkIG1lc3NhZ2UgdG9hc3Qgb25seSBmb3IgZHJhZnQgZW5hYmxlZCBhcHBzXG5cdFx0XHRcdHRoaXMuc2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UoaXNOZXdEb2N1bWVudCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkaXNjYXJkaW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBnZXRSb290Q29udGV4dChjb250ZXh0OiBDb250ZXh0LCBiaW5kaW5nUGFyYW1ldGVycz86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvW1wicGFyYW1ldGVyc1wiXSk6IFByb21pc2U8Q29udGV4dD4ge1xuXHRcdGNvbnN0IHZpZXdEYXRhID0gdGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncztcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXHRcdGlmICgodmlld0RhdGE/LnZpZXdMZXZlbCBhcyBudW1iZXIpID4gMSkge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgfHwgcHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0cmV0dXJuIChhd2FpdCBDb21tb25VdGlscy5jcmVhdGVSb290Q29udGV4dChcblx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnNcblx0XHRcdFx0KSkgYXMgQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNvbnRleHQ7XG5cdH1cblxuXHRhc3luYyBpc1Jvb3RDb250ZXh0TmV3KGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCByb290Q29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Um9vdENvbnRleHQoY29udGV4dCwgeyAkc2VsZWN0OiBcIkhhc0FjdGl2ZUVudGl0eSxJc0FjdGl2ZUVudGl0eVwiIH0pO1xuXHRcdC8vIFdoZW4gd2UgcmVmcmVzaCB0aGUgcm9vdCBjb250ZXh0LCBpdCBtYXkgbm90IGhhdmUgdGhlIHByb3BlcnRpZXMgSGFzQWN0aXZlRW50aXR5IGFuZCBJc0FjdGl2ZUVudGl0eSB5ZXQsIHNvIHdlIHJlcXVlc3QgdGhlbVxuXHRcdGNvbnN0IGRyYWZ0UHJvcGVydGllcyA9IGF3YWl0IHJvb3RDb250ZXh0LnJlcXVlc3RQcm9wZXJ0eShbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiXSk7XG5cdFx0cmV0dXJuICFkcmFmdFByb3BlcnRpZXNbMF0gJiYgIWRyYWZ0UHJvcGVydGllc1sxXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCcmluZ3MgdXAgYSBtZXNzYWdlIHRvYXN0IHdoZW4gYSBkcmFmdCBpcyBkaXNjYXJkZWQuXG5cdCAqIEBwYXJhbSBpc05ld0RvY3VtZW50IFRoaXMgaXMgYSBCb29sZWFuIGZsYWcgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIG5ldyBvciBhbHJlYWR5IGV4aXN0cy5cblx0ICovXG5cdHNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlKGlzTmV3RG9jdW1lbnQ/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IHRoaXMuX2dldFJlc291cmNlTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRElTQ0FSRF9EUkFGVF9UT0FTVFwiKTtcblx0XHRpZiAoaXNOZXdEb2N1bWVudCA9PSB0cnVlKSB7XG5cdFx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQoe30sIHRoaXMuc2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0LCB0aGlzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3cobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIGluIHNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlIHdoZW4gbm8gY29udGV4dCBpcyBwYXNzZWQuXG5cdCAqL1xuXHRzaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQoKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IHRoaXMuX2dldFJlc291cmNlTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRElTQ0FSRF9EUkFGVF9UT0FTVFwiKTtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdE1lc3NhZ2VUb2FzdC5zaG93KG1lc3NhZ2UsIHsgY2xvc2VPbkJyb3dzZXJOYXZpZ2F0aW9uOiBmYWxzZSB9KTtcblx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5kZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCh0aGlzLnNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCwgdGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgY29udGV4dCBjb3JyZXNwb25kcyB0byBhIGRyYWZ0IHJvb3QuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGNoZWNrXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNvbnRleHQgcG9pbnRzIHRvIGEgZHJhZnQgcm9vdFxuXHQgKi9cblx0cHJpdmF0ZSBpc0RyYWZ0Um9vdChjb250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRyZXR1cm4gTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS50YXJnZXRFbnRpdHlTZXQpO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lIE5hbWUgb2YgdGhlIEVudGl0eVNldCB0byB3aGljaCB0aGUgb2JqZWN0IGJlbG9uZ3NcblxuXHQvKipcblx0ICogRGVsZXRlcyB0aGUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy50aXRsZSBUaXRsZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBkb2N1bWVudCBoYXMgYmVlbiBkZWxldGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGRlbGV0ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtSW5QYXJhbWV0ZXJzPzogeyB0aXRsZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRjb25zdCBtUGFyYW1ldGVyczoge1xuXHRcdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRcdHBhcmVudENvbnRyb2w/OiBDb250cm9sO1xuXHRcdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzOiBib29sZWFuO1xuXHRcdFx0XHRzZWxlY3RlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdFx0dGl0bGU/OiBzdHJpbmc7XG5cdFx0XHRcdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHRcdFx0fSA9IHsgLi4ubUluUGFyYW1ldGVycywgYkZpbmRBY3RpdmVDb250ZXh0czogZmFsc2UsIGJlZm9yZURlbGV0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGUgfSxcblx0XHRcdG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLl9pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0XHR0aGlzLmlzRHJhZnRSb290KG9Db250ZXh0KSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRJbmRleCgpID09PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpID09PSB0cnVlXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gRGVsZXRpbmcgYW4gYWN0aXZlIGVudGl0eSB3aGljaCBoYXMgYSBkcmFmdCB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGJlIGRpc3BsYXllZCBpbiB0aGUgTGlzdFJlcG9ydCAoRkNMIGNhc2UpXG5cdFx0XHRcdC8vIC0tPiBuZWVkIHRvIHJlbW92ZSB0aGUgZHJhZnQgZnJvbSB0aGUgTFIgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgYWN0aXZlIHZlcnNpb24sIHNvIHRoYXQgdGhlIExpc3RCaW5kaW5nIGlzIHByb3Blcmx5IHJlZnJlc2hlZFxuXHRcdFx0XHQvLyBUaGUgY29uZGl0aW9uICdvQ29udGV4dC5nZXRJbmRleCgpID09PSB1bmRlZmluZWQnIG1ha2VzIHN1cmUgdGhlIGFjdGl2ZSB2ZXJzaW9uIGlzbid0IGFscmVhZHkgZGlzcGxheWVkIGluIHRoZSBMUlxuXHRcdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IGFzeW5jIChwYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlKHBhcmFtZXRlcnMpO1xuXG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IG1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkcmFmdFBhdGggPSBhd2FpdCBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRDb250ZXh0VG9SZW1vdmUgPSBtb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGRyYWZ0UGF0aCk7XG5cdFx0XHRcdFx0XHRkcmFmdENvbnRleHRUb1JlbW92ZS5yZXBsYWNlV2l0aChvQ29udGV4dCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcGxhY2luZyB0aGUgZHJhZnQgaW5zdGFuY2UgaW4gdGhlIExSIE9ETEJcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHQvLyBTaW5nbGUgb2JqZXQgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYW4gT1AgaGVhZGVyIGJ1dHRvbiAobm90IGZyb20gYSBsaXN0KVxuXHRcdFx0Ly8gLS0+IE1hcmsgVUkgZGlydHkgYW5kIG5hdmlnYXRlIGJhY2sgdG8gZGlzbWlzcyB0aGUgT1Bcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0QmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0aWYgKGNvbnRleHRCaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0aWYgKGNvbnRleHRCaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdFx0XHQvLyBFdmVuIGluIHRoZSBGQ0wgY2FzZSwgd2UgbmVlZCB0byByZWZyZXNoIHRoZSBsaXN0YmluZGluZyBpbiB0aGUgTFIgKG5vdCBPUCkgdG8gdXBkYXRlIHRoZSBjb3VudHMgaW4gdGhlIHRhYnMgYW5kIHF1aWNrZmlsdGVyc1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnJlZnJlc2hMaXN0QmluZGluZyhjb250ZXh0QmluZGluZywgb0FwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChtUGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgIT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGNvbnRleHRCaW5kaW5nLCBjb250ZXh0QmluZGluZy5nZXRDb250ZXh0KCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBvQ29udGV4dCk7XG5cblx0XHRcdC8vIEFmdGVyIGRlbGV0ZSBpcyBzdWNjZXNzZnVsbCwgd2UgbmVlZCB0byBkZXRhY2ggdGhlIHNldEJhY2tOYXZpZ2F0aW9uIE1ldGhvZHNcblx0XHRcdGF3YWl0IG9BcHBDb21wb25lbnQ/LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0Y29uc3QgaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQgPSB0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlzUmVjb21tZW5kYXRpb25FbmFibGVkKCk7XG5cdFx0XHQvLyBXZSBjbGVhciByZWNvbW1lbmRhdGlvbiBkYXRhIGFuZCBjb250ZXh0cyBmcm9tIGludGVybmFsIG1vZGVsIGZvciB0aGUgZGVsZXRlZCBjb250ZXh0c1xuXHRcdFx0aWYgKGlzUmVjb21tZW5kYXRpb25FbmFibGVkKSB7XG5cdFx0XHRcdHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaWdub3JlUmVjb21tZW5kYXRpb25Gb3JDb250ZXh0cyhbb0NvbnRleHRdKTtcblx0XHRcdH1cblx0XHRcdC8vIE5vdGlmeSBjb25zdW1lcnMgb2Ygd2hpY2ggY29udGV4dHMgd2VyZSBkZWxldGVkXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckRlbGV0ZSh7IGNvbnRleHRzOiBbb0NvbnRleHRdIH0pO1xuXG5cdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdGlmIChvQXBwQ29tcG9uZW50Py5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5EZWVwbGluaykge1xuXHRcdFx0XHRcdC8vIEluIGNhc2UgdGhlIGFwcCBoYXMgYmVlbiBsYXVuY2hlZCB3aXRoIHNlbWFudGljIGtleXMsIGRlbGV0aW5nIHRoZSBvYmplY3Qgd2UndmUgbGFuZGVkIG9uIHNoYWxsIG5hdmlnYXRlIGJhY2tcblx0XHRcdFx0XHQvLyB0byB0aGUgYXBwIHdlIGNhbWUgZnJvbSAoZXhjZXB0IGZvciBGQ0wsIHdoZXJlIHdlIG5hdmlnYXRlIHRvIExSIGFzIHVzdWFsKVxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5leGl0RnJvbUFwcCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEVsc2UgbmF2aWdhdGUgYmFjayBmcm9tIHRoZSBwYWdlLiBJbiBGQ0wsIHRoaXMgaXMgZG9uZSB3aGVuIHRoZSBrZXB0LWFsaXZlIGNvbnRleHQgaXMgZGVzdHJveWVkIChjYWxsYmFjaylcblx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJtaXQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMgYW5kIG5hdmlnYXRlIGJhY2suXG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBzYXZlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBhcHBseURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGlmIChvQ29udGV4dC5nZXRNb2RlbCgpLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0XHQvL3dlIG5lZWQgdG8gcmVxdWVzdCBmb3IgcmVjb21tZW5kYXRpb25zIGFuZCB0aGVuIGJyaW5nIHRoZSBkaWFsb2cgaGVyZVxuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaXNDb250aW51ZSA9IGF3YWl0IHRoaXMuc2hvd0NvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2coZmFsc2UpO1xuXHRcdFx0aWYgKGlzQ29udGludWUgPT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIHsgY2FsbEV4dGVuc2lvbjogdHJ1ZSB9KTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbl0gQm9vbGVhbiB2YWx1ZSBmb3Igc3RhdGljIGFjdGlvbiwgdW5kZWZpbmVkIGZvciBvdGhlciBhY3Rpb25zXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlXSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWRcblx0Ly8gQ3VycmVudGx5IHRoZSBwYXJhbWV0ZXIgaXNOYXZpZ2FibGUgaXMgdXNlZCBpbnRlcm5hbGx5IGFuZCBzaG91bGQgYmUgY2hhbmdlZCB0byByZXF1aXJlc05hdmlnYXRpb24gYXMgaXQgaXMgYSBtb3JlIGFwdCBuYW1lIGZvciB0aGlzIHBhcmFtXG5cblx0LyoqXG5cdCAqIEludm9rZXMgYW4gYWN0aW9uIChib3VuZCBvciB1bmJvdW5kKSBhbmQgdHJhY2tzIHRoZSBjaGFuZ2VzIHNvIHRoYXQgb3RoZXIgcGFnZXMgY2FuIGJlIHJlZnJlc2hlZCBhbmQgc2hvdyB0aGUgdXBkYXRlZCBkYXRhIHVwb24gbmF2aWdhdGlvbi5cblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIEFuIG9wdGlvbmFsIGFycmF5IG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBhY3Rpb24gcGFyYW1ldGVycywgd2hlcmUgZWFjaCBvYmplY3QgaGFzIGEgbmFtZSBvZiBzdHJpbmcgdHlwZSBhbmQgYSB2YWx1ZSB0aGF0IGNhbiBiZSBvZiBhbnkgZGF0YSB0eXBlLlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBpZiB2YWx1ZXMgYXJlIHByb3ZpZGVkIGZvciBhbGwgb2YgdGhlbSBpbiBwYXJhbWV0ZXJWYWx1ZXNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY29udGV4dHMgRm9yIGEgYm91bmQgYWN0aW9uLCBhIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBjYWxsZWQgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5tb2RlbCBGb3IgYW4gdW5ib3VuZCBhY3Rpb24sIGFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZC4gTmF2aWdhdGlvbiB0YWtlcyBwbGFjZSB0byB0aGUgY29udGV4dCByZXR1cm5lZCBieSB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmxhYmVsIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb24uIFRoaXMgaXMgbmVlZGVkIGluIGNhc2UgdGhlIGFjdGlvbiBoYXMgYSBwYXJhbWV0ZXIgYW5kIGEgcGFyYW1ldGVyIGRpYWxvZyBpcyBzaG93biB0byB0aGUgdXNlci4gVGhlIGxhYmVsIHdpbGwgYmUgdXNlZCBmb3IgdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgYW5kIGZvciB0aGUgY29uZmlybWF0aW9uIGJ1dHRvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNvbnRyb2xJZCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dHMgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dHMgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5lbmFibGVBdXRvU2Nyb2xsIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1FeHRyYVBhcmFtcyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyBvbmNlIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQuIElmIHJlc29sdmVkLCB0aGUgcHJvbWlzZSByZXR1cm5zOlxuXHQgKiAgLSBJZiB0aGUgcGFyYW1ldGVyIGNvbnRleHRzIGlzIGFuIGFycmF5OiBhbiBhcnJheSBvZiBvYmplY3RzLCBlYWNoIG9iamVjdCBjb250YWluaW5nIGEga2V5IFwic3RhdHVzXCIsIGFzIHdlbGwgYXMgXCJ2YWx1ZVwiIHJlZmVyZW5jaW5nIHRoZSBhY3Rpb24gc3RhdHVzIGFuZCB0aGUgY29udGV4dFxuXHQgKiAgLSBJZiB0aGUgcGFyYW1ldGVyIGNvbnRleHRzIGlzIG5vdCBhbiBhcnJheTogYSBzaW5nbGUgY29udGV4dFxuXHQgKiBUaGUgY29udGV4dChzKSBwcm92aWRlZCBpbiB0aGUgcHJvbWlzZSBpcyAoYXJlKSBlaXRoZXIgdGhlIHJldHVybiB2YWx1ZSBjb250ZXh0IG9mIHRoZSBhY3Rpb24gb3IgdGhlIGJvdW5kIGNvbnRleHQgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKiBAZmluYWxcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBpbnZva2VBY3Rpb24oXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzPzoge1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0Y29udGV4dHM/OiBDb250ZXh0IHwgQ29udGV4dFtdO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdGJTdGF0aWNBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0YXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0bm90QXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0fSxcblx0XHRtRXh0cmFQYXJhbXM/OiB7fVxuXHQpOiBQcm9taXNlPFxuXHRcdHwge1xuXHRcdFx0XHR2YWx1ZTogQ29udGV4dDtcblx0XHRcdFx0c3RhdHVzOiBcImZ1bGZpbGxlZFwiO1xuXHRcdCAgfVtdXG5cdFx0fCBDb250ZXh0XG5cdD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGxldCBhUGFydHM7XG5cdFx0bGV0IHNPdmVybG9hZEVudGl0eVR5cGU7XG5cdFx0bGV0IG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzOlxuXHRcdFx0fCB7XG5cdFx0XHRcdFx0ZlJlc29sdmVyOiBGdW5jdGlvbjtcblx0XHRcdFx0XHRmUmVqZWN0b3I6IEZ1bmN0aW9uO1xuXHRcdFx0ICB9XG5cdFx0XHR8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cblx0XHQvLyBEdWUgdG8gYSBtaXN0YWtlIHRoZSBpbnZva2VBY3Rpb24gaW4gdGhlIGV4dGVuc2lvbkFQSSBoYWQgYSBkaWZmZXJlbnQgQVBJIHRoYW4gdGhpcyBvbmUuXG5cdFx0Ly8gVGhlIG9uZSBmcm9tIHRoZSBleHRlbnNpb25BUEkgZG9lc24ndCBleGlzdCBhbnltb3JlIGFzIHdlIGV4cG9zZSB0aGUgZnVsbCBlZGl0IGZsb3cgbm93IGJ1dFxuXHRcdC8vIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc3RpbGwgbmVlZCB0byBzdXBwb3J0IHRoZSBvbGQgc2lnbmF0dXJlXG5cdFx0aWYgKFxuXHRcdFx0KChtSW5QYXJhbWV0ZXJzIGFzIENvbnRleHQpPy5pc0EgJiYgKG1JblBhcmFtZXRlcnMgYXMgQ29udGV4dCk/LmlzQTxDb250ZXh0PihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB8fFxuXHRcdFx0QXJyYXkuaXNBcnJheShtSW5QYXJhbWV0ZXJzKSB8fFxuXHRcdFx0bUV4dHJhUGFyYW1zICE9PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdGNvbnN0IGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCB1bmRlZmluZWQgPSBtSW5QYXJhbWV0ZXJzIGFzIE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IHVuZGVmaW5lZDtcblx0XHRcdG1JblBhcmFtZXRlcnMgPSBtRXh0cmFQYXJhbXMgfHwge307XG5cdFx0XHRpZiAoY29udGV4dHMpIHtcblx0XHRcdFx0bUluUGFyYW1ldGVycy5jb250ZXh0cyA9IGNvbnRleHRzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bUluUGFyYW1ldGVycy5tb2RlbCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBtUGFyYW1ldGVyczoge1xuXHRcdFx0YmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdFx0XHRiU3RhdGljQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdHBhcmFtZXRlclZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG5cdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0Y29udGV4dHM/OiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCBudWxsO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0dmlldzogRkVWaWV3O1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRcdFx0YXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdGlzQ3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0Z3JvdXBJZD86IHN0cmluZztcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbj86IHN0cmluZztcblx0XHRcdGVuYWJsZUF1dG9TY3JvbGw/OiBib29sZWFuO1xuXHRcdFx0aXNCb3VuZD86IGJvb2xlYW47XG5cdFx0XHRpZ25vcmVFVGFnPzogYm9vbGVhbjtcblx0XHR9ID0geyAuLi5tSW5QYXJhbWV0ZXJzLCB2aWV3OiB0aGlzLmJhc2UuZ2V0VmlldygpIH0gfHwgeyB2aWV3OiB0aGlzLmJhc2UuZ2V0VmlldygpIH07XG5cblx0XHRtUGFyYW1ldGVycy5pc05hdmlnYWJsZSA9IG1QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiB8fCBtUGFyYW1ldGVycy5pc05hdmlnYWJsZTtcblxuXHRcdC8vIERldGVybWluZSBpZiB0aGUgcmVmZXJlbmNlZCBhY3Rpb24gaXMgYm91bmQgb3IgdW5ib3VuZFxuXHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFkYXRhID0gY29udmVydFR5cGVzKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHQvLyBUaGUgRW50aXR5Q29udGFpbmVyIG1heSBOT1QgYmUgbWlzc2luZywgc28gaXQgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGJlIHVuZGVmaW5lZCwgYnV0IHNpbmNlIGluIG91ciBjb252ZXJ0ZWQgTWV0YWRhdGFcblx0XHQvLyBpdCBjYW4gYmUgdW5kZWZpbmVkLCBJIG5lZWQgdGhpcyB3b3JrYXJvdW5kIGhlcmUgb2YgYWRkaW5nIFwiXCIgc2luY2UgaW5kZXhPZiBkb2VzIG5vdCBhY2NlcHQgc29tZXRoaW5nIHRoYXQnc1xuXHRcdC8vIHVuZGVmaW5lZC5cblx0XHRpZiAoc0FjdGlvbk5hbWUuaW5jbHVkZXMoXCJcIiArIGNvbnZlcnRlZE1ldGFkYXRhLmVudGl0eUNvbnRhaW5lci5uYW1lKSkge1xuXHRcdFx0Ly8gVW5ib3VuZCBhY3Rpb25zIGFyZSBhbHdheXMgcmVmZXJlbmNlZCB2aWEgdGhlIGFjdGlvbiBpbXBvcnQgYW5kIHdlIGZvdW5kIHRoZSBFbnRpdHlDb250YWluZXIgaW4gdGhlIHNBY3Rpb25OYW1lIHNvXG5cdFx0XHQvLyBhbiB1bmJvdW5kIGFjdGlvbiBpcyByZWZlcmVuY2VkIVxuXHRcdFx0bVBhcmFtZXRlcnMuaXNCb3VuZCA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBObyBlbnRpdHkgY29udGFpbmVyIGluIHRoZSBzQWN0aW9uTmFtZSwgc28gZWl0aGVyIGEgYm91bmQgb3Igc3RhdGljIGFjdGlvbiBpcyByZWZlcmVuY2VkIHdoaWNoIGlzIGFsc28gYm91bmQhXG5cdFx0XHRtUGFyYW1ldGVycy5pc0JvdW5kID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIW1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgJiYgbVBhcmFtZXRlcnMuY29udGV4dHMgJiYgbVBhcmFtZXRlcnMubW9kZWwpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgPSBtUGFyYW1ldGVycy5tb2RlbFxuXHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0LmdldE1ldGFDb250ZXh0KChBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzLmNvbnRleHRzKSA/IG1QYXJhbWV0ZXJzLmNvbnRleHRzWzBdIDogbVBhcmFtZXRlcnMuY29udGV4dHMpLmdldFBhdGgoKSlcblx0XHRcdFx0LmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdH1cblx0XHRsZXQgb0NvbnRyb2w6IENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0b0NvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkgYXMgQ29udHJvbDtcblx0XHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhpcyBzZWxlY3RlZCBjb250ZXh0cyB1cGRhdGUgaXMgZG9uZSB3aXRoaW4gdGhlIG9wZXJhdGlvbiwgc2hvdWxkIGJlIG1vdmVkIG91dFxuXHRcdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdH1cblxuXHRcdC8vIGlmIHN0aWNreSBzZXNzaW9uIGlzIGVuYWJsZWQgd2UgdHJpZ2dlciBhY3Rpb25zIHdpdGhvdXQgZVRhZ1xuXHRcdG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWcgPSBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dD8uZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0aWYgKHNBY3Rpb25OYW1lICYmIHNBY3Rpb25OYW1lLmluY2x1ZGVzKFwiKFwiKSkge1xuXHRcdFx0Ly8gZ2V0IGVudGl0eSB0eXBlIG9mIGFjdGlvbiBvdmVybG9hZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGFjdGlvbiBwYXRoXG5cdFx0XHQvLyBFeGFtcGxlIHNBY3Rpb25OYW1lID0gXCI8QWN0aW9uTmFtZT4oQ29sbGVjdGlvbig8T3ZlcmxvYWRFbnRpdHlUeXBlPikpXCJcblx0XHRcdC8vIHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdIC0tPiA8QWN0aW9uTmFtZT5cblx0XHRcdC8vIHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbMl0gLS0+IDxPdmVybG9hZEVudGl0eVR5cGU+XG5cdFx0XHRhUGFydHMgPSBzQWN0aW9uTmFtZS5zcGxpdChcIihcIik7XG5cdFx0XHRzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXTtcblx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbYVBhcnRzLmxlbmd0aCAtIDFdLnJlcGxhY2VBbGwoXCIpXCIsIFwiXCIpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uICYmIG9Db250cm9sKSB7XG5cdFx0XHRpZiAob0NvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSBvQ29udHJvbC5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSB0YWJsZUFQSS5nZXRSb3dCaW5kaW5nKCkuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc092ZXJsb2FkRW50aXR5VHlwZSAmJiBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IHRoaXMuX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgoXG5cdFx0XHRcdFx0b0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCxcblx0XHRcdFx0XHRvQ29udHJvbC5nZXRSb3dCaW5kaW5nKCksXG5cdFx0XHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuZW5hYmxlQXV0b1Njcm9sbCkge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyA9IHRoaXMuY3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZSwgb0NvbnRyb2wuZ2V0SWQoKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdC8vRXhlY3V0ZSB0aGUgcmVnaXN0ZXJlZCBkZWZlcnJlZCBTaWRlRWZmZWN0cyBiZWZvcmUgdGhlIFBPU1Qgb2YgdGhlIGFjdGlvblxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cykgJiZcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHM/LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1wiKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuYmFzZS5fc2lkZUVmZmVjdHMuaGFuZGxlUGFnZUNoYW5nZUNvbnRleHQobVBhcmFtZXRlcnMuY29udGV4dHMpO1xuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRXhlY3V0ZUFjdGlvbih7IGNvbnRleHRzOiBtUGFyYW1ldGVycy5jb250ZXh0cyB9KTtcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuY2FsbEFjdGlvbihzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSk7XG5cdFx0XHRjb25zdCBzdWNjZXNzRnVsbEV4ZWN1dGlvbiA9IHJlc3BvbnNlLmZpbHRlcihpc0Z1bGZpbGxlZCk7XG5cdFx0XHRpZiAocmVzcG9uc2UubGVuZ3RoICE9PSBzdWNjZXNzRnVsbEV4ZWN1dGlvbi5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gS2VlcCB0aGUgc2FtZSB3b3JrZmxvdyB0aGFuIGJlZm9yZVxuXHRcdFx0XHQvLyBJZiBhdCBsZWFzdCBvbmUgcHJvbWlzZSBpcyByZWplY3RlZCwgd2UgcmVqZWN0IHRoZSB3aG9sZSBwcm9taXNlXG5cdFx0XHRcdHRocm93IHJlc3BvbnNlO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGxpc3RSZWZyZXNoZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udGV4dHMgJiYgQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cykgJiYgbVBhcmFtZXRlcnMuaXNCb3VuZCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRsaXN0UmVmcmVzaGVkID0gYXdhaXQgdGhpcy5fcmVmcmVzaExpc3RJZlJlcXVpcmVkKFxuXHRcdFx0XHRcdHRoaXMuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZSwgc3VjY2Vzc0Z1bGxFeGVjdXRpb24pLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzWzBdXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShcblx0XHRcdFx0XHRBY3Rpdml0eS5BY3Rpb24sXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMsXG5cdFx0XHRcdFx0c0FjdGlvbk5hbWUsXG5cdFx0XHRcdFx0bGlzdFJlZnJlc2hlZCxcblx0XHRcdFx0XHRPYmplY3Qua2V5cyhzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5ib3VuZENvbnRleHQuZ2V0T2JqZWN0KCkpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShzQWN0aW9uTmFtZSwgVHJpZ2dlclR5cGUuYWN0aW9uKTtcblxuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZXNvbHZlcihzdWNjZXNzRnVsbEV4ZWN1dGlvbik7XG5cdFx0XHR9XG5cdFx0XHQvKlxuXHRcdFx0XHRcdFdlIHNldCB0aGUgKHVwcGVyKSBwYWdlcyB0byBkaXJ0eSBhZnRlciBhbiBleGVjdXRpb24gb2YgYW4gYWN0aW9uXG5cdFx0XHRcdFx0VE9ETzogZ2V0IHJpZCBvZiB0aGlzIHdvcmthcm91bmRcblx0XHRcdFx0XHRUaGlzIHdvcmthcm91bmQgaXMgb25seSBuZWVkZWQgYXMgbG9uZyBhcyB0aGUgbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3luY2hyb25pemF0aW9uLlxuXHRcdFx0XHRcdE9uY2UgdGhpcyBpcyBzdXBwb3J0ZWQgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIHBhZ2VzIHRvIGRpcnR5IGFueW1vcmUgYXMgdGhlIGNvbnRleHQgaXRzZWxmXG5cdFx0XHRcdFx0aXMgYWxyZWFkeSByZWZyZXNoZWQgKGl0J3MganVzdCBub3QgcmVmbGVjdGVkIGluIHRoZSBvYmplY3QgcGFnZSlcblx0XHRcdFx0XHR3ZSBleHBsaWNpdGx5IGRvbid0IGNhbGwgdGhpcyBtZXRob2QgZnJvbSB0aGUgbGlzdCByZXBvcnQgYnV0IG9ubHkgY2FsbCBpdCBmcm9tIHRoZSBvYmplY3QgcGFnZVxuXHRcdFx0XHRcdGFzIGlmIGl0IGlzIGNhbGxlZCBpbiB0aGUgbGlzdCByZXBvcnQgaXQncyBub3QgbmVlZGVkIC0gYXMgd2UgYW55d2F5IHdpbGwgcmVtb3ZlIHRoaXMgbG9naWNcblx0XHRcdFx0XHR3ZSBjYW4gbGl2ZSB3aXRoIHRoaXNcblx0XHRcdFx0XHR3ZSBuZWVkIGEgY29udGV4dCB0byBzZXQgdGhlIHVwcGVyIHBhZ2VzIHRvIGRpcnR5IC0gaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgd2UgdXNlIHRoZVxuXHRcdFx0XHRcdGZpcnN0IG9uZSBhcyB0aGV5IGFyZSBhbnl3YXkgc2libGluZ3Ncblx0XHRcdFx0XHQqL1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdGlmICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkuY29udmVydGVyVHlwZSAhPT0gXCJMaXN0UmVwb3J0XCIpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUpIHtcblx0XHRcdFx0aWYgKHN1Y2Nlc3NGdWxsRXhlY3V0aW9uLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHQgPSB0aGlzLl9nZXRCb3VuZENvbnRleHQob1ZpZXcsIG1QYXJhbWV0ZXJzKVxuXHRcdFx0XHRcdFx0PyBzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5ib3VuZENvbnRleHRcblx0XHRcdFx0XHRcdDogc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUucmV0dXJuZWRDb250ZXh0ID8/IHN1Y2Nlc3NGdWxsRXhlY3V0aW9uWzBdLnZhbHVlLmJvdW5kQ29udGV4dDtcblx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRjb25zdCBzQ29udGV4dE1ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0Y29uc3QgX2ZuVmFsaWRDb250ZXh0cyA9IChjb250ZXh0czogQ29udGV4dFtdLCBhcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W10pOiBDb250ZXh0W10gPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHRzLmZpbHRlcigoZWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoYXBwbGljYWJsZUNvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFwcGxpY2FibGVDb250ZXh0cy5pbmNsdWRlcyhlbGVtZW50KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3Qgb0FjdGlvbkNvbnRleHQgPSBBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzLmNvbnRleHRzKVxuXHRcdFx0XHRcdFx0PyBfZm5WYWxpZENvbnRleHRzKG1QYXJhbWV0ZXJzLmNvbnRleHRzLCBtUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dHMpWzBdXG5cdFx0XHRcdFx0XHQ6IG1QYXJhbWV0ZXJzLmNvbnRleHRzO1xuXHRcdFx0XHRcdGNvbnN0IHNBY3Rpb25Db250ZXh0TWV0YVBhdGggPSBvQWN0aW9uQ29udGV4dCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0XHRcdFx0XHRpZiAoc0NvbnRleHRNZXRhUGF0aCAhPSB1bmRlZmluZWQgJiYgc0NvbnRleHRNZXRhUGF0aCA9PT0gc0FjdGlvbkNvbnRleHRNZXRhUGF0aCkge1xuXHRcdFx0XHRcdFx0aWYgKG9BY3Rpb25Db250ZXh0Py5nZXRQYXRoKCkgIT09IGNvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KGNvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0XHRjaGVja05vSGFzaENoYW5nZTogdHJ1ZVxuXHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgYWN0aW9uIHJldHVybnMgYSBkcmFmdCBjb250ZXh0LCB3ZSBhbHJlYWR5IHRha2UgY2FyZSBkdXJpbmcgbmF2aWdhdGlvbiB0byBlaXRoZXIgY3JlYXRlIGEgbmV3XG5cdFx0XHRcdFx0XHRcdC8vIChmdWxsIHNjcmVlbikgb3IgdG8gdXNlIHRoZSBsaXN0IGJpbmRpbmcgY29udGV4dCBhZnRlciByZWZyZXNoIChhbmQgbm90IHRoZSByZXR1cm4gdmFsdWUgY29udGV4dCkuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBkcmFmdCBpcyBkaXNjYXJkZWQgb3IgYWN0aXZhdGVkLCBoYXZpbmcgdGhlIGNvbnRleHQgc3RpbGwgYXMgZGVwZW5kZW50IGNvbnRleHQgY2F1c2UgaXNzdWVzXG5cdFx0XHRcdFx0XHRcdC8vIChlLmcuIGlmIGEgc2lkZSBlZmZlY3QgaXMgdHJpZ2dlcmVkKS4gVGhlcmVmb3JlLCB3ZSBkZXN0cm95IHRoZSByZXR1cm4gdmFsdWUgY29udGV4dCBoZXJlLFxuXHRcdFx0XHRcdFx0XHQvLyBhbmQgdG8gYmUgY29tcGF0aWJsZSB3ZSByZXR1cm4gYSBuZXcgY29udGV4dCB3aXRoIHRoZSBzYW1lIHBhdGguXG5cdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiZcblx0XHRcdFx0XHRcdFx0XHQoY29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZSB8fCB0aGlzLl9pc0ZjbEVuYWJsZWQoKSlcblx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dC5nZXRCaW5kaW5nKCkuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRMb2cuaW5mbyhcIk5hdmlnYXRpb24gdG8gdGhlIHNhbWUgY29udGV4dCBpcyBub3QgYWxsb3dlZFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyQWN0aW9uRXhlY3V0aW9uKHNBY3Rpb25OYW1lKTtcblxuXHRcdFx0Ly8gS2VlcCB0aGlzIHdlaXJkIHJldHVybmVkIHZhbHVlIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnNcblx0XHRcdC8vIGludm9rZUFjdGlvbiBpcyBwdWJsaWMgYW5kIHdlIGNhbid0IGNoYW5nZSB0aGUgcmV0dXJuZWQgdmFsdWUgZm9yIHRoZSBhY3Rpb25cblx0XHRcdGlmICghQXJyYXkuaXNBcnJheShtSW5QYXJhbWV0ZXJzPy5jb250ZXh0cykgJiYgc3VjY2Vzc0Z1bGxFeGVjdXRpb24ubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdHJldHVybiBzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5yZXR1cm5lZENvbnRleHQgPz8gc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUuYm91bmRDb250ZXh0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHN1Y2Nlc3NGdWxsRXhlY3V0aW9uLm1hcCgob1Jlc3VsdCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4geyAuLi5vUmVzdWx0LCAuLi57IHZhbHVlOiBvUmVzdWx0LnZhbHVlLnJldHVybmVkQ29udGV4dCA/PyBvUmVzdWx0LnZhbHVlLmJvdW5kQ29udGV4dCB9IH07XG5cdFx0XHR9KTtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVqZWN0b3IoKTtcblx0XHRcdH1cblx0XHRcdGlmIChlcnIgPT09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRGlhbG9nIGNhbmNlbGxlZFwiKTtcblx0XHRcdH1cblx0XHRcdHRocm93IGVycjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSG9vayB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBhZnRlciB0aGUgYWN0aW9uIGV4ZWN1dGlvbi5cblx0ICogQHBhcmFtIF9hY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAc2luY2UgMS4xMTQuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyQWN0aW9uRXhlY3V0aW9uKF9hY3Rpb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvL3RvIGJlIG92ZXJyaWRkZW5cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBvbiB0aGUgbWFzcyBlZGl0IHNhdmUuXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIElmIHlvdSBkZWNpZGUgdG8gZG8geW91ciBvd24gc2F2ZSBwcm9jZXNzaW5nLCB5b3UgY2FuIHJldHVybiBgdHJ1ZWAgdG8gcHJldmVudCB0aGUgZGVmYXVsdCBzYXZlIGJlaGF2aW9yLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycyBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gY3VzdG9tTWFzc0VkaXRTYXZlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuYUNvbnRleHRzIEFycmF5IGNvbnRhaW5pbmcgdGhlIHNlbGVjdGVkIGNvbnRleHRzIGZvciB0aGUgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMub1VwZGF0ZURhdGEgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5UGF0aCBhbmQgaXRzIHZhbHVlXG5cdCAqIEByZXR1cm5zIGB0cnVlYCB0byBwcmV2ZW50IHRoZSBkZWZhdWx0IGV4ZWN1dGlvbiwgYGZhbHNlYCB0byBrZWVwIHRoZSBzdGFuZGFyZCBiZWhhdmlvclxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjEzMC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZClcblx0YXN5bmMgY3VzdG9tTWFzc0VkaXRTYXZlKF9tUGFyYW1ldGVyczogeyBhQ29udGV4dHM6IENvbnRleHRbXTsgb1VwZGF0ZURhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG5cdH1cblxuXHQvKipcblx0ICogU2VjdXJlZCBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBFbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC5cblx0ICogQHBhcmFtIGZuRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLiBTaG91bGQgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IGlzIHNldHRsZWQgYWZ0ZXIgY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uLiBJZiBub3RoaW5nIGlzIHJldHVybmVkLCBpbW1lZGlhdGUgY29tcGxldGlvbiBpcyBhc3N1bWVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgRGVmaW5pdGlvbnMgb2YgdGhlIHByZWNvbmRpdGlvbnMgdG8gYmUgY2hlY2tlZCBiZWZvcmUgZXhlY3V0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5IERlZmluZXMgdGhlIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5LnNldCBUcmlnZ2VycyBhIGJ1c3kgaW5kaWNhdG9yIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5jaGVjayBFeGVjdXRlcyBmdW5jdGlvbiBvbmx5IGlmIGFwcGxpY2F0aW9uIGlzbid0IGJ1c3kuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy51cGRhdGVzRG9jdW1lbnQgVGhpcyBvcGVyYXRpb24gdXBkYXRlcyB0aGUgY3VycmVudCBkb2N1bWVudCB3aXRob3V0IHVzaW5nIHRoZSBib3VuZCBtb2RlbCBhbmQgY29udGV4dC4gQXMgYSByZXN1bHQsIHRoZSBkcmFmdCBzdGF0dXMgaXMgdXBkYXRlZCBpZiBhIGRyYWZ0IGRvY3VtZW50IGV4aXN0cywgYW5kIHRoZSB1c2VyIGhhcyB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGVkaXRpbmcgcHJvY2Vzcy5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgaXMgcmVqZWN0ZWQgaWYgdGhlIGV4ZWN1dGlvbiBpcyBwcm9oaWJpdGVkIGFuZCByZXNvbHZlZCBieSB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSB0aGUgZm5GdW5jdGlvbi5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycz8uYnVzeT8uc2V0ID8/IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnM/LmJ1c3k/LmNoZWNrID8/IHRydWUsXG5cdFx0XHRiVXBkYXRlc0RvY3VtZW50ID0gbVBhcmFtZXRlcnM/LnVwZGF0ZXNEb2N1bWVudCA/PyBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCksXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCBhcyBDb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCxcblx0XHRcdG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cblx0XHRpZiAoYkJ1c3lDaGVjayAmJiBCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQXBwbGljYXRpb24gYWxyZWFkeSBidXN5IHRoZXJlZm9yZSBleGVjdXRpb24gcmVqZWN0ZWRcIik7XG5cdFx0fVxuXG5cdFx0Ly8gd2UgaGF2ZSB0byBzZXQgYnVzeSBhbmQgZHJhZnQgaW5kaWNhdG9yIGltbWVkaWF0ZWx5IGFsc28gdGhlIGZ1bmN0aW9uIG1pZ2h0IGJlIGV4ZWN1dGVkIGxhdGVyIGluIHF1ZXVlXG5cdFx0aWYgKGJCdXN5U2V0KSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdH1cblx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCAmJiBiSXNEcmFmdCkge1xuXHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdH1cblxuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrKGZuRnVuY3Rpb24gYXMgKCkgPT4gdW5rbm93biB8IFByb21pc2U8dW5rbm93bj4pXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGlmIChiVXBkYXRlc0RvY3VtZW50KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChvRXJyb3I6IHVua25vd24pOiB2b2lkID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBwYXRjaFNlbnQgZXZlbnQ6IHJlZ2lzdGVyIGRvY3VtZW50IG1vZGlmaWNhdGlvbi5cblx0ICogQHBhcmFtIG9FdmVudCBUaGUgZXZlbnQgc2VudCBieSB0aGUgYmluZGluZ1xuXHQgKi9cblx0aGFuZGxlUGF0Y2hTZW50KG9FdmVudDogT0RhdGFDb250ZXh0QmluZGluZyRQYXRjaFNlbnRFdmVudCk6IHZvaWQge1xuXHRcdC8vIEluIGNvbGxhYm9yYXRpdmUgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24sIGRpc2FibGUgRVRhZyBjaGVjayBmb3IgUEFUQ0ggcmVxdWVzdHNcblx0XHRjb25zdCBpbnRlcm5hbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCB1aUNvbnRleHQgPSB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJ1aVwiKTtcblx0XHRjb25zdCBpZ25vcmVFVGFnID0gdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpIHx8IGludGVybmFsQ29udGV4dC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRpZiAoaWdub3JlRVRhZykge1xuXHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5zZXRJZ25vcmVFVGFnKHRydWUpO1xuXHRcdH1cblx0XHRpZiAodWlDb250ZXh0Py5nZXRQcm9wZXJ0eShcImlzRWRpdGFibGVcIikgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyB0aGUgdmlldyBpcyBub3QgaW4gZWRpdCBtb2RlIHRoaXMgbXVzdCBiZSBpbmxpbmUgZWRpdFxuXHRcdFx0dGhpcy5iYXNlLmlubGluZUVkaXRGbG93LmhhbmRsZUlubGluZUVkaXRQYXRjaFNlbnQob0V2ZW50KTtcblx0XHR9IGVsc2UgaWYgKCFpbnRlcm5hbENvbnRleHQ/LmdldFByb3BlcnR5KFwic2tpcFBhdGNoSGFuZGxlcnNcIikpIHtcblx0XHRcdGNvbnN0IHNvdXJjZUJpbmRpbmcgPSBvRXZlbnQuZ2V0U291cmNlKCkgYXMgdW5rbm93biBhcyBPRGF0YUxpc3RCaW5kaW5nOyAvLyBGSVhNRTogVUk1IHR5cGUgc2F5cyB0aGlzIHNob3VsZCBiZSBhbiBPRGF0YUNvbnRleHRCaW5kaW5nXG5cdFx0XHQvLyBDcmVhdGUgYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIHRoZSBwYXRoIGlzIGNvbXBsZXRlZFxuXHRcdFx0Y29uc3Qgb1BhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0b0V2ZW50LmdldFNvdXJjZSgpLmF0dGFjaEV2ZW50T25jZShcInBhdGNoQ29tcGxldGVkXCIsIChwYXRjaENvbXBsZXRlZEV2ZW50OiBVSTVFdmVudDx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4pID0+IHtcblx0XHRcdFx0XHQvLyBSZS1lbmFibGUgRVRhZyBjaGVja3Ncblx0XHRcdFx0XHRpZiAoaWdub3JlRVRhZykge1xuXHRcdFx0XHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5zZXRJZ25vcmVFVGFnKGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAob0V2ZW50LmdldFNvdXJjZSgpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoKFxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRcdFx0c291cmNlQmluZGluZyxcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGJTdWNjZXNzID0gcGF0Y2hDb21wbGV0ZWRFdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0XHRcdGlmIChiU3VjY2Vzcykge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLnVwZGF0ZURvY3VtZW50KHNvdXJjZUJpbmRpbmcsIG9QYXRjaFByb21pc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBjcmVhdGVTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgc2VudCBieSB0aGUgYmluZGluZ1xuXHQgKi9cblx0aGFuZGxlQ3JlYXRlU2VudChldmVudDogVUk1RXZlbnQ8eyBjb250ZXh0OiBDb250ZXh0IH0+KTogdm9pZCB7XG5cdFx0Y29uc3QgY29udGV4dCA9IGV2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIik7XG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhmYWxzZSwgZmFsc2UsIGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQZXJmb3JtcyBhIHRhc2sgaW4gc3luYyB3aXRoIG90aGVyIHRhc2tzIGNyZWF0ZWQgdmlhIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFJldHVybnMgdGhlIHByb21pc2UgY2hhaW4gb2YgdGhlIHRhc2suXG5cdCAqIEBwYXJhbSBbbmV3VGFza10gT3B0aW9uYWwsIGEgcHJvbWlzZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBzeW5jaHJvbm91c2x5XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgdGFzayBpcyBjb21wbGV0ZWRcblx0ICovXG5cdGFzeW5jIHN5bmNUYXNrPFQ+KG5ld1Rhc2s/OiAoKCkgPT4gVCkgfCBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG5cdFx0aWYgKG5ld1Rhc2spIHtcblx0XHRcdGlmICh0eXBlb2YgbmV3VGFzayA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRoaXMuc3luY1Rhc2tzID0gdGhpcy5zeW5jVGFza3MudGhlbihuZXdUYXNrKS5jYXRjaChmdW5jdGlvbiAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0TG9nLmRlYnVnKGVyciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuc3luY1Rhc2tzID0gdGhpcy5zeW5jVGFza3Ncblx0XHRcdFx0XHQudGhlbihhc3luYyAoKSA9PiBuZXdUYXNrKVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZGVidWcoZXJyIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2tzIGFzIFByb21pc2U8VD47XG5cdH1cblxuXHQvKipcblx0ICogdXBkYXRlcyB0aGUgVUkgYW5kIGludGVybmFsIG1vZGVscyBhY2NvcmRpbmcgdGhlIGVkaXQgbW9kZSAuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBkaXNwbGF5ZWQgb3IgZWRpdGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXQgbW9kZSBpcyBjb21wdXRlZFxuXHQgKi9cblxuXHRhc3luYyBjb21wdXRlTW9kZWxzRm9yRWRpdE1vZGUoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVQZW5kaW5nXCIsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cblx0XHRcdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCA9IE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1vZGVsIS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRcdGxldCBmb3JjZURpc3BsYXlNb2RlID0gZmFsc2U7XG5cdFx0XHRcdGNvbnN0IGlzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cblx0XHRcdFx0aWYgKGlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0Zm9yY2VEaXNwbGF5TW9kZSA9ICEoYXdhaXQgdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5hY3RpdmF0ZUNvbGxhYm9yYXRpb24oY29udGV4dCwgaXNBY3RpdmVFbnRpdHkpKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9oYXNDb2xsYWJvcmF0aW9uQXV0aG9yaXphdGlvblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZmV0Y2hDb2xsYWJvcmF0aXZlRHJhZnRVc2Vyc1Byb21pc2UgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChpc0FjdGl2ZUVudGl0eSA9PT0gZmFsc2UgJiYgIWZvcmNlRGlzcGxheU1vZGUpIHtcblx0XHRcdFx0XHQvLyBpbiBjYXNlIHRoZSBkb2N1bWVudCBpcyBkcmFmdCwgc2V0IGl0IGluIGVkaXQgbW9kZVxuXHRcdFx0XHRcdC8vIHVubGVzcyB3ZSBkb24ndCBoYXZlIHRoZSBhdXRob3JpemF0aW9uIGZvciBhIGNvbGxhYm9yYXRpdmUgdXNlclxuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUpO1xuXHRcdFx0XHRcdGNvbnN0IGhhc0FjdGl2ZUVudGl0eSA9IGF3YWl0IGNvbnRleHQucmVxdWVzdE9iamVjdChcIkhhc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKHVuZGVmaW5lZCwgIWhhc0FjdGl2ZUVudGl0eSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gYWN0aXZlIGRvY3VtZW50LCBzdGF5IG9uIGRpc3BsYXkgbW9kZVxuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVQZW5kaW5nXCIsIGZhbHNlLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGV0ZXJtaW5pbmcgdGhlIGVkaXRNb2RlIGZvciBkcmFmdFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGxhc3RJbnZva2VkQWN0aW9uTmFtZSA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLmdldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIpO1xuXHRcdFx0aWYgKGxhc3RJbnZva2VkQWN0aW9uTmFtZSAmJiB0aGlzLmlzTmV3QWN0aW9uRm9yU3RpY2t5KGxhc3RJbnZva2VkQWN0aW9uTmFtZSwgY29udGV4dCkpIHtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgdHJ1ZSk7XG5cdFx0XHRcdGlmICghdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9uKGNvbnRleHQpO1xuXHRcdFx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KSwgY29udGV4dC5nZXRNb2RlbCgpKTtcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgdW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBQcml2YXRlIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogSW50ZXJuYWwgbWV0aG9kIHRvIGRlbGV0ZSBhIGNvbnRleHQgb3IgYW4gYXJyYXkgb2YgY29udGV4dHMuXG5cdCAqIEBwYXJhbSBjb250ZXh0cyBUaGUgY29udGV4dChzKSB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIFBhcmFtZXRlcnMgZm9yIGRlbGV0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jb250cm9sSWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubm9EaWFsb2dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMudGl0bGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGVzY3JpcHRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5sb2NrZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmVcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihcblx0XHRjb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSxcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRyb2w/OiBDb250cm9sO1xuXHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0cz86IGJvb2xlYW47XG5cdFx0XHRub0RpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHR0aXRsZT86IHN0cmluZztcblx0XHRcdGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgeyBwYXRoOiBzdHJpbmcgfTtcblx0XHRcdG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cz86IG51bWJlcjtcblx0XHRcdHVuU2F2ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGxvY2tlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0ZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZT86IERyYWZ0U2libGluZ1BhaXJbXTtcblx0XHRcdGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmU/OiBDb250ZXh0W107XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAocGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzKSB7XG5cdFx0XHQvLyBhcyBzZWxlY3RlZCBjb250ZXh0cyBtYXkgaW5jbHVkZSBpbmFjdGl2ZSBjb250ZXh0IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGlzIHBhcmFtZXRlciBhZ2FpbiB0byBlbnN1cmUgZGVsZXRlIGhlbHBlciB3b3JrcyBwcm9wZXJseVxuXHRcdFx0cGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPSBwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMubGVuZ3RoO1xuXHRcdH1cblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBzZXR0aW5nIGFuZCByZW1vdmluZyBvZiBjb250ZXh0cyBzaG91bGRuJ3QgYmUgaW4gdGhlIHRyYW5zYWN0aW9uIGhlbHBlciBhdCBhbGxcblx0XHQvLyBmb3IgdGhlIHRpbWUgYmVpbmcgSSBrZXB0IGl0IGFuZCBwcm92aWRlIHRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IHRvIG5vdCBicmVhayBzb21ldGhpbmdcblx0XHRpZiAocGFyYW1ldGVycy5jb250cm9sSWQpIHtcblx0XHRcdGNvbnN0IHNvdXJjZUNvbnRyb2wgPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKHBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRcdGlmIChzb3VyY2VDb250cm9sICYmICFzb3VyY2VDb250cm9sLmlzQTxNdWx0aVZhbHVlRmllbGQ+KFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIikpIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgZGVsZXRlIGlzIHRyaWdnZXJlZCBmcm9tIGEgTXVsdGlWYWx1ZUZpZWxkLCB3ZSBkb24ndCB1c2UgdGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgYXMgdGhlIE1WRiBkb2Vzbid0IGhhdmVcblx0XHRcdFx0Ly8gc3VjaCBhIGNvbnRleHQgb2YgaXRzIG93biwgYW5kIHdlIGRvbid0IHdhbnQgdG8gdXNlIGl0cyBwYXJlbnQgY29udGV4dCAoZS5nLiBmcm9tIHRoZSBlbWJlZGRpbmcgVGFibGUpXG5cdFx0XHRcdHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBzb3VyY2VDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmRlbGV0ZURvY3VtZW50KGNvbnRleHRzLCBwYXJhbWV0ZXJzLCB0aGlzLmdldEFwcENvbXBvbmVudCgpLCByZXNvdXJjZU1vZGVsLCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkpO1xuXHR9XG5cblx0X2dldFJlc291cmNlTW9kZWwoKTogUmVzb3VyY2VNb2RlbCB7XG5cdFx0cmV0dXJuIGdldFJlc291cmNlTW9kZWwodGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRUcmFuc2FjdGlvbkhlbHBlcigpOiB0eXBlb2YgVHJhbnNhY3Rpb25IZWxwZXIge1xuXHRcdHJldHVybiBUcmFuc2FjdGlvbkhlbHBlcjtcblx0fVxuXG5cdHByaXZhdGUgZ2V0TWVzc2FnZUhhbmRsZXIoKTogTWVzc2FnZUhhbmRsZXIge1xuXHRcdGlmICh0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXIpIHtcblx0XHRcdHJldHVybiB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgRmxvdyB3b3JrcyBvbmx5IHdpdGggYSBnaXZlbiBtZXNzYWdlIGhhbmRsZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRJbnRlcm5hbE1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRHbG9iYWxVSU1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRQYWdlSW50ZXJuYWxNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInBhZ2VJbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgYSBuZXdseSBjcmVhdGVkIG9iamVjdC5cblx0ICogQHBhcmFtIGJDcmVhdGlvbk1vZGUgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0cHJpdmF0ZSBzZXRDcmVhdGlvbk1vZGUoYkNyZWF0aW9uTW9kZTogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IHBhZ2VJbnRlcm5hbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcInBhZ2VJbnRlcm5hbFwiKSBhcyBDb250ZXh0O1xuXHRcdHRoaXMuZ2V0UGFnZUludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkNyZWF0ZU1vZGUsIGJDcmVhdGlvbk1vZGUsIHBhZ2VJbnRlcm5hbENvbnRleHQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgYSBuZXdseSBjcmVhdGVkIG9iamVjdCBvciBub3QuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBpcyBuZXdcblx0ICovXG5cdGdldENyZWF0aW9uTW9kZSgpOiBib29sZWFuIHtcblx0XHRjb25zdCBwYWdlSW50ZXJuYWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJwYWdlSW50ZXJuYWxcIikgYXMgQ29udGV4dDtcblx0XHRyZXR1cm4gISFwYWdlSW50ZXJuYWxDb250ZXh0LmdldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuQ3JlYXRlTW9kZSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG9iamVjdCBiZWluZyBlZGl0ZWQgKG9yIG9uZSBvZiBpdHMgc3ViLW9iamVjdHMpIGhhcyBiZWVuIG1vZGlmaWVkIG9yIG5vdC5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkXG5cdCAqL1xuXHRpc0RvY3VtZW50TW9kaWZpZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICEhdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIG9iamVjdCBiZWluZyBlZGl0ZWQgKG9yIG9uZSBvZiBpdHMgc3ViLW9iamVjdHMpIGhhcyBiZWVuIG1vZGlmaWVkLlxuXHQgKiBAcGFyYW0gbW9kaWZpZWQgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkXG5cdCAqL1xuXHRwcml2YXRlIHNldERvY3VtZW50TW9kaWZpZWQobW9kaWZpZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5zZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkRvY3VtZW50TW9kaWZpZWQsIG1vZGlmaWVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIG9iamVjdCBiZWluZyBlZGl0ZWQgaGFzIGJlZW4gbW9kaWZpZWQgYnkgY3JlYXRpbmcgYSBzdWItb2JqZWN0LlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZyBvbiB3aGljaCB0aGUgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogdm9pZCB7XG5cdFx0Ly8gU2V0IHRoZSBtb2RpZmllZCBmbGFnIG9ubHkgb24gcmVsYXRpdmUgbGlzdEJpbmRpbmdzLCBpLmUuIHdoZW4gY3JlYXRpbmcgYSBzdWItb2JqZWN0XG5cdFx0Ly8gSWYgdGhlIGxpc3RCaW5kaW5nIGlzIG5vdCByZWxhdGl2ZSwgdGhlbiBpdCdzIGEgY3JlYXRpb24gZnJvbSB0aGUgTGlzdFJlcG9ydCwgYW5kIGJ5IGRlZmF1bHQgYSBuZXdseSBjcmVhdGVkIHJvb3Qgb2JqZWN0IGlzbid0IGNvbnNpZGVyZWQgYXMgbW9kaWZpZWRcblx0XHRpZiAobGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIGNyZWF0ZSBldmVudDogc2hvd3MgbWVzc2FnZXMgYW5kIGluIGNhc2Ugb2YgYSBkcmFmdCwgdXBkYXRlcyB0aGUgZHJhZnQgaW5kaWNhdG9yLlxuXHQgKiBAcGFyYW0gYmluZGluZyBPRGF0YSBsaXN0IGJpbmRpbmcgb2JqZWN0XG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZUNyZWF0ZUV2ZW50cyhiaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGJpbmRpbmcpO1xuXHRcdC8vIFdlIHN0b3JlIGtleSBzZXRzIChjb250ZXh0ICsga2V5KSBhcyB0aGUgY3JlYXRpb24gaW50ZXJhY3Rpb24gbWlnaHQgaW52b2x2ZSBtdWx0aXBsZSBjcmVhdGlvbnMuXG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5U2V0czogeyBjb250ZXh0OiBDb250ZXh0OyBtZXNzYWdlSGFuZGxpbmdLZXk6IHN0cmluZyB9W10gPSBbXTtcblxuXHRcdGJpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVTZW50XCIsIChldmVudEluc3RhbmNlOiBVSTVFdmVudDx7IHN1Y2Nlc3M6IGJvb2xlYW47IGNvbnRleHQ6IENvbnRleHQgfT4pOiB2b2lkID0+IHtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGNvbnRleHQgPSBldmVudEluc3RhbmNlLmdldFBhcmFtZXRlcihcImNvbnRleHRcIik7XG5cdFx0XHRsZXQgbWVzc2FnZUhhbmRsaW5nS2V5ID0gbWVzc2FnZUhhbmRsaW5nS2V5U2V0cy5maW5kKChpbmZvKSA9PiBpbmZvLmNvbnRleHQgPT09IGNvbnRleHQpPy5tZXNzYWdlSGFuZGxpbmdLZXk7XG5cdFx0XHRpZiAoIW1lc3NhZ2VIYW5kbGluZ0tleSkge1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxpbmdLZXlTZXRzLnB1c2goeyBjb250ZXh0LCBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0YmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZUNvbXBsZXRlZFwiLCAob0V2ZW50OiBVSTVFdmVudDx7IHN1Y2Nlc3M6IGJvb2xlYW47IGNvbnRleHQ6IENvbnRleHQgfT4pOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IHN1Y2Nlc3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKSxcblx0XHRcdFx0Y29udGV4dCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJjb250ZXh0XCIpO1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhzdWNjZXNzID8gRHJhZnRTdGF0dXMuU2F2ZWQgOiBEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSBtZXNzYWdlSGFuZGxpbmdLZXlTZXRzLmZpbmQoKGluZm8pID0+IGluZm8uY29udGV4dCA9PT0gY29udGV4dCk/Lm1lc3NhZ2VIYW5kbGluZ0tleTtcblx0XHRcdGlmIChtZXNzYWdlSGFuZGxpbmdLZXkpIHtcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgZHJhZnQgc3RhdHVzIG1lc3NhZ2UgKGRpc3BsYXllZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYWdlKS5cblx0ICogQHBhcmFtIGRyYWZ0U3RhdHVzIFRoZSBkcmFmdCBzdGF0dXMgbWVzc2FnZVxuXHQgKi9cblx0c2V0RHJhZnRTdGF0dXMoZHJhZnRTdGF0dXM6IHN0cmluZyk6IHZvaWQge1xuXHRcdCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbCkuc2V0UHJvcGVydHkoXCIvZHJhZnRTdGF0dXNcIiwgZHJhZnRTdGF0dXMsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvZ3JhbW1pbmcgbW9kZWwgZnJvbSBhIGJpbmRpbmcgb3IgYSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gc291cmNlIFRoZSBiaW5kaW5nIG9yIGNvbnRleHRcblx0ICogQHJldHVybnMgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqL1xuXHRwcml2YXRlIGdldFByb2dyYW1taW5nTW9kZWwoc291cmNlOiBDb250ZXh0IHwgQmluZGluZyk6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmdldFByb2dyYW1taW5nTW9kZWwoc291cmNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBlZGl0IG1vZGUuXG5cdCAqIEBwYXJhbSBlZGl0TW9kZSBUaGUgZWRpdCBtb2RlXG5cdCAqIEBwYXJhbSBpc0NyZWF0aW9uIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBuZXdseSBjcmVhdGVkXG5cdCAqL1xuXHRwcml2YXRlIHNldEVkaXRNb2RlKGVkaXRNb2RlPzogc3RyaW5nLCBpc0NyZWF0aW9uPzogYm9vbGVhbik6IHZvaWQge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIGZyZWVzdHlsZSB1c2FnZSB0aGVyZWZvcmUgd2UgY2FuXG5cdFx0Ly8gcmVseSBvbiB0aGUgZ2xvYmFsIFVJIG1vZGVsIHRvIGV4aXN0XG5cdFx0Y29uc3QgZ2xvYmFsTW9kZWwgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdGlmIChlZGl0TW9kZSkge1xuXHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiLCBlZGl0TW9kZSA9PT0gXCJFZGl0YWJsZVwiLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0aWYgKGVkaXRNb2RlICE9PSBcIkVkaXRhYmxlXCIpIHtcblx0XHRcdFx0dGhpcy5mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZChmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGlzQ3JlYXRpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gU2luY2Ugc2V0Q3JlYXRpb25Nb2RlIGlzIHB1YmxpYyBpbiBFZGl0RmxvdyBhbmQgY2FuIGJlIG92ZXJyaWRlbiwgbWFrZSBzdXJlIHRvIGNhbGwgaXQgdmlhIHRoZSBjb250cm9sbGVyXG5cdFx0XHQvLyB0byBlbnN1cmUgYW55IG92ZXJyaWRlcyBhcmUgdGFrZW4gaW50byBhY2NvdW50XG5cdFx0XHR0aGlzLnNldENyZWF0aW9uTW9kZShpc0NyZWF0aW9uKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgZmxhZyB0byBmb3JjZSBTYXZlIG9yIERpc2NhcmQgd2hlbiBsZWF2aW5nIGEgZHJhZnQuXG5cdCAqIEBwYXJhbSBmb3JjZWRcblx0ICovXG5cdHByaXZhdGUgZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQoZm9yY2VkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuc2V0UHJvcGVydHkoXCIvZm9yY2VEcmFmdFNhdmVPckRpc2NhcmRcIiwgZm9yY2VkLCB1bmRlZmluZWQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB3ZSBzaG91bGQgZm9yY2UgdGhlIHVzZXIgdG8gU2F2ZSBvciBEaXNjYXJkIHdoZW4gbGVhdmluZyBhIGRyYWZ0LCBvciBpZiBrZWVwaW5nIHRoZSBkcmFmdCBpcyBhbGxvd2VkLlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGtlZXBpbmcgdGhlIGRyYWZ0IGlzIG5vdCBhbGxvd2VkXG5cdCAqL1xuXHRzaGFsbEZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZFwiKSA9PT0gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYW4gYWN0aW9uIGNvcnJlc3BvbmRzIHRvIGEgY3JlYXRlIGFjdGlvbiBmb3IgYSBzdGlja3kgc2Vzc2lvbi5cblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgYWN0aW9uIGlzIGEgY3JlYXRlIGFjdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBpc05ld0FjdGlvbkZvclN0aWNreShhY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0XHRjb25zdCBzdGlja3lTZXNzaW9uID0gZW50aXR5U2V0LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ7XG5cdFx0XHRpZiAoc3RpY2t5U2Vzc2lvbj8uTmV3QWN0aW9uID09PSBhY3Rpb25OYW1lKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHN0aWNreVNlc3Npb24/LkFkZGl0aW9uYWxOZXdBY3Rpb25zICYmIHN0aWNreVNlc3Npb24/LkFkZGl0aW9uYWxOZXdBY3Rpb25zLmluY2x1ZGVzKGFjdGlvbk5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdC8vIFRPRE8gTW92ZSBhbGwgc3RpY2t5LXJlbGF0ZWQgYmVsb3cgdG8gYSBzdGlja3kgc2Vzc2lvbiBtYW5hZ2VyIGNsYXNzXG5cblx0LyoqXG5cdCAqIEVuYWJsZXMgdGhlIHN0aWNreSBlZGl0IHNlc3Npb24uXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZFxuXHQgKiBAcmV0dXJucyBUcnVlIGluIGNhc2Ugb2Ygc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGhhbmRsZVN0aWNreU9uKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChhcHBDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQgQXBwQ29tcG9uZW50IGZvciBmdW5jdGlvbiBoYW5kbGVTdGlja3lPblwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5oYXNOYXZpZ2F0aW9uR3VhcmQoKSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2tzKGNvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogUmVnaXN0ZXJzIHNlc3Npb24gY2FsbGJhY2tzIGZvciBkcmFmdCBoYW5kbGluZy5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gc2VtYW50aWNQYXRoIE9wdGlvbmFsIHNlbWFudGljIHBhdGggZm9yIG5hdmlnYXRpb24gZ3VhcmRcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJDYWxsYmFja3MoY29udGV4dDogQ29udGV4dCwgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIHNlbWFudGljUGF0aD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGhhc2hUcmFja2VyID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblxuXHRcdC8vIFNldCBhIGd1YXJkIGluIHRoZSBSb3V0ZXJQcm94eVxuXHRcdC8vIEEgdGltZW91dCBpcyBuZWNlc3NhcnksIGFzIHdpdGggZGVmZXJyZWQgY3JlYXRpb24gdGhlIGhhc2hDaGFuZ2VyIGlzIG5vdCB1cGRhdGVkIHlldCB3aXRoXG5cdFx0Ly8gdGhlIG5ldyBoYXNoLCBhbmQgdGhlIGd1YXJkIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5IG9mIHRoZSByb3V0ZXIgcHJveHlcblx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldE5hdmlnYXRpb25HdWFyZChjb250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSksIHNlbWFudGljUGF0aCk7XG5cdFx0fSwgMCk7XG5cblx0XHQvLyBTZXR0aW5nIGJhY2sgbmF2aWdhdGlvbiBvbiBzaGVsbCBzZXJ2aWNlLCB0byBnZXQgdGhlIGRpc2NhcmQgbWVzc2FnZSBib3ggaW4gY2FzZSBvZiBzdGlja3lcblx0XHRhd2FpdCBhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKHRoaXMub25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbi5iaW5kKHRoaXMsIGNvbnRleHQpKTtcblxuXHRcdC8vIEF0dGFjaCBzdGlja3kgc2Vzc2lvbiBjYWxsYmFja3Ncblx0XHRjb25zdCBpMThuTW9kZWwgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIik7XG5cdFx0YXBwQ29tcG9uZW50LnJlZ2lzdGVyQ2FsbGJhY2tzKFxuXHRcdFx0dGhpcy5nZXREaXJ0eVN0YXRlUHJvdmlkZXIoYXBwQ29tcG9uZW50LCBpbnRlcm5hbE1vZGVsLCBoYXNoVHJhY2tlciksXG5cdFx0XHR0aGlzLmdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQsIGFwcENvbXBvbmVudCksXG5cdFx0XHQhdGhpcy5faGlkZGVuRHJhZnQgPyB0aGlzLmdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24oY29udGV4dCwgaTE4bk1vZGVsKSA6IHVuZGVmaW5lZFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogRW5hYmxlcyBoaWRkZW4gZHJhZnQgZWRpdCBzZXNzaW9uIGhhbmRsaW5nLlxuXHQgKiBTZXRzIHVwIHRoZSBuZWNlc3Nhcnkgc2Vzc2lvbiBjYWxsYmFja3MgYW5kIG5hdmlnYXRpb24gZ3VhcmRzIGZvciBoaWRkZW4gZHJhZnQgc2NlbmFyaW9zLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgaW4gdGhlIGhpZGRlbiBkcmFmdCBzZXNzaW9uXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRydWUgaWYgc2Vzc2lvbiBzZXR1cCBzdWNjZWVkcywgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGhhbmRsZUhpZGRlbkRyYWZ0RWRpdChjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBmb3IgZnVuY3Rpb24gaGFuZGxlSGlkZGVuRHJhZnRFZGl0XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBFbnN1cmUgd2UgaGF2ZSB0aGUgY29ycmVjdCBjb250ZXh0IGZvciBoaWRkZW4gZHJhZnQgaGFuZGxpbmdcblx0XHRcdGxldCBoaWRkZW5EcmFmdENvbnRleHQ6IENvbnRleHQ7XG5cdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdGhpZGRlbkRyYWZ0Q29udGV4dCA9IGNvbnRleHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRoaWRkZW5EcmFmdENvbnRleHQgPSBjb250ZXh0Py5nZXRNb2RlbCgpLmdldEtlZXBBbGl2ZUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvL0NyZWF0ZSBjYW4gYmUgaGFuZGxlZCBmcm9tIGFueSBjb250ZXh0LCBidXQgd2UgbmVlZCB0byBjcmVhdGUgdGhlIGd1YXJkIG9ubHkgZm9yIHRoZSBjcmVhdGUgaW4gcm9vdCBDb250ZXh0LlxuXHRcdFx0aWYgKHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCkpIHtcblx0XHRcdFx0Y29uc3Qgcm9vdENvbnRleHRQYXRoID0gTW9kZWxIZWxwZXIuZ2V0RHJhZnRSb290UGF0aChoaWRkZW5EcmFmdENvbnRleHQpO1xuXHRcdFx0XHRoaWRkZW5EcmFmdENvbnRleHQgPVxuXHRcdFx0XHRcdGhpZGRlbkRyYWZ0Q29udGV4dC5nZXRQYXRoKCkgPT09IHJvb3RDb250ZXh0UGF0aCA/IGhpZGRlbkRyYWZ0Q29udGV4dCA6IGF3YWl0IHRoaXMuZ2V0Um9vdENvbnRleHQoaGlkZGVuRHJhZnRDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5oYXNOYXZpZ2F0aW9uR3VhcmQoKSkge1xuXHRcdFx0XHRjb25zdCBzZW1hbnRpY1BhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgoaGlkZGVuRHJhZnRDb250ZXh0LCB0cnVlKT8uc3Vic3RyaW5nKDEpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2tzKGhpZGRlbkRyYWZ0Q29udGV4dCwgYXBwQ29tcG9uZW50LCBzZW1hbnRpY1BhdGgpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGVzIHRoZSBzdGlja3kgZWRpdCBzZXNzaW9uLlxuXHQgKiBAcmV0dXJucyBUcnVlIGluIGNhc2Ugb2Ygc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZVNlc3Npb25PZmYoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9mZlwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSkge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50LnVucmVnaXN0ZXJDYWxsYmFja3MpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdGFwcENvbXBvbmVudC51bnJlZ2lzdGVyQ2FsbGJhY2tzKCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdF9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWw6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwpOiB2b2lkIHtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIHRydWUpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zdGlja3lTZXNzaW9uVG9rZW5cIiwgbW9kZWwuZ2V0SHR0cEhlYWRlcnModHJ1ZSlbXCJTQVAtQ29udGV4dElkXCJdKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYXMgYSBEaXJ0eVN0YXRlUHJvdmlkZXIgaW4gdGhlIFNoZWxsLlxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsIFRoZSBtb2RlbCBcImludGVybmFsXCJcblx0ICogQHBhcmFtIGhhc2hUcmFja2VyIEhhc2ggdHJhY2tlclxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0RGlydHlTdGF0ZVByb3ZpZGVyKGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBpbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwsIGhhc2hUcmFja2VyOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gKG5hdmlnYXRpb25Db250ZXh0OiB7IGlubmVyQXBwUm91dGU6IHN0cmluZyB9KTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAobmF2aWdhdGlvbkNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBmb3IgRGlydHlTdGF0ZVByb3ZpZGVyIGZ1bmN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgdGFyZ2V0SGFzaCA9IG5hdmlnYXRpb25Db250ZXh0LmlubmVyQXBwUm91dGU7XG5cdFx0XHRcdGNvbnN0IHJvdXRlclByb3h5ID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cdFx0XHRcdGxldCBsY2xIYXNoVHJhY2tlciA9IFwiXCI7XG5cdFx0XHRcdGxldCBpc0RpcnR5OiBib29sZWFuO1xuXHRcdFx0XHRjb25zdCBpc1Nlc3Npb25PbiA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0XHRcdGlmICghaXNTZXNzaW9uT24gJiYgIXRoaXMuX2hpZGRlbkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHN0aWNreSBzZXNzaW9uIHdhcyB0ZXJtaW5hdGVkIGJlZm9yZSBoYW5kLlxuXHRcdFx0XHRcdC8vIEV4YW1wbGUgaW4gY2FzZSBvZiBuYXZpZ2F0aW5nIGF3YXkgZnJvbSBhcHBsaWNhdGlvbiB1c2luZyBJQk4uXG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghcm91dGVyUHJveHkuaXNOYXZpZ2F0aW9uRmluYWxpemVkKCkpIHtcblx0XHRcdFx0XHQvLyBJZiBuYXZpZ2F0aW9uIGlzIGN1cnJlbnRseSBoYXBwZW5pbmcgaW4gUm91dGVyUHJveHksIGl0J3MgYSB0cmFuc2llbnQgc3RhdGVcblx0XHRcdFx0XHQvLyAobm90IGRpcnR5KVxuXHRcdFx0XHRcdGlzRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0XHRsY2xIYXNoVHJhY2tlciA9IHRhcmdldEhhc2g7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaGFzaFRyYWNrZXIgPT09IHRhcmdldEhhc2gpIHtcblx0XHRcdFx0XHQvLyB0aGUgaGFzaCBkaWRuJ3QgY2hhbmdlIHNvIGVpdGhlciB0aGUgdXNlciBhdHRlbXB0cyB0byByZWZyZXNoIG9yIHRvIGxlYXZlIHRoZSBhcHBcblx0XHRcdFx0XHRpc0RpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChyb3V0ZXJQcm94eS5jaGVja0hhc2hXaXRoR3VhcmQodGFyZ2V0SGFzaCkgfHwgcm91dGVyUHJveHkuaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlcigpKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSByb290IG9iamVjdFxuXHRcdFx0XHRcdC8vIG9yIGNyb3NzaW5nIHRoZSBndWFyZCBoYXMgYWxyZWFkeSBiZWVuIGFsbG93ZWQgYnkgdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHRcdGlzRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLl9oaWRkZW5EcmFmdCAmJiAhdGhpcy5pc0RvY3VtZW50TW9kaWZpZWQoKSkge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgaGlkZGVuIGRyYWZ0IHdoZW4gdGhlIGRvY3VtZW50IGlzIG5vdCBtb2RpZmllZFxuXHRcdFx0XHRcdGlzRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0XHRsY2xIYXNoVHJhY2tlciA9IHRhcmdldEhhc2g7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSBhcHAsIGZvciBleGFtcGxlIGJhY2sgdG8gdGhlIGxpc3QgcmVwb3J0XG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEaXJ0eSkge1xuXHRcdFx0XHRcdC8vIHRoZSBGTFAgZG9lc24ndCBjYWxsIHRoZSBkaXJ0eSBzdGF0ZSBwcm92aWRlciBhbnltb3JlIG9uY2UgaXQncyBkaXJ0eSwgYXMgdGhleSBjYW4ndFxuXHRcdFx0XHRcdC8vIGNoYW5nZSB0aGlzIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc2V0IGl0IGJhY2sgdG8gbm90LWRpcnR5XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldERpcnR5RmxhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aGFzaFRyYWNrZXIgPSBsY2xIYXNoVHJhY2tlcjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBpc0RpcnR5O1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIHdoZW4gYSBzdGlja3kgc2Vzc2lvbiB0aW1lcyBvdXQuXG5cdCAqIEBwYXJhbSBzdGlja3lDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHBhcmFtIGkxOG5Nb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihzdGlja3lDb250ZXh0OiBDb250ZXh0LCBpMThuTW9kZWw6IE1vZGVsKSB7XG5cdFx0cmV0dXJuICgpOiB1bmRlZmluZWQgfCBib29sZWFuID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChzdGlja3lDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IG1pc3NpbmcgZm9yIFNlc3Npb25UaW1lb3V0IGZ1bmN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlbW92ZSB0cmFuc2llbnQgbWVzc2FnZXMgc2luY2Ugd2Ugd2lsbCBzaG93aW5nIG91ciBvd24gbWVzc2FnZVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRcdFx0Y29uc3Qgd2FybmluZ0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfVElUTEV9XCIsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHsgdGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX01FU1NBR0V9XCIgfSksXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19DT01NT05fRElBTE9HX09LfVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgc3RpY2t5IGhhbmRsaW5nIGFmdGVyIG5hdmlnYXRpb24gc2luY2Ugc2Vzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWRcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTZXNzaW9uT2ZmKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQoc3RpY2t5Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdFx0d2FybmluZ0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d2FybmluZ0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0d2FybmluZ0RpYWxvZy5zZXRNb2RlbChpMThuTW9kZWwsIFwic2FwLmZlLmkxOG5cIik7XG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLmFkZERlcGVuZGVudCh3YXJuaW5nRGlhbG9nKTtcblx0XHRcdFx0d2FybmluZ0RpYWxvZy5vcGVuKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBvblJvdXRlTWF0Y2hlZCBldmVudCBpbiBjYXNlIG9mIHN0aWNreSBlZGl0aW9uLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgKHJvb3Qgb2YgdGhlIHN0aWNreSBzZXNzaW9uKVxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbihjb250ZXh0OiBDb250ZXh0LCBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCk6ICgpID0+IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cdFx0Y29uc3QgbW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgY29udGV4dFBhdGggPSBjb250ZXh0LmdldFBhdGgoKTtcblx0XHRyZXR1cm4gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0Y29uc3QgY3VycmVudEhhc2ggPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCk7XG5cdFx0XHQvLyBJZiB0aGUgY3VycmVudCBoYXNoIGlzIGVtcHR5IG9yIHRoZSBuYXZpZ2F0aW9uIGlzIG91dHNpZGUgdGhlIGd1YXJkLCBkaXNjYXJkIHRoZSBzZXNzaW9uLlxuXHRcdFx0aWYgKCFjdXJyZW50SGFzaCB8fCAhYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuY2hlY2tIYXNoV2l0aEd1YXJkKGN1cnJlbnRIYXNoKSkge1xuXHRcdFx0XHRpZiAodGhpcy5faGlkZGVuRHJhZnQgJiYgcHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmhhbmRsZUhpZGRlbkRyYWZ0RGlzY2FyZChjb250ZXh0LCBtb2RlbCwgY29udGV4dFBhdGgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEZvciBzdGlja3kgc2Vzc2lvbiwgZGlzY2FyZCBjaGFuZ2VzIGFuZCBjbGVhciBzZXNzaW9uIGNvbnRleHQuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0KTtcblx0XHRcdFx0XHRjb250ZXh0LmdldE1vZGVsKCkuY2xlYXJTZXNzaW9uQ29udGV4dCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBkaXNjYXJkIHByb2Nlc3MgZm9yIGhpZGRlbiBkcmFmdCBzZXNzaW9ucy5cblx0ICogUHJlcGFyZXMgdGhlIGNvbnRleHQgYW5kIGVuc3VyZXMgd2UgaGF2ZSB0aGUgcmVxdWlyZWQgcHJvcGVydGllcyBiZWZvcmUgZGlzY2FyZGluZy5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkLlxuXHQgKiBAcGFyYW0gbW9kZWwgVGhlIE9EYXRhIG1vZGVsIGluc3RhbmNlIHVzZWQgZm9yIGJpbmRpbmcgdGhlIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0UGF0aCBUaGUgcGF0aCBvZiB0aGUgY29udGV4dCBiZWluZyBlZGl0ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGhpZGRlbiBkcmFmdCBzZXNzaW9uIGlzIGRpc2NhcmRlZC5cblx0ICovXG5cdHByaXZhdGUgYXN5bmMgaGFuZGxlSGlkZGVuRHJhZnREaXNjYXJkKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBtb2RlbDogT0RhdGFNb2RlbCwgY29udGV4dFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIFByZXBhcmUgdGhlIGNvbnRleHQgZm9yIGRpc2NhcmQgb3BlcmF0aW9uXG5cdFx0bGV0IGRpc2NhcmRDb250ZXh0OiBDb250ZXh0O1xuXHRcdGlmIChjb250ZXh0Py5nZXRCaW5kaW5nKCkpIHtcblx0XHRcdGRpc2NhcmRDb250ZXh0ID0gY29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGlzY2FyZENvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChjb250ZXh0UGF0aCwgdW5kZWZpbmVkLCB7fSkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXG5cdFx0Ly8gUmVxdWVzdCBuZWNlc3NhcnkgcHJvcGVydGllcyBiZWZvcmUgZGlzY2FyZGluZyB0aGUgZHJhZnQgc2Vzc2lvbi5cblx0XHRhd2FpdCBkaXNjYXJkQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl0pO1xuXHRcdHJldHVybiB0aGlzLmRpc2NhcmRIaWRkZW5EcmFmdFNlc3Npb24oZGlzY2FyZENvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2NhcmRzIHRoZSBjdXJyZW50IGNvbnRleHQgY2hhbmdlcyBhbmQgcmVmcmVzaGVzIHRoZSBjb250ZXh0IGlmIGl0IGlzIG5vdCBhIGNyZWF0aW9uIG9wZXJhdGlvbi5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgZGlzY2FyZGVkLlxuXHQgKiBAcGFyYW0gaXNDcmVhdGlvbiBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY29udGV4dCBpcyBmb3IgYSBjcmVhdGlvbiBvcGVyYXRpb24uXG5cdCAqL1xuXHRwcml2YXRlIGRpc2NhcmRDb250ZXh0KGNvbnRleHQ6IENvbnRleHQsIGlzQ3JlYXRpb246IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRpZiAoY29udGV4dD8uaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0Y29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXHRcdGlmICghaXNDcmVhdGlvbikge1xuXHRcdFx0Y29udGV4dC5yZWZyZXNoKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEVuZHMgYSBzdGlja3kgc2Vzc2lvbiBieSBkaXNjYXJkaW5nIGNoYW5nZXMuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZCAocm9vdCBvZiB0aGUgc3RpY2t5IHNlc3Npb24pXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRpc2NhcmRTdGlja3lTZXNzaW9uKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBpc0NyZWF0aW9uID0gdGhpcy5nZXRDcmVhdGlvbk1vZGUoKTtcblx0XHR0aGlzLmhhbmRsZVNlc3Npb25PZmYoKTtcblxuXHRcdGNvbnN0IGRpc2NhcmRlZENvbnRleHQgPSBhd2FpdCBzdGlja3kuZGlzY2FyZERvY3VtZW50KGNvbnRleHQpO1xuXHRcdGlmIChkaXNjYXJkZWRDb250ZXh0ICE9PSB1bmRlZmluZWQgJiYgZGlzY2FyZGVkQ29udGV4dCAhPT0gbnVsbCkge1xuXHRcdFx0dGhpcy5kaXNjYXJkQ29udGV4dChkaXNjYXJkZWRDb250ZXh0LCBpc0NyZWF0aW9uKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGlzY2FyZHMgdGhlIGhpZGRlbiBkcmFmdCBzZXNzaW9uIGZvciB0aGUgZ2l2ZW4gY29udGV4dC5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgZnJvbSB3aGljaCB0aGUgZHJhZnQgc2Vzc2lvbiB3aWxsIGJlIGRpc2NhcmRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGlzY2FyZCBvcGVyYXRpb24gaXMgY29tcGxldGUuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRpc2NhcmRIaWRkZW5EcmFmdFNlc3Npb24oY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGlzQ3JlYXRpb24gPSB0aGlzLmdldENyZWF0aW9uTW9kZSgpO1xuXHRcdGNvbnN0IGRpc2NhcmRlZENvbnRleHQgPSAoYXdhaXQgZHJhZnREYXRhTG9zc1BvcHVwLmRpc2NhcmREcmFmdChcblx0XHRcdHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcixcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdGNvbnRleHQsXG5cdFx0XHR0cnVlXG5cdFx0KSkgYXMgQ29udGV4dDtcblx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dCAhPT0gdW5kZWZpbmVkICYmIGRpc2NhcmRlZENvbnRleHQgIT09IG51bGwpIHtcblx0XHRcdHRoaXMuZGlzY2FyZENvbnRleHQoZGlzY2FyZGVkQ29udGV4dCwgaXNDcmVhdGlvbik7XG5cdFx0fVxuXHRcdHRoaXMuaGFuZGxlU2Vzc2lvbk9mZigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGludGVybmFsIHJvdXRpbmcgZXh0ZW5zaW9uLlxuXHQgKiBAcmV0dXJucyBUaGUgaW50ZXJuYWwgcm91dGluZyBleHRlbnNpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0SW50ZXJuYWxSb3V0aW5nKCk6IEludGVybmFsUm91dGluZyB7XG5cdFx0aWYgKHRoaXMuYmFzZS5fcm91dGluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5fcm91dGluZztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIHJvdXRpbmcgbGlzdGVuZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0X2dldFJvb3RWaWV3Q29udHJvbGxlcigpOiBSb290Vmlld0Jhc2VDb250cm9sbGVyIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0fVxuXG5cdF9nZXRTZW1hbnRpY01hcHBpbmcoKTogU2VtYW50aWNNYXBwaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmdldExhc3RTZW1hbnRpY01hcHBpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHByb21pc2UgdG8gd2FpdCBmb3IgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250cm9sSWQgVGhlIElEIG9mIHRoZSBjb250cm9sXG5cdCAqIEByZXR1cm5zIFRoZSByZXNvbHZlciBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBleHRlcm5hbGx5IHJlc29sdmUgdGhlIHByb21pc2Vcblx0ICovXG5cdHByaXZhdGUgY3JlYXRlQWN0aW9uUHJvbWlzZShhY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRyb2xJZDogc3RyaW5nKTogeyBmUmVzb2x2ZXI6IEZ1bmN0aW9uOyBmUmVqZWN0b3I6IEZ1bmN0aW9uIH0ge1xuXHRcdGxldCByZXNvbHZlRnVuY3Rpb246IEZ1bmN0aW9uLCByZWplY3RGdW5jdGlvbjogRnVuY3Rpb247XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gbmV3IFByb21pc2U8UHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W10+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHJlc29sdmVGdW5jdGlvbiA9IHJlc29sdmU7XG5cdFx0XHRyZWplY3RGdW5jdGlvbiA9IHJlamVjdDtcblx0XHR9KS50aGVuKChyZXNwb25zZTogUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W10pID0+IHtcblx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKHsgY29udHJvbElkIH0sIHRoaXMuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhhY3Rpb25OYW1lLCByZXNwb25zZSkpO1xuXHRcdH0pO1xuXHRcdHJldHVybiB7IGZSZXNvbHZlcjogcmVzb2x2ZUZ1bmN0aW9uISwgZlJlamVjdG9yOiByZWplY3RGdW5jdGlvbiEgfTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRoYXQgaXMgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHJlc3BvbnNlIFRoZSBib3VuZCBhY3Rpb24ncyByZXNwb25zZSBkYXRhIG9yIHJlc3BvbnNlIGNvbnRleHRcblx0ICogQHJldHVybnMgT2JqZWN0IHdpdGggZGF0YSBhbmQgbmFtZXMgb2YgdGhlIGtleSBmaWVsZHMgb2YgdGhlIHJlc3BvbnNlXG5cdCAqL1xuXHRwcml2YXRlIGdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoXG5cdFx0YWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdHJlc3BvbnNlOiBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXVxuXHQpOiB7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHJlc3BvbnNlLmxlbmd0aCA+PSAxKSB7XG5cdFx0XHRjb25zdCBjdXJyZW50VmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWxEYXRhID0gKGN1cnJlbnRWaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0RGF0YSgpID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbEFjdGlvbiA9IG1ldGFNb2RlbERhdGFbYWN0aW9uTmFtZV0gYXMgTWV0YU1vZGVsQWN0aW9uW10gfCB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBhY3Rpb25SZXR1cm5UeXBlID0gbWV0YU1vZGVsQWN0aW9uPy5bMF0uJFJldHVyblR5cGUgPyBtZXRhTW9kZWxBY3Rpb24/LlswXS4kUmV0dXJuVHlwZS4kVHlwZSA6IG51bGw7XG5cdFx0XHRjb25zdCBrZXlzID1cblx0XHRcdFx0YWN0aW9uUmV0dXJuVHlwZSAmJiAobWV0YU1vZGVsRGF0YVthY3Rpb25SZXR1cm5UeXBlXSBhcyBNZXRhTW9kZWxFbnRpdHlUeXBlKVxuXHRcdFx0XHRcdD8gKG1ldGFNb2RlbERhdGFbYWN0aW9uUmV0dXJuVHlwZV0gYXMgTWV0YU1vZGVsRW50aXR5VHlwZSkuJEtleVxuXHRcdFx0XHRcdDogW107XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRvRGF0YTogcmVzcG9uc2VbMF0udmFsdWUuYm91bmRDb250ZXh0LmdldE9iamVjdCgpLFxuXHRcdFx0XHRrZXlzXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0YXN5bmMgZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKTogUHJvbWlzZTx7IGNvbnRyb2xJZD86IHN0cmluZzsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkPiB7XG5cdFx0cmV0dXJuIHRoaXMuYWN0aW9uUHJvbWlzZTtcblx0fVxuXG5cdGRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlKCk6IHZvaWQge1xuXHRcdHRoaXMuYWN0aW9uUHJvbWlzZSA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGFzeW5jIHNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKGlzU2F2ZTogYm9vbGVhbik6IFByb21pc2U8UmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB8IHVuZGVmaW5lZD4ge1xuXHRcdGlmICghdGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKSB7XG5cdFx0XHR0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2cgPSBuZXcgQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nKHtcblx0XHRcdFx0dmlldzogdGhpcy5nZXRWaWV3KClcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nPy5vcGVuKGlzU2F2ZSk7XG5cdH1cblxuXHRfc2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93KHRhYmxlOiBUYWJsZSk6IHZvaWQge1xuXHRcdGNvbnN0IHJvd0JpbmRpbmcgPSB0YWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0Y29uc3QgYWN0aXZlUm93SW5kZXg6IG51bWJlciA9IHJvd0JpbmRpbmcuZ2V0Q291bnQoKSB8fCAwO1xuXHRcdGlmICh0YWJsZS5kYXRhKFwidGFibGVUeXBlXCIpICE9PSBcIlJlc3BvbnNpdmVUYWJsZVwiKSB7XG5cdFx0XHRpZiAoYWN0aXZlUm93SW5kZXggPiAwKSB7XG5cdFx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgoYWN0aXZlUm93SW5kZXggLSAxKTtcblx0XHRcdH1cblx0XHRcdHRhYmxlLmZvY3VzUm93KGFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0LyogSW4gYSByZXNwb25zaXZlIHRhYmxlLCB0aGUgZW1wdHkgcm93cyBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFibGUuIEJ1dCB3aGVuIHdlIGNyZWF0ZSBtb3JlLCB0aGV5IGFwcGVhciBiZWxvdyB0aGUgbmV3IGxpbmUuXG5cdFx0XHQgKiBTbyB3ZSBjaGVjayB0aGUgZmlyc3QgaW5hY3RpdmUgcm93IGZpcnN0LCB0aGVuIHdlIHNldCB0aGUgZm9jdXMgb24gaXQgd2hlbiB3ZSBwcmVzcyB0aGUgYnV0dG9uLlxuXHRcdFx0ICogVGhpcyBkb2Vzbid0IGltcGFjdCB0aGUgR3JpZFRhYmxlIGJlY2F1c2UgdGhleSBhcHBlYXIgYXQgdGhlIGVuZCwgYW5kIHdlIGFscmVhZHkgZm9jdXMgdGhlIGJlZm9yZS10aGUtbGFzdCByb3cgKGJlY2F1c2UgMiBlbXB0eSByb3dzIGV4aXN0KVxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBhbGxSb3dDb250ZXh0cyA9IHJvd0JpbmRpbmcuZ2V0QWxsQ3VycmVudENvbnRleHRzKCk7XG5cdFx0XHRpZiAoIWFsbFJvd0NvbnRleHRzPy5sZW5ndGgpIHtcblx0XHRcdFx0dGFibGUuZm9jdXNSb3coYWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRsZXQgZm9jdXNSb3cgPSBhY3RpdmVSb3dJbmRleCxcblx0XHRcdFx0aW5kZXggPSAwO1xuXHRcdFx0Zm9yIChjb25zdCBzaW5nbGVDb250ZXh0IG9mIGFsbFJvd0NvbnRleHRzKSB7XG5cdFx0XHRcdGlmIChzaW5nbGVDb250ZXh0LmlzSW5hY3RpdmUoKSAmJiBpbmRleCA8IGZvY3VzUm93KSB7XG5cdFx0XHRcdFx0Zm9jdXNSb3cgPSBpbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGZvY3VzUm93ID4gMCkge1xuXHRcdFx0XHR0YWJsZS5zY3JvbGxUb0luZGV4KGZvY3VzUm93KTtcblx0XHRcdH1cblx0XHRcdHRhYmxlLmZvY3VzUm93KGZvY3VzUm93LCB0cnVlKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBjcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyh0YWJsZTogVGFibGUpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdGlmIChcblx0XHRcdHRhYmxlQVBJPy50YWJsZURlZmluaXRpb24/LmNvbnRyb2w/LmlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgJiZcblx0XHRcdCF0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcInBhZ2VJbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJjcmVhdGVNb2RlXCIpXG5cdFx0KSB7XG5cdFx0XHQvLyBXaXRoIHRoZSBwYXJhbWV0ZXIsIHdlIGRvbid0IGhhdmUgZW1wdHkgcm93cyBpbiBFZGl0IG1vZGUsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIHRoZW0gYmVmb3JlIHNldHRpbmcgdGhlIGZvY3VzIG9uIHRoZW1cblx0XHRcdGF3YWl0IHRhYmxlQVBJLnNldFVwRW1wdHlSb3dzKHRhYmxlLCB0cnVlKTtcblx0XHR9XG5cdFx0dGhpcy5fc2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93KHRhYmxlKTtcblx0fVxuXG5cdF9zZW5kQWN0aXZpdHkoXG5cdFx0YWN0aW9uOiBBY3Rpdml0eSxcblx0XHRyZWxhdGVkQ29udGV4dHM6IENvbnRleHQgfCBDb250ZXh0W10gfCBudWxsIHwgdW5kZWZpbmVkLFxuXHRcdHRyaWdnZXJlZEFjdGlvbk5hbWU/OiBzdHJpbmcsXG5cdFx0cmVmcmVzaExpc3RCaW5kaW5nPzogYm9vbGVhbixcblx0XHRhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzPzogc3RyaW5nW11cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29udGVudCA9IEFycmF5LmlzQXJyYXkocmVsYXRlZENvbnRleHRzKSA/IHJlbGF0ZWRDb250ZXh0cy5tYXAoKGNvbnRleHQpID0+IGNvbnRleHQuZ2V0UGF0aCgpKSA6IHJlbGF0ZWRDb250ZXh0cz8uZ2V0UGF0aCgpO1xuXHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuc2VuZCh7IGFjdGlvbiwgY29udGVudCwgdHJpZ2dlcmVkQWN0aW9uTmFtZSwgcmVmcmVzaExpc3RCaW5kaW5nLCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzIH0pO1xuXHR9XG5cblx0X3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lOiBzdHJpbmcsIHRyaWdnZXJUeXBlOiBUcmlnZ2VyVHlwZSk6IHZvaWQge1xuXHRcdHRyaWdnZXJDb25maWd1cmVkU3VydmV5KHRoaXMuYmFzZS5nZXRWaWV3KCksIHNBY3Rpb25OYW1lLCB0cmlnZ2VyVHlwZSk7XG5cdH1cblxuXHRhc3luYyBfc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBTdWJtaXQgYW55IGxlZnRvdmVyIGNoYW5nZXMgdGhhdCBhcmUgbm90IHlldCBzdWJtaXR0ZWRcblx0XHRcdC8vIEN1cnJlbnRseSB3ZSBhcmUgdXNpbmcgb25seSAxIHVwZGF0ZUdyb3VwSWQsIGhlbmNlIHN1Ym1pdHRpbmcgdGhlIGJhdGNoIGRpcmVjdGx5IGhlcmVcblx0XHRcdGF3YWl0IG9Nb2RlbC5zdWJtaXRCYXRjaChcIiRhdXRvXCIpO1xuXG5cdFx0XHQvLyBXYWl0IGZvciBhbGwgY3VycmVudGx5IHJ1bm5pbmcgY2hhbmdlc1xuXHRcdFx0Ly8gRm9yIHRoZSB0aW1lIGJlaW5nIHdlIGFncmVlZCB3aXRoIHRoZSB2NCBtb2RlbCB0ZWFtIHRvIHVzZSBhbiBpbnRlcm5hbCBtZXRob2QuIFdlJ2xsIHJlcGxhY2UgaXQgb25jZVxuXHRcdFx0Ly8gYSBwdWJsaWMgb3IgcmVzdHJpY3RlZCBtZXRob2Qgd2FzIHByb3ZpZGVkXG5cdFx0XHRhd2FpdCAob01vZGVsLm9SZXF1ZXN0b3IgYXMgdW5rbm93biBhcyB7IHdhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHM6IEZ1bmN0aW9uIH0pLndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMoXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYWxsIGNoYW5nZXMgd2VyZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5XG5cdFx0XHRpZiAob01vZGVsLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3VibWl0IG9mIG9wZW4gY2hhbmdlcyBmYWlsZWRcIik7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0dGhpcy5oYW5kbGVTZXNzaW9uT2ZmKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkaXNwbGF5IGEgJ2Rpc2NhcmQnIHBvcG92ZXIgd2hlbiBleGl0aW5nIGEgc3RpY2t5IHNlc3Npb24uXG5cdCAqIEBwYXJhbSBjb250ZXh0XG5cdCAqL1xuXHRwcml2YXRlIG9uQmFja05hdmlnYXRpb25JblNlc3Npb24oY29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IHJvdXRlclByb3h5ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpO1xuXG5cdFx0aWYgKHJvdXRlclByb3h5LmNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkKCkpIHtcblx0XHRcdHN0aWNreS5wcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24oXG5cdFx0XHRcdGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRpc2NhcmRTdGlja3lTZXNzaW9uKGNvbnRleHQpO1xuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpO1xuXHRcdFx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR2aWV3LFxuXHRcdFx0XHRQcm9ncmFtbWluZ01vZGVsLlN0aWNreVxuXHRcdFx0KTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRoaXN0b3J5LmJhY2soKTtcblx0fVxuXG5cdGFzeW5jIF9oYW5kbGVOZXdDb250ZXh0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzOiB7IGVkaXRhYmxlOiBib29sZWFuOyByZWNyZWF0ZUNvbnRleHQ6IGJvb2xlYW47IGZvcmNlRm9jdXM/OiBib29sZWFuIH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwge1xuXHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHRydWUsXG5cdFx0XHRlZGl0YWJsZTogbmF2aWdhdGlvblBhcmFtZXRlcnMuZWRpdGFibGUsXG5cdFx0XHRwZXJzaXN0T1BTY3JvbGw6IHRydWUsXG5cdFx0XHRyZWNyZWF0ZUNvbnRleHQ6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLnJlY3JlYXRlQ29udGV4dCxcblx0XHRcdHJlYXNvbjogTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogZmFsc2UsXG5cdFx0XHRmb3JjZUZvY3VzOiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5mb3JjZUZvY3VzID8/IGZhbHNlLFxuXHRcdFx0a2VlcEN1cnJlbnRMYXlvdXQ6IHRydWVcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gKHBhcnNlKSBlcnJvcnMgZm9yIGNvbnRyb2xzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cblx0ICogQHBhcmFtIHZpZXcgVGhlIHZpZXdcblx0ICogQHBhcmFtIHBhcmFtcyBUaGUgcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gcGFyYW1zLmNvbnRyb2xJZCBUaGUgSUQgb2YgdGhlIGNvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtcy5pc05hdmlnYWJsZSBUcnVlIGlmIHRoZSBhY3Rpb24gaXMgbmF2aWdhYmxlXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGFjdGlvbiBuZWVkcyB0byByZXR1cm5zIHRoZSBib3VuZCBjb250ZXh0LCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdF9nZXRCb3VuZENvbnRleHQodmlldzogRkVWaWV3LCBwYXJhbXM6IHsgY29udHJvbElkPzogc3RyaW5nOyBpc05hdmlnYWJsZT86IGJvb2xlYW4gfSk6IGJvb2xlYW4ge1xuXHRcdC8vVGhpcyB3ZWlyZCBjb25kaXRpb24gaXMgbmVlZGVkIHRvIGF2b2lkIG5hdmlnYXRpb24gaW4gY2FzZSBvZiBzb21lIGFjdGlvbnMgaW50byB0aGUgdGFibGVcblx0XHQvLyB0aGlzIGRlZmluaXRlbHkgbmVlZHMgdG8gYmUgcmVmYWN0b3JlZCB0byBnZXQgY2xlYXIgY29uZGl0aW9uIHdoZXJlIG5hdmlnYXRpb24gbmVlZHMgdG8gYmUgZG9uZSBvciBub3Rcblx0XHQvLyBTTk9XOiBESU5DMDI3ODQ5MFxuXHRcdGNvbnN0IHZpZXdMZXZlbCA9IHZpZXcuZ2V0Vmlld0RhdGEoKS52aWV3TGV2ZWw7XG5cdFx0Y29uc3QgYlJlZnJlc2hBZnRlckFjdGlvbiA9IHZpZXdMZXZlbCA+IDEgfHwgKHZpZXdMZXZlbCA9PT0gMSAmJiBwYXJhbXMuY29udHJvbElkKTtcblx0XHRyZXR1cm4gIXBhcmFtcy5pc05hdmlnYWJsZSB8fCAhIWJSZWZyZXNoQWZ0ZXJBY3Rpb247XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIChwYXJzZSkgZXJyb3JzIGZvciBjb250cm9scyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRpb24gZXJyb3JzLCBhbmQgcmVqZWN0cyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiBlcnJvcnNcblx0ICovXG5cblx0YXN5bmMgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZCB8IHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzaygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0Y29uc3QgdmlzaWJsZVZpZXdJZHMgPSB0aGlzLl9pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0XHQ/ICh0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBGY2xDb250cm9sbGVyKS5fZ2V0QWxsVmlzaWJsZVZpZXdzKCkubWFwKCh2aWV3KSA9PiB2aWV3LmdldElkKCkpXG5cdFx0XHRcdDogW3RoaXMuZ2V0VmlldygpLmdldElkKCldO1xuXHRcdFx0Y29uc3QgYU1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdGxldCBvQ29udHJvbDtcblxuXHRcdFx0aWYgKCFhTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRcdExvZy5pbmZvKFwiTm8gdmFsaWRhdGlvbiBlcnJvcnMgZm91bmRcIik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBtZXNzYWdlIG9mIGFNZXNzYWdlcykge1xuXHRcdFx0XHRpZiAobWVzc2FnZS52YWxpZGF0aW9uKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2wgPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKG1lc3NhZ2UuZ2V0Q29udHJvbElkKCkpO1xuXHRcdFx0XHRcdHdoaWxlIChvQ29udHJvbCkge1xuXHRcdFx0XHRcdFx0aWYgKHZpc2libGVWaWV3SWRzLmluY2x1ZGVzKG9Db250cm9sLmdldElkKCkpKSB7XG5cdFx0XHRcdFx0XHRcdHRocm93IFwidmFsaWRhdGlvbiBlcnJvcnMgZXhpc3RcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIG9SZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2YgdGhlIGJvdW5kIGFjdGlvbiBhbmQgdGhlIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2Uub0RhdGFcblx0ICogQHBhcmFtIG9SZXNwb25zZS5rZXlzXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgYm91bmQgY29udGV4dCBvbiB3aGljaCB0aGUgYWN0aW9uIHdhcyBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyBUcnVlIFByb21pc2UgaWYgdGhlIGxpc3Qgd2FzIHJlZnJlc2hlZFxuXHQgKi9cblx0YXN5bmMgX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRvUmVzcG9uc2U/OiB7IG9EYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM/OiBzdHJpbmdbXSB8IG51bGwgfSxcblx0XHRvQ29udGV4dD86IENvbnRleHRcblx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKCFvQ29udGV4dCB8fCAhb1Jlc3BvbnNlIHx8ICFvUmVzcG9uc2Uub0RhdGEgfHwgIW9SZXNwb25zZS5rZXlzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdC8vIHJlZnJlc2ggb25seSBsaXN0c1xuXHRcdGlmIChvQmluZGluZyAmJiBvQmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1Jlc3BvbnNlLm9EYXRhO1xuXHRcdFx0Y29uc3QgYUtleXMgPSBvUmVzcG9uc2Uua2V5cztcblx0XHRcdGNvbnN0IG9DdXJyZW50RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0bGV0IGJSZXR1cm5lZENvbnRleHRJc1NhbWUgPSB0cnVlO1xuXHRcdFx0Ly8gZW5zdXJlIGNvbnRleHQgaXMgaW4gdGhlIHJlc3BvbnNlXG5cdFx0XHRpZiAoT2JqZWN0LmtleXMob0NvbnRleHREYXRhKS5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gY2hlY2sgaWYgY29udGV4dCBpbiByZXNwb25zZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgYm91bmQgY29udGV4dFxuXHRcdFx0XHRiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gYUtleXMuZXZlcnkoZnVuY3Rpb24gKHNLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdFx0XHRcdHJldHVybiBvQ3VycmVudERhdGFbc0tleV0gPT09IG9Db250ZXh0RGF0YVtzS2V5XTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmICghYlJldHVybmVkQ29udGV4dElzU2FtZSkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5yZWZyZXNoTGlzdEJpbmRpbmcob0JpbmRpbmcsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHJlc29sdmUgd2l0aCBvUmVzcG9uc2UgdG8gbm90IGRpc3R1cmIgdGhlIHByb21pc2UgY2hhaW4gYWZ0ZXJ3YXJkc1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGFzeW5jIF9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzRW50aXR5U2V0TmFtZSA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IHBhdGhzID0gYVNlbWFudGljS2V5cy5tYXAoKG9LZXkpID0+IG9LZXkuJFByb3BlcnR5UGF0aCk7XG5cdFx0XHRhd2FpdCBvQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkocGF0aHMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQcm92aWRlcyB0aGUgbGF0ZXN0IGNvbnRleHQgaW4gdGhlIG1ldGFkYXRhIGhpZXJhcmNoeSBmcm9tIHJvb3RCaW5kaW5nIHRvIGdpdmVuIGNvbnRleHQgcG9pbnRpbmcgdG8gZ2l2ZW4gZW50aXR5VHlwZVxuXHQgKiBpZiBhbnkgc3VjaCBjb250ZXh0IGV4aXN0cy4gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHRoZSBvcmlnaW5hbCBjb250ZXh0LlxuXHQgKiBOb3RlOiBJdCBpcyBvbmx5IG5lZWRlZCBhcyB3b3JrLWFyb3VuZCBmb3IgaW5jb3JyZWN0IG1vZGVsbGluZy4gQ29ycmVjdCBtb2RlbGxpbmcgd291bGQgaW1wbHkgYSBEYXRhRmllbGRGb3JBY3Rpb24gaW4gYSBMaW5lSXRlbVxuXHQgKiB0byBwb2ludCB0byBhbiBvdmVybG9hZCBkZWZpbmVkIGVpdGhlciBvbiB0aGUgY29ycmVzcG9uZGluZyBFbnRpdHlUeXBlIG9yIGEgY29sbGVjdGlvbiBvZiB0aGUgc2FtZS5cblx0ICogQHBhcmFtIHJvb3RDb250ZXh0IFRoZSBjb250ZXh0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdEJpbmRpbmcgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBvdmVybG9hZEVudGl0eVR5cGUgVGhlIEFjdGlvbk92ZXJsb2FkIGVudGl0eSB0eXBlIHRvIHNlYXJjaCBmb3Jcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgQWN0aW9uT3ZlcmxvYWQgZW50aXR5XG5cdCAqL1xuXHRfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aChyb290Q29udGV4dDogQ29udGV4dCwgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIG92ZXJsb2FkRW50aXR5VHlwZTogc3RyaW5nKTogQ29udGV4dCB7XG5cdFx0Y29uc3QgbW9kZWw6IE9EYXRhTW9kZWwgPSByb290Q29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgY29udGV4dFNlZ21lbnRzOiBzdHJpbmdbXSA9IGxpc3RCaW5kaW5nLmdldFBhdGgoKS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IGN1cnJlbnRDb250ZXh0OiBDb250ZXh0ID0gcm9vdENvbnRleHQ7XG5cblx0XHQvLyBXZSBleHBlY3QgdGhhdCB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBsaXN0QmluZGluZyBpcyB0aGUgTGlzdEJpbmRpbmcgb2YgdGhlIHRhYmxlLiBSZW1vdmUgdGhpcyBmcm9tIGNvbnRleHRTZWdtZW50c1xuXHRcdC8vIGJlY2F1c2UgaXQgaXMgaW5jb3JyZWN0IHRvIGV4ZWN1dGUgYmluZENvbnRleHQgb24gYSBsaXN0LiBXZSBkbyBub3QgYW55d2F5IG5lZWQgdG8gc2VhcmNoIHRoaXMgY29udGV4dCBmb3IgdGhlIG92ZXJsb2FkLlxuXHRcdGNvbnRleHRTZWdtZW50cy5wb3AoKTtcblx0XHRpZiAoY29udGV4dFNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Y29udGV4dFNlZ21lbnRzID0gW1wiXCJdOyAvLyBEb24ndCBsZWF2ZSBjb250ZXh0U2VnbWVudHMgdW5kZWZpbmVkXG5cdFx0fVxuXG5cdFx0aWYgKGNvbnRleHRTZWdtZW50c1swXSAhPT0gXCJcIikge1xuXHRcdFx0Y29udGV4dFNlZ21lbnRzLnVuc2hpZnQoXCJcIik7IC8vIHRvIGFsc28gZ2V0IHRoZSByb290IGNvbnRleHQsIGkuZS4gdGhlIGJpbmRpbmdDb250ZXh0IG9mIHRoZSB0YWJsZVxuXHRcdH1cblx0XHQvLyBsb2FkIGFsbCB0aGUgcGFyZW50IGNvbnRleHRzIGludG8gYW4gYXJyYXlcblx0XHRjb25zdCBwYXJlbnRDb250ZXh0czogQ29udGV4dFtdID0gY29udGV4dFNlZ21lbnRzXG5cdFx0XHQubWFwKChwYXRoU2VnbWVudDogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdGlmIChwYXRoU2VnbWVudCAhPT0gXCJcIikge1xuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQocGF0aFNlZ21lbnQsIGN1cnJlbnRDb250ZXh0KS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBDcmVhdGluZyBhIG5ldyBjb250ZXh0IHVzaW5nIGJpbmRDb250ZXh0KC4uLikuZ2V0Qm91bmRDb250ZXh0KCkgZG9lcyBub3Qgd29yayBpZiB0aGUgZXRhZyBpcyBuZWVkZWQuIEFjY29yZGluZyB0byBtb2RlbCBjb2xsZWFndWVzLFxuXHRcdFx0XHRcdC8vIHdlIHNob3VsZCBhbHdheXMgdXNlIGFuIGV4aXN0aW5nIGNvbnRleHQgaWYgcG9zc2libGUuXG5cdFx0XHRcdFx0Ly8gQ3VycmVudGx5LCB0aGUgb25seSBleGFtcGxlIHdlIGtub3cgYWJvdXQgaXMgdXNpbmcgdGhlIHJvb3RDb250ZXh0IC0gYW5kIGluIHRoaXMgY2FzZSwgd2UgY2FuIG9idmlvdXNseSByZXVzZSB0aGF0IGV4aXN0aW5nIGNvbnRleHQuXG5cdFx0XHRcdFx0Ly8gSWYgb3RoZXIgZXhhbXBsZXMgc2hvdWxkIGNvbWUgdXAsIHRoZSBiZXN0IHBvc3NpYmxlIHdvcmsgYXJvdW5kIHdvdWxkIGJlIHRvIHJlcXVlc3Qgc29tZSBkYXRhIHRvIGdldCBhbiBleGlzdGluZyBjb250ZXh0LiBUbyBrZWVwIHRoZVxuXHRcdFx0XHRcdC8vIHJlcXVlc3QgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUsIHdlIHNob3VsZCByZXF1ZXN0IG9ubHkgdGhlIGZpcnN0IGtleSBwcm9wZXJ0eS4gQXMgdGhpcyB3b3VsZCBpbnRyb2R1Y2UgYXN5bmNocm9uaXNtLCBhbmQgYW55d2F5XG5cdFx0XHRcdFx0Ly8gdGhlIHdob2xlIGxvZ2ljIGlzIG9ubHkgcGFydCBvZiB3b3JrLWFyb3VuZCBmb3IgaW5jb3JyZWN0IG1vZGVsbGluZywgd2Ugd2FpdCB1bnRpbCB3ZSBoYXZlIGFuIGV4YW1wbGUgbmVlZGluZyBpdCBiZWZvcmUgaW1wbGVtZW50aW5nIHRoaXMuXG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQgPSByb290Q29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gY3VycmVudENvbnRleHQ7XG5cdFx0XHR9KVxuXHRcdFx0LnJldmVyc2UoKTtcblx0XHQvLyBzZWFyY2ggZm9yIGNvbnRleHQgYmFja3dhcmRzXG5cdFx0Y29uc3Qgb3ZlcmxvYWRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkID0gcGFyZW50Q29udGV4dHMuZmluZChcblx0XHRcdChwYXJlbnRDb250ZXh0OiBDb250ZXh0KSA9PlxuXHRcdFx0XHQobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KHBhcmVudENvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCIkVHlwZVwiKSBhcyB1bmtub3duIGFzIHN0cmluZykgPT09IG92ZXJsb2FkRW50aXR5VHlwZVxuXHRcdCk7XG5cdFx0cmV0dXJuIG92ZXJsb2FkQ29udGV4dCB8fCBsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhO1xuXHR9XG5cblx0X2NyZWF0ZVNpYmxpbmdJbmZvKGN1cnJlbnRDb250ZXh0OiBDb250ZXh0LCBuZXdDb250ZXh0OiBDb250ZXh0KTogU2libGluZ0luZm9ybWF0aW9uIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0Q29udGV4dDogbmV3Q29udGV4dCxcblx0XHRcdHBhdGhNYXBwaW5nOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRvbGRQYXRoOiBjdXJyZW50Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3Q29udGV4dC5nZXRQYXRoKClcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH07XG5cdH1cblxuXHRfdXBkYXRlUGF0aHNJbkhpc3RvcnkobWFwcGluZ3M6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldFBhdGhNYXBwaW5nKG1hcHBpbmdzKTtcblxuXHRcdC8vIEFsc28gdXBkYXRlIHRoZSBzZW1hbnRpYyBtYXBwaW5nIGluIHRoZSByb3V0aW5nIHNlcnZpY2Vcblx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0aWYgKG1hcHBpbmdzLmxlbmd0aCAmJiBsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5vbGRQYXRoKSB7XG5cdFx0XHRsYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdH1cblx0fVxuXG5cdF9nZXROYXZpZ2F0aW9uVGFyZ2V0Rm9yRWRpdChcblx0XHRjb250ZXh0OiBDb250ZXh0LFxuXHRcdG5ld0RvY3VtZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkXG5cdCk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKGNvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPSBuZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IGNvbnRleHQuZ2V0UGF0aCgpID09PSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSA/IGNvbnRleHQgOiBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdH1cblx0XHRyZXR1cm4gY29udGV4dFRvTmF2aWdhdGU7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWJvYmplY3QgcGFnZSwgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGhcblx0ICogZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHMgYmV0d2VlbiB0aGUgb2JqZWN0IHBhZ2UgYW5kIHRoZSBzdWJvYmplY3QgcGFnZS5cblx0ICogQHBhcmFtIHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3Vib2JqZWN0XG5cdCAqIEBwYXJhbSBzUHJvZ3JhbW1pbmdNb2RlbCBUaGUgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQHBhcmFtIGRvTm90Q29tcHV0ZUlmUm9vdCBJZiB0cnVlLCB3ZSBkb24ndCBjb21wdXRlIHNpYmxpbmdJbmZvIGlmIHRoZSByb290IGFuZCB0aGUgcmlnaHRtb3N0IGNvbnRleHRzIGFyZSB0aGUgc2FtZVxuXHQgKiBAcGFyYW0gcm9vdENvbnRleHRJbmZvIFRoZSByb290IGNvbnRleHQgaW5mb3JtYXRpb24gb2Ygcm9vdCBvZiB0aGUgZHJhZnRcblx0ICogQHBhcmFtIGdyb3VwSWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuXHQgKi9cblx0YXN5bmMgX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0cm9vdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0LFxuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCxcblx0XHRzUHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLFxuXHRcdGRvTm90Q29tcHV0ZUlmUm9vdDogYm9vbGVhbixcblx0XHRyb290Q29udGV4dEluZm8/OiBSb290Q29udGV4dEluZm8sXG5cdFx0Z3JvdXBJZD86IHN0cmluZ1xuXHQpOiBQcm9taXNlPFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZD4ge1xuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgPz8gcm9vdEN1cnJlbnRDb250ZXh0O1xuXHRcdGlmICghcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdC8vIFdyb25nIHVzYWdlICEhXG5cdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHR9XG5cdFx0bGV0IHJpZ2h0TW9zdENvbnRleHRUb1VzZSA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0O1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwocmlnaHRtb3N0Q3VycmVudENvbnRleHQpICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHQvLyB3ZSBjaGVjayB0aGUgcmlnaHRNb3N0Q3VycmVudENvbnRleHQgY2FuIGJlIHVzZWQgaW4gZHJhZnRcblx0XHRcdHJpZ2h0TW9zdENvbnRleHRUb1VzZSA9IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHR9XG5cdFx0aWYgKGRvTm90Q29tcHV0ZUlmUm9vdCAmJiByaWdodE1vc3RDb250ZXh0VG9Vc2UuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRNb3N0Q29udGV4dFRvVXNlLCByb290Q29udGV4dEluZm8sIGdyb3VwSWQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBub3QgaW4gZHJhZnQgbW9kZSwgd2UganVzdCByZWNyZWF0ZSBhIGNvbnRleHQgZnJvbSB0aGUgcGF0aCBvZiB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdC8vIE5vIHBhdGggbWFwcGluZyBpcyBuZWVkZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCksXG5cdFx0XHRcdHBhdGhNYXBwaW5nOiBbXVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHRfaXNGY2xFbmFibGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKTtcblx0fVxuXG5cdGFzeW5jIGNoZWNrUmVjb21tZW5kYXRpb25PcHRpb24oKTogUHJvbWlzZTxSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIHwgdW5kZWZpbmVkPiB7XG5cdFx0Ly9UaGUgZXhpc3RpbmcgcmVjb21tZW5kYXRpb25zIGNoZWNrIGlzIG5vdyBwcmVzZW50IGZ1cnRoZXIgaW4gdGhlIGZsb3cgZm9yIHNob3dpbmcgY29uZmlybWF0aW9uIGRpYWxvZ1xuXHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9IGF3YWl0IHRoaXMuc2hvd0NvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2codHJ1ZSk7XG5cdFx0aWYgKHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBOZXh0IERvY3VtZW50LlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlZCBvbmNlIGNyZWF0ZSBuZXh0IGhhcHBlbnMuXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVOZXh0RG9jdW1lbnQoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYmluZGluZ0NvbnRleHRQYXRoID0gdGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKTtcblx0XHRjb25zdCBsaXN0QmluZGluZ1BhdGggPSBiaW5kaW5nQ29udGV4dFBhdGg/LnN1YnN0cmluZygwLCBiaW5kaW5nQ29udGV4dFBhdGgubGFzdEluZGV4T2YoXCIoXCIpKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEb2N1bWVudChsaXN0QmluZGluZ1BhdGggYXMgc3RyaW5nLCB7IGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLk5ld1BhZ2UgfSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRWRpdEZsb3c7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTRFQSxNQUFNQSxnQkFBZ0IsR0FBR0MsU0FBUyxDQUFDRCxnQkFBZ0I7SUFDbERFLFNBQVMsR0FBR0QsU0FBUyxDQUFDQyxTQUFTO0lBQy9CQyxXQUFXLEdBQUdGLFNBQVMsQ0FBQ0UsV0FBVztJQUNuQ0MsUUFBUSxHQUFHSCxTQUFTLENBQUNHLFFBQVE7SUFDN0JDLFdBQVcsR0FBR0osU0FBUyxDQUFDSSxXQUFXO0VBMkJwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQSxJQU9NQyxRQUFRLElBQUFDLElBQUEsR0FEYkMsY0FBYyxDQUFDLDJDQUEyQyxDQUFDLEVBQUFDLEtBQUEsR0FjMURDLGNBQWMsQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0F3QmhCQyxlQUFlLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBQ2pCQyxjQUFjLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBcVJoQkgsZUFBZSxDQUFDLENBQUMsRUFBQUksS0FBQSxHQUNqQkYsY0FBYyxDQUFDLENBQUMsRUFBQUcsS0FBQSxHQXFHaEJMLGVBQWUsQ0FBQyxDQUFDLEVBQUFNLEtBQUEsR0FDakJKLGNBQWMsQ0FBQyxDQUFDLEVBQUFLLEtBQUEsR0F1K0JoQlAsZUFBZSxDQUFDLENBQUMsRUFBQVEsTUFBQSxHQUNqQkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLEVBQUFDLE1BQUEsR0FtQm5DWixlQUFlLENBQUMsQ0FBQyxFQUFBYSxNQUFBLEdBQ2pCSixVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUFLLE1BQUEsR0FtQnhCZCxlQUFlLENBQUMsQ0FBQyxFQUFBZSxNQUFBLEdBQ2pCTixVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUFPLE1BQUEsR0FtQnhCaEIsZUFBZSxDQUFDLENB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
3272
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiRWRpdEZsb3ciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJwdWJsaWNFeHRlbnNpb24iLCJfZGVjNCIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzUiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiX2RlYzExIiwiX2RlYzEyIiwiX2RlYzEzIiwiX2RlYzE0IiwiX2RlYzE1IiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiX2RlYzIzIiwiX2RlYzI0IiwiX2RlYzI1IiwiX2RlYzI2IiwiX2RlYzI3IiwiX2RlYzI4IiwiX2RlYzI5IiwiX2RlYzMwIiwiX2RlYzMxIiwiX2RlYzMyIiwiX2RlYzMzIiwiX2RlYzM0IiwiX2RlYzM1IiwiX2RlYzM2IiwiX2RlYzM3IiwiX2RlYzM4IiwiX2RlYzM5IiwiX2RlYzQwIiwiX2RlYzQxIiwiX2RlYzQyIiwiX2RlYzQzIiwiX2RlYzQ0IiwiSW5zdGVhZCIsIl9kZWM0NSIsIl9kZWM0NiIsIl9jbGFzcyIsIl9jbGFzczIiLCJfQmFzZUNvbnRyb2xsZXJFeHRlbnMiLCJfdGhpcyIsIl9sZW4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY2FsbCIsInN5bmNUYXNrcyIsIlByb21pc2UiLCJyZXNvbHZlIiwiaGFuZGxlU2lkZUVmZmVjdHMiLCJsaXN0QmluZGluZyIsImNyZWF0aW9uUHJvbWlzZSIsInBhcmVudENvbnRleHQiLCJuZXdDb250ZXh0IiwiY3JlYXRlZCIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsImdldFZpZXciLCJnZXRCaW5kaW5nQ29udGV4dCIsImVycm9yIiwiTG9nIiwiY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwidmFsaWRhdGlvbk1lc3NhZ2VzIiwidGFibGUiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJnZXRDcmVhdGlvblJvdyIsImRhdGEiLCJjdXN0b21WYWxpZGl0eSIsImdldFByb3BlcnR5IiwiY3VzdG9tTWVzc2FnZXMiLCJmaWVsZENvbnRyb2wiLCJmaW5hbFRhcmdldCIsIm9sZE1lc3NhZ2VzIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZpbHRlciIsIm1lc3NhZ2UiLCJnZXRDb2RlIiwicmVtb3ZlTWVzc2FnZXMiLCJmb3JFYWNoIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0IiwiRWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwiZmllbGRJZCIsImdldFBhdGgiLCJnZXRCaW5kaW5nUGF0aCIsImdldFRhcmdldHMiLCJzb21lIiwidGFyZ2V0IiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZVRleHQiLCJwcm9jZXNzb3IiLCJnZXRNb2RlbCIsInR5cGUiLCJNZXNzYWdlVHlwZSIsIkVycm9yIiwiY29kZSIsInRlY2huaWNhbCIsInBlcnNpc3RlbnQiLCJleGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyIsImFkZENvbnRyb2xJZCIsInB1c2giLCJ0ZXh0IiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJzaG93TWVzc2FnZURpYWxvZyIsInJlc29sdmVDcmVhdGlvbk1vZGUiLCJpbml0aWFsQ3JlYXRpb25Nb2RlIiwiY3JlYXRlRGF0YSIsIkNyZWF0aW9uTW9kZSIsIk5ld1BhZ2UiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJwcm9ncmFtbWluZ01vZGVsIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsImlzUmVsYXRpdmUiLCJkYXRhTW9kZWxMaXN0QmluZGluZ1BhdGgiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJnZXRNZXRhQ29udGV4dCIsImVudGl0eVNldCIsInRhcmdldEVudGl0eVNldCIsIm5ld0FjdGlvbiIsIkRyYWZ0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIk5ld0FjdGlvbiIsInRvU3RyaW5nIiwidGFyZ2V0RW50aXR5VHlwZSIsImFjdGlvbnMiLCJwYXJhbWV0ZXJzIiwiRGVmZXJyZWQiLCJjcmVhdGlvblBhcmFtZXRlcnMiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsImdldENyZWF0aW9uUGFyYW1ldGVycyIsImdldEFwcENvbXBvbmVudCIsIkFzeW5jIiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJvbkluaXQiLCJfaGlkZGVuRHJhZnQiLCJnZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcyIsImdldENhcGFiaWxpdGllcyIsIkhpZGRlbkRyYWZ0IiwiZ2V0SW50ZXJmYWNlIiwiYmFzZSIsImVkaXREb2N1bWVudCIsImNvbnRleHQiLCJ0cmFuc2FjdGlvbkhlbHBlciIsInJvb3RWaWV3Q29udHJvbGxlciIsIl9nZXRSb290Vmlld0NvbnRyb2xsZXIiLCJtb2RlbCIsInZpZXdEYXRhIiwiZ2V0Vmlld0RhdGEiLCJncm91cElkIiwibWVzc2FnZUhhbmRsaW5nS2V5IiwicmVnaXN0ZXJUb0hvbGRNZXNzYWdlcyIsInJvb3RDb250ZXh0IiwiZ2V0Um9vdENvbnRleHQiLCJlZGl0RmxvdyIsIm9uQmVmb3JlRWRpdCIsInJpZ2h0bW9zdENvbnRleHQiLCJfaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsInVuZGVmaW5lZCIsInRyYW5zYWN0aW9uRGV0YWlscyIsIm5ld0RvY3VtZW50Q29udGV4dFByb21pc2UiLCJyb290Q29udGV4dEluZm8iLCJyb290U2libGluZ1BhdGhQcm9taXNlIiwiX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMiLCJzaWJsaW5nSW5mb1Byb21pc2UiLCJjb21wdXRlU2libGluZ0luZm8iLCJ2aWV3TGV2ZWwiLCJfY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInN1Ym1pdEJhdGNoIiwic2libGluZ0luZm8iLCJuZXdEb2N1bWVudENvbnRleHQiLCJjb250ZXh0VG9OYXZpZ2F0ZSIsIl9nZXROYXZpZ2F0aW9uVGFyZ2V0Rm9yRWRpdCIsIl91cGRhdGVQYXRoc0luSGlzdG9yeSIsIm92ZXJyaWRlTWVzc2FnZVVJRGVjaXNpb24iLCJTdGlja3kiLCJNb2RlbEhlbHBlciIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwiZXhpc3RpbmdEcmFmdFJldXNlZCIsImNvbGxhYm9yYXRpdmVEcmFmdCIsInNldEluaXRpYWxTaGFyZSIsIm9uQWZ0ZXJFZGl0IiwiX2hhbmRsZU5ld0NvbnRleHQiLCJlZGl0YWJsZSIsInJlY3JlYXRlQ29udGV4dCIsImZvcmNlRm9jdXMiLCJzdGlja3lDb250ZXh0IiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsImhhbmRsZVN0aWNreU9uIiwiaGFuZGxlSGlkZGVuRHJhZnRFZGl0Iiwic2V0RWRpdE1vZGUiLCJFZGl0YWJsZSIsInNldERvY3VtZW50TW9kaWZpZWQiLCJ1bkhvbGRLZXkiLCJvdmVycmlkZVVJRGVjaXNpb24iLCJyZWplY3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZSIsImlnbm9yZVRyYW5zaWVudENvbnRleHRzIiwic3RhdGVNZXNzYWdlc1BhdGgiLCJnZXRNZXNzYWdlc1BhdGgiLCJpc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwibGlzdEJpbmRpbmdSZWxhdGl2ZVBhdGhUb1BhZ2UiLCJnZXRSZWxhdGl2ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJsaXN0QmluZGluZ1JlbGF0aXZlUGF0aCIsImdldENvbnRleHQiLCJDb21tb25VdGlscyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsImNvbnRleHRzVG9EZWxldGUiLCJiZWZvcmVEZWxldGVDYWxsQmFjayIsIm9uQmVmb3JlRGVsZXRlIiwidGFibGVBUEkiLCJpc0lubGluZUNyZWF0aW9uUm93cyIsImxvY2tPYmplY3QiLCJnZXRHbG9iYWxVSU1vZGVsIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJjb250cm9sSWQiLCJpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUiLCJpc0EiLCJnZXRQYXJlbnQiLCJ0YWJsZURlZmluaXRpb24iLCJjb250cm9sIiwiY3JlYXRpb25Nb2RlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwiaXNJbmFjdGl2ZSIsImdldEJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwic2VsZWN0ZWRDb250ZXh0cyIsImRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJyZXN1bHQiLCJjbGVhclNlbGVjdGlvbiIsInZpZXdCaW5kaW5nQ29udGV4dCIsImlzUm9vdCIsInJlZnJlc2hMaXN0QmluZGluZyIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwiaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQiLCJyZWNvbW1lbmRhdGlvbnMiLCJpZ25vcmVSZWNvbW1lbmRhdGlvbkZvckNvbnRleHRzIiwib25BZnRlckRlbGV0ZSIsImNvbnRleHRzIiwicmVtb3ZlRW1wdHlSb3dzTWVzc2FnZXMiLCJzZXRVcEVtcHR5Um93cyIsImdldENvbnRlbnQiLCJfc2VuZEFjdGl2aXR5IiwiQWN0aXZpdHkiLCJEZWxldGUiLCJ1bmxvY2siLCJ1cGRhdGVEb2N1bWVudCIsInVwZGF0ZWRDb250ZXh0IiwidXBkYXRlUHJvbWlzZSIsIm9yaWdpbmFsQmluZGluZ0NvbnRleHQiLCJpc0RyYWZ0IiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwic3luY1Rhc2siLCJzZXREcmFmdFN0YXR1cyIsIlNhdmluZyIsImN1cnJlbnRCaW5kaW5nQ29udGV4dCIsImVudGl0eVNldE5hbWUiLCJnZXRPYmplY3QiLCJzZW1hbnRpY0tleXMiLCJTZW1hbnRpY0tleUhlbHBlciIsImdldFNlbWFudGljS2V5cyIsImN1cnJlbnRTZW1hbnRpY01hcHBpbmciLCJfZ2V0U2VtYW50aWNNYXBwaW5nIiwiY3VycmVudFNlbWFudGljUGF0aCIsInNlbWFudGljUGF0aCIsInNDaGFuZ2VkUGF0aCIsImdldFNlbWFudGljUGF0aCIsIlNhdmVkIiwiQ2xlYXIiLCJzaG93TWVzc2FnZXMiLCJnZXRQYXJlbnRDb250ZXh0RnJvbVNlbGVjdGlvbiIsImNyZWF0ZURvY3VtZW50Iiwic291cmNlIiwibUluUGFyYW1ldGVycyIsIm9EYXRhTGlzdEJpbmRpbmciLCJkYXRhTW9kZWwiLCJzZWxlY3RlZFByb3BlcnRpZXMiLCIkc2VsZWN0IiwiJCRncm91cElkIiwiRXh0ZXJuYWwiLCJsaXN0QmluZGluZ0Zyb21QYXRoIiwiYmluZExpc3QiLCJjcmVhdGVBdEVuZCIsInJlc29sdmVkQ3JlYXRpb25Nb2RlIiwiZ2V0Um91dGVyUHJveHkiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJzaW5nbGVEcmFmdEZvckNyZWF0ZSIsImdldE1hbmlmZXN0IiwiYXBwIiwiZ2V0Um9vdEJpbmRpbmciLCJnZXRIZWFkZXJDb250ZXh0IiwibmV3QmluZGluZyIsIlNvcnRlciIsIkZpbHRlciIsImZpbHRlcnMiLCJwYXRoIiwib3BlcmF0b3IiLCJ2YWx1ZTEiLCJhbmQiLCJyZXF1ZXN0Q29udGV4dHMiLCJ0aGVuIiwiZGVzdHJveSIsIl9oYW5kbGVDcmVhdGlvbk1vZGUiLCJ2TGlzdEJpbmRpbmciLCJjcmVhdGVFeHRlcm5hbERvY3VtZW50Iiwib3V0Ym91bmQiLCJjcmVhdGVEZWZlcnJlZERvY3VtZW50IiwicmVxdWVzdEF0TGVhc3QiLCJDcmVhdGlvblJvdyIsImNyZWF0aW9uUm93IiwiY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQiLCJza2lwU2lkZUVmZmVjdHMiLCJJbmxpbmUiLCJjcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudCIsInRhYmxlSWQiLCJDcmVhdGlvbkRpYWxvZyIsImNyZWF0aW9uRGlhbG9nRmllbGRzIiwiY3JlYXRlRGlhbG9nQW5kU2F2ZURvY3VtZW50IiwiU3luYyIsImNyZWF0ZVN5bmNBc3luY0RvY3VtZW50IiwiYkZyb21EZWZlcnJlZCIsImNyZWF0ZUFjdGlvbiIsInBvc3REb2N1bWVudENyZWF0aW9uIiwicHJlcmVxdWlzaXRlIiwicmVzdWx0cyIsImNyZWF0aW9uIiwiaXNSZWplY3RlZCIsInJlYXNvbiIsIm5hdmlnYXRpb24iLCJ2YWx1ZSIsIm9uQWZ0ZXJDcmVhdGUiLCJtZXRhQ29udGV4dCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiZ2V0SW50ZXJuYWxNb2RlbCIsInNldFByb3BlcnR5IiwiaXNMaXN0QmluZGluZ0FuYWx5dGljYWwiLCJmb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCIsInNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZSIsIkNyZWF0ZSIsImlzRHJhZnRSb290IiwiaXNDb25uZWN0ZWQiLCJhcHBDb21wb25lbnQiLCJjcmVhdGlvblJvd0NvbnRleHQiLCJkb2N1bWVudFZhbGlkYXRpb24iLCJnZXRDcmVhdGlvblJvd1ZhbGlkYXRpb25GdW5jdGlvbiIsImVudGl0eVR5cGUiLCJjcmVhdGlvblJvd1BheWxvYWQiLCJfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzIiwiYXR0YWNoRXZlbnRPbmNlIiwic2Nyb2xsVG9JbmRleCIsImdldExlbmd0aCIsImhhbmRsZUNyZWF0ZUV2ZW50cyIsIk9iamVjdCIsImFzc2lnbiIsImtleXMiLCJwcm9wZXJ0eVBhdGgiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImZpbmRJbmRleCIsInByb3BlcnR5IiwibmFtZSIsIm1hcCIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJidXN5TW9kZSIsImJ1c3lJZCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImFubm90YXRpb24iLCJpZCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwib25CZWZvcmVDcmVhdGUiLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiZ2V0U3RhcnR1cE1vZGUiLCJBdXRvQ3JlYXRlIiwiX2dldFJlc291cmNlTW9kZWwiLCJjcmVhdGlvblJvd0xpc3RCaW5kaW5nIiwibmV3VHJhbnNpZW50Q29udGV4dCIsImNyZWF0ZSIsInNldEJpbmRpbmdDb250ZXh0IiwiY2F0Y2giLCJ0cmFjZSIsImRlbGV0ZSIsImFsbFNldHRsZWQiLCJpc0xvY2tlZCIsImNvbnRleHRJbmRleCIsImdldEluZGV4IiwiYWdncmVnYXRpb25EYXRhIiwiZ2V0QWdncmVnYXRpb24iLCJpc0NyZWF0ZUluUGxhY2UiLCJjcmVhdGVJblBsYWNlIiwic2V0VGltZW91dCIsImdldEJ1c3kiLCJmb2N1c1JvdyIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJnZXRUZXh0IiwicGFyZW50SW5kZXgiLCJzYXZlZERvY3VtZW50Q29udGV4dCIsImFmdGVyQ3JlYXRlSW5EaWFsb2ciLCJvbkJlZm9yZVNhdmUiLCJzYXZlRG9jdW1lbnQiLCJvbkFmdGVyU2F2ZSIsInJlZnJlc2giLCJpdGVtSW5kZXgiLCJhZnRlckNyZWF0ZUNhbGxCYWNrIiwiYWxsIiwiZ2V0SW50ZXJuYWxSb3V0aW5nIiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMiLCJtb2RlIiwicm91dGluZ0xpc3RlbmVyIiwiY3JlYXRlQ29udGV4dFByb21pc2UiLCJjb3JlUmVzb3VyY2VCdW5kbGUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibmF2UGFyYW1ldGVycyIsInRyYW5zaWVudCIsIm5hdmlnYXRlVG9Db250ZXh0IiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwic2hvd01lc3NhZ2VQYWdlT25DcmVhdGVGYWlsdXJlIiwiQWN0aW9uRXhlY3V0aW9uRmFpbGVkIiwiQ3JlYXRpb25GYWlsZWQiLCJPbkJlZm9yZUNyZWF0ZUZhaWxlZCIsImluY2x1ZGVzIiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwiY29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJjcmVhdGVQYXRoIiwiZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsInZhbGlkYXRlRG9jdW1lbnQiLCJjcmVhdGlvblJvd09iamVjdHMiLCJjcmVhdGVNdWx0aXBsZURvY3VtZW50cyIsImRhdGFGb3JDcmVhdGUiLCJpc0Zyb21Db3B5UGFzdGUiLCJjcmVhdGVBc0luYWN0aXZlIiwidGFyZ2V0TGlzdEJpbmRpbmciLCJtZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiY3JlYXRpb25Qcm9taXNlcyIsInByb3BlcnR5VmFsdWVzIiwiY3JlYXRlUGFyYW1ldGVycyIsImluYWN0aXZlIiwiJGtpbmQiLCJjcmVhdGVkQ29udGV4dHMiLCJhY3RpdmVDb250ZXh0cyIsImVyciIsIl9tUGFyYW1ldGVycyIsIm9uQmVmb3JlRGlzY2FyZCIsIm9uQmVmb3JlRXhlY3V0ZUFjdGlvbiIsIm9uQWZ0ZXJEaXNjYXJkIiwib0NvbnRleHQiLCJtUGFyYW1ldGVycyIsImlubGluZUVkaXRGbG93IiwiaXNJbmxpbmVFZGl0UG9zc2libGUiLCJpbmxpbmVFZGl0U2F2ZSIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYUJpbmRpbmdzIiwiYmluZGluZ3MiLCJtZXJnZVBhdGNoRHJhZnQiLCJfc3VibWl0T3BlbkNoYW5nZXMiLCJyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4iLCJjaGVja1JlY29tbWVuZGF0aW9uT3B0aW9uIiwic1Byb2dyYW1taW5nTW9kZWwiLCJpc0ZjbEVuYWJsZWQiLCJfc2lkZUVmZmVjdHMiLCJoYW5kbGVQYWdlQ2hhbmdlQ29udGV4dCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiYWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiZ2V0Q3JlYXRpb25Nb2RlIiwiaXNTdGFuZGFyZFNhdmUiLCJfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsImhhbmRsZVNlc3Npb25PZmYiLCJBY3RpdmF0ZSIsImRpc2Nvbm5lY3QiLCJfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkiLCJTdGFuZGFyZEFjdGlvbnMiLCJzYXZlIiwiVHJpZ2dlclR5cGUiLCJzdGFuZGFyZEFjdGlvbiIsIkRpc3BsYXkiLCJzdG9yZURhdGFGb3JUZWxlbWV0cnkiLCJfY3JlYXRlU2libGluZ0luZm8iLCJwcmV2aW91c1NlbWFudGljUGF0aCIsIm5ld1NlbWFudGljUGF0aCIsInBhdGhNYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJzdGF5T25DdXJyZW50UGFnZUFmdGVyU2F2ZSIsInRhcmdldENvbnRleHQiLCJza2lwQmluZGluZ1RvVmlldyIsIm9FcnJvciIsImNhbmNlbGVkIiwidG9nZ2xlRHJhZnRBY3RpdmUiLCJvQ29udGV4dERhdGEiLCJiSXNEcmFmdCIsIklzQWN0aXZlRW50aXR5IiwiSGFzQWN0aXZlRW50aXR5IiwiSGFzRHJhZnRFbnRpdHkiLCJvUm9vdFZpZXdDb250cm9sbGVyIiwib1JpZ2h0bW9zdENvbnRleHQiLCJsYXN0U2VtYW50aWNNYXBwaW5nIiwidGVjaG5pY2FsUGF0aCIsInRhcmdldFBhdGgiLCJjYW5jZWxEb2N1bWVudCIsImlzTmV3RG9jdW1lbnQiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJlbmFibGVkIiwiY2FuY2VsUGFyYW1ldGVycyIsImNhbmNlbEJ1dHRvbiIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwicm9vdENvbnRleHRQYXRoIiwiZ2V0RHJhZnRSb290UGF0aCIsImNhbmNlbFJlc3VsdCIsImlzRG9jdW1lbnRNb2RpZmllZCIsImdldEluc3RhbmNlZFZpZXdzIiwidmlldyIsImlzS2VlcEFsaXZlIiwic2V0S2VlcEFsaXZlIiwiRGlzY2FyZCIsInNraXBCYWNrTmF2aWdhdGlvbiIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0Iiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsInN0YXlPbkN1cnJlbnRQYWdlQWZ0ZXJDYW5jZWwiLCJfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyIsInNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlIiwiYmluZGluZ1BhcmFtZXRlcnMiLCJjcmVhdGVSb290Q29udGV4dCIsImlzUm9vdENvbnRleHROZXciLCJkcmFmdFByb3BlcnRpZXMiLCJyZXF1ZXN0UHJvcGVydHkiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsInNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCIsImNsb3NlT25Ccm93c2VyTmF2aWdhdGlvbiIsImRldGFjaEFmdGVyUm91dGVNYXRjaGVkIiwiZGVsZXRlRG9jdW1lbnQiLCJvQXBwQ29tcG9uZW50Iiwic2libGluZ0NvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsImRyYWZ0UGF0aCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiZHJhZnRDb250ZXh0VG9SZW1vdmUiLCJyZXBsYWNlV2l0aCIsImNvbnRleHRCaW5kaW5nIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwiRGVlcGxpbmsiLCJleGl0RnJvbUFwcCIsImFwcGx5RG9jdW1lbnQiLCJvTG9ja09iamVjdCIsImlzQ29udGludWUiLCJzaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyIsIlJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24iLCJDb250aW51ZSIsImNhbGxFeHRlbnNpb24iLCJpbnZva2VBY3Rpb24iLCJzQWN0aW9uTmFtZSIsIm1FeHRyYVBhcmFtcyIsImFQYXJ0cyIsInNPdmVybG9hZEVudGl0eVR5cGUiLCJvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyIsIm9WaWV3IiwiaXNBcnJheSIsImlzTmF2aWdhYmxlIiwicmVxdWlyZXNOYXZpZ2F0aW9uIiwiY29udmVydGVkTWV0YWRhdGEiLCJjb252ZXJ0VHlwZXMiLCJlbnRpdHlDb250YWluZXIiLCJpc0JvdW5kIiwib0NvbnRyb2wiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImlnbm9yZUVUYWciLCJzcGxpdCIsInJlcGxhY2VBbGwiLCJiU3RhdGljQWN0aW9uIiwiX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgiLCJlbmFibGVBdXRvU2Nyb2xsIiwiY3JlYXRlQWN0aW9uUHJvbWlzZSIsImdldElkIiwicmVzcG9uc2UiLCJjYWxsQWN0aW9uIiwic3VjY2Vzc0Z1bGxFeGVjdXRpb24iLCJpc0Z1bGZpbGxlZCIsImxpc3RSZWZyZXNoZWQiLCJfcmVmcmVzaExpc3RJZlJlcXVpcmVkIiwiZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsIkFjdGlvbiIsImJvdW5kQ29udGV4dCIsImFjdGlvbiIsImZSZXNvbHZlciIsImNvbnZlcnRlclR5cGUiLCJfZ2V0Qm91bmRDb250ZXh0IiwicmV0dXJuZWRDb250ZXh0Iiwib01ldGFNb2RlbCIsInNDb250ZXh0TWV0YVBhdGgiLCJfZm5WYWxpZENvbnRleHRzIiwiYXBwbGljYWJsZUNvbnRleHRzIiwiZWxlbWVudCIsIm9BY3Rpb25Db250ZXh0Iiwic0FjdGlvbkNvbnRleHRNZXRhUGF0aCIsImNoZWNrTm9IYXNoQ2hhbmdlIiwiaW5mbyIsIm9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24iLCJvUmVzdWx0IiwiZlJlamVjdG9yIiwiX2FjdGlvbk5hbWUiLCJjdXN0b21NYXNzRWRpdFNhdmUiLCJzZWN1cmVkRXhlY3V0aW9uIiwiZm5GdW5jdGlvbiIsImJCdXN5U2V0IiwiYnVzeSIsInNldCIsImJCdXN5Q2hlY2siLCJjaGVjayIsImJVcGRhdGVzRG9jdW1lbnQiLCJ1cGRhdGVzRG9jdW1lbnQiLCJmaW5hbGx5IiwiaGFuZGxlUGF0Y2hTZW50Iiwib0V2ZW50IiwiaW50ZXJuYWxDb250ZXh0IiwidWlDb250ZXh0IiwiZ2V0U291cmNlIiwic2V0SWdub3JlRVRhZyIsImhhbmRsZUlubGluZUVkaXRQYXRjaFNlbnQiLCJzb3VyY2VCaW5kaW5nIiwib1BhdGNoUHJvbWlzZSIsInBhdGNoQ29tcGxldGVkRXZlbnQiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2giLCJiU3VjY2VzcyIsImdldFBhcmFtZXRlciIsImhhbmRsZUNyZWF0ZVNlbnQiLCJldmVudCIsIm5ld1Rhc2siLCJkZWJ1ZyIsImNvbXB1dGVNb2RlbHNGb3JFZGl0TW9kZSIsImdsb2JhbE1vZGVsIiwiZm9yY2VEaXNwbGF5TW9kZSIsImlzQWN0aXZlRW50aXR5IiwicmVxdWVzdE9iamVjdCIsImFjdGl2YXRlQ29sbGFib3JhdGlvbiIsImZldGNoQ29sbGFib3JhdGl2ZURyYWZ0VXNlcnNQcm9taXNlIiwiaGFzQWN0aXZlRW50aXR5IiwibGFzdEludm9rZWRBY3Rpb25OYW1lIiwiaXNOZXdBY3Rpb25Gb3JTdGlja3kiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJzb3VyY2VDb250cm9sIiwiZ2V0UmVzb3VyY2VNb2RlbCIsIlRyYW5zYWN0aW9uSGVscGVyIiwibWVzc2FnZUhhbmRsZXIiLCJnZXRQYWdlSW50ZXJuYWxNb2RlbCIsInNldENyZWF0aW9uTW9kZSIsImJDcmVhdGlvbk1vZGUiLCJwYWdlSW50ZXJuYWxDb250ZXh0IiwiVWlNb2RlbENvbnN0YW50cyIsIkNyZWF0ZU1vZGUiLCJEb2N1bWVudE1vZGlmaWVkIiwibW9kaWZpZWQiLCJiaW5kaW5nIiwibWVzc2FnZUhhbmRsaW5nS2V5U2V0cyIsImF0dGFjaEV2ZW50IiwiZXZlbnRJbnN0YW5jZSIsImZpbmQiLCJzdWNjZXNzIiwiZHJhZnRTdGF0dXMiLCJlZGl0TW9kZSIsImlzQ3JlYXRpb24iLCJmb3JjZWQiLCJzaGFsbEZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkIiwiYWN0aW9uTmFtZSIsInN0aWNreVNlc3Npb24iLCJBZGRpdGlvbmFsTmV3QWN0aW9ucyIsImhhc05hdmlnYXRpb25HdWFyZCIsInJlZ2lzdGVyQ2FsbGJhY2tzIiwiaGFzaFRyYWNrZXIiLCJnZXRIYXNoIiwiaW50ZXJuYWxNb2RlbCIsInNldE5hdmlnYXRpb25HdWFyZCIsInN1YnN0cmluZyIsIm9uQmFja05hdmlnYXRpb25JblNlc3Npb24iLCJiaW5kIiwiaTE4bk1vZGVsIiwiZ2V0RGlydHlTdGF0ZVByb3ZpZGVyIiwiZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24iLCJnZXRTZXNzaW9uVGltZW91dEZ1bmN0aW9uIiwiaGlkZGVuRHJhZnRDb250ZXh0IiwiZGlzY2FyZE5hdmlnYXRpb25HdWFyZCIsInVucmVnaXN0ZXJDYWxsYmFja3MiLCJnZXRIdHRwSGVhZGVycyIsIm5hdmlnYXRpb25Db250ZXh0IiwidGFyZ2V0SGFzaCIsImlubmVyQXBwUm91dGUiLCJyb3V0ZXJQcm94eSIsImxjbEhhc2hUcmFja2VyIiwiaXNEaXJ0eSIsImlzU2Vzc2lvbk9uIiwiaXNOYXZpZ2F0aW9uRmluYWxpemVkIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsInNldERpcnR5RmxhZyIsIndhcm5pbmdEaWFsb2ciLCJEaWFsb2ciLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJwcmVzcyIsImFmdGVyQ2xvc2UiLCJhZGRTdHlsZUNsYXNzIiwic2V0TW9kZWwiLCJhZGREZXBlbmRlbnQiLCJvcGVuIiwiY29udGV4dFBhdGgiLCJjdXJyZW50SGFzaCIsImhhbmRsZUhpZGRlbkRyYWZ0RGlzY2FyZCIsImRpc2NhcmRTdGlja3lTZXNzaW9uIiwiY2xlYXJTZXNzaW9uQ29udGV4dCIsImRpc2NhcmRDb250ZXh0IiwiZGlzY2FyZEhpZGRlbkRyYWZ0U2Vzc2lvbiIsInJlc2V0Q2hhbmdlcyIsImRpc2NhcmRlZENvbnRleHQiLCJzdGlja3kiLCJkaXNjYXJkRG9jdW1lbnQiLCJkcmFmdERhdGFMb3NzUG9wdXAiLCJkaXNjYXJkRHJhZnQiLCJfcm91dGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImdldExhc3RTZW1hbnRpY01hcHBpbmciLCJyZXNvbHZlRnVuY3Rpb24iLCJyZWplY3RGdW5jdGlvbiIsImFjdGlvblByb21pc2UiLCJjdXJyZW50VmlldyIsIm1ldGFNb2RlbERhdGEiLCJtZXRhTW9kZWxBY3Rpb24iLCJhY3Rpb25SZXR1cm5UeXBlIiwiJFJldHVyblR5cGUiLCIkVHlwZSIsIiRLZXkiLCJvRGF0YSIsImdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJpc1NhdmUiLCJjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nIiwiQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nIiwiX3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyIsInJvd0JpbmRpbmciLCJhY3RpdmVSb3dJbmRleCIsImdldENvdW50IiwiYWxsUm93Q29udGV4dHMiLCJnZXRBbGxDdXJyZW50Q29udGV4dHMiLCJpbmRleCIsInNpbmdsZUNvbnRleHQiLCJjcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyIsImlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUiLCJyZWxhdGVkQ29udGV4dHMiLCJ0cmlnZ2VyZWRBY3Rpb25OYW1lIiwiYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyIsInNlbmQiLCJ0cmlnZ2VyVHlwZSIsInRyaWdnZXJDb25maWd1cmVkU3VydmV5Iiwib01vZGVsIiwib1JlcXVlc3RvciIsIndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMiLCJjaGVja0lmQmFja0lzT3V0T2ZHdWFyZCIsInByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbiIsImhpc3RvcnkiLCJiYWNrIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwZXJzaXN0T1BTY3JvbGwiLCJOYXZpZ2F0aW9uUmVhc29uIiwiRWRpdEZsb3dBY3Rpb24iLCJzaG93UGxhY2Vob2xkZXIiLCJrZWVwQ3VycmVudExheW91dCIsInBhcmFtcyIsImJSZWZyZXNoQWZ0ZXJBY3Rpb24iLCJ2aXNpYmxlVmlld0lkcyIsIl9nZXRBbGxWaXNpYmxlVmlld3MiLCJhTWVzc2FnZXMiLCJ2YWxpZGF0aW9uIiwiZ2V0Q29udHJvbElkIiwib1Jlc3BvbnNlIiwib0JpbmRpbmciLCJhS2V5cyIsIm9DdXJyZW50RGF0YSIsImJSZXR1cm5lZENvbnRleHRJc1NhbWUiLCJldmVyeSIsInNLZXkiLCJzRW50aXR5U2V0TmFtZSIsImFTZW1hbnRpY0tleXMiLCJwYXRocyIsIm9LZXkiLCIkUHJvcGVydHlQYXRoIiwib3ZlcmxvYWRFbnRpdHlUeXBlIiwiY29udGV4dFNlZ21lbnRzIiwiY3VycmVudENvbnRleHQiLCJwb3AiLCJ1bnNoaWZ0IiwicGFyZW50Q29udGV4dHMiLCJwYXRoU2VnbWVudCIsInJldmVyc2UiLCJvdmVybG9hZENvbnRleHQiLCJtYXBwaW5ncyIsInNldFBhdGhNYXBwaW5nIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJkb05vdENvbXB1dGVJZlJvb3QiLCJzdGFydHNXaXRoIiwicmlnaHRNb3N0Q29udGV4dFRvVXNlIiwiZHJhZnQiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwiY3JlYXRlTmV4dERvY3VtZW50IiwiYmluZGluZ0NvbnRleHRQYXRoIiwibGlzdEJpbmRpbmdQYXRoIiwibGFzdEluZGV4T2YiLCJCYXNlQ29udHJvbGxlckV4dGVuc2lvbiIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkVkaXRGbG93LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRW50aXR5U2V0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgbWV0aG9kT3ZlcnJpZGUsIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgSVJvd0JpbmRpbmdJbnRlcmZhY2UgZnJvbSBcInNhcC9mZS9jb3JlL0lSb3dCaW5kaW5nSW50ZXJmYWNlXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCYXNlQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQmFzZUNvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIFRyaWdnZXJUeXBlLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHR5cGUgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBDdXN0b21NZXNzYWdlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCB0eXBlIHtcblx0Q2FuY2VsUGFyYW1ldGVycyxcblx0Q3JlYXRlUGFyYW1ldGVycyxcblx0RWRpdFRyYW5zYWN0aW9uRXhlY3V0aW9uRGV0YWlsc1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvVHJhbnNhY3Rpb25IZWxwZXJcIjtcbmltcG9ydCBUcmFuc2FjdGlvbkhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvVHJhbnNhY3Rpb25IZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgQmluZENvbnRleHRQYXJhbWV0ZXJzLCBSb290Q29udGV4dEluZm8sIFNpYmxpbmdJbmZvcm1hdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IFVpTW9kZWxDb25zdGFudHMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2VkaXRGbG93Q29uc3RhbnRzXCI7XG5pbXBvcnQgc3RpY2t5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9zdGlja3lcIjtcbmltcG9ydCB0eXBlIHsgSGlkZGVuRHJhZnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgRHJhZnRTaWJsaW5nUGFpciB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IFNlbWFudGljS2V5SGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NlbWFudGljS2V5SGVscGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBGY2xDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9yb290Vmlldy9GY2wuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgUm9vdFZpZXdCYXNlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvUm9vdFZpZXdCYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMsIFNlbWFudGljTWFwcGluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9Sb3V0aW5nU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIE1hY3JvVGFibGUgZnJvbSBcInNhcC9mZS9tYWNyb3MvVGFibGVcIjtcbmltcG9ydCB0eXBlIFRhYmxlQVBJIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1RhYmxlQVBJXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvIH0gZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIEJhc2VPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL09iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL011bHRpVmFsdWVGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIENyZWF0aW9uUm93IGZyb20gXCJzYXAvdWkvbWRjL3RhYmxlL0NyZWF0aW9uUm93XCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IHR5cGUgTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IFNvcnRlciBmcm9tIFwic2FwL3VpL21vZGVsL1NvcnRlclwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBDb250ZXh0LCBkZWZhdWx0IGFzIE9EYXRhVjRDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IE9EYXRhQ29udGV4dEJpbmRpbmckUGF0Y2hTZW50RXZlbnQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxFbnRpdHlUeXBlIH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcIi4uL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCB7IENvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZywgUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB9IGZyb20gXCIuLi9jb250cm9scy9SZWNvbW1lbmRhdGlvbnMvQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nXCI7XG5pbXBvcnQgeyBDcmVhdGlvbk1vZGUsIHR5cGUgQmFzZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBpc0Z1bGZpbGxlZCwgaXNSZWplY3RlZCB9IGZyb20gXCIuLi9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCBkcmFmdERhdGFMb3NzUG9wdXAgZnJvbSBcIi4vZWRpdEZsb3cvZHJhZnREYXRhTG9zc1BvcHVwXCI7XG5pbXBvcnQgdHlwZSB7IE9wZXJhdGlvblJlc3VsdCB9IGZyb20gXCIuL2VkaXRGbG93L29wZXJhdGlvbnMvT0RhdGFPcGVyYXRpb25cIjtcbmltcG9ydCBOYXZpZ2F0aW9uUmVhc29uIGZyb20gXCIuL3JvdXRpbmcvTmF2aWdhdGlvblJlYXNvblwiO1xuY29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsLFxuXHRDb25zdGFudHMgPSBGRUxpYnJhcnkuQ29uc3RhbnRzLFxuXHREcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cyxcblx0RWRpdE1vZGUgPSBGRUxpYnJhcnkuRWRpdE1vZGUsXG5cdFN0YXJ0dXBNb2RlID0gRkVMaWJyYXJ5LlN0YXJ0dXBNb2RlO1xuXG50eXBlIFNhdmVEb2N1bWVudFBhcmFtZXRlcnMgPSB7XG5cdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yPzogYm9vbGVhbjtcblx0bWVyZ2VQYXRjaERyYWZ0PzogYm9vbGVhbjtcblx0c2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuO1xuXHRiaW5kaW5ncz86IE9EYXRhTGlzdEJpbmRpbmdbXTtcblx0aXNTdGFuZGFyZFNhdmU/OiBib29sZWFuO1xufTtcblxudHlwZSBJbnRlcm5hbENyZWF0ZVBhcmFtZXRlcnMgPSB7XG5cdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdGJGcm9tRGVmZXJyZWQ/OiBib29sZWFuO1xuXHRidXN5TW9kZT86IHN0cmluZztcblx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0Y3JlYXRpb25Sb3c/OiBDcmVhdGlvblJvdztcblx0ZGF0YT86IG9iamVjdDtcblx0dGFibGVJZD86IHN0cmluZztcblx0b3V0Ym91bmQ/OiBzdHJpbmc7XG5cdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRzZWxlY3RlZENvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0Y3JlYXRpb25EaWFsb2dGaWVsZHM/OiBzdHJpbmdbXTtcblx0cmVxdWVzdEF0TGVhc3Q/OiBzdHJpbmdbXTtcbn07XG5cbi8qKlxuICogQSBjb250cm9sbGVyIGV4dGVuc2lvbiBvZmZlcmluZyBob29rcyBpbnRvIHRoZSBlZGl0IGZsb3cgb2YgdGhlIGFwcGxpY2F0aW9uXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIEJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIHN5bmNUYXNrczogUHJvbWlzZTx1bmtub3duPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdHByaXZhdGUgYWN0aW9uUHJvbWlzZT86IFByb21pc2U8eyBjb250cm9sSWQ/OiBzdHJpbmc7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfT47XG5cblx0cHJpdmF0ZSBjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nPzogQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nO1xuXG5cdHByaXZhdGUgX2hpZGRlbkRyYWZ0OiBIaWRkZW5EcmFmdCB8IHVuZGVmaW5lZDtcblxuXHRwcml2YXRlIGZldGNoQ29sbGFib3JhdGl2ZURyYWZ0VXNlcnNQcm9taXNlOiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uSW5pdCgpOiB2b2lkIHtcblx0XHR0aGlzLl9oaWRkZW5EcmFmdCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKS5IaWRkZW5EcmFmdCBhcyBIaWRkZW5EcmFmdDtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFB1YmxpYyBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0Z2V0SW50ZXJmYWNlKCk6IEJhc2VPYmplY3Qge1xuXHRcdHJldHVybiBzdXBlci5nZXRJbnRlcmZhY2UoKTtcblx0fVxuXG5cdGdldEFwcENvbXBvbmVudCgpOiBBcHBDb21wb25lbnQge1xuXHRcdHJldHVybiB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGRyYWZ0IGRvY3VtZW50IGZvciB0aGUgZXhpc3RpbmcgYWN0aXZlIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBlZGl0YWJsZSBkb2N1bWVudCBpcyBhdmFpbGFibGUgd2l0aCB0aGUgZWRpdGFibGUgY29udGV4dFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBlZGl0RG9jdW1lbnQoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB2b2lkPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgcm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0Y29uc3QgbW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3Qgdmlld0RhdGEgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIEJhc2VNYW5pZmVzdFNldHRpbmdzO1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cdFx0Y29uc3QgZ3JvdXBJZCA9IFwiZWRpdEdyb3VwXCI7XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgcm9vdENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFJvb3RDb250ZXh0KGNvbnRleHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRWRpdCh7IGNvbnRleHQ6IHJvb3RDb250ZXh0IH0pO1xuXG5cdFx0XHRsZXQgcmlnaHRtb3N0Q29udGV4dCA9IHRoaXMuX2lzRmNsRW5hYmxlZCgpID8gKHJvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBjb250ZXh0O1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRyaWdodG1vc3RDb250ZXh0ID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0KHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHJpZ2h0bW9zdENvbnRleHQpICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIHdlIGNoZWNrIHRoZSByaWdodG1vc3RDb250ZXh0IGNhbiBiZSB1c2VkIGluIGRyYWZ0XG5cdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQgPSBjb250ZXh0O1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgdHJhbnNhY3Rpb25EZXRhaWxzOiBFZGl0VHJhbnNhY3Rpb25FeGVjdXRpb25EZXRhaWxzID0ge307XG5cdFx0XHRjb25zdCBuZXdEb2N1bWVudENvbnRleHRQcm9taXNlID0gdHJhbnNhY3Rpb25IZWxwZXIuZWRpdERvY3VtZW50KFxuXHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0dGhpcy5iYXNlLmdldFZpZXcoKSxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRncm91cElkLFxuXHRcdFx0XHR0cmFuc2FjdGlvbkRldGFpbHNcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByb290Q29udGV4dEluZm8gPSB7XG5cdFx0XHRcdHJvb3RTaWJsaW5nUGF0aFByb21pc2U6IG5ld0RvY3VtZW50Q29udGV4dFByb21pc2Vcblx0XHRcdH07XG5cdFx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWwsIG1vZGVsKTtcblxuXHRcdFx0bGV0IHNpYmxpbmdJbmZvUHJvbWlzZTtcblx0XHRcdC8vIHJpZ2h0bW9zdENvbnRleHQgPT09IHJvb3RDb250ZXh0ID0+IHdlJ3JlIGluIE9QLiBJZiBub3QsIHdlJ3JlIGluIG11bHRpLWNvbHVtbiBsYXlvdXQgb2YgRkNMXG5cdFx0XHRjb25zdCBjb21wdXRlU2libGluZ0luZm8gPSByaWdodG1vc3RDb250ZXh0ICE9PSByb290Q29udGV4dCB8fCAodmlld0RhdGE/LnZpZXdMZXZlbCBhcyBudW1iZXIpID4gMTtcblx0XHRcdGlmIChjb21wdXRlU2libGluZ0luZm8pIHtcblx0XHRcdFx0c2libGluZ0luZm9Qcm9taXNlID0gdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0XHRyaWdodG1vc3RDb250ZXh0LFxuXHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRyb290Q29udGV4dEluZm8sXG5cdFx0XHRcdFx0Z3JvdXBJZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0Y29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKGdyb3VwSWQpO1xuXG5cdFx0XHRsZXQgc2libGluZ0luZm8gPSBhd2FpdCBzaWJsaW5nSW5mb1Byb21pc2U7XG5cdFx0XHRjb25zdCBuZXdEb2N1bWVudENvbnRleHQgPSAoYXdhaXQgbmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZSkgYXMgQ29udGV4dDtcblx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IHVuZGVmaW5lZCA9IG5ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdGlmIChjb21wdXRlU2libGluZ0luZm8gJiYgY29udGV4dFRvTmF2aWdhdGUpIHtcblx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQsXG5cdFx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRcdHJvb3RDb250ZXh0SW5mbyxcblx0XHRcdFx0XHRcdFwiJGF1dG9cIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSB0aGlzLl9nZXROYXZpZ2F0aW9uVGFyZ2V0Rm9yRWRpdChjb250ZXh0LCBuZXdEb2N1bWVudENvbnRleHQsIHNpYmxpbmdJbmZvKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KFtdKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IG92ZXJyaWRlTWVzc2FnZVVJRGVjaXNpb24gPSBmYWxzZTtcblx0XHRcdGlmIChuZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5ICYmXG5cdFx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobW9kZWwuZ2V0TWV0YU1vZGVsKCkpICYmXG5cdFx0XHRcdFx0dHJhbnNhY3Rpb25EZXRhaWxzLmV4aXN0aW5nRHJhZnRSZXVzZWQgIT09IHRydWVcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gVGhlIGluaXRpYWwgc2hhcmUgYWN0aW9uIHNoYWxsIGJlIGNhbGxlZCAgKGV4Y2VwdCBpZiB0aGUgZHJhZnQgYWxyZWFkeSBleGlzdGVkKVxuXHRcdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuc2V0SW5pdGlhbFNoYXJlKHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRWRpdCh7IGNvbnRleHQ6IGNvbnRleHRUb05hdmlnYXRlIH0pO1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlIGFzIENvbnRleHQsIHtcblx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRyZWNyZWF0ZUNvbnRleHQ6IGZhbHNlLFxuXHRcdFx0XHRcdGZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdC8vIFRoZSBzdGlja3lPbiBoYW5kbGVyIG11c3QgYmUgc2V0IGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIGRvbmUsXG5cdFx0XHRcdFx0Ly8gYXMgdGhlIFVSTCBtYXkgY2hhbmdlIGluIHRoZSBjYXNlIG9mIEZDTFxuXHRcdFx0XHRcdGxldCBzdGlja3lDb250ZXh0OiBDb250ZXh0O1xuXHRcdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byB1c2UgdGhlIGtlcHQtYWxpdmUgY29udGV4dCB1c2VkIHRvIGJpbmQgdGhlIHBhZ2Vcblx0XHRcdFx0XHRcdHN0aWNreUNvbnRleHQgPSBuZXdEb2N1bWVudENvbnRleHQ/LmdldE1vZGVsKCkuZ2V0S2VlcEFsaXZlQ29udGV4dChuZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c3RpY2t5Q29udGV4dCA9IG5ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5oYW5kbGVTdGlja3lPbihzdGlja3lDb250ZXh0KTtcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLl9oaWRkZW5EcmFmdCkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuaGFuZGxlSGlkZGVuRHJhZnRFZGl0KG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b3ZlcnJpZGVNZXNzYWdlVUlEZWNpc2lvbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gV2UgY2hhbmdlIHRoZSBlZGl0IG1vZGUgYWZ0ZXIgdGhlIHBhZ2UgYmluZGluZyBoYXMgYmVlbiBkb25lLCBvdGhlcndpc2UgdGhlIGNyZWF0aW9uIG9mIGVtcHR5IHJvd3MgbWlnaHQgZmFpbCAoYXMgdGhlIHRhYmxlIGlzIHN0aWxsIG9uIHRoZSBhY3RpdmUgdmVyc2lvbilcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgZmFsc2UpO1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXksIG92ZXJyaWRlVUlEZWNpc2lvbjogb3ZlcnJpZGVNZXNzYWdlVUlEZWNpc2lvbiB9KTtcblx0XHRcdHJldHVybiBjb250ZXh0VG9OYXZpZ2F0ZTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBlZGl0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIHNpZGUgZWZmZWN0cyByZXF1aXJlZCBhZnRlciBkZWxldGluZyBhbiBvYmplY3QuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIHRoZSBkZWxldGVkIG9iamVjdCBiZWxvbmdzIHRvXG5cdCAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBwYXJlbnQgb2JqZWN0IG9mIHRoZSBkZWxldGVkIG9iamVjdFxuXHQgKiBAcGFyYW0gaWdub3JlVHJhbnNpZW50Q29udGV4dHMgSWYgdHJ1ZSwgdHJhbnNpZW50IGNvbnRleHRzIGFyZSBpZ25vcmVkXG5cdCAqL1xuXHRwcml2YXRlIHJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmVudENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQsXG5cdFx0aWdub3JlVHJhbnNpZW50Q29udGV4dHMgPSBmYWxzZVxuXHQpOiB2b2lkIHtcblx0XHRpZiAocGFyZW50Q29udGV4dCAmJiB0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZywgcGFyZW50Q29udGV4dCwgaWdub3JlVHJhbnNpZW50Q29udGV4dHMpKSB7XG5cdFx0XHRjb25zdCBzdGF0ZU1lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChsaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLCBwYXJlbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHQvLyBJbiBjYXNlIG9mIGEgVHJlZVRhYmxlLCB3ZSBuZWVkIHRvIHJlZnJlc2ggc3RhdGUgbWVzc2FnZXMgZm9yIHRoZSBPYmplY3RQYWdlLCBhcyBzb21lIG9mIHRoZXNlIG1lc3NhZ2VzIG1pZ2h0IGJlIGF0dGFjaGVkXG5cdFx0XHQvLyB0byBjaGlsZHJlbiBvZiBhIGRlbGV0ZWQgcm93IHdoaWNoIG1heSBub3QgaGF2ZSBiZWVuIGxvYWRlZCB5ZXQsIGFuZCB0aGVyZWZvcmUgdGhlIG1vZGVsIHdvdWxkbid0IGNsZWFuIHVwIHRoZXNlIG1lc3NhZ2VzXG5cdFx0XHRpZiAoc3RhdGVNZXNzYWdlc1BhdGggJiYgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzKFtzdGF0ZU1lc3NhZ2VzUGF0aF0sIHBhcmVudENvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgc2lkZSBlZmZlY3RzIHJlcXVpcmVkIHdoZW4gc3RydWN0dXJhbCBjaGFuZ2UgKGNyZWF0ZS9kZWxldGUpIGlzIGRvbmUgaW50byBhIHRhYmxlLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZyB0aGUgZGVsZXRlZCBvYmplY3QgYmVsb25ncyB0b1xuXHQgKiBAcGFyYW0gcGFyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgcGFyZW50IG9iamVjdCBvZiB0aGUgZGVsZXRlZCBvYmplY3Rcblx0ICogQHBhcmFtIGlnbm9yZVRyYW5zaWVudENvbnRleHRzIElmIHRydWUsIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgaWdub3JlZFxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHNpZGUgZWZmZWN0cyB3ZXJlIHJlcXVlc3RlZCwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0aWdub3JlVHJhbnNpZW50Q29udGV4dHMgPSBmYWxzZVxuXHQpOiBib29sZWFuIHtcblx0XHRpZiAocGFyZW50Q29udGV4dCkge1xuXHRcdFx0Y29uc3QgbGlzdEJpbmRpbmdSZWxhdGl2ZVBhdGhUb1BhZ2UgPSBNb2RlbEhlbHBlci5nZXRSZWxhdGl2ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmcocGFyZW50Q29udGV4dCwgbGlzdEJpbmRpbmcpO1xuXHRcdFx0Y29uc3QgbGlzdEJpbmRpbmdSZWxhdGl2ZVBhdGggPSBNb2RlbEhlbHBlci5nZXRSZWxhdGl2ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmcobGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLCBsaXN0QmluZGluZyk7XG5cdFx0XHRpZiAoaWdub3JlVHJhbnNpZW50Q29udGV4dHMgfHwgIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMgKGFuZCB3ZSBkb24ndCBpZ25vcmUgdGhpcyBjaGVjayksIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHRpZiAobGlzdEJpbmRpbmdSZWxhdGl2ZVBhdGgpIHtcblx0XHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmdSZWxhdGl2ZVBhdGgsIGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gaWYgd2UgYXJlIHRyaWdnZXJpbmcgc2lkZSBlZmZlY3RzIGZvciBhIG11bHRpdmFsdWVmaWVsZCB3aXRoaW4gYSB0YWJsZSwgbGlzdEJpbmRpbmdSZWxhdGl2ZVBhdGhUb1BhZ2UgaXMgZGlmZmVyZW50IHRvIGxpc3RCaW5kaW5nUmVsYXRpdmVQYXRoXG5cdFx0XHRcdC8vIHNvIHdlIGFsc28gZW5zdXJlIHBhZ2Ugc2lkZSBlZmZlY3RzIGFyZSB0cmlnZ2VyZWQgaWYgbmVlZCBiZVxuXHRcdFx0XHRpZiAobGlzdEJpbmRpbmdSZWxhdGl2ZVBhdGhUb1BhZ2UgJiYgbGlzdEJpbmRpbmdSZWxhdGl2ZVBhdGhUb1BhZ2UgIT09IGxpc3RCaW5kaW5nUmVsYXRpdmVQYXRoKSB7XG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nUmVsYXRpdmVQYXRoVG9QYWdlLCBwYXJlbnRDb250ZXh0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlcyBzZXZlcmFsIGRvY3VtZW50cy5cblx0ICogQHBhcmFtIGNvbnRleHRzVG9EZWxldGUgVGhlIGNvbnRleHRzIG9mIHRoZSBkb2N1bWVudHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFja1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY29udHJvbElkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm5vRGlhbG9nXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnRzIGFyZSBkZWxldGVkXG5cdCAqL1xuXHRhc3luYyBkZWxldGVNdWx0aXBsZURvY3VtZW50cyhcblx0XHRjb250ZXh0c1RvRGVsZXRlOiBDb250ZXh0W10sXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRjb250cm9sSWQ6IHN0cmluZztcblx0XHRcdG5vRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHBhcmVudENvbnRyb2w/OiBDb250cm9sO1xuXHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0cz86IGJvb2xlYW47XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHRwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyA9IHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzICE9PSBmYWxzZTtcblx0XHRsZXQgdGFibGVBUEk6IFRhYmxlQVBJIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBpc0lubGluZUNyZWF0aW9uUm93cyA9IGZhbHNlO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCBwYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCkgPz8gRWxlbWVudC5nZXRFbGVtZW50QnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0bGV0IGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZTogQ29udGV4dFtdID0gW107XG5cdFx0aWYgKHBhcmVudENvbnRyb2w/LmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0YWJsZUFQSSA9IHBhcmVudENvbnRyb2wuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0XHRpc0lubGluZUNyZWF0aW9uUm93cyA9IHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbj8uY29udHJvbD8uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzO1xuXHRcdFx0aW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlID0gY29udGV4dHNUb0RlbGV0ZS5maWx0ZXIoKGNvbnRleHQpID0+IGNvbnRleHQuaXNJbmFjdGl2ZSgpKTtcblx0XHR9XG5cdFx0aWYgKCFwYXJlbnRDb250cm9sKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXIgY29udHJvbElkIG1pc3Npbmcgb3IgaW5jb3JyZWN0XCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSBwYXJlbnRDb250cm9sIGFzIENvbnRyb2w7XG5cdFx0fVxuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gKHBhcmVudENvbnRyb2wuZ2V0QmluZGluZyhcIml0ZW1zXCIpIHx8IChwYXJlbnRDb250cm9sIGFzIFRhYmxlKS5nZXRSb3dCaW5kaW5nKCkpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0cGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gdHJ1ZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChwYXJhbWV0ZXJzPy5zZWxlY3RlZENvbnRleHRzPy5bMF0gPz8gY29udGV4dHNUb0RlbGV0ZVswXSkgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihjb250ZXh0c1RvRGVsZXRlLCBwYXJhbWV0ZXJzKTtcblxuXHRcdFx0bGV0IHJlc3VsdDtcblxuXHRcdFx0Ly8gTXVsdGlwbGUgb2JqZWN0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGEgbGlzdFxuXHRcdFx0Ly8gRmlyc3QgY2xlYXIgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGFibGUgYXMgaXQncyBub3QgdmFsaWQgYW55IG1vcmVcblx0XHRcdGlmIChwYXJlbnRDb250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdHBhcmVudENvbnRyb2wuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhlbiByZWZyZXNoIHRoZSBsaXN0LWJpbmRpbmcgKExSKSwgb3IgcmVxdWlyZSBzaWRlLWVmZmVjdHMgKE9QKVxuXHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0aWYgKGxpc3RCaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdC8vIGtlZXAgcHJvbWlzZSBjaGFpbiBwZW5kaW5nIHVudGlsIHJlZnJlc2ggb2YgbGlzdGJpbmRpbmcgaXMgY29tcGxldGVkXG5cdFx0XHRcdHJlc3VsdCA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5yZWZyZXNoTGlzdEJpbmRpbmcobGlzdEJpbmRpbmcsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGxpc3RCaW5kaW5nLCB2aWV3QmluZGluZ0NvbnRleHQsIGlzSW5saW5lQ3JlYXRpb25Sb3dzKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZGVsZXRpbmcgYXQgbGVhc3Qgb25lIG9iamVjdCBzaG91bGQgYWxzbyBzZXQgdGhlIFVJIHRvIGRpcnR5XG5cdFx0XHRpZiAoIXRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQgPSB0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlzUmVjb21tZW5kYXRpb25FbmFibGVkKCk7XG5cdFx0XHQvLyBXZSBjbGVhciByZWNvbW1lbmRhdGlvbiBkYXRhIGFuZCBjb250ZXh0cyBmcm9tIGludGVybmFsIG1vZGVsIGZvciB0aGUgZGVsZXRlZCBjb250ZXh0c1xuXHRcdFx0aWYgKGlzUmVjb21tZW5kYXRpb25FbmFibGVkKSB7XG5cdFx0XHRcdHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaWdub3JlUmVjb21tZW5kYXRpb25Gb3JDb250ZXh0cyhjb250ZXh0c1RvRGVsZXRlKTtcblx0XHRcdH1cblx0XHRcdC8vIE5vdGlmeSBjb25zdW1lcnMgb2Ygd2hpY2ggY29udGV4dHMgd2VyZSBkZWxldGVkXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckRlbGV0ZSh7IGNvbnRleHRzOiBjb250ZXh0c1RvRGVsZXRlIH0pO1xuXG5cdFx0XHRpZiAodGFibGVBUEkpIHtcblx0XHRcdFx0aWYgKGlzSW5saW5lQ3JlYXRpb25Sb3dzICYmIGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0dGFibGVBUEkucmVtb3ZlRW1wdHlSb3dzTWVzc2FnZXMoaW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlKTtcblx0XHRcdFx0XHRhd2FpdCB0YWJsZUFQSS5zZXRVcEVtcHR5Um93cyh0YWJsZUFQSS5nZXRDb250ZW50KCksIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBjb250ZXh0c1RvRGVsZXRlKTtcblxuXHRcdFx0cmV0dXJuIGF3YWl0IHJlc3VsdDtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly8gV2Ugc3RpbGwgd2FudCB0byByZWZyZXNoIHRoZSBsaXN0YmluZGluZyBpbiBjYXNlIHdlIGRlbGV0ZWQgc29tZSBpbmZvcm1hdGlvbiBidXQgbm90IGV2ZXJ5dGhpbmcgKERyYWZ0cyBmb3IgZXhhbXBsZSlcblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1Jvb3QoKSkge1xuXHRcdFx0XHQvLyBrZWVwIHByb21pc2UgY2hhaW4gcGVuZGluZyB1bnRpbCByZWZyZXNoIG9mIGxpc3RiaW5kaW5nIGlzIGNvbXBsZXRlZFxuXHRcdFx0XHRhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkucmVmcmVzaExpc3RCaW5kaW5nKGxpc3RCaW5kaW5nLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdH0gZWxzZSBpZiAocGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGxpc3RCaW5kaW5nLCB2aWV3QmluZGluZ0NvbnRleHQsIGlzSW5saW5lQ3JlYXRpb25Sb3dzKTtcblx0XHRcdH1cblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudChzKVwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgZHJhZnQgc3RhdHVzIGFuZCBkaXNwbGF5cyB0aGUgZXJyb3IgbWVzc2FnZXMgaWYgdGhlcmUgYXJlIGVycm9ycyBkdXJpbmcgYW4gdXBkYXRlLlxuXHQgKiBAcGFyYW0gdXBkYXRlZENvbnRleHQgQ29udGV4dCBvZiB0aGUgdXBkYXRlZCBmaWVsZFxuXHQgKiBAcGFyYW0gdXBkYXRlUHJvbWlzZSBQcm9taXNlIHRvIGRldGVybWluZSB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4gVGhlIHByb21pc2Ugc2hvdWxkIGJlIHJlc29sdmVkIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBzbyB0aGUgZHJhZnQgc3RhdHVzIGNhbiBiZSB1cGRhdGVkLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZHJhZnQgc3RhdHVzIGhhcyBiZWVuIHVwZGF0ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgdXBkYXRlRG9jdW1lbnQodXBkYXRlZENvbnRleHQ6IEJpbmRpbmcgfCBDb250ZXh0LCB1cGRhdGVQcm9taXNlOiBQcm9taXNlPHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgaXNEcmFmdCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbCh1cGRhdGVkQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzayhhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAob3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc0RyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHVwZGF0ZVByb21pc2U7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoIWlzRHJhZnQgfHwgIWN1cnJlbnRCaW5kaW5nQ29udGV4dCB8fCBjdXJyZW50QmluZGluZ0NvbnRleHQgIT09IG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBJZiBhIG5hdmlnYXRpb24gaGFwcGVuZWQgd2hpbGUgb1Byb21pc2Ugd2FzIGJlaW5nIHJlc29sdmVkLCB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGNoYW5nZWRcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSdyZSBzdGlsbCBvbiB0aGUgc2FtZSBjb250ZXh0XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXROYW1lID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdFx0XHRjb25zdCBzZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMobWV0YU1vZGVsLCBlbnRpdHlTZXROYW1lKTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHNlbWFudGljS2V5cz8ubGVuZ3RoICYmXG5cdFx0XHRcdFx0Y3VycmVudEJpbmRpbmdDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlICYmIC8vIFdlIGRvbid0IHVzZSB0aGUgc2VtYW50aWMga2V5IGZvciBhIG5ldyBkb2N1bWVudCAoY3JlYXRpb24pXG5cdFx0XHRcdFx0Y3VycmVudEJpbmRpbmdDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpID09PSB0cnVlXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VtYW50aWNQYXRoID0gY3VycmVudFNlbWFudGljTWFwcGluZz8uc2VtYW50aWNQYXRoLFxuXHRcdFx0XHRcdFx0c0NoYW5nZWRQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKGN1cnJlbnRCaW5kaW5nQ29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0Ly8gY3VycmVudFNlbWFudGljUGF0aCBjb3VsZCBiZSBudWxsIGlmIHdlIGhhdmUgbmF2aWdhdGVkIHZpYSBkZWVwIGxpbmsgdGhlbiB0aGVyZSBhcmUgbm8gc2VtYW50aWNNYXBwaW5ncyB0byBjYWxjdWxhdGUgaXQgZnJvbVxuXHRcdFx0XHRcdGlmIChjdXJyZW50U2VtYW50aWNQYXRoICYmIGN1cnJlbnRTZW1hbnRpY1BhdGggIT09IHNDaGFuZ2VkUGF0aCkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjdXJyZW50QmluZGluZ0NvbnRleHQsIHsgZWRpdGFibGU6IHRydWUsIHJlY3JlYXRlQ29udGV4dDogZmFsc2UgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB1cGRhdGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0aWYgKGlzRHJhZnQgJiYgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGdldFBhcmVudENvbnRleHRGcm9tU2VsZWN0aW9uKHNlbGVjdGVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gfCB1bmRlZmluZWQpOiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHNlbGVjdGVkQ29udGV4dHMgJiYgc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHQvLyBPbmUgcGFyZW50IGF0IG1vc3QgISFcblx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBhIG5ldyBkb2N1bWVudCBpbiBhIFRyZWVUYWJsZSB3aXRoICR7c2VsZWN0ZWRDb250ZXh0cy5sZW5ndGh9IHBhcmVudHNgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc2VsZWN0ZWRDb250ZXh0cz8ubGVuZ3RoID09PSAxID8gc2VsZWN0ZWRDb250ZXh0c1swXSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyAqIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdC8vICogICAgICAgICAgICAgICAgICAgIFN5bmMgLSB0aGUgY3JlYXRpb24gaXMgdHJpZ2dlcmVkIGFuZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkLCB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdC8vICogICAgICAgICAgICAgICAgICAgIEFzeW5jIC0gdGhlIGNyZWF0aW9uIGFuZCB0aGUgbmF2aWdhdGlvbiB0byB0aGUgaW5zdGFuY2UgYXJlIGRvbmUgaW4gcGFyYWxsZWxcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWQgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBvbiB0aGUgdGFyZ2V0IHBhZ2Vcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25Sb3cgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgYXN5bmMgc28gdGhlIHVzZXIgaXMgbm90IGJsb2NrZWRcblx0Ly8gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgSW5zdGFuY2Ugb2YgdGhlIGNyZWF0aW9uIHJvdyAtIChUT0RPOiBnZXQgcmlkIGJ1dCB1c2UgbGlzdCBiaW5kaW5ncyBvbmx5KVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gc291cmNlICBPRGF0YUxpc3RCaW5kaW5nIG9iamVjdCBvciB0aGUgYmluZGluZyBwYXRoIG9yIGEgdGFibGUgYnVpbGRpbmcgYmxvY2sgZm9yIGEgdGVtcG9yYXJ5IGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzo8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgTmV3UGFnZSAtIHRoZSBjcmVhdGVkIGRvY3VtZW50IGlzIHNob3duIGluIGEgbmV3IHBhZ2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIG1ldGFkYXRhICdTeW5jJywgJ0FzeW5jJywgb3IgJ0RlZmVycmVkJyBpcyB1c2VkPGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIElubGluZSAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIHdpdGhpbiB0aGUgdGFibGUuIE5vdCBzdXBwb3J0ZWQgb24gYSBMaXN0IFJlcG9ydDxici8+XG5cdCAqICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGluIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyICdvdXRib3VuZCc8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25EaWFsb2cgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBpbiB0aGUgdGFibGUsIHdpdGggYSBkaWFsb2cgYWxsb3dpbmcgdG8gc3BlY2lmeSBzb21lIGluaXRpYWwgcHJvcGVydHkgdmFsdWVzICh0aGUgcHJvcGVydGllcyBhcmUgbGlzdGVkIGluIGBjcmVhdGlvbkRpYWxvZ0ZpZWxkc2ApXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRhYmxlSWQgSUQgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm91dGJvdW5kIFRoZSBuYXZpZ2F0aW9uIHRhcmdldCB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnRXh0ZXJuYWwnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFNwZWNpZmllcyBpZiB0aGUgbmV3IGVudHJ5IHNob3VsZCBiZSBjcmVhdGVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIGEgdGFibGUgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0lubGluZSdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZGF0YSBUaGUgaW5pdGlhbCBkYXRhIGZvciB0aGUgY3JlYXRlZCBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5idXN5TW9kZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uUm93IFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMgVGhlIGNvbnRleHRzIHRoYXQgYXJlIHNlbGVjdGVkIGluIHRoZSB0YWJsZSBpbml0aWF0aW5nIHRoZSBjcmVhdGlvbi4gVXNlZCBpbiBjYXNlIG9mIGEgVHJlZVRhYmxlIHRvIGRldGVybWluZSB0aGUgcGFyZW50IGNvbnRleHQgb2YgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGUgV2hlbiBlbmFibGVkLCBhbiBleHRyYSByZXF1ZXN0IGNoZWNrcyBpZiBhbnkgZHJhZnRzIGV4aXN0IHRoYXQgd2VyZSBuZXZlciBzYXZlZC4gSWYgdW5zYXZlZCBkcmFmdHMgYXJlIGZvdW5kLCB0aGUgbmV3ZXN0IG9uZSBpcyBvcGVuZWQuIElmIG5vIHVuc2F2ZWQgZHJhZnRzIGFyZSBmb3VuZCwgYSBuZXcgZW50aXR5IGlzIGNyZWF0ZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMgRGVmaW5lcyB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIGRpc3BsYXllZCBpbiB0aGUgY3JlYXRpb24gZGlhbG9nIHdoZW4gdGhlIGNyZWF0aW9uIG1vZGUgaXMgc2V0IHRvICdDcmVhdGlvbkRpYWxvZycuPGJyLz5UaGUgdmFsdWUgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lc1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5yZXF1ZXN0QXRMZWFzdCBQUklWQVRFIC0gRGVmaW5lcyB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIHJlcXVlc3RlZCB3aGVuIGNyZWF0aW5nIHRoZSBuZXcgZG9jdW1lbnQgdG8gYXZvaWQgYWRkaXRpb25hbCByZXF1ZXN0cyBsYXRlciBvbi48YnIvPlRoZSB2YWx1ZSBpcyBhbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNyZWF0ZURvY3VtZW50KFxuXHRcdHNvdXJjZTogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZyB8IE1hY3JvVGFibGUsXG5cdFx0bUluUGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdGJGcm9tRGVmZXJyZWQ/OiBib29sZWFuO1xuXHRcdFx0YnVzeU1vZGU/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRcdFx0ZGF0YT86IG9iamVjdDtcblx0XHRcdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdFx0XHRvdXRib3VuZD86IHN0cmluZztcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0c2luZ2xlRHJhZnRGb3JDcmVhdGU/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM/OiBzdHJpbmdbXTtcblx0XHRcdHJlcXVlc3RBdExlYXN0Pzogc3RyaW5nW107XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgb0RhdGFMaXN0QmluZGluZyE6IE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0bGV0IHBhcmVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3QgZGF0YU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRsZXQgc2VsZWN0ZWRQcm9wZXJ0aWVzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKGRhdGFNb2RlbCAmJiBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChkYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRzZWxlY3RlZFByb3BlcnRpZXMgPSBcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0RyYWZ0QWRtaW5pc3RyYXRpdmVVc2VyLElzQWN0aXZlRW50aXR5LEhhc0FjdGl2ZUVudGl0eVwiO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiICYmIHNvdXJjZS5pc0EgJiYgc291cmNlLmlzQTxJUm93QmluZGluZ0ludGVyZmFjZT4oXCJzYXAuZmUuY29yZS5JUm93QmluZGluZ0ludGVyZmFjZVwiKSkge1xuXHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IHNvdXJjZS5nZXRSb3dCaW5kaW5nKHtcblx0XHRcdFx0JHNlbGVjdDogc2VsZWN0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHQkJGdyb3VwSWQ6IFwiJGF1dG8uV29ya2Vyc1wiXG5cdFx0XHR9KTtcblx0XHRcdHNvdXJjZSA9IG9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0fVxuXG5cdFx0aWYgKG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpIHtcblx0XHRcdGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nRnJvbVBhdGggPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpPy5iaW5kTGlzdChzb3VyY2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcblx0XHRcdFx0XHQkc2VsZWN0OiBzZWxlY3RlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLldvcmtlcnNcIlxuXHRcdFx0XHR9KSBhcyBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoIWxpc3RCaW5kaW5nRnJvbVBhdGgpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IGxpc3RCaW5kaW5nRnJvbVBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGVsZXRlIG1JblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQ7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwib2JqZWN0XCIgJiYgc291cmNlLmlzQSAmJiBzb3VyY2UuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IHNvdXJjZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgb2JqZWN0IG9yIHBhdGggZXhwZWN0ZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChvRGF0YUxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRwYXJlbnRDb250ZXh0ID0gdGhpcy5nZXRQYXJlbnRDb250ZXh0RnJvbVNlbGVjdGlvbihtSW5QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHJlc29sdmVkQ3JlYXRpb25Nb2RlID0gdGhpcy5yZXNvbHZlQ3JlYXRpb25Nb2RlKG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlLCBvRGF0YUxpc3RCaW5kaW5nLCBtSW5QYXJhbWV0ZXJzLmRhdGEpO1xuXG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpLnJlbW92ZUlBcHBTdGF0ZUtleSgpO1xuXG5cdFx0aWYgKFxuXHRcdFx0KG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGUgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGVcblx0XHRcdFx0OiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldE1hbmlmZXN0KClbXCJzYXAuZmVcIl0/LmFwcD8uc2luZ2xlRHJhZnRGb3JDcmVhdGUpICYmXG5cdFx0XHRvRGF0YUxpc3RCaW5kaW5nID09PSBvRGF0YUxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCkgJiZcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpICE9PSBudWxsXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBuZXdCaW5kaW5nID0gb0RhdGFMaXN0QmluZGluZy5nZXRNb2RlbCgpPy5iaW5kTGlzdChcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLFxuXHRcdFx0XHRuZXcgU29ydGVyKFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvTGFzdENoYW5nZURhdGVUaW1lXCIsIHRydWUpLFxuXHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRmaWx0ZXJzOiBbXG5cdFx0XHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdFx0cGF0aDogXCJJc0FjdGl2ZUVudGl0eVwiLFxuXHRcdFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTE6IGZhbHNlXG5cdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0XHRwYXRoOiBcIkhhc0FjdGl2ZUVudGl0eVwiLFxuXHRcdFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTE6IGZhbHNlXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0YW5kOiB0cnVlXG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3QmluZGluZz8ucmVxdWVzdENvbnRleHRzKDAsIDEpO1xuXHRcdFx0aWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KHJlc3VsdFswXSwgeyBlZGl0YWJsZTogdHJ1ZSwgcmVjcmVhdGVDb250ZXh0OiBmYWxzZSB9KS50aGVuKCgpID0+IG5ld0JpbmRpbmc/LmRlc3Ryb3koKSk7XG5cdFx0XHR9XG5cdFx0XHRuZXdCaW5kaW5nPy5kZXN0cm95KCk7XG5cdFx0XHRyZXR1cm4gdGhpcy5faGFuZGxlQ3JlYXRpb25Nb2RlKFxuXHRcdFx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZSxcblx0XHRcdFx0c291cmNlIGFzIHN0cmluZyB8IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0XHRcdG1JblBhcmFtZXRlcnMsXG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0XHRcdHBhcmVudENvbnRleHRcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9oYW5kbGVDcmVhdGlvbk1vZGUoXG5cdFx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZSxcblx0XHRcdHNvdXJjZSBhcyBzdHJpbmcgfCBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0bUluUGFyYW1ldGVycyxcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0XHRwYXJlbnRDb250ZXh0XG5cdFx0KTtcblx0fVxuXG5cdGFzeW5jIF9oYW5kbGVDcmVhdGlvbk1vZGUoXG5cdFx0cmVzb2x2ZWRDcmVhdGlvbk1vZGU6IHN0cmluZyxcblx0XHR2TGlzdEJpbmRpbmc6IHN0cmluZyB8IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyYW1ldGVyczogSW50ZXJuYWxDcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdG9EYXRhTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyZW50Q29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3RvcnkoW10pO1xuXHRcdHN3aXRjaCAocmVzb2x2ZWRDcmVhdGlvbk1vZGUpIHtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkV4dGVybmFsOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFeHRlcm5hbERvY3VtZW50KHZMaXN0QmluZGluZywgcGFyYW1ldGVycy5vdXRib3VuZCk7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5EZWZlcnJlZDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRGVmZXJyZWREb2N1bWVudChcblx0XHRcdFx0XHR7IHBhcmVudENvbnRleHQsIGRhdGE6IHBhcmFtZXRlcnMuZGF0YSwgcmVxdWVzdEF0TGVhc3Q6IHBhcmFtZXRlcnMucmVxdWVzdEF0TGVhc3QgfSxcblx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdzpcblx0XHRcdFx0cmV0dXJuIHBhcmFtZXRlcnMuY3JlYXRpb25Sb3dcblx0XHRcdFx0XHQ/IHRoaXMuY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQoe1xuXHRcdFx0XHRcdFx0XHRjcmVhdGlvblJvdzogcGFyYW1ldGVycy5jcmVhdGlvblJvdyxcblx0XHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RBdExlYXN0OiBwYXJhbWV0ZXJzLnJlcXVlc3RBdExlYXN0XG5cdFx0XHRcdFx0ICB9KVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuSW5saW5lOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudChcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUsXG5cdFx0XHRcdFx0XHR0YWJsZUlkOiBwYXJhbWV0ZXJzLnRhYmxlSWQsXG5cdFx0XHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhLFxuXHRcdFx0XHRcdFx0cmVxdWVzdEF0TGVhc3Q6IHBhcmFtZXRlcnMucmVxdWVzdEF0TGVhc3Rcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0KTtcblxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2c6XG5cdFx0XHRcdGlmIChvRGF0YUxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRcdC8vIENyZWF0aW9uIHdpdGggZGlhbG9nIGluIGFuIE9iamVjdFBhZ2Vcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudChcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2csXG5cdFx0XHRcdFx0XHRcdHRhYmxlSWQ6IHBhcmFtZXRlcnMudGFibGVJZCxcblx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRcdHBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSxcblx0XHRcdFx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM6IHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMsXG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RBdExlYXN0OiBwYXJhbWV0ZXJzLnJlcXVlc3RBdExlYXN0XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQ3JlYXRpb24gd2l0aCBkaWFsb2cgaW4gYSBMaXN0UmVwb3J0XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRGlhbG9nQW5kU2F2ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWJsZUlkOiBwYXJhbWV0ZXJzLnRhYmxlSWQsXG5cdFx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEsXG5cdFx0XHRcdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOiBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuU3luYzpcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkFzeW5jOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVTeW5jQXN5bmNEb2N1bWVudChcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjcmVhdGlvbk1vZGU6IHJlc29sdmVkQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0XHRcdFx0YkZyb21EZWZlcnJlZDogcGFyYW1ldGVycy5iRnJvbURlZmVycmVkLFxuXHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdGNyZWF0ZUFjdGlvbjogcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0XHRyZXF1ZXN0QXRMZWFzdDogcGFyYW1ldGVycy5yZXF1ZXN0QXRMZWFzdCxcblx0XHRcdFx0XHRcdHBhcmVudENvbnRleHRcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0KTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSAke3Jlc29sdmVkQ3JlYXRpb25Nb2RlfWApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGUgbWFuZGF0b3J5IGNvbmZpZ3VyYXRpb24gYWZ0ZXIgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWQuXG5cdCAqIEBwYXJhbSBwcmVyZXF1aXNpdGUgUHJvbWlzZSBvZiB0aGUgZG9jdW1lbnQgY3JlYXRpb24gYW5kIHRoZSBmb2xsb3dpbmcgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNvbmZpZ3VyYXRpb24gaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgcG9zdERvY3VtZW50Q3JlYXRpb24oXG5cdFx0cHJlcmVxdWlzaXRlOiBQcm9taXNlPFtQcm9taXNlU2V0dGxlZFJlc3VsdDxDb250ZXh0PiwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8dW5rbm93bj5dPixcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpO1xuXHRcdGNvbnN0IG1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCByZXN1bHRzID0gYXdhaXQgcHJlcmVxdWlzaXRlO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgY3JlYXRpb24gb3IgbmF2aWdhdGlvbiBmYWlsZWQgYW5kIHRocm93IHRoZSByZXNwZWN0aXZlIGVycm9yXG5cdFx0Y29uc3QgY3JlYXRpb24gPSByZXN1bHRzWzBdO1xuXHRcdGlmIChpc1JlamVjdGVkKGNyZWF0aW9uKSkge1xuXHRcdFx0dGhyb3cgY3JlYXRpb24ucmVhc29uO1xuXHRcdH1cblx0XHRjb25zdCBuYXZpZ2F0aW9uID0gcmVzdWx0c1sxXTtcblx0XHRpZiAoaXNSZWplY3RlZChuYXZpZ2F0aW9uKSkge1xuXHRcdFx0dGhyb3cgbmF2aWdhdGlvbi5yZWFzb247XG5cdFx0fVxuXG5cdFx0Y29uc3QgbmV3RG9jdW1lbnRDb250ZXh0ID0gY3JlYXRpb24udmFsdWU7XG5cdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsLCBtb2RlbCk7XG5cdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJDcmVhdGUoeyBjb250ZXh0OiBuZXdEb2N1bWVudENvbnRleHQgfSk7XG5cdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7IC8vIFRoZSBjcmVhdGVNb2RlIGZsYWcgd2lsbCBiZSBzZXQgaW4gY29tcHV0ZU1vZGVsc0ZvckVkaXRNb2RlXG5cdFx0aWYgKCFsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHQvLyBXb3JrYXJvdW5kIHRvIHRlbGwgdGhlIE9QIHRoYXQgd2UndmUgY3JlYXRlZCBhIG5ldyBvYmplY3QgZnJvbSB0aGUgTFJcblx0XHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChsaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldDtcblx0XHRcdFx0Y29uc3QgbmV3QWN0aW9uID0gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5OZXdBY3Rpb247XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIsIG5ld0FjdGlvbik7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHR0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykgfHxcblx0XHRcdFx0dGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdBbmFseXRpY2FsKGxpc3RCaW5kaW5nKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIENyZWF0aW5nIGEgbmV3IGl0ZW0gaW4gYSBoaWVyYXJjaHkvYW5hbHl0aWNhbCB0YWJsZSBmcm9tIHRoZSBMaXN0UmVwb3J0IChzaW5jZSB0aGUgbGlzdEJpbmRpbmcgaXMgbm90IHJlbGF0aXZlKVxuXHRcdFx0XHQvLyAtLT4gd2Ugd2FudCB0byBmb3JjZSB0aGUgdXNlciB0byBlaXRoZXIgc2F2ZSBvciBkaXNjYXJkIHRoZSBkcmFmdCBiZWZvcmUgbGVhdmluZyB0aGUgT1Bcblx0XHRcdFx0dGhpcy5mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCh0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG5ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0Ly8gSGFuZGxlIGhpZGRlbiBkcmFmdCBzZXNzaW9uIGZvciBjcmVhdGVkIGRvY3VtZW50cywgc2ltaWxhciB0byBlZGl0RG9jdW1lbnRcblx0XHRcdGlmICh0aGlzLl9oaWRkZW5EcmFmdCAmJiBwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuaGFuZGxlSGlkZGVuRHJhZnRFZGl0KG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKGxpc3RCaW5kaW5nKTtcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbC5nZXRNZXRhTW9kZWwoKSkgJiZcblx0XHRcdFx0dGhpcy5pc0RyYWZ0Um9vdChuZXdEb2N1bWVudENvbnRleHQpICYmXG5cdFx0XHRcdCF0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGUgaW5pdGlhbCBzaGFyZSBhY3Rpb24gc2hhbGwgYmUgY2FsbGVkXG5cdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuc2V0SW5pdGlhbFNoYXJlKHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IHZpYSB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmQuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93IFRoZSBjcmVhdGlvbiByb3dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnJlcXVlc3RBdExlYXN0IERlZmluZXMgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSByZXF1ZXN0ZWQgd2hlbiBjcmVhdGluZyB0aGUgbmV3IGRvY3VtZW50IHRvIGF2b2lkIGFkZGl0aW9uYWwgcmVxdWVzdHMgbGF0ZXIgb24uXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQocGFyYW1ldGVyczoge1xuXHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRjcmVhdGlvblJvdzogQ3JlYXRpb25Sb3c7XG5cdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRyZXF1ZXN0QXRMZWFzdD86IHN0cmluZ1tdO1xuXHR9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IGNyZWF0aW9uOiBQcm9taXNlPENvbnRleHQ+O1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93O1xuXHRcdGNvbnN0IHRhYmxlID0gcGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRQYXJlbnQoKSBhcyBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRsZXQgbmF2aWdhdGlvbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdGlmICghdGFibGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YWJsZS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCBsaXN0QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgXCJDcmVhdGlvblJvd1wiIHdpdGggYSBUcmVlVGFibGVgKTtcblx0XHR9XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3dDb250ZXh0ID0gY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGNvbnN0IGRvY3VtZW50VmFsaWRhdGlvbiA9IHRoaXMuZ2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24odGFibGUpO1xuXHRcdC8vIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgaXMgc2V0IHRvIGZhbHNlIGluIG1hbmlmZXN0IGNvbnZlcnRlciAoVGFibGUudHMpIGlmIGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiBleGlzdHNcblx0XHRpZiAoY3JlYXRpb25Sb3cuZGF0YShcImRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGFcIikgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHR0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmFsaWRhdGlvbk1lc3NhZ2VzID0gYXdhaXQgdGhpcy5zeW5jVGFzayhkb2N1bWVudFZhbGlkYXRpb24pO1xuXHRcdGlmICh2YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy5jcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXModmFsaWRhdGlvbk1lc3NhZ2VzLCB0YWJsZSk7XG5cdFx0XHRMb2cuZXJyb3IoXCJDdXN0b20gVmFsaWRhdGlvbiBmYWlsZWRcIik7XG5cdFx0XHQvLyBpZiBjdXN0b20gdmFsaWRhdGlvbiBmYWlscywgd2UgbGVhdmUgdGhlIG1ldGhvZCBpbW1lZGlhdGVseVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBlbnRpdHlUeXBlID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjcmVhdGlvblJvd0NvbnRleHQuZ2V0UGF0aCgpKSkudGFyZ2V0RW50aXR5VHlwZTtcblx0XHRjb25zdCBjcmVhdGlvblJvd1BheWxvYWQgPSBjcmVhdGlvblJvd0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cblx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblxuXHRcdC8vbW92ZWQgYWZ0ZXIgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyB0byBhdm9pZCBcIidjcmVhdGlvbicgdXNlIGJlZm9yZSBpbml0aWFsaXphdGlvblwiIGNvbnNvbGUgZXJyb3JzXG5cdFx0Ly9hZnRlciB2YWxpZGF0aW9uIGVycm9ycyBvY2N1cnJlZFxuXHRcdGxpc3RCaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRhd2FpdCBjcmVhdGlvbjtcblx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgocGFyYW1ldGVycy5jcmVhdGVBdEVuZCA/IHRhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRMZW5ndGgoKSA6IDApO1xuXHRcdH0pO1xuXG5cdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMobGlzdEJpbmRpbmcpO1xuXHRcdHRyeSB7XG5cdFx0XHRjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRkYXRhOiBPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdFx0e30sXG5cdFx0XHRcdFx0XHQuLi5PYmplY3Qua2V5cyhjcmVhdGlvblJvd1BheWxvYWQpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoXG5cdFx0XHRcdFx0XHRcdFx0KHByb3BlcnR5UGF0aDogc3RyaW5nKSA9PlxuXHRcdFx0XHRcdFx0XHRcdFx0ZW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcy5maW5kSW5kZXgoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lID09PSBwcm9wZXJ0eVBhdGgpID09PSAtMVxuXHRcdFx0XHRcdFx0XHQpIC8vIGVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRcdC5tYXAoKHBhdGgpID0+ICh7IFtwYXRoXTogY3JlYXRpb25Sb3dQYXlsb2FkW3BhdGhdIH0pKVxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdFx0YnVzeU1vZGU6IFwiTG9jYWxcIiwgLy8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRcdGJ1c3lJZDogKHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZCk/LmdldFRhYmxlRGVmaW5pdGlvbigpPy5hbm5vdGF0aW9uLmlkLFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogYXBwQ29tcG9uZW50LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3csXG5cdFx0XHRcdFx0cmVxdWVzdEF0TGVhc3Q6IHBhcmFtZXRlcnMucmVxdWVzdEF0TGVhc3Rcblx0XHRcdFx0fSxcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdCk7XG5cdFx0XHQvLyBTaWRlRWZmZWN0cyBvbiBDcmVhdGVcblx0XHRcdC8vIGlmIFNhdmUgaXMgcHJlc3NlZCBkaXJlY3RseSBhZnRlciBmaWxsaW5nIHRoZSBDcmVhdGlvblJvdywgbm8gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHRcdFx0aWYgKCFwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IGNyZWF0aW9uO1xuXHRcdFx0Y29uc3QgY3JlYXRpb25Sb3dMaXN0QmluZGluZyA9IGNyZWF0aW9uUm93Q29udGV4dC5nZXRCaW5kaW5nKCkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRcdGNvbnN0IG5ld1RyYW5zaWVudENvbnRleHQgPSBjcmVhdGlvblJvd0xpc3RCaW5kaW5nLmNyZWF0ZSgpO1xuXHRcdFx0Y3JlYXRpb25Sb3cuc2V0QmluZGluZ0NvbnRleHQobmV3VHJhbnNpZW50Q29udGV4dCk7XG5cblx0XHRcdC8vIHRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3JzIFRPIGJlIGNoZWNrZWQgd2l0aCBtb2RlbCBjb2xsZWFndWVzXG5cdFx0XHRuZXdUcmFuc2llbnRDb250ZXh0LmNyZWF0ZWQoKT8uY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgZmFzdCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHR9KTtcblx0XHRcdG5hdmlnYXRpb24gPSBjcmVhdGlvblJvd0NvbnRleHQuZGVsZXRlKFwiJGRpcmVjdFwiKTtcblx0XHRcdHJldHVybiBhd2FpdCB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsU2V0dGxlZChbY3JlYXRpb24sIG5hdmlnYXRpb25dKSwgbGlzdEJpbmRpbmcpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBSZXNldCBidXN5IGluZGljYXRvciBhZnRlciBhIHZhbGlkYXRpb24gZXJyb3Jcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKTtcblx0XHRcdH1cblx0XHRcdExvZy5lcnJvcihcIkNyZWF0aW9uUm93IG5hdmlnYXRpb24gZXJyb3I6IFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGluIElubGluZSBtb2RlIG9yIHdpdGggYSBjcmVhdGlvbiBpbmxpbmUgZGlhbG9nIChPYmplY3QgcGFnZSBjYXNlKS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbk1vZGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRhYmxlSWQgVGhlIGlkIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IFBhcmVudCBjb250ZXh0IChmb3IgVHJlZVRhYmxlKVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEludGlhbCBkYXRhIGZvciBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcyBGaWVsZHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBjcmVhdGlvbiBkaWFsb2dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucmVxdWVzdEF0TGVhc3QgRGVmaW5lcyB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIHJlcXVlc3RlZCB3aGVuIGNyZWF0aW5nIHRoZSBuZXcgZG9jdW1lbnQgdG8gYXZvaWQgYWRkaXRpb25hbCByZXF1ZXN0cyBsYXRlciBvbi5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUgfCBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2c7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xuXHRcdFx0cmVxdWVzdEF0TGVhc3Q/OiBzdHJpbmdbXTtcblx0XHR9LFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCB0YWJsZTogVGFibGUgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKHBhcmFtZXRlcnMudGFibGVJZCkge1xuXHRcdFx0dGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKHBhcmFtZXRlcnMudGFibGVJZCkgYXMgVGFibGU7XG5cdFx0fVxuXHRcdGlmICh0YWJsZT8uaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdHRhYmxlLmdldFJvd0JpbmRpbmcoKS5hdHRhY2hFdmVudE9uY2UoXCJjcmVhdGVDb21wbGV0ZWRcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBuZXdDb250ZXh0ID0gYXdhaXQgY3JlYXRpb247XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRJbmRleCA9IG5ld0NvbnRleHQuZ2V0SW5kZXgoKTtcblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EYXRhID0gbGlzdEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhcyB7IGNyZWF0ZUluUGxhY2U/OiBib29sZWFuIH0gfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGNvbnN0IGlzQ3JlYXRlSW5QbGFjZSA9IGFnZ3JlZ2F0aW9uRGF0YT8uY3JlYXRlSW5QbGFjZSA/PyBmYWxzZTtcblxuXHRcdFx0XHRpZiAoY29udGV4dEluZGV4ICE9PSB1bmRlZmluZWQgJiYgY29udGV4dEluZGV4ID49IDApIHtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGlmICghdGFibGU/LmdldEJ1c3koKSkge1xuXHRcdFx0XHRcdFx0XHR0YWJsZT8uZm9jdXNSb3coY29udGV4dEluZGV4LCB0cnVlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0fSBlbHNlIGlmIChpc0NyZWF0ZUluUGxhY2UpIHtcblx0XHRcdFx0XHQvLyBGb3IgY3JlYXRlIGluLXBsYWNlIG1vZGUgKHNlcnZlciBwb3NpdGlvbiksIGRpc3BsYXkgYSB3YXJuaW5nIG1lc3NhZ2UgaW4gY2FzZSB0aGUgbmV3bHkgY3JlYXRlZCBub2RlIGlzbid0IHZpc2libGVcblx0XHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyh0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCkuZ2V0VGV4dChcIkNfTkVXX0VMRU1FTlRfTk9UX0RJU1BMQVlFRFwiKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpICYmICFpc0NyZWF0ZUluUGxhY2UpIHtcblx0XHRcdFx0XHQvLyBJbiBjYXNlIG9mIGEgdHJlZSB0YWJsZSwgd2UgYWxzbyBzY3JvbGwgdG8ga2VlcCB0aGUgcGFyZW50IHZpc2libGVcblx0XHRcdFx0XHRjb25zdCBwYXJlbnRDb250ZXh0ID0gbmV3Q29udGV4dC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRjb25zdCBwYXJlbnRJbmRleCA9IHBhcmVudENvbnRleHQ/LmdldEluZGV4KCk7XG5cdFx0XHRcdFx0aWYgKHBhcmVudEluZGV4ICE9PSB1bmRlZmluZWQgJiYgcGFyZW50SW5kZXggPj0gMCkge1xuXHRcdFx0XHRcdFx0dGFibGU/LnNjcm9sbFRvSW5kZXgocGFyZW50SW5kZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRhYmxlID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIHRha2UgY2FyZSBvbiBtZXNzYWdlIGhhbmRsaW5nLCBkcmFmdCBpbmRpY2F0b3IgKGluIGNhc2Ugb2YgZHJhZnQpXG5cdFx0Ly8gQXR0YWNoIHRoZSBjcmVhdGUgc2VudCBhbmQgY3JlYXRlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKGxpc3RCaW5kaW5nKTtcblx0XHRjb25zdCBjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5jcmVhdGVEb2N1bWVudChcblx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0e1xuXHRcdFx0XHQvL0NoZWNrIGlmIEFsbCBwYXJhbWV0ZXJzIGFyZSBuZWVkZWRcblx0XHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdGJ1c3lNb2RlOiBcIkxvY2FsXCIsIC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0YnVzeUlkOiAodGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkKT8uZ2V0VGFibGVEZWZpbml0aW9uKCk/LmFubm90YXRpb24uaWQsXG5cdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRwYXJlbnRDb250ZXh0OiBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQsXG5cdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM6IHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMsXG5cdFx0XHRcdHJlcXVlc3RBdExlYXN0OiBwYXJhbWV0ZXJzLnJlcXVlc3RBdExlYXN0XG5cdFx0XHR9LFxuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblxuXHRcdGlmICghcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdHRoaXMuaGFuZGxlU2lkZUVmZmVjdHMobGlzdEJpbmRpbmcsIGNyZWF0aW9uKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMucG9zdERvY3VtZW50Q3JlYXRpb24oUHJvbWlzZS5hbGxTZXR0bGVkKFtjcmVhdGlvbiwgdGhpcy5zeW5jVGFzayhjcmVhdGlvbildKSwgbGlzdEJpbmRpbmcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgdmlhIGEgZGlhbG9nIGFuZCBzYXZlcyBpdCBpbW1lZGlhdGVseSAoTGlzdFJlcG9ydCBjYXNlKS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBUaGUgbmV3IGRvY3VtZW50IGlzIGNyZWF0ZWQgYXQgdGhlIGVuZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgVGhlIHNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMudGFibGVJZCBUaGUgaWQgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQgUGFyZW50IGNvbnRleHQgKGZvciBUcmVlVGFibGUpXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGEgSW50aWFsIGRhdGEgZm9yIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzIEZpZWxkcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGNyZWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZURpYWxvZ0FuZFNhdmVEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xuXHRcdH0sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmdcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRpZiAocGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHR0YWJsZSA9IHRoaXMuZ2V0VmlldygpLmJ5SWQocGFyYW1ldGVycy50YWJsZUlkKSBhcyBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRcdGlmICh0YWJsZT8uaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikgIT09IHRydWUpIHtcblx0XHRcdFx0dGFibGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHNhdmVkRG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblxuXHRcdGNvbnN0IGFmdGVyQ3JlYXRlSW5EaWFsb2cgPSBhc3luYyAobmV3RG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJDcmVhdGUoeyBjb250ZXh0OiBuZXdEb2N1bWVudENvbnRleHQgfSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHQvLyBFcnJvcnMgaW4gb25BZnRlckNyZWF0ZSBhcmUgbm90IGNhdXNpbmcgdGhlIG92ZXJhbGwgZmxvdyB0byBmYWlsXG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIGFmdGVyIGNyZWF0aW9uOiBcIiArIGVycm9yKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlU2F2ZSh7IGNvbnRleHQ6IG5ld0RvY3VtZW50Q29udGV4dCB9KTtcblx0XHRcdHNhdmVkRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnNhdmVEb2N1bWVudChcblx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0LFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRbXSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0cnVlXG5cdFx0XHQpO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlclNhdmUoe1xuXHRcdFx0XHRcdGNvbnRleHQ6IHNhdmVkRG9jdW1lbnRDb250ZXh0XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Ly8gRXJyb3JzIGluIG9uQWZ0ZXJTYXZlIGFyZSBub3QgY2F1c2luZyB0aGUgb3ZlcmFsbCBmbG93IHRvIGZhaWxcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgYWZ0ZXIgc2F2ZTogXCIgKyBlcnJvcik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBhIFRyZWVUYWJsZSwgd2UgZG9uJ3QgdXNlIHRoZSBsaXN0QmluZGluZyBmcm9tIHRoZSBMaXN0UmVwb3J0IHRvIGNyZWF0ZSB0aGUgbmV3IGl0ZW0sXG5cdFx0XHRcdC8vIFNvIHdlIGNhbid0IGtub3cgdGhlIHBvc2l0aW9uIG9mIHRoZSBuZXcgaXRlbSBpbiB0aGUgbGlzdEJpbmRpbmdcblx0XHRcdFx0Ly8gLS0+IFdlIHJlZnJlc2ggdGhlIHRhYmxlIGFuZCBzY3JvbGwgdG8gdGhlIHBhcmVudCBwb3NpdGlvblxuXHRcdFx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKHRhYmxlQVBJKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50SW5kZXggPSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQ/LmdldEluZGV4KCk7XG5cdFx0XHRcdFx0dGFibGVBUEkucmVmcmVzaCgpO1xuXHRcdFx0XHRcdGlmIChwYXJlbnRJbmRleCAhPT0gdW5kZWZpbmVkICYmIHBhcmVudEluZGV4ID49IDApIHtcblx0XHRcdFx0XHRcdHRhYmxlPy5zY3JvbGxUb0luZGV4KHBhcmVudEluZGV4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSBmbGF0IHRhYmxlLCB3ZSBjYW4gc2Nyb2xsIHRvIHRoZSBuZXdseSBjcmVhdGVkIGl0ZW1cblx0XHRcdFx0Y29uc3QgaXRlbUluZGV4ID0gc2F2ZWREb2N1bWVudENvbnRleHQuZ2V0SW5kZXgoKTtcblx0XHRcdFx0aWYgKGl0ZW1JbmRleCAhPT0gdW5kZWZpbmVkICYmIGl0ZW1JbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0dGFibGU/LnNjcm9sbFRvSW5kZXgoaXRlbUluZGV4KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCBjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5jcmVhdGVEb2N1bWVudChcblx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0e1xuXHRcdFx0XHQvL0NoZWNrIGlmIEFsbCBwYXJhbWV0ZXJzIGFyZSBuZWVkZWRcblx0XHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdGJ1c3lNb2RlOiBcIkxvY2FsXCIsIC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0YnVzeUlkOiAodGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkKT8uZ2V0VGFibGVEZWZpbml0aW9uKCk/LmFubm90YXRpb24uaWQsXG5cdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRhZnRlckNyZWF0ZUNhbGxCYWNrOiBhZnRlckNyZWF0ZUluRGlhbG9nLFxuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZyxcblx0XHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOiBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzXG5cdFx0XHR9LFxuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblxuXHRcdGF3YWl0IFByb21pc2UuYWxsKFtjcmVhdGlvbiwgdGhpcy5zeW5jVGFzayhjcmVhdGlvbildKTtcblx0XHRpZiAoc2F2ZWREb2N1bWVudENvbnRleHQgJiYgcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgIT09IHRydWUpIHtcblx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLCBzYXZlZERvY3VtZW50Q29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkZWZlcnJlZCBkb2N1bWVudC5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhICBEYXRhIHRvIHNhdmUgb24gdGhlIG5ldyBkb2N1bWVudFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnJlcXVlc3RBdExlYXN0IERlZmluZXMgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSByZXF1ZXN0ZWQgd2hlbiBjcmVhdGluZyB0aGUgbmV3IGRvY3VtZW50IHRvIGF2b2lkIGFkZGl0aW9uYWwgcmVxdWVzdHMgbGF0ZXIgb24uXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBoYXMgdG8gYmUgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRGVmZXJyZWREb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7IGRhdGE/OiBvYmplY3Q7IHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDsgcmVxdWVzdEF0TGVhc3Q/OiBzdHJpbmdbXSB9LFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobGlzdEJpbmRpbmcsIHtcblx0XHRcdGNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzOiB7XG5cdFx0XHRcdG1vZGU6IFwiRGVmZXJyZWRcIixcblx0XHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhLFxuXHRcdFx0XHRyZXF1ZXN0QXRMZWFzdDogcGFyYW1ldGVycy5yZXF1ZXN0QXRMZWFzdFxuXHRcdFx0fSxcblx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0Zm9yY2VGb2N1czogdHJ1ZVxuXHRcdH0pO1xuXHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBzeW5jIG9yIGFzeW5jIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgc3luYyBvciBhc3luYyBjcmVhdGlvbiBtb2RlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgVGhpcyBkb2N1bWVudCBpcyBjcmVhdGVkIGFmdGVyIGEgZGVmZmVyZWQgY3JlYXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uICBUaGUgY3JlYXRlIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIGNyZWF0ZSBhY3Rpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGF0YSAgRGF0YSB0byBzYXZlIG9uIHRoZSBuZXcgZG9jdW1lbnRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucmVxdWVzdEF0TGVhc3QgRGVmaW5lcyB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIHJlcXVlc3RlZCB3aGVuIGNyZWF0aW5nIHRoZSBuZXcgZG9jdW1lbnQgdG8gYXZvaWQgYWRkaXRpb25hbCByZXF1ZXN0cyBsYXRlciBvbi5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVTeW5jQXN5bmNEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0XHRcdGJGcm9tRGVmZXJyZWQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRyZXF1ZXN0QXRMZWFzdD86IHN0cmluZ1tdO1xuXHRcdH0sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmdcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IG5hdmlnYXRpb246IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IHJvdXRpbmdMaXN0ZW5lciA9IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXG5cdFx0Y29uc3QgY3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKClcblx0XHRcdC5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQuLi5wYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdC4uLntcblx0XHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZSxcblx0XHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuQXV0b0NyZWF0ZSwgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0XHRcdHJlcXVlc3RBdExlYXN0OiB0aGlzLl9pc0ZjbEVuYWJsZWQoKSA/IHBhcmFtZXRlcnMucmVxdWVzdEF0TGVhc3QgOiB1bmRlZmluZWQgLy8gRm9yIGZ1bGxzY3JlZW4sIHdlIGRvbid0IG5lZWQgdG8gcmVxdWVzdCBleHRyYSBwcm9wZXJ0aWVzIGFzIHRoZSB0YWJsZSB3aWxsIGJlIHJlZnJlc2hlZCB3aGVuIG5hdmlnYXRpbmcgYmFjayB3aXRoIHRoZSBEaXJ0eVN0YXRlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdClcblx0XHRcdC50aGVuKChuZXdEb2N1bWVudENvbnRleHQpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpICYmIG5ld0RvY3VtZW50Q29udGV4dCAmJiBuZXdEb2N1bWVudENvbnRleHQuZ2V0QmluZGluZygpICE9PSBsaXN0QmluZGluZykge1xuXHRcdFx0XHRcdC8vIEluIEZDTCBjYXNlLCBpZiB0aGUgbmV3IGNvbnRleHQgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIGFuIGFjdGlvbiAobm90IHdpdGggdGhlIHN0YW5kYXJkIFBPU1QgY3JlYXRlKSwgd2UgbmVlZCB0byByZWZyZXNoXG5cdFx0XHRcdFx0Ly8gdGhlIG9yaWdpbmFsIGxpc3RCaW5kaW5nIHNvIHRoYXQgaXQgY29udGFpbnMgdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0ICh0aGlzIGlzIGRvbmUgYXV0b21hdGljYWxseSBieSB0aGUgbGlzdEJpbmRpbmcgZm9yIHN0YW5kYXJkIGNyZWF0ZSlcblx0XHRcdFx0XHRsaXN0QmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0fSk7XG5cblx0XHQvLyBUaGUgU2lkZUVmZmVjdHMgYXJlIHJlcXVlc3RlZCBvbmx5IGlmIHRoZSBjcmVhdGlvbiBpbiB0aGUgRkxDIGNhc2UgKGRpcnR5IHN0YXRlIGlzIG5vdCBzZXQgdG8gdHJ1ZSBzbyBTaWRlRWZmZWN0cyBhcmUgcmVsZXZhbnQpXG5cdFx0Ly8gb3IgaWYgdGhlIGNyZWF0aW9uIGlzIG5vdCBkZWZlcnJlZC5cblx0XHRpZiAoKHRoaXMuX2lzRmNsRW5hYmxlZCgpIHx8IHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCAhPT0gdHJ1ZSkgJiYgIXBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbiwgcGFyYW1ldGVycy5iRnJvbURlZmVycmVkID8gbGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpIDogdW5kZWZpbmVkKTtcblx0XHR9XG5cblx0XHRpZiAocGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5Bc3luYykge1xuXHRcdFx0bmF2aWdhdGlvbiA9IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobGlzdEJpbmRpbmcsIHtcblx0XHRcdFx0Y3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM6IHsgbW9kZTogXCJBc3luY1wiLCBjcmVhdGVDb250ZXh0UHJvbWlzZTogY3JlYXRpb24gfSxcblx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdGZvcmNlRm9jdXM6IHRydWVcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBjb3JlUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0bmF2aWdhdGlvbiA9IGNyZWF0aW9uXG5cdFx0XHRcdC50aGVuKGFzeW5jIChuZXdEb2N1bWVudENvbnRleHQpID0+IHtcblx0XHRcdFx0XHRpZiAoIW5ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UoY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdFx0XHRcdHRpdGxlOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0VESVRGTE9XX1NBUEZFX0NSRUFUSU9OX0ZBSUxFRF9ERVNDUklQVElPTlwiKVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIEluIGNhc2UgdGhlIFN5bmMgY3JlYXRpb24gd2FzIHRyaWdnZXJlZCBmb3IgYSBkZWZlcnJlZCBjcmVhdGlvbiwgd2UgZG9uJ3QgbmF2aWdhdGUgZm9yd2FyZFxuXHRcdFx0XHRcdFx0Ly8gYXMgd2UncmUgYWxyZWFkeSBvbiB0aGUgY29ycmVzcG9uZGluZyBPYmplY3RQYWdlXG5cdFx0XHRcdFx0XHRjb25zdCBuYXZQYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHR0cmFuc2llbnQ6XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGxpc3RCaW5kaW5nKSA9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBwYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZFxuXHRcdFx0XHRcdFx0XHQ/IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvQ29udGV4dChuZXdEb2N1bWVudENvbnRleHQsIG5hdlBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHRcdDogcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChuZXdEb2N1bWVudENvbnRleHQsIG5hdlBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGFzeW5jIChlcnJvcjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdGlmICh0eXBlb2YgZXJyb3IgPT09IFwic3RyaW5nXCIgJiYgZXJyb3IgPT09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpIHtcblx0XHRcdFx0XHRcdC8vIENyZWF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBieSB0aGUgdXNlciA9PiBubyBlcnJvciBtZXNzYWdlIHBhZ2Vcblx0XHRcdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJDcmVhdGlvbiBlcnJvcjogXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gZXJyb3IgbWVzc2FnZSBwYWdlIGluIGNhc2Ugb2YgYW4gZXJyb3IgZHVyaW5nIGNyZWF0aW9uIG9yIG5hdmlnYXRpb25cblx0XHRcdFx0XHRyZXR1cm4gcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0XHRcdHRpdGxlOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19FRElURkxPV19TQVBGRV9DUkVBVElPTl9GQUlMRURfREVTQ1JJUFRJT05cIiksXG5cdFx0XHRcdFx0XHRzaG93TWVzc2FnZVBhZ2VPbkNyZWF0ZUZhaWx1cmU6IHRydWVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsU2V0dGxlZChbY3JlYXRpb24sIG5hdmlnYXRpb25dKSwgbGlzdEJpbmRpbmcpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBvbmx5IGVycm9ycyBoYW5kbGVkIGhlcmUgYXJlIHJhaXNlZCBhcyBzdHJpbmcgLSBzaG91bGQgYmUgY2hhbmdlZCB0byBFcnJvciBvYmplY3RzXG5cdFx0XHQvLyBjcmVhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgYnkgdXNlciBvciBmYWlsZWQgaW4gYmFja2VuZCA9PiBpbiBjYXNlIHdlIGhhdmUgbmF2aWdhdGVkIHRvIHRyYW5zaWVudCBjb250ZXh0IGJlZm9yZSwgbmF2aWdhdGUgYmFja1xuXHRcdFx0Ly8gdGhlIHN3aXRjaC1zdGF0ZW1lbnQgYWJvdmUgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGhhcHBlbnMgaW4gY3JlYXRpb25Nb2RlcyBkZWZlcnJlZCBhbmQgYXN5bmMuIEJ1dCBpbiBmYWN0LCBpbiB0aGVzZSBjYXNlcyBhZnRlciB0aGUgbmF2aWdhdGlvbiBmcm9tIHJvdXRlTWF0Y2hlZCBpbiBPUCBjb21wb25lbnRcblx0XHRcdC8vIGNyZWF0ZURlZmVycmVkRG9jdW1lbnQgaXMgdHJpZ2dlcmVkLCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZCAoY3JlYXRlRG9jdW1lbnQpIGFnYWluIC0gdGhpcyB0aW1lIHdpdGggY3JlYXRpb25Nb2RlIHN5bmMuIFRoZXJlZm9yZSwgYWxzbyBpbiB0aGF0IG1vZGUgd2UgbmVlZCB0byB0cmlnZ2VyIGJhY2sgbmF2aWdhdGlvbi5cblx0XHRcdC8vIFRoZSBvdGhlciBjYXNlcyBtaWdodCBzdGlsbCBiZSBuZWVkZWQgaW4gY2FzZSB0aGUgbmF2aWdhdGlvbiBmYWlscy5cblx0XHRcdGlmIChcblx0XHRcdFx0W1xuXHRcdFx0XHRcdENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2csXG5cdFx0XHRcdFx0Q29uc3RhbnRzLkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCxcblx0XHRcdFx0XHRDb25zdGFudHMuQ3JlYXRpb25GYWlsZWQsXG5cdFx0XHRcdFx0Q29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkXG5cdFx0XHRcdF0uaW5jbHVkZXMoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcilcblx0XHRcdCkge1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGV4dGVybmFsIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIG91dGJvdW5kIFRoZSBvdXRib3VuZCBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRXh0ZXJuYWxEb2N1bWVudChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZywgb3V0Ym91bmQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBUT0RPOiBDYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIChjdXJyZW50bHkgdXNpbmcgdGhlIHNhbWUgYXMgZm9yIG91dGJvdW5kIGNoZXZyb24gbmF2LCBhbmQgd2l0aG91dCBhbnkgY29udGV4dCAtIDNyZCBwYXJhbSlcblx0XHRpZiAob3V0Ym91bmQpIHtcblx0XHRcdGlmICh0eXBlb2YgbGlzdEJpbmRpbmcgIT09IFwic3RyaW5nXCIgJiYgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSBcIkV4dGVybmFsXCIgd2l0aCBhIFRyZWVUYWJsZWApO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBjb250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyO1xuXHRcdFx0Y29uc3QgY3JlYXRlUGF0aCA9IE1vZGVsSGVscGVyLmdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyh0aGlzLmJhc2UuZ2V0VmlldygpLCBsaXN0QmluZGluZyk7XG5cdFx0XHRjb250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKGNvbnRyb2xsZXIsIG91dGJvdW5kLCB1bmRlZmluZWQsIGNyZWF0ZVBhdGgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSBTaWRlRWZmZWN0cyB0byBleGVjdXRlIGFmdGVyIHRoZSBkb2N1bWVudCBjcmVhdGlvbi5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGhhcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBjcmVhdGlvblByb21pc2UgVGhlIHByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcGFyYW0gcGFyZW50Q29udGV4dCBPcHRpb25hbCBwYXJlbnQgY29udGV4dFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIFNpZGVFZmZlY3RzIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0aGFuZGxlU2lkZUVmZmVjdHMgPSBhc3luYyAoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0Y3JlYXRpb25Qcm9taXNlOiBQcm9taXNlPENvbnRleHQ+LFxuXHRcdHBhcmVudENvbnRleHQ/OiBDb250ZXh0IHwgbnVsbFxuXHQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IGF3YWl0IGNyZWF0aW9uUHJvbWlzZTtcblx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0YXdhaXQgbmV3Q29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0dGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkoXG5cdFx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0XHRwYXJlbnRDb250ZXh0ID8/ICh0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkKVxuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZvciB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqIEBwYXJhbSB2YWxpZGF0aW9uTWVzc2FnZXMgVGhlIGVycm9yIG1lc3NhZ2VzIGZvcm0gdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdGFyZ2V0ZWQgYnkgdGhlIG1lc3NhZ2VzXG5cdCAqL1xuXHRjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMgPSAodmFsaWRhdGlvbk1lc3NhZ2VzOiB7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdLCB0YWJsZTogVGFibGUpOiB2b2lkID0+IHtcblx0XHRjb25zdCBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSB0YWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0Y29uc3QgY3VzdG9tVmFsaWRpdHkgPSB0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93Q3VzdG9tVmFsaWRpdHlcIik7XG5cdFx0Y29uc3QgY3VzdG9tTWVzc2FnZXM6IEN1c3RvbU1lc3NhZ2VbXSA9IFtdO1xuXHRcdGxldCBmaWVsZENvbnRyb2w7XG5cdFx0bGV0IGZpbmFsVGFyZ2V0OiBzdHJpbmc7XG5cblx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0Y29uc3Qgb2xkTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IG1lc3NhZ2UuZ2V0Q29kZSgpID09PSBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pO1xuXHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhvbGRNZXNzYWdlcyk7XG5cblx0XHR2YWxpZGF0aW9uTWVzc2FnZXMuZm9yRWFjaCgodmFsaWRhdGlvbk1lc3NhZ2UpID0+IHtcblx0XHRcdC8vIEhhbmRsZSBCb3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdGlmICh2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0KSB7XG5cdFx0XHRcdGZpZWxkQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoY3VzdG9tVmFsaWRpdHlbdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0ZmluYWxUYXJnZXQgPSBgJHtmaWVsZENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpfS8ke2ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nUGF0aChcInZhbHVlXCIpfWA7XG5cdFx0XHRcdC8vIEFkZCB2YWxpZGF0aW9uIG1lc3NhZ2UgaWYgc3RpbGwgbm90IGV4aXN0c1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IU1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSkubGVuZ3RoXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhcblx0XHRcdFx0XHRcdG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZTogdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRleHQsXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0dGVjaG5pY2FsOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0cGVyc2lzdGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHRhcmdldDogZmluYWxUYXJnZXRcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBBZGQgY29udHJvbElkIGluIG9yZGVyIHRvIGdldCB0aGUgZm9jdXMgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHBvcG92ZXJcblx0XHRcdFx0Y29uc3QgZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSk7XG5cdFx0XHRcdGV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzWzBdLmFkZENvbnRyb2xJZChjdXN0b21WYWxpZGl0eVt2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgVW5ib3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGN1c3RvbU1lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHR0ZXh0OiB2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKGN1c3RvbU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IGN1c3RvbU1lc3NhZ2VzXG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlc29sdmVzIHRoZSBjcmVhdGlvbiBtb2RlXG5cdCAqIFByb3ZpZGVzIHRoZSBleHBlY3RlZCBjcmVhdGlvbiBtb2RlOlxuXHQgKiAtIHByZXNlcnZlcyB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGUgd2hlbiB0aGlzIG9uZSBpcyBub3QgYSBOZXdQYWdlXG5cdCAqIC0gY2FsY3VsYXRlcyB0aGUgbmV3IG9uZSBpZiB0aGUgY3JlYXRpb24gbW9kZSBpcyBhIE5ld1BhZ2UuXG5cdCAqIEBwYXJhbSBpbml0aWFsQ3JlYXRpb25Nb2RlIFRoZSBpbml0aWFsIGNyZWF0aW9uIG1vZGVcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGNyZWF0ZURhdGEgVGhlIGluaXRpYWwgZGF0YSBmb3Igb2JqZWN0IGNyZWF0aW9uXG5cdCAqIEByZXR1cm5zIFRoZSBuZXcgY3JlYXRpb24gbW9kZVxuXHQgKi9cblx0cmVzb2x2ZUNyZWF0aW9uTW9kZSA9IChpbml0aWFsQ3JlYXRpb25Nb2RlOiBzdHJpbmcsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuXHRcdGlmIChpbml0aWFsQ3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSkge1xuXHRcdFx0Ly8gdXNlIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZVxuXHRcdFx0cmV0dXJuIGluaXRpYWxDcmVhdGlvbk1vZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpO1xuXHRcdFx0Ly8gTmV3QWN0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBOYXZpZ2F0aW9uUHJvcGVydHkgY29sbGVjdGlvblxuXHRcdFx0aWYgKCFsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0Y29uc3QgZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChsaXN0QmluZGluZy5nZXRQYXRoKCkpKTtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQgfCB1bmRlZmluZWQsXG5cdFx0XHRcdFx0Ly8gaWYgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycyBpcyBwcmVzZW50LCB0aGVuIGNyZWF0aW9uIGlzICdEZWZlcnJlZCdcblx0XHRcdFx0XHQvLyBpbiB0aGUgYWJzZW5jZSBvZiBOZXdBY3Rpb24gb3IgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycywgY3JlYXRpb24gaXMgYXN5bmNcblx0XHRcdFx0XHRuZXdBY3Rpb24gPSAoXG5cdFx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0XHRcdD8gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Um9vdFxuXHRcdFx0XHRcdFx0XHQ6IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdFx0XHRcdCk/Lk5ld0FjdGlvbj8udG9TdHJpbmcoKTtcblxuXHRcdFx0XHRpZiAobmV3QWN0aW9uICYmIGRhdGFNb2RlbExpc3RCaW5kaW5nUGF0aC50YXJnZXRFbnRpdHlUeXBlLmFjdGlvbnNbbmV3QWN0aW9uXS5wYXJhbWV0ZXJzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHQvLyBiaW5kaW5nIHBhcmFtZXRlciAoZWc6IF9pdCkgaXMgbm90IGNvbnNpZGVyZWRcblx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkRlZmVycmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjcmVhdGlvblBhcmFtZXRlcnMgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzKGxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdGlmIChjcmVhdGlvblBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkFzeW5jO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqL1xuXG5cdGFzeW5jIHZhbGlkYXRlRG9jdW1lbnQoXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRwYXJhbWV0ZXJzOiB7IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbj86IHN0cmluZzsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfVxuXHQpOiBQcm9taXNlPHsgbWVzc2FnZVRhcmdldD86IHN0cmluZzsgbWVzc2FnZVRleHQ6IHN0cmluZyB9W10+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnZhbGlkYXRlRG9jdW1lbnQoY29udGV4dCwgcGFyYW1ldGVycywgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyB0aGUgcmVzdWx0IG9mXG5cdCAqIGEgY3JlYXRpb24gcm93J3MgY3VzdG9tIHZhbGlkYXRpb24gYXMgYSBwcm9taXNlLiBJZiBubyBjcmVhdGlvbiByb3cgaXMgaW52b2x2ZWRcblx0ICogdGhlIHJlc3VsdGluZyBmdW5jdGlvbiByZXR1cm5zIGEgcmVzb2x2ZWQgcHJvbWlzZS5cblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB3aXRoIHRoZSBjcmVhdGlvblJvd1xuXHQgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHByb21pc2Vcblx0ICovXG5cdGdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uKHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZCk6ICgpID0+IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdGNvbnN0IGNyZWF0aW9uUm93ID0gdGFibGU/LmdldENyZWF0aW9uUm93KCk7XG5cdFx0aWYgKGNyZWF0aW9uUm93ICYmIHRhYmxlKSB7XG5cdFx0XHRyZXR1cm4gYXN5bmMgKCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4gPT4ge1xuXHRcdFx0XHRjb25zdCBjcmVhdGlvblJvd09iamVjdHMgPSAoY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KS5nZXRPYmplY3QoKTtcblx0XHRcdFx0ZGVsZXRlIGNyZWF0aW9uUm93T2JqZWN0c1tcIkAkdWk1LmNvbnRleHQuaXNUcmFuc2llbnRcIl07XG5cdFx0XHRcdHJldHVybiB0aGlzLnZhbGlkYXRlRG9jdW1lbnQodGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0LCB7XG5cdFx0XHRcdFx0ZGF0YTogY3JlYXRpb25Sb3dPYmplY3RzLFxuXHRcdFx0XHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogdGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIGFzeW5jICgpID0+IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBzZXZlcmFsIGRvY3VtZW50cy5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyB1c2VkIHRvIGNyZWF0ZSB0aGUgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBkYXRhRm9yQ3JlYXRlIFRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBuZXcgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBjcmVhdGVBdEVuZCBUcnVlIGlmIHRoZSBuZXcgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gaXNGcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcGFyYW0gYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIGNyZWF0ZUFzSW5hY3RpdmUgVHJ1ZSBpZiB0aGUgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGFzIGluYWN0aXZlXG5cdCAqIEBwYXJhbSByZXF1ZXN0U2lkZUVmZmVjdHMgVHJ1ZSBieSBkZWZhdWx0LCBmYWxzZSBpZiBTaWRlRWZmZWN0cyBzaG91bGQgbm90IGJlIHJlcXVlc3RlZFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0cy5cblx0ICovXG5cdGFzeW5jIGNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzKFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGRhdGFGb3JDcmVhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG5cdFx0Y3JlYXRlQXRFbmQ6IGJvb2xlYW4sXG5cdFx0aXNGcm9tQ29weVBhc3RlOiBib29sZWFuLFxuXHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb24sXG5cdFx0Y3JlYXRlQXNJbmFjdGl2ZSA9IGZhbHNlLFxuXHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW5cblx0KTogUHJvbWlzZTxDb250ZXh0W10+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgdGFyZ2V0TGlzdEJpbmRpbmcgPSBsaXN0QmluZGluZztcblx0XHRyZXF1ZXN0U2lkZUVmZmVjdHMgPSByZXF1ZXN0U2lkZUVmZmVjdHMgIT09IGZhbHNlO1xuXHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YXJnZXRMaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0bGV0IG1ldGFQYXRoOiBzdHJpbmc7XG5cblx0XHRcdGlmICh0YXJnZXRMaXN0QmluZGluZy5nZXRDb250ZXh0KCkpIHtcblx0XHRcdFx0bWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7dGFyZ2V0TGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKX0vJHt0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCl9YCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyh0YXJnZXRMaXN0QmluZGluZyk7XG5cblx0XHRcdC8vIEl0ZXJhdGUgb24gYWxsIGl0ZW1zIGFuZCBzdG9yZSB0aGUgY29ycmVzcG9uZGluZyBjcmVhdGlvbiBwcm9taXNlXG5cdFx0XHRjb25zdCBjcmVhdGlvblByb21pc2VzID0gZGF0YUZvckNyZWF0ZS5tYXAoYXN5bmMgKHByb3BlcnR5VmFsdWVzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGNyZWF0ZVBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMgPSB7IGRhdGE6IHt9LCBwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSB9O1xuXG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IGNyZWF0ZUF0RW5kO1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmluYWN0aXZlID0gY3JlYXRlQXNJbmFjdGl2ZTtcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IGJlZm9yZUNyZWF0ZUNhbGxCYWNrO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBkZWVwIGNyZWF0ZVxuXHRcdFx0XHRmb3IgKGNvbnN0IHByb3BlcnR5UGF0aCBpbiBwcm9wZXJ0eVZhbHVlcykge1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5ID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHttZXRhUGF0aH0vJHtwcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0cHJvcGVydHkgJiZcblx0XHRcdFx0XHRcdHByb3BlcnR5LiRraW5kICE9PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmXG5cdFx0XHRcdFx0XHQhcHJvcGVydHlQYXRoLmluY2x1ZGVzKFwiL1wiKSAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5kYXRhIVtwcm9wZXJ0eVBhdGhdID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdHRhcmdldExpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdGlzRnJvbUNvcHlQYXN0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGNyZWF0ZWRDb250ZXh0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNyZWF0aW9uUHJvbWlzZXMpO1xuXHRcdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKHRhcmdldExpc3RCaW5kaW5nKTtcblx0XHRcdH1cblx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0Y29uc3QgYWN0aXZlQ29udGV4dHMgPSBjcmVhdGVkQ29udGV4dHMuZmlsdGVyKChuZXdDb250ZXh0KSA9PiAhbmV3Q29udGV4dC5pc0luYWN0aXZlKCkpO1xuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoYWN0aXZlQ29udGV4dHMubWFwKGFzeW5jIChuZXdDb250ZXh0KSA9PiBuZXdDb250ZXh0LmNyZWF0ZWQoKSkpO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0aWYgKHJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZywgdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSAmJiBhY3RpdmVDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIGFjdGl2ZUNvbnRleHRzKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNyZWF0ZWRDb250ZXh0cztcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIG11bHRpcGxlIGRvY3VtZW50cy5cIik7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdDcmVhdGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jcmVhdGVQYXJhbWV0ZXJzIEFycmF5IG9mIHZhbHVlcyB0aGF0IGFyZSBmaWxsZWQgaW4gdGhlIEFjdGlvbiBQYXJhbWV0ZXIgRGlhbG9nXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQmVmb3JlQ3JlYXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dFBhdGg/OiBzdHJpbmc7IGNyZWF0ZVBhcmFtZXRlcnM/OiB1bmtub3duW10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdFZGl0JyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRWRpdCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0YXN5bmMgb25CZWZvcmVFZGl0KF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdTYXZlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlU2F2ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2F2ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKFwiQWZ0ZXJBc3luY1wiKVxuXHRhc3luYyBvbkJlZm9yZVNhdmUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEaXNjYXJkXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBkaXNjYXJkZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZURpc2NhcmQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0RlbGV0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGVsZXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZURlbGV0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSBhY3Rpb24gZXhlY3V0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRXhlY3V0ZUFjdGlvblxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIHVzZWQgZm9yIHRoZSBhY3Rpb24gZXhlY3V0aW9uXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0YXN5bmMgb25CZWZvcmVFeGVjdXRlQWN0aW9uKF9tUGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfCBDb250ZXh0IHwgbnVsbCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlclNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBjb250ZXh0IHdlIG9idGFpbmVkIGFmdGVyIHNhdmluZ1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgVGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJDcmVhdGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ0VkaXQnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckVkaXRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGVkaXRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyRWRpdChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkFmdGVyRGlzY2FyZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgVGhlIGNvbnRleHQgb2J0YWluZWQgYWZ0ZXIgZGlzY2FyZGluZyB0aGUgb2JqZWN0LCBvciB1bmRlZmluZWQgaWYgd2UgZGlzY2FyZGVkIGEgbmV3IG9iamVjdFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJEaXNjYXJkKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdEZWxldGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckRlbGV0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyRGVsZXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy5iRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBJbmRpY2F0ZXMgd2hldGhlciBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGlnbm9yZWQgd2hlbiB1c2VyIGNsaWNrcyBvbiBTYXZlIGR1cmluZyBhbiBJbmxpbmUgY3JlYXRpb25cblx0Ly8gQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzIExpc3QgYmluZGluZ3Mgb2YgdGhlIHRhYmxlcyBpbiB0aGUgdmlldy5cblx0Ly8gQm90aCBvZiB0aGUgYWJvdmUgcGFyYW1ldGVycyBhcmUgZm9yIHRoZSBzYW1lIHB1cnBvc2UuIFVzZXIgY2FuIGVudGVyIHNvbWUgaW5mb3JtYXRpb24gaW4gdGhlIGNyZWF0aW9uIHJvdyhzKSBidXQgZG9lcyBub3QgJ0FkZCByb3cnLCBpbnN0ZWFkIGNsaWNrcyBTYXZlLlxuXHQvLyBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSBpbiB0aGUgdmlldy5cblxuXHQvKipcblx0ICogU2F2ZXMgYSBuZXcgZG9jdW1lbnQgYWZ0ZXIgY2hlY2tpbmcgaXQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIFBSSVZBVEVcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHNhdmUgaXMgY29tcGxldGVcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2F2ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtUGFyYW1ldGVyczogU2F2ZURvY3VtZW50UGFyYW1ldGVycyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHNhdmVEb2N1bWVudCBpcyBjYWxsZWQgZnJvbSBpbmxpbmUgZWRpdCBrZXlib2FyZCBzaG9ydGN1dFxuXHRcdGlmIChcblx0XHRcdCF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpICYmXG5cdFx0XHR0aGlzLmJhc2UuaW5saW5lRWRpdEZsb3c/LmlzSW5saW5lRWRpdFBvc3NpYmxlKCkgJiZcblx0XHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiL2lzSW5saW5lRWRpdEFjdGl2ZVwiKVxuXHRcdCkge1xuXHRcdFx0dGhpcy5iYXNlLmlubGluZUVkaXRGbG93LmlubGluZUVkaXRTYXZlKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRjb25zdCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIHx8IHVuZGVmaW5lZDtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBhQmluZGluZ3MgPSBtUGFyYW1ldGVycy5iaW5kaW5ncyBhcyBPRGF0YUxpc3RCaW5kaW5nW107XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHQvLyBpbiBjYXNlIG9mIHNhdmluZyAvIGFjdGl2YXRpbmcgdGhlIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgc2hhbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIFBBVENIL1BPU1Rcblx0XHRcdC8vIGlzIHNlbnQgdG8gdGhlIGJhY2tlbmRcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5tZXJnZVBhdGNoRHJhZnQgIT09IHRydWUpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0XHQvL3dlIG5lZWQgdG8gcmVxdWVzdCBmb3IgcmVjb21tZW5kYXRpb25zIGFuZCB0aGVuIGJyaW5nIHRoZSBkaWFsb2cgaGVyZVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cblx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9IGF3YWl0IHRoaXMuY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbigpO1xuXHRcdFx0Y29uc3Qgcm9vdENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFJvb3RDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZVNhdmUoeyBjb250ZXh0OiByb290Q29udGV4dCB9KTtcblxuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgcm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChcblx0XHRcdFx0KChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmXG5cdFx0XHRcdFx0cm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB8fFxuXHRcdFx0XHQodGhpcy5faGlkZGVuRHJhZnQgJiYgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpXG5cdFx0XHQpIHtcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0ID8gb0NvbnRleHQgOiAocm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEV4ZWN1dGUgdGhlIHJlZ2lzdGVyZWQgZGVmZXJyZWQgU2lkZUVmZmVjdHMgd2hpY2ggaGF2ZSBub3QgYmUgZXhlY3V0ZWQgeWV0IGZvciB0aGUgcGFnZSBjb250ZXh0XG5cdFx0XHQvLyBDYW4gb2NjdXIgd2hlbiBzaG9ydGN1dCBpcyB1c2VkIHRvIHNhdmUgdGhlIGRvY3VtZW50LlxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLl9zaWRlRWZmZWN0cy5oYW5kbGVQYWdlQ2hhbmdlQ29udGV4dChvQ29udGV4dCk7XG5cblx0XHRcdC8vIFRoZSAkYXV0byBxdWV1ZSBjYW4gb25seSBoYXZlIHBlbmRpbmcgY2hhbmdlcyBhdCB0aGlzIHBvaW50IHdoZW4gU0FWRSB3YXMgY2xpY2tlZCBpbW1lZGlhdGVseSBhZnRlciBjaGFuZ2luZyBhIGZpZWxkLlxuXHRcdFx0Ly8gSW4gdGhpcyBjYXNlIHRoZSAkYXV0byBxdWV1ZSBpcyBsb2NrZWQgdGhlcmVmb3JlIHRoZSBmb2xsb3dpbmcgc3VibWl0IGJhdGNoIHNob3VsZCBub3QgY3JlYXRlIGEgc2VwYXJhdGUgYmF0Y2ggcmVxdWVzdC5cblx0XHRcdC8vIEl0IGlzIGRvbmUgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgcGF0Y2gsIGRyYWZ0cHJlcGFyZSwgZHJhZnRhY3RpdmF0ZSBlYWNoIGhhdmUgdGhlaXIgb3duIGNoYW5nZXNldFxuXHRcdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSAmJiBtUGFyYW1ldGVycy5tZXJnZVBhdGNoRHJhZnQpIHtcblx0XHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChcIiRhdXRvXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBhY3RpdmVEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5zYXZlRG9jdW1lbnQoXG5cdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIGFzIGJvb2xlYW4sXG5cdFx0XHRcdGFCaW5kaW5ncyxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0aGlzLmdldENyZWF0aW9uTW9kZSgpLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdG1QYXJhbWV0ZXJzPy5pc1N0YW5kYXJkU2F2ZVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXHRcdFx0aWYgKHRoaXMuX2hpZGRlbkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuaGFuZGxlU2Vzc2lvbk9mZigpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aXZhdGUsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblxuXHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoU3RhbmRhcmRBY3Rpb25zLnNhdmUsIFRyaWdnZXJUeXBlLnN0YW5kYXJkQWN0aW9uKTtcblxuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyU2F2ZSh7XG5cdFx0XHRcdGNvbnRleHQ6IGFjdGl2ZURvY3VtZW50Q29udGV4dFxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIHVwZGF0ZSB0ZWxlbWV0cnkgZGF0YSBmb3IgaG93IHBhZ2Ugd2FzIHNhdmVkIGFuZCB0aGVuIGRvIHN0b3Jpbmcgb2YgdGhpcyBkYXRhIHRvIGJhY2tlbmQgdGhyb3VnaCB0aGUgc3RvcmVEYXRhIGZ1bmN0aW9uXG5cdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLnN0b3JlRGF0YUZvclRlbGVtZXRyeShyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4pO1xuXG5cdFx0XHRpZiAoYWN0aXZlRG9jdW1lbnRDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBhY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2hlbiBzYXZpbmcsIHRoZSBzZW1hbnRpYyBrZXlzIG1heSBoYXZlIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gSW4gdGhpcyBjYXNlLCB3ZSBhbHNvIG5lZWQgdG8gbWFuYWdlIHRoZSBzZW1hbnRpYyBVUkwgY2hhbmdlIGluIHRoZSBoaXN0b3J5XG5cdFx0XHRcdFx0Y29uc3QgcHJldmlvdXNTZW1hbnRpY1BhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgob0NvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdGNvbnN0IG5ld1NlbWFudGljUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChhY3RpdmVEb2N1bWVudENvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdGlmIChwcmV2aW91c1NlbWFudGljUGF0aCAmJiBuZXdTZW1hbnRpY1BhdGggJiYgcHJldmlvdXNTZW1hbnRpY1BhdGggIT09IG5ld1NlbWFudGljUGF0aCkge1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8ucGF0aE1hcHBpbmcucHVzaCh7IG9sZFBhdGg6IHByZXZpb3VzU2VtYW50aWNQYXRoLCBuZXdQYXRoOiBuZXdTZW1hbnRpY1BhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRpZiAocm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpIHx8IHRoaXMuX2hpZGRlbkRyYWZ0Py5zdGF5T25DdXJyZW50UGFnZUFmdGVyU2F2ZSkge1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gYWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlldyAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHsgZWRpdGFibGU6IGZhbHNlLCByZWNyZWF0ZUNvbnRleHQ6IGZhbHNlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRhd2FpdCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdGlmICghKG9FcnJvciAmJiAob0Vycm9yIGFzIHsgY2FuY2VsZWQ/OiBib29sZWFuIH0pLmNhbmNlbGVkKSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBzYXZpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTd2l0Y2hlcyB0aGUgVUkgYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gc3dpdGNoIGZyb21cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBzd2l0Y2ggaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgdG9nZ2xlRHJhZnRBY3RpdmUob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgZWRpdGFibGU6IGJvb2xlYW47XG5cdFx0Y29uc3QgYklzRHJhZnQgPSBvQ29udGV4dCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0Ly90b2dnbGUgYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGRvY3VtZW50IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlZGl0IGRyYWZ0cyBhbmQgYWN0aXZlIGRvY3VtZW50cyB3aXRoIGRyYWZ0KVxuXHRcdGlmIChcblx0XHRcdCFiSXNEcmFmdCB8fFxuXHRcdFx0IShcblx0XHRcdFx0KCFvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0FjdGl2ZUVudGl0eSkgfHxcblx0XHRcdFx0KG9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzRHJhZnRFbnRpdHkpXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCFvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0FjdGl2ZUVudGl0eSkge1xuXHRcdFx0Ly9zdGFydCBQb2ludDogZWRpdCBkcmFmdFxuXHRcdFx0ZWRpdGFibGUgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gc3RhcnQgcG9pbnQgYWN0aXZlIGRvY3VtZW50XG5cdFx0XHRlZGl0YWJsZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRcdGNvbnN0IG9SaWdodG1vc3RDb250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSA/IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpIDogb0NvbnRleHQ7XG5cdFx0XHRsZXQgc2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvUmlnaHRtb3N0Q29udGV4dCwgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCwgZmFsc2UpO1xuXHRcdFx0aWYgKCFzaWJsaW5nSW5mbyAmJiBvQ29udGV4dCAhPT0gb1JpZ2h0bW9zdENvbnRleHQpIHtcblx0XHRcdFx0Ly8gVHJ5IHRvIGNvbXB1dGUgc2libGluZyBpbmZvIGZvciB0aGUgcm9vdCBjb250ZXh0IGlmIGl0IGZhaWxzIGZvciB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdFx0Ly8gLS0+IEluIGNhc2Ugb2YgRkNMLCBpZiB3ZSB0cnkgdG8gc3dpdGNoIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBidXQgYSBjaGlsZCBlbnRpdHkgaGFzIG5vIHNpYmxpbmcsIHRoZSBzd2l0Y2ggd2lsbCBjbG9zZSB0aGUgY2hpbGQgY29sdW1uXG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb0NvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdGlmIChzaWJsaW5nSW5mbykge1xuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRpZiAobGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gb0NvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0YXJnZXRQYXRoID0gc2libGluZ0luZm8ucGF0aE1hcHBpbmdbc2libGluZ0luZm8ucGF0aE1hcHBpbmcubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBsYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCwgbmV3UGF0aDogdGFyZ2V0UGF0aCB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCwgeyBlZGl0YWJsZSwgcmVjcmVhdGVDb250ZXh0OiB0cnVlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmUgLSBDYW5ub3QgZmluZCBzaWJsaW5nXCIpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZToke29FcnJvcn1gKTtcblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzYXAubS5CdXR0b259IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiAtIEN1cnJlbnRseSB0aGlzIGlzIHBhc3NlZCBhcyBjYW5jZWxCdXR0b24gaW50ZXJuYWxseSAocmVwbGFjZWQgYnkgbVBhcmFtZXRlcnMuY29udHJvbCBpbiB0aGUgSlNEb2MgYmVsb3cpLiBDdXJyZW50bHkgaXQgaXMgYWxzbyBtYW5kYXRvcnkuXG5cdC8vIFBsYW4gLSBUaGlzIHNob3VsZCBub3QgYmUgbWFuZGF0b3J5LiBJZiBub3QgcHJvdmlkZWQsIHdlIHNob3VsZCBoYXZlIGEgZGVmYXVsdCB0aGF0IGNhbiBhY3QgYXMgcmVmZXJlbmNlIGNvbnRyb2wgZm9yIHRoZSBkaXNjYXJkIHBvcG92ZXIgT1Igd2UgY2FuIHNob3cgYSBkaWFsb2cgaW5zdGVhZCBvZiBhIHBvcG92ZXIuXG5cblx0LyoqXG5cdCAqIERpc2NhcmQgdGhlIGVkaXRhYmxlIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250cm9sIFRoaXMgaXMgdGhlIGNvbnRyb2wgdXNlZCB0byBvcGVuIHRoZSBkaXNjYXJkIHBvcG92ZXJcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGFuZCBhbGxvd3MgY3VzdG9tIGhhbmRsaW5nXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwQmFja05hdmlnYXRpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBlZGl0YWJsZSBkb2N1bWVudCBoYXMgYmVlbiBkaXNjYXJkZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0bVBhcmFtZXRlcnM6IHtcblx0XHRcdGNvbnRyb2w/OiBCdXR0b247XG5cdFx0XHRjYW5jZWxCdXR0b24/OiBCdXR0b247XG5cdFx0XHRza2lwRGlzY2FyZFBvcG92ZXI/OiBib29sZWFuO1xuXHRcdFx0c2tpcEJhY2tOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdHNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXG5cdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0bGV0IGlzTmV3RG9jdW1lbnQgPSBmYWxzZTtcblx0XHRtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgPSB0aGlzLl9oaWRkZW5EcmFmdD8uZW5hYmxlZCA/IHRydWUgOiBtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXI7XG5cdFx0Y29uc3QgY2FuY2VsUGFyYW1ldGVyczogQ2FuY2VsUGFyYW1ldGVycyA9IHtcblx0XHRcdHNraXBEaXNjYXJkUG9wb3ZlcjogbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyID09PSB0cnVlLFxuXHRcdFx0Y2FuY2VsQnV0dG9uOiAobVBhcmFtZXRlcnMuY29udHJvbCB8fCBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24pISxcblx0XHRcdGJlZm9yZUNhbmNlbENhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEaXNjYXJkXG5cdFx0fTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRsZXQgcm9vdENvbnRleHQ6IENvbnRleHQ7XG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cblx0XHRcdC8vIERldGVybWluZSB0aGUgcm9vdCBjb250ZXh0IGJhc2VkIG9uIGhpZGRlbiBkcmFmdCBtb2RlIGFuZCBwcm9ncmFtbWluZyBtb2RlbFxuXHRcdFx0aWYgKHRoaXMuX2hpZGRlbkRyYWZ0ICYmIHNQcm9ncmFtbWluZ01vZGVsID09PSBcIkRyYWZ0XCIpIHtcblx0XHRcdFx0Y29uc3Qgcm9vdENvbnRleHRQYXRoID0gTW9kZWxIZWxwZXIuZ2V0RHJhZnRSb290UGF0aChvQ29udGV4dCk7XG5cdFx0XHRcdHJvb3RDb250ZXh0ID0gb0NvbnRleHQuZ2V0UGF0aCgpID09PSByb290Q29udGV4dFBhdGggPyBvQ29udGV4dCA6IGF3YWl0IHRoaXMuZ2V0Um9vdENvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cm9vdENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFJvb3RDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKFxuXHRcdFx0XHQoKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiYgdGhpcy5faXNGY2xFbmFibGVkKCkpIHx8XG5cdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0XG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdFx0dGhpcy5faGlkZGVuRHJhZnQgPyBvQ29udGV4dCA6IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNhbmNlbFJlc3VsdCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbmNlbERvY3VtZW50KFxuXHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0Y2FuY2VsUGFyYW1ldGVycyxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0ID8gdGhpcy5nZXRDcmVhdGlvbk1vZGUoKSAmJiAhcm9vdENvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikgOiB0aGlzLmdldENyZWF0aW9uTW9kZSgpLFxuXHRcdFx0XHR0aGlzLmlzRG9jdW1lbnRNb2RpZmllZCgpIHx8IHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSAvLyBJbiBzdGlja3kgbW9kZSB3ZSBhbHdheXMgYXNrIGZvciBjb25maXJtYXRpb25cblx0XHRcdCk7XG5cdFx0XHR0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKVxuXHRcdFx0XHQuZ2V0SW5zdGFuY2VkVmlld3MoKVxuXHRcdFx0XHQuZm9yRWFjaCgodmlldykgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHQgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGlmIChjb250ZXh0Py5pc0tlZXBBbGl2ZSgpID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnNldEtlZXBBbGl2ZShmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXHRcdFx0aWYgKHRoaXMuX2hpZGRlbkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuaGFuZGxlU2Vzc2lvbk9mZigpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEaXNjYXJkKHtcblx0XHRcdFx0Y29udGV4dDogY2FuY2VsUmVzdWx0XG5cdFx0XHR9KTtcblx0XHRcdC8vIHdlIGZvcmNlIHRoZSBlZGl0IHN0YXRlIGV2ZW4gZm9yIEZDTCBiZWNhdXNlIHRoZSBkcmFmdCBkaXNjYXJkIG1pZ2h0IG5vdCBiZSBpbXBsZW1lbnRlZFxuXHRcdFx0Ly8gYW5kIHdlIG1heSBqdXN0IGRlbGV0ZSB0aGUgZHJhZnRcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0aWYgKCFjYW5jZWxSZXN1bHQpIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIG9Db250ZXh0KTtcblx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdC8vaW4gY2FzZSBvZiBhIG5ldyBkb2N1bWVudCwgbm8gYWN0aXZlQ29udGV4dCBpcyByZXR1cm5lZCAtLT4gbmF2aWdhdGUgYmFjay5cblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwQmFja05hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KHJvb3RDb250ZXh0KTtcblx0XHRcdFx0XHRpc05ld0RvY3VtZW50ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IGNhbmNlbFJlc3VsdDtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdCh0aGlzLl9pc0ZjbEVuYWJsZWQoKSB8fCB0aGlzLl9oaWRkZW5EcmFmdD8uc3RheU9uQ3VycmVudFBhZ2VBZnRlckNhbmNlbCkgJiZcblx0XHRcdFx0XHRzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gb0FjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byBsb2FkIHRoZSBzZW1hbnRpYyBrZXlzIG9mIHRoZSBhY3RpdmUgY29udGV4dCwgYXMgd2UgbmVlZCB0aGVtXG5cdFx0XHRcdFx0Ly8gZm9yIHRoZSBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHQvLyBXZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBvZiB0aGUgY29udGV4dCwgc28gdGhhdCBpdCdzIGNyZWF0ZWQgYW5kIGJvdW5kIGluIHRoZSBzYW1lIG1pY3JvdGFzayxcblx0XHRcdFx0XHQvLyBzbyB0aGF0IGFsbCBwcm9wZXJ0aWVzIGFyZSBsb2FkZWQgdG9nZXRoZXIgYnkgYXV0b0V4cGFuZFNlbGVjdCwgc28gdGhhdCB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIEVkaXQgbW9kZVxuXHRcdFx0XHRcdC8vICQkaW5oZXJpdEV4cGFuZFNlbGVjdCB0YWtlcyBhbGwgbG9hZGVkIHByb3BlcnRpZXMgaW50byBhY2NvdW50IChCQ1AgMjA3MDQ2MjI2NSlcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3KSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB7IGVkaXRhYmxlOiBmYWxzZSwgcmVjcmVhdGVDb250ZXh0OiB0cnVlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQWN0aXZlIGNvbnRleHQgaXMgcmV0dXJuZWQgaW4gY2FzZSBvZiBjYW5jZWwgb2YgZXhpc3RpbmcgZG9jdW1lbnQsIGFuZCBpdCdzIHRoZSBzYW1lIGFzIHRoZSBlZGl0ZWQgY29udGV4dFxuXHRcdFx0XHRcdC8vIFNvLCB3ZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBhcyBpdCBtYXkgaGF2ZSBiZWVuIGRlc3Ryb3llZCB3aGVuIGNhbGxpbmcgc2V0S2VlcEFsaXZlKGZhbHNlKSBvbiBhbGwgdmlldydzIGNvbnRleHRzXG5cdFx0XHRcdFx0Ly8gZWFybGllciBpbiB0aGlzIG1ldGhvZFxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHsgZWRpdGFibGU6IGZhbHNlLCByZWNyZWF0ZUNvbnRleHQ6IHRydWUsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiAhdGhpcy5faGlkZGVuRHJhZnQpIHtcblx0XHRcdFx0Ly9zaG93IERyYWZ0IGRpc2NhcmRlZCBtZXNzYWdlIHRvYXN0IG9ubHkgZm9yIGRyYWZ0IGVuYWJsZWQgYXBwc1xuXHRcdFx0XHR0aGlzLnNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlKGlzTmV3RG9jdW1lbnQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgZ2V0Um9vdENvbnRleHQoY29udGV4dDogQ29udGV4dCwgYmluZGluZ1BhcmFtZXRlcnM/OiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mb1tcInBhcmFtZXRlcnNcIl0pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0XHRjb25zdCB2aWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3M7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRpZiAoKHZpZXdEYXRhPy52aWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDEpIHtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0IHx8IHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHJldHVybiAoYXdhaXQgQ29tbW9uVXRpbHMuY3JlYXRlUm9vdENvbnRleHQoXG5cdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzXG5cdFx0XHRcdCkpIGFzIENvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjb250ZXh0O1xuXHR9XG5cblx0YXN5bmMgaXNSb290Q29udGV4dE5ldyhjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3Qgcm9vdENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFJvb3RDb250ZXh0KGNvbnRleHQsIHsgJHNlbGVjdDogXCJIYXNBY3RpdmVFbnRpdHksSXNBY3RpdmVFbnRpdHlcIiB9KTtcblx0XHQvLyBXaGVuIHdlIHJlZnJlc2ggdGhlIHJvb3QgY29udGV4dCwgaXQgbWF5IG5vdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIEhhc0FjdGl2ZUVudGl0eSBhbmQgSXNBY3RpdmVFbnRpdHkgeWV0LCBzbyB3ZSByZXF1ZXN0IHRoZW1cblx0XHRjb25zdCBkcmFmdFByb3BlcnRpZXMgPSBhd2FpdCByb290Q29udGV4dC5yZXF1ZXN0UHJvcGVydHkoW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl0pO1xuXHRcdHJldHVybiAhZHJhZnRQcm9wZXJ0aWVzWzBdICYmICFkcmFmdFByb3BlcnRpZXNbMV07XG5cdH1cblxuXHQvKipcblx0ICogQnJpbmdzIHVwIGEgbWVzc2FnZSB0b2FzdCB3aGVuIGEgZHJhZnQgaXMgZGlzY2FyZGVkLlxuXHQgKiBAcGFyYW0gaXNOZXdEb2N1bWVudCBUaGlzIGlzIGEgQm9vbGVhbiBmbGFnIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyBuZXcgb3IgYWxyZWFkeSBleGlzdHMuXG5cdCAqL1xuXHRzaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZShpc05ld0RvY3VtZW50PzogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgbWVzc2FnZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RJU0NBUkRfRFJBRlRfVE9BU1RcIik7XG5cdFx0aWYgKGlzTmV3RG9jdW1lbnQgPT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaEFmdGVyUm91dGVNYXRjaGVkKHt9LCB0aGlzLnNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCwgdGhpcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBXZSB1c2UgdGhpcyBmdW5jdGlvbiBpbiBzaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZSB3aGVuIG5vIGNvbnRleHQgaXMgcGFzc2VkLlxuXHQgKi9cblx0c2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0KCk6IHZvaWQge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgbWVzc2FnZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RJU0NBUkRfRFJBRlRfVE9BU1RcIik7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRNZXNzYWdlVG9hc3Quc2hvdyhtZXNzYWdlLCB7IGNsb3NlT25Ccm93c2VyTmF2aWdhdGlvbjogZmFsc2UgfSk7XG5cdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQodGhpcy5zaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQsIHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGNvbnRleHQgY29ycmVzcG9uZHMgdG8gYSBkcmFmdCByb290LlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBjaGVja1xuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb250ZXh0IHBvaW50cyB0byBhIGRyYWZ0IHJvb3Rcblx0ICovXG5cdHByaXZhdGUgaXNEcmFmdFJvb3QoY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0cmV0dXJuIE1vZGVsSGVscGVyLmlzRHJhZnRSb290KGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkudGFyZ2V0RW50aXR5U2V0KTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBOYW1lIG9mIHRoZSBFbnRpdHlTZXQgdG8gd2hpY2ggdGhlIG9iamVjdCBiZWxvbmdzXG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgdGhlIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBkZWxldGVEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCwgbUluUGFyYW1ldGVycz86IHsgdGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnM6IHtcblx0XHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0czogYm9vbGVhbjtcblx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRcdHRpdGxlPzogc3RyaW5nO1xuXHRcdFx0XHRkZXNjcmlwdGlvbj86IHN0cmluZztcblx0XHRcdH0gPSB7IC4uLm1JblBhcmFtZXRlcnMsIGJGaW5kQWN0aXZlQ29udGV4dHM6IGZhbHNlLCBiZWZvcmVEZWxldGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlIH0sXG5cdFx0XHRtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChcblx0XHRcdFx0dGhpcy5faXNGY2xFbmFibGVkKCkgJiZcblx0XHRcdFx0dGhpcy5pc0RyYWZ0Um9vdChvQ29udGV4dCkgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0SW5kZXgoKSA9PT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHRydWUgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNEcmFmdEVudGl0eVwiKSA9PT0gdHJ1ZVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIERlbGV0aW5nIGFuIGFjdGl2ZSBlbnRpdHkgd2hpY2ggaGFzIGEgZHJhZnQgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBiZSBkaXNwbGF5ZWQgaW4gdGhlIExpc3RSZXBvcnQgKEZDTCBjYXNlKVxuXHRcdFx0XHQvLyAtLT4gbmVlZCB0byByZW1vdmUgdGhlIGRyYWZ0IGZyb20gdGhlIExSIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIGFjdGl2ZSB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBMaXN0QmluZGluZyBpcyBwcm9wZXJseSByZWZyZXNoZWRcblx0XHRcdFx0Ly8gVGhlIGNvbmRpdGlvbiAnb0NvbnRleHQuZ2V0SW5kZXgoKSA9PT0gdW5kZWZpbmVkJyBtYWtlcyBzdXJlIHRoZSBhY3RpdmUgdmVyc2lvbiBpc24ndCBhbHJlYWR5IGRpc3BsYXllZCBpbiB0aGUgTFJcblx0XHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSBhc3luYyAocGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfSk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZShwYXJhbWV0ZXJzKTtcblxuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRjb25zdCBtb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBzaWJsaW5nQ29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vU2libGluZ0VudGl0eWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRQYXRoID0gYXdhaXQgc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0Q29udGV4dFRvUmVtb3ZlID0gbW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChkcmFmdFBhdGgpO1xuXHRcdFx0XHRcdFx0ZHJhZnRDb250ZXh0VG9SZW1vdmUucmVwbGFjZVdpdGgob0NvbnRleHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXBsYWNpbmcgdGhlIGRyYWZ0IGluc3RhbmNlIGluIHRoZSBMUiBPRExCXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCB0aGlzLmRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblxuXHRcdFx0Ly8gU2luZ2xlIG9iamV0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGFuIE9QIGhlYWRlciBidXR0b24gKG5vdCBmcm9tIGEgbGlzdClcblx0XHRcdC8vIC0tPiBNYXJrIFVJIGRpcnR5IGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIGRpc21pc3MgdGhlIE9QXG5cdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dEJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChjb250ZXh0QmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRcdGlmIChjb250ZXh0QmluZGluZy5pc1Jvb3QoKSkge1xuXHRcdFx0XHRcdFx0Ly8gRXZlbiBpbiB0aGUgRkNMIGNhc2UsIHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgbGlzdGJpbmRpbmcgaW4gdGhlIExSIChub3QgT1ApIHRvIHVwZGF0ZSB0aGUgY291bnRzIGluIHRoZSB0YWJzIGFuZCBxdWlja2ZpbHRlcnNcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5yZWZyZXNoTGlzdEJpbmRpbmcoY29udGV4dEJpbmRpbmcsIG9BcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAobVBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzICE9PSBmYWxzZSkge1xuXHRcdFx0XHRcdFx0dGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZShjb250ZXh0QmluZGluZywgY29udGV4dEJpbmRpbmcuZ2V0Q29udGV4dCgpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRlbGV0ZSwgb0NvbnRleHQpO1xuXG5cdFx0XHQvLyBBZnRlciBkZWxldGUgaXMgc3VjY2Vzc2Z1bGwsIHdlIG5lZWQgdG8gZGV0YWNoIHRoZSBzZXRCYWNrTmF2aWdhdGlvbiBNZXRob2RzXG5cdFx0XHRhd2FpdCBvQXBwQ29tcG9uZW50Py5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHRcdGNvbnN0IGlzUmVjb21tZW5kYXRpb25FbmFibGVkID0gdGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pc1JlY29tbWVuZGF0aW9uRW5hYmxlZCgpO1xuXHRcdFx0Ly8gV2UgY2xlYXIgcmVjb21tZW5kYXRpb24gZGF0YSBhbmQgY29udGV4dHMgZnJvbSBpbnRlcm5hbCBtb2RlbCBmb3IgdGhlIGRlbGV0ZWQgY29udGV4dHNcblx0XHRcdGlmIChpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCkge1xuXHRcdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMoW29Db250ZXh0XSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBOb3RpZnkgY29uc3VtZXJzIG9mIHdoaWNoIGNvbnRleHRzIHdlcmUgZGVsZXRlZFxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEZWxldGUoeyBjb250ZXh0czogW29Db250ZXh0XSB9KTtcblxuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRpZiAob0FwcENvbXBvbmVudD8uZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuRGVlcGxpbmspIHtcblx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBhcHAgaGFzIGJlZW4gbGF1bmNoZWQgd2l0aCBzZW1hbnRpYyBrZXlzLCBkZWxldGluZyB0aGUgb2JqZWN0IHdlJ3ZlIGxhbmRlZCBvbiBzaGFsbCBuYXZpZ2F0ZSBiYWNrXG5cdFx0XHRcdFx0Ly8gdG8gdGhlIGFwcCB3ZSBjYW1lIGZyb20gKGV4Y2VwdCBmb3IgRkNMLCB3aGVyZSB3ZSBuYXZpZ2F0ZSB0byBMUiBhcyB1c3VhbClcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZXhpdEZyb21BcHAoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBFbHNlIG5hdmlnYXRlIGJhY2sgZnJvbSB0aGUgcGFnZS4gSW4gRkNMLCB0aGlzIGlzIGRvbmUgd2hlbiB0aGUga2VwdC1hbGl2ZSBjb250ZXh0IGlzIGRlc3Ryb3llZCAoY2FsbGJhY2spXG5cdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZXMoeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3VibWl0IHRoZSBjdXJyZW50IHNldCBvZiBjaGFuZ2VzIGFuZCBuYXZpZ2F0ZSBiYWNrLlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgY2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgYXBwbHlEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRpZiAob0NvbnRleHQuZ2V0TW9kZWwoKS5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdFx0Ly93ZSBuZWVkIHRvIHJlcXVlc3QgZm9yIHJlY29tbWVuZGF0aW9ucyBhbmQgdGhlbiBicmluZyB0aGUgZGlhbG9nIGhlcmVcblx0XHRcdH1cblx0XHRcdGNvbnN0IGlzQ29udGludWUgPSBhd2FpdCB0aGlzLnNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKGZhbHNlKTtcblx0XHRcdGlmIChpc0NvbnRpbnVlID09PSBSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uLkNvbnRpbnVlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCB7IGNhbGxFeHRlbnNpb246IHRydWUgfSk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb25dIEJvb2xlYW4gdmFsdWUgZm9yIHN0YXRpYyBhY3Rpb24sIHVuZGVmaW5lZCBmb3Igb3RoZXIgYWN0aW9uc1xuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5pc05hdmlnYWJsZV0gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkXG5cdC8vIEN1cnJlbnRseSB0aGUgcGFyYW1ldGVyIGlzTmF2aWdhYmxlIGlzIHVzZWQgaW50ZXJuYWxseSBhbmQgc2hvdWxkIGJlIGNoYW5nZWQgdG8gcmVxdWlyZXNOYXZpZ2F0aW9uIGFzIGl0IGlzIGEgbW9yZSBhcHQgbmFtZSBmb3IgdGhpcyBwYXJhbVxuXG5cdC8qKlxuXHQgKiBJbnZva2VzIGFuIGFjdGlvbiAoYm91bmQgb3IgdW5ib3VuZCkgYW5kIHRyYWNrcyB0aGUgY2hhbmdlcyBzbyB0aGF0IG90aGVyIHBhZ2VzIGNhbiBiZSByZWZyZXNoZWQgYW5kIHNob3cgdGhlIHVwZGF0ZWQgZGF0YSB1cG9uIG5hdmlnYXRpb24uXG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlcyBBbiBvcHRpb25hbCBhcnJheSBvZiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgYWN0aW9uIHBhcmFtZXRlcnMsIHdoZXJlIGVhY2ggb2JqZWN0IGhhcyBhIG5hbWUgb2Ygc3RyaW5nIHR5cGUgYW5kIGEgdmFsdWUgdGhhdCBjYW4gYmUgb2YgYW55IGRhdGEgdHlwZS5cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW0gaW4gcGFyYW1ldGVyVmFsdWVzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNvbnRleHRzIEZvciBhIGJvdW5kIGFjdGlvbiwgYSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubW9kZWwgRm9yIGFuIHVuYm91bmQgYWN0aW9uLCBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQuIE5hdmlnYXRpb24gdGFrZXMgcGxhY2UgdG8gdGhlIGNvbnRleHQgcmV0dXJuZWQgYnkgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5sYWJlbCBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uLiBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlIHRoZSBhY3Rpb24gaGFzIGEgcGFyYW1ldGVyIGFuZCBhIHBhcmFtZXRlciBkaWFsb2cgaXMgc2hvd24gdG8gdGhlIHVzZXIuIFRoZSBsYWJlbCB3aWxsIGJlIHVzZWQgZm9yIHRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGFuZCBmb3IgdGhlIGNvbmZpcm1hdGlvbiBidXR0b25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogJ0NoYW5nZVNldCcgdG8gcHV0IGFsbCBhY3Rpb24gY2FsbHMgaW50byBvbmUgY2hhbmdlc2V0LCAnSXNvbGF0ZWQnIHRvIHB1dCB0aGVtIGludG8gc2VwYXJhdGUgY2hhbmdlc2V0c1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5pc05hdmlnYWJsZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jb250cm9sSWQgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHRzIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZW5hYmxlQXV0b1Njcm9sbCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtRXh0cmFQYXJhbXMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb25jZSB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiBJZiByZXNvbHZlZCwgdGhlIHByb21pc2UgcmV0dXJuczpcblx0ICogIC0gSWYgdGhlIHBhcmFtZXRlciBjb250ZXh0cyBpcyBhbiBhcnJheTogYW4gYXJyYXkgb2Ygb2JqZWN0cywgZWFjaCBvYmplY3QgY29udGFpbmluZyBhIGtleSBcInN0YXR1c1wiLCBhcyB3ZWxsIGFzIFwidmFsdWVcIiByZWZlcmVuY2luZyB0aGUgYWN0aW9uIHN0YXR1cyBhbmQgdGhlIGNvbnRleHRcblx0ICogIC0gSWYgdGhlIHBhcmFtZXRlciBjb250ZXh0cyBpcyBub3QgYW4gYXJyYXk6IGEgc2luZ2xlIGNvbnRleHRcblx0ICogVGhlIGNvbnRleHQocykgcHJvdmlkZWQgaW4gdGhlIHByb21pc2UgaXMgKGFyZSkgZWl0aGVyIHRoZSByZXR1cm4gdmFsdWUgY29udGV4dCBvZiB0aGUgYWN0aW9uIG9yIHRoZSBib3VuZCBjb250ZXh0IGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgaW52b2tlQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVycz86IHtcblx0XHRcdHBhcmFtZXRlclZhbHVlcz86IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W107XG5cdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdGNvbnRleHRzPzogQ29udGV4dCB8IENvbnRleHRbXTtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHJlcXVpcmVzTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRiU3RhdGljQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdGFwcGxpY2FibGVDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdG5vdEFwcGxpY2FibGVDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGVuYWJsZUF1dG9TY3JvbGw/OiBib29sZWFuO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdH0sXG5cdFx0bUV4dHJhUGFyYW1zPzoge31cblx0KTogUHJvbWlzZTxcblx0XHR8IHtcblx0XHRcdFx0dmFsdWU6IENvbnRleHQ7XG5cdFx0XHRcdHN0YXR1czogXCJmdWxmaWxsZWRcIjtcblx0XHQgIH1bXVxuXHRcdHwgQ29udGV4dFxuXHQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRsZXQgYVBhcnRzO1xuXHRcdGxldCBzT3ZlcmxvYWRFbnRpdHlUeXBlO1xuXHRcdGxldCBvQ3VycmVudEFjdGlvbkNhbGxCYWNrczpcblx0XHRcdHwge1xuXHRcdFx0XHRcdGZSZXNvbHZlcjogRnVuY3Rpb247XG5cdFx0XHRcdFx0ZlJlamVjdG9yOiBGdW5jdGlvbjtcblx0XHRcdCAgfVxuXHRcdFx0fCB1bmRlZmluZWQ7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXG5cdFx0Ly8gRHVlIHRvIGEgbWlzdGFrZSB0aGUgaW52b2tlQWN0aW9uIGluIHRoZSBleHRlbnNpb25BUEkgaGFkIGEgZGlmZmVyZW50IEFQSSB0aGFuIHRoaXMgb25lLlxuXHRcdC8vIFRoZSBvbmUgZnJvbSB0aGUgZXh0ZW5zaW9uQVBJIGRvZXNuJ3QgZXhpc3QgYW55bW9yZSBhcyB3ZSBleHBvc2UgdGhlIGZ1bGwgZWRpdCBmbG93IG5vdyBidXRcblx0XHQvLyBkdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHN0aWxsIG5lZWQgdG8gc3VwcG9ydCB0aGUgb2xkIHNpZ25hdHVyZVxuXHRcdGlmIChcblx0XHRcdCgobUluUGFyYW1ldGVycyBhcyBDb250ZXh0KT8uaXNBICYmIChtSW5QYXJhbWV0ZXJzIGFzIENvbnRleHQpPy5pc0E8Q29udGV4dD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkgfHxcblx0XHRcdEFycmF5LmlzQXJyYXkobUluUGFyYW1ldGVycykgfHxcblx0XHRcdG1FeHRyYVBhcmFtcyAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBjb250ZXh0czogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgdW5kZWZpbmVkID0gbUluUGFyYW1ldGVycyBhcyBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCB1bmRlZmluZWQ7XG5cdFx0XHRtSW5QYXJhbWV0ZXJzID0gbUV4dHJhUGFyYW1zIHx8IHt9O1xuXHRcdFx0aWYgKGNvbnRleHRzKSB7XG5cdFx0XHRcdG1JblBhcmFtZXRlcnMuY29udGV4dHMgPSBjb250ZXh0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1JblBhcmFtZXRlcnMubW9kZWwgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgbVBhcmFtZXRlcnM6IHtcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdFx0YlN0YXRpY0FjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdGNvbnRleHRzPzogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgbnVsbDtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHZpZXc6IEZFVmlldztcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0XHRcdGFwcGxpY2FibGVDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdHJlcXVpcmVzTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRpc0NyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdGdyb3VwSWQ/OiBzdHJpbmc7XG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0XHRlbmFibGVBdXRvU2Nyb2xsPzogYm9vbGVhbjtcblx0XHRcdGlzQm91bmQ/OiBib29sZWFuO1xuXHRcdFx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdFx0fSA9IHsgLi4ubUluUGFyYW1ldGVycywgdmlldzogdGhpcy5iYXNlLmdldFZpZXcoKSB9IHx8IHsgdmlldzogdGhpcy5iYXNlLmdldFZpZXcoKSB9O1xuXG5cdFx0bVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUgPSBtUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gfHwgbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGU7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgdGhlIHJlZmVyZW5jZWQgYWN0aW9uIGlzIGJvdW5kIG9yIHVuYm91bmRcblx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IGNvbnZlcnRUeXBlcyh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCk7XG5cdFx0Ly8gVGhlIEVudGl0eUNvbnRhaW5lciBtYXkgTk9UIGJlIG1pc3NpbmcsIHNvIGl0IHNob3VsZCBub3QgYmUgYWJsZSB0byBiZSB1bmRlZmluZWQsIGJ1dCBzaW5jZSBpbiBvdXIgY29udmVydGVkIE1ldGFkYXRhXG5cdFx0Ly8gaXQgY2FuIGJlIHVuZGVmaW5lZCwgSSBuZWVkIHRoaXMgd29ya2Fyb3VuZCBoZXJlIG9mIGFkZGluZyBcIlwiIHNpbmNlIGluZGV4T2YgZG9lcyBub3QgYWNjZXB0IHNvbWV0aGluZyB0aGF0J3Ncblx0XHQvLyB1bmRlZmluZWQuXG5cdFx0aWYgKHNBY3Rpb25OYW1lLmluY2x1ZGVzKFwiXCIgKyBjb252ZXJ0ZWRNZXRhZGF0YS5lbnRpdHlDb250YWluZXIubmFtZSkpIHtcblx0XHRcdC8vIFVuYm91bmQgYWN0aW9ucyBhcmUgYWx3YXlzIHJlZmVyZW5jZWQgdmlhIHRoZSBhY3Rpb24gaW1wb3J0IGFuZCB3ZSBmb3VuZCB0aGUgRW50aXR5Q29udGFpbmVyIGluIHRoZSBzQWN0aW9uTmFtZSBzb1xuXHRcdFx0Ly8gYW4gdW5ib3VuZCBhY3Rpb24gaXMgcmVmZXJlbmNlZCFcblx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gZW50aXR5IGNvbnRhaW5lciBpbiB0aGUgc0FjdGlvbk5hbWUsIHNvIGVpdGhlciBhIGJvdW5kIG9yIHN0YXRpYyBhY3Rpb24gaXMgcmVmZXJlbmNlZCB3aGljaCBpcyBhbHNvIGJvdW5kIVxuXHRcdFx0bVBhcmFtZXRlcnMuaXNCb3VuZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCFtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lICYmIG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIG1QYXJhbWV0ZXJzLm1vZGVsKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lID0gbVBhcmFtZXRlcnMubW9kZWxcblx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdC5nZXRNZXRhQ29udGV4dCgoQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cykgPyBtUGFyYW1ldGVycy5jb250ZXh0c1swXSA6IG1QYXJhbWV0ZXJzLmNvbnRleHRzKS5nZXRQYXRoKCkpXG5cdFx0XHRcdC5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKTtcblx0XHR9XG5cdFx0bGV0IG9Db250cm9sOiBDb250cm9sIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChtUGFyYW1ldGVycy5jb250cm9sSWQpIHtcblx0XHRcdG9Db250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpIGFzIENvbnRyb2w7XG5cdFx0XHRpZiAob0NvbnRyb2wpIHtcblx0XHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoaXMgc2VsZWN0ZWQgY29udGV4dHMgdXBkYXRlIGlzIGRvbmUgd2l0aGluIHRoZSBvcGVyYXRpb24sIHNob3VsZCBiZSBtb3ZlZCBvdXRcblx0XHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHR9XG5cblx0XHQvLyBpZiBzdGlja3kgc2Vzc2lvbiBpcyBlbmFibGVkIHdlIHRyaWdnZXIgYWN0aW9ucyB3aXRob3V0IGVUYWdcblx0XHRtUGFyYW1ldGVycy5pZ25vcmVFVGFnID0gbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQ/LmdldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiKTtcblxuXHRcdGlmIChzQWN0aW9uTmFtZSAmJiBzQWN0aW9uTmFtZS5pbmNsdWRlcyhcIihcIikpIHtcblx0XHRcdC8vIGdldCBlbnRpdHkgdHlwZSBvZiBhY3Rpb24gb3ZlcmxvYWQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBhY3Rpb24gcGF0aFxuXHRcdFx0Ly8gRXhhbXBsZSBzQWN0aW9uTmFtZSA9IFwiPEFjdGlvbk5hbWU+KENvbGxlY3Rpb24oPE92ZXJsb2FkRW50aXR5VHlwZT4pKVwiXG5cdFx0XHQvLyBzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXSAtLT4gPEFjdGlvbk5hbWU+XG5cdFx0XHQvLyBzT3ZlcmxvYWRFbnRpdHlUeXBlID0gYVBhcnRzWzJdIC0tPiA8T3ZlcmxvYWRFbnRpdHlUeXBlPlxuXHRcdFx0YVBhcnRzID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIoXCIpO1xuXHRcdFx0c0FjdGlvbk5hbWUgPSBhUGFydHNbMF07XG5cdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlID0gYVBhcnRzW2FQYXJ0cy5sZW5ndGggLSAxXS5yZXBsYWNlQWxsKFwiKVwiLCBcIlwiKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbiAmJiBvQ29udHJvbCkge1xuXHRcdFx0aWYgKG9Db250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdGNvbnN0IHRhYmxlQVBJID0gb0NvbnRyb2wuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gdGFibGVBUEkuZ2V0Um93QmluZGluZygpLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNPdmVybG9hZEVudGl0eVR5cGUgJiYgb0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKSAmJiBvQ29udHJvbC5pc0EgJiYgb0NvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSB0aGlzLl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoKFxuXHRcdFx0XHRcdG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQsXG5cdFx0XHRcdFx0b0NvbnRyb2wuZ2V0Um93QmluZGluZygpLFxuXHRcdFx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmVuYWJsZUF1dG9TY3JvbGwpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MgPSB0aGlzLmNyZWF0ZUFjdGlvblByb21pc2Uoc0FjdGlvbk5hbWUsIG9Db250cm9sLmdldElkKCkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHQvL0V4ZWN1dGUgdGhlIHJlZ2lzdGVyZWQgZGVmZXJyZWQgU2lkZUVmZmVjdHMgYmVmb3JlIHRoZSBQT1NUIG9mIHRoZSBhY3Rpb25cblx0XHRcdGlmIChcblx0XHRcdFx0IUFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzPy5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIilcblx0XHRcdCkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuX3NpZGVFZmZlY3RzLmhhbmRsZVBhZ2VDaGFuZ2VDb250ZXh0KG1QYXJhbWV0ZXJzLmNvbnRleHRzKTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUV4ZWN1dGVBY3Rpb24oeyBjb250ZXh0czogbVBhcmFtZXRlcnMuY29udGV4dHMgfSk7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbGxBY3Rpb24oc0FjdGlvbk5hbWUsIG1QYXJhbWV0ZXJzLCB0aGlzLmdldEFwcENvbXBvbmVudCgpLCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkpO1xuXHRcdFx0Y29uc3Qgc3VjY2Vzc0Z1bGxFeGVjdXRpb24gPSByZXNwb25zZS5maWx0ZXIoaXNGdWxmaWxsZWQpO1xuXHRcdFx0aWYgKHJlc3BvbnNlLmxlbmd0aCAhPT0gc3VjY2Vzc0Z1bGxFeGVjdXRpb24ubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIEtlZXAgdGhlIHNhbWUgd29ya2Zsb3cgdGhhbiBiZWZvcmVcblx0XHRcdFx0Ly8gSWYgYXQgbGVhc3Qgb25lIHByb21pc2UgaXMgcmVqZWN0ZWQsIHdlIHJlamVjdCB0aGUgd2hvbGUgcHJvbWlzZVxuXHRcdFx0XHR0aHJvdyByZXNwb25zZTtcblx0XHRcdH1cblx0XHRcdGxldCBsaXN0UmVmcmVzaGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpICYmIG1QYXJhbWV0ZXJzLmlzQm91bmQgPT09IHRydWUpIHtcblx0XHRcdFx0bGlzdFJlZnJlc2hlZCA9IGF3YWl0IHRoaXMuX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRcdFx0XHR0aGlzLmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIHN1Y2Nlc3NGdWxsRXhlY3V0aW9uKSxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0c1swXVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSkge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoXG5cdFx0XHRcdFx0QWN0aXZpdHkuQWN0aW9uLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzLFxuXHRcdFx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0XHRcdGxpc3RSZWZyZXNoZWQsXG5cdFx0XHRcdFx0T2JqZWN0LmtleXMoc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUuYm91bmRDb250ZXh0LmdldE9iamVjdCgpKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWUsIFRyaWdnZXJUeXBlLmFjdGlvbik7XG5cblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVzb2x2ZXIoc3VjY2Vzc0Z1bGxFeGVjdXRpb24pO1xuXHRcdFx0fVxuXHRcdFx0Lypcblx0XHRcdFx0XHRXZSBzZXQgdGhlICh1cHBlcikgcGFnZXMgdG8gZGlydHkgYWZ0ZXIgYW4gZXhlY3V0aW9uIG9mIGFuIGFjdGlvblxuXHRcdFx0XHRcdFRPRE86IGdldCByaWQgb2YgdGhpcyB3b3JrYXJvdW5kXG5cdFx0XHRcdFx0VGhpcyB3b3JrYXJvdW5kIGlzIG9ubHkgbmVlZGVkIGFzIGxvbmcgYXMgdGhlIG1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHN5bmNocm9uaXphdGlvbi5cblx0XHRcdFx0XHRPbmNlIHRoaXMgaXMgc3VwcG9ydGVkIHdlIGRvbid0IG5lZWQgdG8gc2V0IHRoZSBwYWdlcyB0byBkaXJ0eSBhbnltb3JlIGFzIHRoZSBjb250ZXh0IGl0c2VsZlxuXHRcdFx0XHRcdGlzIGFscmVhZHkgcmVmcmVzaGVkIChpdCdzIGp1c3Qgbm90IHJlZmxlY3RlZCBpbiB0aGUgb2JqZWN0IHBhZ2UpXG5cdFx0XHRcdFx0d2UgZXhwbGljaXRseSBkb24ndCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gdGhlIGxpc3QgcmVwb3J0IGJ1dCBvbmx5IGNhbGwgaXQgZnJvbSB0aGUgb2JqZWN0IHBhZ2Vcblx0XHRcdFx0XHRhcyBpZiBpdCBpcyBjYWxsZWQgaW4gdGhlIGxpc3QgcmVwb3J0IGl0J3Mgbm90IG5lZWRlZCAtIGFzIHdlIGFueXdheSB3aWxsIHJlbW92ZSB0aGlzIGxvZ2ljXG5cdFx0XHRcdFx0d2UgY2FuIGxpdmUgd2l0aCB0aGlzXG5cdFx0XHRcdFx0d2UgbmVlZCBhIGNvbnRleHQgdG8gc2V0IHRoZSB1cHBlciBwYWdlcyB0byBkaXJ0eSAtIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHdlIHVzZSB0aGVcblx0XHRcdFx0XHRmaXJzdCBvbmUgYXMgdGhleSBhcmUgYW55d2F5IHNpYmxpbmdzXG5cdFx0XHRcdFx0Ki9cblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRpZiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLmNvbnZlcnRlclR5cGUgIT09IFwiTGlzdFJlcG9ydFwiKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlKSB7XG5cdFx0XHRcdGlmIChzdWNjZXNzRnVsbEV4ZWN1dGlvbi5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0ID0gdGhpcy5fZ2V0Qm91bmRDb250ZXh0KG9WaWV3LCBtUGFyYW1ldGVycylcblx0XHRcdFx0XHRcdD8gc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUuYm91bmRDb250ZXh0XG5cdFx0XHRcdFx0XHQ6IHN1Y2Nlc3NGdWxsRXhlY3V0aW9uWzBdLnZhbHVlLnJldHVybmVkQ29udGV4dCA/PyBzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5ib3VuZENvbnRleHQ7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdGNvbnN0IF9mblZhbGlkQ29udGV4dHMgPSAoY29udGV4dHM6IENvbnRleHRbXSwgYXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdKTogQ29udGV4dFtdID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBjb250ZXh0cy5maWx0ZXIoKGVsZW1lbnQpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKGFwcGxpY2FibGVDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBhcHBsaWNhYmxlQ29udGV4dHMuaW5jbHVkZXMoZWxlbWVudCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IG9BY3Rpb25Db250ZXh0ID0gQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cylcblx0XHRcdFx0XHRcdD8gX2ZuVmFsaWRDb250ZXh0cyhtUGFyYW1ldGVycy5jb250ZXh0cywgbVBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHRzKVswXVxuXHRcdFx0XHRcdFx0OiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHRcdFx0XHRjb25zdCBzQWN0aW9uQ29udGV4dE1ldGFQYXRoID0gb0FjdGlvbkNvbnRleHQgJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCkpO1xuXG5cdFx0XHRcdFx0aWYgKHNDb250ZXh0TWV0YVBhdGggIT0gdW5kZWZpbmVkICYmIHNDb250ZXh0TWV0YVBhdGggPT09IHNBY3Rpb25Db250ZXh0TWV0YVBhdGgpIHtcblx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dD8uZ2V0UGF0aCgpICE9PSBjb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChjb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHRydWVcblx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGFjdGlvbiByZXR1cm5zIGEgZHJhZnQgY29udGV4dCwgd2UgYWxyZWFkeSB0YWtlIGNhcmUgZHVyaW5nIG5hdmlnYXRpb24gdG8gZWl0aGVyIGNyZWF0ZSBhIG5ld1xuXHRcdFx0XHRcdFx0XHQvLyAoZnVsbCBzY3JlZW4pIG9yIHRvIHVzZSB0aGUgbGlzdCBiaW5kaW5nIGNvbnRleHQgYWZ0ZXIgcmVmcmVzaCAoYW5kIG5vdCB0aGUgcmV0dXJuIHZhbHVlIGNvbnRleHQpLlxuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgZHJhZnQgaXMgZGlzY2FyZGVkIG9yIGFjdGl2YXRlZCwgaGF2aW5nIHRoZSBjb250ZXh0IHN0aWxsIGFzIGRlcGVuZGVudCBjb250ZXh0IGNhdXNlIGlzc3Vlc1xuXHRcdFx0XHRcdFx0XHQvLyAoZS5nLiBpZiBhIHNpZGUgZWZmZWN0IGlzIHRyaWdnZXJlZCkuIFRoZXJlZm9yZSwgd2UgZGVzdHJveSB0aGUgcmV0dXJuIHZhbHVlIGNvbnRleHQgaGVyZSxcblx0XHRcdFx0XHRcdFx0Ly8gYW5kIHRvIGJlIGNvbXBhdGlibGUgd2UgcmV0dXJuIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgc2FtZSBwYXRoLlxuXHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmXG5cdFx0XHRcdFx0XHRcdFx0KGNvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2UgfHwgdGhpcy5faXNGY2xFbmFibGVkKCkpXG5cdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHQuZ2V0QmluZGluZygpLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0TG9nLmluZm8oXCJOYXZpZ2F0aW9uIHRvIHRoZSBzYW1lIGNvbnRleHQgaXMgbm90IGFsbG93ZWRcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckFjdGlvbkV4ZWN1dGlvbihzQWN0aW9uTmFtZSk7XG5cblx0XHRcdC8vIEtlZXAgdGhpcyB3ZWlyZCByZXR1cm5lZCB2YWx1ZSBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zXG5cdFx0XHQvLyBpbnZva2VBY3Rpb24gaXMgcHVibGljIGFuZCB3ZSBjYW4ndCBjaGFuZ2UgdGhlIHJldHVybmVkIHZhbHVlIGZvciB0aGUgYWN0aW9uXG5cdFx0XHRpZiAoIUFycmF5LmlzQXJyYXkobUluUGFyYW1ldGVycz8uY29udGV4dHMpICYmIHN1Y2Nlc3NGdWxsRXhlY3V0aW9uLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRyZXR1cm4gc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUucmV0dXJuZWRDb250ZXh0ID8/IHN1Y2Nlc3NGdWxsRXhlY3V0aW9uWzBdLnZhbHVlLmJvdW5kQ29udGV4dDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzdWNjZXNzRnVsbEV4ZWN1dGlvbi5tYXAoKG9SZXN1bHQpID0+IHtcblx0XHRcdFx0cmV0dXJuIHsgLi4ub1Jlc3VsdCwgLi4ueyB2YWx1ZTogb1Jlc3VsdC52YWx1ZS5yZXR1cm5lZENvbnRleHQgPz8gb1Jlc3VsdC52YWx1ZS5ib3VuZENvbnRleHQgfSB9O1xuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlamVjdG9yKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZXJyID09PSBDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkRpYWxvZyBjYW5jZWxsZWRcIik7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYWZ0ZXIgdGhlIGFjdGlvbiBleGVjdXRpb24uXG5cdCAqIEBwYXJhbSBfYWN0aW9uTmFtZSBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHNpbmNlIDEuMTE0LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckFjdGlvbkV4ZWN1dGlvbihfYWN0aW9uTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly90byBiZSBvdmVycmlkZGVuXG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgb24gdGhlIG1hc3MgZWRpdCBzYXZlLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBJZiB5b3UgZGVjaWRlIHRvIGRvIHlvdXIgb3duIHNhdmUgcHJvY2Vzc2luZywgeW91IGNhbiByZXR1cm4gYHRydWVgIHRvIHByZXZlbnQgdGhlIGRlZmF1bHQgc2F2ZSBiZWhhdmlvci5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZH0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGN1c3RvbU1hc3NFZGl0U2F2ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmFDb250ZXh0cyBBcnJheSBjb250YWluaW5nIHRoZSBzZWxlY3RlZCBjb250ZXh0cyBmb3IgdGhlIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLm9VcGRhdGVEYXRhIEEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eVBhdGggYW5kIGl0cyB2YWx1ZVxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgdG8gcHJldmVudCB0aGUgZGVmYXVsdCBleGVjdXRpb24sIGBmYWxzZWAgdG8ga2VlcCB0aGUgc3RhbmRhcmQgYmVoYXZpb3Jcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMzAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdGFzeW5jIGN1c3RvbU1hc3NFZGl0U2F2ZShfbVBhcmFtZXRlcnM6IHsgYUNvbnRleHRzOiBDb250ZXh0W107IG9VcGRhdGVEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNlY3VyZWQgZXhlY3V0aW9uIG9mIHRoZSBnaXZlbiBmdW5jdGlvbi4gRW5zdXJlcyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gY2VydGFpbiBjb25kaXRpb25zIGFyZSBmdWxmaWxsZWQuXG5cdCAqIEBwYXJhbSBmbkZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZC4gU2hvdWxkIHJldHVybiBhIHByb21pc2UgdGhhdCBpcyBzZXR0bGVkIGFmdGVyIGNvbXBsZXRpb24gb2YgdGhlIGV4ZWN1dGlvbi4gSWYgbm90aGluZyBpcyByZXR1cm5lZCwgaW1tZWRpYXRlIGNvbXBsZXRpb24gaXMgYXNzdW1lZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIERlZmluaXRpb25zIG9mIHRoZSBwcmVjb25kaXRpb25zIHRvIGJlIGNoZWNrZWQgYmVmb3JlIGV4ZWN1dGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeSBEZWZpbmVzIHRoZSBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5zZXQgVHJpZ2dlcnMgYSBidXN5IGluZGljYXRvciB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuY2hlY2sgRXhlY3V0ZXMgZnVuY3Rpb24gb25seSBpZiBhcHBsaWNhdGlvbiBpc24ndCBidXN5LlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudXBkYXRlc0RvY3VtZW50IFRoaXMgb3BlcmF0aW9uIHVwZGF0ZXMgdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2l0aG91dCB1c2luZyB0aGUgYm91bmQgbW9kZWwgYW5kIGNvbnRleHQuIEFzIGEgcmVzdWx0LCB0aGUgZHJhZnQgc3RhdHVzIGlzIHVwZGF0ZWQgaWYgYSBkcmFmdCBkb2N1bWVudCBleGlzdHMsIGFuZCB0aGUgdXNlciBoYXMgdG8gY29uZmlybSB0aGUgY2FuY2VsbGF0aW9uIG9mIHRoZSBlZGl0aW5nIHByb2Nlc3MuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkIGlmIHRoZSBleGVjdXRpb24gaXMgcHJvaGliaXRlZCBhbmQgcmVzb2x2ZWQgYnkgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGZuRnVuY3Rpb24uXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHNlY3VyZWRFeGVjdXRpb24oXG5cdFx0Zm5GdW5jdGlvbjogRnVuY3Rpb24sXG5cdFx0bVBhcmFtZXRlcnM/OiB7XG5cdFx0XHRidXN5Pzoge1xuXHRcdFx0XHRzZXQ/OiBib29sZWFuO1xuXHRcdFx0XHRjaGVjaz86IGJvb2xlYW47XG5cdFx0XHR9O1xuXHRcdFx0dXBkYXRlc0RvY3VtZW50PzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJCdXN5U2V0ID0gbVBhcmFtZXRlcnM/LmJ1c3k/LnNldCA/PyB0cnVlLFxuXHRcdFx0YkJ1c3lDaGVjayA9IG1QYXJhbWV0ZXJzPy5idXN5Py5jaGVjayA/PyB0cnVlLFxuXHRcdFx0YlVwZGF0ZXNEb2N1bWVudCA9IG1QYXJhbWV0ZXJzPy51cGRhdGVzRG9jdW1lbnQgPz8gZmFsc2UsXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLFxuXHRcdFx0b0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0YklzRHJhZnQgPSBvQ29udGV4dCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQgYXMgQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQsXG5cdFx0XHRtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXG5cdFx0aWYgKGJCdXN5Q2hlY2sgJiYgQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFwcGxpY2F0aW9uIGFscmVhZHkgYnVzeSB0aGVyZWZvcmUgZXhlY3V0aW9uIHJlamVjdGVkXCIpO1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgdG8gc2V0IGJ1c3kgYW5kIGRyYWZ0IGluZGljYXRvciBpbW1lZGlhdGVseSBhbHNvIHRoZSBmdW5jdGlvbiBtaWdodCBiZSBleGVjdXRlZCBsYXRlciBpbiBxdWV1ZVxuXHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHR9XG5cblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzayhmbkZ1bmN0aW9uIGFzICgpID0+IHVua25vd24gfCBQcm9taXNlPHVua25vd24+KVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGJJc0RyYWZ0KSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiB1bmtub3duKTogdm9pZCA9PiB7XG5cdFx0XHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0aWYgKGJCdXN5U2V0KSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgcGF0Y2hTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqIEBwYXJhbSBvRXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdGhhbmRsZVBhdGNoU2VudChvRXZlbnQ6IE9EYXRhQ29udGV4dEJpbmRpbmckUGF0Y2hTZW50RXZlbnQpOiB2b2lkIHtcblx0XHQvLyBJbiBjb2xsYWJvcmF0aXZlIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uLCBkaXNhYmxlIEVUYWcgY2hlY2sgZm9yIFBBVENIIHJlcXVlc3RzXG5cdFx0Y29uc3QgaW50ZXJuYWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3QgdWlDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwidWlcIik7XG5cdFx0Y29uc3QgaWdub3JlRVRhZyA9IHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSB8fCBpbnRlcm5hbENvbnRleHQuZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0aWYgKGlnbm9yZUVUYWcpIHtcblx0XHRcdCgob0V2ZW50LmdldFNvdXJjZSgpIGFzIEJpbmRpbmcpLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuc2V0SWdub3JlRVRhZyh0cnVlKTtcblx0XHR9XG5cdFx0aWYgKHVpQ29udGV4dD8uZ2V0UHJvcGVydHkoXCJpc0VkaXRhYmxlXCIpID09PSBmYWxzZSkge1xuXHRcdFx0Ly8gdGhlIHZpZXcgaXMgbm90IGluIGVkaXQgbW9kZSB0aGlzIG11c3QgYmUgaW5saW5lIGVkaXRcblx0XHRcdHRoaXMuYmFzZS5pbmxpbmVFZGl0Rmxvdy5oYW5kbGVJbmxpbmVFZGl0UGF0Y2hTZW50KG9FdmVudCk7XG5cdFx0fSBlbHNlIGlmICghaW50ZXJuYWxDb250ZXh0Py5nZXRQcm9wZXJ0eShcInNraXBQYXRjaEhhbmRsZXJzXCIpKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VCaW5kaW5nID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIHVua25vd24gYXMgT0RhdGFMaXN0QmluZGluZzsgLy8gRklYTUU6IFVJNSB0eXBlIHNheXMgdGhpcyBzaG91bGQgYmUgYW4gT0RhdGFDb250ZXh0QmluZGluZ1xuXHRcdFx0Ly8gQ3JlYXRlIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiB0aGUgcGF0aCBpcyBjb21wbGV0ZWRcblx0XHRcdGNvbnN0IG9QYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdG9FdmVudC5nZXRTb3VyY2UoKS5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCAocGF0Y2hDb21wbGV0ZWRFdmVudDogVUk1RXZlbnQ8eyBzdWNjZXNzOiBib29sZWFuIH0+KSA9PiB7XG5cdFx0XHRcdFx0Ly8gUmUtZW5hYmxlIEVUYWcgY2hlY2tzXG5cdFx0XHRcdFx0aWYgKGlnbm9yZUVUYWcpIHtcblx0XHRcdFx0XHRcdCgob0V2ZW50LmdldFNvdXJjZSgpIGFzIEJpbmRpbmcpLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuc2V0SWdub3JlRVRhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9FdmVudC5nZXRTb3VyY2UoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaChcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0XHRcdHNvdXJjZUJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBiU3VjY2VzcyA9IHBhdGNoQ29tcGxldGVkRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdFx0XHRpZiAoYlN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy51cGRhdGVEb2N1bWVudChzb3VyY2VCaW5kaW5nLCBvUGF0Y2hQcm9taXNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdGhhbmRsZUNyZWF0ZVNlbnQoZXZlbnQ6IFVJNUV2ZW50PHsgY29udGV4dDogQ29udGV4dCB9Pik6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRleHQgPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJjb250ZXh0XCIpO1xuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoZmFsc2UsIGZhbHNlLCBjb250ZXh0LmdldFBhdGgoKSk7XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgYSB0YXNrIGluIHN5bmMgd2l0aCBvdGhlciB0YXNrcyBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9taXNlIGNoYWluIG9mIHRoZSB0YXNrLlxuXHQgKiBAcGFyYW0gW25ld1Rhc2tdIE9wdGlvbmFsLCBhIHByb21pc2Ugb3IgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIHRhc2sgaXMgY29tcGxldGVkXG5cdCAqL1xuXHRhc3luYyBzeW5jVGFzazxUPihuZXdUYXNrPzogKCgpID0+IFQpIHwgUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuXHRcdGlmIChuZXdUYXNrKSB7XG5cdFx0XHRpZiAodHlwZW9mIG5ld1Rhc2sgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzLnRoZW4obmV3VGFzaykuY2F0Y2goZnVuY3Rpb24gKGVycjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy5kZWJ1ZyhlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzXG5cdFx0XHRcdFx0LnRoZW4oYXN5bmMgKCkgPT4gbmV3VGFzaylcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmRlYnVnKGVyciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrcyBhcyBQcm9taXNlPFQ+O1xuXHR9XG5cblx0LyoqXG5cdCAqIHVwZGF0ZXMgdGhlIFVJIGFuZCBpbnRlcm5hbCBtb2RlbHMgYWNjb3JkaW5nIHRoZSBlZGl0IG1vZGUgLlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgZGlzcGxheWVkIG9yIGVkaXRlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0IG1vZGUgaXMgY29tcHV0ZWRcblx0ICovXG5cblx0YXN5bmMgY29tcHV0ZU1vZGVsc0ZvckVkaXRNb2RlKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHRjb25zdCBnbG9iYWxNb2RlbCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlUGVuZGluZ1wiLCB0cnVlLCB1bmRlZmluZWQsIHRydWUpO1xuXG5cdFx0XHRcdGNvbnN0IG1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdFx0Y29uc3QgaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQgPSBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbCEuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdFx0XHRsZXQgZm9yY2VEaXNwbGF5TW9kZSA9IGZhbHNlO1xuXHRcdFx0XHRjb25zdCBpc0FjdGl2ZUVudGl0eSA9IGF3YWl0IGNvbnRleHQucmVxdWVzdE9iamVjdChcIklzQWN0aXZlRW50aXR5XCIpO1xuXG5cdFx0XHRcdGlmIChpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCkge1xuXHRcdFx0XHRcdGZvcmNlRGlzcGxheU1vZGUgPSAhKGF3YWl0IHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuYWN0aXZhdGVDb2xsYWJvcmF0aW9uKGNvbnRleHQsIGlzQWN0aXZlRW50aXR5KSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaGFzQ29sbGFib3JhdGlvbkF1dGhvcml6YXRpb25cIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmZldGNoQ29sbGFib3JhdGl2ZURyYWZ0VXNlcnNQcm9taXNlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoaXNBY3RpdmVFbnRpdHkgPT09IGZhbHNlICYmICFmb3JjZURpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdFx0Ly8gaW4gY2FzZSB0aGUgZG9jdW1lbnQgaXMgZHJhZnQsIHNldCBpdCBpbiBlZGl0IG1vZGVcblx0XHRcdFx0XHQvLyB1bmxlc3Mgd2UgZG9uJ3QgaGF2ZSB0aGUgYXV0aG9yaXphdGlvbiBmb3IgYSBjb2xsYWJvcmF0aXZlIHVzZXJcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTtcblx0XHRcdFx0XHRjb25zdCBoYXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBjb250ZXh0LnJlcXVlc3RPYmplY3QoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZSh1bmRlZmluZWQsICFoYXNBY3RpdmVFbnRpdHkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFjdGl2ZSBkb2N1bWVudCwgc3RheSBvbiBkaXNwbGF5IG1vZGVcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlUGVuZGluZ1wiLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRldGVybWluaW5nIHRoZSBlZGl0TW9kZSBmb3IgZHJhZnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBsYXN0SW52b2tlZEFjdGlvbk5hbWUgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiKTtcblx0XHRcdGlmIChsYXN0SW52b2tlZEFjdGlvbk5hbWUgJiYgdGhpcy5pc05ld0FjdGlvbkZvclN0aWNreShsYXN0SW52b2tlZEFjdGlvbk5hbWUsIGNvbnRleHQpKSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIHRydWUpO1xuXHRcdFx0XHRpZiAoIXRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPbihjb250ZXh0KTtcblx0XHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCksIGNvbnRleHQuZ2V0TW9kZWwoKSk7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHJpdmF0ZSBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIEludGVybmFsIG1ldGhvZCB0byBkZWxldGUgYSBjb250ZXh0IG9yIGFuIGFycmF5IG9mIGNvbnRleHRzLlxuXHQgKiBAcGFyYW0gY29udGV4dHMgVGhlIGNvbnRleHQocykgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBQYXJhbWV0ZXJzIGZvciBkZWxldGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFja1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY29udHJvbElkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm5vRGlhbG9nXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRpdGxlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRlc2NyaXB0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy51blNhdmVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oXG5cdFx0Y29udGV4dHM6IENvbnRleHQgfCBDb250ZXh0W10sXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM/OiBib29sZWFuO1xuXHRcdFx0bm9EaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0dGl0bGU/OiBzdHJpbmc7XG5cdFx0XHRkZXNjcmlwdGlvbj86IHN0cmluZyB8IHsgcGF0aDogc3RyaW5nIH07XG5cdFx0XHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHM/OiBudW1iZXI7XG5cdFx0XHR1blNhdmVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRsb2NrZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmU/OiBEcmFmdFNpYmxpbmdQYWlyW107XG5cdFx0XHRkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlPzogQ29udGV4dFtdO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0Ly8gYXMgc2VsZWN0ZWQgY29udGV4dHMgbWF5IGluY2x1ZGUgaW5hY3RpdmUgY29udGV4dCB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhpcyBwYXJhbWV0ZXIgYWdhaW4gdG8gZW5zdXJlIGRlbGV0ZSBoZWxwZXIgd29ya3MgcHJvcGVybHlcblx0XHRcdHBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID0gcGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzLmxlbmd0aDtcblx0XHR9XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IHRoaXMuX2dldFJlc291cmNlTW9kZWwoKTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdC8vIFRPRE86IHRoaXMgc2V0dGluZyBhbmQgcmVtb3Zpbmcgb2YgY29udGV4dHMgc2hvdWxkbid0IGJlIGluIHRoZSB0cmFuc2FjdGlvbiBoZWxwZXIgYXQgYWxsXG5cdFx0Ly8gZm9yIHRoZSB0aW1lIGJlaW5nIEkga2VwdCBpdCBhbmQgcHJvdmlkZSB0aGUgaW50ZXJuYWwgbW9kZWwgY29udGV4dCB0byBub3QgYnJlYWsgc29tZXRoaW5nXG5cdFx0aWYgKHBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VDb250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0XHRpZiAoc291cmNlQ29udHJvbCAmJiAhc291cmNlQ29udHJvbC5pc0E8TXVsdGlWYWx1ZUZpZWxkPihcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpKSB7XG5cdFx0XHRcdC8vIEluIGNhc2UgdGhlIGRlbGV0ZSBpcyB0cmlnZ2VyZWQgZnJvbSBhIE11bHRpVmFsdWVGaWVsZCwgd2UgZG9uJ3QgdXNlIHRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IGFzIHRoZSBNVkYgZG9lc24ndCBoYXZlXG5cdFx0XHRcdC8vIHN1Y2ggYSBjb250ZXh0IG9mIGl0cyBvd24sIGFuZCB3ZSBkb24ndCB3YW50IHRvIHVzZSBpdHMgcGFyZW50IGNvbnRleHQgKGUuZy4gZnJvbSB0aGUgZW1iZWRkaW5nIFRhYmxlKVxuXHRcdFx0XHRwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gc291cmNlQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5kZWxldGVEb2N1bWVudChjb250ZXh0cywgcGFyYW1ldGVycywgdGhpcy5nZXRBcHBDb21wb25lbnQoKSwgcmVzb3VyY2VNb2RlbCwgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpKTtcblx0fVxuXG5cdF9nZXRSZXNvdXJjZU1vZGVsKCk6IFJlc291cmNlTW9kZWwge1xuXHRcdHJldHVybiBnZXRSZXNvdXJjZU1vZGVsKHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTogdHlwZW9mIFRyYW5zYWN0aW9uSGVscGVyIHtcblx0XHRyZXR1cm4gVHJhbnNhY3Rpb25IZWxwZXI7XG5cdH1cblxuXHRwcml2YXRlIGdldE1lc3NhZ2VIYW5kbGVyKCk6IE1lc3NhZ2VIYW5kbGVyIHtcblx0XHRpZiAodGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSBoYW5kbGVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0SW50ZXJuYWxNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0R2xvYmFsVUlNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0UGFnZUludGVybmFsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJwYWdlSW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgY3VycmVudCBwYWdlIGNvbnRhaW5zIGEgbmV3bHkgY3JlYXRlZCBvYmplY3QuXG5cdCAqIEBwYXJhbSBiQ3JlYXRpb25Nb2RlIFRydWUgaWYgdGhlIG9iamVjdCBpcyBuZXdcblx0ICovXG5cdHByaXZhdGUgc2V0Q3JlYXRpb25Nb2RlKGJDcmVhdGlvbk1vZGU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCBwYWdlSW50ZXJuYWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJwYWdlSW50ZXJuYWxcIikgYXMgQ29udGV4dDtcblx0XHR0aGlzLmdldFBhZ2VJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5DcmVhdGVNb2RlLCBiQ3JlYXRpb25Nb2RlLCBwYWdlSW50ZXJuYWxDb250ZXh0LCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VycmVudCBwYWdlIGNvbnRhaW5zIGEgbmV3bHkgY3JlYXRlZCBvYmplY3Qgb3Igbm90LlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbmV3XG5cdCAqL1xuXHRnZXRDcmVhdGlvbk1vZGUoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgcGFnZUludGVybmFsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwicGFnZUludGVybmFsXCIpIGFzIENvbnRleHQ7XG5cdFx0cmV0dXJuICEhcGFnZUludGVybmFsQ29udGV4dC5nZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkNyZWF0ZU1vZGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIChvciBvbmUgb2YgaXRzIHN1Yi1vYmplY3RzKSBoYXMgYmVlbiBtb2RpZmllZCBvciBub3QuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZFxuXHQgKi9cblx0aXNEb2N1bWVudE1vZGlmaWVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhIXRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIChvciBvbmUgb2YgaXRzIHN1Yi1vYmplY3RzKSBoYXMgYmVlbiBtb2RpZmllZC5cblx0ICogQHBhcmFtIG1vZGlmaWVkIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXREb2N1bWVudE1vZGlmaWVkKG1vZGlmaWVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuc2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkLCBtb2RpZmllZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IGNyZWF0aW5nIGEgc3ViLW9iamVjdC5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgb24gd2hpY2ggdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRwcml2YXRlIHNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZShsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IHZvaWQge1xuXHRcdC8vIFNldCB0aGUgbW9kaWZpZWQgZmxhZyBvbmx5IG9uIHJlbGF0aXZlIGxpc3RCaW5kaW5ncywgaS5lLiB3aGVuIGNyZWF0aW5nIGEgc3ViLW9iamVjdFxuXHRcdC8vIElmIHRoZSBsaXN0QmluZGluZyBpcyBub3QgcmVsYXRpdmUsIHRoZW4gaXQncyBhIGNyZWF0aW9uIGZyb20gdGhlIExpc3RSZXBvcnQsIGFuZCBieSBkZWZhdWx0IGEgbmV3bHkgY3JlYXRlZCByb290IG9iamVjdCBpc24ndCBjb25zaWRlcmVkIGFzIG1vZGlmaWVkXG5cdFx0aWYgKGxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBjcmVhdGUgZXZlbnQ6IHNob3dzIG1lc3NhZ2VzIGFuZCBpbiBjYXNlIG9mIGEgZHJhZnQsIHVwZGF0ZXMgdGhlIGRyYWZ0IGluZGljYXRvci5cblx0ICogQHBhcmFtIGJpbmRpbmcgT0RhdGEgbGlzdCBiaW5kaW5nIG9iamVjdFxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVDcmVhdGVFdmVudHMoYmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IHZvaWQge1xuXHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChiaW5kaW5nKTtcblx0XHQvLyBXZSBzdG9yZSBrZXkgc2V0cyAoY29udGV4dCArIGtleSkgYXMgdGhlIGNyZWF0aW9uIGludGVyYWN0aW9uIG1pZ2h0IGludm9sdmUgbXVsdGlwbGUgY3JlYXRpb25zLlxuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleVNldHM6IHsgY29udGV4dDogQ29udGV4dDsgbWVzc2FnZUhhbmRsaW5nS2V5OiBzdHJpbmcgfVtdID0gW107XG5cblx0XHRiaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlU2VudFwiLCAoZXZlbnRJbnN0YW5jZTogVUk1RXZlbnQ8eyBzdWNjZXNzOiBib29sZWFuOyBjb250ZXh0OiBDb250ZXh0IH0+KTogdm9pZCA9PiB7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjb250ZXh0ID0gZXZlbnRJbnN0YW5jZS5nZXRQYXJhbWV0ZXIoXCJjb250ZXh0XCIpO1xuXHRcdFx0bGV0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IG1lc3NhZ2VIYW5kbGluZ0tleVNldHMuZmluZCgoaW5mbykgPT4gaW5mby5jb250ZXh0ID09PSBjb250ZXh0KT8ubWVzc2FnZUhhbmRsaW5nS2V5O1xuXHRcdFx0aWYgKCFtZXNzYWdlSGFuZGxpbmdLZXkpIHtcblx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nS2V5U2V0cy5wdXNoKHsgY29udGV4dCwgbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGJpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVDb21wbGV0ZWRcIiwgKG9FdmVudDogVUk1RXZlbnQ8eyBzdWNjZXNzOiBib29sZWFuOyBjb250ZXh0OiBDb250ZXh0IH0+KTogdm9pZCA9PiB7XG5cdFx0XHRjb25zdCBzdWNjZXNzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIiksXG5cdFx0XHRcdGNvbnRleHQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKTtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoc3VjY2VzcyA/IERyYWZ0U3RhdHVzLlNhdmVkIDogRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gbWVzc2FnZUhhbmRsaW5nS2V5U2V0cy5maW5kKChpbmZvKSA9PiBpbmZvLmNvbnRleHQgPT09IGNvbnRleHQpPy5tZXNzYWdlSGFuZGxpbmdLZXk7XG5cdFx0XHRpZiAobWVzc2FnZUhhbmRsaW5nS2V5KSB7XG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBtZXNzYWdlIChkaXNwbGF5ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSkuXG5cdCAqIEBwYXJhbSBkcmFmdFN0YXR1cyBUaGUgZHJhZnQgc3RhdHVzIG1lc3NhZ2Vcblx0ICovXG5cdHNldERyYWZ0U3RhdHVzKGRyYWZ0U3RhdHVzOiBzdHJpbmcpOiB2b2lkIHtcblx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWwpLnNldFByb3BlcnR5KFwiL2RyYWZ0U3RhdHVzXCIsIGRyYWZ0U3RhdHVzLCB1bmRlZmluZWQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb2dyYW1taW5nIG1vZGVsIGZyb20gYSBiaW5kaW5nIG9yIGEgY29udGV4dC5cblx0ICogQHBhcmFtIHNvdXJjZSBUaGUgYmluZGluZyBvciBjb250ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKi9cblx0cHJpdmF0ZSBnZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZTogQ29udGV4dCB8IEJpbmRpbmcpOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5nZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgZWRpdCBtb2RlLlxuXHQgKiBAcGFyYW0gZWRpdE1vZGUgVGhlIGVkaXQgbW9kZVxuXHQgKiBAcGFyYW0gaXNDcmVhdGlvbiBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbmV3bHkgY3JlYXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXRFZGl0TW9kZShlZGl0TW9kZT86IHN0cmluZywgaXNDcmVhdGlvbj86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBmcmVlc3R5bGUgdXNhZ2UgdGhlcmVmb3JlIHdlIGNhblxuXHRcdC8vIHJlbHkgb24gdGhlIGdsb2JhbCBVSSBtb2RlbCB0byBleGlzdFxuXHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHRpZiAoZWRpdE1vZGUpIHtcblx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIiwgZWRpdE1vZGUgPT09IFwiRWRpdGFibGVcIiwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdGlmIChlZGl0TW9kZSAhPT0gXCJFZGl0YWJsZVwiKSB7XG5cdFx0XHRcdHRoaXMuZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQoZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChpc0NyZWF0aW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFNpbmNlIHNldENyZWF0aW9uTW9kZSBpcyBwdWJsaWMgaW4gRWRpdEZsb3cgYW5kIGNhbiBiZSBvdmVycmlkZW4sIG1ha2Ugc3VyZSB0byBjYWxsIGl0IHZpYSB0aGUgY29udHJvbGxlclxuXHRcdFx0Ly8gdG8gZW5zdXJlIGFueSBvdmVycmlkZXMgYXJlIHRha2VuIGludG8gYWNjb3VudFxuXHRcdFx0dGhpcy5zZXRDcmVhdGlvbk1vZGUoaXNDcmVhdGlvbik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGZsYWcgdG8gZm9yY2UgU2F2ZSBvciBEaXNjYXJkIHdoZW4gbGVhdmluZyBhIGRyYWZ0LlxuXHQgKiBAcGFyYW0gZm9yY2VkXG5cdCAqL1xuXHRwcml2YXRlIGZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKGZvcmNlZDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFwiL2ZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkXCIsIGZvcmNlZCwgdW5kZWZpbmVkLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgd2Ugc2hvdWxkIGZvcmNlIHRoZSB1c2VyIHRvIFNhdmUgb3IgRGlzY2FyZCB3aGVuIGxlYXZpbmcgYSBkcmFmdCwgb3IgaWYga2VlcGluZyB0aGUgZHJhZnQgaXMgYWxsb3dlZC5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiBrZWVwaW5nIHRoZSBkcmFmdCBpcyBub3QgYWxsb3dlZFxuXHQgKi9cblx0c2hhbGxGb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvZm9yY2VEcmFmdFNhdmVPckRpc2NhcmRcIikgPT09IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGFuIGFjdGlvbiBjb3JyZXNwb25kcyB0byBhIGNyZWF0ZSBhY3Rpb24gZm9yIGEgc3RpY2t5IHNlc3Npb24uXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBmb3IgdGhlIHN0aWNreSBzZXNzaW9uXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGFjdGlvbiBpcyBhIGNyZWF0ZSBhY3Rpb25cblx0ICovXG5cdHByaXZhdGUgaXNOZXdBY3Rpb25Gb3JTdGlja3koYWN0aW9uTmFtZTogc3RyaW5nLCBjb250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkuc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdFx0Y29uc3Qgc3RpY2t5U2Vzc2lvbiA9IGVudGl0eVNldC5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkO1xuXHRcdFx0aWYgKHN0aWNreVNlc3Npb24/Lk5ld0FjdGlvbiA9PT0gYWN0aW9uTmFtZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChzdGlja3lTZXNzaW9uPy5BZGRpdGlvbmFsTmV3QWN0aW9ucyAmJiBzdGlja3lTZXNzaW9uPy5BZGRpdGlvbmFsTmV3QWN0aW9ucy5pbmNsdWRlcyhhY3Rpb25OYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvLyBUT0RPIE1vdmUgYWxsIHN0aWNreS1yZWxhdGVkIGJlbG93IHRvIGEgc3RpY2t5IHNlc3Npb24gbWFuYWdlciBjbGFzc1xuXG5cdC8qKlxuXHQgKiBFbmFibGVzIHRoZSBzdGlja3kgZWRpdCBzZXNzaW9uLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWRcblx0ICogQHJldHVybnMgVHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBoYW5kbGVTdGlja3lPbihjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T25cIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuaGFzTmF2aWdhdGlvbkd1YXJkKCkpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5yZWdpc3RlckNhbGxiYWNrcyhjb250ZXh0LCBhcHBDb21wb25lbnQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVycyBzZXNzaW9uIGNhbGxiYWNrcyBmb3IgZHJhZnQgaGFuZGxpbmcuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZFxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnRcblx0ICogQHBhcmFtIHNlbWFudGljUGF0aCBPcHRpb25hbCBzZW1hbnRpYyBwYXRoIGZvciBuYXZpZ2F0aW9uIGd1YXJkXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHJlZ2lzdGVyQ2FsbGJhY2tzKGNvbnRleHQ6IENvbnRleHQsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBzZW1hbnRpY1BhdGg/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBoYXNoVHJhY2tlciA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cblx0XHQvLyBTZXQgYSBndWFyZCBpbiB0aGUgUm91dGVyUHJveHlcblx0XHQvLyBBIHRpbWVvdXQgaXMgbmVjZXNzYXJ5LCBhcyB3aXRoIGRlZmVycmVkIGNyZWF0aW9uIHRoZSBoYXNoQ2hhbmdlciBpcyBub3QgdXBkYXRlZCB5ZXQgd2l0aFxuXHRcdC8vIHRoZSBuZXcgaGFzaCwgYW5kIHRoZSBndWFyZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSBvZiB0aGUgcm91dGVyIHByb3h5XG5cdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXROYXZpZ2F0aW9uR3VhcmQoY29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpLCBzZW1hbnRpY1BhdGgpO1xuXHRcdH0sIDApO1xuXG5cdFx0Ly8gU2V0dGluZyBiYWNrIG5hdmlnYXRpb24gb24gc2hlbGwgc2VydmljZSwgdG8gZ2V0IHRoZSBkaXNjYXJkIG1lc3NhZ2UgYm94IGluIGNhc2Ugb2Ygc3RpY2t5XG5cdFx0YXdhaXQgYXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbih0aGlzLm9uQmFja05hdmlnYXRpb25JblNlc3Npb24uYmluZCh0aGlzLCBjb250ZXh0KSk7XG5cblx0XHQvLyBBdHRhY2ggc3RpY2t5IHNlc3Npb24gY2FsbGJhY2tzXG5cdFx0Y29uc3QgaTE4bk1vZGVsID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpO1xuXHRcdGFwcENvbXBvbmVudC5yZWdpc3RlckNhbGxiYWNrcyhcblx0XHRcdHRoaXMuZ2V0RGlydHlTdGF0ZVByb3ZpZGVyKGFwcENvbXBvbmVudCwgaW50ZXJuYWxNb2RlbCwgaGFzaFRyYWNrZXIpLFxuXHRcdFx0dGhpcy5nZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbihjb250ZXh0LCBhcHBDb21wb25lbnQpLFxuXHRcdFx0IXRoaXMuX2hpZGRlbkRyYWZ0ID8gdGhpcy5nZXRTZXNzaW9uVGltZW91dEZ1bmN0aW9uKGNvbnRleHQsIGkxOG5Nb2RlbCkgOiB1bmRlZmluZWRcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuYWJsZXMgaGlkZGVuIGRyYWZ0IGVkaXQgc2Vzc2lvbiBoYW5kbGluZy5cblx0ICogU2V0cyB1cCB0aGUgbmVjZXNzYXJ5IHNlc3Npb24gY2FsbGJhY2tzIGFuZCBuYXZpZ2F0aW9uIGd1YXJkcyBmb3IgaGlkZGVuIGRyYWZ0IHNjZW5hcmlvcy5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkIGluIHRoZSBoaWRkZW4gZHJhZnQgc2Vzc2lvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0cnVlIGlmIHNlc3Npb24gc2V0dXAgc3VjY2VlZHMsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBoYW5kbGVIaWRkZW5EcmFmdEVkaXQoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZUhpZGRlbkRyYWZ0RWRpdFwiKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRW5zdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3QgY29udGV4dCBmb3IgaGlkZGVuIGRyYWZ0IGhhbmRsaW5nXG5cdFx0XHRsZXQgaGlkZGVuRHJhZnRDb250ZXh0OiBDb250ZXh0O1xuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRoaWRkZW5EcmFmdENvbnRleHQgPSBjb250ZXh0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGlkZGVuRHJhZnRDb250ZXh0ID0gY29udGV4dD8uZ2V0TW9kZWwoKS5nZXRLZWVwQWxpdmVDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdH1cblxuXHRcdFx0Ly9DcmVhdGUgY2FuIGJlIGhhbmRsZWQgZnJvbSBhbnkgY29udGV4dCwgYnV0IHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBndWFyZCBvbmx5IGZvciB0aGUgY3JlYXRlIGluIHJvb3QgQ29udGV4dC5cblx0XHRcdGlmICh0aGlzLmdldENyZWF0aW9uTW9kZSgpKSB7XG5cdFx0XHRcdGNvbnN0IHJvb3RDb250ZXh0UGF0aCA9IE1vZGVsSGVscGVyLmdldERyYWZ0Um9vdFBhdGgoaGlkZGVuRHJhZnRDb250ZXh0KTtcblx0XHRcdFx0aGlkZGVuRHJhZnRDb250ZXh0ID1cblx0XHRcdFx0XHRoaWRkZW5EcmFmdENvbnRleHQuZ2V0UGF0aCgpID09PSByb290Q29udGV4dFBhdGggPyBoaWRkZW5EcmFmdENvbnRleHQgOiBhd2FpdCB0aGlzLmdldFJvb3RDb250ZXh0KGhpZGRlbkRyYWZ0Q29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuaGFzTmF2aWdhdGlvbkd1YXJkKCkpIHtcblx0XHRcdFx0Y29uc3Qgc2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKGhpZGRlbkRyYWZ0Q29udGV4dCwgdHJ1ZSk/LnN1YnN0cmluZygxKTtcblx0XHRcdFx0YXdhaXQgdGhpcy5yZWdpc3RlckNhbGxiYWNrcyhoaWRkZW5EcmFmdENvbnRleHQsIGFwcENvbXBvbmVudCwgc2VtYW50aWNQYXRoKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICogQHJldHVybnMgVHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVTZXNzaW9uT2ZmKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChhcHBDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQgQXBwQ29tcG9uZW50IGZvciBmdW5jdGlvbiBoYW5kbGVTdGlja3lPZmZcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmRpc2NhcmROYXZpZ2F0aW9uR3VhcmQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC51bnJlZ2lzdGVyQ2FsbGJhY2tzKSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQudW5yZWdpc3RlckNhbGxiYWNrcygpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsKTogdm9pZCB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCB0cnVlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIG1vZGVsLmdldEh0dHBIZWFkZXJzKHRydWUpW1wiU0FQLUNvbnRleHRJZFwiXSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIGFzIGEgRGlydHlTdGF0ZVByb3ZpZGVyIGluIHRoZSBTaGVsbC5cblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gaW50ZXJuYWxNb2RlbCBUaGUgbW9kZWwgXCJpbnRlcm5hbFwiXG5cdCAqIEBwYXJhbSBoYXNoVHJhY2tlciBIYXNoIHRyYWNrZXJcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldERpcnR5U3RhdGVQcm92aWRlcihhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBoYXNoVHJhY2tlcjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIChuYXZpZ2F0aW9uQ29udGV4dDogeyBpbm5lckFwcFJvdXRlOiBzdHJpbmcgfSk6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKG5hdmlnYXRpb25Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgZm9yIERpcnR5U3RhdGVQcm92aWRlciBmdW5jdGlvblwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHRhcmdldEhhc2ggPSBuYXZpZ2F0aW9uQ29udGV4dC5pbm5lckFwcFJvdXRlO1xuXHRcdFx0XHRjb25zdCByb3V0ZXJQcm94eSA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXHRcdFx0XHRsZXQgbGNsSGFzaFRyYWNrZXIgPSBcIlwiO1xuXHRcdFx0XHRsZXQgaXNEaXJ0eTogYm9vbGVhbjtcblx0XHRcdFx0Y29uc3QgaXNTZXNzaW9uT24gPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiKTtcblxuXHRcdFx0XHRpZiAoIWlzU2Vzc2lvbk9uICYmICF0aGlzLl9oaWRkZW5EcmFmdCkge1xuXHRcdFx0XHRcdC8vIElmIHRoZSBzdGlja3kgc2Vzc2lvbiB3YXMgdGVybWluYXRlZCBiZWZvcmUgaGFuZC5cblx0XHRcdFx0XHQvLyBFeGFtcGxlIGluIGNhc2Ugb2YgbmF2aWdhdGluZyBhd2F5IGZyb20gYXBwbGljYXRpb24gdXNpbmcgSUJOLlxuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXJvdXRlclByb3h5LmlzTmF2aWdhdGlvbkZpbmFsaXplZCgpKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgaGFwcGVuaW5nIGluIFJvdXRlclByb3h5LCBpdCdzIGEgdHJhbnNpZW50IHN0YXRlXG5cdFx0XHRcdFx0Ly8gKG5vdCBkaXJ0eSlcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGhhc2hUcmFja2VyID09PSB0YXJnZXRIYXNoKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGhhc2ggZGlkbid0IGNoYW5nZSBzbyBlaXRoZXIgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gcmVmcmVzaCBvciB0byBsZWF2ZSB0aGUgYXBwXG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAocm91dGVyUHJveHkuY2hlY2tIYXNoV2l0aEd1YXJkKHRhcmdldEhhc2gpIHx8IHJvdXRlclByb3h5LmlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKSkge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgcm9vdCBvYmplY3Rcblx0XHRcdFx0XHQvLyBvciBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGFscmVhZHkgYmVlbiBhbGxvd2VkIGJ5IHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHRcdGxjbEhhc2hUcmFja2VyID0gdGFyZ2V0SGFzaDtcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5faGlkZGVuRHJhZnQgJiYgIXRoaXMuaXNEb2N1bWVudE1vZGlmaWVkKCkpIHtcblx0XHRcdFx0XHQvLyB0aGUgdXNlciBhdHRlbXB0cyB0byBuYXZpZ2F0ZSB3aXRoaW4gdGhlIGhpZGRlbiBkcmFmdCB3aGVuIHRoZSBkb2N1bWVudCBpcyBub3QgbW9kaWZpZWRcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgYXBwLCBmb3IgZXhhbXBsZSBiYWNrIHRvIHRoZSBsaXN0IHJlcG9ydFxuXHRcdFx0XHRcdGlzRGlydHkgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzRGlydHkpIHtcblx0XHRcdFx0XHQvLyB0aGUgRkxQIGRvZXNuJ3QgY2FsbCB0aGUgZGlydHkgc3RhdGUgcHJvdmlkZXIgYW55bW9yZSBvbmNlIGl0J3MgZGlydHksIGFzIHRoZXkgY2FuJ3Rcblx0XHRcdFx0XHQvLyBjaGFuZ2UgdGhpcyBkdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHNldCBpdCBiYWNrIHRvIG5vdC1kaXJ0eVxuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXREaXJ0eUZsYWcoZmFsc2UpO1xuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGhhc2hUcmFja2VyID0gbGNsSGFzaFRyYWNrZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gaXNEaXJ0eTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgdXNlZCB3aGVuIGEgc3RpY2t5IHNlc3Npb24gdGltZXMgb3V0LlxuXHQgKiBAcGFyYW0gc3RpY2t5Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHN0aWNreSBzZXNzaW9uXG5cdCAqIEBwYXJhbSBpMThuTW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24oc3RpY2t5Q29udGV4dDogQ29udGV4dCwgaTE4bk1vZGVsOiBNb2RlbCkge1xuXHRcdHJldHVybiAoKTogdW5kZWZpbmVkIHwgYm9vbGVhbiA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoc3RpY2t5Q29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBtaXNzaW5nIGZvciBTZXNzaW9uVGltZW91dCBmdW5jdGlvblwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyByZW1vdmUgdHJhbnNpZW50IG1lc3NhZ2VzIHNpbmNlIHdlIHdpbGwgc2hvd2luZyBvdXIgb3duIG1lc3NhZ2Vcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0XHRcdGNvbnN0IHdhcm5pbmdEaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHR0aXRsZTogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX1RJVExFfVwiLFxuXHRcdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0XHRjb250ZW50OiBuZXcgVGV4dCh7IHRleHQ6IFwie3NhcC5mZS5pMThuPkNfRURJVEZMT1dfT0JKRUNUX1BBR0VfU0VTU0lPTl9FWFBJUkVEX0RJQUxPR19NRVNTQUdFfVwiIH0pLFxuXHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IFwie3NhcC5mZS5pMThuPkNfQ09NTU9OX0RJQUxPR19PS31cIixcblx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0cHJlc3M6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIHN0aWNreSBoYW5kbGluZyBhZnRlciBuYXZpZ2F0aW9uIHNpbmNlIHNlc3Npb24gaGFzIGFscmVhZHkgYmVlbiB0ZXJtaW5hdGVkXG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFuZGxlU2Vzc2lvbk9mZigpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KHN0aWNreUNvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRcdHdhcm5pbmdEaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdhcm5pbmdEaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdHdhcm5pbmdEaWFsb2cuc2V0TW9kZWwoaTE4bk1vZGVsLCBcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGlzLmdldFZpZXcoKS5hZGREZXBlbmRlbnQod2FybmluZ0RpYWxvZyk7XG5cdFx0XHRcdHdhcm5pbmdEaWFsb2cub3BlbigpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgb25Sb3V0ZU1hdGNoZWQgZXZlbnQgaW4gY2FzZSBvZiBzdGlja3kgZWRpdGlvbi5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkIChyb290IG9mIHRoZSBzdGlja3kgc2Vzc2lvbilcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24oY29udGV4dDogQ29udGV4dCwgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXHRcdGNvbnN0IG1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IGNvbnRleHRQYXRoID0gY29udGV4dC5nZXRQYXRoKCk7XG5cdFx0cmV0dXJuIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdGNvbnN0IGN1cnJlbnRIYXNoID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0Ly8gSWYgdGhlIGN1cnJlbnQgaGFzaCBpcyBlbXB0eSBvciB0aGUgbmF2aWdhdGlvbiBpcyBvdXRzaWRlIHRoZSBndWFyZCwgZGlzY2FyZCB0aGUgc2Vzc2lvbi5cblx0XHRcdGlmICghY3VycmVudEhhc2ggfHwgIWFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmNoZWNrSGFzaFdpdGhHdWFyZChjdXJyZW50SGFzaCkpIHtcblx0XHRcdFx0aWYgKHRoaXMuX2hpZGRlbkRyYWZ0ICYmIHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5oYW5kbGVIaWRkZW5EcmFmdERpc2NhcmQoY29udGV4dCwgbW9kZWwsIGNvbnRleHRQYXRoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBGb3Igc3RpY2t5IHNlc3Npb24sIGRpc2NhcmQgY2hhbmdlcyBhbmQgY2xlYXIgc2Vzc2lvbiBjb250ZXh0LlxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dCk7XG5cdFx0XHRcdFx0Y29udGV4dC5nZXRNb2RlbCgpLmNsZWFyU2Vzc2lvbkNvbnRleHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgZGlzY2FyZCBwcm9jZXNzIGZvciBoaWRkZW4gZHJhZnQgc2Vzc2lvbnMuXG5cdCAqIFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbnN1cmVzIHdlIGhhdmUgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXMgYmVmb3JlIGRpc2NhcmRpbmcuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZC5cblx0ICogQHBhcmFtIG1vZGVsIFRoZSBPRGF0YSBtb2RlbCBpbnN0YW5jZSB1c2VkIGZvciBiaW5kaW5nIHRoZSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dFBhdGggVGhlIHBhdGggb2YgdGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBoaWRkZW4gZHJhZnQgc2Vzc2lvbiBpcyBkaXNjYXJkZWQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGhhbmRsZUhpZGRlbkRyYWZ0RGlzY2FyZChjb250ZXh0OiBPRGF0YVY0Q29udGV4dCwgbW9kZWw6IE9EYXRhTW9kZWwsIGNvbnRleHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBQcmVwYXJlIHRoZSBjb250ZXh0IGZvciBkaXNjYXJkIG9wZXJhdGlvblxuXHRcdGxldCBkaXNjYXJkQ29udGV4dDogQ29udGV4dDtcblx0XHRpZiAoY29udGV4dD8uZ2V0QmluZGluZygpKSB7XG5cdFx0XHRkaXNjYXJkQ29udGV4dCA9IGNvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRpc2NhcmRDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQoY29udGV4dFBhdGgsIHVuZGVmaW5lZCwge30pLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblxuXHRcdC8vIFJlcXVlc3QgbmVjZXNzYXJ5IHByb3BlcnRpZXMgYmVmb3JlIGRpc2NhcmRpbmcgdGhlIGRyYWZ0IHNlc3Npb24uXG5cdFx0YXdhaXQgZGlzY2FyZENvbnRleHQucmVxdWVzdFByb3BlcnR5KFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdKTtcblx0XHRyZXR1cm4gdGhpcy5kaXNjYXJkSGlkZGVuRHJhZnRTZXNzaW9uKGRpc2NhcmRDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNjYXJkcyB0aGUgY3VycmVudCBjb250ZXh0IGNoYW5nZXMgYW5kIHJlZnJlc2hlcyB0aGUgY29udGV4dCBpZiBpdCBpcyBub3QgYSBjcmVhdGlvbiBvcGVyYXRpb24uXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIGRpc2NhcmRlZC5cblx0ICogQHBhcmFtIGlzQ3JlYXRpb24gQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGNvbnRleHQgaXMgZm9yIGEgY3JlYXRpb24gb3BlcmF0aW9uLlxuXHQgKi9cblx0cHJpdmF0ZSBkaXNjYXJkQ29udGV4dChjb250ZXh0OiBDb250ZXh0LCBpc0NyZWF0aW9uOiBib29sZWFuKTogdm9pZCB7XG5cdFx0aWYgKGNvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdGNvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblx0XHRpZiAoIWlzQ3JlYXRpb24pIHtcblx0XHRcdGNvbnRleHQucmVmcmVzaCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFbmRzIGEgc3RpY2t5IHNlc3Npb24gYnkgZGlzY2FyZGluZyBjaGFuZ2VzLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgKHJvb3Qgb2YgdGhlIHN0aWNreSBzZXNzaW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgaXNDcmVhdGlvbiA9IHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCk7XG5cdFx0dGhpcy5oYW5kbGVTZXNzaW9uT2ZmKCk7XG5cblx0XHRjb25zdCBkaXNjYXJkZWRDb250ZXh0ID0gYXdhaXQgc3RpY2t5LmRpc2NhcmREb2N1bWVudChjb250ZXh0KTtcblx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dCAhPT0gdW5kZWZpbmVkICYmIGRpc2NhcmRlZENvbnRleHQgIT09IG51bGwpIHtcblx0XHRcdHRoaXMuZGlzY2FyZENvbnRleHQoZGlzY2FyZGVkQ29udGV4dCwgaXNDcmVhdGlvbik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERpc2NhcmRzIHRoZSBoaWRkZW4gZHJhZnQgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGZyb20gd2hpY2ggdGhlIGRyYWZ0IHNlc3Npb24gd2lsbCBiZSBkaXNjYXJkZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRpc2NhcmQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkaXNjYXJkSGlkZGVuRHJhZnRTZXNzaW9uKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBpc0NyZWF0aW9uID0gdGhpcy5nZXRDcmVhdGlvbk1vZGUoKTtcblx0XHRjb25zdCBkaXNjYXJkZWRDb250ZXh0ID0gKGF3YWl0IGRyYWZ0RGF0YUxvc3NQb3B1cC5kaXNjYXJkRHJhZnQoXG5cdFx0XHR0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRjb250ZXh0LFxuXHRcdFx0dHJ1ZVxuXHRcdCkpIGFzIENvbnRleHQ7XG5cdFx0aWYgKGRpc2NhcmRlZENvbnRleHQgIT09IHVuZGVmaW5lZCAmJiBkaXNjYXJkZWRDb250ZXh0ICE9PSBudWxsKSB7XG5cdFx0XHR0aGlzLmRpc2NhcmRDb250ZXh0KGRpc2NhcmRlZENvbnRleHQsIGlzQ3JlYXRpb24pO1xuXHRcdH1cblx0XHR0aGlzLmhhbmRsZVNlc3Npb25PZmYoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBpbnRlcm5hbCByb3V0aW5nIGV4dGVuc2lvbi5cblx0ICogQHJldHVybnMgVGhlIGludGVybmFsIHJvdXRpbmcgZXh0ZW5zaW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldEludGVybmFsUm91dGluZygpOiBJbnRlcm5hbFJvdXRpbmcge1xuXHRcdGlmICh0aGlzLmJhc2UuX3JvdXRpbmcpIHtcblx0XHRcdHJldHVybiB0aGlzLmJhc2UuX3JvdXRpbmc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgRmxvdyB3b3JrcyBvbmx5IHdpdGggYSBnaXZlbiByb3V0aW5nIGxpc3RlbmVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTogUm9vdFZpZXdCYXNlQ29udHJvbGxlciB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdH1cblxuXHRfZ2V0U2VtYW50aWNNYXBwaW5nKCk6IFNlbWFudGljTWFwcGluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRMYXN0U2VtYW50aWNNYXBwaW5nKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBwcm9taXNlIHRvIHdhaXQgZm9yIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZC5cblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udHJvbElkIFRoZSBJRCBvZiB0aGUgY29udHJvbFxuXHQgKiBAcmV0dXJucyBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXh0ZXJuYWxseSByZXNvbHZlIHRoZSBwcm9taXNlXG5cdCAqL1xuXHRwcml2YXRlIGNyZWF0ZUFjdGlvblByb21pc2UoYWN0aW9uTmFtZTogc3RyaW5nLCBjb250cm9sSWQ6IHN0cmluZyk6IHsgZlJlc29sdmVyOiBGdW5jdGlvbjsgZlJlamVjdG9yOiBGdW5jdGlvbiB9IHtcblx0XHRsZXQgcmVzb2x2ZUZ1bmN0aW9uOiBGdW5jdGlvbiwgcmVqZWN0RnVuY3Rpb246IEZ1bmN0aW9uO1xuXHRcdHRoaXMuYWN0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0PltdPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRyZXNvbHZlRnVuY3Rpb24gPSByZXNvbHZlO1xuXHRcdFx0cmVqZWN0RnVuY3Rpb24gPSByZWplY3Q7XG5cdFx0fSkudGhlbigocmVzcG9uc2U6IFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0PltdKSA9PiB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7IGNvbnRyb2xJZCB9LCB0aGlzLmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoYWN0aW9uTmFtZSwgcmVzcG9uc2UpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4geyBmUmVzb2x2ZXI6IHJlc29sdmVGdW5jdGlvbiEsIGZSZWplY3RvcjogcmVqZWN0RnVuY3Rpb24hIH07XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IGlzIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSByZXNwb25zZSBUaGUgYm91bmQgYWN0aW9uJ3MgcmVzcG9uc2UgZGF0YSBvciByZXNwb25zZSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGRhdGEgYW5kIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzIG9mIHRoZSByZXNwb25zZVxuXHQgKi9cblx0cHJpdmF0ZSBnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKFxuXHRcdGFjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRyZXNwb25zZTogUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W11cblx0KTogeyBvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuXHRcdGlmIChyZXNwb25zZS5sZW5ndGggPj0gMSkge1xuXHRcdFx0Y29uc3QgY3VycmVudFZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsRGF0YSA9IChjdXJyZW50Vmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldERhdGEoKSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRjb25zdCBtZXRhTW9kZWxBY3Rpb24gPSBtZXRhTW9kZWxEYXRhW2FjdGlvbk5hbWVdIGFzIE1ldGFNb2RlbEFjdGlvbltdIHwgdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgYWN0aW9uUmV0dXJuVHlwZSA9IG1ldGFNb2RlbEFjdGlvbj8uWzBdLiRSZXR1cm5UeXBlID8gbWV0YU1vZGVsQWN0aW9uPy5bMF0uJFJldHVyblR5cGUuJFR5cGUgOiBudWxsO1xuXHRcdFx0Y29uc3Qga2V5cyA9XG5cdFx0XHRcdGFjdGlvblJldHVyblR5cGUgJiYgKG1ldGFNb2RlbERhdGFbYWN0aW9uUmV0dXJuVHlwZV0gYXMgTWV0YU1vZGVsRW50aXR5VHlwZSlcblx0XHRcdFx0XHQ/IChtZXRhTW9kZWxEYXRhW2FjdGlvblJldHVyblR5cGVdIGFzIE1ldGFNb2RlbEVudGl0eVR5cGUpLiRLZXlcblx0XHRcdFx0XHQ6IFtdO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0b0RhdGE6IHJlc3BvbnNlWzBdLnZhbHVlLmJvdW5kQ29udGV4dC5nZXRPYmplY3QoKSxcblx0XHRcdFx0a2V5c1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGFzeW5jIGdldEN1cnJlbnRBY3Rpb25Qcm9taXNlKCk6IFByb21pc2U8eyBjb250cm9sSWQ/OiBzdHJpbmc7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfSB8IHVuZGVmaW5lZD4ge1xuXHRcdHJldHVybiB0aGlzLmFjdGlvblByb21pc2U7XG5cdH1cblxuXHRkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpOiB2b2lkIHtcblx0XHR0aGlzLmFjdGlvblByb21pc2UgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRhc3luYyBzaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyhpc1NhdmU6IGJvb2xlYW4pOiBQcm9taXNlPFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRpZiAoIXRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZykge1xuXHRcdFx0dGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nID0gbmV3IENvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZyh7XG5cdFx0XHRcdHZpZXc6IHRoaXMuZ2V0VmlldygpXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZz8ub3Blbihpc1NhdmUpO1xuXHR9XG5cblx0X3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyh0YWJsZTogVGFibGUpOiB2b2lkIHtcblx0XHRjb25zdCByb3dCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdGNvbnN0IGFjdGl2ZVJvd0luZGV4OiBudW1iZXIgPSByb3dCaW5kaW5nLmdldENvdW50KCkgfHwgMDtcblx0XHRpZiAodGFibGUuZGF0YShcInRhYmxlVHlwZVwiKSAhPT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdFx0aWYgKGFjdGl2ZVJvd0luZGV4ID4gMCkge1xuXHRcdFx0XHR0YWJsZS5zY3JvbGxUb0luZGV4KGFjdGl2ZVJvd0luZGV4IC0gMSk7XG5cdFx0XHR9XG5cdFx0XHR0YWJsZS5mb2N1c1JvdyhhY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8qIEluIGEgcmVzcG9uc2l2ZSB0YWJsZSwgdGhlIGVtcHR5IHJvd3MgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhYmxlLiBCdXQgd2hlbiB3ZSBjcmVhdGUgbW9yZSwgdGhleSBhcHBlYXIgYmVsb3cgdGhlIG5ldyBsaW5lLlxuXHRcdFx0ICogU28gd2UgY2hlY2sgdGhlIGZpcnN0IGluYWN0aXZlIHJvdyBmaXJzdCwgdGhlbiB3ZSBzZXQgdGhlIGZvY3VzIG9uIGl0IHdoZW4gd2UgcHJlc3MgdGhlIGJ1dHRvbi5cblx0XHRcdCAqIFRoaXMgZG9lc24ndCBpbXBhY3QgdGhlIEdyaWRUYWJsZSBiZWNhdXNlIHRoZXkgYXBwZWFyIGF0IHRoZSBlbmQsIGFuZCB3ZSBhbHJlYWR5IGZvY3VzIHRoZSBiZWZvcmUtdGhlLWxhc3Qgcm93IChiZWNhdXNlIDIgZW1wdHkgcm93cyBleGlzdClcblx0XHRcdCAqL1xuXHRcdFx0Y29uc3QgYWxsUm93Q29udGV4dHMgPSByb3dCaW5kaW5nLmdldEFsbEN1cnJlbnRDb250ZXh0cygpO1xuXHRcdFx0aWYgKCFhbGxSb3dDb250ZXh0cz8ubGVuZ3RoKSB7XG5cdFx0XHRcdHRhYmxlLmZvY3VzUm93KGFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGZvY3VzUm93ID0gYWN0aXZlUm93SW5kZXgsXG5cdFx0XHRcdGluZGV4ID0gMDtcblx0XHRcdGZvciAoY29uc3Qgc2luZ2xlQ29udGV4dCBvZiBhbGxSb3dDb250ZXh0cykge1xuXHRcdFx0XHRpZiAoc2luZ2xlQ29udGV4dC5pc0luYWN0aXZlKCkgJiYgaW5kZXggPCBmb2N1c1Jvdykge1xuXHRcdFx0XHRcdGZvY3VzUm93ID0gaW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdH1cblx0XHRcdGlmIChmb2N1c1JvdyA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChmb2N1c1Jvdyk7XG5cdFx0XHR9XG5cdFx0XHR0YWJsZS5mb2N1c1Jvdyhmb2N1c1JvdywgdHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgY3JlYXRlRW1wdHlSb3dzQW5kRm9jdXModGFibGU6IFRhYmxlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdGFibGVBUEkgPSB0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRpZiAoXG5cdFx0XHR0YWJsZUFQST8udGFibGVEZWZpbml0aW9uPy5jb250cm9sPy5pbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlICYmXG5cdFx0XHQhdGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJwYWdlSW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiY3JlYXRlTW9kZVwiKVxuXHRcdCkge1xuXHRcdFx0Ly8gV2l0aCB0aGUgcGFyYW1ldGVyLCB3ZSBkb24ndCBoYXZlIGVtcHR5IHJvd3MgaW4gRWRpdCBtb2RlLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGVtIGJlZm9yZSBzZXR0aW5nIHRoZSBmb2N1cyBvbiB0aGVtXG5cdFx0XHRhd2FpdCB0YWJsZUFQSS5zZXRVcEVtcHR5Um93cyh0YWJsZSwgdHJ1ZSk7XG5cdFx0fVxuXHRcdHRoaXMuX3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyh0YWJsZSk7XG5cdH1cblxuXHRfc2VuZEFjdGl2aXR5KFxuXHRcdGFjdGlvbjogQWN0aXZpdHksXG5cdFx0cmVsYXRlZENvbnRleHRzOiBDb250ZXh0IHwgQ29udGV4dFtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcblx0XHR0cmlnZ2VyZWRBY3Rpb25OYW1lPzogc3RyaW5nLFxuXHRcdHJlZnJlc2hMaXN0QmluZGluZz86IGJvb2xlYW4sXG5cdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcz86IHN0cmluZ1tdXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBBcnJheS5pc0FycmF5KHJlbGF0ZWRDb250ZXh0cykgPyByZWxhdGVkQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSkgOiByZWxhdGVkQ29udGV4dHM/LmdldFBhdGgoKTtcblx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LnNlbmQoeyBhY3Rpb24sIGNvbnRlbnQsIHRyaWdnZXJlZEFjdGlvbk5hbWUsIHJlZnJlc2hMaXN0QmluZGluZywgYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyB9KTtcblx0fVxuXG5cdF90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShzQWN0aW9uTmFtZTogc3RyaW5nLCB0cmlnZ2VyVHlwZTogVHJpZ2dlclR5cGUpOiB2b2lkIHtcblx0XHR0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSh0aGlzLmJhc2UuZ2V0VmlldygpLCBzQWN0aW9uTmFtZSwgdHJpZ2dlclR5cGUpO1xuXHR9XG5cblx0YXN5bmMgX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gU3VibWl0IGFueSBsZWZ0b3ZlciBjaGFuZ2VzIHRoYXQgYXJlIG5vdCB5ZXQgc3VibWl0dGVkXG5cdFx0XHQvLyBDdXJyZW50bHkgd2UgYXJlIHVzaW5nIG9ubHkgMSB1cGRhdGVHcm91cElkLCBoZW5jZSBzdWJtaXR0aW5nIHRoZSBiYXRjaCBkaXJlY3RseSBoZXJlXG5cdFx0XHRhd2FpdCBvTW9kZWwuc3VibWl0QmF0Y2goXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gV2FpdCBmb3IgYWxsIGN1cnJlbnRseSBydW5uaW5nIGNoYW5nZXNcblx0XHRcdC8vIEZvciB0aGUgdGltZSBiZWluZyB3ZSBhZ3JlZWQgd2l0aCB0aGUgdjQgbW9kZWwgdGVhbSB0byB1c2UgYW4gaW50ZXJuYWwgbWV0aG9kLiBXZSdsbCByZXBsYWNlIGl0IG9uY2Vcblx0XHRcdC8vIGEgcHVibGljIG9yIHJlc3RyaWN0ZWQgbWV0aG9kIHdhcyBwcm92aWRlZFxuXHRcdFx0YXdhaXQgKG9Nb2RlbC5vUmVxdWVzdG9yIGFzIHVua25vd24gYXMgeyB3YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzOiBGdW5jdGlvbiB9KS53YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIENoZWNrIGlmIGFsbCBjaGFuZ2VzIHdlcmUgc3VibWl0dGVkIHN1Y2Nlc3NmdWxseVxuXHRcdFx0aWYgKG9Nb2RlbC5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInN1Ym1pdCBvZiBvcGVuIGNoYW5nZXMgZmFpbGVkXCIpO1xuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgZmFsc2UpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zdGlja3lTZXNzaW9uVG9rZW5cIiwgdW5kZWZpbmVkKTtcblx0XHRcdHRoaXMuaGFuZGxlU2Vzc2lvbk9mZigpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGlzcGxheSBhICdkaXNjYXJkJyBwb3BvdmVyIHdoZW4gZXhpdGluZyBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKiBAcGFyYW0gY29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKGNvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCByb3V0ZXJQcm94eSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmIChyb3V0ZXJQcm94eS5jaGVja0lmQmFja0lzT3V0T2ZHdWFyZCgpKSB7XG5cdFx0XHRzdGlja3kucHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KTtcblx0XHRcdFx0XHRoaXN0b3J5LmJhY2soKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dmlldyxcblx0XHRcdFx0UHJvZ3JhbW1pbmdNb2RlbC5TdGlja3lcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aGlzdG9yeS5iYWNrKCk7XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlTmV3Q29udGV4dChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyczogeyBlZGl0YWJsZTogYm9vbGVhbjsgcmVjcmVhdGVDb250ZXh0OiBib29sZWFuOyBmb3JjZUZvY3VzPzogYm9vbGVhbiB9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0cGVyc2lzdE9QU2Nyb2xsOiB0cnVlLFxuXHRcdFx0cmVjcmVhdGVDb250ZXh0OiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWNyZWF0ZUNvbnRleHQsXG5cdFx0XHRyZWFzb246IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IGZhbHNlLFxuXHRcdFx0Zm9yY2VGb2N1czogbmF2aWdhdGlvblBhcmFtZXRlcnMuZm9yY2VGb2N1cyA/PyBmYWxzZSxcblx0XHRcdGtlZXBDdXJyZW50TGF5b3V0OiB0cnVlXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIChwYXJzZSkgZXJyb3JzIGZvciBjb250cm9scyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3XG5cdCAqIEBwYXJhbSBwYXJhbXMgVGhlIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIHBhcmFtcy5jb250cm9sSWQgVGhlIElEIG9mIHRoZSBjb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbXMuaXNOYXZpZ2FibGUgVHJ1ZSBpZiB0aGUgYWN0aW9uIGlzIG5hdmlnYWJsZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhY3Rpb24gbmVlZHMgdG8gcmV0dXJucyB0aGUgYm91bmQgY29udGV4dCwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRfZ2V0Qm91bmRDb250ZXh0KHZpZXc6IEZFVmlldywgcGFyYW1zOiB7IGNvbnRyb2xJZD86IHN0cmluZzsgaXNOYXZpZ2FibGU/OiBib29sZWFuIH0pOiBib29sZWFuIHtcblx0XHQvL1RoaXMgd2VpcmQgY29uZGl0aW9uIGlzIG5lZWRlZCB0byBhdm9pZCBuYXZpZ2F0aW9uIGluIGNhc2Ugb2Ygc29tZSBhY3Rpb25zIGludG8gdGhlIHRhYmxlXG5cdFx0Ly8gdGhpcyBkZWZpbml0ZWx5IG5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgdG8gZ2V0IGNsZWFyIGNvbmRpdGlvbiB3aGVyZSBuYXZpZ2F0aW9uIG5lZWRzIHRvIGJlIGRvbmUgb3Igbm90XG5cdFx0Ly8gU05PVzogRElOQzAyNzg0OTBcblx0XHRjb25zdCB2aWV3TGV2ZWwgPSB2aWV3LmdldFZpZXdEYXRhKCkudmlld0xldmVsO1xuXHRcdGNvbnN0IGJSZWZyZXNoQWZ0ZXJBY3Rpb24gPSB2aWV3TGV2ZWwgPiAxIHx8ICh2aWV3TGV2ZWwgPT09IDEgJiYgcGFyYW1zLmNvbnRyb2xJZCk7XG5cdFx0cmV0dXJuICFwYXJhbXMuaXNOYXZpZ2FibGUgfHwgISFiUmVmcmVzaEFmdGVyQWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiAocGFyc2UpIGVycm9ycyBmb3IgY29udHJvbHMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIGlmIHRoZXJlIGFyZSBubyB2YWxpZGF0aW9uIGVycm9ycywgYW5kIHJlamVjdHMgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gZXJyb3JzXG5cdCAqL1xuXG5cdGFzeW5jIF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQgfCB2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soKS50aGVuKCgpID0+IHtcblx0XHRcdGNvbnN0IHZpc2libGVWaWV3SWRzID0gdGhpcy5faXNGY2xFbmFibGVkKClcblx0XHRcdFx0PyAodGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgRmNsQ29udHJvbGxlcikuX2dldEFsbFZpc2libGVWaWV3cygpLm1hcCgodmlldykgPT4gdmlldy5nZXRJZCgpKVxuXHRcdFx0XHQ6IFt0aGlzLmdldFZpZXcoKS5nZXRJZCgpXTtcblx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRsZXQgb0NvbnRyb2w7XG5cblx0XHRcdGlmICghYU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRMb2cuaW5mbyhcIk5vIHZhbGlkYXRpb24gZXJyb3JzIGZvdW5kXCIpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgbWVzc2FnZSBvZiBhTWVzc2FnZXMpIHtcblx0XHRcdFx0aWYgKG1lc3NhZ2UudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9Db250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChtZXNzYWdlLmdldENvbnRyb2xJZCgpKTtcblx0XHRcdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGlmICh2aXNpYmxlVmlld0lkcy5pbmNsdWRlcyhvQ29udHJvbC5nZXRJZCgpKSkge1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBcInZhbGlkYXRpb24gZXJyb3JzIGV4aXN0XCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvQ29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9mIHRoZSBib3VuZCBhY3Rpb24gYW5kIHRoZSBuYW1lcyBvZiB0aGUga2V5IGZpZWxkc1xuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlLm9EYXRhXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2Uua2V5c1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJvdW5kIGNvbnRleHQgb24gd2hpY2ggdGhlIGFjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgVHJ1ZSBQcm9taXNlIGlmIHRoZSBsaXN0IHdhcyByZWZyZXNoZWRcblx0ICovXG5cdGFzeW5jIF9yZWZyZXNoTGlzdElmUmVxdWlyZWQoXG5cdFx0b1Jlc3BvbnNlPzogeyBvRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzPzogc3RyaW5nW10gfCBudWxsIH0sXG5cdFx0b0NvbnRleHQ/OiBDb250ZXh0XG5cdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICghb0NvbnRleHQgfHwgIW9SZXNwb25zZSB8fCAhb1Jlc3BvbnNlLm9EYXRhIHx8ICFvUmVzcG9uc2Uua2V5cykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCBvQmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHQvLyByZWZyZXNoIG9ubHkgbGlzdHNcblx0XHRpZiAob0JpbmRpbmcgJiYgb0JpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9SZXNwb25zZS5vRGF0YTtcblx0XHRcdGNvbnN0IGFLZXlzID0gb1Jlc3BvbnNlLmtleXM7XG5cdFx0XHRjb25zdCBvQ3VycmVudERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdGxldCBiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gdHJ1ZTtcblx0XHRcdC8vIGVuc3VyZSBjb250ZXh0IGlzIGluIHRoZSByZXNwb25zZVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db250ZXh0RGF0YSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGNoZWNrIGlmIGNvbnRleHQgaW4gcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGJvdW5kIGNvbnRleHRcblx0XHRcdFx0YlJldHVybmVkQ29udGV4dElzU2FtZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1cnJlbnREYXRhW3NLZXldID09PSBvQ29udGV4dERhdGFbc0tleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkucmVmcmVzaExpc3RCaW5kaW5nKG9CaW5kaW5nLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyByZXNvbHZlIHdpdGggb1Jlc3BvbnNlIHRvIG5vdCBkaXN0dXJiIHRoZSBwcm9taXNlIGNoYWluIGFmdGVyd2FyZHNcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRhc3luYyBfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c0VudGl0eVNldE5hbWUgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIiksXG5cdFx0XHRhU2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNFbnRpdHlTZXROYW1lKTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzICYmIGFTZW1hbnRpY0tleXMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBwYXRocyA9IGFTZW1hbnRpY0tleXMubWFwKChvS2V5KSA9PiBvS2V5LiRQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0YXdhaXQgb0NvbnRleHQucmVxdWVzdFByb3BlcnR5KHBhdGhzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvdmlkZXMgdGhlIGxhdGVzdCBjb250ZXh0IGluIHRoZSBtZXRhZGF0YSBoaWVyYXJjaHkgZnJvbSByb290QmluZGluZyB0byBnaXZlbiBjb250ZXh0IHBvaW50aW5nIHRvIGdpdmVuIGVudGl0eVR5cGVcblx0ICogaWYgYW55IHN1Y2ggY29udGV4dCBleGlzdHMuIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0aGUgb3JpZ2luYWwgY29udGV4dC5cblx0ICogTm90ZTogSXQgaXMgb25seSBuZWVkZWQgYXMgd29yay1hcm91bmQgZm9yIGluY29ycmVjdCBtb2RlbGxpbmcuIENvcnJlY3QgbW9kZWxsaW5nIHdvdWxkIGltcGx5IGEgRGF0YUZpZWxkRm9yQWN0aW9uIGluIGEgTGluZUl0ZW1cblx0ICogdG8gcG9pbnQgdG8gYW4gb3ZlcmxvYWQgZGVmaW5lZCBlaXRoZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgRW50aXR5VHlwZSBvciBhIGNvbGxlY3Rpb24gb2YgdGhlIHNhbWUuXG5cdCAqIEBwYXJhbSByb290Q29udGV4dCBUaGUgY29udGV4dCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3RCaW5kaW5nIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gb3ZlcmxvYWRFbnRpdHlUeXBlIFRoZSBBY3Rpb25PdmVybG9hZCBlbnRpdHkgdHlwZSB0byBzZWFyY2ggZm9yXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIEFjdGlvbk92ZXJsb2FkIGVudGl0eVxuXHQgKi9cblx0X2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgocm9vdENvbnRleHQ6IENvbnRleHQsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBvdmVybG9hZEVudGl0eVR5cGU6IHN0cmluZyk6IENvbnRleHQge1xuXHRcdGNvbnN0IG1vZGVsOiBPRGF0YU1vZGVsID0gcm9vdENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IGNvbnRleHRTZWdtZW50czogc3RyaW5nW10gPSBsaXN0QmluZGluZy5nZXRQYXRoKCkuc3BsaXQoXCIvXCIpO1xuXHRcdGxldCBjdXJyZW50Q29udGV4dDogQ29udGV4dCA9IHJvb3RDb250ZXh0O1xuXG5cdFx0Ly8gV2UgZXhwZWN0IHRoYXQgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgbGlzdEJpbmRpbmcgaXMgdGhlIExpc3RCaW5kaW5nIG9mIHRoZSB0YWJsZS4gUmVtb3ZlIHRoaXMgZnJvbSBjb250ZXh0U2VnbWVudHNcblx0XHQvLyBiZWNhdXNlIGl0IGlzIGluY29ycmVjdCB0byBleGVjdXRlIGJpbmRDb250ZXh0IG9uIGEgbGlzdC4gV2UgZG8gbm90IGFueXdheSBuZWVkIHRvIHNlYXJjaCB0aGlzIGNvbnRleHQgZm9yIHRoZSBvdmVybG9hZC5cblx0XHRjb250ZXh0U2VnbWVudHMucG9wKCk7XG5cdFx0aWYgKGNvbnRleHRTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnRleHRTZWdtZW50cyA9IFtcIlwiXTsgLy8gRG9uJ3QgbGVhdmUgY29udGV4dFNlZ21lbnRzIHVuZGVmaW5lZFxuXHRcdH1cblxuXHRcdGlmIChjb250ZXh0U2VnbWVudHNbMF0gIT09IFwiXCIpIHtcblx0XHRcdGNvbnRleHRTZWdtZW50cy51bnNoaWZ0KFwiXCIpOyAvLyB0byBhbHNvIGdldCB0aGUgcm9vdCBjb250ZXh0LCBpLmUuIHRoZSBiaW5kaW5nQ29udGV4dCBvZiB0aGUgdGFibGVcblx0XHR9XG5cdFx0Ly8gbG9hZCBhbGwgdGhlIHBhcmVudCBjb250ZXh0cyBpbnRvIGFuIGFycmF5XG5cdFx0Y29uc3QgcGFyZW50Q29udGV4dHM6IENvbnRleHRbXSA9IGNvbnRleHRTZWdtZW50c1xuXHRcdFx0Lm1hcCgocGF0aFNlZ21lbnQ6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRpZiAocGF0aFNlZ21lbnQgIT09IFwiXCIpIHtcblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KHBhdGhTZWdtZW50LCBjdXJyZW50Q29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQ3JlYXRpbmcgYSBuZXcgY29udGV4dCB1c2luZyBiaW5kQ29udGV4dCguLi4pLmdldEJvdW5kQ29udGV4dCgpIGRvZXMgbm90IHdvcmsgaWYgdGhlIGV0YWcgaXMgbmVlZGVkLiBBY2NvcmRpbmcgdG8gbW9kZWwgY29sbGVhZ3Vlcyxcblx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgYWx3YXlzIHVzZSBhbiBleGlzdGluZyBjb250ZXh0IGlmIHBvc3NpYmxlLlxuXHRcdFx0XHRcdC8vIEN1cnJlbnRseSwgdGhlIG9ubHkgZXhhbXBsZSB3ZSBrbm93IGFib3V0IGlzIHVzaW5nIHRoZSByb290Q29udGV4dCAtIGFuZCBpbiB0aGlzIGNhc2UsIHdlIGNhbiBvYnZpb3VzbHkgcmV1c2UgdGhhdCBleGlzdGluZyBjb250ZXh0LlxuXHRcdFx0XHRcdC8vIElmIG90aGVyIGV4YW1wbGVzIHNob3VsZCBjb21lIHVwLCB0aGUgYmVzdCBwb3NzaWJsZSB3b3JrIGFyb3VuZCB3b3VsZCBiZSB0byByZXF1ZXN0IHNvbWUgZGF0YSB0byBnZXQgYW4gZXhpc3RpbmcgY29udGV4dC4gVG8ga2VlcCB0aGVcblx0XHRcdFx0XHQvLyByZXF1ZXN0IGFzIHNtYWxsIGFuZCBmYXN0IGFzIHBvc3NpYmxlLCB3ZSBzaG91bGQgcmVxdWVzdCBvbmx5IHRoZSBmaXJzdCBrZXkgcHJvcGVydHkuIEFzIHRoaXMgd291bGQgaW50cm9kdWNlIGFzeW5jaHJvbmlzbSwgYW5kIGFueXdheVxuXHRcdFx0XHRcdC8vIHRoZSB3aG9sZSBsb2dpYyBpcyBvbmx5IHBhcnQgb2Ygd29yay1hcm91bmQgZm9yIGluY29ycmVjdCBtb2RlbGxpbmcsIHdlIHdhaXQgdW50aWwgd2UgaGF2ZSBhbiBleGFtcGxlIG5lZWRpbmcgaXQgYmVmb3JlIGltcGxlbWVudGluZyB0aGlzLlxuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0ID0gcm9vdENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRDb250ZXh0O1xuXHRcdFx0fSlcblx0XHRcdC5yZXZlcnNlKCk7XG5cdFx0Ly8gc2VhcmNoIGZvciBjb250ZXh0IGJhY2t3YXJkc1xuXHRcdGNvbnN0IG92ZXJsb2FkQ29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZCA9IHBhcmVudENvbnRleHRzLmZpbmQoXG5cdFx0XHQocGFyZW50Q29udGV4dDogQ29udGV4dCkgPT5cblx0XHRcdFx0KG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChwYXJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiJFR5cGVcIikgYXMgdW5rbm93biBhcyBzdHJpbmcpID09PSBvdmVybG9hZEVudGl0eVR5cGVcblx0XHQpO1xuXHRcdHJldHVybiBvdmVybG9hZENvbnRleHQgfHwgbGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpITtcblx0fVxuXG5cdF9jcmVhdGVTaWJsaW5nSW5mbyhjdXJyZW50Q29udGV4dDogQ29udGV4dCwgbmV3Q29udGV4dDogQ29udGV4dCk6IFNpYmxpbmdJbmZvcm1hdGlvbiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG5ld0NvbnRleHQsXG5cdFx0XHRwYXRoTWFwcGluZzogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b2xkUGF0aDogY3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld0NvbnRleHQuZ2V0UGF0aCgpXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9O1xuXHR9XG5cblx0X3VwZGF0ZVBhdGhzSW5IaXN0b3J5KG1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSk6IHZvaWQge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXRQYXRoTWFwcGluZyhtYXBwaW5ncyk7XG5cblx0XHQvLyBBbHNvIHVwZGF0ZSB0aGUgc2VtYW50aWMgbWFwcGluZyBpbiB0aGUgcm91dGluZyBzZXJ2aWNlXG5cdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdGlmIChtYXBwaW5ncy5sZW5ndGggJiYgbGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ub2xkUGF0aCkge1xuXHRcdFx0bGFzdFNlbWFudGljTWFwcGluZy50ZWNobmljYWxQYXRoID0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHR9XG5cdH1cblxuXHRfZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQoXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRuZXdEb2N1bWVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0c2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZFxuXHQpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhjb250ZXh0LCBuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT0gbmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBjb250ZXh0LmdldFBhdGgoKSA9PT0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgPyBjb250ZXh0IDogc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbnRleHRUb05hdmlnYXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UsIGFuZCBjYWxjdWxhdGVzIGEgc2libGluZyBwYXRoXG5cdCAqIGZvciBhbGwgaW50ZXJtZWRpYXRlIHBhdGhzIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG5cdCAqIEBwYXJhbSByb290Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSByb290IG9mIHRoZSBkcmFmdFxuXHQgKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdFxuXHQgKiBAcGFyYW0gc1Byb2dyYW1taW5nTW9kZWwgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBwYXJhbSBkb05vdENvbXB1dGVJZlJvb3QgSWYgdHJ1ZSwgd2UgZG9uJ3QgY29tcHV0ZSBzaWJsaW5nSW5mbyBpZiB0aGUgcm9vdCBhbmQgdGhlIHJpZ2h0bW9zdCBjb250ZXh0cyBhcmUgdGhlIHNhbWVcblx0ICogQHBhcmFtIHJvb3RDb250ZXh0SW5mbyBUaGUgcm9vdCBjb250ZXh0IGluZm9ybWF0aW9uIG9mIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSBncm91cElkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3Rcblx0ICovXG5cdGFzeW5jIF9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW4sXG5cdFx0cm9vdENvbnRleHRJbmZvPzogUm9vdENvbnRleHRJbmZvLFxuXHRcdGdyb3VwSWQ/OiBzdHJpbmdcblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID8/IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGxldCByaWdodE1vc3RDb250ZXh0VG9Vc2UgPSByaWdodG1vc3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0KSAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0Ly8gd2UgY2hlY2sgdGhlIHJpZ2h0TW9zdEN1cnJlbnRDb250ZXh0IGNhbiBiZSB1c2VkIGluIGRyYWZ0XG5cdFx0XHRyaWdodE1vc3RDb250ZXh0VG9Vc2UgPSByb290Q3VycmVudENvbnRleHQ7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRNb3N0Q29udGV4dFRvVXNlLmdldFBhdGgoKSA9PT0gcm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1vZGVsID0gcm9vdEN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRyZXR1cm4gZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihyb290Q3VycmVudENvbnRleHQsIHJpZ2h0TW9zdENvbnRleHRUb1VzZSwgcm9vdENvbnRleHRJbmZvLCBncm91cElkKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSWYgbm90IGluIGRyYWZ0IG1vZGUsIHdlIGp1c3QgcmVjcmVhdGUgYSBjb250ZXh0IGZyb20gdGhlIHBhdGggb2YgdGhlIHJpZ2h0bW9zdCBjb250ZXh0XG5cdFx0XHQvLyBObyBwYXRoIG1hcHBpbmcgaXMgbmVlZGVkXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0YXJnZXRDb250ZXh0OiBtb2RlbC5iaW5kQ29udGV4dChyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldEJvdW5kQ29udGV4dCgpLFxuXHRcdFx0XHRwYXRoTWFwcGluZzogW11cblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cblx0X2lzRmNsRW5hYmxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCk7XG5cdH1cblxuXHRhc3luYyBjaGVja1JlY29tbWVuZGF0aW9uT3B0aW9uKCk6IFByb21pc2U8UmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB8IHVuZGVmaW5lZD4ge1xuXHRcdC8vVGhlIGV4aXN0aW5nIHJlY29tbWVuZGF0aW9ucyBjaGVjayBpcyBub3cgcHJlc2VudCBmdXJ0aGVyIGluIHRoZSBmbG93IGZvciBzaG93aW5nIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0XHRjb25zdCByZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPSBhd2FpdCB0aGlzLnNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKHRydWUpO1xuXHRcdGlmIChyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uLkNvbnRpbnVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3Nlbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgTmV4dCBEb2N1bWVudC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZWQgb25jZSBjcmVhdGUgbmV4dCBoYXBwZW5zLlxuXHQgKi9cblx0YXN5bmMgY3JlYXRlTmV4dERvY3VtZW50KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJpbmRpbmdDb250ZXh0UGF0aCA9IHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmdQYXRoID0gYmluZGluZ0NvbnRleHRQYXRoPy5zdWJzdHJpbmcoMCwgYmluZGluZ0NvbnRleHRQYXRoLmxhc3RJbmRleE9mKFwiKFwiKSk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRG9jdW1lbnQobGlzdEJpbmRpbmdQYXRoIGFzIHN0cmluZywgeyBjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5OZXdQYWdlIH0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVkaXRGbG93O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBNEVBLE1BQU1BLGdCQUFnQixHQUFHQyxTQUFTLENBQUNELGdCQUFnQjtJQUNsREUsU0FBUyxHQUFHRCxTQUFTLENBQUNDLFNBQVM7SUFDL0JDLFdBQVcsR0FBR0YsU0FBUyxDQUFDRSxXQUFXO0lBQ25DQyxRQUFRLEdBQUdILFNBQVMsQ0FBQ0csUUFBUTtJQUM3QkMsV0FBVyxHQUFHSixTQUFTLENBQUNJLFdBQVc7RUE0QnBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxBLElBT01DLFFBQVEsSUFBQUMsSUFBQSxHQURiQyxjQUFjLENBQUMsMkNBQTJDLENBQUMsRUFBQUMsS0FBQSxHQWMxREMsY0FBYyxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQXdCaEJDLGVBQWUsQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0FD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