@sapui5/sap.fe.core 1.105.0 → 1.105.2
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.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/CommonUtils.js +7 -1
- package/src/sap/fe/core/CommonUtils.ts +9 -0
- package/src/sap/fe/core/ExtensionAPI.js +34 -1
- package/src/sap/fe/core/ExtensionAPI.ts +30 -0
- package/src/sap/fe/core/PageController.js +9 -7
- package/src/sap/fe/core/PageController.ts +10 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1 -3
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +0 -1
- package/src/sap/fe/core/controllerextensions/PageReady.js +80 -243
- package/src/sap/fe/core/controllerextensions/PageReady.ts +76 -222
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +2 -3
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +1 -4
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +405 -0
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +273 -0
- package/src/sap/fe/core/converters/annotations/DataField.js +9 -7
- package/src/sap/fe/core/converters/annotations/DataField.ts +10 -7
- package/src/sap/fe/core/converters/controls/Common/Table.js +1 -2
- package/src/sap/fe/core/converters/controls/Common/Table.ts +0 -2
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +75 -29
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +62 -36
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.js +3 -3
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +3 -0
|
@@ -216,8 +216,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
216
216
|
}
|
|
217
217
|
}
|
|
218
218
|
|
|
219
|
-
_this3._getMessageHandler().removeTransitionMessages();
|
|
220
|
-
|
|
221
219
|
var _temp14 = _finallyRethrows(function () {
|
|
222
220
|
return _catch(function () {
|
|
223
221
|
return Promise.resolve(oPromise).then(function () {
|
|
@@ -2028,4 +2026,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2028
2026
|
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteMultipleDocuments", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "toggleDraftActive", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "toggleDraftActive"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec28, _dec29], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec30, _dec31], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [_dec32, _dec33], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handlePatchSent", [_dec34], Object.getOwnPropertyDescriptor(_class2.prototype, "handlePatchSent"), _class2.prototype)), _class2)) || _class);
|
|
2029
2027
|
return EditFlow;
|
|
2030
2028
|
}, false);
|
|
2031
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiZmluYWxpemVyIiwiYmluZCIsIkNyZWF0aW9uTW9kZSIsIkZFTGlicmFyeSIsIlByb2dyYW1taW5nTW9kZWwiLCJDb25zdGFudHMiLCJEcmFmdFN0YXR1cyIsIkVkaXRNb2RlIiwiU3RhcnR1cE1vZGUiLCJNZXNzYWdlVHlwZSIsImNvcmVMaWJyYXJ5IiwiRWRpdEZsb3ciLCJkZWZpbmVVSTVDbGFzcyIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJlZGl0RG9jdW1lbnQiLCJvQ29udGV4dCIsImJEcmFmdE5hdmlnYXRpb24iLCJ0cmFuc2FjdGlvbkhlbHBlciIsIl9nZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJfZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwicmlnaHRtb3N0Q29udGV4dCIsImJhc2UiLCJlZGl0RmxvdyIsIm9uQmVmb3JlRWRpdCIsImNvbnRleHQiLCJnZXRWaWV3IiwiX2dldE1lc3NhZ2VIYW5kbGVyIiwib05ld0RvY3VtZW50Q29udGV4dCIsInNQcm9ncmFtbWluZ01vZGVsIiwiX2dldFByb2dyYW1taW5nTW9kZWwiLCJfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsImdldE1vZGVsIiwiX3NldEVkaXRNb2RlIiwiRWRpdGFibGUiLCJzaG93TWVzc2FnZURpYWxvZyIsIl9oYW5kbGVOZXdDb250ZXh0IiwiY29udGV4dFRvTmF2aWdhdGUiLCJTdGlja3kiLCJfaGFuZGxlU3RpY2t5T24iLCJfaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwic2libGluZ0luZm8iLCJfY3JlYXRlU2libGluZ0luZm8iLCJfdXBkYXRlUGF0aHNJbkhpc3RvcnkiLCJwYXRoTWFwcGluZyIsInRhcmdldENvbnRleHQiLCJnZXRQYXRoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsImFDb250ZXh0cyIsIm1QYXJhbWV0ZXJzIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvbkJlZm9yZURlbGV0ZSIsImdldENvbnRyb2xsZXIiLCJfZWRpdEZsb3ciLCJ1cGRhdGVEb2N1bWVudCIsIm9Qcm9taXNlIiwib3JpZ2luYWxCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiYklzRHJhZnQiLCJEcmFmdCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIl9zeW5jVGFzayIsImhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucyIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwiX3NldERyYWZ0U3RhdHVzIiwiU2F2aW5nIiwib0JpbmRpbmdDb250ZXh0Iiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXROYW1lIiwiZ2V0TWV0YUNvbnRleHQiLCJnZXRPYmplY3QiLCJhU2VtYW50aWNLZXlzIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJsZW5ndGgiLCJvQ3VycmVudFNlbWFudGljTWFwcGluZyIsIl9nZXRTZW1hbnRpY01hcHBpbmciLCJzQ3VycmVudFNlbWFudGljUGF0aCIsInNlbWFudGljUGF0aCIsInNDaGFuZ2VkUGF0aCIsImdldFNlbWFudGljUGF0aCIsIlNhdmVkIiwiQ2xlYXIiLCJzaG93TWVzc2FnZXMiLCJjcmVhdGVEb2N1bWVudCIsInZMaXN0QmluZGluZyIsIm1JblBhcmFtZXRlcnMiLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsImNyZWF0aW9uUm93Iiwib0NyZWF0aW9uUm93T2JqZWN0cyIsIm9UYWJsZSIsImdldFBhcmVudCIsIm9FeGVjQ3VzdG9tVmFsaWRhdGlvbiIsInZhbGlkYXRlRG9jdW1lbnQiLCJkYXRhIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiZ2V0Q3JlYXRpb25Sb3ciLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJzZXRQcm9wZXJ0eSIsIklubGluZSIsInRhYmxlSWQiLCJieUlkIiwiaXNBIiwiZm5Gb2N1c09yU2Nyb2xsIiwiZm9jdXNSb3ciLCJzY3JvbGxUb0luZGV4IiwiZ2V0Um93QmluZGluZyIsImF0dGFjaEV2ZW50T25jZSIsImNyZWF0ZUF0RW5kIiwiZ2V0TGVuZ3RoIiwiaGFuZGxlU2lkZUVmZmVjdHMiLCJvTGlzdEJpbmRpbmciLCJvQ3JlYXRpb25Qcm9taXNlIiwib05ld0NvbnRleHQiLCJjcmVhdGVkIiwiQ29tbW9uVXRpbHMiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiYXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwiY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwiYVZhbGlkYXRpb25NZXNzYWdlcyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJtQ3VzdG9tVmFsaWRpdHkiLCJnZXRQcm9wZXJ0eSIsIm9NZXNzYWdlTWFuYWdlciIsIkNvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImFDdXN0b21NZXNzYWdlcyIsIm9GaWVsZENvbnRyb2wiLCJzVGFyZ2V0IiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZvckVhY2giLCJvTWVzc2FnZSIsImNvZGUiLCJyZW1vdmVNZXNzYWdlcyIsIm9WYWxpZGF0aW9uTWVzc2FnZSIsIm1lc3NhZ2VUYXJnZXQiLCJnZXRDb250cm9sIiwiZmllbGRJZCIsImdldEJpbmRpbmdQYXRoIiwiZmlsdGVyIiwidGFyZ2V0IiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZSIsIm1lc3NhZ2VUZXh0IiwicHJvY2Vzc29yIiwidHlwZSIsIkVycm9yIiwidGVjaG5pY2FsIiwicGVyc2lzdGVudCIsImFFeGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyIsImFkZENvbnRyb2xJZCIsInB1c2giLCJ0ZXh0IiwiY3VzdG9tTWVzc2FnZXMiLCJyZXNvbHZlQ3JlYXRpb25Nb2RlIiwiaW5pdGlhbENyZWF0aW9uTW9kZSIsInByb2dyYW1taW5nTW9kZWwiLCJOZXdQYWdlIiwiaXNSZWxhdGl2ZSIsInNQYXRoIiwic05ld0FjdGlvbiIsImFQYXJhbWV0ZXJzIiwiRGVmZXJyZWQiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImdldEhlYWRlckNvbnRleHQiLCJhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzIiwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwiQXN5bmMiLCJiU2hvdWxkQnVzeUxvY2siLCJCdXN5TG9ja2VyIiwibG9jayIsIm9Mb2NrT2JqZWN0Iiwib05hdmlnYXRpb24iLCJyZXNvbHZlZENyZWF0aW9uTW9kZSIsIm9Sb3V0aW5nTGlzdGVuZXIiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJiRGVmZXJyZWRDb250ZXh0IiwiZWRpdGFibGUiLCJiRm9yY2VGb2N1cyIsImFzeW5jQ29udGV4dCIsIm9DcmVhdGlvbiIsIlN5bmMiLCJtQXJncyIsImNyZWF0ZUFjdGlvbiIsInRyYW5zaWVudCIsImNvcmVSZXNvdXJjZUJ1bmRsZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsIm5hdmlnYXRlVG9NZXNzYWdlUGFnZSIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiYkZyb21EZWZlcnJlZCIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NyZWF0aW9uUm93TGlzdEJpbmRpbmciLCJvQ3JlYXRpb25Sb3dDb250ZXh0IiwiZ2V0QmluZGluZyIsImJTa2lwU2lkZUVmZmVjdHMiLCJvTmV3VHJhbnNpZW50Q29udGV4dCIsImNyZWF0ZSIsIm9DcmVhdGlvblJvdyIsInNldEJpbmRpbmdDb250ZXh0IiwiY2F0Y2giLCJ0cmFjZSIsImRlbGV0ZSIsImlzTG9ja2VkIiwidW5sb2NrIiwiUHJvbWlzZSIsInJlamVjdCIsImJJc05ld1BhZ2VDcmVhdGlvbiIsImFsbCIsImFQYXJhbXMiLCJvTW9kZWwiLCJfc2VuZEFjdGl2aXR5IiwiQWN0aXZpdHkiLCJDcmVhdGUiLCJuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCJjYW5jZWxlZCIsInJlamVjdGVkSXRlbXMiLCJPRGF0YUxpc3RCaW5kaW5nIiwib1BheWxvYWQiLCJfZ2V0Um91dGluZ0xpc3RlbmVyIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsImJ1c3lNb2RlIiwiX2hhbmRsZUNyZWF0ZUV2ZW50cyIsInBhcmVudENvbnRyb2wiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIm9uQmVmb3JlQ3JlYXRlIiwib1Jlc291cmNlQnVuZGxlIiwiT2JqZWN0Iiwia2V5cyIsInNQcm9wZXJ0eVBhdGgiLCJvUHJvcGVydHkiLCIka2luZCIsIl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMiLCJfZ2V0R2xvYmFsVUlNb2RlbCIsIl9nZXRSZXNvdXJjZUJ1bmRsZSIsIkV4dGVybmFsIiwicmVzb2x2ZSIsIm9BcHBDb21wb25lbnQiLCJnZXRSb3V0ZXJQcm94eSIsInJlbW92ZUlBcHBTdGF0ZUtleSIsIm9Db250cm9sbGVyIiwic0NyZWF0ZVBhdGgiLCJNb2RlbEhlbHBlciIsImdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyIsImhhbmRsZXJzIiwib25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kIiwib3V0Ym91bmQiLCJ1bmRlZmluZWQiLCJvbkJlZm9yZVNhdmUiLCJvbkJlZm9yZURpc2NhcmQiLCJzYXZlRG9jdW1lbnQiLCJiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImFCaW5kaW5ncyIsImJpbmRpbmdzIiwiX3N1Ym1pdE9wZW5DaGFuZ2VzIiwiYWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMiLCJBY3RpdmF0ZSIsIl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsIlN0YW5kYXJkQWN0aW9ucyIsInNhdmUiLCJUcmlnZ2VyVHlwZSIsInN0YW5kYXJkQWN0aW9uIiwiRGlzcGxheSIsImlzRmNsRW5hYmxlZCIsInRvZ2dsZURyYWZ0QWN0aXZlIiwib0NvbnRleHREYXRhIiwiYkVkaXRhYmxlIiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsIm9SaWdodG1vc3RDb250ZXh0IiwibGFzdFNlbWFudGljTWFwcGluZyIsInRlY2huaWNhbFBhdGgiLCJ0YXJnZXRQYXRoIiwibmV3UGF0aCIsIm9sZFBhdGgiLCJjYW5jZWxEb2N1bWVudCIsImNhbmNlbEJ1dHRvbiIsImNvbnRyb2wiLCJiZWZvcmVDYW5jZWxDYWxsQmFjayIsImNhbmNlbFJlc3VsdCIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyIsInNraXBCaW5kaW5nVG9WaWV3IiwiZGVsZXRlRG9jdW1lbnQiLCJiRmluZEFjdGl2ZUNvbnRleHRzIiwiX2RlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJEZWxldGUiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJnZXRTdGFydHVwTW9kZSIsIkRlZXBsaW5rIiwiZXhpdEZyb21BcHAiLCJhcHBseURvY3VtZW50IiwiaW52b2tlQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJtRXh0cmFQYXJhbXMiLCJvQ29udHJvbCIsIm9DdXJyZW50Q29udHJvbCIsImFQYXJ0cyIsInNPdmVybG9hZEVudGl0eVR5cGUiLCJvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyIsIm9WaWV3IiwiQXJyYXkiLCJpc0FycmF5IiwiY29udGV4dHMiLCJtb2RlbCIsImlzTmF2aWdhYmxlIiwicmVxdWlyZXNOYXZpZ2F0aW9uIiwiY29udHJvbElkIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJpbmRleE9mIiwic3BsaXQiLCJyZXBsYWNlQWxsIiwiYlN0YXRpY0FjdGlvbiIsImlzVGFibGVCb3VuZCIsInNCaW5kaW5nUGF0aCIsInBhdGgiLCJzVGFibGVDb250ZXh0RW50aXR5VHlwZSIsIm9BY3Rpb25PdmVybG9hZENvbnRleHQiLCJfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbVN1YlNlY3Rpb25zIiwiZW5hYmxlQXV0b1Njcm9sbCIsIl9jcmVhdGVBY3Rpb25Qcm9taXNlIiwic0lkIiwiYkdldEJvdW5kQ29udGV4dCIsIl9nZXRCb3VuZENvbnRleHQiLCJiT2JqZWN0UGFnZSIsImdldFZpZXdEYXRhIiwiY29udmVydGVyVHlwZSIsImNhbGxBY3Rpb24iLCJvUmVzcG9uc2UiLCJBY3Rpb24iLCJhY3Rpb24iLCJmUmVzb2x2ZXIiLCJfZ2V0SW50ZXJuYWxNb2RlbCIsInZDb250ZXh0Iiwic0NvbnRleHRNZXRhUGF0aCIsIm9BY3Rpb25Db250ZXh0Iiwic0FjdGlvbkNvbnRleHRNZXRhUGF0aCIsIm5vSGlzdG9yeUVudHJ5IiwiaW5mbyIsIl9yZWZyZXNoTGlzdElmUmVxdWlyZWQiLCJfZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsImVyciIsImZSZWplY3RvciIsInNlY3VyZWRFeGVjdXRpb24iLCJmbkZ1bmN0aW9uIiwiYkJ1c3lTZXQiLCJidXN5Iiwic2V0IiwiYkJ1c3lDaGVjayIsImNoZWNrIiwiYlVwZGF0ZXNEb2N1bWVudCIsInVwZGF0ZXNEb2N1bWVudCIsImZpbmFsbHkiLCJoYW5kbGVQYXRjaFNlbnQiLCJvRXZlbnQiLCJvUGF0Y2hQcm9taXNlIiwiZ2V0U291cmNlIiwicGF0Y2hDb21wbGV0ZWRFdmVudCIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiaGFuZGxlQ3JlYXRlQWN0aXZhdGUiLCJvQmluZGluZyIsImJBdEVuZCIsImJJbmFjdGl2ZSIsIm9QYXJhbXMiLCJpbmFjdGl2ZSIsInNFZGl0TW9kZSIsImJDcmVhdGlvbk1vZGUiLCJzZXRFZGl0TW9kZSIsInNEcmFmdFN0YXRlIiwic2V0RHJhZnRTdGF0dXMiLCJnZXRSb3V0aW5nTGlzdGVuZXIiLCJnZXRHbG9iYWxVSU1vZGVsIiwidlRhc2siLCJzeW5jVGFzayIsImdldFByb2dyYW1taW5nTW9kZWwiLCJkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwiaGFuZGxlQ3JlYXRlRXZlbnRzIiwiZ2V0VHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRJbnRlcm5hbE1vZGVsIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJnZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwic0NvbnRyb2xJZCIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJfZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsIl9kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJyZWxhdGVkQ29udGV4dHMiLCJjb250ZW50IiwibWFwIiwic2VuZCIsInRyaWdnZXJUeXBlIiwidHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkiLCJnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzIiwic3VibWl0QmF0Y2giLCJvUmVxdWVzdG9yIiwid2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiaGFuZGxlU3RpY2t5T24iLCJfaGFuZGxlU3RpY2t5T2ZmIiwiaGFuZGxlU3RpY2t5T2ZmIiwiX29uQmFja05hdmlnYXRpb25JblNlc3Npb24iLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiX2Rpc2NhcmRTdGlja3lTZXNzaW9uIiwiZGlzY2FyZFN0aWNreVNlc3Npb24iLCJpbnRlcm5hbE1vZGVsIiwiZ2V0SHR0cEhlYWRlcnMiLCJiUmVjcmVhdGVDb250ZXh0IiwiYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5IiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJiUGVyc2lzdE9QU2Nyb2xsIiwic2hvd1BsYWNlaG9sZGVyIiwia2VlcEN1cnJlbnRMYXlvdXQiLCJ2aWV3IiwicGFyYW1zIiwidmlld0xldmVsIiwiYlJlZnJlc2hBZnRlckFjdGlvbiIsInNWaWV3SWQiLCJnZXRJZCIsImFNZXNzYWdlcyIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImkiLCJ2YWxpZGF0aW9uIiwiZ2V0Q29udHJvbElkIiwib0RhdGEiLCJhS2V5cyIsIm9DdXJyZW50RGF0YSIsImJSZXR1cm5lZENvbnRleHRJc1NhbWUiLCJldmVyeSIsInNLZXkiLCJpc1Jvb3QiLCJyZWZyZXNoIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJnZXRDb250ZXh0IiwiYVJlcXVlc3RQcm9taXNlcyIsIm9LZXkiLCJyZXF1ZXN0T2JqZWN0IiwiJFByb3BlcnR5UGF0aCIsIl9jaGVja0FjdGlvbnMiLCJhQWN0aW9ucyIsIm9BY3Rpb25CaW5kaW5nQ29udGV4dCIsIm9BY3Rpb24iLCJfY2hlY2tTdWJTZWN0aW9ucyIsImFTdWJTZWN0aW9ucyIsIm9TdWJTZWN0aW9uIiwiZ2V0QWdncmVnYXRpb24iLCJjdXJyZW50Q29udGV4dCIsIm5ld0NvbnRleHQiLCJtYXBwaW5ncyIsInNldFBhdGhNYXBwaW5nIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJkb05vdENvbXB1dGVJZlJvb3QiLCJzdGFydHNXaXRoIiwiZHJhZnQiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJFZGl0Rmxvdy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBzZW5kIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCB0eXBlIHsgU2libGluZ0luZm9ybWF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBTZW1hbnRpY01hcHBpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIHRyaWdnZXJDb25maWd1cmVkU3VydmV5LCBUcmlnZ2VyVHlwZSB9IGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL0ZlZWRiYWNrXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IGNvcmVMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgQ29yZUV4LCBWNENvbnRleHQgfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5cbmNvbnN0IENyZWF0aW9uTW9kZSA9IEZFTGlicmFyeS5DcmVhdGlvbk1vZGUsXG5cdFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbCxcblx0Q29uc3RhbnRzID0gRkVMaWJyYXJ5LkNvbnN0YW50cyxcblx0RHJhZnRTdGF0dXMgPSBGRUxpYnJhcnkuRHJhZnRTdGF0dXMsXG5cdEVkaXRNb2RlID0gRkVMaWJyYXJ5LkVkaXRNb2RlLFxuXHRTdGFydHVwTW9kZSA9IEZFTGlicmFyeS5TdGFydHVwTW9kZSxcblx0TWVzc2FnZVR5cGUgPSBjb3JlTGlicmFyeS5NZXNzYWdlVHlwZTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFB1YmxpYyBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0cHJpdmF0ZSBmbkRpcnR5U3RhdGVQcm92aWRlcj86IEZ1bmN0aW9uO1xuXHRwcml2YXRlIGZuSGFuZGxlU2Vzc2lvblRpbWVvdXQ/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBtUGF0Y2hQcm9taXNlcz86IGFueTtcblx0cHJpdmF0ZSBfZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uPzogRnVuY3Rpb247XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGF2YWlsYWJsZVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjZWRpdERvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGVkaXREb2N1bWVudChvQ29udGV4dDogVjRDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkRyYWZ0TmF2aWdhdGlvbiA9IHRydWU7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cdFx0bGV0IHJpZ2h0bW9zdENvbnRleHQ7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUVkaXQoeyBjb250ZXh0OiBvQ29udGV4dCB9KTtcblx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5lZGl0RG9jdW1lbnQob0NvbnRleHQsIHRoaXMuZ2V0VmlldygpLCB0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpKTtcblxuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblxuXHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCwgb0NvbnRleHQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKTtcblxuXHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXG5cdFx0XHRcdGlmIChvTmV3RG9jdW1lbnRDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9OZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRyaWdodG1vc3RDb250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRsZXQgc2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCByaWdodG1vc3RDb250ZXh0LCBzUHJvZ3JhbW1pbmdNb2RlbCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPSBvTmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgdHJ1ZSwgZmFsc2UsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBzdGlja3lPbiBoYW5kbGVyIG11c3QgYmUgc2V0IGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIGRvbmUsXG5cdFx0XHRcdFx0XHQvLyBhcyB0aGUgVVJMIG1heSBjaGFuZ2UgaW4gdGhlIGNhc2Ugb2YgRkNMXG5cdFx0XHRcdFx0XHR0aGlzLl9oYW5kbGVTdGlja3lPbihvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGVkaXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0ZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMoYUNvbnRleHRzOiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRpZiAobVBhcmFtZXRlcnMpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzKGFDb250ZXh0cywgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgZGlzcGxheXMgdGhlIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBlcnJvcnMgZHVyaW5nIGFuIHVwZGF0ZS5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSB1cGRhdGVkIGZpZWxkXG5cdCAqIEBwYXJhbSBvUHJvbWlzZSBQcm9taXNlIHRvIGRldGVybWluZSB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4gVGhlIHByb21pc2Ugc2hvdWxkIGJlIHJlc29sdmVkIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBzbyB0aGUgZHJhZnQgc3RhdHVzIGNhbiBiZSB1cGRhdGVkLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZHJhZnQgc3RhdHVzIGhhcyBiZWVuIHVwZGF0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3VwZGF0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHVwZGF0ZURvY3VtZW50KG9Db250ZXh0OiBvYmplY3QsIG9Qcm9taXNlOiBQcm9taXNlPGFueT4pOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgYklzRHJhZnQgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0cmV0dXJuIHRoaXMuX3N5bmNUYXNrKGFzeW5jICgpID0+IHtcblx0XHRcdGlmIChvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBvUHJvbWlzZTtcblx0XHRcdFx0Ly8gSWYgYSBuYXZpZ2F0aW9uIGhhcHBlbmVkIHdoaWxlIG9Qcm9taXNlIHdhcyBiZWluZyByZXNvbHZlZCwgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBjaGFuZ2VkXG5cdFx0XHRcdC8vIEluIHRoYXQgY2FzZSwgd2Ugc2hvdWxkbid0IGRvIGFueXRoaW5nXG5cdFx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdGlmIChiSXNEcmFmdCAmJiBvQmluZGluZ0NvbnRleHQgJiYgb0JpbmRpbmdDb250ZXh0ID09PSBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0c0VudGl0eVNldE5hbWUgPSAob01ldGFNb2RlbCBhcyBhbnkpLmdldE1ldGFDb250ZXh0KG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpLFxuXHRcdFx0XHRcdFx0YVNlbWFudGljS2V5cyA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhvTWV0YU1vZGVsLCBzRW50aXR5U2V0TmFtZSk7XG5cdFx0XHRcdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9DdXJyZW50U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCksXG5cdFx0XHRcdFx0XHRcdHNDdXJyZW50U2VtYW50aWNQYXRoID0gb0N1cnJlbnRTZW1hbnRpY01hcHBpbmcgJiYgb0N1cnJlbnRTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoLFxuXHRcdFx0XHRcdFx0XHRzQ2hhbmdlZFBhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgob0JpbmRpbmdDb250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHRcdC8vIHNDdXJyZW50U2VtYW50aWNQYXRoIGNvdWxkIGJlIG51bGwgaWYgd2UgaGF2ZSBuYXZpZ2F0ZWQgdmlhIGRlZXAgbGluayB0aGVuIHRoZXJlIGFyZSBubyBzZW1hbnRpY01hcHBpbmdzIHRvIGNhbGN1bGF0ZSBpdCBmcm9tXG5cdFx0XHRcdFx0XHRpZiAoc0N1cnJlbnRTZW1hbnRpY1BhdGggJiYgc0N1cnJlbnRTZW1hbnRpY1BhdGggIT09IHNDaGFuZ2VkUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KG9CaW5kaW5nQ29udGV4dCwgdHJ1ZSwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRpZiAoYklzRHJhZnQgJiYgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZXMoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyAqIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdC8vICogICAgICAgICAgICAgICAgICAgIFN5bmMgLSB0aGUgY3JlYXRpb24gaXMgdHJpZ2dlcmVkIGFuZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkLCB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdC8vICogICAgICAgICAgICAgICAgICAgIEFzeW5jIC0gdGhlIGNyZWF0aW9uIGFuZCB0aGUgbmF2aWdhdGlvbiB0byB0aGUgaW5zdGFuY2UgYXJlIGRvbmUgaW4gcGFyYWxsZWxcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWQgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBvbiB0aGUgdGFyZ2V0IHBhZ2Vcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25Sb3cgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgYXN5bmMgc28gdGhlIHVzZXIgaXMgbm90IGJsb2NrZWRcblx0Ly8gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgSW5zdGFuY2Ugb2YgdGhlIGNyZWF0aW9uIHJvdyAtIChUT0RPOiBnZXQgcmlkIGJ1dCB1c2UgbGlzdCBiaW5kaW5ncyBvbmx5KVxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXBhcmFtXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHZMaXN0QmluZGluZyAgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBmb3IgYSB0ZW1wb3JhcnkgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXHQgKiAgICAgICAgICAgICAgICAgICAgTmV3UGFnZSAtIHRoZSBjcmVhdGVkIGRvY3VtZW50IGlzIHNob3duIGluIGEgbmV3IHBhZ2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIG1ldGFkYXRhICdTeW5jJywgJ0FzeW5jJyBvciAnRGVmZXJyZWQnIGlzIHVzZWRcblx0ICogICAgICAgICAgICAgICAgICAgIElubGluZSAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSAoaW4gYSB0YWJsZSlcblx0ICogICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW4gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24gc3BlY2lmaWVkIHZpYSB0aGUgcGFyYW1ldGVyICdvdXRib3VuZCdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMub3V0Ym91bmQgVGhlIG5hdmlnYXRpb24gdGFyZ2V0IHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdFeHRlcm5hbCdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgU3BlY2lmaWVzIGlmIHRoZSBuZXcgZW50cnkgc2hvdWxkIGJlIGNyZWF0ZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgYSB0YWJsZSBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnSW5saW5lJ1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNjcmVhdGVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBjcmVhdGVEb2N1bWVudChcblx0XHR2TGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRvdXRib3VuZD86IHN0cmluZztcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5fZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGxldCBvVGFibGU6IGFueTsgLy9zaG91bGQgYmUgVGFibGUgYnV0IHRoZXJlIGFyZSBtaXNzaW5nIG1ldGhvZHMgaW50byB0aGUgZGVmXG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHRoaXMuX2dldFJlc291cmNlQnVuZGxlKCk7XG5cdFx0Y29uc3QgYlNob3VsZEJ1c3lMb2NrID1cblx0XHRcdCFtUGFyYW1ldGVycyB8fFxuXHRcdFx0KG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZSAmJlxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJlxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5FeHRlcm5hbCk7XG5cdFx0bGV0IG9FeGVjQ3VzdG9tVmFsaWRhdGlvbiA9IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnJlbW92ZUlBcHBTdGF0ZUtleSgpO1xuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKSB7XG5cdFx0XHQvLyBDcmVhdGUgYnkgbmF2aWdhdGluZyB0byBhbiBleHRlcm5hbCB0YXJnZXRcblx0XHRcdC8vIFRPRE86IENhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb24gKGN1cnJlbnRseSB1c2luZyB0aGUgc2FtZSBhcyBmb3Igb3V0Ym91bmQgY2hldnJvbiBuYXYsIGFuZCB3aXRob3V0IGFueSBjb250ZXh0IC0gM3JkIHBhcmFtKVxuXHRcdFx0YXdhaXQgdGhpcy5fc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0Y29uc3Qgc0NyZWF0ZVBhdGggPSBNb2RlbEhlbHBlci5nZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmcodGhpcy5nZXRWaWV3KCksIHZMaXN0QmluZGluZyk7XG5cblx0XHRcdChvQ29udHJvbGxlciBhcyBhbnkpLmhhbmRsZXJzLm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZChvQ29udHJvbGxlciwgbVBhcmFtZXRlcnMub3V0Ym91bmQsIHVuZGVmaW5lZCwgc0NyZWF0ZVBhdGgpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93KSB7XG5cdFx0XHRjb25zdCBvQ3JlYXRpb25Sb3dPYmplY3RzID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRPYmplY3QoKTtcblx0XHRcdGRlbGV0ZSBvQ3JlYXRpb25Sb3dPYmplY3RzW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdG9UYWJsZSA9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93LmdldFBhcmVudCgpO1xuXHRcdFx0b0V4ZWNDdXN0b21WYWxpZGF0aW9uID0gdHJhbnNhY3Rpb25IZWxwZXIudmFsaWRhdGVEb2N1bWVudChcblx0XHRcdFx0b1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRkYXRhOiBvQ3JlYXRpb25Sb3dPYmplY3RzLFxuXHRcdFx0XHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogb1RhYmxlLmdldENyZWF0aW9uUm93KCkuZGF0YShcImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvblwiKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmJhc2UuZ2V0VmlldygpXG5cdFx0XHQpO1xuXG5cdFx0XHQvLyBkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIGlzIHNldCB0byBmYWxzZSBpbiBtYW5pZmVzdCBjb252ZXJ0ZXIgKFRhYmxlLnRzKSBpZiBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gZXhpc3RzXG5cdFx0XHRpZiAob1RhYmxlLmdldENyZWF0aW9uUm93KCkuZGF0YShcImRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGFcIikgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwge30pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmUgJiYgbVBhcmFtZXRlcnMudGFibGVJZCkge1xuXHRcdFx0b1RhYmxlID0gdGhpcy5nZXRWaWV3KCkuYnlJZChtUGFyYW1ldGVycy50YWJsZUlkKSBhcyBUYWJsZTtcblx0XHR9XG5cblx0XHRpZiAob1RhYmxlICYmIG9UYWJsZS5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRjb25zdCBmbkZvY3VzT3JTY3JvbGwgPVxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmUgPyBvVGFibGUuZm9jdXNSb3cuYmluZChvVGFibGUpIDogb1RhYmxlLnNjcm9sbFRvSW5kZXguYmluZChvVGFibGUpO1xuXHRcdFx0b1RhYmxlLmdldFJvd0JpbmRpbmcoKS5hdHRhY2hFdmVudE9uY2UoXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRmbkZvY3VzT3JTY3JvbGwobVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPyBvVGFibGUuZ2V0Um93QmluZGluZygpLmdldExlbmd0aCgpIDogMCwgdHJ1ZSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRjb25zdCBoYW5kbGVTaWRlRWZmZWN0cyA9IGFzeW5jIChvTGlzdEJpbmRpbmc6IGFueSwgb0NyZWF0aW9uUHJvbWlzZTogUHJvbWlzZTxDb250ZXh0PikgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3Qgb05ld0NvbnRleHQgPSBhd2FpdCBvQ3JlYXRpb25Qcm9taXNlO1xuXHRcdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdFx0YXdhaXQgb05ld0NvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIGFWYWxpZGF0aW9uTWVzc2FnZXMgRXJyb3IgbWVzc2FnZXMgZnJvbSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdGNvbnN0IGNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyA9IChhVmFsaWRhdGlvbk1lc3NhZ2VzOiBhbnlbXSkgPT4ge1xuXHRcdFx0Y29uc3Qgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IG9UYWJsZSAmJiBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpO1xuXHRcdFx0Y29uc3QgbUN1c3RvbVZhbGlkaXR5ID0gb1RhYmxlICYmIG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93Q3VzdG9tVmFsaWRpdHlcIik7XG5cdFx0XHRjb25zdCBvTWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCk7XG5cdFx0XHRjb25zdCBhQ3VzdG9tTWVzc2FnZXM6IGFueVtdID0gW107XG5cdFx0XHRsZXQgb0ZpZWxkQ29udHJvbDtcblx0XHRcdGxldCBzVGFyZ2V0OiBzdHJpbmc7XG5cblx0XHRcdC8vIFJlbW92ZSBleGlzdGluZyBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdG9NZXNzYWdlTWFuYWdlclxuXHRcdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHQuZm9yRWFjaChmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdGlmIChvTWVzc2FnZS5jb2RlID09PSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0XHRvTWVzc2FnZU1hbmFnZXIucmVtb3ZlTWVzc2FnZXMob01lc3NhZ2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdGFWYWxpZGF0aW9uTWVzc2FnZXMuZm9yRWFjaCgob1ZhbGlkYXRpb25NZXNzYWdlOiBhbnkpID0+IHtcblx0XHRcdFx0Ly8gSGFuZGxlIEJvdW5kIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0XHRpZiAob1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXQpIHtcblx0XHRcdFx0XHRvRmllbGRDb250cm9sID0gQ29yZS5nZXRDb250cm9sKG1DdXN0b21WYWxpZGl0eVtvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0XHRzVGFyZ2V0ID0gYCR7b0ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCl9LyR7b0ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nUGF0aChcInZhbHVlXCIpfWA7XG5cdFx0XHRcdFx0Ly8gQWRkIHZhbGlkYXRpb24gbWVzc2FnZSBpZiBzdGlsbCBub3QgZXhpc3RzXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb01lc3NhZ2UudGFyZ2V0ID09PSBzVGFyZ2V0O1xuXHRcdFx0XHRcdFx0XHR9KS5sZW5ndGggPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlcyhcblx0XHRcdFx0XHRcdFx0bmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6IG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzb3I6IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHRcdFx0Y29kZTogc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0XHR0ZWNobmljYWw6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHRhcmdldDogc1RhcmdldFxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQWRkIGNvbnRyb2xJZCBpbiBvcmRlciB0byBnZXQgdGhlIGZvY3VzIGhhbmRsaW5nIG9mIHRoZSBlcnJvciBwb3BvdmVyIHJ1bmFibGVcblx0XHRcdFx0XHRjb25zdCBhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMgPSBvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb01lc3NhZ2UudGFyZ2V0ID09PSBzVGFyZ2V0O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YUV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzWzBdLmFkZENvbnRyb2xJZChtQ3VzdG9tVmFsaWRpdHlbb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpO1xuXG5cdFx0XHRcdFx0Ly8gSGFuZGxlIFVuYm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUN1c3RvbU1lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y29kZTogc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdHRleHQ6IG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvclxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGFDdXN0b21NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coe1xuXHRcdFx0XHRcdGN1c3RvbU1lc3NhZ2VzOiBhQ3VzdG9tTWVzc2FnZXNcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGNvbnN0IHJlc29sdmVDcmVhdGlvbk1vZGUgPSAoXG5cdFx0XHRpbml0aWFsQ3JlYXRpb25Nb2RlOiBzdHJpbmcsXG5cdFx0XHRwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcsXG5cdFx0XHRvTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbFxuXHRcdCk6IHN0cmluZyA9PiB7XG5cdFx0XHRpZiAoaW5pdGlhbENyZWF0aW9uTW9kZSAmJiBpbml0aWFsQ3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSkge1xuXHRcdFx0XHQvLyB1c2UgdGhlIHBhc3NlZCBjcmVhdGlvbiBtb2RlXG5cdFx0XHRcdHJldHVybiBpbml0aWFsQ3JlYXRpb25Nb2RlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gTmV3QWN0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBOYXZpZ2F0aW9uUHJvcGVydHkgY29sbGVjdGlvblxuXHRcdFx0XHRpZiAoIW9MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0XHRjb25zdCBzUGF0aCA9IG9MaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHQvLyBpZiBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzIGlzIHByZXNlbnQsIHRoZW4gY3JlYXRpb24gaXMgJ0RlZmVycmVkJ1xuXHRcdFx0XHRcdFx0Ly8gaW4gdGhlIGFic2VuY2Ugb2YgTmV3QWN0aW9uIG9yIE5ld0FjdGlvbiB3aXRoIHBhcmFtZXRlcnMsIGNyZWF0aW9uIGlzIGFzeW5jXG5cdFx0XHRcdFx0XHRzTmV3QWN0aW9uID1cblx0XHRcdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvTmV3QWN0aW9uYClcblx0XHRcdFx0XHRcdFx0XHQ6IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvTmV3QWN0aW9uYCk7XG5cdFx0XHRcdFx0aWYgKHNOZXdBY3Rpb24pIHtcblx0XHRcdFx0XHRcdGNvbnN0IGFQYXJhbWV0ZXJzID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke3NOZXdBY3Rpb259L0AkdWk1Lm92ZXJsb2FkLzAvJFBhcmFtZXRlcmApIHx8IFtdO1xuXHRcdFx0XHRcdFx0Ly8gYmluZGluZyBwYXJhbWV0ZXIgKGVnOiBfaXQpIGlzIG5vdCBjb25zaWRlcmVkXG5cdFx0XHRcdFx0XHRpZiAoYVBhcmFtZXRlcnMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkRlZmVycmVkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkuZ2V0UGF0aCgpKTtcblx0XHRcdFx0Y29uc3QgYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyA9IENvbW1vblV0aWxzLmdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyhvTWV0YU1vZGVsLCBzTWV0YVBhdGgsIHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdFx0aWYgKGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5Bc3luYztcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0aWYgKGJTaG91bGRCdXN5TG9jaykge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGFWYWxpZGF0aW9uTWVzc2FnZXMgPSBhd2FpdCB0aGlzLl9zeW5jVGFzayhvRXhlY0N1c3RvbVZhbGlkYXRpb24pO1xuXHRcdFx0aWYgKGFWYWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMoYVZhbGlkYXRpb25NZXNzYWdlcyk7XG5cdFx0XHRcdExvZy5lcnJvcihcIkN1c3RvbSBWYWxpZGF0aW9uIGZhaWxlZFwiKTtcblx0XHRcdFx0Ly8gaWYgY3VzdG9tIHZhbGlkYXRpb24gZmFpbHMsIHdlIGxlYXZlIHRoZSBtZXRob2QgaW1tZWRpYXRlbHlcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgb0xpc3RCaW5kaW5nOiBhbnk7XG5cdFx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0XHRpZiAodkxpc3RCaW5kaW5nICYmIHR5cGVvZiB2TGlzdEJpbmRpbmcgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0Ly8gd2UgYWxyZWFkeSBnZXQgYSBsaXN0IGJpbmRpbmcgdXNlIHRoaXMgb25lXG5cdFx0XHRcdG9MaXN0QmluZGluZyA9IHZMaXN0QmluZGluZztcblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRvTGlzdEJpbmRpbmcgPSBuZXcgKE9EYXRhTGlzdEJpbmRpbmcgYXMgYW55KSh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLCB2TGlzdEJpbmRpbmcpO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuU3luYztcblx0XHRcdFx0ZGVsZXRlIG1QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBvYmplY3Qgb3IgcGF0aCBleHBlY3RlZFwiKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb01vZGVsID0gb0xpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nID0gdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvTGlzdEJpbmRpbmcpO1xuXHRcdFx0Y29uc3QgcmVzb2x2ZWRDcmVhdGlvbk1vZGUgPSByZXNvbHZlQ3JlYXRpb25Nb2RlKFxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUsXG5cdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRvTGlzdEJpbmRpbmcsXG5cdFx0XHRcdG9Nb2RlbC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0KTtcblxuXHRcdFx0bGV0IG9DcmVhdGlvbjogYW55O1xuXHRcdFx0bGV0IG1BcmdzOiBhbnk7XG5cdFx0XHRjb25zdCBvQ3JlYXRpb25Sb3cgPSBtUGFyYW1ldGVycy5jcmVhdGlvblJvdztcblx0XHRcdGxldCBvQ3JlYXRpb25Sb3dDb250ZXh0OiBhbnk7XG5cdFx0XHRsZXQgb1BheWxvYWQ6IGFueTtcblx0XHRcdGxldCBzTWV0YVBhdGg6IHN0cmluZztcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBvUm91dGluZ0xpc3RlbmVyID0gdGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCk7XG5cblx0XHRcdGlmIChyZXNvbHZlZENyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkRlZmVycmVkKSB7XG5cdFx0XHRcdGlmIChyZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93KSB7XG5cdFx0XHRcdFx0b0NyZWF0aW9uUm93Q29udGV4dCA9IG9DcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NyZWF0aW9uUm93Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdC8vIHByZWZpbGwgZGF0YSBmcm9tIGNyZWF0aW9uIHJvd1xuXHRcdFx0XHRcdG9QYXlsb2FkID0gb0NyZWF0aW9uUm93Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhID0ge307XG5cdFx0XHRcdFx0T2JqZWN0LmtleXMob1BheWxvYWQpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS8ke3NQcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0XHQvLyBlbnN1cmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgcGF5bG9hZCwgZGVlcCBjcmVhdGUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eSAmJiBvUHJvcGVydHkuJGtpbmQgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YVtzUHJvcGVydHlQYXRoXSA9IG9QYXlsb2FkW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygvKm9DcmVhdGlvblJvd0NvbnRleHQqLyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgfHwgcmVzb2x2ZWRDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmUpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID0gZmFsc2U7IC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdFx0Ly8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJ1c3lNb2RlID0gXCJMb2NhbFwiO1xuXG5cdFx0XHRcdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHRcdFx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0XHRcdFx0dGhpcy5faGFuZGxlQ3JlYXRlRXZlbnRzKG9MaXN0QmluZGluZyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGU7XG5cdFx0XHRcdG9DcmVhdGlvbiA9IHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyxcblx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgb05hdmlnYXRpb247XG5cdFx0XHRzd2l0Y2ggKHJlc29sdmVkQ3JlYXRpb25Nb2RlKSB7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkRlZmVycmVkOlxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0xpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdFx0XHRiRGVmZXJyZWRDb250ZXh0OiB0cnVlLFxuXHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRiRm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5Bc3luYzpcblx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9MaXN0QmluZGluZywge1xuXHRcdFx0XHRcdFx0YXN5bmNDb250ZXh0OiBvQ3JlYXRpb24sXG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLlN5bmM6XG5cdFx0XHRcdFx0bUFyZ3MgPSB7XG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgbVBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRtQXJncy50cmFuc2llbnQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9DcmVhdGlvbi50aGVuKGZ1bmN0aW9uIChvTmV3RG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmICghb05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjb3JlUmVzb3VyY2VCdW5kbGUgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UoXG5cdFx0XHRcdFx0XHRcdFx0Y29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19FRElURkxPV19TQVBGRV9DUkVBVElPTl9GQUlMRURfREVTQ1JJUFRJT05cIilcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBTeW5jIGNyZWF0aW9uIHdhcyB0cmlnZ2VyZWQgZm9yIGEgZGVmZXJyZWQgY3JlYXRpb24sIHdlIGRvbid0IG5hdmlnYXRlIGZvcndhcmRcblx0XHRcdFx0XHRcdFx0Ly8gYXMgd2UncmUgYWxyZWFkeSBvbiB0aGUgY29ycmVzcG9uZGluZyBPYmplY3RQYWdlXG5cdFx0XHRcdFx0XHRcdHJldHVybiBtUGFyYW1ldGVycy5iRnJvbURlZmVycmVkXG5cdFx0XHRcdFx0XHRcdFx0PyBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9Db250ZXh0KG9OZXdEb2N1bWVudENvbnRleHQsIG1BcmdzKVxuXHRcdFx0XHRcdFx0XHRcdDogb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob05ld0RvY3VtZW50Q29udGV4dCwgbUFyZ3MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5JbmxpbmU6XG5cdFx0XHRcdFx0aGFuZGxlU2lkZUVmZmVjdHMob0xpc3RCaW5kaW5nLCBvQ3JlYXRpb24pO1xuXHRcdFx0XHRcdHRoaXMuX3N5bmNUYXNrKG9DcmVhdGlvbik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93OlxuXHRcdFx0XHRcdC8vIHRoZSBjcmVhdGlvbiByb3cgc2hhbGwgYmUgY2xlYXJlZCBvbmNlIHRoZSB2YWxpZGF0aW9uIGNoZWNrIHdhcyBzdWNjZXNzZnVsIGFuZFxuXHRcdFx0XHRcdC8vIHRoZXJlZm9yZSB0aGUgUE9TVCBjYW4gYmUgc2VudCBhc3luYyB0byB0aGUgYmFja2VuZFxuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvQ3JlYXRpb25Sb3dMaXN0QmluZGluZyA9IG9DcmVhdGlvblJvd0NvbnRleHQuZ2V0QmluZGluZygpO1xuXG5cdFx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJTa2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0XHRcdFx0aGFuZGxlU2lkZUVmZmVjdHMob0xpc3RCaW5kaW5nLCBvQ3JlYXRpb24pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjb25zdCBvTmV3VHJhbnNpZW50Q29udGV4dCA9IG9DcmVhdGlvblJvd0xpc3RCaW5kaW5nLmNyZWF0ZSgpO1xuXHRcdFx0XHRcdFx0b0NyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG9OZXdUcmFuc2llbnRDb250ZXh0KTtcblxuXHRcdFx0XHRcdFx0Ly8gdGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgY29uc29sZSBlcnJvcnMgVE8gYmUgY2hlY2tlZCB3aXRoIG1vZGVsIGNvbGxlYWd1ZXNcblx0XHRcdFx0XHRcdG9OZXdUcmFuc2llbnRDb250ZXh0LmNyZWF0ZWQoKS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBmYXN0IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRlZFwiKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvQ3JlYXRpb25Sb3dDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdC8vIFJlc2V0IGJ1c3kgaW5kaWNhdG9yIGFmdGVyIGEgdmFsaWRhdGlvbiBlcnJvclxuXHRcdFx0XHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSkpIHtcblx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJDcmVhdGlvblJvdyBuYXZpZ2F0aW9uIGVycm9yOiBcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0b05hdmlnYXRpb24gPSBQcm9taXNlLnJlamVjdChgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSAke3Jlc29sdmVkQ3JlYXRpb25Nb2RlfWApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBiSXNOZXdQYWdlQ3JlYXRpb24gPVxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5JbmxpbmU7XG5cdFx0XHRpZiAob0NyZWF0aW9uKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3QgYVBhcmFtcyA9IGF3YWl0IFByb21pc2UuYWxsKFtvQ3JlYXRpb24sIG9OYXZpZ2F0aW9uXSk7XG5cdFx0XHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCwgb01vZGVsKTtcblxuXHRcdFx0XHRcdGlmIChiSXNOZXdQYWdlQ3JlYXRpb24pIHtcblx0XHRcdFx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCBiSXNOZXdQYWdlQ3JlYXRpb24pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSBhUGFyYW1zWzBdO1xuXHRcdFx0XHRcdGlmIChvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkNyZWF0ZSwgb05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2hhbmRsZVN0aWNreU9uKG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvRXJyb3IgJiZcblx0XHRcdFx0XHRcdChvRXJyb3IubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIHx8XG5cdFx0XHRcdFx0XHRcdG9FcnJvciA9PSBDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nIHx8XG5cdFx0XHRcdFx0XHRcdG9FcnJvci5jYW5jZWxlZCB8fFxuXHRcdFx0XHRcdFx0XHQob0Vycm9yLnJlamVjdGVkSXRlbXMgJiYgb0Vycm9yLnJlamVjdGVkSXRlbXNbMF0uY2FuY2VsZWQpKVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChiU2hvdWxkQnVzeUxvY2spIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ1NhdmUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdTYXZlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnU2F2ZScgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZVNhdmVcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2F2ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjb25CZWZvcmVTYXZlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlU2F2ZShtUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnQ3JlYXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtICBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVDcmVhdGVcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNyZWF0ZVBhcmFtZXRlcnMgQXJyYXkgb2YgdmFsdWVzIHRoYXQgYXJlIGZpbGxlZCBpbiB0aGUgQWN0aW9uIFBhcmFtZXRlciBEaWFsb2dcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlQ3JlYXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlQ3JlYXRlKG1QYXJhbWV0ZXJzPzogeyBjb250ZXh0UGF0aD86IHN0cmluZzsgY3JlYXRlUGFyYW1ldGVycz86IGFueVtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0VkaXQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdFZGl0JyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUVkaXRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRWRpdFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZUVkaXQobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZGlzY2FyZGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZURpc2NhcmQobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0RlbGV0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRGVsZXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlRGVsZXRlKG1QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIEluZGljYXRlcyB3aGV0aGVyIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIFNhdmUgZHVyaW5nIGFuIElubGluZSBjcmVhdGlvblxuXHQvLyBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMuYmluZGluZ3MgTGlzdCBiaW5kaW5ncyBvZiB0aGUgdGFibGVzIGluIHRoZSB2aWV3LlxuXHQvLyBCb3RoIG9mIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGFyZSBmb3IgdGhlIHNhbWUgcHVycG9zZS4gVXNlciBjYW4gZW50ZXIgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgY3JlYXRpb24gcm93KHMpIGJ1dCBkb2VzIG5vdCAnQWRkIHJvdycsIGluc3RlYWQgY2xpY2tzIFNhdmUuXG5cdC8vIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIGluIHRoZSB2aWV3LlxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXBhcmFtXG5cdC8qKlxuXHQgKiBTYXZlcyBhIG5ldyBkb2N1bWVudCBhZnRlciBjaGVja2luZyBpdC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHNhdmUgaXMgY29tcGxldGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3NhdmVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBzYXZlRG9jdW1lbnQob0NvbnRleHQ6IFY0Q29udGV4dCwgbVBhcmFtZXRlcnM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0Y29uc3QgYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgPSBtUGFyYW1ldGVycy5iRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciB8fCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgYkRyYWZ0TmF2aWdhdGlvbiA9IHRydWU7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHRoaXMuX2dldFJlc291cmNlQnVuZGxlKCk7XG5cdFx0Y29uc3QgYUJpbmRpbmdzID0gbVBhcmFtZXRlcnMuYmluZGluZ3M7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5fc3luY1Rhc2soKTtcblx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlU2F2ZSh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueTtcblx0XHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpKSAmJlxuXHRcdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gTm8gbmVlZCB0byB0cnkgdG8gZ2V0IHJpZ2h0bW9zdCBjb250ZXh0IGluIGNhc2Ugb2YgYSBuZXcgb2JqZWN0XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGFjdGl2ZURvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLnNhdmVEb2N1bWVudChcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IsXG5cdFx0XHRcdGFCaW5kaW5ncyxcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aXZhdGUsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShTdGFuZGFyZEFjdGlvbnMuc2F2ZSwgVHJpZ2dlclR5cGUuc3RhbmRhcmRBY3Rpb24pO1xuXG5cdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cblx0XHRcdGlmIChhY3RpdmVEb2N1bWVudENvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IGFjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IGFjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCBmYWxzZSwgZmFsc2UsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRpZiAoIShvRXJyb3IgJiYgb0Vycm9yLmNhbmNlbGVkKSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBzYXZpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHR9XG5cdH1cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHRvZ2dsZURyYWZ0QWN0aXZlKG9Db250ZXh0OiBWNENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgYkVkaXRhYmxlOiBib29sZWFuO1xuXHRcdGNvbnN0IGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHQvL3RvZ2dsZSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgZm9yIGVkaXQgZHJhZnRzIGFuZCBhY3RpdmUgZG9jdW1lbnRzIHdpdGggZHJhZnQpXG5cdFx0aWYgKFxuXHRcdFx0IWJJc0RyYWZ0IHx8XG5cdFx0XHQhKFxuXHRcdFx0XHQoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB8fFxuXHRcdFx0XHQob0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHQvL3N0YXJ0IFBvaW50OiBlZGl0IGRyYWZ0XG5cdFx0XHRiRWRpdGFibGUgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gc3RhcnQgcG9pbnQgYWN0aXZlIGRvY3VtZW50XG5cdFx0XHRiRWRpdGFibGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0Y29uc3Qgb1JpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvQ29udGV4dDtcblx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb1JpZ2h0bW9zdENvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdGlmIChzaWJsaW5nSW5mbykge1xuXHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShiRWRpdGFibGUgPyBFZGl0TW9kZS5FZGl0YWJsZSA6IEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTsgLy9zd2l0Y2ggdG8gZWRpdCBtb2RlIG9ubHkgaWYgYSBkcmFmdCBpcyBhdmFpbGFibGVcblxuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRpZiAobGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gb0NvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0YXJnZXRQYXRoID0gc2libGluZ0luZm8ucGF0aE1hcHBpbmdbc2libGluZ0luZm8ucGF0aE1hcHBpbmcubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBsYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCwgbmV3UGF0aDogdGFyZ2V0UGF0aCB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LCBiRWRpdGFibGUsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlIC0gQ2Fubm90IGZpbmQgc2libGluZ1wiKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChgRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmU6JHtvRXJyb3J9YCBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3NhcC5tLkJ1dHRvbn0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIC0gQ3VycmVudGx5IHRoaXMgaXMgcGFzc2VkIGFzIGNhbmNlbEJ1dHRvbiBpbnRlcm5hbGx5IChyZXBsYWNlZCBieSBtUGFyYW1ldGVycy5jb250cm9sIGluIHRoZSBKU0RvYyBiZWxvdykuIEN1cnJlbnRseSBpdCBpcyBhbHNvIG1hbmRhdG9yeS5cblx0Ly8gUGxhbiAtIFRoaXMgc2hvdWxkIG5vdCBiZSBtYW5kYXRvcnkuIElmIG5vdCBwcm92aWRlZCwgd2Ugc2hvdWxkIGhhdmUgYSBkZWZhdWx0IHRoYXQgY2FuIGFjdCBhcyByZWZlcmVuY2UgY29udHJvbCBmb3IgdGhlIGRpc2NhcmQgcG9wb3ZlciBPUiB3ZSBjYW4gc2hvdyBhIGRpYWxvZyBpbnN0ZWFkIG9mIGEgcG9wb3Zlci5cblxuXHQvKipcblx0ICogRGlzY2FyZCB0aGUgZWRpdGFibGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250cm9sIFRoaXMgaXMgdGhlIGNvbnRyb2wgdXNlZCB0byBvcGVuIHRoZSBkaXNjYXJkIHBvcG92ZXJcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgYW5kIGFsbG93cyBjdXN0b20gaGFuZGxpbmdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGVkaXRhYmxlIGRvY3VtZW50IGhhcyBiZWVuIGRpc2NhcmRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjY2FuY2VsRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQob0NvbnRleHQ6IFY0Q29udGV4dCwgbVBhcmFtZXRlcnM6IHsgY29udHJvbDogb2JqZWN0OyBza2lwRGlzY2FyZFBvcG92ZXI/OiBib29sZWFuIH0pOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5fZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSB0aGlzLl9nZXRSZXNvdXJjZUJ1bmRsZSgpO1xuXHRcdGNvbnN0IG1JblBhcmFtZXRlcnM6IGFueSA9IG1QYXJhbWV0ZXJzO1xuXHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXG5cdFx0bUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gPSBtUGFyYW1ldGVycy5jb250cm9sIHx8IG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uO1xuXHRcdG1JblBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEaXNjYXJkO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuX3N5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdFx0aWYgKChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmIHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cblx0XHRcdFx0Ly8gTm8gbmVlZCB0byB0cnkgdG8gZ2V0IHJpZ2h0bW9zdCBjb250ZXh0IGluIGNhc2Ugb2YgYSBuZXcgb2JqZWN0XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNhbmNlbFJlc3VsdCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbmNlbERvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0bUluUGFyYW1ldGVycyxcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgYkRyYWZ0TmF2aWdhdGlvbiA9IHRydWU7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0Ly8gd2UgZm9yY2UgdGhlIGVkaXQgc3RhdGUgZXZlbiBmb3IgRkNMIGJlY2F1c2UgdGhlIGRyYWZ0IGRpc2NhcmQgbWlnaHQgbm90IGJlIGltcGxlbWVudGVkXG5cdFx0XHQvLyBhbmQgd2UgbWF5IGp1c3QgZGVsZXRlIHRoZSBkcmFmdFxuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cblx0XHRcdGlmICghY2FuY2VsUmVzdWx0KSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCB1bmRlZmluZWQpO1xuXHRcdFx0XHQvL2luIGNhc2Ugb2YgYSBuZXcgZG9jdW1lbnQsIG5vIGFjdGl2ZUNvbnRleHQgaXMgcmV0dXJuZWQgLS0+IG5hdmlnYXRlIGJhY2suXG5cdFx0XHRcdGlmICghbUluUGFyYW1ldGVycy5za2lwQmFja05hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSBjYW5jZWxSZXN1bHQgYXMgVjRDb250ZXh0O1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGlzY2FyZCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IG9BY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byBsb2FkIHRoZSBzZW1hbnRpYyBrZXlzIG9mIHRoZSBhY3RpdmUgY29udGV4dCwgYXMgd2UgbmVlZCB0aGVtXG5cdFx0XHRcdFx0Ly8gZm9yIHRoZSBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHQvLyBXZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBvZiB0aGUgY29udGV4dCwgc28gdGhhdCBpdCdzIGNyZWF0ZWQgYW5kIGJvdW5kIGluIHRoZSBzYW1lIG1pY3JvdGFzayxcblx0XHRcdFx0XHQvLyBzbyB0aGF0IGFsbCBwcm9wZXJ0aWVzIGFyZSBsb2FkZWQgdG9nZXRoZXIgYnkgYXV0b0V4cGFuZFNlbGVjdCwgc28gdGhhdCB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIEVkaXQgbW9kZVxuXHRcdFx0XHRcdC8vICQkaW5oZXJpdEV4cGFuZFNlbGVjdCB0YWtlcyBhbGwgbG9hZGVkIHByb3BlcnRpZXMgaW50byBhY2NvdW50IChCQ1AgMjA3MDQ2MjI2NSlcblx0XHRcdFx0XHRpZiAoIW1JblBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXcpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCB0cnVlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vYWN0aXZlIGNvbnRleHQgaXMgcmV0dXJuZWQgaW4gY2FzZSBvZiBjYW5jZWwgb2YgZXhpc3RpbmcgZG9jdW1lbnRcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCBmYWxzZSwgZmFsc2UsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkaXNjYXJkaW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgRW50aXR5U2V0IHRvIHdoaWNoIHRoZSBvYmplY3QgYmVsb25nc1xuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy50aXRsZSBUaXRsZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBkb2N1bWVudCBoYXMgYmVlbiBkZWxldGVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNkZWxldGVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkZWxldGVEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCwgbUluUGFyYW1ldGVyczogeyB0aXRsZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRsZXQgbVBhcmFtZXRlcnM6IGFueSA9IG1JblBhcmFtZXRlcnM7XG5cdFx0aWYgKCFtUGFyYW1ldGVycykge1xuXHRcdFx0bVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM6IGZhbHNlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gZmFsc2U7XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlO1xuXHRcdHJldHVybiB0aGlzLl9kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0LCBtUGFyYW1ldGVycylcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Ly8gU2luZ2xlIG9iamV0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGFuIE9QIGhlYWRlciBidXR0b24gKG5vdCBmcm9tIGEgbGlzdClcblx0XHRcdFx0Ly8gLS0+IE1hcmsgVUkgZGlydHkgYW5kIG5hdmlnYXRlIGJhY2sgdG8gZGlzbWlzcyB0aGUgT1Bcblx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EZWxldGUsIG9Db250ZXh0KTtcblxuXHRcdFx0XHQvLyBBZnRlciBkZWxldGUgaXMgc3VjY2Vzc2Z1bGwsIHdlIG5lZWQgdG8gZGV0YWNoIHRoZSBzZXRCYWNrTmF2aWdhdGlvbiBNZXRob2RzXG5cdFx0XHRcdGlmIChvQXBwQ29tcG9uZW50KSB7XG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvQXBwQ29tcG9uZW50Py5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5EZWVwbGluayAmJiAhdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBhcHAgaGFzIGJlZW4gbGF1bmNoZWQgd2l0aCBzZW1hbnRpYyBrZXlzLCBkZWxldGluZyB0aGUgb2JqZWN0IHdlJ3ZlIGxhbmRlZCBvbiBzaGFsbCBuYXZpZ2F0ZSBiYWNrXG5cdFx0XHRcdFx0Ly8gdG8gdGhlIGFwcCB3ZSBjYW1lIGZyb20gKGV4Y2VwdCBmb3IgRkNMLCB3aGVyZSB3ZSBuYXZpZ2F0ZSB0byBMUiBhcyB1c3VhbClcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZXhpdEZyb21BcHAoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogU3VibWl0IHRoZSBjdXJyZW50IHNldCBvZiBjaGFuZ2VzIGFuZCBuYXZpZ2F0ZSBiYWNrLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNhcHBseURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGFwcGx5RG9jdW1lbnQob0NvbnRleHQ6IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5fc3luY1Rhc2soKTtcblx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uXSBCb29sZWFuIHZhbHVlIGZvciBzdGF0aWMgYWN0aW9uLCB1bmRlZmluZWQgZm9yIG90aGVyIGFjdGlvbnNcblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGVdIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZFxuXHQvLyBDdXJyZW50bHkgdGhlIHBhcmFtZXRlciBpc05hdmlnYWJsZSBpcyB1c2VkIGludGVybmFsbHkgYW5kIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHJlcXVpcmVzTmF2aWdhdGlvbiBhcyBpdCBpcyBhIG1vcmUgYXB0IG5hbWUgZm9yIHRoaXMgcGFyYW1cblxuXHQvKipcblx0ICogSW52b2tlcyBhbiBhY3Rpb24gKGJvdW5kIG9yIHVuYm91bmQpIGFuZCB0cmFja3MgdGhlIGNoYW5nZXMgc28gdGhhdCBvdGhlciBwYWdlcyBjYW4gYmUgcmVmcmVzaGVkIGFuZCBzaG93IHRoZSB1cGRhdGVkIGRhdGEgdXBvbiBuYXZpZ2F0aW9uLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY29udGV4dHMgRm9yIGEgYm91bmQgYWN0aW9uLCBhIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBjYWxsZWQgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5tb2RlbCBGb3IgYW4gdW5ib3VuZCBhY3Rpb24sIGFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZC4gTmF2aWdhdGlvbiB0YWtlcyBwbGFjZSB0byB0aGUgY29udGV4dCByZXR1cm5lZCBieSB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmxhYmVsIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb24uIFRoaXMgaXMgbmVlZGVkIGluIGNhc2UgdGhlIGFjdGlvbiBoYXMgYSBwYXJhbWV0ZXIgYW5kIGEgcGFyYW1ldGVyIGRpYWxvZyBpcyBzaG93biB0byB0aGUgdXNlci4gVGhlIGxhYmVsIHdpbGwgYmUgdXNlZCBmb3IgdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgYW5kIGZvciB0aGUgY29uZmlybWF0aW9uIGJ1dHRvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSBtRXh0cmFQYXJhbXMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBBIHByb21pc2Ugb25jZSB0aGUgYWN0aW9uIGhhcyBiZWVuIGludm9rZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2ludm9rZUFjdGlvblxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgaW52b2tlQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVycz86IHtcblx0XHRcdGNvbnRleHRzPzogQ29udGV4dCB8IENvbnRleHRbXTtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHJlcXVpcmVzTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHR9LFxuXHRcdG1FeHRyYVBhcmFtcz86IGFueVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgb0NvbnRyb2w6IGFueTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0bGV0IG9DdXJyZW50Q29udHJvbDtcblx0XHRsZXQgb0JpbmRpbmdDb250ZXh0O1xuXHRcdGxldCBhUGFydHM7XG5cdFx0bGV0IHNPdmVybG9hZEVudGl0eVR5cGU7XG5cdFx0bGV0IG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzOiBhbnk7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblxuXHRcdGxldCBtUGFyYW1ldGVyczogYW55ID0gbUluUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdC8vIER1ZSB0byBhIG1pc3Rha2UgdGhlIGludm9rZUFjdGlvbiBpbiB0aGUgZXh0ZW5zaW9uQVBJIGhhZCBhIGRpZmZlcmVudCBBUEkgdGhhbiB0aGlzIG9uZS5cblx0XHQvLyBUaGUgb25lIGZyb20gdGhlIGV4dGVuc2lvbkFQSSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgYXMgd2UgZXhwb3NlIHRoZSBmdWxsIGVkaXQgZmxvdyBub3cgYnV0XG5cdFx0Ly8gZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBzaWduYXR1cmVcblx0XHRpZiAoXG5cdFx0XHQobVBhcmFtZXRlcnMuaXNBICYmIG1QYXJhbWV0ZXJzLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB8fFxuXHRcdFx0QXJyYXkuaXNBcnJheShtUGFyYW1ldGVycykgfHxcblx0XHRcdG1FeHRyYVBhcmFtcyAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBjb250ZXh0cyA9IG1QYXJhbWV0ZXJzO1xuXHRcdFx0bVBhcmFtZXRlcnMgPSBtRXh0cmFQYXJhbXMgfHwge307XG5cdFx0XHRpZiAoY29udGV4dHMpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBjb250ZXh0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLm1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtUGFyYW1ldGVycy5pc05hdmlnYWJsZSA9IG1QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiB8fCBtUGFyYW1ldGVycy5pc05hdmlnYWJsZTtcblxuXHRcdGlmICghbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCkge1xuXHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5jb250cm9sSWQpIHtcblx0XHRcdG9Db250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGlzIHNlbGVjdGVkIGNvbnRleHRzIHVwZGF0ZSBpcyBkb25lIHdpdGhpbiB0aGUgb3BlcmF0aW9uLCBzaG91bGQgYmUgbW92ZWQgb3V0XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdH1cblxuXHRcdGlmIChzQWN0aW9uTmFtZSAmJiBzQWN0aW9uTmFtZS5pbmRleE9mKFwiKFwiKSA+IC0xKSB7XG5cdFx0XHQvLyBnZXQgZW50aXR5IHR5cGUgb2YgYWN0aW9uIG92ZXJsb2FkIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYWN0aW9uIHBhdGhcblx0XHRcdC8vIEV4YW1wbGUgc0FjdGlvbk5hbWUgPSBcIjxBY3Rpb25OYW1lPihDb2xsZWN0aW9uKDxPdmVybG9hZEVudGl0eVR5cGU+KSlcIlxuXHRcdFx0Ly8gc0FjdGlvbk5hbWUgPSBhUGFydHNbMF0gLS0+IDxBY3Rpb25OYW1lPlxuXHRcdFx0Ly8gc092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1syXSAtLT4gPE92ZXJsb2FkRW50aXR5VHlwZT5cblx0XHRcdGFQYXJ0cyA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiKFwiKTtcblx0XHRcdHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdO1xuXHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZSA9IChhUGFydHNbYVBhcnRzLmxlbmd0aCAtIDFdIGFzIGFueSkucmVwbGFjZUFsbChcIilcIiwgXCJcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb24pIHtcblx0XHRcdGlmIChvQ29udHJvbC5pc1RhYmxlQm91bmQoKSkge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9Db250cm9sLmdldFJvd0JpbmRpbmcoKS5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBzQmluZGluZ1BhdGggPSBvQ29udHJvbC5kYXRhKFwicm93c0JpbmRpbmdJbmZvXCIpLnBhdGgsXG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nID0gbmV3IChPRGF0YUxpc3RCaW5kaW5nIGFzIGFueSkodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSwgc0JpbmRpbmdQYXRoKTtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc092ZXJsb2FkRW50aXR5VHlwZSkge1xuXHRcdFx0XHRjb25zdCBzVGFibGVDb250ZXh0RW50aXR5VHlwZSA9IG1QYXJhbWV0ZXJzLmNvbnRleHRzXG5cdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0TWV0YUNvbnRleHQobVBhcmFtZXRlcnMuY29udGV4dHMuZ2V0UGF0aCgpKVxuXHRcdFx0XHRcdC5nZXRPYmplY3QoXCIkVHlwZVwiKTtcblx0XHRcdFx0aWYgKHNPdmVybG9hZEVudGl0eVR5cGUgIT09IHNUYWJsZUNvbnRleHRFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdFx0Ly8gc2VhcmNoIGZvciBjb250ZXh0IGluIGNvbnRyb2wgdHJlZSBoaWVyYXJjaHlcblx0XHRcdFx0XHRvQ3VycmVudENvbnRyb2wgPSBvQ29udHJvbDtcblx0XHRcdFx0XHR3aGlsZSAob0N1cnJlbnRDb250cm9sKSB7XG5cdFx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQgPSBvQ3VycmVudENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0ICYmXG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIiRUeXBlXCIpID09PVxuXHRcdFx0XHRcdFx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGVcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9CaW5kaW5nQ29udGV4dDtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBjaGVjayBwYXJlbnRcblx0XHRcdFx0XHRcdFx0b0N1cnJlbnRDb250cm9sID0gb0N1cnJlbnRDb250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBjb250ZXh0IHdhcyBub3QgZm91bmQgaW4gVUkgaGllcmFyY2h5IGdvaW5nIHN0cmFpZ2h0IHVwd2FyZHMgLSB0cnkgdG8gZmluZCBpdCBpbiBTdWJTZWN0aW9uc1xuXHRcdFx0XHRcdGlmICghb0N1cnJlbnRDb250cm9sKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvQWN0aW9uT3ZlcmxvYWRDb250ZXh0ID0gdGhpcy5fZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbVN1YlNlY3Rpb25zKG9Db250cm9sLCBzT3ZlcmxvYWRFbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRcdGlmIChvQWN0aW9uT3ZlcmxvYWRDb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvQWN0aW9uT3ZlcmxvYWRDb250ZXh0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuY29udGV4dHMpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ29udGV4dCBub3QgZm91bmQgZm9yIGVudGl0eSB0eXBlICR7c092ZXJsb2FkRW50aXR5VHlwZX1gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmVuYWJsZUF1dG9TY3JvbGwpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MgPSB0aGlzLl9jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBvQ29udHJvbC5zSWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0ID0gdGhpcy5fZ2V0Qm91bmRDb250ZXh0KG9WaWV3LCBtUGFyYW1ldGVycyk7XG5cdFx0Ly8gTmVlZCB0byBrbm93IHRoYXQgdGhlIGFjdGlvbiBpcyBjYWxsZWQgZnJvbSBPYmplY3RQYWdlIGZvciBjaGFuZ2VTZXQgSXNvbGF0ZWQgd29ya2Fyb3VuZFxuXHRcdG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlID0gKG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5jb252ZXJ0ZXJUeXBlID09PSBcIk9iamVjdFBhZ2VcIjtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9zeW5jVGFzaygpO1xuXHRcdFx0Y29uc3Qgb1Jlc3BvbnNlID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuY2FsbEFjdGlvbi5iaW5kKFxuXHRcdFx0XHR0cmFuc2FjdGlvbkhlbHBlcixcblx0XHRcdFx0c0FjdGlvbk5hbWUsXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KSgpO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX3JlZnJlc2hMaXN0SWZSZXF1aXJlZCh0aGlzLl9nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lLCBvUmVzcG9uc2UpLCBtUGFyYW1ldGVycy5jb250ZXh0c1swXSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aW9uLCBtUGFyYW1ldGVycy5jb250ZXh0cyk7XG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShzQWN0aW9uTmFtZSwgVHJpZ2dlclR5cGUuYWN0aW9uKTtcblxuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZXNvbHZlcihvUmVzcG9uc2UpO1xuXHRcdFx0fVxuXHRcdFx0Lypcblx0XHRcdFx0XHRXZSBzZXQgdGhlICh1cHBlcikgcGFnZXMgdG8gZGlydHkgYWZ0ZXIgYW4gZXhlY3V0aW9uIG9mIGFuIGFjdGlvblxuXHRcdFx0XHRcdFRPRE86IGdldCByaWQgb2YgdGhpcyB3b3JrYXJvdW5kXG5cdFx0XHRcdFx0VGhpcyB3b3JrYXJvdW5kIGlzIG9ubHkgbmVlZGVkIGFzIGxvbmcgYXMgdGhlIG1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHN5bmNocm9uaXphdGlvbi5cblx0XHRcdFx0XHRPbmNlIHRoaXMgaXMgc3VwcG9ydGVkIHdlIGRvbid0IG5lZWQgdG8gc2V0IHRoZSBwYWdlcyB0byBkaXJ0eSBhbnltb3JlIGFzIHRoZSBjb250ZXh0IGl0c2VsZlxuXHRcdFx0XHRcdGlzIGFscmVhZHkgcmVmcmVzaGVkIChpdCdzIGp1c3Qgbm90IHJlZmxlY3RlZCBpbiB0aGUgb2JqZWN0IHBhZ2UpXG5cdFx0XHRcdFx0d2UgZXhwbGljaXRseSBkb24ndCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gdGhlIGxpc3QgcmVwb3J0IGJ1dCBvbmx5IGNhbGwgaXQgZnJvbSB0aGUgb2JqZWN0IHBhZ2Vcblx0XHRcdFx0XHRhcyBpZiBpdCBpcyBjYWxsZWQgaW4gdGhlIGxpc3QgcmVwb3J0IGl0J3Mgbm90IG5lZWRlZCAtIGFzIHdlIGFueXdheSB3aWxsIHJlbW92ZSB0aGlzIGxvZ2ljXG5cdFx0XHRcdFx0d2UgY2FuIGxpdmUgd2l0aCB0aGlzXG5cdFx0XHRcdFx0d2UgbmVlZCBhIGNvbnRleHQgdG8gc2V0IHRoZSB1cHBlciBwYWdlcyB0byBkaXJ0eSAtIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHdlIHVzZSB0aGVcblx0XHRcdFx0XHRmaXJzdCBvbmUgYXMgdGhleSBhcmUgYW55d2F5IHNpYmxpbmdzXG5cdFx0XHRcdFx0Ki9cblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3NDdXN0b21BY3Rpb25cIiwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlKSB7XG5cdFx0XHRcdGxldCB2Q29udGV4dCA9IG9SZXNwb25zZTtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodkNvbnRleHQpICYmIHZDb250ZXh0Lmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdHZDb250ZXh0ID0gdkNvbnRleHRbMF07XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHZDb250ZXh0ICYmICFBcnJheS5pc0FycmF5KHZDb250ZXh0KSkge1xuXHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0TWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHZDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0Y29uc3Qgb0FjdGlvbkNvbnRleHQgPSBBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzLmNvbnRleHRzKSA/IG1QYXJhbWV0ZXJzLmNvbnRleHRzWzBdIDogbVBhcmFtZXRlcnMuY29udGV4dHM7XG5cdFx0XHRcdFx0Y29uc3Qgc0FjdGlvbkNvbnRleHRNZXRhUGF0aCA9IG9BY3Rpb25Db250ZXh0ICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRpZiAoc0NvbnRleHRNZXRhUGF0aCAhPSB1bmRlZmluZWQgJiYgc0NvbnRleHRNZXRhUGF0aCA9PT0gc0FjdGlvbkNvbnRleHRNZXRhUGF0aCkge1xuXHRcdFx0XHRcdFx0aWYgKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSAhPT0gdkNvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCh2Q29udGV4dCwge1xuXHRcdFx0XHRcdFx0XHRcdG5vSGlzdG9yeUVudHJ5OiBmYWxzZVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdExvZy5pbmZvKFwiTmF2aWdhdGlvbiB0byB0aGUgc2FtZSBjb250ZXh0IGlzIG5vdCBhbGxvd2VkXCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycjogYW55KSB7XG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlamVjdG9yKCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBGSVhNRTogaW4gbW9zdCBzaXR1YXRpb25zIHRoZXJlIGlzIG5vIGhhbmRsZXIgZm9yIHRoZSByZWplY3RlZCBwcm9taXNlcyByZXR1cm5lZFxuXHRcdFx0aWYgKGVyciA9PT0gQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZykge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJEaWFsb2cgY2FuY2VsbGVkXCIpO1xuXHRcdFx0fSBlbHNlIGlmICghKGVyciAmJiAoZXJyLmNhbmNlbGVkIHx8IChlcnIucmVqZWN0ZWRJdGVtcyAmJiBlcnIucmVqZWN0ZWRJdGVtc1swXS5jYW5jZWxlZCkpKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIEVkaXRGbG93Lmludm9rZUFjdGlvbjoke2Vycn1gKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2VjdXJlZCBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBFbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBmbkZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZC4gU2hvdWxkIHJldHVybiBhIHByb21pc2UgdGhhdCBpcyBzZXR0bGVkIGFmdGVyIGNvbXBsZXRpb24gb2YgdGhlIGV4ZWN1dGlvbi4gSWYgbm90aGluZyBpcyByZXR1cm5lZCwgaW1tZWRpYXRlIGNvbXBsZXRpb24gaXMgYXNzdW1lZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIERlZmluaXRpb25zIG9mIHRoZSBwcmVjb25kaXRpb25zIHRvIGJlIGNoZWNrZWQgYmVmb3JlIGV4ZWN1dGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeSBEZWZpbmVzIHRoZSBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5zZXQgVHJpZ2dlcnMgYSBidXN5IGluZGljYXRvciB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuY2hlY2sgRXhlY3V0ZXMgZnVuY3Rpb24gb25seSBpZiBhcHBsaWNhdGlvbiBpc24ndCBidXN5LlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudXBkYXRlc0RvY3VtZW50IFRoaXMgb3BlcmF0aW9uIHVwZGF0ZXMgdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2l0aG91dCB1c2luZyB0aGUgYm91bmQgbW9kZWwgYW5kIGNvbnRleHQuIEFzIGEgcmVzdWx0LCB0aGUgZHJhZnQgc3RhdHVzIGlzIHVwZGF0ZWQgaWYgYSBkcmFmdCBkb2N1bWVudCBleGlzdHMsIGFuZCB0aGUgdXNlciBoYXMgdG8gY29uZmlybSB0aGUgY2FuY2VsbGF0aW9uIG9mIHRoZSBlZGl0aW5nIHByb2Nlc3MuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkIGlmIHRoZSBleGVjdXRpb24gaXMgcHJvaGliaXRlZCBhbmQgcmVzb2x2ZWQgYnkgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGZuRnVuY3Rpb24uXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzZWN1cmVkRXhlY3V0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4cGVyaW1lbnRhbCBBcyBvZiB2ZXJzaW9uIDEuOTAuMFxuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5idXN5ICYmIG1QYXJhbWV0ZXJzLmJ1c3kuc2V0ICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycy5idXN5LnNldCA6IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuYnVzeSAmJiBtUGFyYW1ldGVycy5idXN5LmNoZWNrICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycy5idXN5LmNoZWNrIDogdHJ1ZSxcblx0XHRcdGJVcGRhdGVzRG9jdW1lbnQgPSAobVBhcmFtZXRlcnMgJiYgKG1QYXJhbWV0ZXJzIGFzIGFueSkudXBkYXRlc0RvY3VtZW50KSB8fCBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpLFxuXHRcdFx0b0NvbnRleHQgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0aWYgKGJCdXN5Q2hlY2sgJiYgQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFwcGxpY2F0aW9uIGFscmVhZHkgYnVzeSB0aGVyZWZvcmUgZXhlY3V0aW9uIHJlamVjdGVkXCIpO1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgdG8gc2V0IGJ1c3kgYW5kIGRyYWZ0IGluZGljYXRvciBpbW1lZGlhdGVseSBhbHNvIHRoZSBmdW5jdGlvbiBtaWdodCBiZSBleGVjdXRlZCBsYXRlciBpbiBxdWV1ZVxuXHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzayhmbkZ1bmN0aW9uKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCkge1xuXHRcdFx0XHRcdHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCkuaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zKCk7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChiSXNEcmFmdCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgcGF0Y2hTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRoYW5kbGVQYXRjaFNlbnQob0V2ZW50OiBhbnkpIHtcblx0XHRpZiAoISh0aGlzLmJhc2UuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uZ2V0UHJvcGVydHkoXCJza2lwUGF0Y2hIYW5kbGVyc1wiKSkge1xuXHRcdFx0Ly8gQ3JlYXRlIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiB0aGUgcGF0aCBpcyBjb21wbGV0ZWRcblx0XHRcdGNvbnN0IG9QYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdG9FdmVudC5nZXRTb3VyY2UoKS5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCAocGF0Y2hDb21wbGV0ZWRFdmVudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgYlN1Y2Nlc3MgPSBwYXRjaENvbXBsZXRlZEV2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRcdFx0aWYgKGJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMudXBkYXRlRG9jdW1lbnQob0V2ZW50LmdldFNvdXJjZSgpLCBvUGF0Y2hQcm9taXNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgQ3JlYXRlQWN0aXZhdGUgZXZlbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICovXG5cdGhhbmRsZUNyZWF0ZUFjdGl2YXRlKG9FdmVudDogYW55KSB7XG5cdFx0Y29uc3Qgb0JpbmRpbmcgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGJBdEVuZCA9IHRydWU7XG5cdFx0Y29uc3QgYkluYWN0aXZlID0gdHJ1ZTtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSB0aGlzLl9nZXRSZXNvdXJjZUJ1bmRsZSgpO1xuXHRcdGNvbnN0IG9QYXJhbXM6IGFueSA9IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLklubGluZSxcblx0XHRcdGNyZWF0ZUF0RW5kOiBiQXRFbmQsXG5cdFx0XHRpbmFjdGl2ZTogYkluYWN0aXZlLFxuXHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRidXN5TW9kZTogXCJOb25lXCJcblx0XHR9O1xuXHRcdHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KG9CaW5kaW5nLCBvUGFyYW1zLCBvUmVzb3VyY2VCdW5kbGUsIHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCksIGZhbHNlLCB0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBQcml2YXRlIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKlxuXHRcdFx0IFRPIEJFIENIRUNLRUQgLyBESVNDVVNTRURcblx0XHRcdCBfY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMgYW5kIGRlbGV0ZU11bHRpRG9jdW1lbnQgLSBjb3VsZG4ndCB3ZSBjb21iaW5lIHRoZW0gd2l0aCBjcmVhdGUgYW5kIGRlbGV0ZSBkb2N1bWVudD9cblx0XHRcdCBfY3JlYXRlQWN0aW9uUHJvbWlzZSBhbmQgZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UgLT4gbmV4dCBzdGVwXG5cblx0XHRcdCAqL1xuXG5cdF9zZXRFZGl0TW9kZShzRWRpdE1vZGU6IGFueSwgYkNyZWF0aW9uTW9kZT86IGJvb2xlYW4pIHtcblx0XHQodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5zZXRFZGl0TW9kZShzRWRpdE1vZGUsIGJDcmVhdGlvbk1vZGUpO1xuXHR9XG5cblx0X3NldERyYWZ0U3RhdHVzKHNEcmFmdFN0YXRlOiBhbnkpIHtcblx0XHQodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhzRHJhZnRTdGF0ZSk7XG5cdH1cblxuXHRfZ2V0Um91dGluZ0xpc3RlbmVyKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRSb3V0aW5nTGlzdGVuZXIoKTtcblx0fVxuXG5cdF9nZXRHbG9iYWxVSU1vZGVsKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdH1cblx0X3N5bmNUYXNrKHZUYXNrPzogYW55KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LnN5bmNUYXNrKHZUYXNrKTtcblx0fVxuXG5cdF9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0OiBhbnkpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdH1cblxuXHRfZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdF9oYW5kbGVDcmVhdGVFdmVudHMob0JpbmRpbmc6IGFueSkge1xuXHRcdCh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmhhbmRsZUNyZWF0ZUV2ZW50cyhvQmluZGluZyk7XG5cdH1cblxuXHRfZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdH1cblxuXHRfZ2V0SW50ZXJuYWxNb2RlbCgpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHR9XG5cblx0X2dldFJvb3RWaWV3Q29udHJvbGxlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHR9XG5cblx0X2dldFJlc291cmNlQnVuZGxlKCkge1xuXHRcdHJldHVybiAodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkub1Jlc291cmNlQnVuZGxlO1xuXHR9XG5cblx0X2dldFNlbWFudGljTWFwcGluZygpOiBTZW1hbnRpY01hcHBpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRMYXN0U2VtYW50aWNNYXBwaW5nKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBwcm9taXNlIHRvIHdhaXQgZm9yIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZFxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2NyZWF0ZUFjdGlvblByb21pc2Vcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4dGVybmFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuXHQgKi9cblxuXHRfY3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZTogYW55LCBzQ29udHJvbElkOiBhbnkpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuY3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZSwgc0NvbnRyb2xJZCk7XG5cdH1cblxuXHRfZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldEN1cnJlbnRBY3Rpb25Qcm9taXNlKCk7XG5cdH1cblxuXHRfZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlKCk7XG5cdH1cblxuXHRfZ2V0TWVzc2FnZUhhbmRsZXIoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldE1lc3NhZ2VIYW5kbGVyKCk7XG5cdH1cblxuXHRfc2VuZEFjdGl2aXR5KGFjdGlvbjogQWN0aXZpdHksIHJlbGF0ZWRDb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBBcnJheS5pc0FycmF5KHJlbGF0ZWRDb250ZXh0cykgPyByZWxhdGVkQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSkgOiByZWxhdGVkQ29udGV4dHM/LmdldFBhdGgoKTtcblx0XHRzZW5kKHRoaXMuZ2V0VmlldygpLCBhY3Rpb24sIGNvbnRlbnQpO1xuXHR9XG5cblx0X3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lOiBzdHJpbmcsIHRyaWdnZXJUeXBlOiBUcmlnZ2VyVHlwZSkge1xuXHRcdHRyaWdnZXJDb25maWd1cmVkU3VydmV5KHRoaXMuZ2V0VmlldygpLCBzQWN0aW9uTmFtZSwgdHJpZ2dlclR5cGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5c1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlIFRoZSBib3VuZCBhY3Rpb24ncyByZXNwb25zZSBkYXRhIG9yIHJlc3BvbnNlIGNvbnRleHRcblx0ICogQHJldHVybnMgT2JqZWN0IHdpdGggZGF0YSBhbmQgbmFtZXMgb2YgdGhlIGtleSBmaWVsZHMgb2YgdGhlIHJlc3BvbnNlXG5cdCAqL1xuXHRfZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZTogc3RyaW5nLCBvUmVzcG9uc2U6IG9iamVjdCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lLCBvUmVzcG9uc2UpO1xuXHR9XG5cblx0YXN5bmMgX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuX2dldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBTdWJtaXQgYW55IGxlZnRvdmVyIGNoYW5nZXMgdGhhdCBhcmUgbm90IHlldCBzdWJtaXR0ZWRcblx0XHRcdC8vIEN1cnJlbnRseSB3ZSBhcmUgdXNpbmcgb25seSAxIHVwZGF0ZUdyb3VwSWQsIGhlbmNlIHN1Ym1pdHRpbmcgdGhlIGJhdGNoIGRpcmVjdGx5IGhlcmVcblx0XHRcdGF3YWl0IG9Nb2RlbC5zdWJtaXRCYXRjaChcIiRhdXRvXCIpO1xuXG5cdFx0XHQvLyBXYWl0IGZvciBhbGwgY3VycmVudGx5IHJ1bm5pbmcgY2hhbmdlc1xuXHRcdFx0Ly8gRm9yIHRoZSB0aW1lIGJlaW5nIHdlIGFncmVlZCB3aXRoIHRoZSB2NCBtb2RlbCB0ZWFtIHRvIHVzZSBhbiBpbnRlcm5hbCBtZXRob2QuIFdlJ2xsIHJlcGxhY2UgaXQgb25jZVxuXHRcdFx0Ly8gYSBwdWJsaWMgb3IgcmVzdHJpY3RlZCBtZXRob2Qgd2FzIHByb3ZpZGVkXG5cdFx0XHRhd2FpdCBvTW9kZWwub1JlcXVlc3Rvci53YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIENoZWNrIGlmIGFsbCBjaGFuZ2VzIHdlcmUgc3VibWl0dGVkIHN1Y2Nlc3NmdWxseVxuXHRcdFx0aWYgKG9Nb2RlbC5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInN1Ym1pdCBvZiBvcGVuIGNoYW5nZXMgZmFpbGVkXCIpO1xuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9oYW5kbGVTdGlja3lPbihvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5oYW5kbGVTdGlja3lPbihvQ29udGV4dCk7XG5cdH1cblxuXHRfaGFuZGxlU3RpY2t5T2ZmKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5oYW5kbGVTdGlja3lPZmYoKTtcblx0fVxuXG5cdF9vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKCk7XG5cdH1cblxuXHRfZGlzY2FyZFN0aWNreVNlc3Npb24ob0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZGlzY2FyZFN0aWNreVNlc3Npb24ob0NvbnRleHQpO1xuXHR9XG5cblx0X3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogYW55LCBtb2RlbDogT0RhdGFNb2RlbCkge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuX2dldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIHRydWUpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zdGlja3lTZXNzaW9uVG9rZW5cIiwgKG1vZGVsLmdldEh0dHBIZWFkZXJzKHRydWUpIGFzIGFueSlbXCJTQVAtQ29udGV4dElkXCJdKTtcblx0XHR9XG5cdH1cblxuXHRfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBhbnkpIHtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLl9nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0dGhpcy5faGFuZGxlU3RpY2t5T2ZmKC8qb0NvbnRleHQqLyk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgX2hhbmRsZU5ld0NvbnRleHQoXG5cdFx0b0NvbnRleHQ6IGFueSxcblx0XHRiRWRpdGFibGU6IGJvb2xlYW4sXG5cdFx0YlJlY3JlYXRlQ29udGV4dDogYm9vbGVhbixcblx0XHRiRHJhZnROYXZpZ2F0aW9uOiBib29sZWFuLFxuXHRcdGJGb3JjZUZvY3VzPzogYm9vbGVhbixcblx0XHRiTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHk/OiBib29sZWFuXG5cdCkge1xuXHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7XG5cdFx0XHRjaGVja05vSGFzaENoYW5nZTogdHJ1ZSxcblx0XHRcdGVkaXRhYmxlOiBiRWRpdGFibGUsXG5cdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiB0cnVlLFxuXHRcdFx0YlJlY3JlYXRlQ29udGV4dDogYlJlY3JlYXRlQ29udGV4dCxcblx0XHRcdGJEcmFmdE5hdmlnYXRpb246IGJEcmFmdE5hdmlnYXRpb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IGZhbHNlLFxuXHRcdFx0YkZvcmNlRm9jdXM6IGJGb3JjZUZvY3VzLFxuXHRcdFx0a2VlcEN1cnJlbnRMYXlvdXQ6IHRydWUsXG5cdFx0XHRiTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHk6IGJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eVxuXHRcdH0pO1xuXHR9XG5cblx0X2dldEJvdW5kQ29udGV4dCh2aWV3OiBhbnksIHBhcmFtczogYW55KSB7XG5cdFx0Y29uc3Qgdmlld0xldmVsID0gdmlldy5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbDtcblx0XHRjb25zdCBiUmVmcmVzaEFmdGVyQWN0aW9uID0gdmlld0xldmVsID4gMSB8fCAodmlld0xldmVsID09PSAxICYmIHBhcmFtcy5jb250cm9sSWQpO1xuXHRcdHJldHVybiAhcGFyYW1zLmlzTmF2aWdhYmxlIHx8ICEhYlJlZnJlc2hBZnRlckFjdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gKHBhcnNlKSBlcnJvcnMgZm9yIGNvbnRyb2xzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dFxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9yc1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRpb24gZXJyb3JzLCBhbmQgcmVqZWN0cyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiBlcnJvcnNcblx0ICovXG5cblx0X2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpIHtcblx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2soKS50aGVuKCgpID0+IHtcblx0XHRcdGNvbnN0IHNWaWV3SWQgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldElkKCk7XG5cdFx0XHRjb25zdCBhTWVzc2FnZXMgPSBzYXAudWkuZ2V0Q29yZSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0bGV0IG9Db250cm9sO1xuXHRcdFx0bGV0IG9NZXNzYWdlO1xuXG5cdFx0XHRpZiAoIWFNZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcIk5vIHZhbGlkYXRpb24gZXJyb3JzIGZvdW5kXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFNZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRvTWVzc2FnZSA9IGFNZXNzYWdlc1tpXTtcblx0XHRcdFx0aWYgKG9NZXNzYWdlLnZhbGlkYXRpb24pIHtcblx0XHRcdFx0XHRvQ29udHJvbCA9IENvcmUuYnlJZChvTWVzc2FnZS5nZXRDb250cm9sSWQoKSk7XG5cdFx0XHRcdFx0d2hpbGUgKG9Db250cm9sKSB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRyb2wuZ2V0SWQoKSA9PT0gc1ZpZXdJZCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJ2YWxpZGF0aW9uIGVycm9ycyBleGlzdFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9yZWZyZXNoTGlzdElmUmVxdWlyZWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9mIHRoZSBib3VuZCBhY3Rpb24gYW5kIHRoZSBuYW1lcyBvZiB0aGUga2V5IGZpZWxkc1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJvdW5kIGNvbnRleHQgb24gd2hpY2ggdGhlIGFjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgQWx3YXlzIHJlc29sdmVzIHRvIHBhcmFtIG9SZXNwb25zZVxuXHQgKi9cblx0X3JlZnJlc2hMaXN0SWZSZXF1aXJlZChvUmVzcG9uc2U6IGFueSwgb0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRpZiAoIW9Db250ZXh0IHx8ICFvUmVzcG9uc2UgfHwgIW9SZXNwb25zZS5vRGF0YSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0XHRjb25zdCBvQmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHQvLyByZWZyZXNoIG9ubHkgbGlzdHNcblx0XHRpZiAob0JpbmRpbmcgJiYgb0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9SZXNwb25zZS5vRGF0YTtcblx0XHRcdGNvbnN0IGFLZXlzID0gb1Jlc3BvbnNlLmtleXM7XG5cdFx0XHRjb25zdCBvQ3VycmVudERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdGxldCBiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gdHJ1ZTtcblx0XHRcdC8vIGVuc3VyZSBjb250ZXh0IGlzIGluIHRoZSByZXNwb25zZVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db250ZXh0RGF0YSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGNoZWNrIGlmIGNvbnRleHQgaW4gcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGJvdW5kIGNvbnRleHRcblx0XHRcdFx0YlJldHVybmVkQ29udGV4dElzU2FtZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1cnJlbnREYXRhW3NLZXldID09PSBvQ29udGV4dERhdGFbc0tleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdGlmICgob0JpbmRpbmcgYXMgYW55KS5pc1Jvb3QoKSkge1xuXHRcdFx0XHRcdFx0XHRvQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogb0JpbmRpbmcuZ2V0UGF0aCgpIH1dLCBvQmluZGluZy5nZXRDb250ZXh0KCkgYXMgQ29udGV4dClcblx0XHRcdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyB0aGUgdGFibGVcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIsIGUpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHJlc29sdmUgd2l0aCBvUmVzcG9uc2UgdG8gbm90IGRpc3R1cmIgdGhlIHByb21pc2UgY2hhaW4gYWZ0ZXJ3YXJkc1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdF9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnksXG5cdFx0XHRzRW50aXR5U2V0TmFtZSA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFSZXF1ZXN0UHJvbWlzZXMgPSBhU2VtYW50aWNLZXlzLm1hcChmdW5jdGlvbiAob0tleTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KG9LZXkuJFByb3BlcnR5UGF0aCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXF1ZXN0UHJvbWlzZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0X2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21TdWJTZWN0aW9ucyhvQ29udHJvbDogYW55LCBzT3ZlcmxvYWRFbnRpdHlUeXBlOiBzdHJpbmcpIHtcblx0XHRsZXQgb0N1cnJlbnRDb250cm9sOiBhbnk7XG5cblx0XHRmdW5jdGlvbiBfY2hlY2tBY3Rpb25zKGFBY3Rpb25zOiBBcnJheTxvYmplY3Q+KSB7XG5cdFx0XHRsZXQgb0FjdGlvbkJpbmRpbmdDb250ZXh0OiBhbnk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhQWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvQWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0XHRvQWN0aW9uQmluZGluZ0NvbnRleHQgPSBvQWN0aW9uLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0b0FjdGlvbkJpbmRpbmdDb250ZXh0XG5cdFx0XHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHRcdFx0XHQuZ2V0TWV0YUNvbnRleHQob0FjdGlvbkJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0XHRcdFx0LmdldE9iamVjdChcIiRUeXBlXCIpID09PSBzT3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJjb250ZXh0IGZvdW5kIC0gc3RvcCBhY3Rpb25zIGxvb3BcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0cmV0dXJuIG9BY3Rpb25CaW5kaW5nQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBfY2hlY2tTdWJTZWN0aW9ucyhhU3ViU2VjdGlvbnM6IEFycmF5PG9iamVjdD4pIHtcblx0XHRcdGxldCBvQWN0aW9uQmluZGluZ0NvbnRleHQ6IGFueTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGFTdWJTZWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvU3ViU2VjdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9BY3Rpb25CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiY29udGV4dCBmb3VuZCAtIHN0b3AgU3ViU2VjdGlvbnMgbG9vcFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9TdWJTZWN0aW9uLmdldEJpbmRpbmdDb250ZXh0KCkgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdG9TdWJTZWN0aW9uLnNldEJpbmRpbmdDb250ZXh0KHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGFBY3Rpb25zID0gb1N1YlNlY3Rpb24uZ2V0QWdncmVnYXRpb24oXCJhY3Rpb25zXCIpO1xuXHRcdFx0XHRcdG9BY3Rpb25CaW5kaW5nQ29udGV4dCA9IF9jaGVja0FjdGlvbnMoYUFjdGlvbnMpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIG9BY3Rpb25CaW5kaW5nQ29udGV4dCA/IG9BY3Rpb25CaW5kaW5nQ29udGV4dCA6IHVuZGVmaW5lZDtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0cmV0dXJuIG9BY3Rpb25CaW5kaW5nQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKG9Db250cm9sID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiaW5wdXQgcGFyYW1ldGVyIG9Db250cm9sIHVuZGVmaW5lZCB3aGVuIHRyeWluZyB0byBkZXRlcm1pbmUgdGhlIGFjdGlvbiBvdmVybG9hZCBjb250ZXh0XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRvQ3VycmVudENvbnRyb2wgPSBvQ29udHJvbDtcblx0XHRcdHdoaWxlICghb0N1cnJlbnRDb250cm9sLmlzQShcInNhcC51eGFwLk9iamVjdFBhZ2VTZWN0aW9uXCIpKSB7XG5cdFx0XHRcdG9DdXJyZW50Q29udHJvbCA9IG9DdXJyZW50Q29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFvQ3VycmVudENvbnRyb2wpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiT2JqZWN0UGFnZVNlY3Rpb24gbm90IGZvdW5kIGluIFVJIGhpZXJhcmNoeVwiKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFTdWJTZWN0aW9ucyA9IG9DdXJyZW50Q29udHJvbC5nZXRBZ2dyZWdhdGlvbihcInN1YlNlY3Rpb25zXCIpO1xuXHRcdFx0XHRyZXR1cm4gX2NoZWNrU3ViU2VjdGlvbnMoYVN1YlNlY3Rpb25zKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgYW55KTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cblx0X2NyZWF0ZVNpYmxpbmdJbmZvKGN1cnJlbnRDb250ZXh0OiBWNENvbnRleHQsIG5ld0NvbnRleHQ6IFY0Q29udGV4dCk6IFNpYmxpbmdJbmZvcm1hdGlvbiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG5ld0NvbnRleHQsXG5cdFx0XHRwYXRoTWFwcGluZzogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b2xkUGF0aDogY3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld0NvbnRleHQuZ2V0UGF0aCgpXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9O1xuXHR9XG5cblx0X3VwZGF0ZVBhdGhzSW5IaXN0b3J5KG1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldFBhdGhNYXBwaW5nKG1hcHBpbmdzKTtcblxuXHRcdC8vIEFsc28gdXBkYXRlIHRoZSBzZW1hbnRpYyBtYXBwaW5nIGluIHRoZSByb3V0aW5nIHNlcnZpY2Vcblx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0aWYgKG1hcHBpbmdzLmxlbmd0aCAmJiBsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5vbGRQYXRoKSB7XG5cdFx0XHRsYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZHMgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWJvYmplY3QgcGFnZSwgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGggZm9yXG5cdCAqIGFsbCBpbnRlcm1lZGlhdGVzIHBhdGhzIGJldHdlZW4gdGhlIE9QIGFuZCB0aGUgc3ViLU9QLlxuXHQgKlxuXHQgKiBAcGFyYW0gcm9vdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBvZiB0aGUgZHJhZnRcblx0ICogQHBhcmFtIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBzdWJvYmplY3Rcblx0ICogQHBhcmFtIHNQcm9ncmFtbWluZ01vZGVsIFRoZSBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKiBAcGFyYW0gZG9Ob3RDb21wdXRlSWZSb290IElmIHRydWUsIHdlIGRvbid0IGNvbXB1dGUgc2libGluZ0luZm8gaWYgdGhlIHJvb3QgYW5kIHRoZSByaWdodG1vc3QgY29udGV4dHMgYXJlIHRoZSBzYW1lXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3Rcblx0ICovXG5cdGFzeW5jIF9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdHJvb3RDdXJyZW50Q29udGV4dDogVjRDb250ZXh0LFxuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0OiBWNENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkLFxuXHRcdHNQcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcsXG5cdFx0ZG9Ob3RDb21wdXRlSWZSb290OiBib29sZWFuXG5cdCk6IFByb21pc2U8U2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkPiB7XG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQgPSByaWdodG1vc3RDdXJyZW50Q29udGV4dCA/PyByb290Q3VycmVudENvbnRleHQ7XG5cdFx0aWYgKCFyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3RhcnRzV2l0aChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0Ly8gV3JvbmcgdXNhZ2UgISFcblx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdH1cblx0XHRpZiAoZG9Ob3RDb21wdXRlSWZSb290ICYmIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSA9PT0gcm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1vZGVsID0gcm9vdEN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRyZXR1cm4gZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihyb290Q3VycmVudENvbnRleHQsIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSWYgbm90IGluIGRyYWZ0IG1vZGUsIHdlIGp1c3QgcmVjcmVhdGUgYSBjb250ZXh0IGZyb20gdGhlIHBhdGggb2YgdGhlIHJpZ2h0bW9zdCBjb250ZXh0XG5cdFx0XHQvLyBObyBwYXRoIG1hcHBpbmcgaXMgbmVlZGVkXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0YXJnZXRDb250ZXh0OiBtb2RlbC5iaW5kQ29udGV4dChyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldEJvdW5kQ29udGV4dCgpLFxuXHRcdFx0XHRwYXRoTWFwcGluZzogW11cblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cdF9pc0ZjbEVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSkuX2lzRmNsRW5hYmxlZCgpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVkaXRGbG93O1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0VBa2pCTyxnQkFBZ0JBLElBQWhCLEVBQXNCQyxPQUF0QixFQUErQjtJQUNyQyxJQUFJO01BQ0gsSUFBSUMsTUFBTSxHQUFHRixJQUFJLEVBQWpCO0lBQ0EsQ0FGRCxDQUVFLE9BQU1HLENBQU4sRUFBUztNQUNWLE9BQU9GLE9BQU8sQ0FBQ0UsQ0FBRCxDQUFkO0lBQ0E7O0lBQ0QsSUFBSUQsTUFBTSxJQUFJQSxNQUFNLENBQUNFLElBQXJCLEVBQTJCO01BQzFCLE9BQU9GLE1BQU0sQ0FBQ0UsSUFBUCxDQUFZLEtBQUssQ0FBakIsRUFBb0JILE9BQXBCLENBQVA7SUFDQTs7SUFDRCxPQUFPQyxNQUFQO0VBQ0E7O0VBR00sMEJBQTBCRixJQUExQixFQUFnQ0ssU0FBaEMsRUFBMkM7SUFDakQsSUFBSTtNQUNILElBQUlILE1BQU0sR0FBR0YsSUFBSSxFQUFqQjtJQUNBLENBRkQsQ0FFRSxPQUFPRyxDQUFQLEVBQVU7TUFDWCxPQUFPRSxTQUFTLENBQUMsSUFBRCxFQUFPRixDQUFQLENBQWhCO0lBQ0E7O0lBQ0QsSUFBSUQsTUFBTSxJQUFJQSxNQUFNLENBQUNFLElBQXJCLEVBQTJC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
|
|
2029
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiZmluYWxpemVyIiwiYmluZCIsIkNyZWF0aW9uTW9kZSIsIkZFTGlicmFyeSIsIlByb2dyYW1taW5nTW9kZWwiLCJDb25zdGFudHMiLCJEcmFmdFN0YXR1cyIsIkVkaXRNb2RlIiwiU3RhcnR1cE1vZGUiLCJNZXNzYWdlVHlwZSIsImNvcmVMaWJyYXJ5IiwiRWRpdEZsb3ciLCJkZWZpbmVVSTVDbGFzcyIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJlZGl0RG9jdW1lbnQiLCJvQ29udGV4dCIsImJEcmFmdE5hdmlnYXRpb24iLCJ0cmFuc2FjdGlvbkhlbHBlciIsIl9nZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJfZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwicmlnaHRtb3N0Q29udGV4dCIsImJhc2UiLCJlZGl0RmxvdyIsIm9uQmVmb3JlRWRpdCIsImNvbnRleHQiLCJnZXRWaWV3IiwiX2dldE1lc3NhZ2VIYW5kbGVyIiwib05ld0RvY3VtZW50Q29udGV4dCIsInNQcm9ncmFtbWluZ01vZGVsIiwiX2dldFByb2dyYW1taW5nTW9kZWwiLCJfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsImdldE1vZGVsIiwiX3NldEVkaXRNb2RlIiwiRWRpdGFibGUiLCJzaG93TWVzc2FnZURpYWxvZyIsIl9oYW5kbGVOZXdDb250ZXh0IiwiY29udGV4dFRvTmF2aWdhdGUiLCJTdGlja3kiLCJfaGFuZGxlU3RpY2t5T24iLCJfaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwic2libGluZ0luZm8iLCJfY3JlYXRlU2libGluZ0luZm8iLCJfdXBkYXRlUGF0aHNJbkhpc3RvcnkiLCJwYXRoTWFwcGluZyIsInRhcmdldENvbnRleHQiLCJnZXRQYXRoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsImFDb250ZXh0cyIsIm1QYXJhbWV0ZXJzIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvbkJlZm9yZURlbGV0ZSIsImdldENvbnRyb2xsZXIiLCJfZWRpdEZsb3ciLCJ1cGRhdGVEb2N1bWVudCIsIm9Qcm9taXNlIiwib3JpZ2luYWxCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiYklzRHJhZnQiLCJEcmFmdCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIl9zeW5jVGFzayIsImhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucyIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwiX3NldERyYWZ0U3RhdHVzIiwiU2F2aW5nIiwib0JpbmRpbmdDb250ZXh0Iiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXROYW1lIiwiZ2V0TWV0YUNvbnRleHQiLCJnZXRPYmplY3QiLCJhU2VtYW50aWNLZXlzIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJsZW5ndGgiLCJvQ3VycmVudFNlbWFudGljTWFwcGluZyIsIl9nZXRTZW1hbnRpY01hcHBpbmciLCJzQ3VycmVudFNlbWFudGljUGF0aCIsInNlbWFudGljUGF0aCIsInNDaGFuZ2VkUGF0aCIsImdldFNlbWFudGljUGF0aCIsIlNhdmVkIiwiQ2xlYXIiLCJzaG93TWVzc2FnZXMiLCJjcmVhdGVEb2N1bWVudCIsInZMaXN0QmluZGluZyIsIm1JblBhcmFtZXRlcnMiLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsImNyZWF0aW9uUm93Iiwib0NyZWF0aW9uUm93T2JqZWN0cyIsIm9UYWJsZSIsImdldFBhcmVudCIsIm9FeGVjQ3VzdG9tVmFsaWRhdGlvbiIsInZhbGlkYXRlRG9jdW1lbnQiLCJkYXRhIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiZ2V0Q3JlYXRpb25Sb3ciLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJzZXRQcm9wZXJ0eSIsIklubGluZSIsInRhYmxlSWQiLCJieUlkIiwiaXNBIiwiZm5Gb2N1c09yU2Nyb2xsIiwiZm9jdXNSb3ciLCJzY3JvbGxUb0luZGV4IiwiZ2V0Um93QmluZGluZyIsImF0dGFjaEV2ZW50T25jZSIsImNyZWF0ZUF0RW5kIiwiZ2V0TGVuZ3RoIiwiaGFuZGxlU2lkZUVmZmVjdHMiLCJvTGlzdEJpbmRpbmciLCJvQ3JlYXRpb25Qcm9taXNlIiwib05ld0NvbnRleHQiLCJjcmVhdGVkIiwiQ29tbW9uVXRpbHMiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiYXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwiY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwiYVZhbGlkYXRpb25NZXNzYWdlcyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJtQ3VzdG9tVmFsaWRpdHkiLCJnZXRQcm9wZXJ0eSIsIm9NZXNzYWdlTWFuYWdlciIsIkNvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImFDdXN0b21NZXNzYWdlcyIsIm9GaWVsZENvbnRyb2wiLCJzVGFyZ2V0IiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZvckVhY2giLCJvTWVzc2FnZSIsImNvZGUiLCJyZW1vdmVNZXNzYWdlcyIsIm9WYWxpZGF0aW9uTWVzc2FnZSIsIm1lc3NhZ2VUYXJnZXQiLCJnZXRDb250cm9sIiwiZmllbGRJZCIsImdldEJpbmRpbmdQYXRoIiwiZmlsdGVyIiwidGFyZ2V0IiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZSIsIm1lc3NhZ2VUZXh0IiwicHJvY2Vzc29yIiwidHlwZSIsIkVycm9yIiwidGVjaG5pY2FsIiwicGVyc2lzdGVudCIsImFFeGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyIsImFkZENvbnRyb2xJZCIsInB1c2giLCJ0ZXh0IiwiY3VzdG9tTWVzc2FnZXMiLCJyZXNvbHZlQ3JlYXRpb25Nb2RlIiwiaW5pdGlhbENyZWF0aW9uTW9kZSIsInByb2dyYW1taW5nTW9kZWwiLCJOZXdQYWdlIiwiaXNSZWxhdGl2ZSIsInNQYXRoIiwic05ld0FjdGlvbiIsImFQYXJhbWV0ZXJzIiwiRGVmZXJyZWQiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImdldEhlYWRlckNvbnRleHQiLCJhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzIiwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwiQXN5bmMiLCJiU2hvdWxkQnVzeUxvY2siLCJCdXN5TG9ja2VyIiwibG9jayIsIm9Mb2NrT2JqZWN0Iiwib05hdmlnYXRpb24iLCJyZXNvbHZlZENyZWF0aW9uTW9kZSIsIm9Sb3V0aW5nTGlzdGVuZXIiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJiRGVmZXJyZWRDb250ZXh0IiwiZWRpdGFibGUiLCJiRm9yY2VGb2N1cyIsImFzeW5jQ29udGV4dCIsIm9DcmVhdGlvbiIsIlN5bmMiLCJtQXJncyIsImNyZWF0ZUFjdGlvbiIsInRyYW5zaWVudCIsImNvcmVSZXNvdXJjZUJ1bmRsZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsIm5hdmlnYXRlVG9NZXNzYWdlUGFnZSIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiYkZyb21EZWZlcnJlZCIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NyZWF0aW9uUm93TGlzdEJpbmRpbmciLCJvQ3JlYXRpb25Sb3dDb250ZXh0IiwiZ2V0QmluZGluZyIsImJTa2lwU2lkZUVmZmVjdHMiLCJvTmV3VHJhbnNpZW50Q29udGV4dCIsImNyZWF0ZSIsIm9DcmVhdGlvblJvdyIsInNldEJpbmRpbmdDb250ZXh0IiwiY2F0Y2giLCJ0cmFjZSIsImRlbGV0ZSIsImlzTG9ja2VkIiwidW5sb2NrIiwiUHJvbWlzZSIsInJlamVjdCIsImJJc05ld1BhZ2VDcmVhdGlvbiIsImFsbCIsImFQYXJhbXMiLCJvTW9kZWwiLCJfc2VuZEFjdGl2aXR5IiwiQWN0aXZpdHkiLCJDcmVhdGUiLCJuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCJjYW5jZWxlZCIsInJlamVjdGVkSXRlbXMiLCJPRGF0YUxpc3RCaW5kaW5nIiwib1BheWxvYWQiLCJfZ2V0Um91dGluZ0xpc3RlbmVyIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsImJ1c3lNb2RlIiwiX2hhbmRsZUNyZWF0ZUV2ZW50cyIsInBhcmVudENvbnRyb2wiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIm9uQmVmb3JlQ3JlYXRlIiwib1Jlc291cmNlQnVuZGxlIiwiT2JqZWN0Iiwia2V5cyIsInNQcm9wZXJ0eVBhdGgiLCJvUHJvcGVydHkiLCIka2luZCIsIl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMiLCJfZ2V0R2xvYmFsVUlNb2RlbCIsIl9nZXRSZXNvdXJjZUJ1bmRsZSIsIkV4dGVybmFsIiwicmVzb2x2ZSIsIm9BcHBDb21wb25lbnQiLCJnZXRSb3V0ZXJQcm94eSIsInJlbW92ZUlBcHBTdGF0ZUtleSIsIm9Db250cm9sbGVyIiwic0NyZWF0ZVBhdGgiLCJNb2RlbEhlbHBlciIsImdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyIsImhhbmRsZXJzIiwib25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kIiwib3V0Ym91bmQiLCJ1bmRlZmluZWQiLCJvbkJlZm9yZVNhdmUiLCJvbkJlZm9yZURpc2NhcmQiLCJzYXZlRG9jdW1lbnQiLCJiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImFCaW5kaW5ncyIsImJpbmRpbmdzIiwiX3N1Ym1pdE9wZW5DaGFuZ2VzIiwiYWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMiLCJBY3RpdmF0ZSIsIl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsIlN0YW5kYXJkQWN0aW9ucyIsInNhdmUiLCJUcmlnZ2VyVHlwZSIsInN0YW5kYXJkQWN0aW9uIiwiRGlzcGxheSIsImlzRmNsRW5hYmxlZCIsInRvZ2dsZURyYWZ0QWN0aXZlIiwib0NvbnRleHREYXRhIiwiYkVkaXRhYmxlIiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsIm9SaWdodG1vc3RDb250ZXh0IiwibGFzdFNlbWFudGljTWFwcGluZyIsInRlY2huaWNhbFBhdGgiLCJ0YXJnZXRQYXRoIiwibmV3UGF0aCIsIm9sZFBhdGgiLCJjYW5jZWxEb2N1bWVudCIsImNhbmNlbEJ1dHRvbiIsImNvbnRyb2wiLCJiZWZvcmVDYW5jZWxDYWxsQmFjayIsImNhbmNlbFJlc3VsdCIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyIsInNraXBCaW5kaW5nVG9WaWV3IiwiZGVsZXRlRG9jdW1lbnQiLCJiRmluZEFjdGl2ZUNvbnRleHRzIiwiX2RlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJEZWxldGUiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJnZXRTdGFydHVwTW9kZSIsIkRlZXBsaW5rIiwiZXhpdEZyb21BcHAiLCJhcHBseURvY3VtZW50IiwiaW52b2tlQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJtRXh0cmFQYXJhbXMiLCJvQ29udHJvbCIsIm9DdXJyZW50Q29udHJvbCIsImFQYXJ0cyIsInNPdmVybG9hZEVudGl0eVR5cGUiLCJvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyIsIm9WaWV3IiwiQXJyYXkiLCJpc0FycmF5IiwiY29udGV4dHMiLCJtb2RlbCIsImlzTmF2aWdhYmxlIiwicmVxdWlyZXNOYXZpZ2F0aW9uIiwiY29udHJvbElkIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJpbmRleE9mIiwic3BsaXQiLCJyZXBsYWNlQWxsIiwiYlN0YXRpY0FjdGlvbiIsImlzVGFibGVCb3VuZCIsInNCaW5kaW5nUGF0aCIsInBhdGgiLCJzVGFibGVDb250ZXh0RW50aXR5VHlwZSIsIm9BY3Rpb25PdmVybG9hZENvbnRleHQiLCJfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbVN1YlNlY3Rpb25zIiwiZW5hYmxlQXV0b1Njcm9sbCIsIl9jcmVhdGVBY3Rpb25Qcm9taXNlIiwic0lkIiwiYkdldEJvdW5kQ29udGV4dCIsIl9nZXRCb3VuZENvbnRleHQiLCJiT2JqZWN0UGFnZSIsImdldFZpZXdEYXRhIiwiY29udmVydGVyVHlwZSIsImNhbGxBY3Rpb24iLCJvUmVzcG9uc2UiLCJBY3Rpb24iLCJhY3Rpb24iLCJmUmVzb2x2ZXIiLCJfZ2V0SW50ZXJuYWxNb2RlbCIsInZDb250ZXh0Iiwic0NvbnRleHRNZXRhUGF0aCIsIm9BY3Rpb25Db250ZXh0Iiwic0FjdGlvbkNvbnRleHRNZXRhUGF0aCIsIm5vSGlzdG9yeUVudHJ5IiwiaW5mbyIsIl9yZWZyZXNoTGlzdElmUmVxdWlyZWQiLCJfZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsImVyciIsImZSZWplY3RvciIsInNlY3VyZWRFeGVjdXRpb24iLCJmbkZ1bmN0aW9uIiwiYkJ1c3lTZXQiLCJidXN5Iiwic2V0IiwiYkJ1c3lDaGVjayIsImNoZWNrIiwiYlVwZGF0ZXNEb2N1bWVudCIsInVwZGF0ZXNEb2N1bWVudCIsImZpbmFsbHkiLCJoYW5kbGVQYXRjaFNlbnQiLCJvRXZlbnQiLCJvUGF0Y2hQcm9taXNlIiwiZ2V0U291cmNlIiwicGF0Y2hDb21wbGV0ZWRFdmVudCIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiaGFuZGxlQ3JlYXRlQWN0aXZhdGUiLCJvQmluZGluZyIsImJBdEVuZCIsImJJbmFjdGl2ZSIsIm9QYXJhbXMiLCJpbmFjdGl2ZSIsInNFZGl0TW9kZSIsImJDcmVhdGlvbk1vZGUiLCJzZXRFZGl0TW9kZSIsInNEcmFmdFN0YXRlIiwic2V0RHJhZnRTdGF0dXMiLCJnZXRSb3V0aW5nTGlzdGVuZXIiLCJnZXRHbG9iYWxVSU1vZGVsIiwidlRhc2siLCJzeW5jVGFzayIsImdldFByb2dyYW1taW5nTW9kZWwiLCJkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwiaGFuZGxlQ3JlYXRlRXZlbnRzIiwiZ2V0VHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRJbnRlcm5hbE1vZGVsIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJnZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwic0NvbnRyb2xJZCIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJfZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsIl9kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJyZWxhdGVkQ29udGV4dHMiLCJjb250ZW50IiwibWFwIiwic2VuZCIsInRyaWdnZXJUeXBlIiwidHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkiLCJnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzIiwic3VibWl0QmF0Y2giLCJvUmVxdWVzdG9yIiwid2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiaGFuZGxlU3RpY2t5T24iLCJfaGFuZGxlU3RpY2t5T2ZmIiwiaGFuZGxlU3RpY2t5T2ZmIiwiX29uQmFja05hdmlnYXRpb25JblNlc3Npb24iLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiX2Rpc2NhcmRTdGlja3lTZXNzaW9uIiwiZGlzY2FyZFN0aWNreVNlc3Npb24iLCJpbnRlcm5hbE1vZGVsIiwiZ2V0SHR0cEhlYWRlcnMiLCJiUmVjcmVhdGVDb250ZXh0IiwiYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5IiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJiUGVyc2lzdE9QU2Nyb2xsIiwic2hvd1BsYWNlaG9sZGVyIiwia2VlcEN1cnJlbnRMYXlvdXQiLCJ2aWV3IiwicGFyYW1zIiwidmlld0xldmVsIiwiYlJlZnJlc2hBZnRlckFjdGlvbiIsInNWaWV3SWQiLCJnZXRJZCIsImFNZXNzYWdlcyIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImkiLCJ2YWxpZGF0aW9uIiwiZ2V0Q29udHJvbElkIiwib0RhdGEiLCJhS2V5cyIsIm9DdXJyZW50RGF0YSIsImJSZXR1cm5lZENvbnRleHRJc1NhbWUiLCJldmVyeSIsInNLZXkiLCJpc1Jvb3QiLCJyZWZyZXNoIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJnZXRDb250ZXh0IiwiYVJlcXVlc3RQcm9taXNlcyIsIm9LZXkiLCJyZXF1ZXN0T2JqZWN0IiwiJFByb3BlcnR5UGF0aCIsIl9jaGVja0FjdGlvbnMiLCJhQWN0aW9ucyIsIm9BY3Rpb25CaW5kaW5nQ29udGV4dCIsIm9BY3Rpb24iLCJfY2hlY2tTdWJTZWN0aW9ucyIsImFTdWJTZWN0aW9ucyIsIm9TdWJTZWN0aW9uIiwiZ2V0QWdncmVnYXRpb24iLCJjdXJyZW50Q29udGV4dCIsIm5ld0NvbnRleHQiLCJtYXBwaW5ncyIsInNldFBhdGhNYXBwaW5nIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJkb05vdENvbXB1dGVJZlJvb3QiLCJzdGFydHNXaXRoIiwiZHJhZnQiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJFZGl0Rmxvdy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBzZW5kIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCB0eXBlIHsgU2libGluZ0luZm9ybWF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBTZW1hbnRpY01hcHBpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIHRyaWdnZXJDb25maWd1cmVkU3VydmV5LCBUcmlnZ2VyVHlwZSB9IGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL0ZlZWRiYWNrXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IGNvcmVMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgQ29yZUV4LCBWNENvbnRleHQgfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5cbmNvbnN0IENyZWF0aW9uTW9kZSA9IEZFTGlicmFyeS5DcmVhdGlvbk1vZGUsXG5cdFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbCxcblx0Q29uc3RhbnRzID0gRkVMaWJyYXJ5LkNvbnN0YW50cyxcblx0RHJhZnRTdGF0dXMgPSBGRUxpYnJhcnkuRHJhZnRTdGF0dXMsXG5cdEVkaXRNb2RlID0gRkVMaWJyYXJ5LkVkaXRNb2RlLFxuXHRTdGFydHVwTW9kZSA9IEZFTGlicmFyeS5TdGFydHVwTW9kZSxcblx0TWVzc2FnZVR5cGUgPSBjb3JlTGlicmFyeS5NZXNzYWdlVHlwZTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFB1YmxpYyBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0cHJpdmF0ZSBmbkRpcnR5U3RhdGVQcm92aWRlcj86IEZ1bmN0aW9uO1xuXHRwcml2YXRlIGZuSGFuZGxlU2Vzc2lvblRpbWVvdXQ/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBtUGF0Y2hQcm9taXNlcz86IGFueTtcblx0cHJpdmF0ZSBfZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uPzogRnVuY3Rpb247XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGF2YWlsYWJsZVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjZWRpdERvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGVkaXREb2N1bWVudChvQ29udGV4dDogVjRDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkRyYWZ0TmF2aWdhdGlvbiA9IHRydWU7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cdFx0bGV0IHJpZ2h0bW9zdENvbnRleHQ7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUVkaXQoeyBjb250ZXh0OiBvQ29udGV4dCB9KTtcblx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5lZGl0RG9jdW1lbnQob0NvbnRleHQsIHRoaXMuZ2V0VmlldygpLCB0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpKTtcblxuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblxuXHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCwgb0NvbnRleHQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKTtcblxuXHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXG5cdFx0XHRcdGlmIChvTmV3RG9jdW1lbnRDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9OZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRyaWdodG1vc3RDb250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRsZXQgc2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCByaWdodG1vc3RDb250ZXh0LCBzUHJvZ3JhbW1pbmdNb2RlbCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPSBvTmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgdHJ1ZSwgZmFsc2UsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBzdGlja3lPbiBoYW5kbGVyIG11c3QgYmUgc2V0IGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIGRvbmUsXG5cdFx0XHRcdFx0XHQvLyBhcyB0aGUgVVJMIG1heSBjaGFuZ2UgaW4gdGhlIGNhc2Ugb2YgRkNMXG5cdFx0XHRcdFx0XHR0aGlzLl9oYW5kbGVTdGlja3lPbihvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGVkaXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0ZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMoYUNvbnRleHRzOiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRpZiAobVBhcmFtZXRlcnMpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzKGFDb250ZXh0cywgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgZGlzcGxheXMgdGhlIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBlcnJvcnMgZHVyaW5nIGFuIHVwZGF0ZS5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSB1cGRhdGVkIGZpZWxkXG5cdCAqIEBwYXJhbSBvUHJvbWlzZSBQcm9taXNlIHRvIGRldGVybWluZSB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4gVGhlIHByb21pc2Ugc2hvdWxkIGJlIHJlc29sdmVkIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBzbyB0aGUgZHJhZnQgc3RhdHVzIGNhbiBiZSB1cGRhdGVkLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZHJhZnQgc3RhdHVzIGhhcyBiZWVuIHVwZGF0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3VwZGF0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHVwZGF0ZURvY3VtZW50KG9Db250ZXh0OiBvYmplY3QsIG9Qcm9taXNlOiBQcm9taXNlPGFueT4pOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgYklzRHJhZnQgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0cmV0dXJuIHRoaXMuX3N5bmNUYXNrKGFzeW5jICgpID0+IHtcblx0XHRcdGlmIChvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IG9Qcm9taXNlO1xuXHRcdFx0XHQvLyBJZiBhIG5hdmlnYXRpb24gaGFwcGVuZWQgd2hpbGUgb1Byb21pc2Ugd2FzIGJlaW5nIHJlc29sdmVkLCB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGNoYW5nZWRcblx0XHRcdFx0Ly8gSW4gdGhhdCBjYXNlLCB3ZSBzaG91bGRuJ3QgZG8gYW55dGhpbmdcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0aWYgKGJJc0RyYWZ0ICYmIG9CaW5kaW5nQ29udGV4dCAmJiBvQmluZGluZ0NvbnRleHQgPT09IG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRzRW50aXR5U2V0TmFtZSA9IChvTWV0YU1vZGVsIGFzIGFueSkuZ2V0TWV0YUNvbnRleHQob0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIiksXG5cdFx0XHRcdFx0XHRhU2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNFbnRpdHlTZXROYW1lKTtcblx0XHRcdFx0XHRpZiAoYVNlbWFudGljS2V5cyAmJiBhU2VtYW50aWNLZXlzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0N1cnJlbnRTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKSxcblx0XHRcdFx0XHRcdFx0c0N1cnJlbnRTZW1hbnRpY1BhdGggPSBvQ3VycmVudFNlbWFudGljTWFwcGluZyAmJiBvQ3VycmVudFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGgsXG5cdFx0XHRcdFx0XHRcdHNDaGFuZ2VkUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChvQmluZGluZ0NvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdFx0Ly8gc0N1cnJlbnRTZW1hbnRpY1BhdGggY291bGQgYmUgbnVsbCBpZiB3ZSBoYXZlIG5hdmlnYXRlZCB2aWEgZGVlcCBsaW5rIHRoZW4gdGhlcmUgYXJlIG5vIHNlbWFudGljTWFwcGluZ3MgdG8gY2FsY3VsYXRlIGl0IGZyb21cblx0XHRcdFx0XHRcdGlmIChzQ3VycmVudFNlbWFudGljUGF0aCAmJiBzQ3VycmVudFNlbWFudGljUGF0aCAhPT0gc0NoYW5nZWRQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQob0JpbmRpbmdDb250ZXh0LCB0cnVlLCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgdXBkYXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHRcdGlmIChiSXNEcmFmdCAmJiBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgU3luYyAtIHRoZSBjcmVhdGlvbiBpcyB0cmlnZ2VyZWQgYW5kIG9uY2UgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQsIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmVcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQXN5bmMgLSB0aGUgY3JlYXRpb24gYW5kIHRoZSBuYXZpZ2F0aW9uIHRvIHRoZSBpbnN0YW5jZSBhcmUgZG9uZSBpbiBwYXJhbGxlbFxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZCAtIHRoZSBjcmVhdGlvbiBpcyBkb25lIG9uIHRoZSB0YXJnZXQgcGFnZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBDcmVhdGlvblJvdyAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSBhc3luYyBzbyB0aGUgdXNlciBpcyBub3QgYmxvY2tlZFxuXHQvLyBtUGFyYW1ldGVycy5jcmVhdGlvblJvdyBJbnN0YW5jZSBvZiB0aGUgY3JlYXRpb24gcm93IC0gKFRPRE86IGdldCByaWQgYnV0IHVzZSBsaXN0IGJpbmRpbmdzIG9ubHkpXG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcGFyYW1cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gdkxpc3RCaW5kaW5nICBPRGF0YUxpc3RCaW5kaW5nIG9iamVjdCBvciB0aGUgYmluZGluZyBwYXRoIGZvciBhIHRlbXBvcmFyeSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdCAqICAgICAgICAgICAgICAgICAgICBOZXdQYWdlIC0gdGhlIGNyZWF0ZWQgZG9jdW1lbnQgaXMgc2hvd24gaW4gYSBuZXcgcGFnZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgbWV0YWRhdGEgJ1N5bmMnLCAnQXN5bmMnIG9yICdEZWZlcnJlZCcgaXMgdXNlZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgSW5saW5lIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIChpbiBhIHRhYmxlKVxuXHQgKiAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbiBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgdmlhIHRoZSBwYXJhbWV0ZXIgJ291dGJvdW5kJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5vdXRib3VuZCBUaGUgbmF2aWdhdGlvbiB0YXJnZXQgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0V4dGVybmFsJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGVBdEVuZCBTcGVjaWZpZXMgaWYgdGhlIG5ldyBlbnRyeSBzaG91bGQgYmUgY3JlYXRlZCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiBhIHRhYmxlIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdJbmxpbmUnXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2NyZWF0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNyZWF0ZURvY3VtZW50KFxuXHRcdHZMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0XHRcdG91dGJvdW5kPzogc3RyaW5nO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLl9nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0bGV0IG9UYWJsZTogYW55OyAvL3Nob3VsZCBiZSBUYWJsZSBidXQgdGhlcmUgYXJlIG1pc3NpbmcgbWV0aG9kcyBpbnRvIHRoZSBkZWZcblx0XHRsZXQgbVBhcmFtZXRlcnM6IGFueSA9IG1JblBhcmFtZXRlcnM7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gdGhpcy5fZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0XHRjb25zdCBiU2hvdWxkQnVzeUxvY2sgPVxuXHRcdFx0IW1QYXJhbWV0ZXJzIHx8XG5cdFx0XHQobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKTtcblx0XHRsZXQgb0V4ZWNDdXN0b21WYWxpZGF0aW9uID0gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkucmVtb3ZlSUFwcFN0YXRlS2V5KCk7XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpIHtcblx0XHRcdC8vIENyZWF0ZSBieSBuYXZpZ2F0aW5nIHRvIGFuIGV4dGVybmFsIHRhcmdldFxuXHRcdFx0Ly8gVE9ETzogQ2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbiAoY3VycmVudGx5IHVzaW5nIHRoZSBzYW1lIGFzIGZvciBvdXRib3VuZCBjaGV2cm9uIG5hdiwgYW5kIHdpdGhvdXQgYW55IGNvbnRleHQgLSAzcmQgcGFyYW0pXG5cdFx0XHRhd2FpdCB0aGlzLl9zeW5jVGFzaygpO1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCk7XG5cdFx0XHRjb25zdCBzQ3JlYXRlUGF0aCA9IE1vZGVsSGVscGVyLmdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyh0aGlzLmdldFZpZXcoKSwgdkxpc3RCaW5kaW5nKTtcblxuXHRcdFx0KG9Db250cm9sbGVyIGFzIGFueSkuaGFuZGxlcnMub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBtUGFyYW1ldGVycy5vdXRib3VuZCwgdW5kZWZpbmVkLCBzQ3JlYXRlUGF0aCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cpIHtcblx0XHRcdGNvbnN0IG9DcmVhdGlvblJvd09iamVjdHMgPSBtUGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldE9iamVjdCgpO1xuXHRcdFx0ZGVsZXRlIG9DcmVhdGlvblJvd09iamVjdHNbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0b1RhYmxlID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0UGFyZW50KCk7XG5cdFx0XHRvRXhlY0N1c3RvbVZhbGlkYXRpb24gPSB0cmFuc2FjdGlvbkhlbHBlci52YWxpZGF0ZURvY3VtZW50KFxuXHRcdFx0XHRvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGRhdGE6IG9DcmVhdGlvblJvd09iamVjdHMsXG5cdFx0XHRcdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuYmFzZS5nZXRWaWV3KClcblx0XHRcdCk7XG5cblx0XHRcdC8vIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgaXMgc2V0IHRvIGZhbHNlIGluIG1hbmlmZXN0IGNvbnZlcnRlciAoVGFibGUudHMpIGlmIGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiBleGlzdHNcblx0XHRcdGlmIChvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YVwiKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSAmJiBtUGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHRvVGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlO1xuXHRcdH1cblxuXHRcdGlmIChvVGFibGUgJiYgb1RhYmxlLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdGNvbnN0IGZuRm9jdXNPclNjcm9sbCA9XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSA/IG9UYWJsZS5mb2N1c1Jvdy5iaW5kKG9UYWJsZSkgOiBvVGFibGUuc2Nyb2xsVG9JbmRleC5iaW5kKG9UYWJsZSk7XG5cdFx0XHRvVGFibGUuZ2V0Um93QmluZGluZygpLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGZuRm9jdXNPclNjcm9sbChtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA/IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0TGVuZ3RoKCkgOiAwLCB0cnVlKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IGhhbmRsZVNpZGVFZmZlY3RzID0gYXN5bmMgKG9MaXN0QmluZGluZzogYW55LCBvQ3JlYXRpb25Qcm9taXNlOiBQcm9taXNlPENvbnRleHQ+KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvTmV3Q29udGV4dCA9IGF3YWl0IG9DcmVhdGlvblByb21pc2U7XG5cdFx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0XHRhd2FpdCBvTmV3Q29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChvTGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gYVZhbGlkYXRpb25NZXNzYWdlcyBFcnJvciBtZXNzYWdlcyBmcm9tIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0Y29uc3QgY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzID0gKGFWYWxpZGF0aW9uTWVzc2FnZXM6IGFueVtdKSA9PiB7XG5cdFx0XHRjb25zdCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gb1RhYmxlICYmIG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0XHRjb25zdCBtQ3VzdG9tVmFsaWRpdHkgPSBvVGFibGUgJiYgb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiKTtcblx0XHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0XHRcdGNvbnN0IGFDdXN0b21NZXNzYWdlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBvRmllbGRDb250cm9sO1xuXHRcdFx0bGV0IHNUYXJnZXQ6IHN0cmluZztcblxuXHRcdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9NZXNzYWdlLmNvZGUgPT09IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0YVZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChvVmFsaWRhdGlvbk1lc3NhZ2U6IGFueSkgPT4ge1xuXHRcdFx0XHQvLyBIYW5kbGUgQm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRcdGlmIChvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldCkge1xuXHRcdFx0XHRcdG9GaWVsZENvbnRyb2wgPSBDb3JlLmdldENvbnRyb2wobUN1c3RvbVZhbGlkaXR5W29WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKSBhcyBDb250cm9sO1xuXHRcdFx0XHRcdHNUYXJnZXQgPSBgJHtvRmllbGRDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKX0vJHtvRmllbGRDb250cm9sLmdldEJpbmRpbmdQYXRoKFwidmFsdWVcIil9YDtcblx0XHRcdFx0XHQvLyBBZGQgdmFsaWRhdGlvbiBtZXNzYWdlIGlmIHN0aWxsIG5vdCBleGlzdHNcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvTWVzc2FnZS50YXJnZXQgPT09IHNUYXJnZXQ7XG5cdFx0XHRcdFx0XHRcdH0pLmxlbmd0aCA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLmFkZE1lc3NhZ2VzKFxuXHRcdFx0XHRcdFx0XHRuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XHRcdFx0XHRcdFx0XHRjb2RlOiBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdHRlY2huaWNhbDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0cGVyc2lzdGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0OiBzVGFyZ2V0XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBBZGQgY29udHJvbElkIGluIG9yZGVyIHRvIGdldCB0aGUgZm9jdXMgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHBvcG92ZXIgcnVuYWJsZVxuXHRcdFx0XHRcdGNvbnN0IGFFeGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyA9IG9NZXNzYWdlTWFuYWdlclxuXHRcdFx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvTWVzc2FnZS50YXJnZXQgPT09IHNUYXJnZXQ7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXNbMF0uYWRkQ29udHJvbElkKG1DdXN0b21WYWxpZGl0eVtvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCk7XG5cblx0XHRcdFx0XHQvLyBIYW5kbGUgVW5ib3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhQ3VzdG9tTWVzc2FnZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRjb2RlOiBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0dGV4dDogb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoYUN1c3RvbU1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IGFDdXN0b21NZXNzYWdlc1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3QgcmVzb2x2ZUNyZWF0aW9uTW9kZSA9IChcblx0XHRcdGluaXRpYWxDcmVhdGlvbk1vZGU6IHN0cmluZyxcblx0XHRcdHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRcdG9MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsXG5cdFx0KTogc3RyaW5nID0+IHtcblx0XHRcdGlmIChpbml0aWFsQ3JlYXRpb25Nb2RlICYmIGluaXRpYWxDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5OZXdQYWdlKSB7XG5cdFx0XHRcdC8vIHVzZSB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGVcblx0XHRcdFx0cmV0dXJuIGluaXRpYWxDcmVhdGlvbk1vZGU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBOZXdBY3Rpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBjb2xsZWN0aW9uXG5cdFx0XHRcdGlmICghb0xpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRcdGNvbnN0IHNQYXRoID0gb0xpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdC8vIGlmIE5ld0FjdGlvbiB3aXRoIHBhcmFtZXRlcnMgaXMgcHJlc2VudCwgdGhlbiBjcmVhdGlvbiBpcyAnRGVmZXJyZWQnXG5cdFx0XHRcdFx0XHQvLyBpbiB0aGUgYWJzZW5jZSBvZiBOZXdBY3Rpb24gb3IgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycywgY3JlYXRpb24gaXMgYXN5bmNcblx0XHRcdFx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9OZXdBY3Rpb25gKVxuXHRcdFx0XHRcdFx0XHRcdDogb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZC9OZXdBY3Rpb25gKTtcblx0XHRcdFx0XHRpZiAoc05ld0FjdGlvbikge1xuXHRcdFx0XHRcdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7c05ld0FjdGlvbn0vQCR1aTUub3ZlcmxvYWQvMC8kUGFyYW1ldGVyYCkgfHwgW107XG5cdFx0XHRcdFx0XHQvLyBiaW5kaW5nIHBhcmFtZXRlciAoZWc6IF9pdCkgaXMgbm90IGNvbnNpZGVyZWRcblx0XHRcdFx0XHRcdGlmIChhUGFyYW1ldGVycy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0xpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKS5nZXRQYXRoKCkpO1xuXHRcdFx0XHRjb25zdCBhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzID0gQ29tbW9uVXRpbHMuZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzKG9NZXRhTW9kZWwsIHNNZXRhUGF0aCwgdGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0XHRpZiAoYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkFzeW5jO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAoYlNob3VsZEJ1c3lMb2NrKSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgYVZhbGlkYXRpb25NZXNzYWdlcyA9IGF3YWl0IHRoaXMuX3N5bmNUYXNrKG9FeGVjQ3VzdG9tVmFsaWRhdGlvbik7XG5cdFx0XHRpZiAoYVZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyhhVmFsaWRhdGlvbk1lc3NhZ2VzKTtcblx0XHRcdFx0TG9nLmVycm9yKFwiQ3VzdG9tIFZhbGlkYXRpb24gZmFpbGVkXCIpO1xuXHRcdFx0XHQvLyBpZiBjdXN0b20gdmFsaWRhdGlvbiBmYWlscywgd2UgbGVhdmUgdGhlIG1ldGhvZCBpbW1lZGlhdGVseVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGxldCBvTGlzdEJpbmRpbmc6IGFueTtcblx0XHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0XHRcdGlmICh2TGlzdEJpbmRpbmcgJiYgdHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHQvLyB3ZSBhbHJlYWR5IGdldCBhIGxpc3QgYmluZGluZyB1c2UgdGhpcyBvbmVcblx0XHRcdFx0b0xpc3RCaW5kaW5nID0gdkxpc3RCaW5kaW5nO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygdkxpc3RCaW5kaW5nID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdG9MaXN0QmluZGluZyA9IG5ldyAoT0RhdGFMaXN0QmluZGluZyBhcyBhbnkpKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksIHZMaXN0QmluZGluZyk7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5TeW5jO1xuXHRcdFx0XHRkZWxldGUgbVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIG9iamVjdCBvciBwYXRoIGV4cGVjdGVkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvTW9kZWwgPSBvTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9MaXN0QmluZGluZyk7XG5cdFx0XHRjb25zdCByZXNvbHZlZENyZWF0aW9uTW9kZSA9IHJlc29sdmVDcmVhdGlvbk1vZGUoXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSxcblx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdG9MaXN0QmluZGluZyxcblx0XHRcdFx0b01vZGVsLmdldE1ldGFNb2RlbCgpXG5cdFx0XHQpO1xuXG5cdFx0XHRsZXQgb0NyZWF0aW9uOiBhbnk7XG5cdFx0XHRsZXQgbUFyZ3M6IGFueTtcblx0XHRcdGNvbnN0IG9DcmVhdGlvblJvdyA9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93O1xuXHRcdFx0bGV0IG9DcmVhdGlvblJvd0NvbnRleHQ6IGFueTtcblx0XHRcdGxldCBvUGF5bG9hZDogYW55O1xuXHRcdFx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IG9Sb3V0aW5nTGlzdGVuZXIgPSB0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKTtcblxuXHRcdFx0aWYgKHJlc29sdmVkQ3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQpIHtcblx0XHRcdFx0aWYgKHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cpIHtcblx0XHRcdFx0XHRvQ3JlYXRpb25Sb3dDb250ZXh0ID0gb0NyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ3JlYXRpb25Sb3dDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0Ly8gcHJlZmlsbCBkYXRhIGZyb20gY3JlYXRpb24gcm93XG5cdFx0XHRcdFx0b1BheWxvYWQgPSBvQ3JlYXRpb25Sb3dDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGEgPSB7fTtcblx0XHRcdFx0XHRPYmplY3Qua2V5cyhvUGF5bG9hZCkuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvUHJvcGVydHkgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9LyR7c1Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdFx0XHRcdC8vIGVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhW3NQcm9wZXJ0eVBhdGhdID0gb1BheWxvYWRbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKC8qb0NyZWF0aW9uUm93Q29udGV4dCovKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocmVzb2x2ZWRDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyB8fCByZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPSBmYWxzZTsgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0XHQvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuYnVzeU1vZGUgPSBcIkxvY2FsXCI7XG5cblx0XHRcdFx0XHQvLyB0YWtlIGNhcmUgb24gbWVzc2FnZSBoYW5kbGluZywgZHJhZnQgaW5kaWNhdG9yIChpbiBjYXNlIG9mIGRyYWZ0KVxuXHRcdFx0XHRcdC8vIEF0dGFjaCB0aGUgY3JlYXRlIHNlbnQgYW5kIGNyZWF0ZSBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHRcdFx0XHR0aGlzLl9oYW5kbGVDcmVhdGVFdmVudHMob0xpc3RCaW5kaW5nKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZTtcblx0XHRcdFx0b0NyZWF0aW9uID0gdHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBvTmF2aWdhdGlvbjtcblx0XHRcdHN3aXRjaCAocmVzb2x2ZWRDcmVhdGlvbk1vZGUpIHtcblx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ6XG5cdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTGlzdEJpbmRpbmcsIHtcblx0XHRcdFx0XHRcdGJEZWZlcnJlZENvbnRleHQ6IHRydWUsXG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkFzeW5jOlxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0xpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdFx0XHRhc3luY0NvbnRleHQ6IG9DcmVhdGlvbixcblx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuU3luYzpcblx0XHRcdFx0XHRtQXJncyA9IHtcblx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBtUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24pIHtcblx0XHRcdFx0XHRcdG1BcmdzLnRyYW5zaWVudCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb0NyZWF0aW9uLnRoZW4oZnVuY3Rpb24gKG9OZXdEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKCFvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNvcmVSZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShcblx0XHRcdFx0XHRcdFx0XHRjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0VESVRGTE9XX1NBUEZFX0NSRUFUSU9OX0ZBSUxFRF9ERVNDUklQVElPTlwiKVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIEluIGNhc2UgdGhlIFN5bmMgY3JlYXRpb24gd2FzIHRyaWdnZXJlZCBmb3IgYSBkZWZlcnJlZCBjcmVhdGlvbiwgd2UgZG9uJ3QgbmF2aWdhdGUgZm9yd2FyZFxuXHRcdFx0XHRcdFx0XHQvLyBhcyB3ZSdyZSBhbHJlYWR5IG9uIHRoZSBjb3JyZXNwb25kaW5nIE9iamVjdFBhZ2Vcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG1QYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWRcblx0XHRcdFx0XHRcdFx0XHQ/IG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVUb0NvbnRleHQob05ld0RvY3VtZW50Q29udGV4dCwgbUFyZ3MpXG5cdFx0XHRcdFx0XHRcdFx0OiBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTmV3RG9jdW1lbnRDb250ZXh0LCBtQXJncyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLklubGluZTpcblx0XHRcdFx0XHRoYW5kbGVTaWRlRWZmZWN0cyhvTGlzdEJpbmRpbmcsIG9DcmVhdGlvbik7XG5cdFx0XHRcdFx0dGhpcy5fc3luY1Rhc2sob0NyZWF0aW9uKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c6XG5cdFx0XHRcdFx0Ly8gdGhlIGNyZWF0aW9uIHJvdyBzaGFsbCBiZSBjbGVhcmVkIG9uY2UgdGhlIHZhbGlkYXRpb24gY2hlY2sgd2FzIHN1Y2Nlc3NmdWwgYW5kXG5cdFx0XHRcdFx0Ly8gdGhlcmVmb3JlIHRoZSBQT1NUIGNhbiBiZSBzZW50IGFzeW5jIHRvIHRoZSBiYWNrZW5kXG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9DcmVhdGlvblJvd0xpc3RCaW5kaW5nID0gb0NyZWF0aW9uUm93Q29udGV4dC5nZXRCaW5kaW5nKCk7XG5cblx0XHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuYlNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRcdFx0XHRoYW5kbGVTaWRlRWZmZWN0cyhvTGlzdEJpbmRpbmcsIG9DcmVhdGlvbik7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IG9OZXdUcmFuc2llbnRDb250ZXh0ID0gb0NyZWF0aW9uUm93TGlzdEJpbmRpbmcuY3JlYXRlKCk7XG5cdFx0XHRcdFx0XHRvQ3JlYXRpb25Sb3cuc2V0QmluZGluZ0NvbnRleHQob05ld1RyYW5zaWVudENvbnRleHQpO1xuXG5cdFx0XHRcdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0XHRcdFx0b05ld1RyYW5zaWVudENvbnRleHQuY3JlYXRlZCgpLmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGZhc3QgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9DcmVhdGlvblJvd0NvbnRleHQuZGVsZXRlKFwiJGRpcmVjdFwiKTtcblx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0Ly8gUmVzZXQgYnVzeSBpbmRpY2F0b3IgYWZ0ZXIgYSB2YWxpZGF0aW9uIGVycm9yXG5cdFx0XHRcdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKSkge1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkNyZWF0aW9uUm93IG5hdmlnYXRpb24gZXJyb3I6IFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IFByb21pc2UucmVqZWN0KGBVbmhhbmRsZWQgY3JlYXRpb25Nb2RlICR7cmVzb2x2ZWRDcmVhdGlvbk1vZGV9YCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGJJc05ld1BhZ2VDcmVhdGlvbiA9XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0XHRcdGlmIChvQ3JlYXRpb24pIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBhUGFyYW1zID0gYXdhaXQgUHJvbWlzZS5hbGwoW29DcmVhdGlvbiwgb05hdmlnYXRpb25dKTtcblx0XHRcdFx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsLCBvTW9kZWwpO1xuXG5cdFx0XHRcdFx0aWYgKGJJc05ld1BhZ2VDcmVhdGlvbikge1xuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIGJJc05ld1BhZ2VDcmVhdGlvbik7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3Qgb05ld0RvY3VtZW50Q29udGV4dCA9IGFQYXJhbXNbMF07XG5cdFx0XHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlU3RpY2t5T24ob05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdG9FcnJvciAmJlxuXHRcdFx0XHRcdFx0KG9FcnJvci5uYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUgfHxcblx0XHRcdFx0XHRcdFx0b0Vycm9yID09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cgfHxcblx0XHRcdFx0XHRcdFx0b0Vycm9yLmNhbmNlbGVkIHx8XG5cdFx0XHRcdFx0XHRcdChvRXJyb3IucmVqZWN0ZWRJdGVtcyAmJiBvRXJyb3IucmVqZWN0ZWRJdGVtc1swXS5jYW5jZWxlZCkpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKGJTaG91bGRCdXN5TG9jaykge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnU2F2ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdTYXZlJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlU2F2ZVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBzYXZlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnU2F2ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnU2F2ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZVNhdmVcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25CZWZvcmVTYXZlKG1QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdDcmVhdGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gIG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udGV4dFBhdGggUGF0aCBwb2ludGluZyB0byB0aGUgY29udGV4dCBvbiB3aGljaCBDcmVhdGUgYWN0aW9uIGlzIHRyaWdnZXJlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY3JlYXRlUGFyYW1ldGVycyBBcnJheSBvZiB2YWx1ZXMgdGhhdCBhcmUgZmlsbGVkIGluIHRoZSBBY3Rpb24gUGFyYW1ldGVyIERpYWxvZ1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjb25CZWZvcmVDcmVhdGVcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25CZWZvcmVDcmVhdGUobVBhcmFtZXRlcnM/OiB7IGNvbnRleHRQYXRoPzogc3RyaW5nOyBjcmVhdGVQYXJhbWV0ZXJzPzogYW55W10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRWRpdCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0VkaXQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdFZGl0JyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRWRpdFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBlZGl0ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjb25CZWZvcmVFZGl0XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlRWRpdChtUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGlzY2FyZCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBkaXNjYXJkZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjb25CZWZvcmVEaXNjYXJkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlRGlzY2FyZChtUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGVsZXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURlbGV0ZVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjb25CZWZvcmVEZWxldGVcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25CZWZvcmVEZWxldGUobVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgSW5kaWNhdGVzIHdoZXRoZXIgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBpZ25vcmVkIHdoZW4gdXNlciBjbGlja3Mgb24gU2F2ZSBkdXJpbmcgYW4gSW5saW5lIGNyZWF0aW9uXG5cdC8vIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycy5iaW5kaW5ncyBMaXN0IGJpbmRpbmdzIG9mIHRoZSB0YWJsZXMgaW4gdGhlIHZpZXcuXG5cdC8vIEJvdGggb2YgdGhlIGFib3ZlIHBhcmFtZXRlcnMgYXJlIGZvciB0aGUgc2FtZSBwdXJwb3NlLiBVc2VyIGNhbiBlbnRlciBzb21lIGluZm9ybWF0aW9uIGluIHRoZSBjcmVhdGlvbiByb3cocykgYnV0IGRvZXMgbm90ICdBZGQgcm93JywgaW5zdGVhZCBjbGlja3MgU2F2ZS5cblx0Ly8gVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgaW4gdGhlIHZpZXcuXG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcGFyYW1cblx0LyoqXG5cdCAqIFNhdmVzIGEgbmV3IGRvY3VtZW50IGFmdGVyIGNoZWNraW5nIGl0LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2Ugc2F2ZSBpcyBjb21wbGV0ZVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjc2F2ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHNhdmVEb2N1bWVudChvQ29udGV4dDogVjRDb250ZXh0LCBtUGFyYW1ldGVyczogYW55KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRjb25zdCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIHx8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gdGhpcy5fZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0XHRjb25zdCBhQmluZGluZ3MgPSBtUGFyYW1ldGVycy5iaW5kaW5ncztcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9zeW5jVGFzaygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVTYXZlKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmXG5cdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0YUJpbmRpbmdzLFxuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCk7XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5BY3RpdmF0ZSwgYWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KFN0YW5kYXJkQWN0aW9ucy5zYXZlLCBUcmlnZ2VyVHlwZS5zdGFuZGFyZEFjdGlvbik7XG5cblx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0aWYgKGFjdGl2ZURvY3VtZW50Q29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gYWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gYWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdGlmICghKG9FcnJvciAmJiBvRXJyb3IuY2FuY2VsZWQpKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdH1cblx0fVxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgdG9nZ2xlRHJhZnRBY3RpdmUob0NvbnRleHQ6IFY0Q29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdGxldCBiRWRpdGFibGU6IGJvb2xlYW47XG5cdFx0Y29uc3QgYklzRHJhZnQgPSBvQ29udGV4dCAmJiB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdC8vdG9nZ2xlIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZWRpdCBkcmFmdHMgYW5kIGFjdGl2ZSBkb2N1bWVudHMgd2l0aCBkcmFmdClcblx0XHRpZiAoXG5cdFx0XHQhYklzRHJhZnQgfHxcblx0XHRcdCEoXG5cdFx0XHRcdCghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHx8XG5cdFx0XHRcdChvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5KVxuXHRcdFx0KVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdC8vc3RhcnQgUG9pbnQ6IGVkaXQgZHJhZnRcblx0XHRcdGJFZGl0YWJsZSA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBzdGFydCBwb2ludCBhY3RpdmUgZG9jdW1lbnRcblx0XHRcdGJFZGl0YWJsZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cdFx0XHRjb25zdCBvUmlnaHRtb3N0Q29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkgPyBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Db250ZXh0O1xuXHRcdFx0Y29uc3Qgc2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvUmlnaHRtb3N0Q29udGV4dCwgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCwgZmFsc2UpO1xuXHRcdFx0aWYgKHNpYmxpbmdJbmZvKSB7XG5cdFx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKGJFZGl0YWJsZSA/IEVkaXRNb2RlLkVkaXRhYmxlIDogRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpOyAvL3N3aXRjaCB0byBlZGl0IG1vZGUgb25seSBpZiBhIGRyYWZ0IGlzIGF2YWlsYWJsZVxuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdFx0XHRcdGlmIChsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBvQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldFBhdGggPSBzaWJsaW5nSW5mby5wYXRoTWFwcGluZ1tzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8ucGF0aE1hcHBpbmcucHVzaCh7IG9sZFBhdGg6IGxhc3RTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoLCBuZXdQYXRoOiB0YXJnZXRQYXRoIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQsIGJFZGl0YWJsZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmUgLSBDYW5ub3QgZmluZCBzaWJsaW5nXCIpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGBFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZToke29FcnJvcn1gIGFzIGFueSk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c2FwLm0uQnV0dG9ufSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gLSBDdXJyZW50bHkgdGhpcyBpcyBwYXNzZWQgYXMgY2FuY2VsQnV0dG9uIGludGVybmFsbHkgKHJlcGxhY2VkIGJ5IG1QYXJhbWV0ZXJzLmNvbnRyb2wgaW4gdGhlIEpTRG9jIGJlbG93KS4gQ3VycmVudGx5IGl0IGlzIGFsc28gbWFuZGF0b3J5LlxuXHQvLyBQbGFuIC0gVGhpcyBzaG91bGQgbm90IGJlIG1hbmRhdG9yeS4gSWYgbm90IHByb3ZpZGVkLCB3ZSBzaG91bGQgaGF2ZSBhIGRlZmF1bHQgdGhhdCBjYW4gYWN0IGFzIHJlZmVyZW5jZSBjb250cm9sIGZvciB0aGUgZGlzY2FyZCBwb3BvdmVyIE9SIHdlIGNhbiBzaG93IGEgZGlhbG9nIGluc3RlYWQgb2YgYSBwb3BvdmVyLlxuXG5cdC8qKlxuXHQgKiBEaXNjYXJkIHRoZSBlZGl0YWJsZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRyb2wgVGhpcyBpcyB0aGUgY29udHJvbCB1c2VkIHRvIG9wZW4gdGhlIGRpc2NhcmQgcG9wb3ZlclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyIE9wdGlvbmFsLCBzdXByZXNzZXMgdGhlIGRpc2NhcmQgcG9wb3ZlciBhbmQgYWxsb3dzIGN1c3RvbSBoYW5kbGluZ1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZWRpdGFibGUgZG9jdW1lbnQgaGFzIGJlZW4gZGlzY2FyZGVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNjYW5jZWxEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBjYW5jZWxEb2N1bWVudChvQ29udGV4dDogVjRDb250ZXh0LCBtUGFyYW1ldGVyczogeyBjb250cm9sOiBvYmplY3Q7IHNraXBEaXNjYXJkUG9wb3Zlcj86IGJvb2xlYW4gfSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHRoaXMuX2dldFJlc291cmNlQnVuZGxlKCk7XG5cdFx0Y29uc3QgbUluUGFyYW1ldGVyczogYW55ID0gbVBhcmFtZXRlcnM7XG5cdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cblx0XHRtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiA9IG1QYXJhbWV0ZXJzLmNvbnRyb2wgfHwgbUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b247XG5cdFx0bUluUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURpc2NhcmQ7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5fc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRpZiAoKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiYgdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueTtcblxuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY2FuY2VsUmVzdWx0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuY2FuY2VsRG9jdW1lbnQoXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLFxuXHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKClcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHQvLyB3ZSBmb3JjZSB0aGUgZWRpdCBzdGF0ZSBldmVuIGZvciBGQ0wgYmVjYXVzZSB0aGUgZHJhZnQgZGlzY2FyZCBtaWdodCBub3QgYmUgaW1wbGVtZW50ZWRcblx0XHRcdC8vIGFuZCB3ZSBtYXkganVzdCBkZWxldGUgdGhlIGRyYWZ0XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblxuXHRcdFx0aWYgKCFjYW5jZWxSZXN1bHQpIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdC8vaW4gY2FzZSBvZiBhIG5ldyBkb2N1bWVudCwgbm8gYWN0aXZlQ29udGV4dCBpcyByZXR1cm5lZCAtLT4gbmF2aWdhdGUgYmFjay5cblx0XHRcdFx0aWYgKCFtSW5QYXJhbWV0ZXJzLnNraXBCYWNrTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IGNhbmNlbFJlc3VsdCBhcyBWNENvbnRleHQ7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gb0FjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIGxvYWQgdGhlIHNlbWFudGljIGtleXMgb2YgdGhlIGFjdGl2ZSBjb250ZXh0LCBhcyB3ZSBuZWVkIHRoZW1cblx0XHRcdFx0XHQvLyBmb3IgdGhlIG5hdmlnYXRpb25cblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdC8vIFdlIGZvcmNlIHRoZSByZWNyZWF0aW9uIG9mIHRoZSBjb250ZXh0LCBzbyB0aGF0IGl0J3MgY3JlYXRlZCBhbmQgYm91bmQgaW4gdGhlIHNhbWUgbWljcm90YXNrLFxuXHRcdFx0XHRcdC8vIHNvIHRoYXQgYWxsIHByb3BlcnRpZXMgYXJlIGxvYWRlZCB0b2dldGhlciBieSBhdXRvRXhwYW5kU2VsZWN0LCBzbyB0aGF0IHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gRWRpdCBtb2RlXG5cdFx0XHRcdFx0Ly8gJCRpbmhlcml0RXhwYW5kU2VsZWN0IHRha2VzIGFsbCBsb2FkZWQgcHJvcGVydGllcyBpbnRvIGFjY291bnQgKEJDUCAyMDcwNDYyMjY1KVxuXHRcdFx0XHRcdGlmICghbUluUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlldykge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgZmFsc2UsIHRydWUsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly9hY3RpdmUgY29udGV4dCBpcyByZXR1cm5lZCBpbiBjYXNlIG9mIGNhbmNlbCBvZiBleGlzdGluZyBkb2N1bWVudFxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRpc2NhcmRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBOYW1lIG9mIHRoZSBFbnRpdHlTZXQgdG8gd2hpY2ggdGhlIG9iamVjdCBiZWxvbmdzXG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgdGhlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRvY3VtZW50IGhhcyBiZWVuIGRlbGV0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2RlbGV0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGRlbGV0ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtSW5QYXJhbWV0ZXJzOiB7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdGxldCBtUGFyYW1ldGVyczogYW55ID0gbUluUGFyYW1ldGVycztcblx0XHRpZiAoIW1QYXJhbWV0ZXJzKSB7XG5cdFx0XHRtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0czogZmFsc2Vcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMgPSBmYWxzZTtcblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGU7XG5cdFx0cmV0dXJuIHRoaXMuX2RlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQsIG1QYXJhbWV0ZXJzKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHQvLyBTaW5nbGUgb2JqZXQgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYW4gT1AgaGVhZGVyIGJ1dHRvbiAobm90IGZyb20gYSBsaXN0KVxuXHRcdFx0XHQvLyAtLT4gTWFyayBVSSBkaXJ0eSBhbmQgbmF2aWdhdGUgYmFjayB0byBkaXNtaXNzIHRoZSBPUFxuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRlbGV0ZSwgb0NvbnRleHQpO1xuXG5cdFx0XHRcdC8vIEFmdGVyIGRlbGV0ZSBpcyBzdWNjZXNzZnVsbCwgd2UgbmVlZCB0byBkZXRhY2ggdGhlIHNldEJhY2tOYXZpZ2F0aW9uIE1ldGhvZHNcblx0XHRcdFx0aWYgKG9BcHBDb21wb25lbnQpIHtcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG9BcHBDb21wb25lbnQ/LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkRlZXBsaW5rICYmICF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdC8vIEluIGNhc2UgdGhlIGFwcCBoYXMgYmVlbiBsYXVuY2hlZCB3aXRoIHNlbWFudGljIGtleXMsIGRlbGV0aW5nIHRoZSBvYmplY3Qgd2UndmUgbGFuZGVkIG9uIHNoYWxsIG5hdmlnYXRlIGJhY2tcblx0XHRcdFx0XHQvLyB0byB0aGUgYXBwIHdlIGNhbWUgZnJvbSAoZXhjZXB0IGZvciBGQ0wsIHdoZXJlIHdlIG5hdmlnYXRlIHRvIExSIGFzIHVzdWFsKVxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5leGl0RnJvbUFwcCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJtaXQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMgYW5kIG5hdmlnYXRlIGJhY2suXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgY2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2FwcGx5RG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgYXBwbHlEb2N1bWVudChvQ29udGV4dDogb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0xvY2tPYmplY3QgPSB0aGlzLl9nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9zeW5jVGFzaygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb25dIEJvb2xlYW4gdmFsdWUgZm9yIHN0YXRpYyBhY3Rpb24sIHVuZGVmaW5lZCBmb3Igb3RoZXIgYWN0aW9uc1xuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5pc05hdmlnYWJsZV0gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkXG5cdC8vIEN1cnJlbnRseSB0aGUgcGFyYW1ldGVyIGlzTmF2aWdhYmxlIGlzIHVzZWQgaW50ZXJuYWxseSBhbmQgc2hvdWxkIGJlIGNoYW5nZWQgdG8gcmVxdWlyZXNOYXZpZ2F0aW9uIGFzIGl0IGlzIGEgbW9yZSBhcHQgbmFtZSBmb3IgdGhpcyBwYXJhbVxuXG5cdC8qKlxuXHQgKiBJbnZva2VzIGFuIGFjdGlvbiAoYm91bmQgb3IgdW5ib3VuZCkgYW5kIHRyYWNrcyB0aGUgY2hhbmdlcyBzbyB0aGF0IG90aGVyIHBhZ2VzIGNhbiBiZSByZWZyZXNoZWQgYW5kIHNob3cgdGhlIHVwZGF0ZWQgZGF0YSB1cG9uIG5hdmlnYXRpb24uXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jb250ZXh0cyBGb3IgYSBib3VuZCBhY3Rpb24sIGEgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm1vZGVsIEZvciBhbiB1bmJvdW5kIGFjdGlvbiwgYW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWwgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiBOYXZpZ2F0aW9uIHRha2VzIHBsYWNlIHRvIHRoZSBjb250ZXh0IHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubGFiZWwgQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvbi4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUgYWN0aW9uIGhhcyBhIHBhcmFtZXRlciBhbmQgYSBwYXJhbWV0ZXIgZGlhbG9nIGlzIHNob3duIHRvIHRoZSB1c2VyLiBUaGUgbGFiZWwgd2lsbCBiZSB1c2VkIGZvciB0aGUgdGl0bGUgb2YgdGhlIGRpYWxvZyBhbmQgZm9yIHRoZSBjb25maXJtYXRpb24gYnV0dG9uXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIG1FeHRyYVBhcmFtcyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSBvbmNlIHRoZSBhY3Rpb24gaGFzIGJlZW4gaW52b2tlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjaW52b2tlQWN0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKiBAZmluYWxcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBpbnZva2VBY3Rpb24oXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzPzoge1xuXHRcdFx0Y29udGV4dHM/OiBDb250ZXh0IHwgQ29udGV4dFtdO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdH0sXG5cdFx0bUV4dHJhUGFyYW1zPzogYW55XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBvQ29udHJvbDogYW55O1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5fZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRsZXQgb0N1cnJlbnRDb250cm9sO1xuXHRcdGxldCBvQmluZGluZ0NvbnRleHQ7XG5cdFx0bGV0IGFQYXJ0cztcblx0XHRsZXQgc092ZXJsb2FkRW50aXR5VHlwZTtcblx0XHRsZXQgb0N1cnJlbnRBY3Rpb25DYWxsQmFja3M6IGFueTtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0Ly8gRHVlIHRvIGEgbWlzdGFrZSB0aGUgaW52b2tlQWN0aW9uIGluIHRoZSBleHRlbnNpb25BUEkgaGFkIGEgZGlmZmVyZW50IEFQSSB0aGFuIHRoaXMgb25lLlxuXHRcdC8vIFRoZSBvbmUgZnJvbSB0aGUgZXh0ZW5zaW9uQVBJIGRvZXNuJ3QgZXhpc3QgYW55bW9yZSBhcyB3ZSBleHBvc2UgdGhlIGZ1bGwgZWRpdCBmbG93IG5vdyBidXRcblx0XHQvLyBkdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHN0aWxsIG5lZWQgdG8gc3VwcG9ydCB0aGUgb2xkIHNpZ25hdHVyZVxuXHRcdGlmIChcblx0XHRcdChtUGFyYW1ldGVycy5pc0EgJiYgbVBhcmFtZXRlcnMuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHx8XG5cdFx0XHRBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzKSB8fFxuXHRcdFx0bUV4dHJhUGFyYW1zICE9PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdGNvbnN0IGNvbnRleHRzID0gbVBhcmFtZXRlcnM7XG5cdFx0XHRtUGFyYW1ldGVycyA9IG1FeHRyYVBhcmFtcyB8fCB7fTtcblx0XHRcdGlmIChjb250ZXh0cykge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IGNvbnRleHRzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMubW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlID0gbVBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIHx8IG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlO1xuXG5cdFx0aWYgKCFtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0b0NvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0XHRpZiAob0NvbnRyb2wpIHtcblx0XHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoaXMgc2VsZWN0ZWQgY29udGV4dHMgdXBkYXRlIGlzIGRvbmUgd2l0aGluIHRoZSBvcGVyYXRpb24sIHNob3VsZCBiZSBtb3ZlZCBvdXRcblx0XHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHNBY3Rpb25OYW1lICYmIHNBY3Rpb25OYW1lLmluZGV4T2YoXCIoXCIpID4gLTEpIHtcblx0XHRcdC8vIGdldCBlbnRpdHkgdHlwZSBvZiBhY3Rpb24gb3ZlcmxvYWQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBhY3Rpb24gcGF0aFxuXHRcdFx0Ly8gRXhhbXBsZSBzQWN0aW9uTmFtZSA9IFwiPEFjdGlvbk5hbWU+KENvbGxlY3Rpb24oPE92ZXJsb2FkRW50aXR5VHlwZT4pKVwiXG5cdFx0XHQvLyBzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXSAtLT4gPEFjdGlvbk5hbWU+XG5cdFx0XHQvLyBzT3ZlcmxvYWRFbnRpdHlUeXBlID0gYVBhcnRzWzJdIC0tPiA8T3ZlcmxvYWRFbnRpdHlUeXBlPlxuXHRcdFx0YVBhcnRzID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIoXCIpO1xuXHRcdFx0c0FjdGlvbk5hbWUgPSBhUGFydHNbMF07XG5cdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlID0gKGFQYXJ0c1thUGFydHMubGVuZ3RoIC0gMV0gYXMgYW55KS5yZXBsYWNlQWxsKFwiKVwiLCBcIlwiKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbikge1xuXHRcdFx0aWYgKG9Db250cm9sLmlzVGFibGVCb3VuZCgpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0NvbnRyb2wuZ2V0Um93QmluZGluZygpLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGF0aCA9IG9Db250cm9sLmRhdGEoXCJyb3dzQmluZGluZ0luZm9cIikucGF0aCxcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcgPSBuZXcgKE9EYXRhTGlzdEJpbmRpbmcgYXMgYW55KSh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLCBzQmluZGluZ1BhdGgpO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdGNvbnN0IHNUYWJsZUNvbnRleHRFbnRpdHlUeXBlID0gbVBhcmFtZXRlcnMuY29udGV4dHNcblx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHRcdC5nZXRNZXRhQ29udGV4dChtUGFyYW1ldGVycy5jb250ZXh0cy5nZXRQYXRoKCkpXG5cdFx0XHRcdFx0LmdldE9iamVjdChcIiRUeXBlXCIpO1xuXHRcdFx0XHRpZiAoc092ZXJsb2FkRW50aXR5VHlwZSAhPT0gc1RhYmxlQ29udGV4dEVudGl0eVR5cGUpIHtcblx0XHRcdFx0XHQvLyBzZWFyY2ggZm9yIGNvbnRleHQgaW4gY29udHJvbCB0cmVlIGhpZXJhcmNoeVxuXHRcdFx0XHRcdG9DdXJyZW50Q29udHJvbCA9IG9Db250cm9sO1xuXHRcdFx0XHRcdHdoaWxlIChvQ3VycmVudENvbnRyb2wpIHtcblx0XHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dCA9IG9DdXJyZW50Q29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQgJiZcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YUNvbnRleHQob0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiJFR5cGVcIikgPT09XG5cdFx0XHRcdFx0XHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0JpbmRpbmdDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIGNoZWNrIHBhcmVudFxuXHRcdFx0XHRcdFx0XHRvQ3VycmVudENvbnRyb2wgPSBvQ3VycmVudENvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIGNvbnRleHQgd2FzIG5vdCBmb3VuZCBpbiBVSSBoaWVyYXJjaHkgZ29pbmcgc3RyYWlnaHQgdXB3YXJkcyAtIHRyeSB0byBmaW5kIGl0IGluIFN1YlNlY3Rpb25zXG5cdFx0XHRcdFx0aWYgKCFvQ3VycmVudENvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9BY3Rpb25PdmVybG9hZENvbnRleHQgPSB0aGlzLl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tU3ViU2VjdGlvbnMob0NvbnRyb2wsIHNPdmVybG9hZEVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdFx0aWYgKG9BY3Rpb25PdmVybG9hZENvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9BY3Rpb25PdmVybG9hZENvbnRleHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDb250ZXh0IG5vdCBmb3VuZCBmb3IgZW50aXR5IHR5cGUgJHtzT3ZlcmxvYWRFbnRpdHlUeXBlfWApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuZW5hYmxlQXV0b1Njcm9sbCkge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyA9IHRoaXMuX2NyZWF0ZUFjdGlvblByb21pc2Uoc0FjdGlvbk5hbWUsIG9Db250cm9sLnNJZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQgPSB0aGlzLl9nZXRCb3VuZENvbnRleHQob1ZpZXcsIG1QYXJhbWV0ZXJzKTtcblx0XHQvLyBOZWVkIHRvIGtub3cgdGhhdCB0aGUgYWN0aW9uIGlzIGNhbGxlZCBmcm9tIE9iamVjdFBhZ2UgZm9yIGNoYW5nZVNldCBJc29sYXRlZCB3b3JrYXJvdW5kXG5cdFx0bVBhcmFtZXRlcnMuYk9iamVjdFBhZ2UgPSAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmNvbnZlcnRlclR5cGUgPT09IFwiT2JqZWN0UGFnZVwiO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuX3N5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBvUmVzcG9uc2UgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYWxsQWN0aW9uLmJpbmQoXG5cdFx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLFxuXHRcdFx0XHRzQWN0aW9uTmFtZSxcblx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpXG5cdFx0XHQpKCk7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udGV4dHMpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5fcmVmcmVzaExpc3RJZlJlcXVpcmVkKHRoaXMuX2dldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSksIG1QYXJhbWV0ZXJzLmNvbnRleHRzWzBdKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5BY3Rpb24sIG1QYXJhbWV0ZXJzLmNvbnRleHRzKTtcblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lLCBUcmlnZ2VyVHlwZS5hY3Rpb24pO1xuXG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlc29sdmVyKG9SZXNwb25zZSk7XG5cdFx0XHR9XG5cdFx0XHQvKlxuXHRcdFx0XHRcdFdlIHNldCB0aGUgKHVwcGVyKSBwYWdlcyB0byBkaXJ0eSBhZnRlciBhbiBleGVjdXRpb24gb2YgYW4gYWN0aW9uXG5cdFx0XHRcdFx0VE9ETzogZ2V0IHJpZCBvZiB0aGlzIHdvcmthcm91bmRcblx0XHRcdFx0XHRUaGlzIHdvcmthcm91bmQgaXMgb25seSBuZWVkZWQgYXMgbG9uZyBhcyB0aGUgbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3luY2hyb25pemF0aW9uLlxuXHRcdFx0XHRcdE9uY2UgdGhpcyBpcyBzdXBwb3J0ZWQgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIHBhZ2VzIHRvIGRpcnR5IGFueW1vcmUgYXMgdGhlIGNvbnRleHQgaXRzZWxmXG5cdFx0XHRcdFx0aXMgYWxyZWFkeSByZWZyZXNoZWQgKGl0J3MganVzdCBub3QgcmVmbGVjdGVkIGluIHRoZSBvYmplY3QgcGFnZSlcblx0XHRcdFx0XHR3ZSBleHBsaWNpdGx5IGRvbid0IGNhbGwgdGhpcyBtZXRob2QgZnJvbSB0aGUgbGlzdCByZXBvcnQgYnV0IG9ubHkgY2FsbCBpdCBmcm9tIHRoZSBvYmplY3QgcGFnZVxuXHRcdFx0XHRcdGFzIGlmIGl0IGlzIGNhbGxlZCBpbiB0aGUgbGlzdCByZXBvcnQgaXQncyBub3QgbmVlZGVkIC0gYXMgd2UgYW55d2F5IHdpbGwgcmVtb3ZlIHRoaXMgbG9naWNcblx0XHRcdFx0XHR3ZSBjYW4gbGl2ZSB3aXRoIHRoaXNcblx0XHRcdFx0XHR3ZSBuZWVkIGEgY29udGV4dCB0byBzZXQgdGhlIHVwcGVyIHBhZ2VzIHRvIGRpcnR5IC0gaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgd2UgdXNlIHRoZVxuXHRcdFx0XHRcdGZpcnN0IG9uZSBhcyB0aGV5IGFyZSBhbnl3YXkgc2libGluZ3Ncblx0XHRcdFx0XHQqL1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvc0N1c3RvbUFjdGlvblwiLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUpIHtcblx0XHRcdFx0bGV0IHZDb250ZXh0ID0gb1Jlc3BvbnNlO1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2Q29udGV4dCkgJiYgdkNvbnRleHQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0dkNvbnRleHQgPSB2Q29udGV4dFswXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodkNvbnRleHQgJiYgIUFycmF5LmlzQXJyYXkodkNvbnRleHQpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgodkNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQ29udGV4dCA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpID8gbVBhcmFtZXRlcnMuY29udGV4dHNbMF0gOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHRcdFx0XHRjb25zdCBzQWN0aW9uQ29udGV4dE1ldGFQYXRoID0gb0FjdGlvbkNvbnRleHQgJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdGlmIChzQ29udGV4dE1ldGFQYXRoICE9IHVuZGVmaW5lZCAmJiBzQ29udGV4dE1ldGFQYXRoID09PSBzQWN0aW9uQ29udGV4dE1ldGFQYXRoKSB7XG5cdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpICE9PSB2Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KHZDb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRcdFx0bm9IaXN0b3J5RW50cnk6IGZhbHNlXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0TG9nLmluZm8oXCJOYXZpZ2F0aW9uIHRvIHRoZSBzYW1lIGNvbnRleHQgaXMgbm90IGFsbG93ZWRcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyOiBhbnkpIHtcblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVqZWN0b3IoKTtcblx0XHRcdH1cblx0XHRcdC8vIEZJWE1FOiBpbiBtb3N0IHNpdHVhdGlvbnMgdGhlcmUgaXMgbm8gaGFuZGxlciBmb3IgdGhlIHJlamVjdGVkIHByb21pc2VzIHJldHVybmVkXG5cdFx0XHRpZiAoZXJyID09PSBDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkRpYWxvZyBjYW5jZWxsZWRcIik7XG5cdFx0XHR9IGVsc2UgaWYgKCEoZXJyICYmIChlcnIuY2FuY2VsZWQgfHwgKGVyci5yZWplY3RlZEl0ZW1zICYmIGVyci5yZWplY3RlZEl0ZW1zWzBdLmNhbmNlbGVkKSkpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gRWRpdEZsb3cuaW52b2tlQWN0aW9uOiR7ZXJyfWApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZWN1cmVkIGV4ZWN1dGlvbiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24uIEVuc3VyZXMgdGhhdCB0aGUgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCB3aGVuIGNlcnRhaW4gY29uZGl0aW9ucyBhcmUgZnVsZmlsbGVkLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIGZuRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLiBTaG91bGQgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IGlzIHNldHRsZWQgYWZ0ZXIgY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uLiBJZiBub3RoaW5nIGlzIHJldHVybmVkLCBpbW1lZGlhdGUgY29tcGxldGlvbiBpcyBhc3N1bWVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgRGVmaW5pdGlvbnMgb2YgdGhlIHByZWNvbmRpdGlvbnMgdG8gYmUgY2hlY2tlZCBiZWZvcmUgZXhlY3V0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5IERlZmluZXMgdGhlIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5LnNldCBUcmlnZ2VycyBhIGJ1c3kgaW5kaWNhdG9yIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5jaGVjayBFeGVjdXRlcyBmdW5jdGlvbiBvbmx5IGlmIGFwcGxpY2F0aW9uIGlzbid0IGJ1c3kuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy51cGRhdGVzRG9jdW1lbnQgVGhpcyBvcGVyYXRpb24gdXBkYXRlcyB0aGUgY3VycmVudCBkb2N1bWVudCB3aXRob3V0IHVzaW5nIHRoZSBib3VuZCBtb2RlbCBhbmQgY29udGV4dC4gQXMgYSByZXN1bHQsIHRoZSBkcmFmdCBzdGF0dXMgaXMgdXBkYXRlZCBpZiBhIGRyYWZ0IGRvY3VtZW50IGV4aXN0cywgYW5kIHRoZSB1c2VyIGhhcyB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGVkaXRpbmcgcHJvY2Vzcy5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgaXMgcmVqZWN0ZWQgaWYgdGhlIGV4ZWN1dGlvbiBpcyBwcm9oaWJpdGVkIGFuZCByZXNvbHZlZCBieSB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSB0aGUgZm5GdW5jdGlvbi5cblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3NlY3VyZWRFeGVjdXRpb25cblx0ICogQHB1YmxpY1xuXHQgKiBAZXhwZXJpbWVudGFsIEFzIG9mIHZlcnNpb24gMS45MC4wXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzZWN1cmVkRXhlY3V0aW9uKFxuXHRcdGZuRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRcdG1QYXJhbWV0ZXJzPzoge1xuXHRcdFx0YnVzeT86IHtcblx0XHRcdFx0c2V0PzogYm9vbGVhbjtcblx0XHRcdFx0Y2hlY2s/OiBib29sZWFuO1xuXHRcdFx0fTtcblx0XHRcdHVwZGF0ZXNEb2N1bWVudD86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBiQnVzeVNldCA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmJ1c3kgJiYgbVBhcmFtZXRlcnMuYnVzeS5zZXQgIT09IHVuZGVmaW5lZCA/IG1QYXJhbWV0ZXJzLmJ1c3kuc2V0IDogdHJ1ZSxcblx0XHRcdGJCdXN5Q2hlY2sgPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5idXN5ICYmIG1QYXJhbWV0ZXJzLmJ1c3kuY2hlY2sgIT09IHVuZGVmaW5lZCA/IG1QYXJhbWV0ZXJzLmJ1c3kuY2hlY2sgOiB0cnVlLFxuXHRcdFx0YlVwZGF0ZXNEb2N1bWVudCA9IChtUGFyYW1ldGVycyAmJiAobVBhcmFtZXRlcnMgYXMgYW55KS51cGRhdGVzRG9jdW1lbnQpIHx8IGZhbHNlLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLl9nZXRHbG9iYWxVSU1vZGVsKCksXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHRpZiAoYkJ1c3lDaGVjayAmJiBCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQXBwbGljYXRpb24gYWxyZWFkeSBidXN5IHRoZXJlZm9yZSBleGVjdXRpb24gcmVqZWN0ZWRcIik7XG5cdFx0fVxuXG5cdFx0Ly8gd2UgaGF2ZSB0byBzZXQgYnVzeSBhbmQgZHJhZnQgaW5kaWNhdG9yIGltbWVkaWF0ZWx5IGFsc28gdGhlIGZ1bmN0aW9uIG1pZ2h0IGJlIGV4ZWN1dGVkIGxhdGVyIGluIHF1ZXVlXG5cdFx0aWYgKGJCdXN5U2V0KSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdH1cblx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCAmJiBiSXNEcmFmdCkge1xuXHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHR9XG5cblx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX3N5bmNUYXNrKGZuRnVuY3Rpb24pXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGlmIChiVXBkYXRlc0RvY3VtZW50KSB7XG5cdFx0XHRcdFx0dGhpcy5fZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5oYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMoKTtcblx0XHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGJJc0RyYWZ0KSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCAmJiBiSXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBwYXRjaFNlbnQgZXZlbnQ6IHJlZ2lzdGVyIGRvY3VtZW50IG1vZGlmaWNhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdGhhbmRsZVBhdGNoU2VudChvRXZlbnQ6IGFueSkge1xuXHRcdGlmICghKHRoaXMuYmFzZS5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5nZXRQcm9wZXJ0eShcInNraXBQYXRjaEhhbmRsZXJzXCIpKSB7XG5cdFx0XHQvLyBDcmVhdGUgYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIHRoZSBwYXRoIGlzIGNvbXBsZXRlZFxuXHRcdFx0Y29uc3Qgb1BhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0b0V2ZW50LmdldFNvdXJjZSgpLmF0dGFjaEV2ZW50T25jZShcInBhdGNoQ29tcGxldGVkXCIsIChwYXRjaENvbXBsZXRlZEV2ZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCBiU3VjY2VzcyA9IHBhdGNoQ29tcGxldGVkRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdFx0XHRpZiAoYlN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy51cGRhdGVEb2N1bWVudChvRXZlbnQuZ2V0U291cmNlKCksIG9QYXRjaFByb21pc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBDcmVhdGVBY3RpdmF0ZSBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKi9cblx0aGFuZGxlQ3JlYXRlQWN0aXZhdGUob0V2ZW50OiBhbnkpIHtcblx0XHRjb25zdCBvQmluZGluZyA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3QgYkF0RW5kID0gdHJ1ZTtcblx0XHRjb25zdCBiSW5hY3RpdmUgPSB0cnVlO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHRoaXMuX2dldFJlc291cmNlQnVuZGxlKCk7XG5cdFx0Y29uc3Qgb1BhcmFtczogYW55ID0ge1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuSW5saW5lLFxuXHRcdFx0Y3JlYXRlQXRFbmQ6IGJBdEVuZCxcblx0XHRcdGluYWN0aXZlOiBiSW5hY3RpdmUsXG5cdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBmYWxzZSwgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdGJ1c3lNb2RlOiBcIk5vbmVcIlxuXHRcdH07XG5cdFx0dHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQob0JpbmRpbmcsIG9QYXJhbXMsIG9SZXNvdXJjZUJ1bmRsZSwgdGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKSwgZmFsc2UsIHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFByaXZhdGUgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qXG5cdFx0XHQgVE8gQkUgQ0hFQ0tFRCAvIERJU0NVU1NFRFxuXHRcdFx0IF9jcmVhdGVNdWx0aXBsZURvY3VtZW50cyBhbmQgZGVsZXRlTXVsdGlEb2N1bWVudCAtIGNvdWxkbid0IHdlIGNvbWJpbmUgdGhlbSB3aXRoIGNyZWF0ZSBhbmQgZGVsZXRlIGRvY3VtZW50P1xuXHRcdFx0IF9jcmVhdGVBY3Rpb25Qcm9taXNlIGFuZCBkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSAtPiBuZXh0IHN0ZXBcblxuXHRcdFx0ICovXG5cblx0X3NldEVkaXRNb2RlKHNFZGl0TW9kZTogYW55LCBiQ3JlYXRpb25Nb2RlPzogYm9vbGVhbikge1xuXHRcdCh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LnNldEVkaXRNb2RlKHNFZGl0TW9kZSwgYkNyZWF0aW9uTW9kZSk7XG5cdH1cblxuXHRfc2V0RHJhZnRTdGF0dXMoc0RyYWZ0U3RhdGU6IGFueSkge1xuXHRcdCh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKHNEcmFmdFN0YXRlKTtcblx0fVxuXG5cdF9nZXRSb3V0aW5nTGlzdGVuZXIoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldFJvdXRpbmdMaXN0ZW5lcigpO1xuXHR9XG5cblx0X2dldEdsb2JhbFVJTW9kZWwoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldEdsb2JhbFVJTW9kZWwoKTtcblx0fVxuXHRfc3luY1Rhc2sodlRhc2s/OiBhbnkpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuc3luY1Rhc2sodlRhc2spO1xuXHR9XG5cblx0X2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQ6IGFueSkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0fVxuXG5cdF9kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0X2hhbmRsZUNyZWF0ZUV2ZW50cyhvQmluZGluZzogYW55KSB7XG5cdFx0KHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuaGFuZGxlQ3JlYXRlRXZlbnRzKG9CaW5kaW5nKTtcblx0fVxuXG5cdF9nZXRUcmFuc2FjdGlvbkhlbHBlcigpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0fVxuXG5cdF9nZXRJbnRlcm5hbE1vZGVsKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdH1cblxuXHRfZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkge1xuXHRcdHJldHVybiB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdH1cblxuXHRfZ2V0UmVzb3VyY2VCdW5kbGUoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5vUmVzb3VyY2VCdW5kbGU7XG5cdH1cblxuXHRfZ2V0U2VtYW50aWNNYXBwaW5nKCk6IFNlbWFudGljTWFwcGluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmdldExhc3RTZW1hbnRpY01hcHBpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHByb21pc2UgdG8gd2FpdCBmb3IgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY3JlYXRlQWN0aW9uUHJvbWlzZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXh0ZXJuYWxseSByZXNvbHZlIHRoZSBwcm9taXNlXG5cdCAqL1xuXG5cdF9jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lOiBhbnksIHNDb250cm9sSWQ6IGFueSkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBzQ29udHJvbElkKTtcblx0fVxuXG5cdF9nZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKTtcblx0fVxuXG5cdF9kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKTtcblx0fVxuXG5cdF9nZXRNZXNzYWdlSGFuZGxlcigpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0TWVzc2FnZUhhbmRsZXIoKTtcblx0fVxuXG5cdF9zZW5kQWN0aXZpdHkoYWN0aW9uOiBBY3Rpdml0eSwgcmVsYXRlZENvbnRleHRzOiBDb250ZXh0IHwgQ29udGV4dFtdIHwgdW5kZWZpbmVkKSB7XG5cdFx0Y29uc3QgY29udGVudCA9IEFycmF5LmlzQXJyYXkocmVsYXRlZENvbnRleHRzKSA/IHJlbGF0ZWRDb250ZXh0cy5tYXAoKGNvbnRleHQpID0+IGNvbnRleHQuZ2V0UGF0aCgpKSA6IHJlbGF0ZWRDb250ZXh0cz8uZ2V0UGF0aCgpO1xuXHRcdHNlbmQodGhpcy5nZXRWaWV3KCksIGFjdGlvbiwgY29udGVudCk7XG5cdH1cblxuXHRfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWU6IHN0cmluZywgdHJpZ2dlclR5cGU6IFRyaWdnZXJUeXBlKSB7XG5cdFx0dHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkodGhpcy5nZXRWaWV3KCksIHNBY3Rpb25OYW1lLCB0cmlnZ2VyVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IGlzIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdF9nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lOiBzdHJpbmcsIG9SZXNwb25zZTogb2JqZWN0KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSk7XG5cdH1cblxuXHRhc3luYyBfc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQ6IGFueSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFN1Ym1pdCBhbnkgbGVmdG92ZXIgY2hhbmdlcyB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZFxuXHRcdFx0Ly8gQ3VycmVudGx5IHdlIGFyZSB1c2luZyBvbmx5IDEgdXBkYXRlR3JvdXBJZCwgaGVuY2Ugc3VibWl0dGluZyB0aGUgYmF0Y2ggZGlyZWN0bHkgaGVyZVxuXHRcdFx0YXdhaXQgb01vZGVsLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyBjaGFuZ2VzXG5cdFx0XHQvLyBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgYWdyZWVkIHdpdGggdGhlIHY0IG1vZGVsIHRlYW0gdG8gdXNlIGFuIGludGVybmFsIG1ldGhvZC4gV2UnbGwgcmVwbGFjZSBpdCBvbmNlXG5cdFx0XHQvLyBhIHB1YmxpYyBvciByZXN0cmljdGVkIG1ldGhvZCB3YXMgcHJvdmlkZWRcblx0XHRcdGF3YWl0IG9Nb2RlbC5vUmVxdWVzdG9yLndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMoXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYWxsIGNoYW5nZXMgd2VyZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5XG5cdFx0XHRpZiAob01vZGVsLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3VibWl0IG9mIG9wZW4gY2hhbmdlcyBmYWlsZWRcIik7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2hhbmRsZVN0aWNreU9uKG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmhhbmRsZVN0aWNreU9uKG9Db250ZXh0KTtcblx0fVxuXG5cdF9oYW5kbGVTdGlja3lPZmYoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmhhbmRsZVN0aWNreU9mZigpO1xuXHR9XG5cblx0X29uQmFja05hdmlnYXRpb25JblNlc3Npb24oKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93Lm9uQmFja05hdmlnYXRpb25JblNlc3Npb24oKTtcblx0fVxuXG5cdF9kaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dCk7XG5cdH1cblxuXHRfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBhbnksIG1vZGVsOiBPRGF0YU1vZGVsKSB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCAobW9kZWwuZ2V0SHR0cEhlYWRlcnModHJ1ZSkgYXMgYW55KVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdF9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWw6IGFueSkge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuX2dldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR0aGlzLl9oYW5kbGVTdGlja3lPZmYoLypvQ29udGV4dCovKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlTmV3Q29udGV4dChcblx0XHRvQ29udGV4dDogYW55LFxuXHRcdGJFZGl0YWJsZTogYm9vbGVhbixcblx0XHRiUmVjcmVhdGVDb250ZXh0OiBib29sZWFuLFxuXHRcdGJEcmFmdE5hdmlnYXRpb246IGJvb2xlYW4sXG5cdFx0YkZvcmNlRm9jdXM/OiBib29sZWFuLFxuXHRcdGJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eT86IGJvb2xlYW5cblx0KSB7XG5cdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IGJFZGl0YWJsZSxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IHRydWUsXG5cdFx0XHRiUmVjcmVhdGVDb250ZXh0OiBiUmVjcmVhdGVDb250ZXh0LFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogYkRyYWZ0TmF2aWdhdGlvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogZmFsc2UsXG5cdFx0XHRiRm9yY2VGb2N1czogYkZvcmNlRm9jdXMsXG5cdFx0XHRrZWVwQ3VycmVudExheW91dDogdHJ1ZSxcblx0XHRcdGJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eTogYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5XG5cdFx0fSk7XG5cdH1cblxuXHRfZ2V0Qm91bmRDb250ZXh0KHZpZXc6IGFueSwgcGFyYW1zOiBhbnkpIHtcblx0XHRjb25zdCB2aWV3TGV2ZWwgPSB2aWV3LmdldFZpZXdEYXRhKCkudmlld0xldmVsO1xuXHRcdGNvbnN0IGJSZWZyZXNoQWZ0ZXJBY3Rpb24gPSB2aWV3TGV2ZWwgPiAxIHx8ICh2aWV3TGV2ZWwgPT09IDEgJiYgcGFyYW1zLmNvbnRyb2xJZCk7XG5cdFx0cmV0dXJuICFwYXJhbXMuaXNOYXZpZ2FibGUgfHwgISFiUmVmcmVzaEFmdGVyQWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiAocGFyc2UpIGVycm9ycyBmb3IgY29udHJvbHMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0XG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBpZiB0aGVyZSBhcmUgbm8gdmFsaWRhdGlvbiBlcnJvcnMsIGFuZCByZWplY3RzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIGVycm9yc1xuXHQgKi9cblxuXHRfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCkge1xuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzaygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc1ZpZXdJZCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0SWQoKTtcblx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRsZXQgb0NvbnRyb2w7XG5cdFx0XHRsZXQgb01lc3NhZ2U7XG5cblx0XHRcdGlmICghYU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiTm8gdmFsaWRhdGlvbiBlcnJvcnMgZm91bmRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYU1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdG9NZXNzYWdlID0gYU1lc3NhZ2VzW2ldO1xuXHRcdFx0XHRpZiAob01lc3NhZ2UudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9Db250cm9sID0gQ29yZS5ieUlkKG9NZXNzYWdlLmdldENvbnRyb2xJZCgpKTtcblx0XHRcdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGlmIChvQ29udHJvbC5nZXRJZCgpID09PSBzVmlld0lkKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcInZhbGlkYXRpb24gZXJyb3JzIGV4aXN0XCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b0NvbnRyb2wgPSBvQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX3JlZnJlc2hMaXN0SWZSZXF1aXJlZFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9SZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2YgdGhlIGJvdW5kIGFjdGlvbiBhbmQgdGhlIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgYm91bmQgY29udGV4dCBvbiB3aGljaCB0aGUgYWN0aW9uIHdhcyBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyBBbHdheXMgcmVzb2x2ZXMgdG8gcGFyYW0gb1Jlc3BvbnNlXG5cdCAqL1xuXHRfcmVmcmVzaExpc3RJZlJlcXVpcmVkKG9SZXNwb25zZTogYW55LCBvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGlmICghb0NvbnRleHQgfHwgIW9SZXNwb25zZSB8fCAhb1Jlc3BvbnNlLm9EYXRhKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdC8vIHJlZnJlc2ggb25seSBsaXN0c1xuXHRcdGlmIChvQmluZGluZyAmJiBvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1Jlc3BvbnNlLm9EYXRhO1xuXHRcdFx0Y29uc3QgYUtleXMgPSBvUmVzcG9uc2Uua2V5cztcblx0XHRcdGNvbnN0IG9DdXJyZW50RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0bGV0IGJSZXR1cm5lZENvbnRleHRJc1NhbWUgPSB0cnVlO1xuXHRcdFx0Ly8gZW5zdXJlIGNvbnRleHQgaXMgaW4gdGhlIHJlc3BvbnNlXG5cdFx0XHRpZiAoT2JqZWN0LmtleXMob0NvbnRleHREYXRhKS5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gY2hlY2sgaWYgY29udGV4dCBpbiByZXNwb25zZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgYm91bmQgY29udGV4dFxuXHRcdFx0XHRiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gYUtleXMuZXZlcnkoZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBvQ3VycmVudERhdGFbc0tleV0gPT09IG9Db250ZXh0RGF0YVtzS2V5XTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmICghYlJldHVybmVkQ29udGV4dElzU2FtZSkge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKChvQmluZGluZyBhcyBhbnkpLmlzUm9vdCgpKSB7XG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBvQmluZGluZy5nZXRQYXRoKCkgfV0sIG9CaW5kaW5nLmdldENvbnRleHQoKSBhcyBDb250ZXh0KVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0YWJsZVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyB0aGUgdGFibGVcIiwgZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gcmVzb2x2ZSB3aXRoIG9SZXNwb25zZSB0byBub3QgZGlzdHVyYiB0aGUgcHJvbWlzZSBjaGFpbiBhZnRlcndhcmRzXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0X2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIGFueSxcblx0XHRcdHNFbnRpdHlTZXROYW1lID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpLFxuXHRcdFx0YVNlbWFudGljS2V5cyA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhvTWV0YU1vZGVsLCBzRW50aXR5U2V0TmFtZSk7XG5cblx0XHRpZiAoYVNlbWFudGljS2V5cyAmJiBhU2VtYW50aWNLZXlzLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYVJlcXVlc3RQcm9taXNlcyA9IGFTZW1hbnRpY0tleXMubWFwKGZ1bmN0aW9uIChvS2V5OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RPYmplY3Qob0tleS4kUHJvcGVydHlQYXRoKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVJlcXVlc3RQcm9taXNlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbVN1YlNlY3Rpb25zKG9Db250cm9sOiBhbnksIHNPdmVybG9hZEVudGl0eVR5cGU6IHN0cmluZykge1xuXHRcdGxldCBvQ3VycmVudENvbnRyb2w6IGFueTtcblxuXHRcdGZ1bmN0aW9uIF9jaGVja0FjdGlvbnMoYUFjdGlvbnM6IEFycmF5PG9iamVjdD4pIHtcblx0XHRcdGxldCBvQWN0aW9uQmluZGluZ0NvbnRleHQ6IGFueTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGFBY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG9BY3Rpb246IGFueSkge1xuXHRcdFx0XHRcdG9BY3Rpb25CaW5kaW5nQ29udGV4dCA9IG9BY3Rpb24uZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvQWN0aW9uQmluZGluZ0NvbnRleHRcblx0XHRcdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5nZXRNZXRhQ29udGV4dChvQWN0aW9uQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKVxuXHRcdFx0XHRcdFx0XHQuZ2V0T2JqZWN0KFwiJFR5cGVcIikgPT09IHNPdmVybG9hZEVudGl0eVR5cGVcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImNvbnRleHQgZm91bmQgLSBzdG9wIGFjdGlvbnMgbG9vcFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gb0FjdGlvbkJpbmRpbmdDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIF9jaGVja1N1YlNlY3Rpb25zKGFTdWJTZWN0aW9uczogQXJyYXk8b2JqZWN0Pikge1xuXHRcdFx0bGV0IG9BY3Rpb25CaW5kaW5nQ29udGV4dDogYW55O1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YVN1YlNlY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG9TdWJTZWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob0FjdGlvbkJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJjb250ZXh0IGZvdW5kIC0gc3RvcCBTdWJTZWN0aW9ucyBsb29wXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob1N1YlNlY3Rpb24uZ2V0QmluZGluZ0NvbnRleHQoKSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0b1N1YlNlY3Rpb24uc2V0QmluZGluZ0NvbnRleHQodW5kZWZpbmVkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYUFjdGlvbnMgPSBvU3ViU2VjdGlvbi5nZXRBZ2dyZWdhdGlvbihcImFjdGlvbnNcIik7XG5cdFx0XHRcdFx0b0FjdGlvbkJpbmRpbmdDb250ZXh0ID0gX2NoZWNrQWN0aW9ucyhhQWN0aW9ucyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gb0FjdGlvbkJpbmRpbmdDb250ZXh0ID8gb0FjdGlvbkJpbmRpbmdDb250ZXh0IDogdW5kZWZpbmVkO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gb0FjdGlvbkJpbmRpbmdDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAob0NvbnRyb2wgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJpbnB1dCBwYXJhbWV0ZXIgb0NvbnRyb2wgdW5kZWZpbmVkIHdoZW4gdHJ5aW5nIHRvIGRldGVybWluZSB0aGUgYWN0aW9uIG92ZXJsb2FkIGNvbnRleHRcIik7XG5cdFx0XHR9XG5cblx0XHRcdG9DdXJyZW50Q29udHJvbCA9IG9Db250cm9sO1xuXHRcdFx0d2hpbGUgKCFvQ3VycmVudENvbnRyb2wuaXNBKFwic2FwLnV4YXAuT2JqZWN0UGFnZVNlY3Rpb25cIikpIHtcblx0XHRcdFx0b0N1cnJlbnRDb250cm9sID0gb0N1cnJlbnRDb250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIW9DdXJyZW50Q29udHJvbCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RQYWdlU2VjdGlvbiBub3QgZm91bmQgaW4gVUkgaGllcmFyY2h5XCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgYVN1YlNlY3Rpb25zID0gb0N1cnJlbnRDb250cm9sLmdldEFnZ3JlZ2F0aW9uKFwic3ViU2VjdGlvbnNcIik7XG5cdFx0XHRcdHJldHVybiBfY2hlY2tTdWJTZWN0aW9ucyhhU3ViU2VjdGlvbnMpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRfY3JlYXRlU2libGluZ0luZm8oY3VycmVudENvbnRleHQ6IFY0Q29udGV4dCwgbmV3Q29udGV4dDogVjRDb250ZXh0KTogU2libGluZ0luZm9ybWF0aW9uIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0Q29udGV4dDogbmV3Q29udGV4dCxcblx0XHRcdHBhdGhNYXBwaW5nOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRvbGRQYXRoOiBjdXJyZW50Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3Q29udGV4dC5nZXRQYXRoKClcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH07XG5cdH1cblxuXHRfdXBkYXRlUGF0aHNJbkhpc3RvcnkobWFwcGluZ3M6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdKSB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0UGF0aE1hcHBpbmcobWFwcGluZ3MpO1xuXG5cdFx0Ly8gQWxzbyB1cGRhdGUgdGhlIHNlbWFudGljIG1hcHBpbmcgaW4gdGhlIHJvdXRpbmcgc2VydmljZVxuXHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRpZiAobWFwcGluZ3MubGVuZ3RoICYmIGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm9sZFBhdGgpIHtcblx0XHRcdGxhc3RTZW1hbnRpY01hcHBpbmcudGVjaG5pY2FsUGF0aCA9IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kcyBjcmVhdGVzIGEgc2libGluZyBjb250ZXh0IGZvciBhIHN1Ym9iamVjdCBwYWdlLCBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aCBmb3Jcblx0ICogYWxsIGludGVybWVkaWF0ZXMgcGF0aHMgYmV0d2VlbiB0aGUgT1AgYW5kIHRoZSBzdWItT1AuXG5cdCAqXG5cdCAqIEBwYXJhbSByb290Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSByb290IG9mIHRoZSBkcmFmdFxuXHQgKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdFxuXHQgKiBAcGFyYW0gc1Byb2dyYW1taW5nTW9kZWwgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBwYXJhbSBkb05vdENvbXB1dGVJZlJvb3QgSWYgdHJ1ZSwgd2UgZG9uJ3QgY29tcHV0ZSBzaWJsaW5nSW5mbyBpZiB0aGUgcm9vdCBhbmQgdGhlIHJpZ2h0bW9zdCBjb250ZXh0cyBhcmUgdGhlIHNhbWVcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuXHQgKi9cblx0YXN5bmMgX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0cm9vdEN1cnJlbnRDb250ZXh0OiBWNENvbnRleHQsXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IFY0Q29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID8/IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRtb3N0Q3VycmVudENvbnRleHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBub3QgaW4gZHJhZnQgbW9kZSwgd2UganVzdCByZWNyZWF0ZSBhIGNvbnRleHQgZnJvbSB0aGUgcGF0aCBvZiB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdC8vIE5vIHBhdGggbWFwcGluZyBpcyBuZWVkZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCksXG5cdFx0XHRcdHBhdGhNYXBwaW5nOiBbXVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblx0X2lzRmNsRW5hYmxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKS5faXNGY2xFbmFibGVkKCk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRWRpdEZsb3c7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7RUFrakJPLGdCQUFnQkEsSUFBaEIsRUFBc0JDLE9BQXRCLEVBQStCO0lBQ3JDLElBQUk7TUFDSCxJQUFJQyxNQUFNLEdBQUdGLElBQUksRUFBakI7SUFDQSxDQUZELENBRUUsT0FBTUcsQ0FBTixFQUFTO01BQ1YsT0FBT0YsT0FBTyxDQUFDRSxDQUFELENBQWQ7SUFDQTs7SUFDRCxJQUFJRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0UsSUFBckIsRUFBMkI7TUFDMUIsT0FBT0YsTUFBTSxDQUFDRSxJQUFQLENBQVksS0FBSyxDQUFqQixFQUFvQkgsT0FBcEIsQ0FBUDtJQUNBOztJQUNELE9BQU9DLE1BQVA7RUFDQTs7RUFHTSwwQkFBMEJGLElBQTFCLEVBQWdDSyxTQUFoQyxFQUEyQztJQUNqRCxJQUFJO01BQ0gsSUFBSUgsTUFBTSxHQUFHRixJQUFJLEVBQWpCO0lBQ0EsQ0FGRCxDQUVFLE9BQU9HLENBQVAsRUFBVTtNQUNYLE9BQU9FLFNBQVMsQ0FBQyxJQUFELEVBQU9GLENBQVAsQ0FBaEI7SUFDQTs7SUFDRCxJQUFJRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0UsSUFBckIsRUFBMkI7TUFDMUIsT0FBT0YsTUFBTSxDQUFDRSxJQUFQLENBQVlDLFNBQVMsQ0FBQ0MsSUFBVixDQUFlLElBQWYs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
|