@sapui5/sap.fe.core 1.124.5 → 1.124.7
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/controllerextensions/EditFlow.js +4 -2
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +5 -1
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +19 -11
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +29 -13
- package/src/sap/fe/core/converters/controls/Common/Table.js +10 -4
- package/src/sap/fe/core/converters/controls/Common/Table.ts +5 -1
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js +10 -3
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +9 -2
- package/src/sap/fe/core/services/ShellServicesFactory.js +16 -1
- package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -0
|
@@ -397,7 +397,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
397
397
|
const metaModel = currentBindingContext.getModel().getMetaModel();
|
|
398
398
|
const entitySetName = metaModel.getMetaContext(currentBindingContext.getPath()).getObject("@sapui.name");
|
|
399
399
|
const semanticKeys = SemanticKeyHelper.getSemanticKeys(metaModel, entitySetName);
|
|
400
|
-
if (semanticKeys !== null && semanticKeys !== void 0 && semanticKeys.length)
|
|
400
|
+
if (semanticKeys !== null && semanticKeys !== void 0 && semanticKeys.length && currentBindingContext.getProperty("IsActiveEntity") === false &&
|
|
401
|
+
// We don't use the semantic key for a new document (creation)
|
|
402
|
+
currentBindingContext.getProperty("HasActiveEntity") === true) {
|
|
401
403
|
const currentSemanticMapping = this._getSemanticMapping();
|
|
402
404
|
const currentSemanticPath = currentSemanticMapping === null || currentSemanticMapping === void 0 ? void 0 : currentSemanticMapping.semanticPath,
|
|
403
405
|
sChangedPath = SemanticKeyHelper.getSemanticPath(currentBindingContext, true);
|
|
@@ -2905,4 +2907,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2905
2907
|
}(BaseControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec12, _dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterSave", [_dec19, _dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterCreate", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterEdit", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDiscard", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDelete", [_dec28, _dec29], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec30, _dec31], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec32, _dec33], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec34, _dec35], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec36, _dec37], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec38, _dec39], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterActionExecution", [_dec40, _dec41], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterActionExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [_dec42, _dec43], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype)), _class2)) || _class);
|
|
2906
2908
|
return EditFlow;
|
|
2907
2909
|
}, false);
|
|
2908
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiTWVzc2FnZVR5cGUiLCJjb3JlTGlicmFyeSIsIkVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiaG9va2FibGUiLCJzeW5jVGFza3MiLCJQcm9taXNlIiwicmVzb2x2ZSIsImhhbmRsZVNpZGVFZmZlY3RzIiwibGlzdEJpbmRpbmciLCJjcmVhdGlvblByb21pc2UiLCJ2aWV3QmluZGluZ0NvbnRleHQiLCJnZXRWaWV3IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJuZXdDb250ZXh0IiwiY3JlYXRlZCIsIkNvbW1vblV0aWxzIiwiaGFzVHJhbnNpZW50Q29udGV4dCIsImdldEFwcENvbXBvbmVudCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsImdldFBhdGgiLCJlcnJvciIsIkxvZyIsImNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyIsInZhbGlkYXRpb25NZXNzYWdlcyIsInRhYmxlIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiZ2V0Q3JlYXRpb25Sb3ciLCJkYXRhIiwiY3VzdG9tVmFsaWRpdHkiLCJnZXRQcm9wZXJ0eSIsImN1c3RvbU1lc3NhZ2VzIiwiZmllbGRDb250cm9sIiwiZmluYWxUYXJnZXQiLCJvbGRNZXNzYWdlcyIsIk1lc3NhZ2luZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmaWx0ZXIiLCJtZXNzYWdlIiwiZ2V0Q29kZSIsInJlbW92ZU1lc3NhZ2VzIiwiZm9yRWFjaCIsInZhbGlkYXRpb25NZXNzYWdlIiwibWVzc2FnZVRhcmdldCIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImZpZWxkSWQiLCJnZXRCaW5kaW5nUGF0aCIsImdldFRhcmdldHMiLCJzb21lIiwidGFyZ2V0IiwibGVuZ3RoIiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZVRleHQiLCJwcm9jZXNzb3IiLCJnZXRNb2RlbCIsInR5cGUiLCJFcnJvciIsImNvZGUiLCJ0ZWNobmljYWwiLCJwZXJzaXN0ZW50IiwiZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMiLCJhZGRDb250cm9sSWQiLCJwdXNoIiwidGV4dCIsImdldE1lc3NhZ2VIYW5kbGVyIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJyZXNvbHZlQ3JlYXRpb25Nb2RlIiwiaW5pdGlhbENyZWF0aW9uTW9kZSIsImNyZWF0ZURhdGEiLCJOZXdQYWdlIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwicHJvZ3JhbW1pbmdNb2RlbCIsImdldFByb2dyYW1taW5nTW9kZWwiLCJpc1JlbGF0aXZlIiwiZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0TWV0YUNvbnRleHQiLCJlbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlTZXQiLCJuZXdBY3Rpb24iLCJEcmFmdCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRHJhZnRSb290IiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJOZXdBY3Rpb24iLCJ0b1N0cmluZyIsInRhcmdldEVudGl0eVR5cGUiLCJhY3Rpb25zIiwicGFyYW1ldGVycyIsIkRlZmVycmVkIiwiY3JlYXRpb25QYXJhbWV0ZXJzIiwiZ2V0VHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRDcmVhdGlvblBhcmFtZXRlcnMiLCJBc3luYyIsImdldEludGVyZmFjZSIsImJhc2UiLCJlZGl0RG9jdW1lbnQiLCJjb250ZXh0IiwidHJhbnNhY3Rpb25IZWxwZXIiLCJyb290Vmlld0NvbnRyb2xsZXIiLCJfZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwibW9kZWwiLCJ2aWV3RGF0YSIsImdldFZpZXdEYXRhIiwicm9vdENvbnRleHQiLCJ2aWV3IiwiZ3JvdXBJZCIsInZpZXdMZXZlbCIsIlN0aWNreSIsImNyZWF0ZVJvb3RDb250ZXh0IiwiZWRpdEZsb3ciLCJvbkJlZm9yZUVkaXQiLCJyaWdodG1vc3RDb250ZXh0IiwiX2lzRmNsRW5hYmxlZCIsImdldFJpZ2h0bW9zdENvbnRleHQiLCJ1bmRlZmluZWQiLCJuZXdEb2N1bWVudENvbnRleHRQcm9taXNlIiwicm9vdENvbnRleHRJbmZvIiwicm9vdFNpYmxpbmdQYXRoUHJvbWlzZSIsIl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzIiwic2libGluZ0luZm9Qcm9taXNlIiwiY29tcHV0ZVNpYmxpbmdJbmZvIiwiX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJzdWJtaXRCYXRjaCIsInNpYmxpbmdJbmZvIiwibmV3RG9jdW1lbnRDb250ZXh0IiwiY29udGV4dFRvTmF2aWdhdGUiLCJfZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQiLCJfdXBkYXRlUGF0aHNJbkhpc3RvcnkiLCJzZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwic2V0RG9jdW1lbnRNb2RpZmllZCIsIm9uQWZ0ZXJFZGl0IiwiX2hhbmRsZU5ld0NvbnRleHQiLCJlZGl0YWJsZSIsInJlY3JlYXRlQ29udGV4dCIsImZvcmNlRm9jdXMiLCJzdGlja3lDb250ZXh0IiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsImhhbmRsZVN0aWNreU9uIiwiTW9kZWxIZWxwZXIiLCJpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCIsInNoYXJlT2JqZWN0IiwicmVqZWN0IiwicmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUiLCJwYXJlbnRDb250ZXh0Iiwic2lkZUVmZmVjdFNlcnZpY2UiLCJzdGF0ZU1lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsImlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsImNvbnRleHRzVG9EZWxldGUiLCJiZWZvcmVEZWxldGVDYWxsQmFjayIsIm9uQmVmb3JlRGVsZXRlIiwibG9ja09iamVjdCIsImdldEdsb2JhbFVJTW9kZWwiLCJwYXJlbnRDb250cm9sIiwiYnlJZCIsImNvbnRyb2xJZCIsImluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZSIsImlzQSIsImlzSW5hY3RpdmUiLCJnZXRCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsImJGaW5kQWN0aXZlQ29udGV4dHMiLCJCdXN5TG9ja2VyIiwibG9jayIsInNlbGVjdGVkQ29udGV4dHMiLCJkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwicmVzdWx0IiwiY2xlYXJTZWxlY3Rpb24iLCJpc1Jvb3QiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImdldEhlYWRlckNvbnRleHQiLCJhdHRhY2hFdmVudE9uY2UiLCJyZWZyZXNoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCIsInJlY29tbWVuZGF0aW9ucyIsImlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMiLCJvbkFmdGVyRGVsZXRlIiwiY29udGV4dHMiLCJ0YWJsZUFQSSIsImdldFBhcmVudCIsInRhYmxlRGVmaW5pdGlvbiIsImNvbnRyb2wiLCJjcmVhdGlvbk1vZGUiLCJJbmxpbmVDcmVhdGlvblJvd3MiLCJyZW1vdmVFbXB0eVJvd3NNZXNzYWdlcyIsInNldFVwRW1wdHlSb3dzIiwiX3NlbmRBY3Rpdml0eSIsIkFjdGl2aXR5IiwiRGVsZXRlIiwidW5sb2NrIiwidXBkYXRlRG9jdW1lbnQiLCJ1cGRhdGVkQ29udGV4dCIsInVwZGF0ZVByb21pc2UiLCJvcmlnaW5hbEJpbmRpbmdDb250ZXh0IiwiaXNEcmFmdCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsInN5bmNUYXNrIiwic2V0RHJhZnRTdGF0dXMiLCJTYXZpbmciLCJjdXJyZW50QmluZGluZ0NvbnRleHQiLCJlbnRpdHlTZXROYW1lIiwiZ2V0T2JqZWN0Iiwic2VtYW50aWNLZXlzIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJjdXJyZW50U2VtYW50aWNNYXBwaW5nIiwiX2dldFNlbWFudGljTWFwcGluZyIsImN1cnJlbnRTZW1hbnRpY1BhdGgiLCJzZW1hbnRpY1BhdGgiLCJzQ2hhbmdlZFBhdGgiLCJnZXRTZW1hbnRpY1BhdGgiLCJTYXZlZCIsIkNsZWFyIiwic2hvd01lc3NhZ2VzIiwiZ2V0UGFyZW50Q29udGV4dEZyb21TZWxlY3Rpb24iLCJjcmVhdGVEb2N1bWVudCIsInZMaXN0QmluZGluZyIsIm1JblBhcmFtZXRlcnMiLCJvRGF0YUxpc3RCaW5kaW5nIiwiRXh0ZXJuYWwiLCJvRGF0YU1vZGVsIiwiYmluZExpc3QiLCJTeW5jIiwiY3JlYXRlQXRFbmQiLCJyZXNvbHZlZENyZWF0aW9uTW9kZSIsImdldFJvdXRlclByb3h5IiwicmVtb3ZlSUFwcFN0YXRlS2V5Iiwic2luZ2xlRHJhZnRGb3JDcmVhdGUiLCJnZXRNYW5pZmVzdCIsImFwcCIsImdldFJvb3RCaW5kaW5nIiwibmV3QmluZGluZyIsImdldENvbnRleHQiLCJTb3J0ZXIiLCJGaWx0ZXIiLCJmaWx0ZXJzIiwicGF0aCIsIm9wZXJhdG9yIiwidmFsdWUxIiwiYW5kIiwicmVxdWVzdENvbnRleHRzIiwidGhlbiIsImRlc3Ryb3kiLCJfaGFuZGxlQ3JlYXRpb25Nb2RlIiwiY3JlYXRlRXh0ZXJuYWxEb2N1bWVudCIsIm91dGJvdW5kIiwiY3JlYXRlRGVmZXJyZWREb2N1bWVudCIsIkNyZWF0aW9uUm93IiwiY3JlYXRpb25Sb3ciLCJjcmVhdGVDcmVhdGVSb3dEb2N1bWVudCIsInNraXBTaWRlRWZmZWN0cyIsIklubGluZSIsImNyZWF0ZUlubGluZURvY3VtZW50IiwidGFibGVJZCIsImNyZWF0ZVN5bmNBc3luY0RvY3VtZW50IiwiYkZyb21EZWZlcnJlZCIsImNyZWF0ZUFjdGlvbiIsInBvc3REb2N1bWVudENyZWF0aW9uIiwicHJlcmVxdWlzaXRlIiwicGFyYW1zIiwib25BZnRlckNyZWF0ZSIsIm1ldGFDb250ZXh0Iiwic3RhcnRpbmdFbnRpdHlTZXQiLCJnZXRJbnRlcm5hbE1vZGVsIiwic2V0UHJvcGVydHkiLCJmb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCIsInNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZSIsIkNyZWF0ZSIsImlzRHJhZnRSb290IiwiY29sbGFib3JhdGl2ZURyYWZ0IiwiaXNDb25uZWN0ZWQiLCJhcHBDb21wb25lbnQiLCJuYXZpZ2F0aW9uIiwiY3JlYXRpb25Sb3dDb250ZXh0IiwiZG9jdW1lbnRWYWxpZGF0aW9uIiwiZ2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24iLCJlbnRpdHlUeXBlIiwiY3JlYXRpb25Sb3dQYXlsb2FkIiwiX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyIsImNyZWF0aW9uIiwic2Nyb2xsVG9JbmRleCIsImdldExlbmd0aCIsImhhbmRsZUNyZWF0ZUV2ZW50cyIsIk9iamVjdCIsImFzc2lnbiIsImtleXMiLCJwcm9wZXJ0eVBhdGgiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImZpbmRJbmRleCIsInByb3BlcnR5IiwibmFtZSIsIm1hcCIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJidXN5TW9kZSIsImJ1c3lJZCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImFubm90YXRpb24iLCJpZCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwib25CZWZvcmVDcmVhdGUiLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiZ2V0U3RhcnR1cE1vZGUiLCJBdXRvQ3JlYXRlIiwiY3JlYXRpb25Sb3dMaXN0QmluZGluZyIsIm5ld1RyYW5zaWVudENvbnRleHQiLCJjcmVhdGUiLCJzZXRCaW5kaW5nQ29udGV4dCIsImNhdGNoIiwidHJhY2UiLCJkZWxldGUiLCJpc0xvY2tlZCIsImFsbCIsImFsbEN1cnJlbnRDb250ZXh0cyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImNvbnRleHRJbmRleCIsImluZGV4T2YiLCJmb2N1c1JvdyIsInBhcmVudEluZGV4IiwiZ2V0SW50ZXJuYWxSb3V0aW5nIiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMiLCJtb2RlIiwicm91dGluZ0xpc3RlbmVyIiwiY3JlYXRlQ29udGV4dFByb21pc2UiLCJjb3JlUmVzb3VyY2VCdW5kbGUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJnZXRUZXh0IiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIm5hdlBhcmFtZXRlcnMiLCJ0cmFuc2llbnQiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIkNyZWF0aW9uRmFpbGVkIiwiT25CZWZvcmVDcmVhdGVGYWlsZWQiLCJpbmNsdWRlcyIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsImNvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyIiwiY3JlYXRlUGF0aCIsImdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyIsIl9pbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJ2YWxpZGF0ZURvY3VtZW50IiwiY3JlYXRpb25Sb3dPYmplY3RzIiwiY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMiLCJkYXRhRm9yQ3JlYXRlIiwiaXNGcm9tQ29weVBhc3RlIiwiY3JlYXRlQXNJbmFjdGl2ZSIsInRhcmdldExpc3RCaW5kaW5nIiwiY29udGV4dFBhdGgiLCJtZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiY3JlYXRpb25Qcm9taXNlcyIsInByb3BlcnR5VmFsdWVzIiwiY3JlYXRlUGFyYW1ldGVycyIsImluYWN0aXZlIiwiJGtpbmQiLCJjcmVhdGVkQ29udGV4dHMiLCJhY3RpdmVDb250ZXh0cyIsImVyciIsIl9tUGFyYW1ldGVycyIsIm9uQmVmb3JlU2F2ZSIsIm9uQmVmb3JlRGlzY2FyZCIsIm9uQWZ0ZXJTYXZlIiwib25BZnRlckRpc2NhcmQiLCJzYXZlRG9jdW1lbnQiLCJvQ29udGV4dCIsIm1QYXJhbWV0ZXJzIiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJhQmluZGluZ3MiLCJiaW5kaW5ncyIsIm1lcmdlUGF0Y2hEcmFmdCIsIl9zdWJtaXRPcGVuQ2hhbmdlcyIsInJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiIsImNoZWNrUmVjb21tZW5kYXRpb25PcHRpb24iLCJzUHJvZ3JhbW1pbmdNb2RlbCIsImlzRmNsRW5hYmxlZCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiYWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiX2dldFJlc291cmNlTW9kZWwiLCJnZXRDcmVhdGlvbk1vZGUiLCJfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsIkFjdGl2YXRlIiwiZGlzY29ubmVjdCIsIl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsIlN0YW5kYXJkQWN0aW9ucyIsInNhdmUiLCJUcmlnZ2VyVHlwZSIsInN0YW5kYXJkQWN0aW9uIiwiRGlzcGxheSIsInN0b3JlRGF0YUZvclRlbGVtZXRyeSIsIl9jcmVhdGVTaWJsaW5nSW5mbyIsInByZXZpb3VzU2VtYW50aWNQYXRoIiwibmV3U2VtYW50aWNQYXRoIiwicGF0aE1hcHBpbmciLCJvbGRQYXRoIiwibmV3UGF0aCIsInRhcmdldENvbnRleHQiLCJvRXJyb3IiLCJjYW5jZWxlZCIsInRvZ2dsZURyYWZ0QWN0aXZlIiwib0NvbnRleHREYXRhIiwiYklzRHJhZnQiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsIm9SaWdodG1vc3RDb250ZXh0IiwibGFzdFNlbWFudGljTWFwcGluZyIsInRlY2huaWNhbFBhdGgiLCJ0YXJnZXRQYXRoIiwiY2FuY2VsRG9jdW1lbnQiLCJpc05ld0RvY3VtZW50IiwiY2FuY2VsUGFyYW1ldGVycyIsInNraXBEaXNjYXJkUG9wb3ZlciIsImNhbmNlbEJ1dHRvbiIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiY2FuY2VsUmVzdWx0IiwiaXNEb2N1bWVudE1vZGlmaWVkIiwiZ2V0SW5zdGFuY2VkVmlld3MiLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyIsInNraXBCaW5kaW5nVG9WaWV3Iiwic2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsInNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsImRlbGV0ZURvY3VtZW50Iiwib0FwcENvbXBvbmVudCIsImdldEluZGV4Iiwic2libGluZ0NvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsImRyYWZ0UGF0aCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiZHJhZnRDb250ZXh0VG9SZW1vdmUiLCJyZXBsYWNlV2l0aCIsImNvbnRleHRCaW5kaW5nIiwicGFyZW50TGlzdEJpbmRpbmciLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJEZWVwbGluayIsImV4aXRGcm9tQXBwIiwiYXBwbHlEb2N1bWVudCIsIm9Mb2NrT2JqZWN0IiwiY2hlY2tJZlJlY29tbWVuZGF0aW9uc0V4aXN0IiwiaXNDb250aW51ZSIsInNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nIiwiUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiIsIkNvbnRpbnVlIiwiaW52b2tlQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJtRXh0cmFQYXJhbXMiLCJhUGFydHMiLCJzT3ZlcmxvYWRFbnRpdHlUeXBlIiwib0N1cnJlbnRBY3Rpb25DYWxsQmFja3MiLCJvVmlldyIsIkFycmF5IiwiaXNBcnJheSIsImlzTmF2aWdhYmxlIiwicmVxdWlyZXNOYXZpZ2F0aW9uIiwiY29udmVydGVkTWV0YWRhdGEiLCJjb252ZXJ0VHlwZXMiLCJlbnRpdHlDb250YWluZXIiLCJpc0JvdW5kIiwib0NvbnRyb2wiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImlnbm9yZUVUYWciLCJzcGxpdCIsInJlcGxhY2VBbGwiLCJiU3RhdGljQWN0aW9uIiwiaXNUYWJsZUJvdW5kIiwic0JpbmRpbmdQYXRoIiwib0xpc3RCaW5kaW5nIiwiX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgiLCJlbmFibGVBdXRvU2Nyb2xsIiwiY3JlYXRlQWN0aW9uUHJvbWlzZSIsImdldElkIiwiYkdldEJvdW5kQ29udGV4dCIsIl9nZXRCb3VuZENvbnRleHQiLCJiT2JqZWN0UGFnZSIsImNvbnZlcnRlclR5cGUiLCJvUmVzcG9uc2UiLCJjYWxsQWN0aW9uIiwibGlzdFJlZnJlc2hlZCIsIl9yZWZyZXNoTGlzdElmUmVxdWlyZWQiLCJnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzIiwiYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyIsInZhbHVlIiwiQWN0aW9uIiwiYWN0aW9uIiwiZlJlc29sdmVyIiwidkNvbnRleHQiLCJvTWV0YU1vZGVsIiwic0NvbnRleHRNZXRhUGF0aCIsIl9mblZhbGlkQ29udGV4dHMiLCJhcHBsaWNhYmxlQ29udGV4dHMiLCJlbGVtZW50Iiwib0FjdGlvbkNvbnRleHQiLCJzQWN0aW9uQ29udGV4dE1ldGFQYXRoIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJyZXR1cm5Db250ZXh0IiwiaW5mbyIsIm9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24iLCJmUmVqZWN0b3IiLCJlcnJQcm9taXNlIiwicmVqZWN0ZWRJdGVtcyIsIl9hY3Rpb25OYW1lIiwic2VjdXJlZEV4ZWN1dGlvbiIsImZuRnVuY3Rpb24iLCJiQnVzeVNldCIsImJ1c3kiLCJzZXQiLCJiQnVzeUNoZWNrIiwiY2hlY2siLCJiVXBkYXRlc0RvY3VtZW50IiwidXBkYXRlc0RvY3VtZW50IiwiZmluYWxseSIsImhhbmRsZVBhdGNoU2VudCIsIm9FdmVudCIsImludGVybmFsQ29udGV4dCIsImdldFNvdXJjZSIsInNldElnbm9yZUVUYWciLCJzb3VyY2VCaW5kaW5nIiwib1BhdGNoUHJvbWlzZSIsInBhdGNoQ29tcGxldGVkRXZlbnQiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2giLCJiU3VjY2VzcyIsImdldFBhcmFtZXRlciIsImhhbmRsZUNyZWF0ZVNlbnQiLCJldmVudCIsIm5ld1Rhc2siLCJkZWJ1ZyIsImNvbXB1dGVFZGl0TW9kZSIsImdsb2JhbE1vZGVsIiwiaXNBY3RpdmVFbnRpdHkiLCJyZXF1ZXN0T2JqZWN0IiwiaGFzQWN0aXZlRW50aXR5IiwibGFzdEludm9rZWRBY3Rpb25OYW1lIiwiaXNOZXdBY3Rpb25Gb3JTdGlja3kiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJnZXRSZXNvdXJjZU1vZGVsIiwiVHJhbnNhY3Rpb25IZWxwZXIiLCJtZXNzYWdlSGFuZGxlciIsInNldENyZWF0aW9uTW9kZSIsImJDcmVhdGlvbk1vZGUiLCJ1aU1vZGVsQ29udGV4dCIsIlVpTW9kZWxDb25zdGFudHMiLCJDcmVhdGVNb2RlIiwiRG9jdW1lbnRNb2RpZmllZCIsIm1vZGlmaWVkIiwiYmluZGluZyIsImF0dGFjaEV2ZW50Iiwic3VjY2VzcyIsImRyYWZ0U3RhdHVzIiwic291cmNlIiwiZWRpdE1vZGUiLCJpc0NyZWF0aW9uIiwiZm9yY2VkIiwic2hhbGxGb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCIsImFjdGlvbk5hbWUiLCJzdGlja3lTZXNzaW9uIiwiQWRkaXRpb25hbE5ld0FjdGlvbnMiLCJoYXNOYXZpZ2F0aW9uR3VhcmQiLCJoYXNoVHJhY2tlciIsImdldEhhc2giLCJpbnRlcm5hbE1vZGVsIiwic2V0VGltZW91dCIsInNldE5hdmlnYXRpb25HdWFyZCIsInN1YnN0cmluZyIsIm9uQmFja05hdmlnYXRpb25JblNlc3Npb24iLCJiaW5kIiwiZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24iLCJnZXREaXJ0eVN0YXRlUHJvdmlkZXIiLCJyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImkxOG5Nb2RlbCIsInNlc3Npb25UaW1lb3V0RnVuY3Rpb24iLCJnZXRTZXNzaW9uVGltZW91dEZ1bmN0aW9uIiwiYXR0YWNoU2Vzc2lvblRpbWVvdXQiLCJzdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24iLCJnZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbiIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsImhhbmRsZVN0aWNreU9mZiIsImRpc2NhcmROYXZpZ2F0aW9uR3VhcmQiLCJkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIiwiZGV0YWNoU2Vzc2lvblRpbWVvdXQiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJnZXRIdHRwSGVhZGVycyIsIm5hdmlnYXRpb25Db250ZXh0IiwidGFyZ2V0SGFzaCIsImlubmVyQXBwUm91dGUiLCJyb3V0ZXJQcm94eSIsImxjbEhhc2hUcmFja2VyIiwiaXNEaXJ0eSIsImlzU2Vzc2lvbk9uIiwiaXNOYXZpZ2F0aW9uRmluYWxpemVkIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsInNldERpcnR5RmxhZyIsIndhcm5pbmdEaWFsb2ciLCJEaWFsb2ciLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJwcmVzcyIsImFmdGVyQ2xvc2UiLCJhZGRTdHlsZUNsYXNzIiwic2V0TW9kZWwiLCJhZGREZXBlbmRlbnQiLCJvcGVuIiwiY3VycmVudEhhc2giLCJkaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImNsZWFyU2Vzc2lvbkNvbnRleHQiLCJkaXNjYXJkZWRDb250ZXh0Iiwic3RpY2t5IiwiZGlzY2FyZERvY3VtZW50IiwicmVzZXRDaGFuZ2VzIiwiX3JvdXRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJnZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwicmVzb2x2ZUZ1bmN0aW9uIiwicmVqZWN0RnVuY3Rpb24iLCJhY3Rpb25Qcm9taXNlIiwicmVzcG9uc2UiLCJjdXJyZW50VmlldyIsIm1ldGFNb2RlbERhdGEiLCJtZXRhTW9kZWxBY3Rpb24iLCJhY3Rpb25SZXR1cm5UeXBlIiwiJFJldHVyblR5cGUiLCIkVHlwZSIsIiRLZXkiLCJvRGF0YSIsImdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJpc1NhdmUiLCJjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nIiwiQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2siLCJfc2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93Iiwicm93QmluZGluZyIsImFjdGl2ZVJvd0luZGV4IiwiZ2V0Q291bnQiLCJhbGxSb3dDb250ZXh0cyIsImdldENvbnRleHRzIiwiaW5kZXgiLCJzaW5nbGVDb250ZXh0IiwiY3JlYXRlRW1wdHlSb3dzQW5kRm9jdXMiLCJpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlIiwicmVsYXRlZENvbnRleHRzIiwidHJpZ2dlcmVkQWN0aW9uTmFtZSIsInJlZnJlc2hMaXN0QmluZGluZyIsInNlbmQiLCJ0cmlnZ2VyVHlwZSIsInRyaWdnZXJDb25maWd1cmVkU3VydmV5Iiwib01vZGVsIiwib1JlcXVlc3RvciIsIndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMiLCJjaGVja0lmQmFja0lzT3V0T2ZHdWFyZCIsInByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbiIsImhpc3RvcnkiLCJiYWNrIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwZXJzaXN0T1BTY3JvbGwiLCJyZWFzb24iLCJOYXZpZ2F0aW9uUmVhc29uIiwiRWRpdEZsb3dBY3Rpb24iLCJzaG93UGxhY2Vob2xkZXIiLCJrZWVwQ3VycmVudExheW91dCIsImJSZWZyZXNoQWZ0ZXJBY3Rpb24iLCJzVmlld0lkIiwiYU1lc3NhZ2VzIiwidmFsaWRhdGlvbiIsImdldENvbnRyb2xJZCIsIm9CaW5kaW5nIiwiYUtleXMiLCJvQ3VycmVudERhdGEiLCJiUmV0dXJuZWRDb250ZXh0SXNTYW1lIiwiZXZlcnkiLCJzS2V5IiwiZSIsInNFbnRpdHlTZXROYW1lIiwiYVNlbWFudGljS2V5cyIsImFSZXF1ZXN0UHJvbWlzZXMiLCJvS2V5IiwiJFByb3BlcnR5UGF0aCIsIm92ZXJsb2FkRW50aXR5VHlwZSIsImNvbnRleHRTZWdtZW50cyIsImN1cnJlbnRDb250ZXh0IiwicG9wIiwidW5zaGlmdCIsInBhcmVudENvbnRleHRzIiwicGF0aFNlZ21lbnQiLCJyZXZlcnNlIiwib3ZlcmxvYWRDb250ZXh0IiwiZmluZCIsIm1hcHBpbmdzIiwic2V0UGF0aE1hcHBpbmciLCJyb290Q3VycmVudENvbnRleHQiLCJyaWdodG1vc3RDdXJyZW50Q29udGV4dCIsImRvTm90Q29tcHV0ZUlmUm9vdCIsInN0YXJ0c1dpdGgiLCJyaWdodE1vc3RDb250ZXh0VG9Vc2UiLCJkcmFmdCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJCYXNlQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCYXNlQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQmFzZUNvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIFRyaWdnZXJUeXBlLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHsgaG9va2FibGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSG9va1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEludGVybmFsUm91dGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgQ3VzdG9tTWVzc2FnZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgQWN0aXZpdHksIHNoYXJlT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBDYW5jZWxQYXJhbWV0ZXJzLCBDcmVhdGVQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycywgUm9vdENvbnRleHRJbmZvLCBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IERyYWZ0U2libGluZ1BhaXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9EZWxldGVIZWxwZXJcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgRmNsQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvRmNsLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L1Jvb3RWaWV3QmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzLCBTZW1hbnRpY01hcHBpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgY29yZUxpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ3JlYXRpb25Sb3cgZnJvbSBcInNhcC91aS9tZGMvdGFibGUvQ3JlYXRpb25Sb3dcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgU29ydGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvU29ydGVyXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIENvbnRleHQsIGRlZmF1bHQgYXMgT0RhdGFWNENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFDb250ZXh0QmluZGluZyRQYXRjaFNlbnRFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEVudGl0eVR5cGUgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwiLi4vQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHtcblx0Q29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2ssXG5cdFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb25cbn0gZnJvbSBcIi4uL2NvbnRyb2xzL1JlY29tbWVuZGF0aW9ucy9Db25maXJtUmVjb21tZW5kYXRpb25EaWFsb2cuYmxvY2tcIjtcbmltcG9ydCB0eXBlIHsgQmFzZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgTmF2aWdhdGlvblJlYXNvbiBmcm9tIFwiLi9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZSxcblx0UHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsLFxuXHRDb25zdGFudHMgPSBGRUxpYnJhcnkuQ29uc3RhbnRzLFxuXHREcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cyxcblx0RWRpdE1vZGUgPSBGRUxpYnJhcnkuRWRpdE1vZGUsXG5cdFN0YXJ0dXBNb2RlID0gRkVMaWJyYXJ5LlN0YXJ0dXBNb2RlLFxuXHRNZXNzYWdlVHlwZSA9IGNvcmVMaWJyYXJ5Lk1lc3NhZ2VUeXBlO1xuXG50eXBlIFNhdmVEb2N1bWVudFBhcmFtZXRlcnMgPSB7XG5cdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yPzogYm9vbGVhbjtcblx0bWVyZ2VQYXRjaERyYWZ0PzogYm9vbGVhbjtcblx0YmluZGluZ3M/OiBPRGF0YUxpc3RCaW5kaW5nW107XG59O1xuXG50eXBlIEludGVybmFsQ3JlYXRlUGFyYW1ldGVycyA9IHtcblx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRkYXRhPzogb2JqZWN0O1xuXHR0YWJsZUlkPzogc3RyaW5nO1xuXHRvdXRib3VuZD86IHN0cmluZztcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xufTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIEJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIGRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzZXNzaW9uVGltZW91dEZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24/OiBGdW5jdGlvbjtcblxuXHRwcml2YXRlIHN5bmNUYXNrczogUHJvbWlzZTx1bmtub3duPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdHByaXZhdGUgYWN0aW9uUHJvbWlzZT86IFByb21pc2U8eyBjb250cm9sSWQ/OiBzdHJpbmc7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfT47XG5cblx0cHJpdmF0ZSBjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nPzogQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2s7XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHVibGljIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHRnZXRJbnRlcmZhY2UoKTogQmFzZU9iamVjdCB7XG5cdFx0cmV0dXJuIHN1cGVyLmdldEludGVyZmFjZSgpO1xuXHR9XG5cblx0Z2V0QXBwQ29tcG9uZW50KCk6IEFwcENvbXBvbmVudCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZm9yIHRoZSBleGlzdGluZyBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGF2YWlsYWJsZSB3aXRoIHRoZSBlZGl0YWJsZSBjb250ZXh0XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGVkaXREb2N1bWVudChjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHZvaWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCB2aWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3M7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRsZXQgcm9vdENvbnRleHQ6IENvbnRleHQgPSBjb250ZXh0O1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IGdyb3VwSWQgPSBcImVkaXRHcm91cFwiO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoKHZpZXdEYXRhPy52aWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDEpIHtcblx0XHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgfHwgcHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRyb290Q29udGV4dCA9IChhd2FpdCBDb21tb25VdGlscy5jcmVhdGVSb290Q29udGV4dChwcm9ncmFtbWluZ01vZGVsLCB2aWV3LCB0aGlzLmdldEFwcENvbXBvbmVudCgpKSkgYXMgQ29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRWRpdCh7IGNvbnRleHQ6IHJvb3RDb250ZXh0IH0pO1xuXG5cdFx0XHRsZXQgcmlnaHRtb3N0Q29udGV4dCA9IHRoaXMuX2lzRmNsRW5hYmxlZCgpID8gKHJvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBjb250ZXh0O1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRyaWdodG1vc3RDb250ZXh0ID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0KHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHJpZ2h0bW9zdENvbnRleHQpICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIHdlIGNoZWNrIHRoZSByaWdodG1vc3RDb250ZXh0IGNhbiBiZSB1c2VkIGluIGRyYWZ0XG5cdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQgPSBjb250ZXh0O1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZSA9IHRyYW5zYWN0aW9uSGVscGVyLmVkaXREb2N1bWVudChcblx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdHRoaXMuYmFzZS5nZXRWaWV3KCksXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0Z3JvdXBJZFxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJvb3RDb250ZXh0SW5mbyA9IHtcblx0XHRcdFx0cm9vdFNpYmxpbmdQYXRoUHJvbWlzZTogbmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZVxuXHRcdFx0fTtcblx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbCwgbW9kZWwpO1xuXG5cdFx0XHRsZXQgc2libGluZ0luZm9Qcm9taXNlO1xuXHRcdFx0Ly8gcmlnaHRtb3N0Q29udGV4dCA9PT0gcm9vdENvbnRleHQgPT4gd2UncmUgaW4gT1AuIElmIG5vdCwgd2UncmUgaW4gbXVsdGktY29sdW1uIGxheW91dCBvZiBGQ0xcblx0XHRcdGNvbnN0IGNvbXB1dGVTaWJsaW5nSW5mbyA9IHJpZ2h0bW9zdENvbnRleHQgIT09IHJvb3RDb250ZXh0IHx8ICh2aWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxO1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbykge1xuXHRcdFx0XHRzaWJsaW5nSW5mb1Byb21pc2UgPSB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQsXG5cdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0SW5mbyxcblx0XHRcdFx0XHRncm91cElkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRjb250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goZ3JvdXBJZCk7XG5cblx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHNpYmxpbmdJbmZvUHJvbWlzZTtcblx0XHRcdGNvbnN0IG5ld0RvY3VtZW50Q29udGV4dCA9IChhd2FpdCBuZXdEb2N1bWVudENvbnRleHRQcm9taXNlKSBhcyBDb250ZXh0O1xuXHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlOiBDb250ZXh0IHwgdW5kZWZpbmVkID0gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbykge1xuXHRcdFx0XHRpZiAoc2libGluZ0luZm8gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCxcblx0XHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0cm9vdENvbnRleHRJbmZvLFxuXHRcdFx0XHRcdFx0XCIkYXV0b1wiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHRoaXMuX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0KGNvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dCwgc2libGluZ0luZm8pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3RvcnkoW10pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cblx0XHRcdFx0aWYgKG5ld0RvY3VtZW50Q29udGV4dCAhPT0gcm9vdENvbnRleHQpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckVkaXQoeyBjb250ZXh0OiBjb250ZXh0VG9OYXZpZ2F0ZSB9KTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlIGFzIENvbnRleHQsIHtcblx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0cmVjcmVhdGVDb250ZXh0OiBmYWxzZSxcblx0XHRcdFx0XHRcdGZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBzdGlja3lPbiBoYW5kbGVyIG11c3QgYmUgc2V0IGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIGRvbmUsXG5cdFx0XHRcdFx0XHQvLyBhcyB0aGUgVVJMIG1heSBjaGFuZ2UgaW4gdGhlIGNhc2Ugb2YgRkNMXG5cdFx0XHRcdFx0XHRsZXQgc3RpY2t5Q29udGV4dDogQ29udGV4dDtcblx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIHVzZSB0aGUga2VwdC1hbGl2ZSBjb250ZXh0IHVzZWQgdG8gYmluZCB0aGUgcGFnZVxuXHRcdFx0XHRcdFx0XHRzdGlja3lDb250ZXh0ID0gbmV3RG9jdW1lbnRDb250ZXh0Py5nZXRNb2RlbCgpLmdldEtlZXBBbGl2ZUNvbnRleHQobmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzdGlja3lDb250ZXh0ID0gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPbihzdGlja3lDb250ZXh0KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1vZGVsLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHRcdFx0Ly8gYWNjb3JkaW5nIHRvIFVYIGluIGNhc2Ugb2YgZW5hYmxlZCBjb2xsYWJvcmF0aW9uIGRyYWZ0IHdlIHNoYXJlIHRoZSBvYmplY3QgaW1tZWRpYXRlbHlcblx0XHRcdFx0XHRcdGF3YWl0IHNoYXJlT2JqZWN0KG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBjb250ZXh0VG9OYXZpZ2F0ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBlZGl0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIHNpZGUgZWZmZWN0cyByZXF1aXJlZCBhZnRlciBkZWxldGluZyBhbiBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIHRoZSBkZWxldGVkIG9iamVjdCBiZWxvbmdzIHRvXG5cdCAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHBhcmVudCBvYmplY3Qgb2YgdGhlIGRlbGV0ZWQgb2JqZWN0XG5cdCAqL1xuXHRwcml2YXRlIHJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkLCBwYXJlbnRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0aWYgKCFsaXN0QmluZGluZyB8fCAhcGFyZW50Q29udGV4dCB8fCBDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBzaWRlRWZmZWN0U2VydmljZSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0c2lkZUVmZmVjdFNlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgcGFyZW50Q29udGV4dCk7XG5cblx0XHRjb25zdCBzdGF0ZU1lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChsaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLCBwYXJlbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0Ly8gSW4gY2FzZSBvZiBhIFRyZWVUYWJsZSwgd2UgbmVlZCB0byByZWZyZXNoIHN0YXRlIG1lc3NhZ2VzIGZvciB0aGUgT2JqZWN0UGFnZSwgYXMgc29tZSBvZiB0aGVzZSBtZXNzYWdlcyBtaWdodCBiZSBhdHRhY2hlZFxuXHRcdC8vIHRvIGNoaWxkcmVuIG9mIGEgZGVsZXRlZCByb3cgd2hpY2ggbWF5IG5vdCBoYXZlIGJlZW4gbG9hZGVkIHlldCwgYW5kIHRoZXJlZm9yZSB0aGUgbW9kZWwgd291bGRuJ3QgY2xlYW4gdXAgdGhlc2UgbWVzc2FnZXNcblx0XHRpZiAoc3RhdGVNZXNzYWdlc1BhdGggJiYgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRzaWRlRWZmZWN0U2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3N0YXRlTWVzc2FnZXNQYXRoXSwgcGFyZW50Q29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgc2V2ZXJhbCBkb2N1bWVudHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0c1RvRGVsZXRlIFRoZSBjb250ZXh0cyBvZiB0aGUgZG9jdW1lbnRzIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2tcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5ub0RpYWxvZ1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50cyBhcmUgZGVsZXRlZFxuXHQgKi9cblx0YXN5bmMgZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0Y29udGV4dHNUb0RlbGV0ZTogQ29udGV4dFtdLFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0Y29udHJvbElkOiBzdHJpbmc7XG5cdFx0XHRub0RpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM/OiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGU7XG5cdFx0cGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgPSBwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2U7XG5cblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgcGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpID8/IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdGxldCBpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGU6IENvbnRleHRbXSA9IFtdO1xuXHRcdGlmIChwYXJlbnRDb250cm9sPy5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0aW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlID0gY29udGV4dHNUb0RlbGV0ZS5maWx0ZXIoKGNvbnRleHQpID0+IGNvbnRleHQuaXNJbmFjdGl2ZSgpKTtcblx0XHR9XG5cdFx0aWYgKCFwYXJlbnRDb250cm9sKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXIgY29udHJvbElkIG1pc3Npbmcgb3IgaW5jb3JyZWN0XCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSBwYXJlbnRDb250cm9sIGFzIENvbnRyb2w7XG5cdFx0fVxuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gKHBhcmVudENvbnRyb2wuZ2V0QmluZGluZyhcIml0ZW1zXCIpIHx8IChwYXJlbnRDb250cm9sIGFzIFRhYmxlKS5nZXRSb3dCaW5kaW5nKCkpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0cGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gdHJ1ZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChwYXJhbWV0ZXJzPy5zZWxlY3RlZENvbnRleHRzPy5bMF0gPz8gY29udGV4dHNUb0RlbGV0ZVswXSkgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihjb250ZXh0c1RvRGVsZXRlLCBwYXJhbWV0ZXJzKTtcblxuXHRcdFx0bGV0IHJlc3VsdDtcblxuXHRcdFx0Ly8gTXVsdGlwbGUgb2JqZWN0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGEgbGlzdFxuXHRcdFx0Ly8gRmlyc3QgY2xlYXIgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGFibGUgYXMgaXQncyBub3QgdmFsaWQgYW55IG1vcmVcblx0XHRcdGlmIChwYXJlbnRDb250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdHBhcmVudENvbnRyb2wuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhlbiByZWZyZXNoIHRoZSBsaXN0LWJpbmRpbmcgKExSKSwgb3IgcmVxdWlyZSBzaWRlLWVmZmVjdHMgKE9QKVxuXHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0aWYgKGxpc3RCaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdC8vIGtlZXAgcHJvbWlzZSBjaGFpbiBwZW5kaW5nIHVudGlsIHJlZnJlc2ggb2YgbGlzdGJpbmRpbmcgaXMgY29tcGxldGVkXG5cdFx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHQvLyBXZSB1c2UgYSBzaWRlLWVmZmVjdCByZWZyZXNoIGZvciBhIFRyZWVUYWJsZSwgdG8gcHJlc2VydmUgZXhwYW5zaW9uIHN0YXRlc1xuXHRcdFx0XHRcdHJlc3VsdCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogXCJcIiB9XSwgbGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpISk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzdWx0ID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdGxpc3RCaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGxpc3RCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGxpc3RCaW5kaW5nLCB2aWV3QmluZGluZ0NvbnRleHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBkZWxldGluZyBhdCBsZWFzdCBvbmUgb2JqZWN0IHNob3VsZCBhbHNvIHNldCB0aGUgVUkgdG8gZGlydHlcblx0XHRcdGlmICghdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCA9IHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQoKTtcblx0XHRcdC8vIFdlIGNsZWFyIHJlY29tbWVuZGF0aW9uIGRhdGEgYW5kIGNvbnRleHRzIGZyb20gaW50ZXJuYWwgbW9kZWwgZm9yIHRoZSBkZWxldGVkIGNvbnRleHRzXG5cdFx0XHRpZiAoaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0dGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pZ25vcmVSZWNvbW1lbmRhdGlvbkZvckNvbnRleHRzKGNvbnRleHRzVG9EZWxldGUpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm90aWZ5IGNvbnN1bWVycyBvZiB3aGljaCBjb250ZXh0cyB3ZXJlIGRlbGV0ZWRcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGVsZXRlKHsgY29udGV4dHM6IGNvbnRleHRzVG9EZWxldGUgfSk7XG5cblx0XHRcdGlmIChwYXJlbnRDb250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdGNvbnN0IHRhYmxlQVBJID0gcGFyZW50Q29udHJvbC5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHRhYmxlQVBJPy50YWJsZURlZmluaXRpb24/LmNvbnRyb2w/LmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0XHRcdGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZS5sZW5ndGggPiAwXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHRhYmxlQVBJLnJlbW92ZUVtcHR5Um93c01lc3NhZ2VzKGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZSk7XG5cdFx0XHRcdFx0YXdhaXQgdGFibGVBUEkuc2V0VXBFbXB0eVJvd3MocGFyZW50Q29udHJvbCwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EZWxldGUsIGNvbnRleHRzVG9EZWxldGUpO1xuXG5cdFx0XHRyZXR1cm4gYXdhaXQgcmVzdWx0O1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnQocylcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgZGlzcGxheXMgdGhlIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBlcnJvcnMgZHVyaW5nIGFuIHVwZGF0ZS5cblx0ICpcblx0ICogQHBhcmFtIHVwZGF0ZWRDb250ZXh0IENvbnRleHQgb2YgdGhlIHVwZGF0ZWQgZmllbGRcblx0ICogQHBhcmFtIHVwZGF0ZVByb21pc2UgUHJvbWlzZSB0byBkZXRlcm1pbmUgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuIFRoZSBwcm9taXNlIHNob3VsZCBiZSByZXNvbHZlZCB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgc28gdGhlIGRyYWZ0IHN0YXR1cyBjYW4gYmUgdXBkYXRlZC5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRyYWZ0IHN0YXR1cyBoYXMgYmVlbiB1cGRhdGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHVwZGF0ZURvY3VtZW50KHVwZGF0ZWRDb250ZXh0OiBvYmplY3QsIHVwZGF0ZVByb21pc2U6IFByb21pc2U8dW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvcmlnaW5hbEJpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBpc0RyYWZ0ID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHVwZGF0ZWRDb250ZXh0IGFzIEJpbmRpbmcgfCBDb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzayhhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAob3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc0RyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHVwZGF0ZVByb21pc2U7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoIWlzRHJhZnQgfHwgIWN1cnJlbnRCaW5kaW5nQ29udGV4dCB8fCBjdXJyZW50QmluZGluZ0NvbnRleHQgIT09IG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBJZiBhIG5hdmlnYXRpb24gaGFwcGVuZWQgd2hpbGUgb1Byb21pc2Ugd2FzIGJlaW5nIHJlc29sdmVkLCB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGNoYW5nZWRcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSdyZSBzdGlsbCBvbiB0aGUgc2FtZSBjb250ZXh0XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXROYW1lID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdFx0XHRjb25zdCBzZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMobWV0YU1vZGVsLCBlbnRpdHlTZXROYW1lKTtcblx0XHRcdFx0aWYgKHNlbWFudGljS2V5cz8ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRTZW1hbnRpY1BhdGggPSBjdXJyZW50U2VtYW50aWNNYXBwaW5nPy5zZW1hbnRpY1BhdGgsXG5cdFx0XHRcdFx0XHRzQ2hhbmdlZFBhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgoY3VycmVudEJpbmRpbmdDb250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHQvLyBjdXJyZW50U2VtYW50aWNQYXRoIGNvdWxkIGJlIG51bGwgaWYgd2UgaGF2ZSBuYXZpZ2F0ZWQgdmlhIGRlZXAgbGluayB0aGVuIHRoZXJlIGFyZSBubyBzZW1hbnRpY01hcHBpbmdzIHRvIGNhbGN1bGF0ZSBpdCBmcm9tXG5cdFx0XHRcdFx0aWYgKGN1cnJlbnRTZW1hbnRpY1BhdGggJiYgY3VycmVudFNlbWFudGljUGF0aCAhPT0gc0NoYW5nZWRQYXRoKSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dCwgeyBlZGl0YWJsZTogdHJ1ZSwgcmVjcmVhdGVDb250ZXh0OiBmYWxzZSB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRpZiAoaXNEcmFmdCAmJiBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZXMoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0UGFyZW50Q29udGV4dEZyb21TZWxlY3Rpb24oc2VsZWN0ZWRDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSB8IHVuZGVmaW5lZCk6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoc2VsZWN0ZWRDb250ZXh0cyAmJiBzZWxlY3RlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIE9uZSBwYXJlbnQgYXQgbW9zdCAhIVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY3JlYXRlIGEgbmV3IGRvY3VtZW50IGluIGEgVHJlZVRhYmxlIHdpdGggJHtzZWxlY3RlZENvbnRleHRzLmxlbmd0aH0gcGFyZW50c2ApO1xuXHRcdH1cblxuXHRcdHJldHVybiBzZWxlY3RlZENvbnRleHRzPy5sZW5ndGggPT09IDEgPyBzZWxlY3RlZENvbnRleHRzWzBdIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgU3luYyAtIHRoZSBjcmVhdGlvbiBpcyB0cmlnZ2VyZWQgYW5kIG9uY2UgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQsIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmVcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQXN5bmMgLSB0aGUgY3JlYXRpb24gYW5kIHRoZSBuYXZpZ2F0aW9uIHRvIHRoZSBpbnN0YW5jZSBhcmUgZG9uZSBpbiBwYXJhbGxlbFxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZCAtIHRoZSBjcmVhdGlvbiBpcyBkb25lIG9uIHRoZSB0YXJnZXQgcGFnZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBDcmVhdGlvblJvdyAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSBhc3luYyBzbyB0aGUgdXNlciBpcyBub3QgYmxvY2tlZFxuXHQvLyBtUGFyYW1ldGVycy5jcmVhdGlvblJvdyBJbnN0YW5jZSBvZiB0aGUgY3JlYXRpb24gcm93IC0gKFRPRE86IGdldCByaWQgYnV0IHVzZSBsaXN0IGJpbmRpbmdzIG9ubHkpXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB2TGlzdEJpbmRpbmcgIE9EYXRhTGlzdEJpbmRpbmcgb2JqZWN0IG9yIHRoZSBiaW5kaW5nIHBhdGggZm9yIGEgdGVtcG9yYXJ5IGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzo8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgTmV3UGFnZSAtIHRoZSBjcmVhdGVkIGRvY3VtZW50IGlzIHNob3duIGluIGEgbmV3IHBhZ2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIG1ldGFkYXRhICdTeW5jJywgJ0FzeW5jJyBvciAnRGVmZXJyZWQnIGlzIHVzZWQ8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgSW5saW5lIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIChpbiBhIHRhYmxlKTxici8+XG5cdCAqICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGluIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIHNwZWNpZmllZCB2aWEgdGhlIHBhcmFtZXRlciAnb3V0Ym91bmQnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRhYmxlSWQgSUQgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm91dGJvdW5kIFRoZSBuYXZpZ2F0aW9uIHRhcmdldCB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnRXh0ZXJuYWwnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFNwZWNpZmllcyBpZiB0aGUgbmV3IGVudHJ5IHNob3VsZCBiZSBjcmVhdGVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIGEgdGFibGUgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0lubGluZSdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZGF0YSBUaGUgaW5pdGlhbCBkYXRhIGZvciB0aGUgY3JlYXRlZCBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5idXN5TW9kZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uUm93IFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMgVGhlIGNvbnRleHRzIHRoYXQgYXJlIHNlbGVjdGVkIGluIHRoZSB0YWJsZSBpbml0aWF0aW5nIHRoZSBjcmVhdGlvbi4gVXNlZCBpbiBjYXNlIG9mIGEgVHJlZVRhYmxlIHRvIGRldGVybWluZSB0aGUgcGFyZW50IGNvbnRleHQgb2YgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGUgV2hlbiBlbmFibGVkLCBhbiBleHRyYSByZXF1ZXN0IGNoZWNrcyBpZiBhbnkgZHJhZnRzIGV4aXN0IHRoYXQgd2VyZSBuZXZlciBzYXZlZC4gSWYgdW5zYXZlZCBkcmFmdHMgYXJlIGZvdW5kLCB0aGUgbmV3ZXN0IG9uZSBpcyBvcGVuZWQuIElmIG5vIHVuc2F2ZWQgZHJhZnRzIGFyZSBmb3VuZCwgYSBuZXcgZW50aXR5IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBjcmVhdGVEb2N1bWVudChcblx0XHR2TGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdGJGcm9tRGVmZXJyZWQ/OiBib29sZWFuO1xuXHRcdFx0YnVzeU1vZGU/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRcdFx0ZGF0YT86IG9iamVjdDtcblx0XHRcdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdFx0XHRvdXRib3VuZD86IHN0cmluZztcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0c2luZ2xlRHJhZnRGb3JDcmVhdGU/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IG9EYXRhTGlzdEJpbmRpbmchOiBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdGxldCBwYXJlbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblxuXHRcdGlmIChtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKSB7XG5cdFx0XHRpZiAodHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRjb25zdCBvRGF0YU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdFx0aWYgKCFvRGF0YU1vZGVsKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcgPSBvRGF0YU1vZGVsLmJpbmRMaXN0KHZMaXN0QmluZGluZykgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRcdFx0bUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuU3luYztcblx0XHRcdFx0ZGVsZXRlIG1JblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQ7XG5cdFx0XHR9IGVsc2UgaWYgKHZMaXN0QmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nID0gdkxpc3RCaW5kaW5nO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBvYmplY3Qgb3IgcGF0aCBleHBlY3RlZFwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKG9EYXRhTGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdHBhcmVudENvbnRleHQgPSB0aGlzLmdldFBhcmVudENvbnRleHRGcm9tU2VsZWN0aW9uKG1JblBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzb2x2ZWRDcmVhdGlvbk1vZGUgPSB0aGlzLnJlc29sdmVDcmVhdGlvbk1vZGUobUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUsIG9EYXRhTGlzdEJpbmRpbmcsIG1JblBhcmFtZXRlcnMuZGF0YSk7XG5cblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkucmVtb3ZlSUFwcFN0YXRlS2V5KCk7XG5cblx0XHRpZiAoXG5cdFx0XHQobUluUGFyYW1ldGVycy5zaW5nbGVEcmFmdEZvckNyZWF0ZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdD8gbUluUGFyYW1ldGVycy5zaW5nbGVEcmFmdEZvckNyZWF0ZVxuXHRcdFx0XHQ6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TWFuaWZlc3QoKVtcInNhcC5mZVwiXT8uYXBwPy5zaW5nbGVEcmFmdEZvckNyZWF0ZSkgJiZcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcgPT09IG9EYXRhTGlzdEJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKSAmJlxuXHRcdFx0b0RhdGFMaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkgIT09IG51bGxcblx0XHQpIHtcblx0XHRcdGNvbnN0IG5ld0JpbmRpbmcgPSBvRGF0YUxpc3RCaW5kaW5nLmdldE1vZGVsKCk/LmJpbmRMaXN0KFxuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZy5nZXRDb250ZXh0KCksXG5cdFx0XHRcdG5ldyBTb3J0ZXIoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9MYXN0Q2hhbmdlRGF0ZVRpbWVcIiwgdHJ1ZSksXG5cdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdGZpbHRlcnM6IFtcblx0XHRcdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0XHRwYXRoOiBcIklzQWN0aXZlRW50aXR5XCIsXG5cdFx0XHRcdFx0XHRcdG9wZXJhdG9yOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdHZhbHVlMTogZmFsc2Vcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRcdHBhdGg6IFwiSGFzQWN0aXZlRW50aXR5XCIsXG5cdFx0XHRcdFx0XHRcdG9wZXJhdG9yOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdHZhbHVlMTogZmFsc2Vcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRhbmQ6IHRydWVcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBuZXdCaW5kaW5nPy5yZXF1ZXN0Q29udGV4dHMoMCwgMSk7XG5cdFx0XHRpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2hhbmRsZU5ld0NvbnRleHQocmVzdWx0WzBdLCB7IGVkaXRhYmxlOiB0cnVlLCByZWNyZWF0ZUNvbnRleHQ6IGZhbHNlIH0pLnRoZW4oKCkgPT4gbmV3QmluZGluZz8uZGVzdHJveSgpKTtcblx0XHRcdH1cblx0XHRcdG5ld0JpbmRpbmc/LmRlc3Ryb3koKTtcblx0XHRcdHJldHVybiB0aGlzLl9oYW5kbGVDcmVhdGlvbk1vZGUocmVzb2x2ZWRDcmVhdGlvbk1vZGUsIHZMaXN0QmluZGluZywgbUluUGFyYW1ldGVycywgb0RhdGFMaXN0QmluZGluZywgcGFyZW50Q29udGV4dCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9oYW5kbGVDcmVhdGlvbk1vZGUocmVzb2x2ZWRDcmVhdGlvbk1vZGUsIHZMaXN0QmluZGluZywgbUluUGFyYW1ldGVycywgb0RhdGFMaXN0QmluZGluZywgcGFyZW50Q29udGV4dCk7XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlQ3JlYXRpb25Nb2RlKFxuXHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlOiBzdHJpbmcsXG5cdFx0dkxpc3RCaW5kaW5nOiBzdHJpbmcgfCBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmFtZXRlcnM6IEludGVybmFsQ3JlYXRlUGFyYW1ldGVycyxcblx0XHRvRGF0YUxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmVudENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWRcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3RvcnkoW10pO1xuXHRcdHN3aXRjaCAocmVzb2x2ZWRDcmVhdGlvbk1vZGUpIHtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkV4dGVybmFsOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFeHRlcm5hbERvY3VtZW50KHZMaXN0QmluZGluZywgcGFyYW1ldGVycy5vdXRib3VuZCk7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5EZWZlcnJlZDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRGVmZXJyZWREb2N1bWVudChvRGF0YUxpc3RCaW5kaW5nLCBwYXJlbnRDb250ZXh0LCBwYXJhbWV0ZXJzLmRhdGEpO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c6XG5cdFx0XHRcdHJldHVybiBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93XG5cdFx0XHRcdFx0PyB0aGlzLmNyZWF0ZUNyZWF0ZVJvd0RvY3VtZW50KHtcblx0XHRcdFx0XHRcdFx0Y3JlYXRpb25Sb3c6IHBhcmFtZXRlcnMuY3JlYXRpb25Sb3csXG5cdFx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kXG5cdFx0XHRcdFx0ICB9KVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuSW5saW5lOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVJbmxpbmVEb2N1bWVudChcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR0YWJsZUlkOiBwYXJhbWV0ZXJzLnRhYmxlSWQsXG5cdFx0XHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5TeW5jOlxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQXN5bmM6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZVN5bmNBc3luY0RvY3VtZW50KFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogcmVzb2x2ZWRDcmVhdGlvbk1vZGUsXG5cdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRcdFx0XHRiRnJvbURlZmVycmVkOiBwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQsXG5cdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0Y3JlYXRlQWN0aW9uOiBwYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbixcblx0XHRcdFx0XHRcdHBhcmVudENvbnRleHRcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0KTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSAke3Jlc29sdmVkQ3JlYXRpb25Nb2RlfWApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKkV4ZWN1dGVzIHRoZSBtYW5kYXRvcnkgY29uZmlndXJhdGlvbiBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZC5cblx0ICpcblx0ICogQHBhcmFtIHByZXJlcXVpc2l0ZSBQcm9taXNlIG9mIHRoZSBkb2N1bWVudCBjcmVhdGlvbiBhbmQgdGhlIGZvbGxvd2luZyBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgY29uZmlndXJhdGlvbiBpcyBkb25lXG5cdCAqL1xuXHRhc3luYyBwb3N0RG9jdW1lbnRDcmVhdGlvbihwcmVyZXF1aXNpdGU6IFByb21pc2U8W0NvbnRleHQsIHVua25vd25dPiwgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpO1xuXHRcdGNvbnN0IG1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBwYXJhbXMgPSBhd2FpdCBwcmVyZXF1aXNpdGU7XG5cdFx0Y29uc3QgbmV3RG9jdW1lbnRDb250ZXh0ID0gcGFyYW1zWzBdO1xuXHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbCwgbW9kZWwpO1xuXHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyQ3JlYXRlKHsgY29udGV4dDogbmV3RG9jdW1lbnRDb250ZXh0IH0pO1xuXHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUpOyAvLyBUaGUgY3JlYXRlTW9kZSBmbGFnIHdpbGwgYmUgc2V0IGluIGNvbXB1dGVFZGl0TW9kZVxuXHRcdGlmICghbGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0Ly8gV29ya2Fyb3VuZCB0byB0ZWxsIHRoZSBPUCB0aGF0IHdlJ3ZlIGNyZWF0ZWQgYSBuZXcgb2JqZWN0IGZyb20gdGhlIExSXG5cdFx0XHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YUNvbnRleHQobGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0XHRcdGNvbnN0IG5ld0FjdGlvbiA9IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uTmV3QWN0aW9uO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBuZXdBY3Rpb24pO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0Ly8gQ3JlYXRpbmcgYSBuZXcgaXRlbSBpbiBhIGhpZXJhcmNoeSBmcm9tIHRoZSBMaXN0UmVwb3J0IChzaW5jZSB0aGUgbGlzdEJpbmRpbmcgaXMgbm90IHJlbGF0aXZlKVxuXHRcdFx0XHQvLyAtLT4gd2Ugd2FudCB0byBmb3JjZSB0aGUgdXNlciB0byBlaXRoZXIgc2F2ZSBvciBkaXNjYXJkIHRoZSBkcmFmdCBiZWZvcmUgbGVhdmluZyB0aGUgT1Bcblx0XHRcdFx0dGhpcy5mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCh0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG5ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUobGlzdEJpbmRpbmcpO1xuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1vZGVsLmdldE1ldGFNb2RlbCgpKSAmJlxuXHRcdFx0XHR0aGlzLmlzRHJhZnRSb290KG5ld0RvY3VtZW50Q29udGV4dCkgJiZcblx0XHRcdFx0IXRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIGFjY29yZGluZyB0byBVWCBpbiBjYXNlIG9mIGVuYWJsZWQgY29sbGFib3JhdGlvbiBkcmFmdCB3ZSBzaGFyZSB0aGUgb2JqZWN0IGltbWVkaWF0ZWx5XG5cdFx0XHRcdGF3YWl0IHNoYXJlT2JqZWN0KG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgdmlhIHRoZSBjcmVhdGlvblJvdy5cblx0ICpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBUaGUgbmV3IGRvY3VtZW50IGlzIGNyZWF0ZWQgYXQgdGhlIGVuZC5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgVGhlIGNyZWF0aW9uIHJvd1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgVGhlIHNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVDcmVhdGVSb3dEb2N1bWVudChwYXJhbWV0ZXJzOiB7XG5cdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdGNyZWF0aW9uUm93OiBDcmVhdGlvblJvdztcblx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHR9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRjb25zdCBjcmVhdGlvblJvdyA9IHBhcmFtZXRlcnMuY3JlYXRpb25Sb3c7XG5cdFx0Y29uc3QgdGFibGUgPSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93LmdldFBhcmVudCgpIGFzIFRhYmxlIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBuYXZpZ2F0aW9uID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0aWYgKCF0YWJsZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IHRhYmxlLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSBcIkNyZWF0aW9uUm93XCIgd2l0aCBhIFRyZWVUYWJsZWApO1xuXHRcdH1cblx0XHRjb25zdCBjcmVhdGlvblJvd0NvbnRleHQgPSBjcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0Y29uc3QgZG9jdW1lbnRWYWxpZGF0aW9uID0gdGhpcy5nZXRDcmVhdGlvblJvd1ZhbGlkYXRpb25GdW5jdGlvbih0YWJsZSk7XG5cdFx0Ly8gZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSBpcyBzZXQgdG8gZmFsc2UgaW4gbWFuaWZlc3QgY29udmVydGVyIChUYWJsZS50cykgaWYgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIGV4aXN0c1xuXHRcdGlmIChjcmVhdGlvblJvdy5kYXRhKFwiZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YVwiKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRcdHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LnNldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dGaWVsZFZhbGlkaXR5XCIsIHt9KTtcblx0XHR9XG5cblx0XHRjb25zdCB2YWxpZGF0aW9uTWVzc2FnZXMgPSBhd2FpdCB0aGlzLnN5bmNUYXNrKGRvY3VtZW50VmFsaWRhdGlvbik7XG5cdFx0aWYgKHZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHR0aGlzLmNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyh2YWxpZGF0aW9uTWVzc2FnZXMsIHRhYmxlKTtcblx0XHRcdExvZy5lcnJvcihcIkN1c3RvbSBWYWxpZGF0aW9uIGZhaWxlZFwiKTtcblx0XHRcdC8vIGlmIGN1c3RvbSB2YWxpZGF0aW9uIGZhaWxzLCB3ZSBsZWF2ZSB0aGUgbWV0aG9kIGltbWVkaWF0ZWx5XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGVudGl0eVR5cGUgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNyZWF0aW9uUm93Q29udGV4dC5nZXRQYXRoKCkpKS50YXJnZXRFbnRpdHlUeXBlO1xuXHRcdGNvbnN0IGNyZWF0aW9uUm93UGF5bG9hZCA9IGNyZWF0aW9uUm93Q29udGV4dC5nZXRPYmplY3QoKTtcblxuXHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXG5cdFx0Ly9tb3ZlZCBhZnRlciBfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzIHRvIGF2b2lkIFwiJ2NyZWF0aW9uJyB1c2UgYmVmb3JlIGluaXRpYWxpemF0aW9uXCIgY29uc29sZSBlcnJvcnNcblx0XHQvL2FmdGVyIHZhbGlkYXRpb24gZXJyb3JzIG9jY3VycmVkXG5cdFx0bGlzdEJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGF3YWl0IGNyZWF0aW9uO1xuXHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kID8gdGFibGUuZ2V0Um93QmluZGluZygpLmdldExlbmd0aCgpIDogMCk7XG5cdFx0fSk7XG5cblx0XHQvLyB0YWtlIGNhcmUgb24gbWVzc2FnZSBoYW5kbGluZywgZHJhZnQgaW5kaWNhdG9yIChpbiBjYXNlIG9mIGRyYWZ0KVxuXHRcdC8vIEF0dGFjaCB0aGUgY3JlYXRlIHNlbnQgYW5kIGNyZWF0ZSBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyhsaXN0QmluZGluZyk7XG5cblx0XHRjb25zdCBjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5jcmVhdGVEb2N1bWVudChcblx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdHt9LFxuXHRcdFx0XHRcdC4uLk9iamVjdC5rZXlzKGNyZWF0aW9uUm93UGF5bG9hZClcblx0XHRcdFx0XHRcdC5maWx0ZXIoXG5cdFx0XHRcdFx0XHRcdChwcm9wZXJ0eVBhdGg6IHN0cmluZykgPT5cblx0XHRcdFx0XHRcdFx0XHRlbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmRJbmRleCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUgPT09IHByb3BlcnR5UGF0aCkgPT09IC0xXG5cdFx0XHRcdFx0XHQpIC8vIGVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHQubWFwKChwYXRoKSA9PiAoeyBbcGF0aF06IGNyZWF0aW9uUm93UGF5bG9hZFtwYXRoXSB9KSlcblx0XHRcdFx0KSxcblx0XHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdGJ1c3lNb2RlOiBcIkxvY2FsXCIsIC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0YnVzeUlkOiAodGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkKT8uZ2V0VGFibGVEZWZpbml0aW9uKCk/LmFubm90YXRpb24uaWQsXG5cdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiBhcHBDb21wb25lbnQuZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuQXV0b0NyZWF0ZSwgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93XG5cdFx0XHR9LFxuXHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdC8vIFNpZGVFZmZlY3RzIG9uIENyZWF0ZVxuXHRcdC8vIGlmIFNhdmUgaXMgcHJlc3NlZCBkaXJlY3RseSBhZnRlciBmaWxsaW5nIHRoZSBDcmVhdGlvblJvdywgbm8gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHRcdGlmICghcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdHRoaXMuaGFuZGxlU2lkZUVmZmVjdHMobGlzdEJpbmRpbmcsIGNyZWF0aW9uKTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgY3JlYXRpb25Sb3dMaXN0QmluZGluZyA9IGNyZWF0aW9uUm93Q29udGV4dC5nZXRCaW5kaW5nKCkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRcdGNvbnN0IG5ld1RyYW5zaWVudENvbnRleHQgPSBjcmVhdGlvblJvd0xpc3RCaW5kaW5nLmNyZWF0ZSgpO1xuXHRcdFx0Y3JlYXRpb25Sb3cuc2V0QmluZGluZ0NvbnRleHQobmV3VHJhbnNpZW50Q29udGV4dCk7XG5cblx0XHRcdC8vIHRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3JzIFRPIGJlIGNoZWNrZWQgd2l0aCBtb2RlbCBjb2xsZWFndWVzXG5cdFx0XHRuZXdUcmFuc2llbnRDb250ZXh0LmNyZWF0ZWQoKT8uY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgZmFzdCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHR9KTtcblx0XHRcdG5hdmlnYXRpb24gPSBjcmVhdGlvblJvd0NvbnRleHQuZGVsZXRlKFwiJGRpcmVjdFwiKTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly8gUmVzZXQgYnVzeSBpbmRpY2F0b3IgYWZ0ZXIgYSB2YWxpZGF0aW9uIGVycm9yXG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZCh0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSk7XG5cdFx0XHR9XG5cdFx0XHRMb2cuZXJyb3IoXCJDcmVhdGlvblJvdyBuYXZpZ2F0aW9uIGVycm9yOiBcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMucG9zdERvY3VtZW50Q3JlYXRpb24oUHJvbWlzZS5hbGwoW2NyZWF0aW9uLCBuYXZpZ2F0aW9uXSksIGxpc3RCaW5kaW5nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGlubGluZSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBUaGUgbmV3IGRvY3VtZW50IGlzIGNyZWF0ZWQgYXQgdGhlIGVuZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgVGhlIHNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMudGFibGVJZCBUaGUgaWQgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGF0YVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZUlubGluZURvY3VtZW50KFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHR0YWJsZUlkPzogc3RyaW5nO1xuXHRcdFx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0ZGF0YT86IG9iamVjdDtcblx0XHR9LFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCB0YWJsZTogVGFibGUgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKHBhcmFtZXRlcnMudGFibGVJZCkge1xuXHRcdFx0dGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKHBhcmFtZXRlcnMudGFibGVJZCkgYXMgVGFibGU7XG5cdFx0fVxuXHRcdGlmICh0YWJsZT8uaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdHRhYmxlLmdldFJvd0JpbmRpbmcoKS5hdHRhY2hFdmVudE9uY2UoXCJjaGFuZ2VcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBuZXdDb250ZXh0ID0gYXdhaXQgY3JlYXRpb247XG5cdFx0XHRcdGNvbnN0IGFsbEN1cnJlbnRDb250ZXh0cyA9IGxpc3RCaW5kaW5nLmdldEFsbEN1cnJlbnRDb250ZXh0cygpO1xuXHRcdFx0XHRjb25zdCBjb250ZXh0SW5kZXggPSBhbGxDdXJyZW50Q29udGV4dHMuaW5kZXhPZihuZXdDb250ZXh0KTtcblx0XHRcdFx0dGFibGU/LmZvY3VzUm93KGNvbnRleHRJbmRleCwgdHJ1ZSk7XG5cdFx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHQvLyBJbiBjYXNlIG9mIGEgdHJlZSB0YWJsZSwgd2UgYWxzbyBzY3JvbGwgdG8ga2VlcCB0aGUgcGFyZW50IHZpc2libGVcblx0XHRcdFx0XHRjb25zdCBwYXJlbnRDb250ZXh0ID0gbmV3Q29udGV4dC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRjb25zdCBwYXJlbnRJbmRleCA9IHBhcmVudENvbnRleHQgPyBhbGxDdXJyZW50Q29udGV4dHMuaW5kZXhPZihwYXJlbnRDb250ZXh0KSA6IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRpZiAocGFyZW50SW5kZXggIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRJbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0XHR0YWJsZT8uc2Nyb2xsVG9JbmRleChwYXJlbnRJbmRleCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyB0YWtlIGNhcmUgb24gbWVzc2FnZSBoYW5kbGluZywgZHJhZnQgaW5kaWNhdG9yIChpbiBjYXNlIG9mIGRyYWZ0KVxuXHRcdC8vIEF0dGFjaCB0aGUgY3JlYXRlIHNlbnQgYW5kIGNyZWF0ZSBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyhsaXN0QmluZGluZyk7XG5cdFx0Y29uc3QgY3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdHtcblx0XHRcdFx0Ly9DaGVjayBpZiBBbGwgcGFyYW1ldGVycyBhcmUgbmVlZGVkXG5cdFx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRidXN5TW9kZTogXCJMb2NhbFwiLCAvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdGJ1c3lJZDogKHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZCk/LmdldFRhYmxlRGVmaW5pdGlvbigpPy5hbm5vdGF0aW9uLmlkLFxuXHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZSxcblx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlLCAvLyBJbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiB3YXMgY2FsbGVkIHdpdGggcHJlZmVycmVkTW9kZT1hdXRvQ3JlYXRlV2l0aCwgd2Ugd2FudCB0byBza2lwIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuSW5saW5lLFxuXHRcdFx0XHRwYXJlbnRDb250ZXh0OiBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQsXG5cdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXHRcdFx0fSxcblx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRmYWxzZVxuXHRcdCk7XG5cblx0XHRpZiAoIXBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgdGhpcy5zeW5jVGFzayhjcmVhdGlvbildKSwgbGlzdEJpbmRpbmcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkZWZmZXJlZCBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGhhcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IE9wdGlvbmFsIHBhcmVudCBjb250ZXh0IHdoZW4gY3JlYXRpbmcgYSBub2RlIGluIFRyZWVUYWJsZVxuXHQgKiBAcGFyYW0gZGF0YVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRGVmZXJyZWREb2N1bWVudChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgcGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0LCBkYXRhPzogb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChsaXN0QmluZGluZywge1xuXHRcdFx0Y3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM6IHsgbW9kZTogXCJEZWZlcnJlZFwiLCBwYXJlbnRDb250ZXh0LCBsaXN0QmluZGluZywgZGF0YSB9LFxuXHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0fSk7XG5cdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIHN5bmMgb3IgYXN5bmMgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBzeW5jIG9yIGFzeW5jIGNyZWF0aW9uIG1vZGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCBUaGlzIGRvY3VtZW50IGlzIGNyZWF0ZWQgYWZ0ZXIgYSBkZWZmZXJlZCBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24gIFRoZSBjcmVhdGUgaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgY3JlYXRlIGFjdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhICBEYXRhIHRvIHNhdmUgb24gdGhlIG5ldyBkb2N1bWVudFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgVGhlIHNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udGV4dFxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZVN5bmNBc3luY0RvY3VtZW50KFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0ZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHR9LFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBuYXZpZ2F0aW9uOiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCByb3V0aW5nTGlzdGVuZXIgPSB0aGlzLmdldEludGVybmFsUm91dGluZygpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblxuXHRcdGNvbnN0IGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpXG5cdFx0XHQuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Li4ucGFyYW1ldGVycyxcblx0XHRcdFx0XHQuLi57XG5cdFx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdClcblx0XHRcdC50aGVuKChuZXdEb2N1bWVudENvbnRleHQpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpICYmIG5ld0RvY3VtZW50Q29udGV4dCAmJiBuZXdEb2N1bWVudENvbnRleHQuZ2V0QmluZGluZygpICE9PSBsaXN0QmluZGluZykge1xuXHRcdFx0XHRcdC8vIEluIEZDTCBjYXNlLCBpZiB0aGUgbmV3IGNvbnRleHQgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIGFuIGFjdGlvbiAobm90IHdpdGggdGhlIHN0YW5kYXJkIFBPU1QgY3JlYXRlKSwgd2UgbmVlZCB0byByZWZyZXNoXG5cdFx0XHRcdFx0Ly8gdGhlIG9yaWdpbmFsIGxpc3RCaW5kaW5nIHNvIHRoYXQgaXQgY29udGFpbnMgdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0ICh0aGlzIGlzIGRvbmUgYXV0b21hdGljYWxseSBieSB0aGUgbGlzdEJpbmRpbmcgZm9yIHN0YW5kYXJkIGNyZWF0ZSlcblx0XHRcdFx0XHRsaXN0QmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0fSk7XG5cblx0XHQvLyBEb24ndCBkbyB0aGlzIGlmIHRoZSBpbnZvY2F0aW9uIGNvbWVzIGZyb20gYSBkZWZlcnJlZCBjcmVhdGlvbiBvciBpZiBTYXZlIGlzIHByZXNzZWQgZGlyZWN0bHkgYWZ0ZXIgZmlsbGluZyB0aGUgQ3JlYXRpb25Sb3dcblx0XHRpZiAocGFyYW1ldGVycy5iRnJvbURlZmVycmVkICE9PSB0cnVlICYmICFwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0dGhpcy5oYW5kbGVTaWRlRWZmZWN0cyhsaXN0QmluZGluZywgY3JlYXRpb24pO1xuXHRcdH1cblxuXHRcdGlmIChwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkFzeW5jKSB7XG5cdFx0XHRuYXZpZ2F0aW9uID0gcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChsaXN0QmluZGluZywge1xuXHRcdFx0XHRjcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVyczogeyBtb2RlOiBcIkFzeW5jXCIsIGNyZWF0ZUNvbnRleHRQcm9taXNlOiBjcmVhdGlvbiB9LFxuXHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0Zm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5hdmlnYXRpb24gPSBjcmVhdGlvbi50aGVuKGFzeW5jIChuZXdEb2N1bWVudENvbnRleHQpID0+IHtcblx0XHRcdFx0aWYgKCFuZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0XHRjb25zdCBjb3JlUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0XHRcdHJldHVybiByb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVUb01lc3NhZ2VQYWdlKGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfREFUQV9SRUNFSVZFRF9FUlJPUlwiKSwge1xuXHRcdFx0XHRcdFx0dGl0bGU6IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0VESVRGTE9XX1NBUEZFX0NSRUFUSU9OX0ZBSUxFRF9ERVNDUklQVElPTlwiKVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEluIGNhc2UgdGhlIFN5bmMgY3JlYXRpb24gd2FzIHRyaWdnZXJlZCBmb3IgYSBkZWZlcnJlZCBjcmVhdGlvbiwgd2UgZG9uJ3QgbmF2aWdhdGUgZm9yd2FyZFxuXHRcdFx0XHRcdC8vIGFzIHdlJ3JlIGFscmVhZHkgb24gdGhlIGNvcnJlc3BvbmRpbmcgT2JqZWN0UGFnZVxuXHRcdFx0XHRcdGNvbnN0IG5hdlBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0Zm9yY2VGb2N1czogdHJ1ZSxcblx0XHRcdFx0XHRcdHRyYW5zaWVudDpcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGxpc3RCaW5kaW5nKSA9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBwYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbiA/IHRydWUgOiB1bmRlZmluZWRcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0cmV0dXJuIHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZFxuXHRcdFx0XHRcdFx0PyByb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVUb0NvbnRleHQobmV3RG9jdW1lbnRDb250ZXh0LCBuYXZQYXJhbWV0ZXJzKVxuXHRcdFx0XHRcdFx0OiByb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG5ld0RvY3VtZW50Q29udGV4dCwgbmF2UGFyYW1ldGVycyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5wb3N0RG9jdW1lbnRDcmVhdGlvbihQcm9taXNlLmFsbChbY3JlYXRpb24sIG5hdmlnYXRpb25dKSwgbGlzdEJpbmRpbmcpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBvbmx5IGVycm9ycyBoYW5kbGVkIGhlcmUgYXJlIHJhaXNlZCBhcyBzdHJpbmcgLSBzaG91bGQgYmUgY2hhbmdlZCB0byBFcnJvciBvYmplY3RzXG5cdFx0XHQvLyBjcmVhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgYnkgdXNlciBvciBmYWlsZWQgaW4gYmFja2VuZCA9PiBpbiBjYXNlIHdlIGhhdmUgbmF2aWdhdGVkIHRvIHRyYW5zaWVudCBjb250ZXh0IGJlZm9yZSwgbmF2aWdhdGUgYmFja1xuXHRcdFx0Ly8gdGhlIHN3aXRjaC1zdGF0ZW1lbnQgYWJvdmUgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGhhcHBlbnMgaW4gY3JlYXRpb25Nb2RlcyBkZWZlcnJlZCBhbmQgYXN5bmMuIEJ1dCBpbiBmYWN0LCBpbiB0aGVzZSBjYXNlcyBhZnRlciB0aGUgbmF2aWdhdGlvbiBmcm9tIHJvdXRlTWF0Y2hlZCBpbiBPUCBjb21wb25lbnRcblx0XHRcdC8vIGNyZWF0ZURlZmVycmVkRG9jdW1lbnQgaXMgdHJpZ2dlcmVkLCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZCAoY3JlYXRlRG9jdW1lbnQpIGFnYWluIC0gdGhpcyB0aW1lIHdpdGggY3JlYXRpb25Nb2RlIHN5bmMuIFRoZXJlZm9yZSwgYWxzbyBpbiB0aGF0IG1vZGUgd2UgbmVlZCB0byB0cmlnZ2VyIGJhY2sgbmF2aWdhdGlvbi5cblx0XHRcdC8vIFRoZSBvdGhlciBjYXNlcyBtaWdodCBzdGlsbCBiZSBuZWVkZWQgaW4gY2FzZSB0aGUgbmF2aWdhdGlvbiBmYWlscy5cblx0XHRcdGlmIChcblx0XHRcdFx0W1xuXHRcdFx0XHRcdENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2csXG5cdFx0XHRcdFx0Q29uc3RhbnRzLkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCxcblx0XHRcdFx0XHRDb25zdGFudHMuQ3JlYXRpb25GYWlsZWQsXG5cdFx0XHRcdFx0Q29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkXG5cdFx0XHRcdF0uaW5jbHVkZXMoZXJyb3IpXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUoKTtcblx0XHRcdH1cblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBleHRlcm5hbCBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGhhcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBvdXRib3VuZCBUaGUgb3V0Ym91bmQgYWN0aW9uXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZUV4dGVybmFsRG9jdW1lbnQobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcsIG91dGJvdW5kPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gVE9ETzogQ2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbiAoY3VycmVudGx5IHVzaW5nIHRoZSBzYW1lIGFzIGZvciBvdXRib3VuZCBjaGV2cm9uIG5hdiwgYW5kIHdpdGhvdXQgYW55IGNvbnRleHQgLSAzcmQgcGFyYW0pXG5cdFx0aWYgKG91dGJvdW5kKSB7XG5cdFx0XHRpZiAodHlwZW9mIGxpc3RCaW5kaW5nICE9PSBcInN0cmluZ1wiICYmIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgXCJFeHRlcm5hbFwiIHdpdGggYSBUcmVlVGFibGVgKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0Y29uc3QgY29udHJvbGxlciA9IHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcjtcblx0XHRcdGNvbnN0IGNyZWF0ZVBhdGggPSBNb2RlbEhlbHBlci5nZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmcodGhpcy5iYXNlLmdldFZpZXcoKSwgbGlzdEJpbmRpbmcpO1xuXHRcdFx0Y29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZChjb250cm9sbGVyLCBvdXRib3VuZCwgdW5kZWZpbmVkLCBjcmVhdGVQYXRoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWFuYWdlcyB0aGUgU2lkZUVmZmVjdHMgdG8gZXhlY3V0ZSBhZnRlciB0aGUgZG9jdW1lbnQgY3JlYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBoYXMgdG8gYmUgY3JlYXRlZFxuXHQgKiBAcGFyYW0gY3JlYXRpb25Qcm9taXNlIFRoZSBwcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBTaWRlRWZmZWN0cyBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICovXG5cdGhhbmRsZVNpZGVFZmZlY3RzID0gYXN5bmMgKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBjcmVhdGlvblByb21pc2U6IFByb21pc2U8Q29udGV4dD4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBhd2FpdCBjcmVhdGlvblByb21pc2U7XG5cdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdGF3YWl0IG5ld0NvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChsaXN0QmluZGluZykgJiYgdmlld0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgdmlld0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgY3VzdG9tIHZhbGlkYXRpb24gbWVzc2FnZXMgZm9yIHRoZSBjcmVhdGlvblJvdy5cblx0ICpcblx0ICogQHBhcmFtIHZhbGlkYXRpb25NZXNzYWdlcyBUaGUgZXJyb3IgbWVzc2FnZXMgZm9ybSB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB0YXJnZXRlZCBieSB0aGUgbWVzc2FnZXNcblx0ICovXG5cdGNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyA9ICh2YWxpZGF0aW9uTWVzc2FnZXM6IHsgbWVzc2FnZVRhcmdldD86IHN0cmluZzsgbWVzc2FnZVRleHQ6IHN0cmluZyB9W10sIHRhYmxlOiBUYWJsZSk6IHZvaWQgPT4ge1xuXHRcdGNvbnN0IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IHRhYmxlLmdldENyZWF0aW9uUm93KCkuZGF0YShcImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvblwiKTtcblx0XHRjb25zdCBjdXN0b21WYWxpZGl0eSA9IHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiKTtcblx0XHRjb25zdCBjdXN0b21NZXNzYWdlczogQ3VzdG9tTWVzc2FnZVtdID0gW107XG5cdFx0bGV0IGZpZWxkQ29udHJvbDtcblx0XHRsZXQgZmluYWxUYXJnZXQ6IHN0cmluZztcblxuXHRcdC8vIFJlbW92ZSBleGlzdGluZyBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRjb25zdCBvbGRNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0LmdldERhdGEoKVxuXHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRDb2RlKCkgPT09IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbik7XG5cdFx0TWVzc2FnaW5nLnJlbW92ZU1lc3NhZ2VzKG9sZE1lc3NhZ2VzKTtcblxuXHRcdHZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKCh2YWxpZGF0aW9uTWVzc2FnZSkgPT4ge1xuXHRcdFx0Ly8gSGFuZGxlIEJvdW5kIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0aWYgKHZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXQpIHtcblx0XHRcdFx0ZmllbGRDb250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChjdXN0b21WYWxpZGl0eVt2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKSBhcyBDb250cm9sO1xuXHRcdFx0XHRmaW5hbFRhcmdldCA9IGAke2ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCl9LyR7ZmllbGRDb250cm9sLmdldEJpbmRpbmdQYXRoKFwidmFsdWVcIil9YDtcblx0XHRcdFx0Ly8gQWRkIHZhbGlkYXRpb24gbWVzc2FnZSBpZiBzdGlsbCBub3QgZXhpc3RzXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQhTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKChtZXNzYWdlOiBNZXNzYWdlKSA9PiBtZXNzYWdlLmdldFRhcmdldHMoKS5zb21lKCh0YXJnZXQpID0+IHRhcmdldCA9PT0gZmluYWxUYXJnZXQpKS5sZW5ndGhcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0TWVzc2FnaW5nLmFkZE1lc3NhZ2VzKFxuXHRcdFx0XHRcdFx0bmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlOiB2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yOiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XHRcdFx0XHRcdFx0Y29kZTogY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHR0ZWNobmljYWw6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRwZXJzaXN0ZW50OiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0dGFyZ2V0OiBmaW5hbFRhcmdldFxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIEFkZCBjb250cm9sSWQgaW4gb3JkZXIgdG8gZ2V0IHRoZSBmb2N1cyBoYW5kbGluZyBvZiB0aGUgZXJyb3IgcG9wb3ZlclxuXHRcdFx0XHRjb25zdCBleGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0XHQuZmlsdGVyKChtZXNzYWdlOiBNZXNzYWdlKSA9PiBtZXNzYWdlLmdldFRhcmdldHMoKS5zb21lKCh0YXJnZXQpID0+IHRhcmdldCA9PT0gZmluYWxUYXJnZXQpKTtcblx0XHRcdFx0ZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXNbMF0uYWRkQ29udHJvbElkKGN1c3RvbVZhbGlkaXR5W3ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSBVbmJvdW5kIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3VzdG9tTWVzc2FnZXMucHVzaCh7XG5cdFx0XHRcdFx0Y29kZTogY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdHRleHQ6IHZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3Jcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRpZiAoY3VzdG9tTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coe1xuXHRcdFx0XHRjdXN0b21NZXNzYWdlczogY3VzdG9tTWVzc2FnZXNcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogUmVzb2x2ZXMgdGhlIGNyZWF0aW9uIG1vZGVcblx0ICogUHJvdmlkZXMgdGhlIGV4cGVjdGVkIGNyZWF0aW9uIG1vZGU6XG5cdCAqICAtIHByZXNlcnZlcyB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGUgd2hlbiB0aGlzIG9uZSBpcyBub3QgYSBOZXdQYWdlXG5cdCAqICAtIGNhbGN1bGF0ZXMgdGhlIG5ldyBvbmUgaWYgdGhlIGNyZWF0aW9uIG1vZGUgaXMgYSBOZXdQYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0gaW5pdGlhbENyZWF0aW9uTW9kZSBUaGUgaW5pdGlhbCBjcmVhdGlvbiBtb2RlXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBjcmVhdGVEYXRhIFRoZSBpbml0aWFsIGRhdGEgZm9yIG9iamVjdCBjcmVhdGlvblxuXHQgKiBAcmV0dXJucyBUaGUgbmV3IGNyZWF0aW9uIG1vZGVcblx0ICovXG5cdHJlc29sdmVDcmVhdGlvbk1vZGUgPSAoaW5pdGlhbENyZWF0aW9uTW9kZTogc3RyaW5nLCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgY3JlYXRlRGF0YTogb2JqZWN0IHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcblx0XHRpZiAoaW5pdGlhbENyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UpIHtcblx0XHRcdC8vIHVzZSB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGVcblx0XHRcdHJldHVybiBpbml0aWFsQ3JlYXRpb25Nb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGxpc3RCaW5kaW5nKTtcblx0XHRcdC8vIE5ld0FjdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTmF2aWdhdGlvblByb3BlcnR5IGNvbGxlY3Rpb25cblx0XHRcdGlmICghbGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRcdGNvbnN0IGRhdGFNb2RlbExpc3RCaW5kaW5nUGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQobGlzdEJpbmRpbmcuZ2V0UGF0aCgpKSk7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGRhdGFNb2RlbExpc3RCaW5kaW5nUGF0aC50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0IHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRcdC8vIGlmIE5ld0FjdGlvbiB3aXRoIHBhcmFtZXRlcnMgaXMgcHJlc2VudCwgdGhlbiBjcmVhdGlvbiBpcyAnRGVmZXJyZWQnXG5cdFx0XHRcdFx0Ly8gaW4gdGhlIGFic2VuY2Ugb2YgTmV3QWN0aW9uIG9yIE5ld0FjdGlvbiB3aXRoIHBhcmFtZXRlcnMsIGNyZWF0aW9uIGlzIGFzeW5jXG5cdFx0XHRcdFx0bmV3QWN0aW9uID0gKFxuXHRcdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdFx0XHQ/IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3Rcblx0XHRcdFx0XHRcdFx0OiBlbnRpdHlTZXQ/LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcblx0XHRcdFx0XHQpPy5OZXdBY3Rpb24/LnRvU3RyaW5nKCk7XG5cblx0XHRcdFx0aWYgKG5ld0FjdGlvbiAmJiBkYXRhTW9kZWxMaXN0QmluZGluZ1BhdGgudGFyZ2V0RW50aXR5VHlwZS5hY3Rpb25zW25ld0FjdGlvbl0ucGFyYW1ldGVycy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0Ly8gYmluZGluZyBwYXJhbWV0ZXIgKGVnOiBfaXQpIGlzIG5vdCBjb25zaWRlcmVkXG5cdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY3JlYXRpb25QYXJhbWV0ZXJzID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmdldENyZWF0aW9uUGFyYW1ldGVycyhsaXN0QmluZGluZywgY3JlYXRlRGF0YSwgdGhpcy5nZXRBcHBDb21wb25lbnQoKSk7XG5cdFx0XHRpZiAoY3JlYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkRlZmVycmVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5Bc3luYztcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHRoZSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKi9cblxuXHRhc3luYyB2YWxpZGF0ZURvY3VtZW50KFxuXHRcdGNvbnRleHQ6IENvbnRleHQsXG5cdFx0cGFyYW1ldGVyczogeyBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24/OiBzdHJpbmc7IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH1cblx0KTogUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS52YWxpZGF0ZURvY3VtZW50KGNvbnRleHQsIHBhcmFtZXRlcnMsIHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgdGhlIHJlc3VsdCBvZlxuXHQgKiBhIGNyZWF0aW9uIHJvdydzIGN1c3RvbSB2YWxpZGF0aW9uIGFzIGEgcHJvbWlzZS4gSWYgbm8gY3JlYXRpb24gcm93IGlzIGludm9sdmVkXG5cdCAqIHRoZSByZXN1bHRpbmcgZnVuY3Rpb24gcmV0dXJucyBhIHJlc29sdmVkIHByb21pc2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgd2l0aCB0aGUgY3JlYXRpb25Sb3dcblx0ICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwcm9taXNlXG5cdCAqL1xuXHRnZXRDcmVhdGlvblJvd1ZhbGlkYXRpb25GdW5jdGlvbih0YWJsZTogVGFibGUgfCB1bmRlZmluZWQpOiAoKSA9PiBQcm9taXNlPHsgbWVzc2FnZVRhcmdldD86IHN0cmluZzsgbWVzc2FnZVRleHQ6IHN0cmluZyB9W10+IHtcblx0XHRjb25zdCBjcmVhdGlvblJvdyA9IHRhYmxlPy5nZXRDcmVhdGlvblJvdygpO1xuXHRcdGlmIChjcmVhdGlvblJvdyAmJiB0YWJsZSkge1xuXHRcdFx0cmV0dXJuIGFzeW5jICgpOiBQcm9taXNlPHsgbWVzc2FnZVRhcmdldD86IHN0cmluZzsgbWVzc2FnZVRleHQ6IHN0cmluZyB9W10+ID0+IHtcblx0XHRcdFx0Y29uc3QgY3JlYXRpb25Sb3dPYmplY3RzID0gKGNyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCkuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGRlbGV0ZSBjcmVhdGlvblJvd09iamVjdHNbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy52YWxpZGF0ZURvY3VtZW50KHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCwge1xuXHRcdFx0XHRcdGRhdGE6IGNyZWF0aW9uUm93T2JqZWN0cyxcblx0XHRcdFx0XHRjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb246IHRhYmxlLmdldENyZWF0aW9uUm93KCkuZGF0YShcImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvblwiKVxuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiBhc3luYyAoKSA9PiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgc2V2ZXJhbCBkb2N1bWVudHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdEJpbmRpbmcgdXNlZCB0byBjcmVhdGUgdGhlIGRvY3VtZW50c1xuXHQgKiBAcGFyYW0gZGF0YUZvckNyZWF0ZSBUaGUgaW5pdGlhbCBkYXRhIGZvciB0aGUgbmV3IGRvY3VtZW50c1xuXHQgKiBAcGFyYW0gY3JlYXRlQXRFbmQgVHJ1ZSBpZiB0aGUgbmV3IGNvbnRleHRzIG5lZWQgdG8gYmUgY3JlYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGlzRnJvbUNvcHlQYXN0ZSBUcnVlIGlmIHRoZSBjcmVhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSBwYXN0ZSBhY3Rpb25cblx0ICogQHBhcmFtIGJlZm9yZUNyZWF0ZUNhbGxCYWNrIENhbGxiYWNrIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBjcmVhdGVBc0luYWN0aXZlIFRydWUgaWYgdGhlIGNvbnRleHRzIG5lZWQgdG8gYmUgY3JlYXRlZCBhcyBpbmFjdGl2ZVxuXHQgKiBAcGFyYW0gcmVxdWVzdFNpZGVFZmZlY3RzIFRydWUgYnkgZGVmYXVsdCwgZmFsc2UgaWYgU2lkZUVmZmVjdHMgc2hvdWxkIG5vdCBiZSByZXF1ZXN0ZWRcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dHMuXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVNdWx0aXBsZURvY3VtZW50cyhcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRkYXRhRm9yQ3JlYXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuXHRcdGNyZWF0ZUF0RW5kOiBib29sZWFuLFxuXHRcdGlzRnJvbUNvcHlQYXN0ZTogYm9vbGVhbixcblx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjaz86IEZ1bmN0aW9uLFxuXHRcdGNyZWF0ZUFzSW5hY3RpdmUgPSBmYWxzZSxcblx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuXG5cdCk6IFByb21pc2U8Q29udGV4dFtdPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IHRhcmdldExpc3RCaW5kaW5nID0gbGlzdEJpbmRpbmc7XG5cdFx0cmVxdWVzdFNpZGVFZmZlY3RzID0gcmVxdWVzdFNpZGVFZmZlY3RzICE9PSBmYWxzZTtcblx0XHRpZiAoIWNyZWF0ZUFzSW5hY3RpdmUpIHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGlmIChiZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRhd2FpdCBiZWZvcmVDcmVhdGVDYWxsQmFjayh7IGNvbnRleHRQYXRoOiB0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCkgfSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IHRhcmdldExpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRsZXQgbWV0YVBhdGg6IHN0cmluZztcblxuXHRcdFx0aWYgKHRhcmdldExpc3RCaW5kaW5nLmdldENvbnRleHQoKSkge1xuXHRcdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHt0YXJnZXRMaXN0QmluZGluZy5nZXRDb250ZXh0KCkuZ2V0UGF0aCgpfS8ke3RhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKX1gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKHRhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKHRhcmdldExpc3RCaW5kaW5nKTtcblxuXHRcdFx0Ly8gSXRlcmF0ZSBvbiBhbGwgaXRlbXMgYW5kIHN0b3JlIHRoZSBjb3JyZXNwb25kaW5nIGNyZWF0aW9uIHByb21pc2Vcblx0XHRcdGNvbnN0IGNyZWF0aW9uUHJvbWlzZXMgPSBkYXRhRm9yQ3JlYXRlLm1hcChhc3luYyAocHJvcGVydHlWYWx1ZXMpID0+IHtcblx0XHRcdFx0Y29uc3QgY3JlYXRlUGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyA9IHsgZGF0YToge30sIHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpIH07XG5cblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID0gZmFsc2U7IC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93O1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kID0gY3JlYXRlQXRFbmQ7XG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuaW5hY3RpdmUgPSBjcmVhdGVBc0luYWN0aXZlO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBkZWVwIGNyZWF0ZVxuXHRcdFx0XHRmb3IgKGNvbnN0IHByb3BlcnR5UGF0aCBpbiBwcm9wZXJ0eVZhbHVlcykge1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5ID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHttZXRhUGF0aH0vJHtwcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0cHJvcGVydHkgJiZcblx0XHRcdFx0XHRcdHByb3BlcnR5LiRraW5kICE9PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmXG5cdFx0XHRcdFx0XHQhcHJvcGVydHlQYXRoLmluY2x1ZGVzKFwiL1wiKSAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5kYXRhIVtwcm9wZXJ0eVBhdGhdID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdFx0dGFyZ2V0TGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycyxcblx0XHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0XHRpc0Zyb21Db3B5UGFzdGVcblx0XHRcdFx0KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBjcmVhdGVkQ29udGV4dHMgPSBhd2FpdCBQcm9taXNlLmFsbChjcmVhdGlvblByb21pc2VzKTtcblx0XHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZSh0YXJnZXRMaXN0QmluZGluZyk7XG5cdFx0XHR9XG5cdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdGNvbnN0IGFjdGl2ZUNvbnRleHRzID0gY3JlYXRlZENvbnRleHRzLmZpbHRlcigobmV3Q29udGV4dCkgPT4gIW5ld0NvbnRleHQuaXNJbmFjdGl2ZSgpKTtcblx0XHRcdGF3YWl0IFByb21pc2UuYWxsKGFjdGl2ZUNvbnRleHRzLm1hcChhc3luYyAobmV3Q29udGV4dCkgPT4gbmV3Q29udGV4dC5jcmVhdGVkKCkpKTtcblxuXHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdGlmIChyZXF1ZXN0U2lkZUVmZmVjdHMgJiYgIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQodGFyZ2V0TGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KHRhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKSwgdmlld0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpICYmIGFjdGl2ZUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkNyZWF0ZSwgYWN0aXZlQ29udGV4dHMpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gY3JlYXRlZENvbnRleHRzO1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgbXVsdGlwbGUgZG9jdW1lbnRzLlwiKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0NyZWF0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0NyZWF0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlQ3JlYXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dFBhdGggUGF0aCBwb2ludGluZyB0byB0aGUgY29udGV4dCBvbiB3aGljaCBDcmVhdGUgYWN0aW9uIGlzIHRyaWdnZXJlZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNyZWF0ZVBhcmFtZXRlcnMgQXJyYXkgb2YgdmFsdWVzIHRoYXQgYXJlIGZpbGxlZCBpbiB0aGUgQWN0aW9uIFBhcmFtZXRlciBEaWFsb2dcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25CZWZvcmVDcmVhdGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0UGF0aD86IHN0cmluZzsgY3JlYXRlUGFyYW1ldGVycz86IHVua25vd25bXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0VkaXQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdFZGl0JyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVFZGl0XG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBlZGl0ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKFwiQWZ0ZXJBc3luY1wiKVxuXHRhc3luYyBvbkJlZm9yZUVkaXQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ1NhdmUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdTYXZlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnU2F2ZScgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVTYXZlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBzYXZlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnU2F2ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnU2F2ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoXCJBZnRlckFzeW5jXCIpXG5cdEBob29rYWJsZShcImFmdGVyXCIsIHRydWUpXG5cdGFzeW5jIG9uQmVmb3JlU2F2ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGlzY2FyZCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGRpc2NhcmRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQmVmb3JlRGlzY2FyZChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGVsZXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWxldGVkXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQmVmb3JlRGVsZXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdTYXZlJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlU2F2ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgVGhlIGNvbnRleHQgd2Ugb2J0YWluZWQgYWZ0ZXIgc2F2aW5nXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAaG9va2FibGUoXCJhZnRlclwiKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlclNhdmUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ0NyZWF0ZScgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgVGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJDcmVhdGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ0VkaXQnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVFZGl0XG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBlZGl0ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckVkaXQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEaXNjYXJkXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBUaGUgY29udGV4dCBvYnRhaW5lZCBhZnRlciBkaXNjYXJkaW5nIHRoZSBvYmplY3QsIG9yIHVuZGVmaW5lZCBpZiB3ZSBkaXNjYXJkZWQgYSBuZXcgb2JqZWN0XG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckRpc2NhcmQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURlbGV0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyRGVsZXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy5iRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBJbmRpY2F0ZXMgd2hldGhlciBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGlnbm9yZWQgd2hlbiB1c2VyIGNsaWNrcyBvbiBTYXZlIGR1cmluZyBhbiBJbmxpbmUgY3JlYXRpb25cblx0Ly8gQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzIExpc3QgYmluZGluZ3Mgb2YgdGhlIHRhYmxlcyBpbiB0aGUgdmlldy5cblx0Ly8gQm90aCBvZiB0aGUgYWJvdmUgcGFyYW1ldGVycyBhcmUgZm9yIHRoZSBzYW1lIHB1cnBvc2UuIFVzZXIgY2FuIGVudGVyIHNvbWUgaW5mb3JtYXRpb24gaW4gdGhlIGNyZWF0aW9uIHJvdyhzKSBidXQgZG9lcyBub3QgJ0FkZCByb3cnLCBpbnN0ZWFkIGNsaWNrcyBTYXZlLlxuXHQvLyBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSBpbiB0aGUgdmlldy5cblxuXHQvKipcblx0ICogU2F2ZXMgYSBuZXcgZG9jdW1lbnQgYWZ0ZXIgY2hlY2tpbmcgaXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIFBSSVZBVEVcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHNhdmUgaXMgY29tcGxldGVcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2F2ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtUGFyYW1ldGVyczogU2F2ZURvY3VtZW50UGFyYW1ldGVycyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0Y29uc3QgYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgPSBtUGFyYW1ldGVycy5iRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciB8fCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3QgYUJpbmRpbmdzID0gbVBhcmFtZXRlcnMuYmluZGluZ3MgYXMgT0RhdGFMaXN0QmluZGluZ1tdO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdC8vIGluIGNhc2Ugb2Ygc2F2aW5nIC8gYWN0aXZhdGluZyB0aGUgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBzaGFsbCBiZSByZW1vdmVkIGJlZm9yZSB0aGUgUEFUQ0gvUE9TVFxuXHRcdFx0Ly8gaXMgc2VudCB0byB0aGUgYmFja2VuZFxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm1lcmdlUGF0Y2hEcmFmdCAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRcdC8vd2UgbmVlZCB0byByZXF1ZXN0IGZvciByZWNvbW1lbmRhdGlvbnMgYW5kIHRoZW4gYnJpbmcgdGhlIGRpYWxvZyBoZXJlXG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblxuXHRcdFx0Y29uc3QgcmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuID0gYXdhaXQgdGhpcy5jaGVja1JlY29tbWVuZGF0aW9uT3B0aW9uKCk7XG5cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZVNhdmUoeyBjb250ZXh0OiBvQ29udGV4dCB9KTtcblxuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgcm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChcblx0XHRcdFx0KHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiZcblx0XHRcdFx0cm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gTm8gbmVlZCB0byB0cnkgdG8gZ2V0IHJpZ2h0bW9zdCBjb250ZXh0IGluIGNhc2Ugb2YgYSBuZXcgb2JqZWN0XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHRyb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhlICRhdXRvIHF1ZXVlIGNhbiBvbmx5IGhhdmUgcGVuZGluZyBjaGFuZ2VzIGF0IHRoaXMgcG9pbnQgd2hlbiBTQVZFIHdhcyBjbGlja2VkIGltbWVkaWF0ZWx5IGFmdGVyIGNoYW5naW5nIGEgZmllbGQuXG5cdFx0XHQvLyBJbiB0aGlzIGNhc2UgdGhlICRhdXRvIHF1ZXVlIGlzIGxvY2tlZCB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBzdWJtaXQgYmF0Y2ggc2hvdWxkIG5vdCBjcmVhdGUgYSBzZXBhcmF0ZSBiYXRjaCByZXF1ZXN0LlxuXHRcdFx0Ly8gSXQgaXMgZG9uZSBpbiBvcmRlciB0byBtYWtlIHN1cmUgdGhhdCBwYXRjaCwgZHJhZnRwcmVwYXJlLCBkcmFmdGFjdGl2YXRlIGVhY2ggaGF2ZSB0aGVpciBvd24gY2hhbmdlc2V0XG5cdFx0XHRpZiAob0NvbnRleHQuZ2V0TW9kZWwoKS5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpICYmIG1QYXJhbWV0ZXJzLm1lcmdlUGF0Y2hEcmFmdCkge1xuXHRcdFx0XHRvQ29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBhY3RpdmVEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5zYXZlRG9jdW1lbnQoXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIGFzIGJvb2xlYW4sXG5cdFx0XHRcdGFCaW5kaW5ncyxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0aGlzLmdldENyZWF0aW9uTW9kZSgpXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCk7XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5BY3RpdmF0ZSwgYWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShTdGFuZGFyZEFjdGlvbnMuc2F2ZSwgVHJpZ2dlclR5cGUuc3RhbmRhcmRBY3Rpb24pO1xuXG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0dGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJTYXZlKHtcblx0XHRcdFx0Y29udGV4dDogYWN0aXZlRG9jdW1lbnRDb250ZXh0XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gdXBkYXRlIHRlbGVtZXRyeSBkYXRhIGZvciBob3cgcGFnZSB3YXMgc2F2ZWQgYW5kIHRoZW4gZG8gc3RvcmluZyBvZiB0aGlzIGRhdGEgdG8gYmFja2VuZCB0aHJvdWdoIHRoZSBzdG9yZURhdGEgZnVuY3Rpb25cblx0XHRcdHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuc3RvcmVEYXRhRm9yVGVsZW1ldHJ5KHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3Nlbik7XG5cblx0XHRcdGlmIChhY3RpdmVEb2N1bWVudENvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IGFjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgYWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblxuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHQvLyBXaGVuIHNhdmluZywgdGhlIHNlbWFudGljIGtleXMgbWF5IGhhdmUgY2hhbmdlZC5cblx0XHRcdFx0XHQvLyBJbiB0aGlzIGNhc2UsIHdlIGFsc28gbmVlZCB0byBtYW5hZ2UgdGhlIHNlbWFudGljIFVSTCBjaGFuZ2UgaW4gdGhlIGhpc3Rvcnlcblx0XHRcdFx0XHRjb25zdCBwcmV2aW91c1NlbWFudGljUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChvQ29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0Y29uc3QgbmV3U2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKGFjdGl2ZURvY3VtZW50Q29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKHByZXZpb3VzU2VtYW50aWNQYXRoICYmIG5ld1NlbWFudGljUGF0aCAmJiBwcmV2aW91c1NlbWFudGljUGF0aCAhPT0gbmV3U2VtYW50aWNQYXRoKSB7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5wdXNoKHsgb2xkUGF0aDogcHJldmlvdXNTZW1hbnRpY1BhdGgsIG5ld1BhdGg6IG5ld1NlbWFudGljUGF0aCB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdGlmIChyb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IGFjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB7IGVkaXRhYmxlOiBmYWxzZSwgcmVjcmVhdGVDb250ZXh0OiBmYWxzZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdGlmICghKG9FcnJvciAmJiAob0Vycm9yIGFzIHsgY2FuY2VsZWQ/OiBib29sZWFuIH0pLmNhbmNlbGVkKSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBzYXZpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTd2l0Y2hlcyB0aGUgVUkgYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gc3dpdGNoIGZyb21cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBzd2l0Y2ggaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgdG9nZ2xlRHJhZnRBY3RpdmUob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgZWRpdGFibGU6IGJvb2xlYW47XG5cdFx0Y29uc3QgYklzRHJhZnQgPSBvQ29udGV4dCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0Ly90b2dnbGUgYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGRvY3VtZW50IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlZGl0IGRyYWZ0cyBhbmQgYWN0aXZlIGRvY3VtZW50cyB3aXRoIGRyYWZ0KVxuXHRcdGlmIChcblx0XHRcdCFiSXNEcmFmdCB8fFxuXHRcdFx0IShcblx0XHRcdFx0KCFvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0FjdGl2ZUVudGl0eSkgfHxcblx0XHRcdFx0KG9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzRHJhZnRFbnRpdHkpXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCFvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0FjdGl2ZUVudGl0eSkge1xuXHRcdFx0Ly9zdGFydCBQb2ludDogZWRpdCBkcmFmdFxuXHRcdFx0ZWRpdGFibGUgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gc3RhcnQgcG9pbnQgYWN0aXZlIGRvY3VtZW50XG5cdFx0XHRlZGl0YWJsZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRcdGNvbnN0IG9SaWdodG1vc3RDb250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSA/IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpIDogb0NvbnRleHQ7XG5cdFx0XHRsZXQgc2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvUmlnaHRtb3N0Q29udGV4dCwgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCwgZmFsc2UpO1xuXHRcdFx0aWYgKCFzaWJsaW5nSW5mbyAmJiBvQ29udGV4dCAhPT0gb1JpZ2h0bW9zdENvbnRleHQpIHtcblx0XHRcdFx0Ly8gVHJ5IHRvIGNvbXB1dGUgc2libGluZyBpbmZvIGZvciB0aGUgcm9vdCBjb250ZXh0IGlmIGl0IGZhaWxzIGZvciB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdFx0Ly8gLS0+IEluIGNhc2Ugb2YgRkNMLCBpZiB3ZSB0cnkgdG8gc3dpdGNoIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBidXQgYSBjaGlsZCBlbnRpdHkgaGFzIG5vIHNpYmxpbmcsIHRoZSBzd2l0Y2ggd2lsbCBjbG9zZSB0aGUgY2hpbGQgY29sdW1uXG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb0NvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdGlmIChzaWJsaW5nSW5mbykge1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKGVkaXRhYmxlID8gRWRpdE1vZGUuRWRpdGFibGUgOiBFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7IC8vc3dpdGNoIHRvIGVkaXQgbW9kZSBvbmx5IGlmIGEgZHJhZnQgaXMgYXZhaWxhYmxlXG5cblx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0XHRcdFx0aWYgKGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG9Db250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFyZ2V0UGF0aCA9IHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nW3NpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5wdXNoKHsgb2xkUGF0aDogbGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGgsIG5ld1BhdGg6IHRhcmdldFBhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblxuXHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQsIHsgZWRpdGFibGUsIHJlY3JlYXRlQ29udGV4dDogdHJ1ZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlIC0gQ2Fubm90IGZpbmQgc2libGluZ1wiKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmU6JHtvRXJyb3J9YCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c2FwLm0uQnV0dG9ufSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gLSBDdXJyZW50bHkgdGhpcyBpcyBwYXNzZWQgYXMgY2FuY2VsQnV0dG9uIGludGVybmFsbHkgKHJlcGxhY2VkIGJ5IG1QYXJhbWV0ZXJzLmNvbnRyb2wgaW4gdGhlIEpTRG9jIGJlbG93KS4gQ3VycmVudGx5IGl0IGlzIGFsc28gbWFuZGF0b3J5LlxuXHQvLyBQbGFuIC0gVGhpcyBzaG91bGQgbm90IGJlIG1hbmRhdG9yeS4gSWYgbm90IHByb3ZpZGVkLCB3ZSBzaG91bGQgaGF2ZSBhIGRlZmF1bHQgdGhhdCBjYW4gYWN0IGFzIHJlZmVyZW5jZSBjb250cm9sIGZvciB0aGUgZGlzY2FyZCBwb3BvdmVyIE9SIHdlIGNhbiBzaG93IGEgZGlhbG9nIGluc3RlYWQgb2YgYSBwb3BvdmVyLlxuXG5cdC8qKlxuXHQgKiBEaXNjYXJkIHRoZSBlZGl0YWJsZSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udHJvbCBUaGlzIGlzIHRoZSBjb250cm9sIHVzZWQgdG8gb3BlbiB0aGUgZGlzY2FyZCBwb3BvdmVyXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyIE9wdGlvbmFsLCBzdXByZXNzZXMgdGhlIGRpc2NhcmQgcG9wb3ZlciBhbmQgYWxsb3dzIGN1c3RvbSBoYW5kbGluZ1xuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcEJhY2tOYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlld1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZWRpdGFibGUgZG9jdW1lbnQgaGFzIGJlZW4gZGlzY2FyZGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNhbmNlbERvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRjb250cm9sPzogQnV0dG9uO1xuXHRcdFx0Y2FuY2VsQnV0dG9uPzogQnV0dG9uO1xuXHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyPzogYm9vbGVhbjtcblx0XHRcdHNraXBCYWNrTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRza2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBpc05ld0RvY3VtZW50ID0gZmFsc2U7XG5cdFx0Y29uc3QgY2FuY2VsUGFyYW1ldGVyczogQ2FuY2VsUGFyYW1ldGVycyA9IHtcblx0XHRcdHNraXBEaXNjYXJkUG9wb3ZlcjogbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyID09PSB0cnVlLFxuXHRcdFx0Y2FuY2VsQnV0dG9uOiAobVBhcmFtZXRlcnMuY29udHJvbCB8fCBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24pISxcblx0XHRcdGJlZm9yZUNhbmNlbENhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEaXNjYXJkXG5cdFx0fTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRpZiAoKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiYgdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0KG9Sb290Vmlld0NvbnRyb2xsZXIgYXMgRmNsQ29udHJvbGxlcikuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY2FuY2VsUmVzdWx0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuY2FuY2VsRG9jdW1lbnQoXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRjYW5jZWxQYXJhbWV0ZXJzLFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0dGhpcy5nZXRDcmVhdGlvbk1vZGUoKSxcblx0XHRcdFx0dGhpcy5pc0RvY3VtZW50TW9kaWZpZWQoKVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpXG5cdFx0XHRcdC5nZXRJbnN0YW5jZWRWaWV3cygpXG5cdFx0XHRcdC5mb3JFYWNoKCh2aWV3KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY29udGV4dCA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dDtcblx0XHRcdFx0XHRpZiAoY29udGV4dCAmJiBjb250ZXh0LmlzS2VlcEFsaXZlKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRleHQuc2V0S2VlcEFsaXZlKGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCk7XG5cblx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckRpc2NhcmQoe1xuXHRcdFx0XHRjb250ZXh0OiB0eXBlb2YgY2FuY2VsUmVzdWx0ID09PSBcImJvb2xlYW5cIiB8fCBjYW5jZWxSZXN1bHQgPT09IG51bGwgPyB1bmRlZmluZWQgOiBjYW5jZWxSZXN1bHRcblx0XHRcdH0pO1xuXHRcdFx0Ly8gd2UgZm9yY2UgdGhlIGVkaXQgc3RhdGUgZXZlbiBmb3IgRkNMIGJlY2F1c2UgdGhlIGRyYWZ0IGRpc2NhcmQgbWlnaHQgbm90IGJlIGltcGxlbWVudGVkXG5cdFx0XHQvLyBhbmQgd2UgbWF5IGp1c3QgZGVsZXRlIHRoZSBkcmFmdFxuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRpZiAoIWNhbmNlbFJlc3VsdCkge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGlzY2FyZCwgb0NvbnRleHQpO1xuXHRcdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0Ly9pbiBjYXNlIG9mIGEgbmV3IGRvY3VtZW50LCBubyBhY3RpdmVDb250ZXh0IGlzIHJldHVybmVkIC0tPiBuYXZpZ2F0ZSBiYWNrLlxuXHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnNraXBCYWNrTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdGlzTmV3RG9jdW1lbnQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gY2FuY2VsUmVzdWx0O1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGlzY2FyZCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IG9BY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byBsb2FkIHRoZSBzZW1hbnRpYyBrZXlzIG9mIHRoZSBhY3RpdmUgY29udGV4dCwgYXMgd2UgbmVlZCB0aGVtXG5cdFx0XHRcdFx0Ly8gZm9yIHRoZSBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHQvLyBXZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBvZiB0aGUgY29udGV4dCwgc28gdGhhdCBpdCdzIGNyZWF0ZWQgYW5kIGJvdW5kIGluIHRoZSBzYW1lIG1pY3JvdGFzayxcblx0XHRcdFx0XHQvLyBzbyB0aGF0IGFsbCBwcm9wZXJ0aWVzIGFyZSBsb2FkZWQgdG9nZXRoZXIgYnkgYXV0b0V4cGFuZFNlbGVjdCwgc28gdGhhdCB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIEVkaXQgbW9kZVxuXHRcdFx0XHRcdC8vICQkaW5oZXJpdEV4cGFuZFNlbGVjdCB0YWtlcyBhbGwgbG9hZGVkIHByb3BlcnRpZXMgaW50byBhY2NvdW50IChCQ1AgMjA3MDQ2MjI2NSlcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3KSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB7IGVkaXRhYmxlOiBmYWxzZSwgcmVjcmVhdGVDb250ZXh0OiB0cnVlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQWN0aXZlIGNvbnRleHQgaXMgcmV0dXJuZWQgaW4gY2FzZSBvZiBjYW5jZWwgb2YgZXhpc3RpbmcgZG9jdW1lbnQsIGFuZCBpdCdzIHRoZSBzYW1lIGFzIHRoZSBlZGl0ZWQgY29udGV4dFxuXHRcdFx0XHRcdC8vIFNvLCB3ZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBhcyBpdCBtYXkgaGF2ZSBiZWVuIGRlc3Ryb3llZCB3aGVuIGNhbGxpbmcgc2V0S2VlcEFsaXZlKGZhbHNlKSBvbiBhbGwgdmlldydzIGNvbnRleHRzXG5cdFx0XHRcdFx0Ly8gZWFybGllciBpbiB0aGlzIG1ldGhvZFxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHsgZWRpdGFibGU6IGZhbHNlLCByZWNyZWF0ZUNvbnRleHQ6IHRydWUsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHQvL3Nob3cgRHJhZnQgZGlzY2FyZGVkIG1lc3NhZ2UgdG9hc3Qgb25seSBmb3IgZHJhZnQgZW5hYmxlZCBhcHBzXG5cdFx0XHRcdHRoaXMuc2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UoaXNOZXdEb2N1bWVudCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkaXNjYXJkaW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQnJpbmdzIHVwIGEgbWVzc2FnZSB0b2FzdCB3aGVuIGEgZHJhZnQgaXMgZGlzY2FyZGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gaXNOZXdEb2N1bWVudCBUaGlzIGlzIGEgQm9vbGVhbiBmbGFnIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyBuZXcgb3IgYWxyZWFkeSBleGlzdHMuXG5cdCAqL1xuXHRzaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZShpc05ld0RvY3VtZW50PzogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgbWVzc2FnZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RJU0NBUkRfRFJBRlRfVE9BU1RcIik7XG5cdFx0aWYgKGlzTmV3RG9jdW1lbnQgPT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaEFmdGVyUm91dGVNYXRjaGVkKHt9LCB0aGlzLnNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCwgdGhpcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBXZSB1c2UgdGhpcyBmdW5jdGlvbiBpbiBzaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZSB3aGVuIG5vIGNvbnRleHQgaXMgcGFzc2VkLlxuXHQgKi9cblx0c2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0KCk6IHZvaWQge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgbWVzc2FnZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RJU0NBUkRfRFJBRlRfVE9BU1RcIik7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRNZXNzYWdlVG9hc3Quc2hvdyhtZXNzYWdlKTtcblx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5kZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCh0aGlzLnNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCwgdGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgY29udGV4dCBjb3JyZXNwb25kcyB0byBhIGRyYWZ0IHJvb3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGNoZWNrXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNvbnRleHQgcG9pbnRzIHRvIGEgZHJhZnQgcm9vdFxuXHQgKi9cblx0cHJpdmF0ZSBpc0RyYWZ0Um9vdChjb250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRyZXR1cm4gTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS50YXJnZXRFbnRpdHlTZXQpO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lIE5hbWUgb2YgdGhlIEVudGl0eVNldCB0byB3aGljaCB0aGUgb2JqZWN0IGJlbG9uZ3NcblxuXHQvKipcblx0ICogRGVsZXRlcyB0aGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy50aXRsZSBUaXRsZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBkZWxldGVEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCwgbUluUGFyYW1ldGVycz86IHsgZW50aXR5U2V0TmFtZTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRjb25zdCBtUGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM6IGJvb2xlYW47XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0dGl0bGU/OiBzdHJpbmc7XG5cdFx0XHRkZXNjcmlwdGlvbj86IHN0cmluZztcblx0XHR9ID0geyAuLi5tSW5QYXJhbWV0ZXJzLCBiRmluZEFjdGl2ZUNvbnRleHRzOiBmYWxzZSwgYmVmb3JlRGVsZXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZSB9O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChcblx0XHRcdFx0dGhpcy5faXNGY2xFbmFibGVkKCkgJiZcblx0XHRcdFx0dGhpcy5pc0RyYWZ0Um9vdChvQ29udGV4dCkgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0SW5kZXgoKSA9PT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHRydWUgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNEcmFmdEVudGl0eVwiKSA9PT0gdHJ1ZVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIERlbGV0aW5nIGFuIGFjdGl2ZSBlbnRpdHkgd2hpY2ggaGFzIGEgZHJhZnQgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBiZSBkaXNwbGF5ZWQgaW4gdGhlIExpc3RSZXBvcnQgKEZDTCBjYXNlKVxuXHRcdFx0XHQvLyAtLT4gbmVlZCB0byByZW1vdmUgdGhlIGRyYWZ0IGZyb20gdGhlIExSIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIGFjdGl2ZSB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBMaXN0QmluZGluZyBpcyBwcm9wZXJseSByZWZyZXNoZWRcblx0XHRcdFx0Ly8gVGhlIGNvbmRpdGlvbiAnb0NvbnRleHQuZ2V0SW5kZXgoKSA9PT0gdW5kZWZpbmVkJyBtYWtlcyBzdXJlIHRoZSBhY3RpdmUgdmVyc2lvbiBpc24ndCBhbHJlYWR5IGRpc3BsYXllZCBpbiB0aGUgTFJcblx0XHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSBhc3luYyAocGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfSk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZShwYXJhbWV0ZXJzKTtcblxuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRjb25zdCBtb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBzaWJsaW5nQ29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vU2libGluZ0VudGl0eWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRQYXRoID0gYXdhaXQgc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0Q29udGV4dFRvUmVtb3ZlID0gbW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChkcmFmdFBhdGgpO1xuXHRcdFx0XHRcdFx0ZHJhZnRDb250ZXh0VG9SZW1vdmUucmVwbGFjZVdpdGgob0NvbnRleHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXBsYWNpbmcgdGhlIGRyYWZ0IGluc3RhbmNlIGluIHRoZSBMUiBPRExCXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCB0aGlzLmRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblxuXHRcdFx0Ly8gU2luZ2xlIG9iamV0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGFuIE9QIGhlYWRlciBidXR0b24gKG5vdCBmcm9tIGEgbGlzdClcblx0XHRcdC8vIC0tPiBNYXJrIFVJIGRpcnR5IGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIGRpc21pc3MgdGhlIE9QXG5cdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dEJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdGNvbnN0IHBhcmVudExpc3RCaW5kaW5nID0gY29udGV4dEJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIilcblx0XHRcdFx0XHQ/IGNvbnRleHRCaW5kaW5nXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHRcdFx0dGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZShwYXJlbnRMaXN0QmluZGluZywgcGFyZW50TGlzdEJpbmRpbmc/LmdldENvbnRleHQoKSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EZWxldGUsIG9Db250ZXh0KTtcblxuXHRcdFx0Ly8gQWZ0ZXIgZGVsZXRlIGlzIHN1Y2Nlc3NmdWxsLCB3ZSBuZWVkIHRvIGRldGFjaCB0aGUgc2V0QmFja05hdmlnYXRpb24gTWV0aG9kc1xuXHRcdFx0b0FwcENvbXBvbmVudD8uZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHRjb25zdCBpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCA9IHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQoKTtcblx0XHRcdC8vIFdlIGNsZWFyIHJlY29tbWVuZGF0aW9uIGRhdGEgYW5kIGNvbnRleHRzIGZyb20gaW50ZXJuYWwgbW9kZWwgZm9yIHRoZSBkZWxldGVkIGNvbnRleHRzXG5cdFx0XHRpZiAoaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0dGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pZ25vcmVSZWNvbW1lbmRhdGlvbkZvckNvbnRleHRzKFtvQ29udGV4dF0pO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm90aWZ5IGNvbnN1bWVycyBvZiB3aGljaCBjb250ZXh0cyB3ZXJlIGRlbGV0ZWRcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGVsZXRlKHsgY29udGV4dHM6IFtvQ29udGV4dF0gfSk7XG5cblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0aWYgKG9BcHBDb21wb25lbnQ/LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkRlZXBsaW5rKSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgYXBwIGhhcyBiZWVuIGxhdW5jaGVkIHdpdGggc2VtYW50aWMga2V5cywgZGVsZXRpbmcgdGhlIG9iamVjdCB3ZSd2ZSBsYW5kZWQgb24gc2hhbGwgbmF2aWdhdGUgYmFja1xuXHRcdFx0XHRcdC8vIHRvIHRoZSBhcHAgd2UgY2FtZSBmcm9tIChleGNlcHQgZm9yIEZDTCwgd2hlcmUgd2UgbmF2aWdhdGUgdG8gTFIgYXMgdXN1YWwpXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmV4aXRGcm9tQXBwKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gRWxzZSBuYXZpZ2F0ZSBiYWNrIGZyb20gdGhlIHBhZ2UuIEluIEZDTCwgdGhpcyBpcyBkb25lIHdoZW4gdGhlIGtlcHQtYWxpdmUgY29udGV4dCBpcyBkZXN0cm95ZWQgKGNhbGxiYWNrKVxuXHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZXMoKTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN1Ym1pdCB0aGUgY3VycmVudCBzZXQgb2YgY2hhbmdlcyBhbmQgbmF2aWdhdGUgYmFjay5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGFwcGx5RG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGlmIChvQ29udGV4dC5nZXRNb2RlbCgpLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0XHQvL3dlIG5lZWQgdG8gcmVxdWVzdCBmb3IgcmVjb21tZW5kYXRpb25zIGFuZCB0aGVuIGJyaW5nIHRoZSBkaWFsb2cgaGVyZVxuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuY2hlY2tJZlJlY29tbWVuZGF0aW9uc0V4aXN0KCkpIHtcblx0XHRcdFx0Y29uc3QgaXNDb250aW51ZSA9IGF3YWl0IHRoaXMuc2hvd0NvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2coZmFsc2UpO1xuXHRcdFx0XHRpZiAoaXNDb250aW51ZSA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uXSBCb29sZWFuIHZhbHVlIGZvciBzdGF0aWMgYWN0aW9uLCB1bmRlZmluZWQgZm9yIG90aGVyIGFjdGlvbnNcblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGVdIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZFxuXHQvLyBDdXJyZW50bHkgdGhlIHBhcmFtZXRlciBpc05hdmlnYWJsZSBpcyB1c2VkIGludGVybmFsbHkgYW5kIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHJlcXVpcmVzTmF2aWdhdGlvbiBhcyBpdCBpcyBhIG1vcmUgYXB0IG5hbWUgZm9yIHRoaXMgcGFyYW1cblxuXHQvKipcblx0ICogSW52b2tlcyBhbiBhY3Rpb24gKGJvdW5kIG9yIHVuYm91bmQpIGFuZCB0cmFja3MgdGhlIGNoYW5nZXMgc28gdGhhdCBvdGhlciBwYWdlcyBjYW4gYmUgcmVmcmVzaGVkIGFuZCBzaG93IHRoZSB1cGRhdGVkIGRhdGEgdXBvbiBuYXZpZ2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMgQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgU2tpcHMgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nIGlmIHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBvZiB0aGVtIGluIHBhcmFtZXRlclZhbHVlc1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jb250ZXh0cyBGb3IgYSBib3VuZCBhY3Rpb24sIGEgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm1vZGVsIEZvciBhbiB1bmJvdW5kIGFjdGlvbiwgYW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWwgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiBOYXZpZ2F0aW9uIHRha2VzIHBsYWNlIHRvIHRoZSBjb250ZXh0IHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubGFiZWwgQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvbi4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUgYWN0aW9uIGhhcyBhIHBhcmFtZXRlciBhbmQgYSBwYXJhbWV0ZXIgZGlhbG9nIGlzIHNob3duIHRvIHRoZSB1c2VyLiBUaGUgbGFiZWwgd2lsbCBiZSB1c2VkIGZvciB0aGUgdGl0bGUgb2YgdGhlIGRpYWxvZyBhbmQgZm9yIHRoZSBjb25maXJtYXRpb24gYnV0dG9uXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuaXNOYXZpZ2FibGUgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY29udHJvbElkIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0cyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0cyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmVuYWJsZUF1dG9TY3JvbGwgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbUV4dHJhUGFyYW1zIFBSSVZBVEVcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIG9uY2UgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZCwgcHJvdmlkaW5nIHRoZSByZXNwb25zZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgaW52b2tlQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVycz86IHtcblx0XHRcdHBhcmFtZXRlclZhbHVlcz86IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W107XG5cdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdGNvbnRleHRzPzogQ29udGV4dCB8IENvbnRleHRbXTtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHJlcXVpcmVzTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRiU3RhdGljQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdGFwcGxpY2FibGVDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdG5vdEFwcGxpY2FibGVDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGVuYWJsZUF1dG9TY3JvbGw/OiBib29sZWFuO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdH0sXG5cdFx0bUV4dHJhUGFyYW1zPzoge31cblx0KTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0bGV0IGFQYXJ0cztcblx0XHRsZXQgc092ZXJsb2FkRW50aXR5VHlwZTtcblx0XHRsZXQgb0N1cnJlbnRBY3Rpb25DYWxsQmFja3M6XG5cdFx0XHR8IHtcblx0XHRcdFx0XHRmUmVzb2x2ZXI6IEZ1bmN0aW9uO1xuXHRcdFx0XHRcdGZSZWplY3RvcjogRnVuY3Rpb247XG5cdFx0XHQgIH1cblx0XHRcdHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblxuXHRcdC8vIER1ZSB0byBhIG1pc3Rha2UgdGhlIGludm9rZUFjdGlvbiBpbiB0aGUgZXh0ZW5zaW9uQVBJIGhhZCBhIGRpZmZlcmVudCBBUEkgdGhhbiB0aGlzIG9uZS5cblx0XHQvLyBUaGUgb25lIGZyb20gdGhlIGV4dGVuc2lvbkFQSSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgYXMgd2UgZXhwb3NlIHRoZSBmdWxsIGVkaXQgZmxvdyBub3cgYnV0XG5cdFx0Ly8gZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBzaWduYXR1cmVcblx0XHRpZiAoXG5cdFx0XHQoKG1JblBhcmFtZXRlcnMgYXMgQ29udGV4dCk/LmlzQSAmJiAobUluUGFyYW1ldGVycyBhcyBDb250ZXh0KT8uaXNBPENvbnRleHQ+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHx8XG5cdFx0XHRBcnJheS5pc0FycmF5KG1JblBhcmFtZXRlcnMpIHx8XG5cdFx0XHRtRXh0cmFQYXJhbXMgIT09IHVuZGVmaW5lZFxuXHRcdCkge1xuXHRcdFx0Y29uc3QgY29udGV4dHM6IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IHVuZGVmaW5lZCA9IG1JblBhcmFtZXRlcnMgYXMgT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgdW5kZWZpbmVkO1xuXHRcdFx0bUluUGFyYW1ldGVycyA9IG1FeHRyYVBhcmFtcyB8fCB7fTtcblx0XHRcdGlmIChjb250ZXh0cykge1xuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLmNvbnRleHRzID0gY29udGV4dHM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLm1vZGVsID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRiaW5kaW5nUGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVycztcblx0XHRcdGJTdGF0aWNBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGJHZXRCb3VuZENvbnRleHQ/OiBib29sZWFuO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdGNvbnRleHRzPzogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgbnVsbDtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHBhcmVudENvbnRyb2w6IEZFVmlldztcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0XHRcdGFwcGxpY2FibGVDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdHJlcXVpcmVzTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRiT2JqZWN0UGFnZT86IGJvb2xlYW47XG5cdFx0XHRiSXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRncm91cElkPzogc3RyaW5nO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdFx0XHRpc0JvdW5kPzogYm9vbGVhbjtcblx0XHRcdGlnbm9yZUVUYWc/OiBib29sZWFuO1xuXHRcdH0gPSB7IC4uLm1JblBhcmFtZXRlcnMsIHBhcmVudENvbnRyb2w6IHRoaXMuYmFzZS5nZXRWaWV3KCkgfSB8fCB7IHBhcmVudENvbnRyb2w6IHRoaXMuYmFzZS5nZXRWaWV3KCkgfTtcblxuXHRcdG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlID0gbVBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIHx8IG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIHRoZSByZWZlcmVuY2VkIGFjdGlvbiBpcyBib3VuZCBvciB1bmJvdW5kXG5cdFx0Y29uc3QgY29udmVydGVkTWV0YWRhdGEgPSBjb252ZXJ0VHlwZXModGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwpO1xuXHRcdC8vIFRoZSBFbnRpdHlDb250YWluZXIgbWF5IE5PVCBiZSBtaXNzaW5nLCBzbyBpdCBzaG91bGQgbm90IGJlIGFibGUgdG8gYmUgdW5kZWZpbmVkLCBidXQgc2luY2UgaW4gb3VyIGNvbnZlcnRlZCBNZXRhZGF0YVxuXHRcdC8vIGl0IGNhbiBiZSB1bmRlZmluZWQsIEkgbmVlZCB0aGlzIHdvcmthcm91bmQgaGVyZSBvZiBhZGRpbmcgXCJcIiBzaW5jZSBpbmRleE9mIGRvZXMgbm90IGFjY2VwdCBzb21ldGhpbmcgdGhhdCdzXG5cdFx0Ly8gdW5kZWZpbmVkLlxuXHRcdGlmIChzQWN0aW9uTmFtZS5pbmNsdWRlcyhcIlwiICsgY29udmVydGVkTWV0YWRhdGEuZW50aXR5Q29udGFpbmVyLm5hbWUpKSB7XG5cdFx0XHQvLyBVbmJvdW5kIGFjdGlvbnMgYXJlIGFsd2F5cyByZWZlcmVuY2VkIHZpYSB0aGUgYWN0aW9uIGltcG9ydCBhbmQgd2UgZm91bmQgdGhlIEVudGl0eUNvbnRhaW5lciBpbiB0aGUgc0FjdGlvbk5hbWUgc29cblx0XHRcdC8vIGFuIHVuYm91bmQgYWN0aW9uIGlzIHJlZmVyZW5jZWQhXG5cdFx0XHRtUGFyYW1ldGVycy5pc0JvdW5kID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE5vIGVudGl0eSBjb250YWluZXIgaW4gdGhlIHNBY3Rpb25OYW1lLCBzbyBlaXRoZXIgYSBib3VuZCBvciBzdGF0aWMgYWN0aW9uIGlzIHJlZmVyZW5jZWQgd2hpY2ggaXMgYWxzbyBib3VuZCFcblx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICghbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSAmJiBtUGFyYW1ldGVycy5jb250ZXh0cyAmJiBtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSA9IG1QYXJhbWV0ZXJzLm1vZGVsXG5cdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHQuZ2V0TWV0YUNvbnRleHQoKG1QYXJhbWV0ZXJzLmNvbnRleHRzIGFzIENvbnRleHQpLmdldFBhdGgoKSlcblx0XHRcdFx0LmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdH1cblx0XHRsZXQgb0NvbnRyb2w6IENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0b0NvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkgYXMgQ29udHJvbDtcblx0XHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhpcyBzZWxlY3RlZCBjb250ZXh0cyB1cGRhdGUgaXMgZG9uZSB3aXRoaW4gdGhlIG9wZXJhdGlvbiwgc2hvdWxkIGJlIG1vdmVkIG91dFxuXHRcdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdH1cblxuXHRcdC8vIGlmIHN0aWNreSBzZXNzaW9uIGlzIGVuYWJsZWQgd2UgdHJpZ2dlciBhY3Rpb25zIHdpdGhvdXQgZVRhZ1xuXHRcdG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWcgPSBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dD8uZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0aWYgKHNBY3Rpb25OYW1lICYmIHNBY3Rpb25OYW1lLmluY2x1ZGVzKFwiKFwiKSkge1xuXHRcdFx0Ly8gZ2V0IGVudGl0eSB0eXBlIG9mIGFjdGlvbiBvdmVybG9hZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGFjdGlvbiBwYXRoXG5cdFx0XHQvLyBFeGFtcGxlIHNBY3Rpb25OYW1lID0gXCI8QWN0aW9uTmFtZT4oQ29sbGVjdGlvbig8T3ZlcmxvYWRFbnRpdHlUeXBlPikpXCJcblx0XHRcdC8vIHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdIC0tPiA8QWN0aW9uTmFtZT5cblx0XHRcdC8vIHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbMl0gLS0+IDxPdmVybG9hZEVudGl0eVR5cGU+XG5cdFx0XHRhUGFydHMgPSBzQWN0aW9uTmFtZS5zcGxpdChcIihcIik7XG5cdFx0XHRzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXTtcblx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbYVBhcnRzLmxlbmd0aCAtIDFdLnJlcGxhY2VBbGwoXCIpXCIsIFwiXCIpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uICYmIG9Db250cm9sKSB7XG5cdFx0XHRpZiAob0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpICYmIG9Db250cm9sLmlzVGFibGVCb3VuZCgpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gKFxuXHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk/LmJpbmRMaXN0KG9Db250cm9sLmdldFJvd0JpbmRpbmcoKS5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSkgYXMgT0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHQpLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGF0aCA9IG9Db250cm9sLmRhdGEoXCJyb3dzQmluZGluZ0luZm9cIikucGF0aCxcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKCkuYmluZExpc3Qoc0JpbmRpbmdQYXRoKTtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc092ZXJsb2FkRW50aXR5VHlwZSAmJiBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IHRoaXMuX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgoXG5cdFx0XHRcdFx0b0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCxcblx0XHRcdFx0XHRvQ29udHJvbC5nZXRSb3dCaW5kaW5nKCksXG5cdFx0XHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuZW5hYmxlQXV0b1Njcm9sbCkge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyA9IHRoaXMuY3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZSwgb0NvbnRyb2wuZ2V0SWQoKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQgPSB0aGlzLl9nZXRCb3VuZENvbnRleHQob1ZpZXcsIG1QYXJhbWV0ZXJzKTtcblx0XHQvLyBOZWVkIHRvIGtub3cgdGhhdCB0aGUgYWN0aW9uIGlzIGNhbGxlZCBmcm9tIE9iamVjdFBhZ2UgZm9yIGNoYW5nZVNldCBJc29sYXRlZCB3b3JrYXJvdW5kXG5cdFx0bVBhcmFtZXRlcnMuYk9iamVjdFBhZ2UgPSBvVmlldy5nZXRWaWV3RGF0YSgpLmNvbnZlcnRlclR5cGUgPT09IFwiT2JqZWN0UGFnZVwiO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGxldCBvUmVzcG9uc2UgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYWxsQWN0aW9uKFxuXHRcdFx0XHRzQWN0aW9uTmFtZSxcblx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKClcblx0XHRcdCk7XG5cdFx0XHRsZXQgbGlzdFJlZnJlc2hlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250ZXh0cyAmJiBBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzLmNvbnRleHRzKSAmJiBtUGFyYW1ldGVycy5pc0JvdW5kID09PSB0cnVlKSB7XG5cdFx0XHRcdGxpc3RSZWZyZXNoZWQgPSBhd2FpdCB0aGlzLl9yZWZyZXNoTGlzdElmUmVxdWlyZWQoXG5cdFx0XHRcdFx0dGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lLCBvUmVzcG9uc2UpLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzWzBdXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHRcdGxldCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRpZiAob1Jlc3BvbnNlKSB7XG5cdFx0XHRcdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyA9IEFycmF5LmlzQXJyYXkob1Jlc3BvbnNlKVxuXHRcdFx0XHRcdFx0PyBPYmplY3Qua2V5cygob1Jlc3BvbnNlWzBdIGFzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+KS52YWx1ZT8uZ2V0T2JqZWN0KCkpXG5cdFx0XHRcdFx0XHQ6IE9iamVjdC5rZXlzKG9SZXNwb25zZS5nZXRPYmplY3QoKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGlvbiwgbVBhcmFtZXRlcnMuY29udGV4dHMsIHNBY3Rpb25OYW1lLCBsaXN0UmVmcmVzaGVkLCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lLCBUcmlnZ2VyVHlwZS5hY3Rpb24pO1xuXG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlc29sdmVyKG9SZXNwb25zZSk7XG5cdFx0XHR9XG5cdFx0XHQvKlxuXHRcdFx0XHRcdFdlIHNldCB0aGUgKHVwcGVyKSBwYWdlcyB0byBkaXJ0eSBhZnRlciBhbiBleGVjdXRpb24gb2YgYW4gYWN0aW9uXG5cdFx0XHRcdFx0VE9ETzogZ2V0IHJpZCBvZiB0aGlzIHdvcmthcm91bmRcblx0XHRcdFx0XHRUaGlzIHdvcmthcm91bmQgaXMgb25seSBuZWVkZWQgYXMgbG9uZyBhcyB0aGUgbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3luY2hyb25pemF0aW9uLlxuXHRcdFx0XHRcdE9uY2UgdGhpcyBpcyBzdXBwb3J0ZWQgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIHBhZ2VzIHRvIGRpcnR5IGFueW1vcmUgYXMgdGhlIGNvbnRleHQgaXRzZWxmXG5cdFx0XHRcdFx0aXMgYWxyZWFkeSByZWZyZXNoZWQgKGl0J3MganVzdCBub3QgcmVmbGVjdGVkIGluIHRoZSBvYmplY3QgcGFnZSlcblx0XHRcdFx0XHR3ZSBleHBsaWNpdGx5IGRvbid0IGNhbGwgdGhpcyBtZXRob2QgZnJvbSB0aGUgbGlzdCByZXBvcnQgYnV0IG9ubHkgY2FsbCBpdCBmcm9tIHRoZSBvYmplY3QgcGFnZVxuXHRcdFx0XHRcdGFzIGlmIGl0IGlzIGNhbGxlZCBpbiB0aGUgbGlzdCByZXBvcnQgaXQncyBub3QgbmVlZGVkIC0gYXMgd2UgYW55d2F5IHdpbGwgcmVtb3ZlIHRoaXMgbG9naWNcblx0XHRcdFx0XHR3ZSBjYW4gbGl2ZSB3aXRoIHRoaXNcblx0XHRcdFx0XHR3ZSBuZWVkIGEgY29udGV4dCB0byBzZXQgdGhlIHVwcGVyIHBhZ2VzIHRvIGRpcnR5IC0gaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgd2UgdXNlIHRoZVxuXHRcdFx0XHRcdGZpcnN0IG9uZSBhcyB0aGV5IGFyZSBhbnl3YXkgc2libGluZ3Ncblx0XHRcdFx0XHQqL1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkgJiYgdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLmNvbnZlcnRlclR5cGUgIT09IFwiTGlzdFJlcG9ydFwiKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlKSB7XG5cdFx0XHRcdGxldCB2Q29udGV4dCA9IG9SZXNwb25zZTtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodkNvbnRleHQpICYmIHZDb250ZXh0Lmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdHZDb250ZXh0ID0gKHZDb250ZXh0WzBdIGFzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+KS52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodkNvbnRleHQgJiYgIUFycmF5LmlzQXJyYXkodkNvbnRleHQpKSB7XG5cdFx0XHRcdFx0Y29uc3QgY29udGV4dCA9IHZDb250ZXh0O1xuXHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0TWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRjb25zdCBfZm5WYWxpZENvbnRleHRzID0gKGNvbnRleHRzOiBDb250ZXh0W10sIGFwcGxpY2FibGVDb250ZXh0cz86IENvbnRleHRbXSk6IENvbnRleHRbXSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dHMuZmlsdGVyKChlbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChhcHBsaWNhYmxlQ29udGV4dHMpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYXBwbGljYWJsZUNvbnRleHRzLmluY2x1ZGVzKGVsZW1lbnQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQ29udGV4dCA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpXG5cdFx0XHRcdFx0XHQ/IF9mblZhbGlkQ29udGV4dHMobVBhcmFtZXRlcnMuY29udGV4dHMsIG1QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0cylbMF1cblx0XHRcdFx0XHRcdDogbVBhcmFtZXRlcnMuY29udGV4dHM7XG5cdFx0XHRcdFx0Y29uc3Qgc0FjdGlvbkNvbnRleHRNZXRhUGF0aCA9IG9BY3Rpb25Db250ZXh0ICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRcdFx0XHRcdGlmIChzQ29udGV4dE1ldGFQYXRoICE9IHVuZGVmaW5lZCAmJiBzQ29udGV4dE1ldGFQYXRoID09PSBzQWN0aW9uQ29udGV4dE1ldGFQYXRoKSB7XG5cdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQ/LmdldFBhdGgoKSAhPT0gY29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQoY29udGV4dCwge1xuXHRcdFx0XHRcdFx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlXG5cdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBhY3Rpb24gcmV0dXJucyBhIGRyYWZ0IGNvbnRleHQsIHdlIGFscmVhZHkgdGFrZSBjYXJlIGR1cmluZyBuYXZpZ2F0aW9uIHRvIGVpdGhlciBjcmVhdGUgYSBuZXdcblx0XHRcdFx0XHRcdFx0Ly8gKGZ1bGwgc2NyZWVuKSBvciB0byB1c2UgdGhlIGxpc3QgYmluZGluZyBjb250ZXh0IGFmdGVyIHJlZnJlc2ggKGFuZCBub3QgdGhlIHJldHVybiB2YWx1ZSBjb250ZXh0KS5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGRyYWZ0IGlzIGRpc2NhcmRlZCBvciBhY3RpdmF0ZWQsIGhhdmluZyB0aGUgY29udGV4dCBzdGlsbCBhcyBkZXBlbmRlbnQgY29udGV4dCBjYXVzZSBpc3N1ZXNcblx0XHRcdFx0XHRcdFx0Ly8gKGUuZy4gaWYgYSBzaWRlIGVmZmVjdCBpcyB0cmlnZ2VyZWQpLiBUaGVyZWZvcmUsIHdlIGRlc3Ryb3kgdGhlIHJldHVybiB2YWx1ZSBjb250ZXh0IGhlcmUsXG5cdFx0XHRcdFx0XHRcdC8vIGFuZCB0byBiZSBjb21wYXRpYmxlIHdlIHJldHVybiBhIG5ldyBjb250ZXh0IHdpdGggdGhlIHNhbWUgcGF0aC5cblx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJlxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgcmV0dXJuQ29udGV4dCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkob1Jlc3BvbnNlKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0KG9SZXNwb25zZVswXSBhcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0PikudmFsdWUgPSByZXR1cm5Db250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvUmVzcG9uc2UgPSByZXR1cm5Db250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0LmdldEJpbmRpbmcoKS5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdExvZy5pbmZvKFwiTmF2aWdhdGlvbiB0byB0aGUgc2FtZSBjb250ZXh0IGlzIG5vdCBhbGxvd2VkXCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24oc0FjdGlvbk5hbWUpO1xuXHRcdFx0cmV0dXJuIG9SZXNwb25zZTtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVqZWN0b3IoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGVyclByb21pc2UgPSBlcnIgYXMgeyBjYW5jZWxlZD86IGJvb2xlYW47IHJlamVjdGVkSXRlbXM/OiB7IGNhbmNlbGVkOiBib29sZWFuIH1bXSB9O1xuXHRcdFx0Ly8gRklYTUU6IGluIG1vc3Qgc2l0dWF0aW9ucyB0aGVyZSBpcyBubyBoYW5kbGVyIGZvciB0aGUgcmVqZWN0ZWQgcHJvbWlzZXMgcmV0dXJuZWRxXG5cdFx0XHRpZiAoZXJyID09PSBDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKSB7XG5cdFx0XHRcdC8vIFRoaXMgbGVhZHMgdG8gY29uc29sZSBlcnJvci4gQWN0dWFsbHkgdGhlIGVycm9yIGlzIGFscmVhZHkgaGFuZGxlZCAoY3VycmVudGx5IGRpcmVjdGx5IGluIHByZXNzIGhhbmRsZXIgb2YgZW5kIGJ1dHRvbiBpbiBkaWFsb2cpLCBzbyBpdCBzaG91bGQgbm90IGJlIGZvcndhcmRlZFxuXHRcdFx0XHQvLyB1cCB0byBoZXJlLiBIb3dldmVyLCB3aGVuIGRpYWxvZyBoYW5kbGluZyBhbmQgYmFja2VuZCBleGVjdXRpb24gYXJlIHNlcGFyYXRlZCwgaW5mb3JtYXRpb24gd2hldGhlciBkaWFsb2cgd2FzIGNhbmNlbGxlZCwgb3IgYmFja2VuZCBleGVjdXRpb24gaGFzIGZhaWxlZCBuZWVkc1xuXHRcdFx0XHQvLyB0byBiZSB0cmFuc3BvcnRlZCB0byB0aGUgcGxhY2UgcmVzcG9uc2libGUgZm9yIGNvbm5lY3RpbmcgdGhlc2UgdHdvIHRoaW5ncy5cblx0XHRcdFx0Ly8gVE9ETzogcmVtb3ZlIHNwZWNpYWwgaGFuZGxpbmcgb25lIGRpYWxvZyBoYW5kbGluZyBhbmQgYmFja2VuZCBleGVjdXRpb24gYXJlIHNlcGFyYXRlZFxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJEaWFsb2cgY2FuY2VsbGVkXCIpO1xuXHRcdFx0fSBlbHNlIGlmICghKGVyciAmJiAoZXJyUHJvbWlzZS5jYW5jZWxlZCB8fCAoZXJyUHJvbWlzZS5yZWplY3RlZEl0ZW1zICYmIGVyclByb21pc2UucmVqZWN0ZWRJdGVtc1swXS5jYW5jZWxlZCkpKSkge1xuXHRcdFx0XHQvLyBUT0RPOiBhbmFseXplLCB3aGV0aGVyIHRoaXMgaXMgb2YgdGhlIHNhbWUgY2F0ZWdvcnkgYXMgYWJvdmVcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBFZGl0Rmxvdy5pbnZva2VBY3Rpb246JHtlcnJ9YCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBUT0RPOiBBbnkgdW5leHBlY3RlZCBlcnJvcnMgcHJvYmFibHkgc2hvdWxkIG5vdCBiZSBpZ25vcmVkIVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIb29rIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGFmdGVyIHRoZSBhY3Rpb24gZXhlY3V0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gX2FjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBzaW5jZSAxLjExNC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24oX2FjdGlvbk5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vdG8gYmUgb3ZlcnJpZGRlblxuXHR9XG5cblx0LyoqXG5cdCAqIFNlY3VyZWQgZXhlY3V0aW9uIG9mIHRoZSBnaXZlbiBmdW5jdGlvbi4gRW5zdXJlcyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gY2VydGFpbiBjb25kaXRpb25zIGFyZSBmdWxmaWxsZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBmbkZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZC4gU2hvdWxkIHJldHVybiBhIHByb21pc2UgdGhhdCBpcyBzZXR0bGVkIGFmdGVyIGNvbXBsZXRpb24gb2YgdGhlIGV4ZWN1dGlvbi4gSWYgbm90aGluZyBpcyByZXR1cm5lZCwgaW1tZWRpYXRlIGNvbXBsZXRpb24gaXMgYXNzdW1lZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIERlZmluaXRpb25zIG9mIHRoZSBwcmVjb25kaXRpb25zIHRvIGJlIGNoZWNrZWQgYmVmb3JlIGV4ZWN1dGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeSBEZWZpbmVzIHRoZSBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5zZXQgVHJpZ2dlcnMgYSBidXN5IGluZGljYXRvciB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuY2hlY2sgRXhlY3V0ZXMgZnVuY3Rpb24gb25seSBpZiBhcHBsaWNhdGlvbiBpc24ndCBidXN5LlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudXBkYXRlc0RvY3VtZW50IFRoaXMgb3BlcmF0aW9uIHVwZGF0ZXMgdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2l0aG91dCB1c2luZyB0aGUgYm91bmQgbW9kZWwgYW5kIGNvbnRleHQuIEFzIGEgcmVzdWx0LCB0aGUgZHJhZnQgc3RhdHVzIGlzIHVwZGF0ZWQgaWYgYSBkcmFmdCBkb2N1bWVudCBleGlzdHMsIGFuZCB0aGUgdXNlciBoYXMgdG8gY29uZmlybSB0aGUgY2FuY2VsbGF0aW9uIG9mIHRoZSBlZGl0aW5nIHByb2Nlc3MuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkIGlmIHRoZSBleGVjdXRpb24gaXMgcHJvaGliaXRlZCBhbmQgcmVzb2x2ZWQgYnkgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGZuRnVuY3Rpb24uXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHNlY3VyZWRFeGVjdXRpb24oXG5cdFx0Zm5GdW5jdGlvbjogRnVuY3Rpb24sXG5cdFx0bVBhcmFtZXRlcnM/OiB7XG5cdFx0XHRidXN5Pzoge1xuXHRcdFx0XHRzZXQ/OiBib29sZWFuO1xuXHRcdFx0XHRjaGVjaz86IGJvb2xlYW47XG5cdFx0XHR9O1xuXHRcdFx0dXBkYXRlc0RvY3VtZW50PzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJCdXN5U2V0ID0gbVBhcmFtZXRlcnM/LmJ1c3k/LnNldCA/PyB0cnVlLFxuXHRcdFx0YkJ1c3lDaGVjayA9IG1QYXJhbWV0ZXJzPy5idXN5Py5jaGVjayA/PyB0cnVlLFxuXHRcdFx0YlVwZGF0ZXNEb2N1bWVudCA9IG1QYXJhbWV0ZXJzPy51cGRhdGVzRG9jdW1lbnQgPz8gZmFsc2UsXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLFxuXHRcdFx0b0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0YklzRHJhZnQgPSBvQ29udGV4dCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQgYXMgQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHRpZiAoYkJ1c3lDaGVjayAmJiBCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQXBwbGljYXRpb24gYWxyZWFkeSBidXN5IHRoZXJlZm9yZSBleGVjdXRpb24gcmVqZWN0ZWRcIik7XG5cdFx0fVxuXG5cdFx0Ly8gd2UgaGF2ZSB0byBzZXQgYnVzeSBhbmQgZHJhZnQgaW5kaWNhdG9yIGltbWVkaWF0ZWx5IGFsc28gdGhlIGZ1bmN0aW9uIG1pZ2h0IGJlIGV4ZWN1dGVkIGxhdGVyIGluIHF1ZXVlXG5cdFx0aWYgKGJCdXN5U2V0KSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdH1cblx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCAmJiBiSXNEcmFmdCkge1xuXHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdH1cblxuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrKGZuRnVuY3Rpb24gYXMgKCkgPT4gdW5rbm93biB8IFByb21pc2U8dW5rbm93bj4pXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGlmIChiVXBkYXRlc0RvY3VtZW50KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChvRXJyb3I6IHVua25vd24pOiB2b2lkID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBwYXRjaFNlbnQgZXZlbnQ6IHJlZ2lzdGVyIGRvY3VtZW50IG1vZGlmaWNhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudCBUaGUgZXZlbnQgc2VudCBieSB0aGUgYmluZGluZ1xuXHQgKi9cblx0aGFuZGxlUGF0Y2hTZW50KG9FdmVudDogT0RhdGFDb250ZXh0QmluZGluZyRQYXRjaFNlbnRFdmVudCk6IHZvaWQge1xuXHRcdC8vIEluIGNvbGxhYm9yYXRpdmUgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24sIGRpc2FibGUgRVRhZyBjaGVjayBmb3IgUEFUQ0ggcmVxdWVzdHNcblx0XHRjb25zdCBpbnRlcm5hbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBpZ25vcmVFVGFnID0gdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpIHx8IGludGVybmFsQ29udGV4dC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRpZiAoaWdub3JlRVRhZykge1xuXHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5zZXRJZ25vcmVFVGFnKHRydWUpO1xuXHRcdH1cblx0XHRpZiAoIWludGVybmFsQ29udGV4dD8uZ2V0UHJvcGVydHkoXCJza2lwUGF0Y2hIYW5kbGVyc1wiKSkge1xuXHRcdFx0Y29uc3Qgc291cmNlQmluZGluZyA9IG9FdmVudC5nZXRTb3VyY2UoKSBhcyB1bmtub3duIGFzIE9EYXRhTGlzdEJpbmRpbmc7IC8vIEZJWE1FOiBVSTUgdHlwZSBzYXlzIHRoaXMgc2hvdWxkIGJlIGFuIE9EYXRhQ29udGV4dEJpbmRpbmdcblx0XHRcdC8vIENyZWF0ZSBhIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gdGhlIHBhdGggaXMgY29tcGxldGVkXG5cdFx0XHRjb25zdCBvUGF0Y2hQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRvRXZlbnQuZ2V0U291cmNlKCkuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgKHBhdGNoQ29tcGxldGVkRXZlbnQ6IFVJNUV2ZW50PHsgc3VjY2VzczogYm9vbGVhbiB9PikgPT4ge1xuXHRcdFx0XHRcdC8vIFJlLWVuYWJsZSBFVGFnIGNoZWNrc1xuXHRcdFx0XHRcdGlmIChpZ25vcmVFVGFnKSB7XG5cdFx0XHRcdFx0XHQoKG9FdmVudC5nZXRTb3VyY2UoKSBhcyBCaW5kaW5nKS5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLnNldElnbm9yZUVUYWcoZmFsc2UpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChvRXZlbnQuZ2V0U291cmNlKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2goXG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdFx0XHRzb3VyY2VCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYlN1Y2Nlc3MgPSBwYXRjaENvbXBsZXRlZEV2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRcdFx0aWYgKGJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMudXBkYXRlRG9jdW1lbnQoc291cmNlQmluZGluZywgb1BhdGNoUHJvbWlzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIGNyZWF0ZVNlbnQgZXZlbnQ6IHJlZ2lzdGVyIGRvY3VtZW50IG1vZGlmaWNhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBzZW50IGJ5IHRoZSBiaW5kaW5nXG5cdCAqL1xuXHRoYW5kbGVDcmVhdGVTZW50KGV2ZW50OiBVSTVFdmVudDx7IGNvbnRleHQ6IENvbnRleHQgfT4pOiB2b2lkIHtcblx0XHRjb25zdCBjb250ZXh0ID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKTtcblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKGZhbHNlLCBmYWxzZSwgY29udGV4dC5nZXRQYXRoKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBlcmZvcm1zIGEgdGFzayBpbiBzeW5jIHdpdGggb3RoZXIgdGFza3MgY3JlYXRlZCB2aWEgdGhpcyBmdW5jdGlvbi5cblx0ICogUmV0dXJucyB0aGUgcHJvbWlzZSBjaGFpbiBvZiB0aGUgdGFzay5cblx0ICpcblx0ICogQHBhcmFtIFtuZXdUYXNrXSBPcHRpb25hbCwgYSBwcm9taXNlIG9yIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHlcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSB0YXNrIGlzIGNvbXBsZXRlZFxuXHQgKi9cblx0YXN5bmMgc3luY1Rhc2s8VD4obmV3VGFzaz86ICgoKSA9PiBUKSB8IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcblx0XHRpZiAobmV3VGFzaykge1xuXHRcdFx0aWYgKHR5cGVvZiBuZXdUYXNrID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0dGhpcy5zeW5jVGFza3MgPSB0aGlzLnN5bmNUYXNrcy50aGVuKG5ld1Rhc2spLmNhdGNoKGZ1bmN0aW9uIChlcnI6IHVua25vd24pIHtcblx0XHRcdFx0XHRMb2cuZGVidWcoZXJyIGFzIHN0cmluZyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5zeW5jVGFza3MgPSB0aGlzLnN5bmNUYXNrc1xuXHRcdFx0XHRcdC50aGVuKGFzeW5jICgpID0+IG5ld1Rhc2spXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5kZWJ1ZyhlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFza3MgYXMgUHJvbWlzZTxUPjtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNpZGVzIGlmIGEgZG9jdW1lbnQgaXMgdG8gYmUgc2hvd24gaW4gZGlzcGxheSBvciBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBkaXNwbGF5ZWQgb3IgZWRpdGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXQgbW9kZSBpcyBjb21wdXRlZFxuXHQgKi9cblxuXHRhc3luYyBjb21wdXRlRWRpdE1vZGUoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVQZW5kaW5nXCIsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IGlzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdGlmIChpc0FjdGl2ZUVudGl0eSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHQvLyBpbiBjYXNlIHRoZSBkb2N1bWVudCBpcyBkcmFmdCBzZXQgaXQgaW4gZWRpdCBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7XG5cdFx0XHRcdFx0Y29uc3QgaGFzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUodW5kZWZpbmVkLCAhaGFzQWN0aXZlRW50aXR5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhY3RpdmUgZG9jdW1lbnQsIHN0YXkgb24gZGlzcGxheSBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVBlbmRpbmdcIiwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZXRlcm1pbmluZyB0aGUgZWRpdE1vZGUgZm9yIGRyYWZ0XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGxhc3RJbnZva2VkQWN0aW9uTmFtZSA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLmdldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIpO1xuXHRcdFx0aWYgKGxhc3RJbnZva2VkQWN0aW9uTmFtZSAmJiB0aGlzLmlzTmV3QWN0aW9uRm9yU3RpY2t5KGxhc3RJbnZva2VkQWN0aW9uTmFtZSwgY29udGV4dCkpIHtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgdHJ1ZSk7XG5cdFx0XHRcdGlmICghdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9uKGNvbnRleHQpO1xuXHRcdFx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KSwgY29udGV4dC5nZXRNb2RlbCgpKTtcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgdW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBQcml2YXRlIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogSW50ZXJuYWwgbWV0aG9kIHRvIGRlbGV0ZSBhIGNvbnRleHQgb3IgYW4gYXJyYXkgb2YgY29udGV4dHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0cyBUaGUgY29udGV4dChzKSB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIFBhcmFtZXRlcnMgZm9yIGRlbGV0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jb250cm9sSWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubm9EaWFsb2dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMudGl0bGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGVzY3JpcHRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKFxuXHRcdGNvbnRleHRzOiBDb250ZXh0IHwgQ29udGV4dFtdLFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzPzogYm9vbGVhbjtcblx0XHRcdG5vRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdHRpdGxlPzogc3RyaW5nO1xuXHRcdFx0ZGVzY3JpcHRpb24/OiBzdHJpbmcgfCB7IHBhdGg6IHN0cmluZyB9O1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cz86IG51bWJlcjtcblx0XHRcdHVuU2F2ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGxvY2tlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0ZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZT86IERyYWZ0U2libGluZ1BhaXJbXTtcblx0XHRcdGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmU/OiBDb250ZXh0W107XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAocGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzKSB7XG5cdFx0XHQvLyBhcyBzZWxlY3RlZCBjb250ZXh0cyBtYXkgaW5jbHVkZSBpbmFjdGl2ZSBjb250ZXh0IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGlzIHBhcmFtZXRlciBhZ2FpbiB0byBlbnN1cmUgZGVsZXRlIGhlbHBlciB3b3JrcyBwcm9wZXJseVxuXHRcdFx0cGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPSBwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMubGVuZ3RoO1xuXHRcdH1cblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBzZXR0aW5nIGFuZCByZW1vdmluZyBvZiBjb250ZXh0cyBzaG91bGRuJ3QgYmUgaW4gdGhlIHRyYW5zYWN0aW9uIGhlbHBlciBhdCBhbGxcblx0XHQvLyBmb3IgdGhlIHRpbWUgYmVpbmcgSSBrZXB0IGl0IGFuZCBwcm92aWRlIHRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IHRvIG5vdCBicmVhayBzb21ldGhpbmdcblx0XHRwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gcGFyYW1ldGVycy5jb250cm9sSWRcblx0XHRcdD8gKEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0IHwgdW5kZWZpbmVkKVxuXHRcdFx0OiBudWxsO1xuXG5cdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmRlbGV0ZURvY3VtZW50KGNvbnRleHRzLCBwYXJhbWV0ZXJzLCB0aGlzLmdldEFwcENvbXBvbmVudCgpLCByZXNvdXJjZU1vZGVsLCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkpO1xuXHR9XG5cblx0X2dldFJlc291cmNlTW9kZWwoKTogUmVzb3VyY2VNb2RlbCB7XG5cdFx0cmV0dXJuIGdldFJlc291cmNlTW9kZWwodGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRUcmFuc2FjdGlvbkhlbHBlcigpOiB0eXBlb2YgVHJhbnNhY3Rpb25IZWxwZXIge1xuXHRcdHJldHVybiBUcmFuc2FjdGlvbkhlbHBlcjtcblx0fVxuXG5cdHByaXZhdGUgZ2V0TWVzc2FnZUhhbmRsZXIoKTogTWVzc2FnZUhhbmRsZXIge1xuXHRcdGlmICh0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXIpIHtcblx0XHRcdHJldHVybiB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgRmxvdyB3b3JrcyBvbmx5IHdpdGggYSBnaXZlbiBtZXNzYWdlIGhhbmRsZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRJbnRlcm5hbE1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRHbG9iYWxVSU1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgY3VycmVudCBwYWdlIGNvbnRhaW5zIGEgbmV3bHkgY3JlYXRlZCBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBiQ3JlYXRpb25Nb2RlIFRydWUgaWYgdGhlIG9iamVjdCBpcyBuZXdcblx0ICovXG5cdHByaXZhdGUgc2V0Q3JlYXRpb25Nb2RlKGJDcmVhdGlvbk1vZGU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCB1aU1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwidWlcIikgYXMgQ29udGV4dDtcblx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5zZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkNyZWF0ZU1vZGUsIGJDcmVhdGlvbk1vZGUsIHVpTW9kZWxDb250ZXh0LCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VycmVudCBwYWdlIGNvbnRhaW5zIGEgbmV3bHkgY3JlYXRlZCBvYmplY3Qgb3Igbm90LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbmV3XG5cdCAqL1xuXHRnZXRDcmVhdGlvbk1vZGUoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgdWlNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpIGFzIENvbnRleHQ7XG5cdFx0cmV0dXJuICEhdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5DcmVhdGVNb2RlLCB1aU1vZGVsQ29udGV4dCk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG9iamVjdCBiZWluZyBlZGl0ZWQgKG9yIG9uZSBvZiBpdHMgc3ViLW9iamVjdHMpIGhhcyBiZWVuIG1vZGlmaWVkIG9yIG5vdC5cblx0ICpcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkXG5cdCAqL1xuXHRwcml2YXRlIGlzRG9jdW1lbnRNb2RpZmllZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gISF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkRvY3VtZW50TW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBtb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RG9jdW1lbnRNb2RpZmllZChtb2RpZmllZDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCwgbW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCBoYXMgYmVlbiBtb2RpZmllZCBieSBjcmVhdGluZyBhIHN1Yi1vYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIG9uIHdoaWNoIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHQvLyBTZXQgdGhlIG1vZGlmaWVkIGZsYWcgb25seSBvbiByZWxhdGl2ZSBsaXN0QmluZGluZ3MsIGkuZS4gd2hlbiBjcmVhdGluZyBhIHN1Yi1vYmplY3Rcblx0XHQvLyBJZiB0aGUgbGlzdEJpbmRpbmcgaXMgbm90IHJlbGF0aXZlLCB0aGVuIGl0J3MgYSBjcmVhdGlvbiBmcm9tIHRoZSBMaXN0UmVwb3J0LCBhbmQgYnkgZGVmYXVsdCBhIG5ld2x5IGNyZWF0ZWQgcm9vdCBvYmplY3QgaXNuJ3QgY29uc2lkZXJlZCBhcyBtb2RpZmllZFxuXHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlIGV2ZW50OiBzaG93cyBtZXNzYWdlcyBhbmQgaW4gY2FzZSBvZiBhIGRyYWZ0LCB1cGRhdGVzIHRoZSBkcmFmdCBpbmRpY2F0b3IuXG5cdCAqXG5cdCAqIEBwYXJhbSBiaW5kaW5nIE9EYXRhIGxpc3QgYmluZGluZyBvYmplY3Rcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlRXZlbnRzKGJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoYmluZGluZyk7XG5cblx0XHRiaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlU2VudFwiLCAoKSA9PiB7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0YmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZUNvbXBsZXRlZFwiLCAob0V2ZW50OiBVSTVFdmVudDx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4pOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IHN1Y2Nlc3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoc3VjY2VzcyA/IERyYWZ0U3RhdHVzLlNhdmVkIDogRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgZHJhZnQgc3RhdHVzIG1lc3NhZ2UgKGRpc3BsYXllZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYWdlKS5cblx0ICpcblx0ICogQHBhcmFtIGRyYWZ0U3RhdHVzIFRoZSBkcmFmdCBzdGF0dXMgbWVzc2FnZVxuXHQgKi9cblx0c2V0RHJhZnRTdGF0dXMoZHJhZnRTdGF0dXM6IHN0cmluZyk6IHZvaWQge1xuXHRcdCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbCkuc2V0UHJvcGVydHkoXCIvZHJhZnRTdGF0dXNcIiwgZHJhZnRTdGF0dXMsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvZ3JhbW1pbmcgbW9kZWwgZnJvbSBhIGJpbmRpbmcgb3IgYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc291cmNlIFRoZSBiaW5kaW5nIG9yIGNvbnRleHRcblx0ICogQHJldHVybnMgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqL1xuXHRwcml2YXRlIGdldFByb2dyYW1taW5nTW9kZWwoc291cmNlOiBDb250ZXh0IHwgQmluZGluZyk6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmdldFByb2dyYW1taW5nTW9kZWwoc291cmNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBlZGl0TW9kZSBUaGUgZWRpdCBtb2RlXG5cdCAqIEBwYXJhbSBpc0NyZWF0aW9uIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBuZXdseSBjcmVhdGVkXG5cdCAqL1xuXHRwcml2YXRlIHNldEVkaXRNb2RlKGVkaXRNb2RlPzogc3RyaW5nLCBpc0NyZWF0aW9uPzogYm9vbGVhbik6IHZvaWQge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIGZyZWVzdHlsZSB1c2FnZSB0aGVyZWZvcmUgd2UgY2FuXG5cdFx0Ly8gcmVseSBvbiB0aGUgZ2xvYmFsIFVJIG1vZGVsIHRvIGV4aXN0XG5cdFx0Y29uc3QgZ2xvYmFsTW9kZWwgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdGlmIChlZGl0TW9kZSkge1xuXHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiLCBlZGl0TW9kZSA9PT0gXCJFZGl0YWJsZVwiLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0aWYgKGVkaXRNb2RlICE9PSBcIkVkaXRhYmxlXCIpIHtcblx0XHRcdFx0dGhpcy5mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZChmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGlzQ3JlYXRpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gU2luY2Ugc2V0Q3JlYXRpb25Nb2RlIGlzIHB1YmxpYyBpbiBFZGl0RmxvdyBhbmQgY2FuIGJlIG92ZXJyaWRlbiwgbWFrZSBzdXJlIHRvIGNhbGwgaXQgdmlhIHRoZSBjb250cm9sbGVyXG5cdFx0XHQvLyB0byBlbnN1cmUgYW55IG92ZXJyaWRlcyBhcmUgdGFrZW4gaW50byBhY2NvdW50XG5cdFx0XHR0aGlzLnNldENyZWF0aW9uTW9kZShpc0NyZWF0aW9uKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgZmxhZyB0byBmb3JjZSBTYXZlIG9yIERpc2NhcmQgd2hlbiBsZWF2aW5nIGEgZHJhZnQuXG5cdCAqIEBwYXJhbSBmb3JjZWRcblx0ICovXG5cdHByaXZhdGUgZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQoZm9yY2VkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuc2V0UHJvcGVydHkoXCIvZm9yY2VEcmFmdFNhdmVPckRpc2NhcmRcIiwgZm9yY2VkLCB1bmRlZmluZWQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB3ZSBzaG91bGQgZm9yY2UgdGhlIHVzZXIgdG8gU2F2ZSBvciBEaXNjYXJkIHdoZW4gbGVhdmluZyBhIGRyYWZ0LCBvciBpZiBrZWVwaW5nIHRoZSBkcmFmdCBpcyBhbGxvd2VkLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGtlZXBpbmcgdGhlIGRyYWZ0IGlzIG5vdCBhbGxvd2VkXG5cdCAqL1xuXHRzaGFsbEZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZFwiKSA9PT0gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYW4gYWN0aW9uIGNvcnJlc3BvbmRzIHRvIGEgY3JlYXRlIGFjdGlvbiBmb3IgYSBzdGlja3kgc2Vzc2lvbi5cblx0ICpcblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgYWN0aW9uIGlzIGEgY3JlYXRlIGFjdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBpc05ld0FjdGlvbkZvclN0aWNreShhY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0XHRjb25zdCBzdGlja3lTZXNzaW9uID0gZW50aXR5U2V0LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ7XG5cdFx0XHRpZiAoc3RpY2t5U2Vzc2lvbj8uTmV3QWN0aW9uID09PSBhY3Rpb25OYW1lKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHN0aWNreVNlc3Npb24/LkFkZGl0aW9uYWxOZXdBY3Rpb25zICYmIHN0aWNreVNlc3Npb24/LkFkZGl0aW9uYWxOZXdBY3Rpb25zLmluY2x1ZGVzKGFjdGlvbk5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdC8vIFRPRE8gTW92ZSBhbGwgc3RpY2t5LXJlbGF0ZWQgYmVsb3cgdG8gYSBzdGlja3kgc2Vzc2lvbiBtYW5hZ2VyIGNsYXNzXG5cblx0LyoqXG5cdCAqIEVuYWJsZXMgdGhlIHN0aWNreSBlZGl0IHNlc3Npb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZFxuXHQgKiBAcmV0dXJucyBUcnVlIGluIGNhc2Ugb2Ygc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZVN0aWNreU9uKGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChhcHBDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQgQXBwQ29tcG9uZW50IGZvciBmdW5jdGlvbiBoYW5kbGVTdGlja3lPblwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5oYXNOYXZpZ2F0aW9uR3VhcmQoKSkge1xuXHRcdFx0XHRjb25zdCBoYXNoVHJhY2tlciA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXG5cdFx0XHRcdC8vIFNldCBhIGd1YXJkIGluIHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHQvLyBBIHRpbWVvdXQgaXMgbmVjZXNzYXJ5LCBhcyB3aXRoIGRlZmVycmVkIGNyZWF0aW9uIHRoZSBoYXNoQ2hhbmdlciBpcyBub3QgdXBkYXRlZCB5ZXQgd2l0aFxuXHRcdFx0XHQvLyB0aGUgbmV3IGhhc2gsIGFuZCB0aGUgZ3VhcmQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnkgb2YgdGhlIHJvdXRlciBwcm94eVxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXROYXZpZ2F0aW9uR3VhcmQoY29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTtcblx0XHRcdFx0fSwgMCk7XG5cblx0XHRcdFx0Ly8gU2V0dGluZyBiYWNrIG5hdmlnYXRpb24gb24gc2hlbGwgc2VydmljZSwgdG8gZ2V0IHRoZSBkaWNhcmQgbWVzc2FnZSBib3ggaW4gY2FzZSBvZiBzdGlja3lcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbih0aGlzLm9uQmFja05hdmlnYXRpb25JblNlc3Npb24uYmluZCh0aGlzLCBjb250ZXh0KSk7XG5cblx0XHRcdFx0dGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbiA9IHRoaXMuZ2V0RGlydHlTdGF0ZVByb3ZpZGVyKGFwcENvbXBvbmVudCwgaW50ZXJuYWxNb2RlbCwgaGFzaFRyYWNrZXIpO1xuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24pO1xuXG5cdFx0XHRcdC8vIGhhbmRsZSBzZXNzaW9uIHRpbWVvdXRcblx0XHRcdFx0Y29uc3QgaTE4bk1vZGVsID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGlzLnNlc3Npb25UaW1lb3V0RnVuY3Rpb24gPSB0aGlzLmdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24oY29udGV4dCwgaTE4bk1vZGVsKTtcblx0XHRcdFx0dGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbCgpLmF0dGFjaFNlc3Npb25UaW1lb3V0KHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbik7XG5cblx0XHRcdFx0dGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24gPSB0aGlzLmdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaFJvdXRlTWF0Y2hlZCh7fSwgdGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGVzIHRoZSBzdGlja3kgZWRpdCBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGluIGNhc2Ugb2Ygc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZVN0aWNreU9mZigpOiBib29sZWFuIHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T2ZmXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5kaXNjYXJkTmF2aWdhdGlvbkd1YXJkKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uKSB7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcih0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uKTtcblx0XHRcdFx0dGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbiA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWw7XG5cdFx0XHRpZiAobW9kZWwgJiYgdGhpcy5zZXNzaW9uVGltZW91dEZ1bmN0aW9uKSB7XG5cdFx0XHRcdG1vZGVsLmRldGFjaFNlc3Npb25UaW1lb3V0KHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbikge1xuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24pO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbiA9IHVuZGVmaW5lZDtcblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCk6IHZvaWQge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCBtb2RlbC5nZXRIdHRwSGVhZGVycyh0cnVlKVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyBhIERpcnR5U3RhdGVQcm92aWRlciBpbiB0aGUgU2hlbGwuXG5cdCAqXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHBhcmFtIGludGVybmFsTW9kZWwgVGhlIG1vZGVsIFwiaW50ZXJuYWxcIlxuXHQgKiBAcGFyYW0gaGFzaFRyYWNrZXIgSGFzaCB0cmFja2VyXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXREaXJ0eVN0YXRlUHJvdmlkZXIoYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCwgaGFzaFRyYWNrZXI6IHN0cmluZykge1xuXHRcdHJldHVybiAobmF2aWdhdGlvbkNvbnRleHQ6IHsgaW5uZXJBcHBSb3V0ZTogc3RyaW5nIH0pOiBib29sZWFuIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChuYXZpZ2F0aW9uQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGZvciBEaXJ0eVN0YXRlUHJvdmlkZXIgZnVuY3Rpb25cIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCB0YXJnZXRIYXNoID0gbmF2aWdhdGlvbkNvbnRleHQuaW5uZXJBcHBSb3V0ZTtcblx0XHRcdFx0Y29uc3Qgcm91dGVyUHJveHkgPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblx0XHRcdFx0bGV0IGxjbEhhc2hUcmFja2VyID0gXCJcIjtcblx0XHRcdFx0bGV0IGlzRGlydHk6IGJvb2xlYW47XG5cdFx0XHRcdGNvbnN0IGlzU2Vzc2lvbk9uID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRcdFx0aWYgKCFpc1Nlc3Npb25Pbikge1xuXHRcdFx0XHRcdC8vIElmIHRoZSBzdGlja3kgc2Vzc2lvbiB3YXMgdGVybWluYXRlZCBiZWZvcmUgaGFuZC5cblx0XHRcdFx0XHQvLyBFeGFtcGxlIGluIGNhc2Ugb2YgbmF2aWdhdGluZyBhd2F5IGZyb20gYXBwbGljYXRpb24gdXNpbmcgSUJOLlxuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXJvdXRlclByb3h5LmlzTmF2aWdhdGlvbkZpbmFsaXplZCgpKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgaGFwcGVuaW5nIGluIFJvdXRlclByb3h5LCBpdCdzIGEgdHJhbnNpZW50IHN0YXRlXG5cdFx0XHRcdFx0Ly8gKG5vdCBkaXJ0eSlcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGhhc2hUcmFja2VyID09PSB0YXJnZXRIYXNoKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGhhc2ggZGlkbid0IGNoYW5nZSBzbyBlaXRoZXIgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gcmVmcmVzaCBvciB0byBsZWF2ZSB0aGUgYXBwXG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAocm91dGVyUHJveHkuY2hlY2tIYXNoV2l0aEd1YXJkKHRhcmdldEhhc2gpIHx8IHJvdXRlclByb3h5LmlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKSkge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgcm9vdCBvYmplY3Rcblx0XHRcdFx0XHQvLyBvciBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGFscmVhZHkgYmVlbiBhbGxvd2VkIGJ5IHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHRcdGxjbEhhc2hUcmFja2VyID0gdGFyZ2V0SGFzaDtcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSBhcHAsIGZvciBleGFtcGxlIGJhY2sgdG8gdGhlIGxpc3QgcmVwb3J0XG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEaXJ0eSkge1xuXHRcdFx0XHRcdC8vIHRoZSBGTFAgZG9lc24ndCBjYWxsIHRoZSBkaXJ0eSBzdGF0ZSBwcm92aWRlciBhbnltb3JlIG9uY2UgaXQncyBkaXJ0eSwgYXMgdGhleSBjYW4ndFxuXHRcdFx0XHRcdC8vIGNoYW5nZSB0aGlzIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc2V0IGl0IGJhY2sgdG8gbm90LWRpcnR5XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldERpcnR5RmxhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aGFzaFRyYWNrZXIgPSBsY2xIYXNoVHJhY2tlcjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBpc0RpcnR5O1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIHdoZW4gYSBzdGlja3kgc2Vzc2lvbiB0aW1lcyBvdXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzdGlja3lDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHBhcmFtIGkxOG5Nb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihzdGlja3lDb250ZXh0OiBDb250ZXh0LCBpMThuTW9kZWw6IE1vZGVsKSB7XG5cdFx0cmV0dXJuICgpOiB1bmRlZmluZWQgfCBib29sZWFuID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChzdGlja3lDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IG1pc3NpbmcgZm9yIFNlc3Npb25UaW1lb3V0IGZ1bmN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlbW92ZSB0cmFuc2llbnQgbWVzc2FnZXMgc2luY2Ugd2Ugd2lsbCBzaG93aW5nIG91ciBvd24gbWVzc2FnZVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRcdFx0Y29uc3Qgd2FybmluZ0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfVElUTEV9XCIsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHsgdGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX01FU1NBR0V9XCIgfSksXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19DT01NT05fRElBTE9HX09LfVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgc3RpY2t5IGhhbmRsaW5nIGFmdGVyIG5hdmlnYXRpb24gc2luY2Ugc2Vzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWRcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChzdGlja3lDb250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHR3YXJuaW5nRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLnNldE1vZGVsKGkxOG5Nb2RlbCwgXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCkuYWRkRGVwZW5kZW50KHdhcm5pbmdEaWFsb2cpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIG9uUm91dGVNYXRjaGVkIGV2ZW50IGluIGNhc2Ugb2Ygc3RpY2t5IGVkaXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZCAocm9vdCBvZiB0aGUgc3RpY2t5IHNlc3Npb24pXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQ6IENvbnRleHQsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0cmV0dXJuICgpOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IGN1cnJlbnRIYXNoID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0Ly8gZWl0aGVyIGN1cnJlbnQgaGFzaCBpcyBlbXB0eSBzbyB0aGUgdXNlciBsZWZ0IHRoZSBhcHAgb3IgaGUgbmF2aWdhdGVkIGF3YXkgZnJvbSB0aGUgb2JqZWN0XG5cdFx0XHRpZiAoIWN1cnJlbnRIYXNoIHx8ICFhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5jaGVja0hhc2hXaXRoR3VhcmQoY3VycmVudEhhc2gpKSB7XG5cdFx0XHRcdHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dCk7XG5cdFx0XHRcdGNvbnRleHQuZ2V0TW9kZWwoKS5jbGVhclNlc3Npb25Db250ZXh0KCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbmRzIGEgc3RpY2t5IHNlc3Npb24gYnkgZGlzY2FyZGluZyBjaGFuZ2VzLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgKHJvb3Qgb2YgdGhlIHN0aWNreSBzZXNzaW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgZGlzY2FyZGVkQ29udGV4dCA9IGF3YWl0IHN0aWNreS5kaXNjYXJkRG9jdW1lbnQoY29udGV4dCk7XG5cdFx0aWYgKGRpc2NhcmRlZENvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCkpIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQ/LnJlZnJlc2goKTtcblx0XHR9XG5cblx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGludGVybmFsIHJvdXRpbmcgZXh0ZW5zaW9uLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgaW50ZXJuYWwgcm91dGluZyBleHRlbnNpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0SW50ZXJuYWxSb3V0aW5nKCk6IEludGVybmFsUm91dGluZyB7XG5cdFx0aWYgKHRoaXMuYmFzZS5fcm91dGluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5fcm91dGluZztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIHJvdXRpbmcgbGlzdGVuZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0X2dldFJvb3RWaWV3Q29udHJvbGxlcigpOiBSb290Vmlld0Jhc2VDb250cm9sbGVyIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0fVxuXG5cdF9nZXRTZW1hbnRpY01hcHBpbmcoKTogU2VtYW50aWNNYXBwaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmdldExhc3RTZW1hbnRpY01hcHBpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHByb21pc2UgdG8gd2FpdCBmb3IgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250cm9sSWQgVGhlIElEIG9mIHRoZSBjb250cm9sXG5cdCAqIEByZXR1cm5zIFRoZSByZXNvbHZlciBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBleHRlcm5hbGx5IHJlc29sdmUgdGhlIHByb21pc2Vcblx0ICovXG5cdHByaXZhdGUgY3JlYXRlQWN0aW9uUHJvbWlzZShhY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRyb2xJZDogc3RyaW5nKTogeyBmUmVzb2x2ZXI6IEZ1bmN0aW9uOyBmUmVqZWN0b3I6IEZ1bmN0aW9uIH0ge1xuXHRcdGxldCByZXNvbHZlRnVuY3Rpb246IEZ1bmN0aW9uLCByZWplY3RGdW5jdGlvbjogRnVuY3Rpb247XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gbmV3IFByb21pc2U8eyBjb250cm9sSWQ/OiBzdHJpbmc7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0cmVzb2x2ZUZ1bmN0aW9uID0gcmVzb2x2ZTtcblx0XHRcdHJlamVjdEZ1bmN0aW9uID0gcmVqZWN0O1xuXHRcdH0pLnRoZW4oKG9SZXNwb25zZTogdW5rbm93bikgPT4ge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdHsgY29udHJvbElkIH0sXG5cdFx0XHRcdHRoaXMuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhcblx0XHRcdFx0XHRhY3Rpb25OYW1lLFxuXHRcdFx0XHRcdG9SZXNwb25zZSBhcyB1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHsgZlJlc29sdmVyOiByZXNvbHZlRnVuY3Rpb24hLCBmUmVqZWN0b3I6IHJlamVjdEZ1bmN0aW9uISB9O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdHByaXZhdGUgZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhcblx0XHRhY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0cmVzcG9uc2U/OiAodW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXSkgfCBudWxsXG5cdCk6IHsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZSkpIHtcblx0XHRcdGlmIChyZXNwb25zZS5sZW5ndGggPj0gMSkge1xuXHRcdFx0XHRyZXNwb25zZSA9IChyZXNwb25zZVswXSBhcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPikudmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIXJlc3BvbnNlKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCBjdXJyZW50VmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsRGF0YSA9IChjdXJyZW50Vmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldERhdGEoKSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0Y29uc3QgbWV0YU1vZGVsQWN0aW9uID0gbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXSBhcyBNZXRhTW9kZWxBY3Rpb25bXSB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBhY3Rpb25SZXR1cm5UeXBlID0gbWV0YU1vZGVsQWN0aW9uPy5bMF0uJFJldHVyblR5cGUgPyBtZXRhTW9kZWxBY3Rpb24/LlswXS4kUmV0dXJuVHlwZS4kVHlwZSA6IG51bGw7XG5cdFx0Y29uc3Qga2V5cyA9XG5cdFx0XHRhY3Rpb25SZXR1cm5UeXBlICYmIChtZXRhTW9kZWxEYXRhW2FjdGlvblJldHVyblR5cGVdIGFzIE1ldGFNb2RlbEVudGl0eVR5cGUpXG5cdFx0XHRcdD8gKG1ldGFNb2RlbERhdGFbYWN0aW9uUmV0dXJuVHlwZV0gYXMgTWV0YU1vZGVsRW50aXR5VHlwZSkuJEtleVxuXHRcdFx0XHQ6IFtdO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG9EYXRhOiByZXNwb25zZS5nZXRPYmplY3QoKSxcblx0XHRcdGtleXNcblx0XHR9O1xuXHR9XG5cblx0YXN5bmMgZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKTogUHJvbWlzZTx7IGNvbnRyb2xJZD86IHN0cmluZzsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkPiB7XG5cdFx0cmV0dXJuIHRoaXMuYWN0aW9uUHJvbWlzZTtcblx0fVxuXG5cdGRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlKCk6IHZvaWQge1xuXHRcdHRoaXMuYWN0aW9uUHJvbWlzZSA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGFzeW5jIHNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKGlzU2F2ZTogYm9vbGVhbik6IFByb21pc2U8UmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbj4ge1xuXHRcdGlmICghdGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKSB7XG5cdFx0XHR0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2cgPSBuZXcgQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2soe1xuXHRcdFx0XHR2aWV3OiB0aGlzLmdldFZpZXcoKVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2c/Lm9wZW4oaXNTYXZlKTtcblx0fVxuXG5cdF9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGU6IFRhYmxlKTogdm9pZCB7XG5cdFx0Y29uc3Qgcm93QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRjb25zdCBhY3RpdmVSb3dJbmRleDogbnVtYmVyID0gcm93QmluZGluZy5nZXRDb3VudCgpIHx8IDA7XG5cdFx0aWYgKHRhYmxlLmRhdGEoXCJ0YWJsZVR5cGVcIikgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRcdGlmIChhY3RpdmVSb3dJbmRleCA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChhY3RpdmVSb3dJbmRleCAtIDEpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coYWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvKiBJbiBhIHJlc3BvbnNpdmUgdGFibGUsIHRoZSBlbXB0eSByb3dzIGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YWJsZS4gQnV0IHdoZW4gd2UgY3JlYXRlIG1vcmUsIHRoZXkgYXBwZWFyIGJlbG93IHRoZSBuZXcgbGluZS5cblx0XHRcdCAqIFNvIHdlIGNoZWNrIHRoZSBmaXJzdCBpbmFjdGl2ZSByb3cgZmlyc3QsIHRoZW4gd2Ugc2V0IHRoZSBmb2N1cyBvbiBpdCB3aGVuIHdlIHByZXNzIHRoZSBidXR0b24uXG5cdFx0XHQgKiBUaGlzIGRvZXNuJ3QgaW1wYWN0IHRoZSBHcmlkVGFibGUgYmVjYXVzZSB0aGV5IGFwcGVhciBhdCB0aGUgZW5kLCBhbmQgd2UgYWxyZWFkeSBmb2N1cyB0aGUgYmVmb3JlLXRoZS1sYXN0IHJvdyAoYmVjYXVzZSAyIGVtcHR5IHJvd3MgZXhpc3QpXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IGFsbFJvd0NvbnRleHRzID0gcm93QmluZGluZy5nZXRDb250ZXh0cygpO1xuXHRcdFx0aWYgKCFhbGxSb3dDb250ZXh0cz8ubGVuZ3RoKSB7XG5cdFx0XHRcdHRhYmxlLmZvY3VzUm93KGFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGZvY3VzUm93ID0gYWN0aXZlUm93SW5kZXgsXG5cdFx0XHRcdGluZGV4ID0gMDtcblx0XHRcdGZvciAoY29uc3Qgc2luZ2xlQ29udGV4dCBvZiBhbGxSb3dDb250ZXh0cykge1xuXHRcdFx0XHRpZiAoc2luZ2xlQ29udGV4dC5pc0luYWN0aXZlKCkgJiYgaW5kZXggPCBmb2N1c1Jvdykge1xuXHRcdFx0XHRcdGZvY3VzUm93ID0gaW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdH1cblx0XHRcdGlmIChmb2N1c1JvdyA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChmb2N1c1Jvdyk7XG5cdFx0XHR9XG5cdFx0XHR0YWJsZS5mb2N1c1Jvdyhmb2N1c1JvdywgdHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgY3JlYXRlRW1wdHlSb3dzQW5kRm9jdXModGFibGU6IFRhYmxlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdGFibGVBUEkgPSB0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRpZiAoXG5cdFx0XHR0YWJsZUFQST8udGFibGVEZWZpbml0aW9uPy5jb250cm9sPy5pbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlICYmXG5cdFx0XHQhdGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJ1aVwiKT8uZ2V0UHJvcGVydHkoXCJjcmVhdGVNb2RlXCIpXG5cdFx0KSB7XG5cdFx0XHQvLyBXaXRoIHRoZSBwYXJhbWV0ZXIsIHdlIGRvbid0IGhhdmUgZW1wdHkgcm93cyBpbiBFZGl0IG1vZGUsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIHRoZW0gYmVmb3JlIHNldHRpbmcgdGhlIGZvY3VzIG9uIHRoZW1cblx0XHRcdGF3YWl0IHRhYmxlQVBJLnNldFVwRW1wdHlSb3dzKHRhYmxlLCB0cnVlKTtcblx0XHR9XG5cdFx0dGhpcy5fc2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93KHRhYmxlKTtcblx0fVxuXG5cdF9zZW5kQWN0aXZpdHkoXG5cdFx0YWN0aW9uOiBBY3Rpdml0eSxcblx0XHRyZWxhdGVkQ29udGV4dHM6IENvbnRleHQgfCBDb250ZXh0W10gfCBudWxsIHwgdW5kZWZpbmVkLFxuXHRcdHRyaWdnZXJlZEFjdGlvbk5hbWU/OiBzdHJpbmcsXG5cdFx0cmVmcmVzaExpc3RCaW5kaW5nPzogYm9vbGVhbixcblx0XHRhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzPzogc3RyaW5nW11cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29udGVudCA9IEFycmF5LmlzQXJyYXkocmVsYXRlZENvbnRleHRzKSA/IHJlbGF0ZWRDb250ZXh0cy5tYXAoKGNvbnRleHQpID0+IGNvbnRleHQuZ2V0UGF0aCgpKSA6IHJlbGF0ZWRDb250ZXh0cz8uZ2V0UGF0aCgpO1xuXHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuc2VuZCh7IGFjdGlvbiwgY29udGVudCwgdHJpZ2dlcmVkQWN0aW9uTmFtZSwgcmVmcmVzaExpc3RCaW5kaW5nLCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzIH0pO1xuXHR9XG5cblx0X3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lOiBzdHJpbmcsIHRyaWdnZXJUeXBlOiBUcmlnZ2VyVHlwZSk6IHZvaWQge1xuXHRcdHRyaWdnZXJDb25maWd1cmVkU3VydmV5KHRoaXMuYmFzZS5nZXRWaWV3KCksIHNBY3Rpb25OYW1lLCB0cmlnZ2VyVHlwZSk7XG5cdH1cblxuXHRhc3luYyBfc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBTdWJtaXQgYW55IGxlZnRvdmVyIGNoYW5nZXMgdGhhdCBhcmUgbm90IHlldCBzdWJtaXR0ZWRcblx0XHRcdC8vIEN1cnJlbnRseSB3ZSBhcmUgdXNpbmcgb25seSAxIHVwZGF0ZUdyb3VwSWQsIGhlbmNlIHN1Ym1pdHRpbmcgdGhlIGJhdGNoIGRpcmVjdGx5IGhlcmVcblx0XHRcdGF3YWl0IG9Nb2RlbC5zdWJtaXRCYXRjaChcIiRhdXRvXCIpO1xuXG5cdFx0XHQvLyBXYWl0IGZvciBhbGwgY3VycmVudGx5IHJ1bm5pbmcgY2hhbmdlc1xuXHRcdFx0Ly8gRm9yIHRoZSB0aW1lIGJlaW5nIHdlIGFncmVlZCB3aXRoIHRoZSB2NCBtb2RlbCB0ZWFtIHRvIHVzZSBhbiBpbnRlcm5hbCBtZXRob2QuIFdlJ2xsIHJlcGxhY2UgaXQgb25jZVxuXHRcdFx0Ly8gYSBwdWJsaWMgb3IgcmVzdHJpY3RlZCBtZXRob2Qgd2FzIHByb3ZpZGVkXG5cdFx0XHRhd2FpdCAob01vZGVsLm9SZXF1ZXN0b3IgYXMgdW5rbm93biBhcyB7IHdhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHM6IEZ1bmN0aW9uIH0pLndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMoXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYWxsIGNoYW5nZXMgd2VyZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5XG5cdFx0XHRpZiAob01vZGVsLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3VibWl0IG9mIG9wZW4gY2hhbmdlcyBmYWlsZWRcIik7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRpc3BsYXkgYSAnZGlzY2FyZCcgcG9wb3ZlciB3aGVuIGV4aXRpbmcgYSBzdGlja3kgc2Vzc2lvbi5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRcblx0ICovXG5cdHByaXZhdGUgb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbihjb250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgcm91dGVyUHJveHkgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAocm91dGVyUHJveHkuY2hlY2tJZkJhY2tJc091dE9mR3VhcmQoKSkge1xuXHRcdFx0c3RpY2t5LnByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbihcblx0XHRcdFx0YXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhQcm9ncmFtbWluZ01vZGVsLlN0aWNreSk7XG5cdFx0XHRcdFx0aGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHZpZXcsXG5cdFx0XHRcdFByb2dyYW1taW5nTW9kZWwuU3RpY2t5XG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGhpc3RvcnkuYmFjaygpO1xuXHR9XG5cblx0YXN5bmMgX2hhbmRsZU5ld0NvbnRleHQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0bmF2aWdhdGlvblBhcmFtZXRlcnM6IHsgZWRpdGFibGU6IGJvb2xlYW47IHJlY3JlYXRlQ29udGV4dDogYm9vbGVhbjsgZm9yY2VGb2N1cz86IGJvb2xlYW4gfVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHR9XG5cblx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7XG5cdFx0XHRjaGVja05vSGFzaENoYW5nZTogdHJ1ZSxcblx0XHRcdGVkaXRhYmxlOiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5lZGl0YWJsZSxcblx0XHRcdHBlcnNpc3RPUFNjcm9sbDogdHJ1ZSxcblx0XHRcdHJlY3JlYXRlQ29udGV4dDogbmF2aWdhdGlvblBhcmFtZXRlcnMucmVjcmVhdGVDb250ZXh0LFxuXHRcdFx0cmVhc29uOiBOYXZpZ2F0aW9uUmVhc29uLkVkaXRGbG93QWN0aW9uLFxuXHRcdFx0c2hvd1BsYWNlaG9sZGVyOiBmYWxzZSxcblx0XHRcdGZvcmNlRm9jdXM6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmZvcmNlRm9jdXMgPz8gZmFsc2UsXG5cdFx0XHRrZWVwQ3VycmVudExheW91dDogdHJ1ZVxuXHRcdH0pO1xuXHR9XG5cblx0X2dldEJvdW5kQ29udGV4dCh2aWV3OiBGRVZpZXcsIHBhcmFtczogeyBjb250cm9sSWQ/OiBzdHJpbmc7IGlzTmF2aWdhYmxlPzogYm9vbGVhbiB9KTogYm9vbGVhbiB7XG5cdFx0Y29uc3Qgdmlld0xldmVsID0gdmlldy5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbDtcblx0XHRjb25zdCBiUmVmcmVzaEFmdGVyQWN0aW9uID0gdmlld0xldmVsID4gMSB8fCAodmlld0xldmVsID09PSAxICYmIHBhcmFtcy5jb250cm9sSWQpO1xuXHRcdHJldHVybiAhcGFyYW1zLmlzTmF2aWdhYmxlIHx8ICEhYlJlZnJlc2hBZnRlckFjdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gKHBhcnNlKSBlcnJvcnMgZm9yIGNvbnRyb2xzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dFxuXHQgKlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBpZiB0aGVyZSBhcmUgbm8gdmFsaWRhdGlvbiBlcnJvcnMsIGFuZCByZWplY3RzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIGVycm9yc1xuXHQgKi9cblxuXHRhc3luYyBfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkIHwgdm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrKCkudGhlbigoKSA9PiB7XG5cdFx0XHRjb25zdCBzVmlld0lkID0gdGhpcy5nZXRWaWV3KCkuZ2V0SWQoKTtcblx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRsZXQgb0NvbnRyb2w7XG5cblx0XHRcdGlmICghYU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRMb2cuaW5mbyhcIk5vIHZhbGlkYXRpb24gZXJyb3JzIGZvdW5kXCIpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgbWVzc2FnZSBvZiBhTWVzc2FnZXMpIHtcblx0XHRcdFx0aWYgKG1lc3NhZ2UudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9Db250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChtZXNzYWdlLmdldENvbnRyb2xJZCgpKTtcblx0XHRcdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGlmIChvQ29udHJvbC5nZXRJZCgpID09PSBzVmlld0lkKSB7XG5cdFx0XHRcdFx0XHRcdHRocm93IFwidmFsaWRhdGlvbiBlcnJvcnMgZXhpc3RcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIG9SZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2YgdGhlIGJvdW5kIGFjdGlvbiBhbmQgdGhlIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2Uub0RhdGFcblx0ICogQHBhcmFtIG9SZXNwb25zZS5rZXlzXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgYm91bmQgY29udGV4dCBvbiB3aGljaCB0aGUgYWN0aW9uIHdhcyBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyBBbHdheXMgcmVzb2x2ZXMgdG8gcGFyYW0gb1Jlc3BvbnNlXG5cdCAqL1xuXHRhc3luYyBfcmVmcmVzaExpc3RJZlJlcXVpcmVkKFxuXHRcdG9SZXNwb25zZT86IHsgb0RhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5cz86IHN0cmluZ1tdIHwgbnVsbCB9LFxuXHRcdG9Db250ZXh0PzogQ29udGV4dFxuXHQpOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcblx0XHRpZiAoIW9Db250ZXh0IHx8ICFvUmVzcG9uc2UgfHwgIW9SZXNwb25zZS5vRGF0YSB8fCAhb1Jlc3BvbnNlLmtleXMpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0XHR9XG5cdFx0Y29uc3Qgb0JpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Ly8gcmVmcmVzaCBvbmx5IGxpc3RzXG5cdFx0aWYgKG9CaW5kaW5nICYmIG9CaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvUmVzcG9uc2Uub0RhdGE7XG5cdFx0XHRjb25zdCBhS2V5cyA9IG9SZXNwb25zZS5rZXlzO1xuXHRcdFx0Y29uc3Qgb0N1cnJlbnREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRsZXQgYlJldHVybmVkQ29udGV4dElzU2FtZSA9IHRydWU7XG5cdFx0XHQvLyBlbnN1cmUgY29udGV4dCBpcyBpbiB0aGUgcmVzcG9uc2Vcblx0XHRcdGlmIChPYmplY3Qua2V5cyhvQ29udGV4dERhdGEpLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBjaGVjayBpZiBjb250ZXh0IGluIHJlc3BvbnNlIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBib3VuZCBjb250ZXh0XG5cdFx0XHRcdGJSZXR1cm5lZENvbnRleHRJc1NhbWUgPSBhS2V5cy5ldmVyeShmdW5jdGlvbiAoc0tleTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRcdFx0cmV0dXJuIG9DdXJyZW50RGF0YVtzS2V5XSA9PT0gb0NvbnRleHREYXRhW3NLZXldO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdFx0XHRcdFx0aWYgKG9CaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChvQmluZGluZykpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBXZSB1c2UgYSBzaWRlLWVmZmVjdCByZWZyZXNoIGZvciBhIFRyZWVUYWJsZSwgdG8gcHJlc2VydmUgZXhwYW5zaW9uIHN0YXRlc1xuXHRcdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBcIlwiIH1dLCBvQmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhKVxuXHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKChlOiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIsIGUgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdG9CaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogb0JpbmRpbmcuZ2V0UGF0aCgpIH1dLCBvQmluZGluZy5nZXRDb250ZXh0KCkpXG5cdFx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyB0aGUgdGFibGVcIiwgZSBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyByZXNvbHZlIHdpdGggb1Jlc3BvbnNlIHRvIG5vdCBkaXN0dXJiIHRoZSBwcm9taXNlIGNoYWluIGFmdGVyd2FyZHNcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdH1cblxuXHRhc3luYyBfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c0VudGl0eVNldE5hbWUgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIiksXG5cdFx0XHRhU2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNFbnRpdHlTZXROYW1lKTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzICYmIGFTZW1hbnRpY0tleXMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBhUmVxdWVzdFByb21pc2VzID0gYVNlbWFudGljS2V5cy5tYXAoYXN5bmMgZnVuY3Rpb24gKG9LZXk6IHsgJFByb3BlcnR5UGF0aDogc3RyaW5nIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRleHQucmVxdWVzdE9iamVjdChvS2V5LiRQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChhUmVxdWVzdFByb21pc2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQcm92aWRlcyB0aGUgbGF0ZXN0IGNvbnRleHQgaW4gdGhlIG1ldGFkYXRhIGhpZXJhcmNoeSBmcm9tIHJvb3RCaW5kaW5nIHRvIGdpdmVuIGNvbnRleHQgcG9pbnRpbmcgdG8gZ2l2ZW4gZW50aXR5VHlwZVxuXHQgKiBpZiBhbnkgc3VjaCBjb250ZXh0IGV4aXN0cy4gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHRoZSBvcmlnaW5hbCBjb250ZXh0LlxuXHQgKiBOb3RlOiBJdCBpcyBvbmx5IG5lZWRlZCBhcyB3b3JrLWFyb3VuZCBmb3IgaW5jb3JyZWN0IG1vZGVsbGluZy4gQ29ycmVjdCBtb2RlbGxpbmcgd291bGQgaW1wbHkgYSBEYXRhRmllbGRGb3JBY3Rpb24gaW4gYSBMaW5lSXRlbVxuXHQgKiB0byBwb2ludCB0byBhbiBvdmVybG9hZCBkZWZpbmVkIGVpdGhlciBvbiB0aGUgY29ycmVzcG9uZGluZyBFbnRpdHlUeXBlIG9yIGEgY29sbGVjdGlvbiBvZiB0aGUgc2FtZS5cblx0ICpcblx0ICogQHBhcmFtIHJvb3RDb250ZXh0IFRoZSBjb250ZXh0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdEJpbmRpbmcgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBvdmVybG9hZEVudGl0eVR5cGUgVGhlIEFjdGlvbk92ZXJsb2FkIGVudGl0eSB0eXBlIHRvIHNlYXJjaCBmb3Jcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgQWN0aW9uT3ZlcmxvYWQgZW50aXR5XG5cdCAqL1xuXHRfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aChyb290Q29udGV4dDogQ29udGV4dCwgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIG92ZXJsb2FkRW50aXR5VHlwZTogc3RyaW5nKTogQ29udGV4dCB7XG5cdFx0Y29uc3QgbW9kZWw6IE9EYXRhTW9kZWwgPSByb290Q29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgY29udGV4dFNlZ21lbnRzOiBzdHJpbmdbXSA9IGxpc3RCaW5kaW5nLmdldFBhdGgoKS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IGN1cnJlbnRDb250ZXh0OiBDb250ZXh0ID0gcm9vdENvbnRleHQ7XG5cblx0XHQvLyBXZSBleHBlY3QgdGhhdCB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBsaXN0QmluZGluZyBpcyB0aGUgTGlzdEJpbmRpbmcgb2YgdGhlIHRhYmxlLiBSZW1vdmUgdGhpcyBmcm9tIGNvbnRleHRTZWdtZW50c1xuXHRcdC8vIGJlY2F1c2UgaXQgaXMgaW5jb3JyZWN0IHRvIGV4ZWN1dGUgYmluZENvbnRleHQgb24gYSBsaXN0LiBXZSBkbyBub3QgYW55d2F5IG5lZWQgdG8gc2VhcmNoIHRoaXMgY29udGV4dCBmb3IgdGhlIG92ZXJsb2FkLlxuXHRcdGNvbnRleHRTZWdtZW50cy5wb3AoKTtcblx0XHRpZiAoY29udGV4dFNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Y29udGV4dFNlZ21lbnRzID0gW1wiXCJdOyAvLyBEb24ndCBsZWF2ZSBjb250ZXh0U2VnbWVudHMgdW5kZWZpbmVkXG5cdFx0fVxuXG5cdFx0aWYgKGNvbnRleHRTZWdtZW50c1swXSAhPT0gXCJcIikge1xuXHRcdFx0Y29udGV4dFNlZ21lbnRzLnVuc2hpZnQoXCJcIik7IC8vIHRvIGFsc28gZ2V0IHRoZSByb290IGNvbnRleHQsIGkuZS4gdGhlIGJpbmRpbmdDb250ZXh0IG9mIHRoZSB0YWJsZVxuXHRcdH1cblx0XHQvLyBsb2FkIGFsbCB0aGUgcGFyZW50IGNvbnRleHRzIGludG8gYW4gYXJyYXlcblx0XHRjb25zdCBwYXJlbnRDb250ZXh0czogQ29udGV4dFtdID0gY29udGV4dFNlZ21lbnRzXG5cdFx0XHQubWFwKChwYXRoU2VnbWVudDogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdGlmIChwYXRoU2VnbWVudCAhPT0gXCJcIikge1xuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQocGF0aFNlZ21lbnQsIGN1cnJlbnRDb250ZXh0KS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBDcmVhdGluZyBhIG5ldyBjb250ZXh0IHVzaW5nIGJpbmRDb250ZXh0KC4uLikuZ2V0Qm91bmRDb250ZXh0KCkgZG9lcyBub3Qgd29yayBpZiB0aGUgZXRhZyBpcyBuZWVkZWQuIEFjY29yZGluZyB0byBtb2RlbCBjb2xsZWFndWVzLFxuXHRcdFx0XHRcdC8vIHdlIHNob3VsZCBhbHdheXMgdXNlIGFuIGV4aXN0aW5nIGNvbnRleHQgaWYgcG9zc2libGUuXG5cdFx0XHRcdFx0Ly8gQ3VycmVudGx5LCB0aGUgb25seSBleGFtcGxlIHdlIGtub3cgYWJvdXQgaXMgdXNpbmcgdGhlIHJvb3RDb250ZXh0IC0gYW5kIGluIHRoaXMgY2FzZSwgd2UgY2FuIG9idmlvdXNseSByZXVzZSB0aGF0IGV4aXN0aW5nIGNvbnRleHQuXG5cdFx0XHRcdFx0Ly8gSWYgb3RoZXIgZXhhbXBsZXMgc2hvdWxkIGNvbWUgdXAsIHRoZSBiZXN0IHBvc3NpYmxlIHdvcmsgYXJvdW5kIHdvdWxkIGJlIHRvIHJlcXVlc3Qgc29tZSBkYXRhIHRvIGdldCBhbiBleGlzdGluZyBjb250ZXh0LiBUbyBrZWVwIHRoZVxuXHRcdFx0XHRcdC8vIHJlcXVlc3QgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUsIHdlIHNob3VsZCByZXF1ZXN0IG9ubHkgdGhlIGZpcnN0IGtleSBwcm9wZXJ0eS4gQXMgdGhpcyB3b3VsZCBpbnRyb2R1Y2UgYXN5bmNocm9uaXNtLCBhbmQgYW55d2F5XG5cdFx0XHRcdFx0Ly8gdGhlIHdob2xlIGxvZ2ljIGlzIG9ubHkgcGFydCBvZiB3b3JrLWFyb3VuZCBmb3IgaW5jb3JyZWN0IG1vZGVsbGluZywgd2Ugd2FpdCB1bnRpbCB3ZSBoYXZlIGFuIGV4YW1wbGUgbmVlZGluZyBpdCBiZWZvcmUgaW1wbGVtZW50aW5nIHRoaXMuXG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQgPSByb290Q29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gY3VycmVudENvbnRleHQ7XG5cdFx0XHR9KVxuXHRcdFx0LnJldmVyc2UoKTtcblx0XHQvLyBzZWFyY2ggZm9yIGNvbnRleHQgYmFja3dhcmRzXG5cdFx0Y29uc3Qgb3ZlcmxvYWRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkID0gcGFyZW50Q29udGV4dHMuZmluZChcblx0XHRcdChwYXJlbnRDb250ZXh0OiBDb250ZXh0KSA9PlxuXHRcdFx0XHQobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KHBhcmVudENvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCIkVHlwZVwiKSBhcyB1bmtub3duIGFzIHN0cmluZykgPT09IG92ZXJsb2FkRW50aXR5VHlwZVxuXHRcdCk7XG5cdFx0cmV0dXJuIG92ZXJsb2FkQ29udGV4dCB8fCBsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhO1xuXHR9XG5cblx0X2NyZWF0ZVNpYmxpbmdJbmZvKGN1cnJlbnRDb250ZXh0OiBDb250ZXh0LCBuZXdDb250ZXh0OiBDb250ZXh0KTogU2libGluZ0luZm9ybWF0aW9uIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0Q29udGV4dDogbmV3Q29udGV4dCxcblx0XHRcdHBhdGhNYXBwaW5nOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRvbGRQYXRoOiBjdXJyZW50Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3Q29udGV4dC5nZXRQYXRoKClcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH07XG5cdH1cblxuXHRfdXBkYXRlUGF0aHNJbkhpc3RvcnkobWFwcGluZ3M6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldFBhdGhNYXBwaW5nKG1hcHBpbmdzKTtcblxuXHRcdC8vIEFsc28gdXBkYXRlIHRoZSBzZW1hbnRpYyBtYXBwaW5nIGluIHRoZSByb3V0aW5nIHNlcnZpY2Vcblx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0aWYgKG1hcHBpbmdzLmxlbmd0aCAmJiBsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5vbGRQYXRoKSB7XG5cdFx0XHRsYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdH1cblx0fVxuXG5cdF9nZXROYXZpZ2F0aW9uVGFyZ2V0Rm9yRWRpdChcblx0XHRjb250ZXh0OiBDb250ZXh0LFxuXHRcdG5ld0RvY3VtZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkXG5cdCk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKGNvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPSBuZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0fVxuXHRcdHJldHVybiBjb250ZXh0VG9OYXZpZ2F0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgc2libGluZyBjb250ZXh0IGZvciBhIHN1Ym9iamVjdCBwYWdlLCBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aFxuXHQgKiBmb3IgYWxsIGludGVybWVkaWF0ZSBwYXRocyBiZXR3ZWVuIHRoZSBvYmplY3QgcGFnZSBhbmQgdGhlIHN1Ym9iamVjdCBwYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcm9vdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBvZiB0aGUgZHJhZnRcblx0ICogQHBhcmFtIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBzdWJvYmplY3Rcblx0ICogQHBhcmFtIHNQcm9ncmFtbWluZ01vZGVsIFRoZSBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKiBAcGFyYW0gZG9Ob3RDb21wdXRlSWZSb290IElmIHRydWUsIHdlIGRvbid0IGNvbXB1dGUgc2libGluZ0luZm8gaWYgdGhlIHJvb3QgYW5kIHRoZSByaWdodG1vc3QgY29udGV4dHMgYXJlIHRoZSBzYW1lXG5cdCAqIEBwYXJhbSByb290Q29udGV4dEluZm8gVGhlIHJvb3QgY29udGV4dCBpbmZvcm1hdGlvbiBvZiByb290IG9mIHRoZSBkcmFmdFxuXHQgKiBAcGFyYW0gZ3JvdXBJZFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBzaWJsaW5nSW5mb3JtYXRpb24gb2JqZWN0XG5cdCAqL1xuXHRhc3luYyBfY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRyb290Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkLFxuXHRcdHNQcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcsXG5cdFx0ZG9Ob3RDb21wdXRlSWZSb290OiBib29sZWFuLFxuXHRcdHJvb3RDb250ZXh0SW5mbz86IFJvb3RDb250ZXh0SW5mbyxcblx0XHRncm91cElkPzogc3RyaW5nXG5cdCk6IFByb21pc2U8U2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkPiB7XG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQgPSByaWdodG1vc3RDdXJyZW50Q29udGV4dCA/PyByb290Q3VycmVudENvbnRleHQ7XG5cdFx0aWYgKCFyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3RhcnRzV2l0aChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0Ly8gV3JvbmcgdXNhZ2UgISFcblx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdH1cblx0XHRsZXQgcmlnaHRNb3N0Q29udGV4dFRvVXNlID0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQ7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChyaWdodG1vc3RDdXJyZW50Q29udGV4dCkgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdC8vIHdlIGNoZWNrIHRoZSByaWdodE1vc3RDdXJyZW50Q29udGV4dCBjYW4gYmUgdXNlZCBpbiBkcmFmdFxuXHRcdFx0cmlnaHRNb3N0Q29udGV4dFRvVXNlID0gcm9vdEN1cnJlbnRDb250ZXh0O1xuXHRcdH1cblx0XHRpZiAoZG9Ob3RDb21wdXRlSWZSb290ICYmIHJpZ2h0TW9zdENvbnRleHRUb1VzZS5nZXRQYXRoKCkgPT09IHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0XHR9XG5cblx0XHRjb25zdCBtb2RlbCA9IHJvb3RDdXJyZW50Q29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0cmV0dXJuIGRyYWZ0LmNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ocm9vdEN1cnJlbnRDb250ZXh0LCByaWdodE1vc3RDb250ZXh0VG9Vc2UsIHJvb3RDb250ZXh0SW5mbywgZ3JvdXBJZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIElmIG5vdCBpbiBkcmFmdCBtb2RlLCB3ZSBqdXN0IHJlY3JlYXRlIGEgY29udGV4dCBmcm9tIHRoZSBwYXRoIG9mIHRoZSByaWdodG1vc3QgY29udGV4dFxuXHRcdFx0Ly8gTm8gcGF0aCBtYXBwaW5nIGlzIG5lZWRlZFxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dGFyZ2V0Q29udGV4dDogbW9kZWwuYmluZENvbnRleHQocmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKS5nZXRCb3VuZENvbnRleHQoKSxcblx0XHRcdFx0cGF0aE1hcHBpbmc6IFtdXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdF9pc0ZjbEVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpO1xuXHR9XG5cblx0YXN5bmMgY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbigpOiBQcm9taXNlPFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRsZXQgcmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuO1xuXHRcdGlmICh0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmNoZWNrSWZSZWNvbW1lbmRhdGlvbnNFeGlzdCgpKSB7XG5cdFx0XHRyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPSBhd2FpdCB0aGlzLnNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKHRydWUpO1xuXHRcdFx0aWYgKHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW47XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRWRpdEZsb3c7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBcUVBLE1BQU1BLFlBQVksR0FBR0MsU0FBUyxDQUFDRCxZQUFZO0lBQzFDRSxnQkFBZ0IsR0FBR0QsU0FBUyxDQUFDQyxnQkFBZ0I7SUFDN0NDLFNBQVMsR0FBR0YsU0FBUyxDQUFDRSxTQUFTO0lBQy9CQyxXQUFXLEdBQUdILFNBQVMsQ0FBQ0csV0FBVztJQUNuQ0MsUUFBUSxHQUFHSixTQUFTLENBQUNJLFFBQVE7SUFDN0JDLFdBQVcsR0FBR0wsU0FBUyxDQUFDSyxXQUFXO0lBQ25DQyxXQUFXLEdBQUdDLFdBQVcsQ0FBQ0QsV0FBVztFQXdCdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOQSxJQVFNRSxRQUFRLFdBRGJDLGNBQWMsQ0FBQywyQ0FBMkMsQ0FBQyxVQW9DMURDLGVBQWUsRUFBRSxVQUNqQkMsY0FBYyxFQUFFLFVBOFBoQkQsZUFBZSxFQUFFLFVBQ2pCQyxjQUFjLEVBQUUsVUErRmhCRCxlQUFlLEVBQUUsVUFDakJDLGNBQWMsRUFBRSxVQXd5QmhCRCxlQUFlLEVBQUUsVUFDakJFLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxXQW9CbkNKLGVBQWUsRUFBRSxXQUNqQkUsVUFBVSxDQUFDLFlBQVksQ0FBQyxXQW9CeEJGLGVBQWUsRUFBRSxXQUNqQkUsVUFBVSxDQUFDLFlBQVksQ0FBQyxXQUN4QkcsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMs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
|
|
2910
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiTWVzc2FnZVR5cGUiLCJjb3JlTGlicmFyeSIsIkVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiaG9va2FibGUiLCJzeW5jVGFza3MiLCJQcm9taXNlIiwicmVzb2x2ZSIsImhhbmRsZVNpZGVFZmZlY3RzIiwibGlzdEJpbmRpbmciLCJjcmVhdGlvblByb21pc2UiLCJ2aWV3QmluZGluZ0NvbnRleHQiLCJnZXRWaWV3IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJuZXdDb250ZXh0IiwiY3JlYXRlZCIsIkNvbW1vblV0aWxzIiwiaGFzVHJhbnNpZW50Q29udGV4dCIsImdldEFwcENvbXBvbmVudCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsImdldFBhdGgiLCJlcnJvciIsIkxvZyIsImNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyIsInZhbGlkYXRpb25NZXNzYWdlcyIsInRhYmxlIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiZ2V0Q3JlYXRpb25Sb3ciLCJkYXRhIiwiY3VzdG9tVmFsaWRpdHkiLCJnZXRQcm9wZXJ0eSIsImN1c3RvbU1lc3NhZ2VzIiwiZmllbGRDb250cm9sIiwiZmluYWxUYXJnZXQiLCJvbGRNZXNzYWdlcyIsIk1lc3NhZ2luZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmaWx0ZXIiLCJtZXNzYWdlIiwiZ2V0Q29kZSIsInJlbW92ZU1lc3NhZ2VzIiwiZm9yRWFjaCIsInZhbGlkYXRpb25NZXNzYWdlIiwibWVzc2FnZVRhcmdldCIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImZpZWxkSWQiLCJnZXRCaW5kaW5nUGF0aCIsImdldFRhcmdldHMiLCJzb21lIiwidGFyZ2V0IiwibGVuZ3RoIiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZVRleHQiLCJwcm9jZXNzb3IiLCJnZXRNb2RlbCIsInR5cGUiLCJFcnJvciIsImNvZGUiLCJ0ZWNobmljYWwiLCJwZXJzaXN0ZW50IiwiZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMiLCJhZGRDb250cm9sSWQiLCJwdXNoIiwidGV4dCIsImdldE1lc3NhZ2VIYW5kbGVyIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJyZXNvbHZlQ3JlYXRpb25Nb2RlIiwiaW5pdGlhbENyZWF0aW9uTW9kZSIsImNyZWF0ZURhdGEiLCJOZXdQYWdlIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwicHJvZ3JhbW1pbmdNb2RlbCIsImdldFByb2dyYW1taW5nTW9kZWwiLCJpc1JlbGF0aXZlIiwiZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0TWV0YUNvbnRleHQiLCJlbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlTZXQiLCJuZXdBY3Rpb24iLCJEcmFmdCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRHJhZnRSb290IiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJOZXdBY3Rpb24iLCJ0b1N0cmluZyIsInRhcmdldEVudGl0eVR5cGUiLCJhY3Rpb25zIiwicGFyYW1ldGVycyIsIkRlZmVycmVkIiwiY3JlYXRpb25QYXJhbWV0ZXJzIiwiZ2V0VHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRDcmVhdGlvblBhcmFtZXRlcnMiLCJBc3luYyIsImdldEludGVyZmFjZSIsImJhc2UiLCJlZGl0RG9jdW1lbnQiLCJjb250ZXh0IiwidHJhbnNhY3Rpb25IZWxwZXIiLCJyb290Vmlld0NvbnRyb2xsZXIiLCJfZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwibW9kZWwiLCJ2aWV3RGF0YSIsImdldFZpZXdEYXRhIiwicm9vdENvbnRleHQiLCJ2aWV3IiwiZ3JvdXBJZCIsInZpZXdMZXZlbCIsIlN0aWNreSIsImNyZWF0ZVJvb3RDb250ZXh0IiwiZWRpdEZsb3ciLCJvbkJlZm9yZUVkaXQiLCJyaWdodG1vc3RDb250ZXh0IiwiX2lzRmNsRW5hYmxlZCIsImdldFJpZ2h0bW9zdENvbnRleHQiLCJ1bmRlZmluZWQiLCJuZXdEb2N1bWVudENvbnRleHRQcm9taXNlIiwicm9vdENvbnRleHRJbmZvIiwicm9vdFNpYmxpbmdQYXRoUHJvbWlzZSIsIl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzIiwic2libGluZ0luZm9Qcm9taXNlIiwiY29tcHV0ZVNpYmxpbmdJbmZvIiwiX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJzdWJtaXRCYXRjaCIsInNpYmxpbmdJbmZvIiwibmV3RG9jdW1lbnRDb250ZXh0IiwiY29udGV4dFRvTmF2aWdhdGUiLCJfZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQiLCJfdXBkYXRlUGF0aHNJbkhpc3RvcnkiLCJzZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwic2V0RG9jdW1lbnRNb2RpZmllZCIsIm9uQWZ0ZXJFZGl0IiwiX2hhbmRsZU5ld0NvbnRleHQiLCJlZGl0YWJsZSIsInJlY3JlYXRlQ29udGV4dCIsImZvcmNlRm9jdXMiLCJzdGlja3lDb250ZXh0IiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsImhhbmRsZVN0aWNreU9uIiwiTW9kZWxIZWxwZXIiLCJpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCIsInNoYXJlT2JqZWN0IiwicmVqZWN0IiwicmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUiLCJwYXJlbnRDb250ZXh0Iiwic2lkZUVmZmVjdFNlcnZpY2UiLCJzdGF0ZU1lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsImlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsImNvbnRleHRzVG9EZWxldGUiLCJiZWZvcmVEZWxldGVDYWxsQmFjayIsIm9uQmVmb3JlRGVsZXRlIiwibG9ja09iamVjdCIsImdldEdsb2JhbFVJTW9kZWwiLCJwYXJlbnRDb250cm9sIiwiYnlJZCIsImNvbnRyb2xJZCIsImluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZSIsImlzQSIsImlzSW5hY3RpdmUiLCJnZXRCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsImJGaW5kQWN0aXZlQ29udGV4dHMiLCJCdXN5TG9ja2VyIiwibG9jayIsInNlbGVjdGVkQ29udGV4dHMiLCJkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwicmVzdWx0IiwiY2xlYXJTZWxlY3Rpb24iLCJpc1Jvb3QiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImdldEhlYWRlckNvbnRleHQiLCJhdHRhY2hFdmVudE9uY2UiLCJyZWZyZXNoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCIsInJlY29tbWVuZGF0aW9ucyIsImlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMiLCJvbkFmdGVyRGVsZXRlIiwiY29udGV4dHMiLCJ0YWJsZUFQSSIsImdldFBhcmVudCIsInRhYmxlRGVmaW5pdGlvbiIsImNvbnRyb2wiLCJjcmVhdGlvbk1vZGUiLCJJbmxpbmVDcmVhdGlvblJvd3MiLCJyZW1vdmVFbXB0eVJvd3NNZXNzYWdlcyIsInNldFVwRW1wdHlSb3dzIiwiX3NlbmRBY3Rpdml0eSIsIkFjdGl2aXR5IiwiRGVsZXRlIiwidW5sb2NrIiwidXBkYXRlRG9jdW1lbnQiLCJ1cGRhdGVkQ29udGV4dCIsInVwZGF0ZVByb21pc2UiLCJvcmlnaW5hbEJpbmRpbmdDb250ZXh0IiwiaXNEcmFmdCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsInN5bmNUYXNrIiwic2V0RHJhZnRTdGF0dXMiLCJTYXZpbmciLCJjdXJyZW50QmluZGluZ0NvbnRleHQiLCJlbnRpdHlTZXROYW1lIiwiZ2V0T2JqZWN0Iiwic2VtYW50aWNLZXlzIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJjdXJyZW50U2VtYW50aWNNYXBwaW5nIiwiX2dldFNlbWFudGljTWFwcGluZyIsImN1cnJlbnRTZW1hbnRpY1BhdGgiLCJzZW1hbnRpY1BhdGgiLCJzQ2hhbmdlZFBhdGgiLCJnZXRTZW1hbnRpY1BhdGgiLCJTYXZlZCIsIkNsZWFyIiwic2hvd01lc3NhZ2VzIiwiZ2V0UGFyZW50Q29udGV4dEZyb21TZWxlY3Rpb24iLCJjcmVhdGVEb2N1bWVudCIsInZMaXN0QmluZGluZyIsIm1JblBhcmFtZXRlcnMiLCJvRGF0YUxpc3RCaW5kaW5nIiwiRXh0ZXJuYWwiLCJvRGF0YU1vZGVsIiwiYmluZExpc3QiLCJTeW5jIiwiY3JlYXRlQXRFbmQiLCJyZXNvbHZlZENyZWF0aW9uTW9kZSIsImdldFJvdXRlclByb3h5IiwicmVtb3ZlSUFwcFN0YXRlS2V5Iiwic2luZ2xlRHJhZnRGb3JDcmVhdGUiLCJnZXRNYW5pZmVzdCIsImFwcCIsImdldFJvb3RCaW5kaW5nIiwibmV3QmluZGluZyIsImdldENvbnRleHQiLCJTb3J0ZXIiLCJGaWx0ZXIiLCJmaWx0ZXJzIiwicGF0aCIsIm9wZXJhdG9yIiwidmFsdWUxIiwiYW5kIiwicmVxdWVzdENvbnRleHRzIiwidGhlbiIsImRlc3Ryb3kiLCJfaGFuZGxlQ3JlYXRpb25Nb2RlIiwiY3JlYXRlRXh0ZXJuYWxEb2N1bWVudCIsIm91dGJvdW5kIiwiY3JlYXRlRGVmZXJyZWREb2N1bWVudCIsIkNyZWF0aW9uUm93IiwiY3JlYXRpb25Sb3ciLCJjcmVhdGVDcmVhdGVSb3dEb2N1bWVudCIsInNraXBTaWRlRWZmZWN0cyIsIklubGluZSIsImNyZWF0ZUlubGluZURvY3VtZW50IiwidGFibGVJZCIsImNyZWF0ZVN5bmNBc3luY0RvY3VtZW50IiwiYkZyb21EZWZlcnJlZCIsImNyZWF0ZUFjdGlvbiIsInBvc3REb2N1bWVudENyZWF0aW9uIiwicHJlcmVxdWlzaXRlIiwicGFyYW1zIiwib25BZnRlckNyZWF0ZSIsIm1ldGFDb250ZXh0Iiwic3RhcnRpbmdFbnRpdHlTZXQiLCJnZXRJbnRlcm5hbE1vZGVsIiwic2V0UHJvcGVydHkiLCJmb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCIsInNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZSIsIkNyZWF0ZSIsImlzRHJhZnRSb290IiwiY29sbGFib3JhdGl2ZURyYWZ0IiwiaXNDb25uZWN0ZWQiLCJhcHBDb21wb25lbnQiLCJuYXZpZ2F0aW9uIiwiY3JlYXRpb25Sb3dDb250ZXh0IiwiZG9jdW1lbnRWYWxpZGF0aW9uIiwiZ2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24iLCJlbnRpdHlUeXBlIiwiY3JlYXRpb25Sb3dQYXlsb2FkIiwiX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyIsImNyZWF0aW9uIiwic2Nyb2xsVG9JbmRleCIsImdldExlbmd0aCIsImhhbmRsZUNyZWF0ZUV2ZW50cyIsIk9iamVjdCIsImFzc2lnbiIsImtleXMiLCJwcm9wZXJ0eVBhdGgiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImZpbmRJbmRleCIsInByb3BlcnR5IiwibmFtZSIsIm1hcCIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJidXN5TW9kZSIsImJ1c3lJZCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImFubm90YXRpb24iLCJpZCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwib25CZWZvcmVDcmVhdGUiLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiZ2V0U3RhcnR1cE1vZGUiLCJBdXRvQ3JlYXRlIiwiY3JlYXRpb25Sb3dMaXN0QmluZGluZyIsIm5ld1RyYW5zaWVudENvbnRleHQiLCJjcmVhdGUiLCJzZXRCaW5kaW5nQ29udGV4dCIsImNhdGNoIiwidHJhY2UiLCJkZWxldGUiLCJpc0xvY2tlZCIsImFsbCIsImFsbEN1cnJlbnRDb250ZXh0cyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImNvbnRleHRJbmRleCIsImluZGV4T2YiLCJmb2N1c1JvdyIsInBhcmVudEluZGV4IiwiZ2V0SW50ZXJuYWxSb3V0aW5nIiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMiLCJtb2RlIiwicm91dGluZ0xpc3RlbmVyIiwiY3JlYXRlQ29udGV4dFByb21pc2UiLCJjb3JlUmVzb3VyY2VCdW5kbGUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJnZXRUZXh0IiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIm5hdlBhcmFtZXRlcnMiLCJ0cmFuc2llbnQiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIkNyZWF0aW9uRmFpbGVkIiwiT25CZWZvcmVDcmVhdGVGYWlsZWQiLCJpbmNsdWRlcyIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsImNvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyIiwiY3JlYXRlUGF0aCIsImdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyIsIl9pbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJ2YWxpZGF0ZURvY3VtZW50IiwiY3JlYXRpb25Sb3dPYmplY3RzIiwiY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMiLCJkYXRhRm9yQ3JlYXRlIiwiaXNGcm9tQ29weVBhc3RlIiwiY3JlYXRlQXNJbmFjdGl2ZSIsInRhcmdldExpc3RCaW5kaW5nIiwiY29udGV4dFBhdGgiLCJtZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiY3JlYXRpb25Qcm9taXNlcyIsInByb3BlcnR5VmFsdWVzIiwiY3JlYXRlUGFyYW1ldGVycyIsImluYWN0aXZlIiwiJGtpbmQiLCJjcmVhdGVkQ29udGV4dHMiLCJhY3RpdmVDb250ZXh0cyIsImVyciIsIl9tUGFyYW1ldGVycyIsIm9uQmVmb3JlU2F2ZSIsIm9uQmVmb3JlRGlzY2FyZCIsIm9uQWZ0ZXJTYXZlIiwib25BZnRlckRpc2NhcmQiLCJzYXZlRG9jdW1lbnQiLCJvQ29udGV4dCIsIm1QYXJhbWV0ZXJzIiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJhQmluZGluZ3MiLCJiaW5kaW5ncyIsIm1lcmdlUGF0Y2hEcmFmdCIsIl9zdWJtaXRPcGVuQ2hhbmdlcyIsInJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiIsImNoZWNrUmVjb21tZW5kYXRpb25PcHRpb24iLCJzUHJvZ3JhbW1pbmdNb2RlbCIsImlzRmNsRW5hYmxlZCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiYWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiX2dldFJlc291cmNlTW9kZWwiLCJnZXRDcmVhdGlvbk1vZGUiLCJfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsIkFjdGl2YXRlIiwiZGlzY29ubmVjdCIsIl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsIlN0YW5kYXJkQWN0aW9ucyIsInNhdmUiLCJUcmlnZ2VyVHlwZSIsInN0YW5kYXJkQWN0aW9uIiwiRGlzcGxheSIsInN0b3JlRGF0YUZvclRlbGVtZXRyeSIsIl9jcmVhdGVTaWJsaW5nSW5mbyIsInByZXZpb3VzU2VtYW50aWNQYXRoIiwibmV3U2VtYW50aWNQYXRoIiwicGF0aE1hcHBpbmciLCJvbGRQYXRoIiwibmV3UGF0aCIsInRhcmdldENvbnRleHQiLCJvRXJyb3IiLCJjYW5jZWxlZCIsInRvZ2dsZURyYWZ0QWN0aXZlIiwib0NvbnRleHREYXRhIiwiYklzRHJhZnQiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsIm9SaWdodG1vc3RDb250ZXh0IiwibGFzdFNlbWFudGljTWFwcGluZyIsInRlY2huaWNhbFBhdGgiLCJ0YXJnZXRQYXRoIiwiY2FuY2VsRG9jdW1lbnQiLCJpc05ld0RvY3VtZW50IiwiY2FuY2VsUGFyYW1ldGVycyIsInNraXBEaXNjYXJkUG9wb3ZlciIsImNhbmNlbEJ1dHRvbiIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiY2FuY2VsUmVzdWx0IiwiaXNEb2N1bWVudE1vZGlmaWVkIiwiZ2V0SW5zdGFuY2VkVmlld3MiLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyIsInNraXBCaW5kaW5nVG9WaWV3Iiwic2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsInNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsImRlbGV0ZURvY3VtZW50Iiwib0FwcENvbXBvbmVudCIsImdldEluZGV4Iiwic2libGluZ0NvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsImRyYWZ0UGF0aCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiZHJhZnRDb250ZXh0VG9SZW1vdmUiLCJyZXBsYWNlV2l0aCIsImNvbnRleHRCaW5kaW5nIiwicGFyZW50TGlzdEJpbmRpbmciLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJEZWVwbGluayIsImV4aXRGcm9tQXBwIiwiYXBwbHlEb2N1bWVudCIsIm9Mb2NrT2JqZWN0IiwiY2hlY2tJZlJlY29tbWVuZGF0aW9uc0V4aXN0IiwiaXNDb250aW51ZSIsInNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nIiwiUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiIsIkNvbnRpbnVlIiwiaW52b2tlQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJtRXh0cmFQYXJhbXMiLCJhUGFydHMiLCJzT3ZlcmxvYWRFbnRpdHlUeXBlIiwib0N1cnJlbnRBY3Rpb25DYWxsQmFja3MiLCJvVmlldyIsIkFycmF5IiwiaXNBcnJheSIsImlzTmF2aWdhYmxlIiwicmVxdWlyZXNOYXZpZ2F0aW9uIiwiY29udmVydGVkTWV0YWRhdGEiLCJjb252ZXJ0VHlwZXMiLCJlbnRpdHlDb250YWluZXIiLCJpc0JvdW5kIiwib0NvbnRyb2wiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImlnbm9yZUVUYWciLCJzcGxpdCIsInJlcGxhY2VBbGwiLCJiU3RhdGljQWN0aW9uIiwiaXNUYWJsZUJvdW5kIiwic0JpbmRpbmdQYXRoIiwib0xpc3RCaW5kaW5nIiwiX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgiLCJlbmFibGVBdXRvU2Nyb2xsIiwiY3JlYXRlQWN0aW9uUHJvbWlzZSIsImdldElkIiwiYkdldEJvdW5kQ29udGV4dCIsIl9nZXRCb3VuZENvbnRleHQiLCJiT2JqZWN0UGFnZSIsImNvbnZlcnRlclR5cGUiLCJvUmVzcG9uc2UiLCJjYWxsQWN0aW9uIiwibGlzdFJlZnJlc2hlZCIsIl9yZWZyZXNoTGlzdElmUmVxdWlyZWQiLCJnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzIiwiYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyIsInZhbHVlIiwiQWN0aW9uIiwiYWN0aW9uIiwiZlJlc29sdmVyIiwidkNvbnRleHQiLCJvTWV0YU1vZGVsIiwic0NvbnRleHRNZXRhUGF0aCIsIl9mblZhbGlkQ29udGV4dHMiLCJhcHBsaWNhYmxlQ29udGV4dHMiLCJlbGVtZW50Iiwib0FjdGlvbkNvbnRleHQiLCJzQWN0aW9uQ29udGV4dE1ldGFQYXRoIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJyZXR1cm5Db250ZXh0IiwiaW5mbyIsIm9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24iLCJmUmVqZWN0b3IiLCJlcnJQcm9taXNlIiwicmVqZWN0ZWRJdGVtcyIsIl9hY3Rpb25OYW1lIiwic2VjdXJlZEV4ZWN1dGlvbiIsImZuRnVuY3Rpb24iLCJiQnVzeVNldCIsImJ1c3kiLCJzZXQiLCJiQnVzeUNoZWNrIiwiY2hlY2siLCJiVXBkYXRlc0RvY3VtZW50IiwidXBkYXRlc0RvY3VtZW50IiwiZmluYWxseSIsImhhbmRsZVBhdGNoU2VudCIsIm9FdmVudCIsImludGVybmFsQ29udGV4dCIsImdldFNvdXJjZSIsInNldElnbm9yZUVUYWciLCJzb3VyY2VCaW5kaW5nIiwib1BhdGNoUHJvbWlzZSIsInBhdGNoQ29tcGxldGVkRXZlbnQiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2giLCJiU3VjY2VzcyIsImdldFBhcmFtZXRlciIsImhhbmRsZUNyZWF0ZVNlbnQiLCJldmVudCIsIm5ld1Rhc2siLCJkZWJ1ZyIsImNvbXB1dGVFZGl0TW9kZSIsImdsb2JhbE1vZGVsIiwiaXNBY3RpdmVFbnRpdHkiLCJyZXF1ZXN0T2JqZWN0IiwiaGFzQWN0aXZlRW50aXR5IiwibGFzdEludm9rZWRBY3Rpb25OYW1lIiwiaXNOZXdBY3Rpb25Gb3JTdGlja3kiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJnZXRSZXNvdXJjZU1vZGVsIiwiVHJhbnNhY3Rpb25IZWxwZXIiLCJtZXNzYWdlSGFuZGxlciIsInNldENyZWF0aW9uTW9kZSIsImJDcmVhdGlvbk1vZGUiLCJ1aU1vZGVsQ29udGV4dCIsIlVpTW9kZWxDb25zdGFudHMiLCJDcmVhdGVNb2RlIiwiRG9jdW1lbnRNb2RpZmllZCIsIm1vZGlmaWVkIiwiYmluZGluZyIsImF0dGFjaEV2ZW50Iiwic3VjY2VzcyIsImRyYWZ0U3RhdHVzIiwic291cmNlIiwiZWRpdE1vZGUiLCJpc0NyZWF0aW9uIiwiZm9yY2VkIiwic2hhbGxGb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCIsImFjdGlvbk5hbWUiLCJzdGlja3lTZXNzaW9uIiwiQWRkaXRpb25hbE5ld0FjdGlvbnMiLCJoYXNOYXZpZ2F0aW9uR3VhcmQiLCJoYXNoVHJhY2tlciIsImdldEhhc2giLCJpbnRlcm5hbE1vZGVsIiwic2V0VGltZW91dCIsInNldE5hdmlnYXRpb25HdWFyZCIsInN1YnN0cmluZyIsIm9uQmFja05hdmlnYXRpb25JblNlc3Npb24iLCJiaW5kIiwiZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24iLCJnZXREaXJ0eVN0YXRlUHJvdmlkZXIiLCJyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImkxOG5Nb2RlbCIsInNlc3Npb25UaW1lb3V0RnVuY3Rpb24iLCJnZXRTZXNzaW9uVGltZW91dEZ1bmN0aW9uIiwiYXR0YWNoU2Vzc2lvblRpbWVvdXQiLCJzdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24iLCJnZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbiIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsImhhbmRsZVN0aWNreU9mZiIsImRpc2NhcmROYXZpZ2F0aW9uR3VhcmQiLCJkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIiwiZGV0YWNoU2Vzc2lvblRpbWVvdXQiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJnZXRIdHRwSGVhZGVycyIsIm5hdmlnYXRpb25Db250ZXh0IiwidGFyZ2V0SGFzaCIsImlubmVyQXBwUm91dGUiLCJyb3V0ZXJQcm94eSIsImxjbEhhc2hUcmFja2VyIiwiaXNEaXJ0eSIsImlzU2Vzc2lvbk9uIiwiaXNOYXZpZ2F0aW9uRmluYWxpemVkIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsInNldERpcnR5RmxhZyIsIndhcm5pbmdEaWFsb2ciLCJEaWFsb2ciLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJwcmVzcyIsImFmdGVyQ2xvc2UiLCJhZGRTdHlsZUNsYXNzIiwic2V0TW9kZWwiLCJhZGREZXBlbmRlbnQiLCJvcGVuIiwiY3VycmVudEhhc2giLCJkaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImNsZWFyU2Vzc2lvbkNvbnRleHQiLCJkaXNjYXJkZWRDb250ZXh0Iiwic3RpY2t5IiwiZGlzY2FyZERvY3VtZW50IiwicmVzZXRDaGFuZ2VzIiwiX3JvdXRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJnZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwicmVzb2x2ZUZ1bmN0aW9uIiwicmVqZWN0RnVuY3Rpb24iLCJhY3Rpb25Qcm9taXNlIiwicmVzcG9uc2UiLCJjdXJyZW50VmlldyIsIm1ldGFNb2RlbERhdGEiLCJtZXRhTW9kZWxBY3Rpb24iLCJhY3Rpb25SZXR1cm5UeXBlIiwiJFJldHVyblR5cGUiLCIkVHlwZSIsIiRLZXkiLCJvRGF0YSIsImdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJpc1NhdmUiLCJjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nIiwiQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2siLCJfc2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93Iiwicm93QmluZGluZyIsImFjdGl2ZVJvd0luZGV4IiwiZ2V0Q291bnQiLCJhbGxSb3dDb250ZXh0cyIsImdldENvbnRleHRzIiwiaW5kZXgiLCJzaW5nbGVDb250ZXh0IiwiY3JlYXRlRW1wdHlSb3dzQW5kRm9jdXMiLCJpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlIiwicmVsYXRlZENvbnRleHRzIiwidHJpZ2dlcmVkQWN0aW9uTmFtZSIsInJlZnJlc2hMaXN0QmluZGluZyIsInNlbmQiLCJ0cmlnZ2VyVHlwZSIsInRyaWdnZXJDb25maWd1cmVkU3VydmV5Iiwib01vZGVsIiwib1JlcXVlc3RvciIsIndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMiLCJjaGVja0lmQmFja0lzT3V0T2ZHdWFyZCIsInByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbiIsImhpc3RvcnkiLCJiYWNrIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwZXJzaXN0T1BTY3JvbGwiLCJyZWFzb24iLCJOYXZpZ2F0aW9uUmVhc29uIiwiRWRpdEZsb3dBY3Rpb24iLCJzaG93UGxhY2Vob2xkZXIiLCJrZWVwQ3VycmVudExheW91dCIsImJSZWZyZXNoQWZ0ZXJBY3Rpb24iLCJzVmlld0lkIiwiYU1lc3NhZ2VzIiwidmFsaWRhdGlvbiIsImdldENvbnRyb2xJZCIsIm9CaW5kaW5nIiwiYUtleXMiLCJvQ3VycmVudERhdGEiLCJiUmV0dXJuZWRDb250ZXh0SXNTYW1lIiwiZXZlcnkiLCJzS2V5IiwiZSIsInNFbnRpdHlTZXROYW1lIiwiYVNlbWFudGljS2V5cyIsImFSZXF1ZXN0UHJvbWlzZXMiLCJvS2V5IiwiJFByb3BlcnR5UGF0aCIsIm92ZXJsb2FkRW50aXR5VHlwZSIsImNvbnRleHRTZWdtZW50cyIsImN1cnJlbnRDb250ZXh0IiwicG9wIiwidW5zaGlmdCIsInBhcmVudENvbnRleHRzIiwicGF0aFNlZ21lbnQiLCJyZXZlcnNlIiwib3ZlcmxvYWRDb250ZXh0IiwiZmluZCIsIm1hcHBpbmdzIiwic2V0UGF0aE1hcHBpbmciLCJyb290Q3VycmVudENvbnRleHQiLCJyaWdodG1vc3RDdXJyZW50Q29udGV4dCIsImRvTm90Q29tcHV0ZUlmUm9vdCIsInN0YXJ0c1dpdGgiLCJyaWdodE1vc3RDb250ZXh0VG9Vc2UiLCJkcmFmdCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJCYXNlQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCYXNlQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQmFzZUNvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIFRyaWdnZXJUeXBlLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHsgaG9va2FibGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSG9va1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEludGVybmFsUm91dGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgQ3VzdG9tTWVzc2FnZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgQWN0aXZpdHksIHNoYXJlT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBDYW5jZWxQYXJhbWV0ZXJzLCBDcmVhdGVQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycywgUm9vdENvbnRleHRJbmZvLCBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IERyYWZ0U2libGluZ1BhaXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9EZWxldGVIZWxwZXJcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgRmNsQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvRmNsLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L1Jvb3RWaWV3QmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzLCBTZW1hbnRpY01hcHBpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgY29yZUxpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ3JlYXRpb25Sb3cgZnJvbSBcInNhcC91aS9tZGMvdGFibGUvQ3JlYXRpb25Sb3dcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgU29ydGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvU29ydGVyXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIENvbnRleHQsIGRlZmF1bHQgYXMgT0RhdGFWNENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFDb250ZXh0QmluZGluZyRQYXRjaFNlbnRFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEVudGl0eVR5cGUgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwiLi4vQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHtcblx0Q29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2ssXG5cdFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb25cbn0gZnJvbSBcIi4uL2NvbnRyb2xzL1JlY29tbWVuZGF0aW9ucy9Db25maXJtUmVjb21tZW5kYXRpb25EaWFsb2cuYmxvY2tcIjtcbmltcG9ydCB0eXBlIHsgQmFzZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgTmF2aWdhdGlvblJlYXNvbiBmcm9tIFwiLi9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZSxcblx0UHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsLFxuXHRDb25zdGFudHMgPSBGRUxpYnJhcnkuQ29uc3RhbnRzLFxuXHREcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cyxcblx0RWRpdE1vZGUgPSBGRUxpYnJhcnkuRWRpdE1vZGUsXG5cdFN0YXJ0dXBNb2RlID0gRkVMaWJyYXJ5LlN0YXJ0dXBNb2RlLFxuXHRNZXNzYWdlVHlwZSA9IGNvcmVMaWJyYXJ5Lk1lc3NhZ2VUeXBlO1xuXG50eXBlIFNhdmVEb2N1bWVudFBhcmFtZXRlcnMgPSB7XG5cdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yPzogYm9vbGVhbjtcblx0bWVyZ2VQYXRjaERyYWZ0PzogYm9vbGVhbjtcblx0YmluZGluZ3M/OiBPRGF0YUxpc3RCaW5kaW5nW107XG59O1xuXG50eXBlIEludGVybmFsQ3JlYXRlUGFyYW1ldGVycyA9IHtcblx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRkYXRhPzogb2JqZWN0O1xuXHR0YWJsZUlkPzogc3RyaW5nO1xuXHRvdXRib3VuZD86IHN0cmluZztcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xufTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIEJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIGRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzZXNzaW9uVGltZW91dEZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24/OiBGdW5jdGlvbjtcblxuXHRwcml2YXRlIHN5bmNUYXNrczogUHJvbWlzZTx1bmtub3duPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdHByaXZhdGUgYWN0aW9uUHJvbWlzZT86IFByb21pc2U8eyBjb250cm9sSWQ/OiBzdHJpbmc7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfT47XG5cblx0cHJpdmF0ZSBjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nPzogQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2s7XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHVibGljIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHRnZXRJbnRlcmZhY2UoKTogQmFzZU9iamVjdCB7XG5cdFx0cmV0dXJuIHN1cGVyLmdldEludGVyZmFjZSgpO1xuXHR9XG5cblx0Z2V0QXBwQ29tcG9uZW50KCk6IEFwcENvbXBvbmVudCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZm9yIHRoZSBleGlzdGluZyBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGF2YWlsYWJsZSB3aXRoIHRoZSBlZGl0YWJsZSBjb250ZXh0XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGVkaXREb2N1bWVudChjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHZvaWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCB2aWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3M7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRsZXQgcm9vdENvbnRleHQ6IENvbnRleHQgPSBjb250ZXh0O1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IGdyb3VwSWQgPSBcImVkaXRHcm91cFwiO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoKHZpZXdEYXRhPy52aWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDEpIHtcblx0XHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgfHwgcHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRyb290Q29udGV4dCA9IChhd2FpdCBDb21tb25VdGlscy5jcmVhdGVSb290Q29udGV4dChwcm9ncmFtbWluZ01vZGVsLCB2aWV3LCB0aGlzLmdldEFwcENvbXBvbmVudCgpKSkgYXMgQ29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRWRpdCh7IGNvbnRleHQ6IHJvb3RDb250ZXh0IH0pO1xuXG5cdFx0XHRsZXQgcmlnaHRtb3N0Q29udGV4dCA9IHRoaXMuX2lzRmNsRW5hYmxlZCgpID8gKHJvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBjb250ZXh0O1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRyaWdodG1vc3RDb250ZXh0ID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0KHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHJpZ2h0bW9zdENvbnRleHQpICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIHdlIGNoZWNrIHRoZSByaWdodG1vc3RDb250ZXh0IGNhbiBiZSB1c2VkIGluIGRyYWZ0XG5cdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQgPSBjb250ZXh0O1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZSA9IHRyYW5zYWN0aW9uSGVscGVyLmVkaXREb2N1bWVudChcblx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdHRoaXMuYmFzZS5nZXRWaWV3KCksXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0Z3JvdXBJZFxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJvb3RDb250ZXh0SW5mbyA9IHtcblx0XHRcdFx0cm9vdFNpYmxpbmdQYXRoUHJvbWlzZTogbmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZVxuXHRcdFx0fTtcblx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbCwgbW9kZWwpO1xuXG5cdFx0XHRsZXQgc2libGluZ0luZm9Qcm9taXNlO1xuXHRcdFx0Ly8gcmlnaHRtb3N0Q29udGV4dCA9PT0gcm9vdENvbnRleHQgPT4gd2UncmUgaW4gT1AuIElmIG5vdCwgd2UncmUgaW4gbXVsdGktY29sdW1uIGxheW91dCBvZiBGQ0xcblx0XHRcdGNvbnN0IGNvbXB1dGVTaWJsaW5nSW5mbyA9IHJpZ2h0bW9zdENvbnRleHQgIT09IHJvb3RDb250ZXh0IHx8ICh2aWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxO1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbykge1xuXHRcdFx0XHRzaWJsaW5nSW5mb1Byb21pc2UgPSB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQsXG5cdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0SW5mbyxcblx0XHRcdFx0XHRncm91cElkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRjb250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goZ3JvdXBJZCk7XG5cblx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHNpYmxpbmdJbmZvUHJvbWlzZTtcblx0XHRcdGNvbnN0IG5ld0RvY3VtZW50Q29udGV4dCA9IChhd2FpdCBuZXdEb2N1bWVudENvbnRleHRQcm9taXNlKSBhcyBDb250ZXh0O1xuXHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlOiBDb250ZXh0IHwgdW5kZWZpbmVkID0gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbykge1xuXHRcdFx0XHRpZiAoc2libGluZ0luZm8gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCxcblx0XHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0cm9vdENvbnRleHRJbmZvLFxuXHRcdFx0XHRcdFx0XCIkYXV0b1wiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHRoaXMuX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0KGNvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dCwgc2libGluZ0luZm8pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3RvcnkoW10pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cblx0XHRcdFx0aWYgKG5ld0RvY3VtZW50Q29udGV4dCAhPT0gcm9vdENvbnRleHQpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckVkaXQoeyBjb250ZXh0OiBjb250ZXh0VG9OYXZpZ2F0ZSB9KTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlIGFzIENvbnRleHQsIHtcblx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0cmVjcmVhdGVDb250ZXh0OiBmYWxzZSxcblx0XHRcdFx0XHRcdGZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBzdGlja3lPbiBoYW5kbGVyIG11c3QgYmUgc2V0IGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIGRvbmUsXG5cdFx0XHRcdFx0XHQvLyBhcyB0aGUgVVJMIG1heSBjaGFuZ2UgaW4gdGhlIGNhc2Ugb2YgRkNMXG5cdFx0XHRcdFx0XHRsZXQgc3RpY2t5Q29udGV4dDogQ29udGV4dDtcblx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIHVzZSB0aGUga2VwdC1hbGl2ZSBjb250ZXh0IHVzZWQgdG8gYmluZCB0aGUgcGFnZVxuXHRcdFx0XHRcdFx0XHRzdGlja3lDb250ZXh0ID0gbmV3RG9jdW1lbnRDb250ZXh0Py5nZXRNb2RlbCgpLmdldEtlZXBBbGl2ZUNvbnRleHQobmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzdGlja3lDb250ZXh0ID0gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPbihzdGlja3lDb250ZXh0KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1vZGVsLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHRcdFx0Ly8gYWNjb3JkaW5nIHRvIFVYIGluIGNhc2Ugb2YgZW5hYmxlZCBjb2xsYWJvcmF0aW9uIGRyYWZ0IHdlIHNoYXJlIHRoZSBvYmplY3QgaW1tZWRpYXRlbHlcblx0XHRcdFx0XHRcdGF3YWl0IHNoYXJlT2JqZWN0KG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBjb250ZXh0VG9OYXZpZ2F0ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBlZGl0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIHNpZGUgZWZmZWN0cyByZXF1aXJlZCBhZnRlciBkZWxldGluZyBhbiBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIHRoZSBkZWxldGVkIG9iamVjdCBiZWxvbmdzIHRvXG5cdCAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHBhcmVudCBvYmplY3Qgb2YgdGhlIGRlbGV0ZWQgb2JqZWN0XG5cdCAqL1xuXHRwcml2YXRlIHJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkLCBwYXJlbnRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0aWYgKCFsaXN0QmluZGluZyB8fCAhcGFyZW50Q29udGV4dCB8fCBDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBzaWRlRWZmZWN0U2VydmljZSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0c2lkZUVmZmVjdFNlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgcGFyZW50Q29udGV4dCk7XG5cblx0XHRjb25zdCBzdGF0ZU1lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChsaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLCBwYXJlbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0Ly8gSW4gY2FzZSBvZiBhIFRyZWVUYWJsZSwgd2UgbmVlZCB0byByZWZyZXNoIHN0YXRlIG1lc3NhZ2VzIGZvciB0aGUgT2JqZWN0UGFnZSwgYXMgc29tZSBvZiB0aGVzZSBtZXNzYWdlcyBtaWdodCBiZSBhdHRhY2hlZFxuXHRcdC8vIHRvIGNoaWxkcmVuIG9mIGEgZGVsZXRlZCByb3cgd2hpY2ggbWF5IG5vdCBoYXZlIGJlZW4gbG9hZGVkIHlldCwgYW5kIHRoZXJlZm9yZSB0aGUgbW9kZWwgd291bGRuJ3QgY2xlYW4gdXAgdGhlc2UgbWVzc2FnZXNcblx0XHRpZiAoc3RhdGVNZXNzYWdlc1BhdGggJiYgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRzaWRlRWZmZWN0U2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3N0YXRlTWVzc2FnZXNQYXRoXSwgcGFyZW50Q29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgc2V2ZXJhbCBkb2N1bWVudHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0c1RvRGVsZXRlIFRoZSBjb250ZXh0cyBvZiB0aGUgZG9jdW1lbnRzIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2tcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5ub0RpYWxvZ1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50cyBhcmUgZGVsZXRlZFxuXHQgKi9cblx0YXN5bmMgZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0Y29udGV4dHNUb0RlbGV0ZTogQ29udGV4dFtdLFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0Y29udHJvbElkOiBzdHJpbmc7XG5cdFx0XHRub0RpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM/OiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGU7XG5cdFx0cGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgPSBwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2U7XG5cblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgcGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpID8/IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdGxldCBpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGU6IENvbnRleHRbXSA9IFtdO1xuXHRcdGlmIChwYXJlbnRDb250cm9sPy5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0aW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlID0gY29udGV4dHNUb0RlbGV0ZS5maWx0ZXIoKGNvbnRleHQpID0+IGNvbnRleHQuaXNJbmFjdGl2ZSgpKTtcblx0XHR9XG5cdFx0aWYgKCFwYXJlbnRDb250cm9sKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXIgY29udHJvbElkIG1pc3Npbmcgb3IgaW5jb3JyZWN0XCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSBwYXJlbnRDb250cm9sIGFzIENvbnRyb2w7XG5cdFx0fVxuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gKHBhcmVudENvbnRyb2wuZ2V0QmluZGluZyhcIml0ZW1zXCIpIHx8IChwYXJlbnRDb250cm9sIGFzIFRhYmxlKS5nZXRSb3dCaW5kaW5nKCkpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0cGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gdHJ1ZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChwYXJhbWV0ZXJzPy5zZWxlY3RlZENvbnRleHRzPy5bMF0gPz8gY29udGV4dHNUb0RlbGV0ZVswXSkgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihjb250ZXh0c1RvRGVsZXRlLCBwYXJhbWV0ZXJzKTtcblxuXHRcdFx0bGV0IHJlc3VsdDtcblxuXHRcdFx0Ly8gTXVsdGlwbGUgb2JqZWN0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGEgbGlzdFxuXHRcdFx0Ly8gRmlyc3QgY2xlYXIgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGFibGUgYXMgaXQncyBub3QgdmFsaWQgYW55IG1vcmVcblx0XHRcdGlmIChwYXJlbnRDb250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdHBhcmVudENvbnRyb2wuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhlbiByZWZyZXNoIHRoZSBsaXN0LWJpbmRpbmcgKExSKSwgb3IgcmVxdWlyZSBzaWRlLWVmZmVjdHMgKE9QKVxuXHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0aWYgKGxpc3RCaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdC8vIGtlZXAgcHJvbWlzZSBjaGFpbiBwZW5kaW5nIHVudGlsIHJlZnJlc2ggb2YgbGlzdGJpbmRpbmcgaXMgY29tcGxldGVkXG5cdFx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHQvLyBXZSB1c2UgYSBzaWRlLWVmZmVjdCByZWZyZXNoIGZvciBhIFRyZWVUYWJsZSwgdG8gcHJlc2VydmUgZXhwYW5zaW9uIHN0YXRlc1xuXHRcdFx0XHRcdHJlc3VsdCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogXCJcIiB9XSwgbGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpISk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzdWx0ID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdGxpc3RCaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGxpc3RCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGxpc3RCaW5kaW5nLCB2aWV3QmluZGluZ0NvbnRleHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBkZWxldGluZyBhdCBsZWFzdCBvbmUgb2JqZWN0IHNob3VsZCBhbHNvIHNldCB0aGUgVUkgdG8gZGlydHlcblx0XHRcdGlmICghdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCA9IHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQoKTtcblx0XHRcdC8vIFdlIGNsZWFyIHJlY29tbWVuZGF0aW9uIGRhdGEgYW5kIGNvbnRleHRzIGZyb20gaW50ZXJuYWwgbW9kZWwgZm9yIHRoZSBkZWxldGVkIGNvbnRleHRzXG5cdFx0XHRpZiAoaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0dGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pZ25vcmVSZWNvbW1lbmRhdGlvbkZvckNvbnRleHRzKGNvbnRleHRzVG9EZWxldGUpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm90aWZ5IGNvbnN1bWVycyBvZiB3aGljaCBjb250ZXh0cyB3ZXJlIGRlbGV0ZWRcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGVsZXRlKHsgY29udGV4dHM6IGNvbnRleHRzVG9EZWxldGUgfSk7XG5cblx0XHRcdGlmIChwYXJlbnRDb250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdGNvbnN0IHRhYmxlQVBJID0gcGFyZW50Q29udHJvbC5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHRhYmxlQVBJPy50YWJsZURlZmluaXRpb24/LmNvbnRyb2w/LmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0XHRcdGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZS5sZW5ndGggPiAwXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHRhYmxlQVBJLnJlbW92ZUVtcHR5Um93c01lc3NhZ2VzKGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZSk7XG5cdFx0XHRcdFx0YXdhaXQgdGFibGVBUEkuc2V0VXBFbXB0eVJvd3MocGFyZW50Q29udHJvbCwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EZWxldGUsIGNvbnRleHRzVG9EZWxldGUpO1xuXG5cdFx0XHRyZXR1cm4gYXdhaXQgcmVzdWx0O1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnQocylcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgZGlzcGxheXMgdGhlIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBlcnJvcnMgZHVyaW5nIGFuIHVwZGF0ZS5cblx0ICpcblx0ICogQHBhcmFtIHVwZGF0ZWRDb250ZXh0IENvbnRleHQgb2YgdGhlIHVwZGF0ZWQgZmllbGRcblx0ICogQHBhcmFtIHVwZGF0ZVByb21pc2UgUHJvbWlzZSB0byBkZXRlcm1pbmUgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuIFRoZSBwcm9taXNlIHNob3VsZCBiZSByZXNvbHZlZCB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgc28gdGhlIGRyYWZ0IHN0YXR1cyBjYW4gYmUgdXBkYXRlZC5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRyYWZ0IHN0YXR1cyBoYXMgYmVlbiB1cGRhdGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHVwZGF0ZURvY3VtZW50KHVwZGF0ZWRDb250ZXh0OiBvYmplY3QsIHVwZGF0ZVByb21pc2U6IFByb21pc2U8dW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvcmlnaW5hbEJpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBpc0RyYWZ0ID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHVwZGF0ZWRDb250ZXh0IGFzIEJpbmRpbmcgfCBDb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzayhhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAob3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc0RyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHVwZGF0ZVByb21pc2U7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoIWlzRHJhZnQgfHwgIWN1cnJlbnRCaW5kaW5nQ29udGV4dCB8fCBjdXJyZW50QmluZGluZ0NvbnRleHQgIT09IG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBJZiBhIG5hdmlnYXRpb24gaGFwcGVuZWQgd2hpbGUgb1Byb21pc2Ugd2FzIGJlaW5nIHJlc29sdmVkLCB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGNoYW5nZWRcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSdyZSBzdGlsbCBvbiB0aGUgc2FtZSBjb250ZXh0XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXROYW1lID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdFx0XHRjb25zdCBzZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMobWV0YU1vZGVsLCBlbnRpdHlTZXROYW1lKTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHNlbWFudGljS2V5cz8ubGVuZ3RoICYmXG5cdFx0XHRcdFx0Y3VycmVudEJpbmRpbmdDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlICYmIC8vIFdlIGRvbid0IHVzZSB0aGUgc2VtYW50aWMga2V5IGZvciBhIG5ldyBkb2N1bWVudCAoY3JlYXRpb24pXG5cdFx0XHRcdFx0Y3VycmVudEJpbmRpbmdDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpID09PSB0cnVlXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VtYW50aWNQYXRoID0gY3VycmVudFNlbWFudGljTWFwcGluZz8uc2VtYW50aWNQYXRoLFxuXHRcdFx0XHRcdFx0c0NoYW5nZWRQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKGN1cnJlbnRCaW5kaW5nQ29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0Ly8gY3VycmVudFNlbWFudGljUGF0aCBjb3VsZCBiZSBudWxsIGlmIHdlIGhhdmUgbmF2aWdhdGVkIHZpYSBkZWVwIGxpbmsgdGhlbiB0aGVyZSBhcmUgbm8gc2VtYW50aWNNYXBwaW5ncyB0byBjYWxjdWxhdGUgaXQgZnJvbVxuXHRcdFx0XHRcdGlmIChjdXJyZW50U2VtYW50aWNQYXRoICYmIGN1cnJlbnRTZW1hbnRpY1BhdGggIT09IHNDaGFuZ2VkUGF0aCkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjdXJyZW50QmluZGluZ0NvbnRleHQsIHsgZWRpdGFibGU6IHRydWUsIHJlY3JlYXRlQ29udGV4dDogZmFsc2UgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB1cGRhdGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0aWYgKGlzRHJhZnQgJiYgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGdldFBhcmVudENvbnRleHRGcm9tU2VsZWN0aW9uKHNlbGVjdGVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gfCB1bmRlZmluZWQpOiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHNlbGVjdGVkQ29udGV4dHMgJiYgc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHQvLyBPbmUgcGFyZW50IGF0IG1vc3QgISFcblx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBhIG5ldyBkb2N1bWVudCBpbiBhIFRyZWVUYWJsZSB3aXRoICR7c2VsZWN0ZWRDb250ZXh0cy5sZW5ndGh9IHBhcmVudHNgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc2VsZWN0ZWRDb250ZXh0cz8ubGVuZ3RoID09PSAxID8gc2VsZWN0ZWRDb250ZXh0c1swXSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyAqIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdC8vICogICAgICAgICAgICAgICAgICAgIFN5bmMgLSB0aGUgY3JlYXRpb24gaXMgdHJpZ2dlcmVkIGFuZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkLCB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdC8vICogICAgICAgICAgICAgICAgICAgIEFzeW5jIC0gdGhlIGNyZWF0aW9uIGFuZCB0aGUgbmF2aWdhdGlvbiB0byB0aGUgaW5zdGFuY2UgYXJlIGRvbmUgaW4gcGFyYWxsZWxcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWQgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBvbiB0aGUgdGFyZ2V0IHBhZ2Vcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25Sb3cgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgYXN5bmMgc28gdGhlIHVzZXIgaXMgbm90IGJsb2NrZWRcblx0Ly8gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgSW5zdGFuY2Ugb2YgdGhlIGNyZWF0aW9uIHJvdyAtIChUT0RPOiBnZXQgcmlkIGJ1dCB1c2UgbGlzdCBiaW5kaW5ncyBvbmx5KVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gdkxpc3RCaW5kaW5nICBPRGF0YUxpc3RCaW5kaW5nIG9iamVjdCBvciB0aGUgYmluZGluZyBwYXRoIGZvciBhIHRlbXBvcmFyeSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6PGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIE5ld1BhZ2UgLSB0aGUgY3JlYXRlZCBkb2N1bWVudCBpcyBzaG93biBpbiBhIG5ldyBwYWdlLCBkZXBlbmRpbmcgb24gd2hldGhlciBtZXRhZGF0YSAnU3luYycsICdBc3luYycgb3IgJ0RlZmVycmVkJyBpcyB1c2VkPGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIElubGluZSAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSAoaW4gYSB0YWJsZSk8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbiBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgdmlhIHRoZSBwYXJhbWV0ZXIgJ291dGJvdW5kJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy50YWJsZUlkIElEIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5vdXRib3VuZCBUaGUgbmF2aWdhdGlvbiB0YXJnZXQgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0V4dGVybmFsJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGVBdEVuZCBTcGVjaWZpZXMgaWYgdGhlIG5ldyBlbnRyeSBzaG91bGQgYmUgY3JlYXRlZCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiBhIHRhYmxlIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdJbmxpbmUnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRhdGEgVGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iRnJvbURlZmVycmVkIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYnVzeU1vZGUgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGlvblJvdyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzIFRoZSBjb250ZXh0cyB0aGF0IGFyZSBzZWxlY3RlZCBpbiB0aGUgdGFibGUgaW5pdGlhdGluZyB0aGUgY3JlYXRpb24uIFVzZWQgaW4gY2FzZSBvZiBhIFRyZWVUYWJsZSB0byBkZXRlcm1pbmUgdGhlIHBhcmVudCBjb250ZXh0IG9mIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNpbmdsZURyYWZ0Rm9yQ3JlYXRlIFdoZW4gZW5hYmxlZCwgYW4gZXh0cmEgcmVxdWVzdCBjaGVja3MgaWYgYW55IGRyYWZ0cyBleGlzdCB0aGF0IHdlcmUgbmV2ZXIgc2F2ZWQuIElmIHVuc2F2ZWQgZHJhZnRzIGFyZSBmb3VuZCwgdGhlIG5ld2VzdCBvbmUgaXMgb3BlbmVkLiBJZiBubyB1bnNhdmVkIGRyYWZ0cyBhcmUgZm91bmQsIGEgbmV3IGVudGl0eSBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY3JlYXRlRG9jdW1lbnQoXG5cdFx0dkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRiRnJvbURlZmVycmVkPzogYm9vbGVhbjtcblx0XHRcdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRcdFx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0Y3JlYXRpb25Sb3c/OiBDcmVhdGlvblJvdztcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0XHR0YWJsZUlkPzogc3RyaW5nO1xuXHRcdFx0b3V0Ym91bmQ/OiBzdHJpbmc7XG5cdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdHNpbmdsZURyYWZ0Rm9yQ3JlYXRlPzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBvRGF0YUxpc3RCaW5kaW5nITogT0RhdGFMaXN0QmluZGluZztcblx0XHRsZXQgcGFyZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cblx0XHRpZiAobUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5FeHRlcm5hbCkge1xuXHRcdFx0aWYgKHR5cGVvZiB2TGlzdEJpbmRpbmcgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Y29uc3Qgb0RhdGFNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0XHRcdGlmICghb0RhdGFNb2RlbCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nID0gb0RhdGFNb2RlbC5iaW5kTGlzdCh2TGlzdEJpbmRpbmcpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRcdG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLlN5bmM7XG5cdFx0XHRcdGRlbGV0ZSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kO1xuXHRcdFx0fSBlbHNlIGlmICh2TGlzdEJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IHZMaXN0QmluZGluZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgb2JqZWN0IG9yIHBhdGggZXhwZWN0ZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChvRGF0YUxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRwYXJlbnRDb250ZXh0ID0gdGhpcy5nZXRQYXJlbnRDb250ZXh0RnJvbVNlbGVjdGlvbihtSW5QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHJlc29sdmVkQ3JlYXRpb25Nb2RlID0gdGhpcy5yZXNvbHZlQ3JlYXRpb25Nb2RlKG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlLCBvRGF0YUxpc3RCaW5kaW5nLCBtSW5QYXJhbWV0ZXJzLmRhdGEpO1xuXG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpLnJlbW92ZUlBcHBTdGF0ZUtleSgpO1xuXG5cdFx0aWYgKFxuXHRcdFx0KG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGUgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGVcblx0XHRcdFx0OiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldE1hbmlmZXN0KClbXCJzYXAuZmVcIl0/LmFwcD8uc2luZ2xlRHJhZnRGb3JDcmVhdGUpICYmXG5cdFx0XHRvRGF0YUxpc3RCaW5kaW5nID09PSBvRGF0YUxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCkgJiZcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpICE9PSBudWxsXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBuZXdCaW5kaW5nID0gb0RhdGFMaXN0QmluZGluZy5nZXRNb2RlbCgpPy5iaW5kTGlzdChcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLFxuXHRcdFx0XHRuZXcgU29ydGVyKFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvTGFzdENoYW5nZURhdGVUaW1lXCIsIHRydWUpLFxuXHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRmaWx0ZXJzOiBbXG5cdFx0XHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdFx0cGF0aDogXCJJc0FjdGl2ZUVudGl0eVwiLFxuXHRcdFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTE6IGZhbHNlXG5cdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0XHRwYXRoOiBcIkhhc0FjdGl2ZUVudGl0eVwiLFxuXHRcdFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTE6IGZhbHNlXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0YW5kOiB0cnVlXG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3QmluZGluZz8ucmVxdWVzdENvbnRleHRzKDAsIDEpO1xuXHRcdFx0aWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KHJlc3VsdFswXSwgeyBlZGl0YWJsZTogdHJ1ZSwgcmVjcmVhdGVDb250ZXh0OiBmYWxzZSB9KS50aGVuKCgpID0+IG5ld0JpbmRpbmc/LmRlc3Ryb3koKSk7XG5cdFx0XHR9XG5cdFx0XHRuZXdCaW5kaW5nPy5kZXN0cm95KCk7XG5cdFx0XHRyZXR1cm4gdGhpcy5faGFuZGxlQ3JlYXRpb25Nb2RlKHJlc29sdmVkQ3JlYXRpb25Nb2RlLCB2TGlzdEJpbmRpbmcsIG1JblBhcmFtZXRlcnMsIG9EYXRhTGlzdEJpbmRpbmcsIHBhcmVudENvbnRleHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5faGFuZGxlQ3JlYXRpb25Nb2RlKHJlc29sdmVkQ3JlYXRpb25Nb2RlLCB2TGlzdEJpbmRpbmcsIG1JblBhcmFtZXRlcnMsIG9EYXRhTGlzdEJpbmRpbmcsIHBhcmVudENvbnRleHQpO1xuXHR9XG5cblx0YXN5bmMgX2hhbmRsZUNyZWF0aW9uTW9kZShcblx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZTogc3RyaW5nLFxuXHRcdHZMaXN0QmluZGluZzogc3RyaW5nIHwgT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJhbWV0ZXJzOiBJbnRlcm5hbENyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0b0RhdGFMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJlbnRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KFtdKTtcblx0XHRzd2l0Y2ggKHJlc29sdmVkQ3JlYXRpb25Nb2RlKSB7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5FeHRlcm5hbDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXh0ZXJuYWxEb2N1bWVudCh2TGlzdEJpbmRpbmcsIHBhcmFtZXRlcnMub3V0Ym91bmQpO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZURlZmVycmVkRG9jdW1lbnQob0RhdGFMaXN0QmluZGluZywgcGFyZW50Q29udGV4dCwgcGFyYW1ldGVycy5kYXRhKTtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93OlxuXHRcdFx0XHRyZXR1cm4gcGFyYW1ldGVycy5jcmVhdGlvblJvd1xuXHRcdFx0XHRcdD8gdGhpcy5jcmVhdGVDcmVhdGVSb3dEb2N1bWVudCh7XG5cdFx0XHRcdFx0XHRcdGNyZWF0aW9uUm93OiBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93LFxuXHRcdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZFxuXHRcdFx0XHRcdCAgfSlcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLklubGluZTpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlSW5saW5lRG9jdW1lbnQoXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dGFibGVJZDogcGFyYW1ldGVycy50YWJsZUlkLFxuXHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0cGFyZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHQpO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuU3luYzpcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkFzeW5jOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVTeW5jQXN5bmNEb2N1bWVudChcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjcmVhdGlvbk1vZGU6IHJlc29sdmVkQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0XHRcdFx0YkZyb21EZWZlcnJlZDogcGFyYW1ldGVycy5iRnJvbURlZmVycmVkLFxuXHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdGNyZWF0ZUFjdGlvbjogcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdCk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgJHtyZXNvbHZlZENyZWF0aW9uTW9kZX1gKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICpFeGVjdXRlcyB0aGUgbWFuZGF0b3J5IGNvbmZpZ3VyYXRpb24gYWZ0ZXIgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcmVyZXF1aXNpdGUgUHJvbWlzZSBvZiB0aGUgZG9jdW1lbnQgY3JlYXRpb24gYW5kIHRoZSBmb2xsb3dpbmcgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNvbmZpZ3VyYXRpb24gaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgcG9zdERvY3VtZW50Q3JlYXRpb24ocHJlcmVxdWlzaXRlOiBQcm9taXNlPFtDb250ZXh0LCB1bmtub3duXT4sIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGxpc3RCaW5kaW5nKTtcblx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgcGFyYW1zID0gYXdhaXQgcHJlcmVxdWlzaXRlO1xuXHRcdGNvbnN0IG5ld0RvY3VtZW50Q29udGV4dCA9IHBhcmFtc1swXTtcblx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWwsIG1vZGVsKTtcblx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckNyZWF0ZSh7IGNvbnRleHQ6IG5ld0RvY3VtZW50Q29udGV4dCB9KTtcblx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTsgLy8gVGhlIGNyZWF0ZU1vZGUgZmxhZyB3aWxsIGJlIHNldCBpbiBjb21wdXRlRWRpdE1vZGVcblx0XHRpZiAoIWxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdC8vIFdvcmthcm91bmQgdG8gdGVsbCB0aGUgT1AgdGhhdCB3ZSd2ZSBjcmVhdGVkIGEgbmV3IG9iamVjdCBmcm9tIHRoZSBMUlxuXHRcdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkuc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdFx0XHRjb25zdCBuZXdBY3Rpb24gPSBlbnRpdHlTZXQ/LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ/Lk5ld0FjdGlvbjtcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgbmV3QWN0aW9uKTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdC8vIENyZWF0aW5nIGEgbmV3IGl0ZW0gaW4gYSBoaWVyYXJjaHkgZnJvbSB0aGUgTGlzdFJlcG9ydCAoc2luY2UgdGhlIGxpc3RCaW5kaW5nIGlzIG5vdCByZWxhdGl2ZSlcblx0XHRcdFx0Ly8gLS0+IHdlIHdhbnQgdG8gZm9yY2UgdGhlIHVzZXIgdG8gZWl0aGVyIHNhdmUgb3IgZGlzY2FyZCB0aGUgZHJhZnQgYmVmb3JlIGxlYXZpbmcgdGhlIE9QXG5cdFx0XHRcdHRoaXMuZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChuZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKGxpc3RCaW5kaW5nKTtcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbC5nZXRNZXRhTW9kZWwoKSkgJiZcblx0XHRcdFx0dGhpcy5pc0RyYWZ0Um9vdChuZXdEb2N1bWVudENvbnRleHQpICYmXG5cdFx0XHRcdCF0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBhY2NvcmRpbmcgdG8gVVggaW4gY2FzZSBvZiBlbmFibGVkIGNvbGxhYm9yYXRpb24gZHJhZnQgd2Ugc2hhcmUgdGhlIG9iamVjdCBpbW1lZGlhdGVseVxuXHRcdFx0XHRhd2FpdCBzaGFyZU9iamVjdChuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IHZpYSB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmQuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93IFRoZSBjcmVhdGlvbiByb3dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQocGFyYW1ldGVyczoge1xuXHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRjcmVhdGlvblJvdzogQ3JlYXRpb25Sb3c7XG5cdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0fSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93O1xuXHRcdGNvbnN0IHRhYmxlID0gcGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRQYXJlbnQoKSBhcyBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRsZXQgbmF2aWdhdGlvbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdGlmICghdGFibGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YWJsZS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCBsaXN0QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgXCJDcmVhdGlvblJvd1wiIHdpdGggYSBUcmVlVGFibGVgKTtcblx0XHR9XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3dDb250ZXh0ID0gY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGNvbnN0IGRvY3VtZW50VmFsaWRhdGlvbiA9IHRoaXMuZ2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24odGFibGUpO1xuXHRcdC8vIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgaXMgc2V0IHRvIGZhbHNlIGluIG1hbmlmZXN0IGNvbnZlcnRlciAoVGFibGUudHMpIGlmIGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiBleGlzdHNcblx0XHRpZiAoY3JlYXRpb25Sb3cuZGF0YShcImRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGFcIikgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHR0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmFsaWRhdGlvbk1lc3NhZ2VzID0gYXdhaXQgdGhpcy5zeW5jVGFzayhkb2N1bWVudFZhbGlkYXRpb24pO1xuXHRcdGlmICh2YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy5jcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXModmFsaWRhdGlvbk1lc3NhZ2VzLCB0YWJsZSk7XG5cdFx0XHRMb2cuZXJyb3IoXCJDdXN0b20gVmFsaWRhdGlvbiBmYWlsZWRcIik7XG5cdFx0XHQvLyBpZiBjdXN0b20gdmFsaWRhdGlvbiBmYWlscywgd2UgbGVhdmUgdGhlIG1ldGhvZCBpbW1lZGlhdGVseVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBlbnRpdHlUeXBlID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjcmVhdGlvblJvd0NvbnRleHQuZ2V0UGF0aCgpKSkudGFyZ2V0RW50aXR5VHlwZTtcblx0XHRjb25zdCBjcmVhdGlvblJvd1BheWxvYWQgPSBjcmVhdGlvblJvd0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cblx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblxuXHRcdC8vbW92ZWQgYWZ0ZXIgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyB0byBhdm9pZCBcIidjcmVhdGlvbicgdXNlIGJlZm9yZSBpbml0aWFsaXphdGlvblwiIGNvbnNvbGUgZXJyb3JzXG5cdFx0Ly9hZnRlciB2YWxpZGF0aW9uIGVycm9ycyBvY2N1cnJlZFxuXHRcdGxpc3RCaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRhd2FpdCBjcmVhdGlvbjtcblx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgocGFyYW1ldGVycy5jcmVhdGVBdEVuZCA/IHRhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRMZW5ndGgoKSA6IDApO1xuXHRcdH0pO1xuXG5cdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMobGlzdEJpbmRpbmcpO1xuXG5cdFx0Y29uc3QgY3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogT2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHR7fSxcblx0XHRcdFx0XHQuLi5PYmplY3Qua2V5cyhjcmVhdGlvblJvd1BheWxvYWQpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKFxuXHRcdFx0XHRcdFx0XHQocHJvcGVydHlQYXRoOiBzdHJpbmcpID0+XG5cdFx0XHRcdFx0XHRcdFx0ZW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcy5maW5kSW5kZXgoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lID09PSBwcm9wZXJ0eVBhdGgpID09PSAtMVxuXHRcdFx0XHRcdFx0KSAvLyBlbnN1cmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgcGF5bG9hZCwgZGVlcCBjcmVhdGUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0Lm1hcCgocGF0aCkgPT4gKHsgW3BhdGhdOiBjcmVhdGlvblJvd1BheWxvYWRbcGF0aF0gfSkpXG5cdFx0XHRcdCksXG5cdFx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRidXN5TW9kZTogXCJMb2NhbFwiLCAvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdGJ1c3lJZDogKHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZCk/LmdldFRhYmxlRGVmaW5pdGlvbigpPy5hbm5vdGF0aW9uLmlkLFxuXHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZSxcblx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogYXBwQ29tcG9uZW50LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvd1xuXHRcdFx0fSxcblx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblx0XHQvLyBTaWRlRWZmZWN0cyBvbiBDcmVhdGVcblx0XHQvLyBpZiBTYXZlIGlzIHByZXNzZWQgZGlyZWN0bHkgYWZ0ZXIgZmlsbGluZyB0aGUgQ3JlYXRpb25Sb3csIG5vIFNpZGVFZmZlY3RzIHJlcXVlc3Rcblx0XHRpZiAoIXBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGNyZWF0aW9uUm93TGlzdEJpbmRpbmcgPSBjcmVhdGlvblJvd0NvbnRleHQuZ2V0QmluZGluZygpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBuZXdUcmFuc2llbnRDb250ZXh0ID0gY3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdGNyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG5ld1RyYW5zaWVudENvbnRleHQpO1xuXG5cdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0bmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCk/LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGZhc3QgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0fSk7XG5cdFx0XHRuYXZpZ2F0aW9uID0gY3JlYXRpb25Sb3dDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFJlc2V0IGJ1c3kgaW5kaWNhdG9yIGFmdGVyIGEgdmFsaWRhdGlvbiBlcnJvclxuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpO1xuXHRcdFx0fVxuXHRcdFx0TG9nLmVycm9yKFwiQ3JlYXRpb25Sb3cgbmF2aWdhdGlvbiBlcnJvcjogXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgbmF2aWdhdGlvbl0pLCBsaXN0QmluZGluZyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBpbmxpbmUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRhYmxlSWQgVGhlIGlkIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGFcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVJbmxpbmVEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0fSxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgdGFibGU6IFRhYmxlIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChwYXJhbWV0ZXJzLnRhYmxlSWQpIHtcblx0XHRcdHRhYmxlID0gdGhpcy5nZXRWaWV3KCkuYnlJZChwYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlO1xuXHRcdH1cblx0XHRpZiAodGFibGU/LmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0YWJsZS5nZXRSb3dCaW5kaW5nKCkuYXR0YWNoRXZlbnRPbmNlKFwiY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IGF3YWl0IGNyZWF0aW9uO1xuXHRcdFx0XHRjb25zdCBhbGxDdXJyZW50Q29udGV4dHMgPSBsaXN0QmluZGluZy5nZXRBbGxDdXJyZW50Q29udGV4dHMoKTtcblx0XHRcdFx0Y29uc3QgY29udGV4dEluZGV4ID0gYWxsQ3VycmVudENvbnRleHRzLmluZGV4T2YobmV3Q29udGV4dCk7XG5cdFx0XHRcdHRhYmxlPy5mb2N1c1Jvdyhjb250ZXh0SW5kZXgsIHRydWUpO1xuXHRcdFx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBhIHRyZWUgdGFibGUsIHdlIGFsc28gc2Nyb2xsIHRvIGtlZXAgdGhlIHBhcmVudCB2aXNpYmxlXG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50Q29udGV4dCA9IG5ld0NvbnRleHQuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50SW5kZXggPSBwYXJlbnRDb250ZXh0ID8gYWxsQ3VycmVudENvbnRleHRzLmluZGV4T2YocGFyZW50Q29udGV4dCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0aWYgKHBhcmVudEluZGV4ICE9PSB1bmRlZmluZWQgJiYgcGFyZW50SW5kZXggPj0gMCkge1xuXHRcdFx0XHRcdFx0dGFibGU/LnNjcm9sbFRvSW5kZXgocGFyZW50SW5kZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMobGlzdEJpbmRpbmcpO1xuXHRcdGNvbnN0IGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHR7XG5cdFx0XHRcdC8vQ2hlY2sgaWYgQWxsIHBhcmFtZXRlcnMgYXJlIG5lZWRlZFxuXHRcdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBmYWxzZSwgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0YnVzeU1vZGU6IFwiTG9jYWxcIiwgLy8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRidXN5SWQ6ICh0YWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQpPy5nZXRUYWJsZURlZmluaXRpb24oKT8uYW5ub3RhdGlvbi5pZCxcblx0XHRcdFx0cGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuQXV0b0NyZWF0ZSwgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLklubGluZSxcblx0XHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblx0XHRcdH0sXG5cdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXG5cdFx0aWYgKCFwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0dGhpcy5oYW5kbGVTaWRlRWZmZWN0cyhsaXN0QmluZGluZywgY3JlYXRpb24pO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5wb3N0RG9jdW1lbnRDcmVhdGlvbihQcm9taXNlLmFsbChbY3JlYXRpb24sIHRoaXMuc3luY1Rhc2soY3JlYXRpb24pXSksIGxpc3RCaW5kaW5nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZGVmZmVyZWQgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBoYXMgdG8gYmUgY3JlYXRlZFxuXHQgKiBAcGFyYW0gcGFyZW50Q29udGV4dCBPcHRpb25hbCBwYXJlbnQgY29udGV4dCB3aGVuIGNyZWF0aW5nIGEgbm9kZSBpbiBUcmVlVGFibGVcblx0ICogQHBhcmFtIGRhdGFcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmVcblx0ICovXG5cdGFzeW5jIGNyZWF0ZURlZmVycmVkRG9jdW1lbnQobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCwgZGF0YT86IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobGlzdEJpbmRpbmcsIHtcblx0XHRcdGNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzOiB7IG1vZGU6IFwiRGVmZXJyZWRcIiwgcGFyZW50Q29udGV4dCwgbGlzdEJpbmRpbmcsIGRhdGEgfSxcblx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0Zm9yY2VGb2N1czogdHJ1ZVxuXHRcdH0pO1xuXHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBzeW5jIG9yIGFzeW5jIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgc3luYyBvciBhc3luYyBjcmVhdGlvbiBtb2RlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgVGhpcyBkb2N1bWVudCBpcyBjcmVhdGVkIGFmdGVyIGEgZGVmZmVyZWQgY3JlYXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uICBUaGUgY3JlYXRlIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIGNyZWF0ZSBhY3Rpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGF0YSAgRGF0YSB0byBzYXZlIG9uIHRoZSBuZXcgZG9jdW1lbnRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHRcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVTeW5jQXN5bmNEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0XHRcdGJGcm9tRGVmZXJyZWQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG5cdFx0fSxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgbmF2aWdhdGlvbjogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3Qgcm91dGluZ0xpc3RlbmVyID0gdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cblx0XHRjb25zdCBjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKVxuXHRcdFx0LmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC4uLnBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0Li4ue1xuXHRcdFx0XHRcdFx0cGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpXG5cdFx0XHQudGhlbigobmV3RG9jdW1lbnRDb250ZXh0KSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSAmJiBuZXdEb2N1bWVudENvbnRleHQgJiYgbmV3RG9jdW1lbnRDb250ZXh0LmdldEJpbmRpbmcoKSAhPT0gbGlzdEJpbmRpbmcpIHtcblx0XHRcdFx0XHQvLyBJbiBGQ0wgY2FzZSwgaWYgdGhlIG5ldyBjb250ZXh0IGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCBhbiBhY3Rpb24gKG5vdCB3aXRoIHRoZSBzdGFuZGFyZCBQT1NUIGNyZWF0ZSksIHdlIG5lZWQgdG8gcmVmcmVzaFxuXHRcdFx0XHRcdC8vIHRoZSBvcmlnaW5hbCBsaXN0QmluZGluZyBzbyB0aGF0IGl0IGNvbnRhaW5zIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdCAodGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGxpc3RCaW5kaW5nIGZvciBzdGFuZGFyZCBjcmVhdGUpXG5cdFx0XHRcdFx0bGlzdEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG5ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pO1xuXG5cdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB0aGUgaW52b2NhdGlvbiBjb21lcyBmcm9tIGEgZGVmZXJyZWQgY3JlYXRpb24gb3IgaWYgU2F2ZSBpcyBwcmVzc2VkIGRpcmVjdGx5IGFmdGVyIGZpbGxpbmcgdGhlIENyZWF0aW9uUm93XG5cdFx0aWYgKHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCAhPT0gdHJ1ZSAmJiAhcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdHRoaXMuaGFuZGxlU2lkZUVmZmVjdHMobGlzdEJpbmRpbmcsIGNyZWF0aW9uKTtcblx0XHR9XG5cblx0XHRpZiAocGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5Bc3luYykge1xuXHRcdFx0bmF2aWdhdGlvbiA9IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobGlzdEJpbmRpbmcsIHtcblx0XHRcdFx0Y3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM6IHsgbW9kZTogXCJBc3luY1wiLCBjcmVhdGVDb250ZXh0UHJvbWlzZTogY3JlYXRpb24gfSxcblx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdGZvcmNlRm9jdXM6IHRydWVcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRuYXZpZ2F0aW9uID0gY3JlYXRpb24udGhlbihhc3luYyAobmV3RG9jdW1lbnRDb250ZXh0KSA9PiB7XG5cdFx0XHRcdGlmICghbmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3QgY29yZVJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0XHRcdFx0XHRyZXR1cm4gcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0XHRcdHRpdGxlOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19FRElURkxPV19TQVBGRV9DUkVBVElPTl9GQUlMRURfREVTQ1JJUFRJT05cIilcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBTeW5jIGNyZWF0aW9uIHdhcyB0cmlnZ2VyZWQgZm9yIGEgZGVmZXJyZWQgY3JlYXRpb24sIHdlIGRvbid0IG5hdmlnYXRlIGZvcndhcmRcblx0XHRcdFx0XHQvLyBhcyB3ZSdyZSBhbHJlYWR5IG9uIHRoZSBjb3JyZXNwb25kaW5nIE9iamVjdFBhZ2Vcblx0XHRcdFx0XHRjb25zdCBuYXZQYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGZvcmNlRm9jdXM6IHRydWUsXG5cdFx0XHRcdFx0XHR0cmFuc2llbnQ6XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChsaXN0QmluZGluZykgPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24gPyB0cnVlIDogdW5kZWZpbmVkXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdHJldHVybiBwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWRcblx0XHRcdFx0XHRcdD8gcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9Db250ZXh0KG5ld0RvY3VtZW50Q29udGV4dCwgbmF2UGFyYW1ldGVycylcblx0XHRcdFx0XHRcdDogcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChuZXdEb2N1bWVudENvbnRleHQsIG5hdlBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMucG9zdERvY3VtZW50Q3JlYXRpb24oUHJvbWlzZS5hbGwoW2NyZWF0aW9uLCBuYXZpZ2F0aW9uXSksIGxpc3RCaW5kaW5nKTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5LCB0aGUgb25seSBlcnJvcnMgaGFuZGxlZCBoZXJlIGFyZSByYWlzZWQgYXMgc3RyaW5nIC0gc2hvdWxkIGJlIGNoYW5nZWQgdG8gRXJyb3Igb2JqZWN0c1xuXHRcdFx0Ly8gY3JlYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGJ5IHVzZXIgb3IgZmFpbGVkIGluIGJhY2tlbmQgPT4gaW4gY2FzZSB3ZSBoYXZlIG5hdmlnYXRlZCB0byB0cmFuc2llbnQgY29udGV4dCBiZWZvcmUsIG5hdmlnYXRlIGJhY2tcblx0XHRcdC8vIHRoZSBzd2l0Y2gtc3RhdGVtZW50IGFib3ZlIHNlZW1zIHRvIGluZGljYXRlIHRoYXQgdGhpcyBoYXBwZW5zIGluIGNyZWF0aW9uTW9kZXMgZGVmZXJyZWQgYW5kIGFzeW5jLiBCdXQgaW4gZmFjdCwgaW4gdGhlc2UgY2FzZXMgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gZnJvbSByb3V0ZU1hdGNoZWQgaW4gT1AgY29tcG9uZW50XG5cdFx0XHQvLyBjcmVhdGVEZWZlcnJlZERvY3VtZW50IGlzIHRyaWdnZXJlZCwgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgKGNyZWF0ZURvY3VtZW50KSBhZ2FpbiAtIHRoaXMgdGltZSB3aXRoIGNyZWF0aW9uTW9kZSBzeW5jLiBUaGVyZWZvcmUsIGFsc28gaW4gdGhhdCBtb2RlIHdlIG5lZWQgdG8gdHJpZ2dlciBiYWNrIG5hdmlnYXRpb24uXG5cdFx0XHQvLyBUaGUgb3RoZXIgY2FzZXMgbWlnaHQgc3RpbGwgYmUgbmVlZGVkIGluIGNhc2UgdGhlIG5hdmlnYXRpb24gZmFpbHMuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdFtcblx0XHRcdFx0XHRDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nLFxuXHRcdFx0XHRcdENvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQsXG5cdFx0XHRcdFx0Q29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkLFxuXHRcdFx0XHRcdENvbnN0YW50cy5PbkJlZm9yZUNyZWF0ZUZhaWxlZFxuXHRcdFx0XHRdLmluY2x1ZGVzKGVycm9yKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gZXh0ZXJuYWwgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBoYXMgdG8gYmUgY3JlYXRlZFxuXHQgKiBAcGFyYW0gb3V0Ym91bmQgVGhlIG91dGJvdW5kIGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVFeHRlcm5hbERvY3VtZW50KGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgc3RyaW5nLCBvdXRib3VuZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIFRPRE86IENhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb24gKGN1cnJlbnRseSB1c2luZyB0aGUgc2FtZSBhcyBmb3Igb3V0Ym91bmQgY2hldnJvbiBuYXYsIGFuZCB3aXRob3V0IGFueSBjb250ZXh0IC0gM3JkIHBhcmFtKVxuXHRcdGlmIChvdXRib3VuZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBsaXN0QmluZGluZyAhPT0gXCJzdHJpbmdcIiAmJiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgY3JlYXRpb25Nb2RlIFwiRXh0ZXJuYWxcIiB3aXRoIGEgVHJlZVRhYmxlYCk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXI7XG5cdFx0XHRjb25zdCBjcmVhdGVQYXRoID0gTW9kZWxIZWxwZXIuZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nKHRoaXMuYmFzZS5nZXRWaWV3KCksIGxpc3RCaW5kaW5nKTtcblx0XHRcdGNvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQoY29udHJvbGxlciwgb3V0Ym91bmQsIHVuZGVmaW5lZCwgY3JlYXRlUGF0aCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIFNpZGVFZmZlY3RzIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIGRvY3VtZW50IGNyZWF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIGNyZWF0aW9uUHJvbWlzZSBUaGUgcHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgU2lkZUVmZmVjdHMgaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRoYW5kbGVTaWRlRWZmZWN0cyA9IGFzeW5jIChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgY3JlYXRpb25Qcm9taXNlOiBQcm9taXNlPENvbnRleHQ+KTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRjb25zdCBuZXdDb250ZXh0ID0gYXdhaXQgY3JlYXRpb25Qcm9taXNlO1xuXHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRhd2FpdCBuZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpICYmIHZpZXdCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZy5nZXRQYXRoKCksIHZpZXdCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZvciB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWxpZGF0aW9uTWVzc2FnZXMgVGhlIGVycm9yIG1lc3NhZ2VzIGZvcm0gdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdGFyZ2V0ZWQgYnkgdGhlIG1lc3NhZ2VzXG5cdCAqL1xuXHRjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMgPSAodmFsaWRhdGlvbk1lc3NhZ2VzOiB7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdLCB0YWJsZTogVGFibGUpOiB2b2lkID0+IHtcblx0XHRjb25zdCBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSB0YWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0Y29uc3QgY3VzdG9tVmFsaWRpdHkgPSB0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93Q3VzdG9tVmFsaWRpdHlcIik7XG5cdFx0Y29uc3QgY3VzdG9tTWVzc2FnZXM6IEN1c3RvbU1lc3NhZ2VbXSA9IFtdO1xuXHRcdGxldCBmaWVsZENvbnRyb2w7XG5cdFx0bGV0IGZpbmFsVGFyZ2V0OiBzdHJpbmc7XG5cblx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0Y29uc3Qgb2xkTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IG1lc3NhZ2UuZ2V0Q29kZSgpID09PSBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pO1xuXHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhvbGRNZXNzYWdlcyk7XG5cblx0XHR2YWxpZGF0aW9uTWVzc2FnZXMuZm9yRWFjaCgodmFsaWRhdGlvbk1lc3NhZ2UpID0+IHtcblx0XHRcdC8vIEhhbmRsZSBCb3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdGlmICh2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0KSB7XG5cdFx0XHRcdGZpZWxkQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoY3VzdG9tVmFsaWRpdHlbdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0ZmluYWxUYXJnZXQgPSBgJHtmaWVsZENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpfS8ke2ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nUGF0aChcInZhbHVlXCIpfWA7XG5cdFx0XHRcdC8vIEFkZCB2YWxpZGF0aW9uIG1lc3NhZ2UgaWYgc3RpbGwgbm90IGV4aXN0c1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IU1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSkubGVuZ3RoXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhcblx0XHRcdFx0XHRcdG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZTogdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRleHQsXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0dGVjaG5pY2FsOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0cGVyc2lzdGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHRhcmdldDogZmluYWxUYXJnZXRcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBBZGQgY29udHJvbElkIGluIG9yZGVyIHRvIGdldCB0aGUgZm9jdXMgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHBvcG92ZXJcblx0XHRcdFx0Y29uc3QgZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSk7XG5cdFx0XHRcdGV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzWzBdLmFkZENvbnRyb2xJZChjdXN0b21WYWxpZGl0eVt2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgVW5ib3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGN1c3RvbU1lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHR0ZXh0OiB2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKGN1c3RvbU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IGN1c3RvbU1lc3NhZ2VzXG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlc29sdmVzIHRoZSBjcmVhdGlvbiBtb2RlXG5cdCAqIFByb3ZpZGVzIHRoZSBleHBlY3RlZCBjcmVhdGlvbiBtb2RlOlxuXHQgKiAgLSBwcmVzZXJ2ZXMgdGhlIHBhc3NlZCBjcmVhdGlvbiBtb2RlIHdoZW4gdGhpcyBvbmUgaXMgbm90IGEgTmV3UGFnZVxuXHQgKiAgLSBjYWxjdWxhdGVzIHRoZSBuZXcgb25lIGlmIHRoZSBjcmVhdGlvbiBtb2RlIGlzIGEgTmV3UGFnZS5cblx0ICpcblx0ICogQHBhcmFtIGluaXRpYWxDcmVhdGlvbk1vZGUgVGhlIGluaXRpYWwgY3JlYXRpb24gbW9kZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gY3JlYXRlRGF0YSBUaGUgaW5pdGlhbCBkYXRhIGZvciBvYmplY3QgY3JlYXRpb25cblx0ICogQHJldHVybnMgVGhlIG5ldyBjcmVhdGlvbiBtb2RlXG5cdCAqL1xuXHRyZXNvbHZlQ3JlYXRpb25Nb2RlID0gKGluaXRpYWxDcmVhdGlvbk1vZGU6IHN0cmluZywgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIGNyZWF0ZURhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG5cdFx0aWYgKGluaXRpYWxDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5OZXdQYWdlKSB7XG5cdFx0XHQvLyB1c2UgdGhlIHBhc3NlZCBjcmVhdGlvbiBtb2RlXG5cdFx0XHRyZXR1cm4gaW5pdGlhbENyZWF0aW9uTW9kZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChsaXN0QmluZGluZyk7XG5cdFx0XHQvLyBOZXdBY3Rpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBjb2xsZWN0aW9uXG5cdFx0XHRpZiAoIWxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRjb25zdCBkYXRhTW9kZWxMaXN0QmluZGluZ1BhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSkpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBkYXRhTW9kZWxMaXN0QmluZGluZ1BhdGgudGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldCB8IHVuZGVmaW5lZCxcblx0XHRcdFx0XHQvLyBpZiBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzIGlzIHByZXNlbnQsIHRoZW4gY3JlYXRpb24gaXMgJ0RlZmVycmVkJ1xuXHRcdFx0XHRcdC8vIGluIHRoZSBhYnNlbmNlIG9mIE5ld0FjdGlvbiBvciBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzLCBjcmVhdGlvbiBpcyBhc3luY1xuXHRcdFx0XHRcdG5ld0FjdGlvbiA9IChcblx0XHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHRcdFx0PyBlbnRpdHlTZXQ/LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290XG5cdFx0XHRcdFx0XHRcdDogZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkXG5cdFx0XHRcdFx0KT8uTmV3QWN0aW9uPy50b1N0cmluZygpO1xuXG5cdFx0XHRcdGlmIChuZXdBY3Rpb24gJiYgZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoLnRhcmdldEVudGl0eVR5cGUuYWN0aW9uc1tuZXdBY3Rpb25dLnBhcmFtZXRlcnMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdC8vIGJpbmRpbmcgcGFyYW1ldGVyIChlZzogX2l0KSBpcyBub3QgY29uc2lkZXJlZFxuXHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IGNyZWF0aW9uUGFyYW1ldGVycyA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5nZXRDcmVhdGlvblBhcmFtZXRlcnMobGlzdEJpbmRpbmcsIGNyZWF0ZURhdGEsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0aWYgKGNyZWF0aW9uUGFyYW1ldGVycy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuQXN5bmM7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICovXG5cblx0YXN5bmMgdmFsaWRhdGVEb2N1bWVudChcblx0XHRjb250ZXh0OiBDb250ZXh0LFxuXHRcdHBhcmFtZXRlcnM6IHsgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uPzogc3RyaW5nOyBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9XG5cdCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkudmFsaWRhdGVEb2N1bWVudChjb250ZXh0LCBwYXJhbWV0ZXJzLCB0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IHByb3ZpZGVzIHRoZSByZXN1bHQgb2Zcblx0ICogYSBjcmVhdGlvbiByb3cncyBjdXN0b20gdmFsaWRhdGlvbiBhcyBhIHByb21pc2UuIElmIG5vIGNyZWF0aW9uIHJvdyBpcyBpbnZvbHZlZFxuXHQgKiB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIHJldHVybnMgYSByZXNvbHZlZCBwcm9taXNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHdpdGggdGhlIGNyZWF0aW9uUm93XG5cdCAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcHJvbWlzZVxuXHQgKi9cblx0Z2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24odGFibGU6IFRhYmxlIHwgdW5kZWZpbmVkKTogKCkgPT4gUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiB7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSB0YWJsZT8uZ2V0Q3JlYXRpb25Sb3coKTtcblx0XHRpZiAoY3JlYXRpb25Sb3cgJiYgdGFibGUpIHtcblx0XHRcdHJldHVybiBhc3luYyAoKTogUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiA9PiB7XG5cdFx0XHRcdGNvbnN0IGNyZWF0aW9uUm93T2JqZWN0cyA9IChjcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpLmdldE9iamVjdCgpO1xuXHRcdFx0XHRkZWxldGUgY3JlYXRpb25Sb3dPYmplY3RzW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdFx0cmV0dXJuIHRoaXMudmFsaWRhdGVEb2N1bWVudCh0YWJsZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQsIHtcblx0XHRcdFx0XHRkYXRhOiBjcmVhdGlvblJvd09iamVjdHMsXG5cdFx0XHRcdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiB0YWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIilcblx0XHRcdFx0fSk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gYXN5bmMgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHNldmVyYWwgZG9jdW1lbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3RCaW5kaW5nIHVzZWQgdG8gY3JlYXRlIHRoZSBkb2N1bWVudHNcblx0ICogQHBhcmFtIGRhdGFGb3JDcmVhdGUgVGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIG5ldyBkb2N1bWVudHNcblx0ICogQHBhcmFtIGNyZWF0ZUF0RW5kIFRydWUgaWYgdGhlIG5ldyBjb250ZXh0cyBuZWVkIHRvIGJlIGNyZWF0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBpc0Zyb21Db3B5UGFzdGUgVHJ1ZSBpZiB0aGUgY3JlYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgcGFzdGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBiZWZvcmVDcmVhdGVDYWxsQmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjcmVhdGlvblxuXHQgKiBAcGFyYW0gY3JlYXRlQXNJbmFjdGl2ZSBUcnVlIGlmIHRoZSBjb250ZXh0cyBuZWVkIHRvIGJlIGNyZWF0ZWQgYXMgaW5hY3RpdmVcblx0ICogQHBhcmFtIHJlcXVlc3RTaWRlRWZmZWN0cyBUcnVlIGJ5IGRlZmF1bHQsIGZhbHNlIGlmIFNpZGVFZmZlY3RzIHNob3VsZCBub3QgYmUgcmVxdWVzdGVkXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHRzLlxuXHQgKi9cblx0YXN5bmMgY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0ZGF0YUZvckNyZWF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcblx0XHRjcmVhdGVBdEVuZDogYm9vbGVhbixcblx0XHRpc0Zyb21Db3B5UGFzdGU6IGJvb2xlYW4sXG5cdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbixcblx0XHRjcmVhdGVBc0luYWN0aXZlID0gZmFsc2UsXG5cdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhblxuXHQpOiBQcm9taXNlPENvbnRleHRbXT4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCB0YXJnZXRMaXN0QmluZGluZyA9IGxpc3RCaW5kaW5nO1xuXHRcdHJlcXVlc3RTaWRlRWZmZWN0cyA9IHJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2U7XG5cdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRpZiAoYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0YXdhaXQgYmVmb3JlQ3JlYXRlQ2FsbEJhY2soeyBjb250ZXh0UGF0aDogdGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpIH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YXJnZXRMaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0bGV0IG1ldGFQYXRoOiBzdHJpbmc7XG5cblx0XHRcdGlmICh0YXJnZXRMaXN0QmluZGluZy5nZXRDb250ZXh0KCkpIHtcblx0XHRcdFx0bWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7dGFyZ2V0TGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKX0vJHt0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCl9YCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyh0YXJnZXRMaXN0QmluZGluZyk7XG5cblx0XHRcdC8vIEl0ZXJhdGUgb24gYWxsIGl0ZW1zIGFuZCBzdG9yZSB0aGUgY29ycmVzcG9uZGluZyBjcmVhdGlvbiBwcm9taXNlXG5cdFx0XHRjb25zdCBjcmVhdGlvblByb21pc2VzID0gZGF0YUZvckNyZWF0ZS5tYXAoYXN5bmMgKHByb3BlcnR5VmFsdWVzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGNyZWF0ZVBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMgPSB7IGRhdGE6IHt9LCBwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSB9O1xuXG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IGNyZWF0ZUF0RW5kO1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmluYWN0aXZlID0gY3JlYXRlQXNJbmFjdGl2ZTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFzIHdlIGRvbid0IHN1cHBvcnQgZGVlcCBjcmVhdGVcblx0XHRcdFx0Zm9yIChjb25zdCBwcm9wZXJ0eVBhdGggaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7bWV0YVBhdGh9LyR7cHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHByb3BlcnR5ICYmXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eS4ka2luZCAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJlxuXHRcdFx0XHRcdFx0IXByb3BlcnR5UGF0aC5pbmNsdWRlcyhcIi9cIikgJiZcblx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5UGF0aF1cblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuZGF0YSFbcHJvcGVydHlQYXRoXSA9IHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdHRhcmdldExpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdFx0aXNGcm9tQ29weVBhc3RlXG5cdFx0XHRcdCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgY3JlYXRlZENvbnRleHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY3JlYXRpb25Qcm9taXNlcyk7XG5cdFx0XHRpZiAoIWNyZWF0ZUFzSW5hY3RpdmUpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUodGFyZ2V0TGlzdEJpbmRpbmcpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRjb25zdCBhY3RpdmVDb250ZXh0cyA9IGNyZWF0ZWRDb250ZXh0cy5maWx0ZXIoKG5ld0NvbnRleHQpID0+ICFuZXdDb250ZXh0LmlzSW5hY3RpdmUoKSk7XG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbChhY3RpdmVDb250ZXh0cy5tYXAoYXN5bmMgKG5ld0NvbnRleHQpID0+IG5ld0NvbnRleHQuY3JlYXRlZCgpKSk7XG5cblx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRpZiAocmVxdWVzdFNpZGVFZmZlY3RzICYmICFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KHRhcmdldExpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCksIHZpZXdCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSAmJiBhY3RpdmVDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIGFjdGl2ZUNvbnRleHRzKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNyZWF0ZWRDb250ZXh0cztcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIG11bHRpcGxlIGRvY3VtZW50cy5cIik7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdDcmVhdGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jcmVhdGVQYXJhbWV0ZXJzIEFycmF5IG9mIHZhbHVlcyB0aGF0IGFyZSBmaWxsZWQgaW4gdGhlIEFjdGlvbiBQYXJhbWV0ZXIgRGlhbG9nXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQmVmb3JlQ3JlYXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dFBhdGg/OiBzdHJpbmc7IGNyZWF0ZVBhcmFtZXRlcnM/OiB1bmtub3duW10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdFZGl0JyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRWRpdCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0YXN5bmMgb25CZWZvcmVFZGl0KF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdTYXZlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlU2F2ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2F2ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKFwiQWZ0ZXJBc3luY1wiKVxuXHRAaG9va2FibGUoXCJhZnRlclwiLCB0cnVlKVxuXHRhc3luYyBvbkJlZm9yZVNhdmUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEaXNjYXJkXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBkaXNjYXJkZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZURpc2NhcmQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0RlbGV0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGVsZXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZURlbGV0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZVNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBjb250ZXh0IHdlIG9idGFpbmVkIGFmdGVyIHNhdmluZ1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGhvb2thYmxlKFwiYWZ0ZXJcIilcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVDcmVhdGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyQ3JlYXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdFZGl0JyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJFZGl0KF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgVGhlIGNvbnRleHQgb2J0YWluZWQgYWZ0ZXIgZGlzY2FyZGluZyB0aGUgb2JqZWN0LCBvciB1bmRlZmluZWQgaWYgd2UgZGlzY2FyZGVkIGEgbmV3IG9iamVjdFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJEaXNjYXJkKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdEZWxldGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWxldGVkXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckRlbGV0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgSW5kaWNhdGVzIHdoZXRoZXIgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBpZ25vcmVkIHdoZW4gdXNlciBjbGlja3Mgb24gU2F2ZSBkdXJpbmcgYW4gSW5saW5lIGNyZWF0aW9uXG5cdC8vIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycy5iaW5kaW5ncyBMaXN0IGJpbmRpbmdzIG9mIHRoZSB0YWJsZXMgaW4gdGhlIHZpZXcuXG5cdC8vIEJvdGggb2YgdGhlIGFib3ZlIHBhcmFtZXRlcnMgYXJlIGZvciB0aGUgc2FtZSBwdXJwb3NlLiBVc2VyIGNhbiBlbnRlciBzb21lIGluZm9ybWF0aW9uIGluIHRoZSBjcmVhdGlvbiByb3cocykgYnV0IGRvZXMgbm90ICdBZGQgcm93JywgaW5zdGVhZCBjbGlja3MgU2F2ZS5cblx0Ly8gVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgaW4gdGhlIHZpZXcuXG5cblx0LyoqXG5cdCAqIFNhdmVzIGEgbmV3IGRvY3VtZW50IGFmdGVyIGNoZWNraW5nIGl0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBzYXZlIGlzIGNvbXBsZXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHNhdmVEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCwgbVBhcmFtZXRlcnM6IFNhdmVEb2N1bWVudFBhcmFtZXRlcnMpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGNvbnN0IGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGFCaW5kaW5ncyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzIGFzIE9EYXRhTGlzdEJpbmRpbmdbXTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHQvLyBpbiBjYXNlIG9mIHNhdmluZyAvIGFjdGl2YXRpbmcgdGhlIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgc2hhbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIFBBVENIL1BPU1Rcblx0XHRcdC8vIGlzIHNlbnQgdG8gdGhlIGJhY2tlbmRcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5tZXJnZVBhdGNoRHJhZnQgIT09IHRydWUpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0XHQvL3dlIG5lZWQgdG8gcmVxdWVzdCBmb3IgcmVjb21tZW5kYXRpb25zIGFuZCB0aGVuIGJyaW5nIHRoZSBkaWFsb2cgaGVyZVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cblx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9IGF3YWl0IHRoaXMuY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbigpO1xuXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVTYXZlKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IHJvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmXG5cdFx0XHRcdHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0cm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSAkYXV0byBxdWV1ZSBjYW4gb25seSBoYXZlIHBlbmRpbmcgY2hhbmdlcyBhdCB0aGlzIHBvaW50IHdoZW4gU0FWRSB3YXMgY2xpY2tlZCBpbW1lZGlhdGVseSBhZnRlciBjaGFuZ2luZyBhIGZpZWxkLlxuXHRcdFx0Ly8gSW4gdGhpcyBjYXNlIHRoZSAkYXV0byBxdWV1ZSBpcyBsb2NrZWQgdGhlcmVmb3JlIHRoZSBmb2xsb3dpbmcgc3VibWl0IGJhdGNoIHNob3VsZCBub3QgY3JlYXRlIGEgc2VwYXJhdGUgYmF0Y2ggcmVxdWVzdC5cblx0XHRcdC8vIEl0IGlzIGRvbmUgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgcGF0Y2gsIGRyYWZ0cHJlcGFyZSwgZHJhZnRhY3RpdmF0ZSBlYWNoIGhhdmUgdGhlaXIgb3duIGNoYW5nZXNldFxuXHRcdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSAmJiBtUGFyYW1ldGVycy5tZXJnZVBhdGNoRHJhZnQpIHtcblx0XHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChcIiRhdXRvXCIpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBhcyBib29sZWFuLFxuXHRcdFx0XHRhQmluZGluZ3MsXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0dGhpcy5nZXRDcmVhdGlvbk1vZGUoKVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aXZhdGUsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblxuXHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoU3RhbmRhcmRBY3Rpb25zLnNhdmUsIFRyaWdnZXJUeXBlLnN0YW5kYXJkQWN0aW9uKTtcblxuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cblx0XHRcdHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyU2F2ZSh7XG5cdFx0XHRcdGNvbnRleHQ6IGFjdGl2ZURvY3VtZW50Q29udGV4dFxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIHVwZGF0ZSB0ZWxlbWV0cnkgZGF0YSBmb3IgaG93IHBhZ2Ugd2FzIHNhdmVkIGFuZCB0aGVuIGRvIHN0b3Jpbmcgb2YgdGhpcyBkYXRhIHRvIGJhY2tlbmQgdGhyb3VnaCB0aGUgc3RvcmVEYXRhIGZ1bmN0aW9uXG5cdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLnN0b3JlRGF0YUZvclRlbGVtZXRyeShyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4pO1xuXG5cdFx0XHRpZiAoYWN0aXZlRG9jdW1lbnRDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBhY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2hlbiBzYXZpbmcsIHRoZSBzZW1hbnRpYyBrZXlzIG1heSBoYXZlIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gSW4gdGhpcyBjYXNlLCB3ZSBhbHNvIG5lZWQgdG8gbWFuYWdlIHRoZSBzZW1hbnRpYyBVUkwgY2hhbmdlIGluIHRoZSBoaXN0b3J5XG5cdFx0XHRcdFx0Y29uc3QgcHJldmlvdXNTZW1hbnRpY1BhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgob0NvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdGNvbnN0IG5ld1NlbWFudGljUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChhY3RpdmVEb2N1bWVudENvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdGlmIChwcmV2aW91c1NlbWFudGljUGF0aCAmJiBuZXdTZW1hbnRpY1BhdGggJiYgcHJldmlvdXNTZW1hbnRpY1BhdGggIT09IG5ld1NlbWFudGljUGF0aCkge1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8ucGF0aE1hcHBpbmcucHVzaCh7IG9sZFBhdGg6IHByZXZpb3VzU2VtYW50aWNQYXRoLCBuZXdQYXRoOiBuZXdTZW1hbnRpY1BhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRpZiAocm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9PSBhY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgeyBlZGl0YWJsZTogZmFsc2UsIHJlY3JlYXRlQ29udGV4dDogZmFsc2UsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRpZiAoIShvRXJyb3IgJiYgKG9FcnJvciBhcyB7IGNhbmNlbGVkPzogYm9vbGVhbiB9KS5jYW5jZWxlZCkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2F2aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHRcdHRocm93IG9FcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3dpdGNoZXMgdGhlIFVJIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIHN3aXRjaCBmcm9tXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgc3dpdGNoIGlzIGRvbmVcblx0ICovXG5cdGFzeW5jIHRvZ2dsZURyYWZ0QWN0aXZlKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0bGV0IGVkaXRhYmxlOiBib29sZWFuO1xuXHRcdGNvbnN0IGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdC8vdG9nZ2xlIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZWRpdCBkcmFmdHMgYW5kIGFjdGl2ZSBkb2N1bWVudHMgd2l0aCBkcmFmdClcblx0XHRpZiAoXG5cdFx0XHQhYklzRHJhZnQgfHxcblx0XHRcdCEoXG5cdFx0XHRcdCghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHx8XG5cdFx0XHRcdChvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5KVxuXHRcdFx0KVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdC8vc3RhcnQgUG9pbnQ6IGVkaXQgZHJhZnRcblx0XHRcdGVkaXRhYmxlID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHN0YXJ0IHBvaW50IGFjdGl2ZSBkb2N1bWVudFxuXHRcdFx0ZWRpdGFibGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0XHRjb25zdCBvUmlnaHRtb3N0Q29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkgPyBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Db250ZXh0O1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb1JpZ2h0bW9zdENvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdGlmICghc2libGluZ0luZm8gJiYgb0NvbnRleHQgIT09IG9SaWdodG1vc3RDb250ZXh0KSB7XG5cdFx0XHRcdC8vIFRyeSB0byBjb21wdXRlIHNpYmxpbmcgaW5mbyBmb3IgdGhlIHJvb3QgY29udGV4dCBpZiBpdCBmYWlscyBmb3IgdGhlIHJpZ2h0bW9zdCBjb250ZXh0XG5cdFx0XHRcdC8vIC0tPiBJbiBjYXNlIG9mIEZDTCwgaWYgd2UgdHJ5IHRvIHN3aXRjaCBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgYnV0IGEgY2hpbGQgZW50aXR5IGhhcyBubyBzaWJsaW5nLCB0aGUgc3dpdGNoIHdpbGwgY2xvc2UgdGhlIGNoaWxkIGNvbHVtblxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9Db250ZXh0LCBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2libGluZ0luZm8pIHtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShlZGl0YWJsZSA/IEVkaXRNb2RlLkVkaXRhYmxlIDogRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpOyAvL3N3aXRjaCB0byBlZGl0IG1vZGUgb25seSBpZiBhIGRyYWZ0IGlzIGF2YWlsYWJsZVxuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdFx0XHRcdGlmIChsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBvQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldFBhdGggPSBzaWJsaW5nSW5mby5wYXRoTWFwcGluZ1tzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8ucGF0aE1hcHBpbmcucHVzaCh7IG9sZFBhdGg6IGxhc3RTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoLCBuZXdQYXRoOiB0YXJnZXRQYXRoIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LCB7IGVkaXRhYmxlLCByZWNyZWF0ZUNvbnRleHQ6IHRydWUsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZSAtIENhbm5vdCBmaW5kIHNpYmxpbmdcIik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlOiR7b0Vycm9yfWApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3NhcC5tLkJ1dHRvbn0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIC0gQ3VycmVudGx5IHRoaXMgaXMgcGFzc2VkIGFzIGNhbmNlbEJ1dHRvbiBpbnRlcm5hbGx5IChyZXBsYWNlZCBieSBtUGFyYW1ldGVycy5jb250cm9sIGluIHRoZSBKU0RvYyBiZWxvdykuIEN1cnJlbnRseSBpdCBpcyBhbHNvIG1hbmRhdG9yeS5cblx0Ly8gUGxhbiAtIFRoaXMgc2hvdWxkIG5vdCBiZSBtYW5kYXRvcnkuIElmIG5vdCBwcm92aWRlZCwgd2Ugc2hvdWxkIGhhdmUgYSBkZWZhdWx0IHRoYXQgY2FuIGFjdCBhcyByZWZlcmVuY2UgY29udHJvbCBmb3IgdGhlIGRpc2NhcmQgcG9wb3ZlciBPUiB3ZSBjYW4gc2hvdyBhIGRpYWxvZyBpbnN0ZWFkIG9mIGEgcG9wb3Zlci5cblxuXHQvKipcblx0ICogRGlzY2FyZCB0aGUgZWRpdGFibGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRyb2wgVGhpcyBpcyB0aGUgY29udHJvbCB1c2VkIHRvIG9wZW4gdGhlIGRpc2NhcmQgcG9wb3ZlclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgYW5kIGFsbG93cyBjdXN0b20gaGFuZGxpbmdcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBCYWNrTmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGVkaXRhYmxlIGRvY3VtZW50IGhhcyBiZWVuIGRpc2NhcmRlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBjYW5jZWxEb2N1bWVudChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRtUGFyYW1ldGVyczoge1xuXHRcdFx0Y29udHJvbD86IEJ1dHRvbjtcblx0XHRcdGNhbmNlbEJ1dHRvbj86IEJ1dHRvbjtcblx0XHRcdHNraXBEaXNjYXJkUG9wb3Zlcj86IGJvb2xlYW47XG5cdFx0XHRza2lwQmFja05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0c2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRsZXQgaXNOZXdEb2N1bWVudCA9IGZhbHNlO1xuXHRcdGNvbnN0IGNhbmNlbFBhcmFtZXRlcnM6IENhbmNlbFBhcmFtZXRlcnMgPSB7XG5cdFx0XHRza2lwRGlzY2FyZFBvcG92ZXI6IG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciA9PT0gdHJ1ZSxcblx0XHRcdGNhbmNlbEJ1dHRvbjogKG1QYXJhbWV0ZXJzLmNvbnRyb2wgfHwgbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uKSEsXG5cdFx0XHRiZWZvcmVDYW5jZWxDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGlzY2FyZFxuXHRcdH07XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdFx0aWYgKChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmIHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNhbmNlbFJlc3VsdCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbmNlbERvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0Y2FuY2VsUGFyYW1ldGVycyxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCksXG5cdFx0XHRcdHRoaXMuaXNEb2N1bWVudE1vZGlmaWVkKClcblx0XHRcdCk7XG5cdFx0XHR0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKVxuXHRcdFx0XHQuZ2V0SW5zdGFuY2VkVmlld3MoKVxuXHRcdFx0XHQuZm9yRWFjaCgodmlldykgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHQgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKGNvbnRleHQgJiYgY29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnNldEtlZXBBbGl2ZShmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEaXNjYXJkKHtcblx0XHRcdFx0Y29udGV4dDogdHlwZW9mIGNhbmNlbFJlc3VsdCA9PT0gXCJib29sZWFuXCIgfHwgY2FuY2VsUmVzdWx0ID09PSBudWxsID8gdW5kZWZpbmVkIDogY2FuY2VsUmVzdWx0XG5cdFx0XHR9KTtcblx0XHRcdC8vIHdlIGZvcmNlIHRoZSBlZGl0IHN0YXRlIGV2ZW4gZm9yIEZDTCBiZWNhdXNlIHRoZSBkcmFmdCBkaXNjYXJkIG1pZ2h0IG5vdCBiZSBpbXBsZW1lbnRlZFxuXHRcdFx0Ly8gYW5kIHdlIG1heSBqdXN0IGRlbGV0ZSB0aGUgZHJhZnRcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0aWYgKCFjYW5jZWxSZXN1bHQpIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIG9Db250ZXh0KTtcblx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdC8vaW4gY2FzZSBvZiBhIG5ldyBkb2N1bWVudCwgbm8gYWN0aXZlQ29udGV4dCBpcyByZXR1cm5lZCAtLT4gbmF2aWdhdGUgYmFjay5cblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwQmFja05hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRpc05ld0RvY3VtZW50ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IGNhbmNlbFJlc3VsdDtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9PSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gbG9hZCB0aGUgc2VtYW50aWMga2V5cyBvZiB0aGUgYWN0aXZlIGNvbnRleHQsIGFzIHdlIG5lZWQgdGhlbVxuXHRcdFx0XHRcdC8vIGZvciB0aGUgbmF2aWdhdGlvblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMob0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0Ly8gV2UgZm9yY2UgdGhlIHJlY3JlYXRpb24gb2YgdGhlIGNvbnRleHQsIHNvIHRoYXQgaXQncyBjcmVhdGVkIGFuZCBib3VuZCBpbiB0aGUgc2FtZSBtaWNyb3Rhc2ssXG5cdFx0XHRcdFx0Ly8gc28gdGhhdCBhbGwgcHJvcGVydGllcyBhcmUgbG9hZGVkIHRvZ2V0aGVyIGJ5IGF1dG9FeHBhbmRTZWxlY3QsIHNvIHRoYXQgd2hlbiBzd2l0Y2hpbmcgYmFjayB0byBFZGl0IG1vZGVcblx0XHRcdFx0XHQvLyAkJGluaGVyaXRFeHBhbmRTZWxlY3QgdGFrZXMgYWxsIGxvYWRlZCBwcm9wZXJ0aWVzIGludG8gYWNjb3VudCAoQkNQIDIwNzA0NjIyNjUpXG5cdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlldykge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgeyBlZGl0YWJsZTogZmFsc2UsIHJlY3JlYXRlQ29udGV4dDogdHJ1ZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEFjdGl2ZSBjb250ZXh0IGlzIHJldHVybmVkIGluIGNhc2Ugb2YgY2FuY2VsIG9mIGV4aXN0aW5nIGRvY3VtZW50LCBhbmQgaXQncyB0aGUgc2FtZSBhcyB0aGUgZWRpdGVkIGNvbnRleHRcblx0XHRcdFx0XHQvLyBTbywgd2UgZm9yY2UgdGhlIHJlY3JlYXRpb24gYXMgaXQgbWF5IGhhdmUgYmVlbiBkZXN0cm95ZWQgd2hlbiBjYWxsaW5nIHNldEtlZXBBbGl2ZShmYWxzZSkgb24gYWxsIHZpZXcncyBjb250ZXh0c1xuXHRcdFx0XHRcdC8vIGVhcmxpZXIgaW4gdGhpcyBtZXRob2Rcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB7IGVkaXRhYmxlOiBmYWxzZSwgcmVjcmVhdGVDb250ZXh0OiB0cnVlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0Ly9zaG93IERyYWZ0IGRpc2NhcmRlZCBtZXNzYWdlIHRvYXN0IG9ubHkgZm9yIGRyYWZ0IGVuYWJsZWQgYXBwc1xuXHRcdFx0XHR0aGlzLnNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlKGlzTmV3RG9jdW1lbnQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEJyaW5ncyB1cCBhIG1lc3NhZ2UgdG9hc3Qgd2hlbiBhIGRyYWZ0IGlzIGRpc2NhcmRlZC5cblx0ICpcblx0ICogQHBhcmFtIGlzTmV3RG9jdW1lbnQgVGhpcyBpcyBhIEJvb2xlYW4gZmxhZyB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgZG9jdW1lbnQgaXMgbmV3IG9yIGFscmVhZHkgZXhpc3RzLlxuXHQgKi9cblx0c2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UoaXNOZXdEb2N1bWVudD86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ESVNDQVJEX0RSQUZUX1RPQVNUXCIpO1xuXHRcdGlmIChpc05ld0RvY3VtZW50ID09IHRydWUpIHtcblx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5hdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCh7fSwgdGhpcy5zaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQsIHRoaXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogV2UgdXNlIHRoaXMgZnVuY3Rpb24gaW4gc2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2Ugd2hlbiBubyBjb250ZXh0IGlzIHBhc3NlZC5cblx0ICovXG5cdHNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCgpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ESVNDQVJEX0RSQUZUX1RPQVNUXCIpO1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0TWVzc2FnZVRvYXN0LnNob3cobWVzc2FnZSk7XG5cdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQodGhpcy5zaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQsIHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGNvbnRleHQgY29ycmVzcG9uZHMgdG8gYSBkcmFmdCByb290LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBjaGVja1xuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb250ZXh0IHBvaW50cyB0byBhIGRyYWZ0IHJvb3Rcblx0ICovXG5cdHByaXZhdGUgaXNEcmFmdFJvb3QoY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0cmV0dXJuIE1vZGVsSGVscGVyLmlzRHJhZnRSb290KGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkudGFyZ2V0RW50aXR5U2V0KTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBOYW1lIG9mIHRoZSBFbnRpdHlTZXQgdG8gd2hpY2ggdGhlIG9iamVjdCBiZWxvbmdzXG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgdGhlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lIFBSSVZBVEVcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRvY3VtZW50IGhhcyBiZWVuIGRlbGV0ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgZGVsZXRlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1JblBhcmFtZXRlcnM/OiB7IGVudGl0eVNldE5hbWU6IHN0cmluZzsgdGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzOiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdHRpdGxlPzogc3RyaW5nO1xuXHRcdFx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdFx0fSA9IHsgLi4ubUluUGFyYW1ldGVycywgYkZpbmRBY3RpdmVDb250ZXh0czogZmFsc2UsIGJlZm9yZURlbGV0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGUgfTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHRoaXMuX2lzRmNsRW5hYmxlZCgpICYmXG5cdFx0XHRcdHRoaXMuaXNEcmFmdFJvb3Qob0NvbnRleHQpICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB0cnVlICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIikgPT09IHRydWVcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBEZWxldGluZyBhbiBhY3RpdmUgZW50aXR5IHdoaWNoIGhhcyBhIGRyYWZ0IHRoYXQgY291bGQgcG90ZW50aWFsbHkgYmUgZGlzcGxheWVkIGluIHRoZSBMaXN0UmVwb3J0IChGQ0wgY2FzZSlcblx0XHRcdFx0Ly8gLS0+IG5lZWQgdG8gcmVtb3ZlIHRoZSBkcmFmdCBmcm9tIHRoZSBMUiBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBhY3RpdmUgdmVyc2lvbiwgc28gdGhhdCB0aGUgTGlzdEJpbmRpbmcgaXMgcHJvcGVybHkgcmVmcmVzaGVkXG5cdFx0XHRcdC8vIFRoZSBjb25kaXRpb24gJ29Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCcgbWFrZXMgc3VyZSB0aGUgYWN0aXZlIHZlcnNpb24gaXNuJ3QgYWxyZWFkeSBkaXNwbGF5ZWQgaW4gdGhlIExSXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gYXN5bmMgKHBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGUocGFyYW1ldGVycyk7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3QgbW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L1NpYmxpbmdFbnRpdHlgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0UGF0aCA9IGF3YWl0IHNpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkcmFmdENvbnRleHRUb1JlbW92ZSA9IG1vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoZHJhZnRQYXRoKTtcblx0XHRcdFx0XHRcdGRyYWZ0Q29udGV4dFRvUmVtb3ZlLnJlcGxhY2VXaXRoKG9Db250ZXh0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVwbGFjaW5nIHRoZSBkcmFmdCBpbnN0YW5jZSBpbiB0aGUgTFIgT0RMQlwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdC8vIFNpbmdsZSBvYmpldCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhbiBPUCBoZWFkZXIgYnV0dG9uIChub3QgZnJvbSBhIGxpc3QpXG5cdFx0XHQvLyAtLT4gTWFyayBVSSBkaXJ0eSBhbmQgbmF2aWdhdGUgYmFjayB0byBkaXNtaXNzIHRoZSBPUFxuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0XHRjb25zdCBwYXJlbnRMaXN0QmluZGluZyA9IGNvbnRleHRCaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpXG5cdFx0XHRcdFx0PyBjb250ZXh0QmluZGluZ1xuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXG5cdFx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUocGFyZW50TGlzdEJpbmRpbmcsIHBhcmVudExpc3RCaW5kaW5nPy5nZXRDb250ZXh0KCkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBvQ29udGV4dCk7XG5cblx0XHRcdC8vIEFmdGVyIGRlbGV0ZSBpcyBzdWNjZXNzZnVsbCwgd2UgbmVlZCB0byBkZXRhY2ggdGhlIHNldEJhY2tOYXZpZ2F0aW9uIE1ldGhvZHNcblx0XHRcdG9BcHBDb21wb25lbnQ/LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0Y29uc3QgaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQgPSB0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlzUmVjb21tZW5kYXRpb25FbmFibGVkKCk7XG5cdFx0XHQvLyBXZSBjbGVhciByZWNvbW1lbmRhdGlvbiBkYXRhIGFuZCBjb250ZXh0cyBmcm9tIGludGVybmFsIG1vZGVsIGZvciB0aGUgZGVsZXRlZCBjb250ZXh0c1xuXHRcdFx0aWYgKGlzUmVjb21tZW5kYXRpb25FbmFibGVkKSB7XG5cdFx0XHRcdHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaWdub3JlUmVjb21tZW5kYXRpb25Gb3JDb250ZXh0cyhbb0NvbnRleHRdKTtcblx0XHRcdH1cblx0XHRcdC8vIE5vdGlmeSBjb25zdW1lcnMgb2Ygd2hpY2ggY29udGV4dHMgd2VyZSBkZWxldGVkXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckRlbGV0ZSh7IGNvbnRleHRzOiBbb0NvbnRleHRdIH0pO1xuXG5cdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdGlmIChvQXBwQ29tcG9uZW50Py5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5EZWVwbGluaykge1xuXHRcdFx0XHRcdC8vIEluIGNhc2UgdGhlIGFwcCBoYXMgYmVlbiBsYXVuY2hlZCB3aXRoIHNlbWFudGljIGtleXMsIGRlbGV0aW5nIHRoZSBvYmplY3Qgd2UndmUgbGFuZGVkIG9uIHNoYWxsIG5hdmlnYXRlIGJhY2tcblx0XHRcdFx0XHQvLyB0byB0aGUgYXBwIHdlIGNhbWUgZnJvbSAoZXhjZXB0IGZvciBGQ0wsIHdoZXJlIHdlIG5hdmlnYXRlIHRvIExSIGFzIHVzdWFsKVxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5leGl0RnJvbUFwcCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEVsc2UgbmF2aWdhdGUgYmFjayBmcm9tIHRoZSBwYWdlLiBJbiBGQ0wsIHRoaXMgaXMgZG9uZSB3aGVuIHRoZSBrZXB0LWFsaXZlIGNvbnRleHQgaXMgZGVzdHJveWVkIChjYWxsYmFjaylcblx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKCk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJtaXQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMgYW5kIG5hdmlnYXRlIGJhY2suXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBzYXZlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBhcHBseURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRpZiAob0NvbnRleHQuZ2V0TW9kZWwoKS5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdFx0Ly93ZSBuZWVkIHRvIHJlcXVlc3QgZm9yIHJlY29tbWVuZGF0aW9ucyBhbmQgdGhlbiBicmluZyB0aGUgZGlhbG9nIGhlcmVcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmNoZWNrSWZSZWNvbW1lbmRhdGlvbnNFeGlzdCgpKSB7XG5cdFx0XHRcdGNvbnN0IGlzQ29udGludWUgPSBhd2FpdCB0aGlzLnNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKGZhbHNlKTtcblx0XHRcdFx0aWYgKGlzQ29udGludWUgPT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbl0gQm9vbGVhbiB2YWx1ZSBmb3Igc3RhdGljIGFjdGlvbiwgdW5kZWZpbmVkIGZvciBvdGhlciBhY3Rpb25zXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlXSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWRcblx0Ly8gQ3VycmVudGx5IHRoZSBwYXJhbWV0ZXIgaXNOYXZpZ2FibGUgaXMgdXNlZCBpbnRlcm5hbGx5IGFuZCBzaG91bGQgYmUgY2hhbmdlZCB0byByZXF1aXJlc05hdmlnYXRpb24gYXMgaXQgaXMgYSBtb3JlIGFwdCBuYW1lIGZvciB0aGlzIHBhcmFtXG5cblx0LyoqXG5cdCAqIEludm9rZXMgYW4gYWN0aW9uIChib3VuZCBvciB1bmJvdW5kKSBhbmQgdHJhY2tzIHRoZSBjaGFuZ2VzIHNvIHRoYXQgb3RoZXIgcGFnZXMgY2FuIGJlIHJlZnJlc2hlZCBhbmQgc2hvdyB0aGUgdXBkYXRlZCBkYXRhIHVwb24gbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIEEgbWFwIG9mIGFjdGlvbiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHByb3ZpZGVkIHZhbHVlc1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBpZiB2YWx1ZXMgYXJlIHByb3ZpZGVkIGZvciBhbGwgb2YgdGhlbSBpbiBwYXJhbWV0ZXJWYWx1ZXNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY29udGV4dHMgRm9yIGEgYm91bmQgYWN0aW9uLCBhIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBjYWxsZWQgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5tb2RlbCBGb3IgYW4gdW5ib3VuZCBhY3Rpb24sIGFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZC4gTmF2aWdhdGlvbiB0YWtlcyBwbGFjZSB0byB0aGUgY29udGV4dCByZXR1cm5lZCBieSB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmxhYmVsIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb24uIFRoaXMgaXMgbmVlZGVkIGluIGNhc2UgdGhlIGFjdGlvbiBoYXMgYSBwYXJhbWV0ZXIgYW5kIGEgcGFyYW1ldGVyIGRpYWxvZyBpcyBzaG93biB0byB0aGUgdXNlci4gVGhlIGxhYmVsIHdpbGwgYmUgdXNlZCBmb3IgdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgYW5kIGZvciB0aGUgY29uZmlybWF0aW9uIGJ1dHRvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNvbnRyb2xJZCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dHMgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dHMgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5lbmFibGVBdXRvU2Nyb2xsIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1FeHRyYVBhcmFtcyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyBvbmNlIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQsIHByb3ZpZGluZyB0aGUgcmVzcG9uc2Vcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGludm9rZUFjdGlvbihcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM/OiB7XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfVtdO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRjb250ZXh0cz86IENvbnRleHQgfCBDb250ZXh0W107XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0YlN0YXRpY0FjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRhcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRub3RBcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRlbmFibGVBdXRvU2Nyb2xsPzogYm9vbGVhbjtcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbj86IHN0cmluZztcblx0XHR9LFxuXHRcdG1FeHRyYVBhcmFtcz86IHt9XG5cdCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGxldCBhUGFydHM7XG5cdFx0bGV0IHNPdmVybG9hZEVudGl0eVR5cGU7XG5cdFx0bGV0IG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzOlxuXHRcdFx0fCB7XG5cdFx0XHRcdFx0ZlJlc29sdmVyOiBGdW5jdGlvbjtcblx0XHRcdFx0XHRmUmVqZWN0b3I6IEZ1bmN0aW9uO1xuXHRcdFx0ICB9XG5cdFx0XHR8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cblx0XHQvLyBEdWUgdG8gYSBtaXN0YWtlIHRoZSBpbnZva2VBY3Rpb24gaW4gdGhlIGV4dGVuc2lvbkFQSSBoYWQgYSBkaWZmZXJlbnQgQVBJIHRoYW4gdGhpcyBvbmUuXG5cdFx0Ly8gVGhlIG9uZSBmcm9tIHRoZSBleHRlbnNpb25BUEkgZG9lc24ndCBleGlzdCBhbnltb3JlIGFzIHdlIGV4cG9zZSB0aGUgZnVsbCBlZGl0IGZsb3cgbm93IGJ1dFxuXHRcdC8vIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc3RpbGwgbmVlZCB0byBzdXBwb3J0IHRoZSBvbGQgc2lnbmF0dXJlXG5cdFx0aWYgKFxuXHRcdFx0KChtSW5QYXJhbWV0ZXJzIGFzIENvbnRleHQpPy5pc0EgJiYgKG1JblBhcmFtZXRlcnMgYXMgQ29udGV4dCk/LmlzQTxDb250ZXh0PihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB8fFxuXHRcdFx0QXJyYXkuaXNBcnJheShtSW5QYXJhbWV0ZXJzKSB8fFxuXHRcdFx0bUV4dHJhUGFyYW1zICE9PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdGNvbnN0IGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCB1bmRlZmluZWQgPSBtSW5QYXJhbWV0ZXJzIGFzIE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IHVuZGVmaW5lZDtcblx0XHRcdG1JblBhcmFtZXRlcnMgPSBtRXh0cmFQYXJhbXMgfHwge307XG5cdFx0XHRpZiAoY29udGV4dHMpIHtcblx0XHRcdFx0bUluUGFyYW1ldGVycy5jb250ZXh0cyA9IGNvbnRleHRzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bUluUGFyYW1ldGVycy5tb2RlbCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBtUGFyYW1ldGVyczoge1xuXHRcdFx0YmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdFx0XHRiU3RhdGljQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdHBhcmFtZXRlclZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG5cdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRiR2V0Qm91bmRDb250ZXh0PzogYm9vbGVhbjtcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRjb250ZXh0cz86IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IG51bGw7XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHRwYXJlbnRDb250cm9sOiBGRVZpZXc7XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdFx0XHRhcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0Yk9iamVjdFBhZ2U/OiBib29sZWFuO1xuXHRcdFx0YklzQ3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0Z3JvdXBJZD86IHN0cmluZztcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbj86IHN0cmluZztcblx0XHRcdGVuYWJsZUF1dG9TY3JvbGw/OiBib29sZWFuO1xuXHRcdFx0aXNCb3VuZD86IGJvb2xlYW47XG5cdFx0XHRpZ25vcmVFVGFnPzogYm9vbGVhbjtcblx0XHR9ID0geyAuLi5tSW5QYXJhbWV0ZXJzLCBwYXJlbnRDb250cm9sOiB0aGlzLmJhc2UuZ2V0VmlldygpIH0gfHwgeyBwYXJlbnRDb250cm9sOiB0aGlzLmJhc2UuZ2V0VmlldygpIH07XG5cblx0XHRtUGFyYW1ldGVycy5pc05hdmlnYWJsZSA9IG1QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiB8fCBtUGFyYW1ldGVycy5pc05hdmlnYWJsZTtcblxuXHRcdC8vIERldGVybWluZSBpZiB0aGUgcmVmZXJlbmNlZCBhY3Rpb24gaXMgYm91bmQgb3IgdW5ib3VuZFxuXHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFkYXRhID0gY29udmVydFR5cGVzKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHQvLyBUaGUgRW50aXR5Q29udGFpbmVyIG1heSBOT1QgYmUgbWlzc2luZywgc28gaXQgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGJlIHVuZGVmaW5lZCwgYnV0IHNpbmNlIGluIG91ciBjb252ZXJ0ZWQgTWV0YWRhdGFcblx0XHQvLyBpdCBjYW4gYmUgdW5kZWZpbmVkLCBJIG5lZWQgdGhpcyB3b3JrYXJvdW5kIGhlcmUgb2YgYWRkaW5nIFwiXCIgc2luY2UgaW5kZXhPZiBkb2VzIG5vdCBhY2NlcHQgc29tZXRoaW5nIHRoYXQnc1xuXHRcdC8vIHVuZGVmaW5lZC5cblx0XHRpZiAoc0FjdGlvbk5hbWUuaW5jbHVkZXMoXCJcIiArIGNvbnZlcnRlZE1ldGFkYXRhLmVudGl0eUNvbnRhaW5lci5uYW1lKSkge1xuXHRcdFx0Ly8gVW5ib3VuZCBhY3Rpb25zIGFyZSBhbHdheXMgcmVmZXJlbmNlZCB2aWEgdGhlIGFjdGlvbiBpbXBvcnQgYW5kIHdlIGZvdW5kIHRoZSBFbnRpdHlDb250YWluZXIgaW4gdGhlIHNBY3Rpb25OYW1lIHNvXG5cdFx0XHQvLyBhbiB1bmJvdW5kIGFjdGlvbiBpcyByZWZlcmVuY2VkIVxuXHRcdFx0bVBhcmFtZXRlcnMuaXNCb3VuZCA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBObyBlbnRpdHkgY29udGFpbmVyIGluIHRoZSBzQWN0aW9uTmFtZSwgc28gZWl0aGVyIGEgYm91bmQgb3Igc3RhdGljIGFjdGlvbiBpcyByZWZlcmVuY2VkIHdoaWNoIGlzIGFsc28gYm91bmQhXG5cdFx0XHRtUGFyYW1ldGVycy5pc0JvdW5kID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIW1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgJiYgbVBhcmFtZXRlcnMuY29udGV4dHMgJiYgbVBhcmFtZXRlcnMubW9kZWwpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgPSBtUGFyYW1ldGVycy5tb2RlbFxuXHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0LmdldE1ldGFDb250ZXh0KChtUGFyYW1ldGVycy5jb250ZXh0cyBhcyBDb250ZXh0KS5nZXRQYXRoKCkpXG5cdFx0XHRcdC5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKTtcblx0XHR9XG5cdFx0bGV0IG9Db250cm9sOiBDb250cm9sIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChtUGFyYW1ldGVycy5jb250cm9sSWQpIHtcblx0XHRcdG9Db250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpIGFzIENvbnRyb2w7XG5cdFx0XHRpZiAob0NvbnRyb2wpIHtcblx0XHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoaXMgc2VsZWN0ZWQgY29udGV4dHMgdXBkYXRlIGlzIGRvbmUgd2l0aGluIHRoZSBvcGVyYXRpb24sIHNob3VsZCBiZSBtb3ZlZCBvdXRcblx0XHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHR9XG5cblx0XHQvLyBpZiBzdGlja3kgc2Vzc2lvbiBpcyBlbmFibGVkIHdlIHRyaWdnZXIgYWN0aW9ucyB3aXRob3V0IGVUYWdcblx0XHRtUGFyYW1ldGVycy5pZ25vcmVFVGFnID0gbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQ/LmdldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiKTtcblxuXHRcdGlmIChzQWN0aW9uTmFtZSAmJiBzQWN0aW9uTmFtZS5pbmNsdWRlcyhcIihcIikpIHtcblx0XHRcdC8vIGdldCBlbnRpdHkgdHlwZSBvZiBhY3Rpb24gb3ZlcmxvYWQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBhY3Rpb24gcGF0aFxuXHRcdFx0Ly8gRXhhbXBsZSBzQWN0aW9uTmFtZSA9IFwiPEFjdGlvbk5hbWU+KENvbGxlY3Rpb24oPE92ZXJsb2FkRW50aXR5VHlwZT4pKVwiXG5cdFx0XHQvLyBzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXSAtLT4gPEFjdGlvbk5hbWU+XG5cdFx0XHQvLyBzT3ZlcmxvYWRFbnRpdHlUeXBlID0gYVBhcnRzWzJdIC0tPiA8T3ZlcmxvYWRFbnRpdHlUeXBlPlxuXHRcdFx0YVBhcnRzID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIoXCIpO1xuXHRcdFx0c0FjdGlvbk5hbWUgPSBhUGFydHNbMF07XG5cdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlID0gYVBhcnRzW2FQYXJ0cy5sZW5ndGggLSAxXS5yZXBsYWNlQWxsKFwiKVwiLCBcIlwiKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbiAmJiBvQ29udHJvbCkge1xuXHRcdFx0aWYgKG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSAmJiBvQ29udHJvbC5pc1RhYmxlQm91bmQoKSkge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IChcblx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpPy5iaW5kTGlzdChvQ29udHJvbC5nZXRSb3dCaW5kaW5nKCkuZ2V0SGVhZGVyQ29udGV4dCgpIS5nZXRQYXRoKCkpIGFzIE9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0KS5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBzQmluZGluZ1BhdGggPSBvQ29udHJvbC5kYXRhKFwicm93c0JpbmRpbmdJbmZvXCIpLnBhdGgsXG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbCgpLmJpbmRMaXN0KHNCaW5kaW5nUGF0aCk7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0xpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNPdmVybG9hZEVudGl0eVR5cGUgJiYgb0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKSAmJiBvQ29udHJvbC5pc0EgJiYgb0NvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSB0aGlzLl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoKFxuXHRcdFx0XHRcdG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQsXG5cdFx0XHRcdFx0b0NvbnRyb2wuZ2V0Um93QmluZGluZygpLFxuXHRcdFx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmVuYWJsZUF1dG9TY3JvbGwpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MgPSB0aGlzLmNyZWF0ZUFjdGlvblByb21pc2Uoc0FjdGlvbk5hbWUsIG9Db250cm9sLmdldElkKCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0ID0gdGhpcy5fZ2V0Qm91bmRDb250ZXh0KG9WaWV3LCBtUGFyYW1ldGVycyk7XG5cdFx0Ly8gTmVlZCB0byBrbm93IHRoYXQgdGhlIGFjdGlvbiBpcyBjYWxsZWQgZnJvbSBPYmplY3RQYWdlIGZvciBjaGFuZ2VTZXQgSXNvbGF0ZWQgd29ya2Fyb3VuZFxuXHRcdG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlID0gb1ZpZXcuZ2V0Vmlld0RhdGEoKS5jb252ZXJ0ZXJUeXBlID09PSBcIk9iamVjdFBhZ2VcIjtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRsZXQgb1Jlc3BvbnNlID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuY2FsbEFjdGlvbihcblx0XHRcdFx0c0FjdGlvbk5hbWUsXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpXG5cdFx0XHQpO1xuXHRcdFx0bGV0IGxpc3RSZWZyZXNoZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udGV4dHMgJiYgQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cykgJiYgbVBhcmFtZXRlcnMuaXNCb3VuZCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRsaXN0UmVmcmVzaGVkID0gYXdhaXQgdGhpcy5fcmVmcmVzaExpc3RJZlJlcXVpcmVkKFxuXHRcdFx0XHRcdHRoaXMuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZSwgb1Jlc3BvbnNlKSxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0c1swXVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSkge1xuXHRcdFx0XHRsZXQgYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRcdFx0aWYgKG9SZXNwb25zZSkge1xuXHRcdFx0XHRcdGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMgPSBBcnJheS5pc0FycmF5KG9SZXNwb25zZSlcblx0XHRcdFx0XHRcdD8gT2JqZWN0LmtleXMoKG9SZXNwb25zZVswXSBhcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPikudmFsdWU/LmdldE9iamVjdCgpKVxuXHRcdFx0XHRcdFx0OiBPYmplY3Qua2V5cyhvUmVzcG9uc2UuZ2V0T2JqZWN0KCkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5BY3Rpb24sIG1QYXJhbWV0ZXJzLmNvbnRleHRzLCBzQWN0aW9uTmFtZSwgbGlzdFJlZnJlc2hlZCwgYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShzQWN0aW9uTmFtZSwgVHJpZ2dlclR5cGUuYWN0aW9uKTtcblxuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZXNvbHZlcihvUmVzcG9uc2UpO1xuXHRcdFx0fVxuXHRcdFx0Lypcblx0XHRcdFx0XHRXZSBzZXQgdGhlICh1cHBlcikgcGFnZXMgdG8gZGlydHkgYWZ0ZXIgYW4gZXhlY3V0aW9uIG9mIGFuIGFjdGlvblxuXHRcdFx0XHRcdFRPRE86IGdldCByaWQgb2YgdGhpcyB3b3JrYXJvdW5kXG5cdFx0XHRcdFx0VGhpcyB3b3JrYXJvdW5kIGlzIG9ubHkgbmVlZGVkIGFzIGxvbmcgYXMgdGhlIG1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHN5bmNocm9uaXphdGlvbi5cblx0XHRcdFx0XHRPbmNlIHRoaXMgaXMgc3VwcG9ydGVkIHdlIGRvbid0IG5lZWQgdG8gc2V0IHRoZSBwYWdlcyB0byBkaXJ0eSBhbnltb3JlIGFzIHRoZSBjb250ZXh0IGl0c2VsZlxuXHRcdFx0XHRcdGlzIGFscmVhZHkgcmVmcmVzaGVkIChpdCdzIGp1c3Qgbm90IHJlZmxlY3RlZCBpbiB0aGUgb2JqZWN0IHBhZ2UpXG5cdFx0XHRcdFx0d2UgZXhwbGljaXRseSBkb24ndCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gdGhlIGxpc3QgcmVwb3J0IGJ1dCBvbmx5IGNhbGwgaXQgZnJvbSB0aGUgb2JqZWN0IHBhZ2Vcblx0XHRcdFx0XHRhcyBpZiBpdCBpcyBjYWxsZWQgaW4gdGhlIGxpc3QgcmVwb3J0IGl0J3Mgbm90IG5lZWRlZCAtIGFzIHdlIGFueXdheSB3aWxsIHJlbW92ZSB0aGlzIGxvZ2ljXG5cdFx0XHRcdFx0d2UgY2FuIGxpdmUgd2l0aCB0aGlzXG5cdFx0XHRcdFx0d2UgbmVlZCBhIGNvbnRleHQgdG8gc2V0IHRoZSB1cHBlciBwYWdlcyB0byBkaXJ0eSAtIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHdlIHVzZSB0aGVcblx0XHRcdFx0XHRmaXJzdCBvbmUgYXMgdGhleSBhcmUgYW55d2F5IHNpYmxpbmdzXG5cdFx0XHRcdFx0Ki9cblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpICYmIHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKS5jb252ZXJ0ZXJUeXBlICE9PSBcIkxpc3RSZXBvcnRcIikge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIsIHNBY3Rpb25OYW1lKTtcblx0XHRcdH1cblx0XHRcdGlmIChtUGFyYW1ldGVycy5pc05hdmlnYWJsZSkge1xuXHRcdFx0XHRsZXQgdkNvbnRleHQgPSBvUmVzcG9uc2U7XG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZDb250ZXh0KSAmJiB2Q29udGV4dC5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHR2Q29udGV4dCA9ICh2Q29udGV4dFswXSBhcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPikudmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHZDb250ZXh0ICYmICFBcnJheS5pc0FycmF5KHZDb250ZXh0KSkge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHQgPSB2Q29udGV4dDtcblx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRjb25zdCBzQ29udGV4dE1ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0Y29uc3QgX2ZuVmFsaWRDb250ZXh0cyA9IChjb250ZXh0czogQ29udGV4dFtdLCBhcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W10pOiBDb250ZXh0W10gPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHRzLmZpbHRlcigoZWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoYXBwbGljYWJsZUNvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFwcGxpY2FibGVDb250ZXh0cy5pbmNsdWRlcyhlbGVtZW50KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3Qgb0FjdGlvbkNvbnRleHQgPSBBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzLmNvbnRleHRzKVxuXHRcdFx0XHRcdFx0PyBfZm5WYWxpZENvbnRleHRzKG1QYXJhbWV0ZXJzLmNvbnRleHRzLCBtUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dHMpWzBdXG5cdFx0XHRcdFx0XHQ6IG1QYXJhbWV0ZXJzLmNvbnRleHRzO1xuXHRcdFx0XHRcdGNvbnN0IHNBY3Rpb25Db250ZXh0TWV0YVBhdGggPSBvQWN0aW9uQ29udGV4dCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0XHRcdFx0XHRpZiAoc0NvbnRleHRNZXRhUGF0aCAhPSB1bmRlZmluZWQgJiYgc0NvbnRleHRNZXRhUGF0aCA9PT0gc0FjdGlvbkNvbnRleHRNZXRhUGF0aCkge1xuXHRcdFx0XHRcdFx0aWYgKG9BY3Rpb25Db250ZXh0Py5nZXRQYXRoKCkgIT09IGNvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KGNvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0XHRjaGVja05vSGFzaENoYW5nZTogdHJ1ZVxuXHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgYWN0aW9uIHJldHVybnMgYSBkcmFmdCBjb250ZXh0LCB3ZSBhbHJlYWR5IHRha2UgY2FyZSBkdXJpbmcgbmF2aWdhdGlvbiB0byBlaXRoZXIgY3JlYXRlIGEgbmV3XG5cdFx0XHRcdFx0XHRcdC8vIChmdWxsIHNjcmVlbikgb3IgdG8gdXNlIHRoZSBsaXN0IGJpbmRpbmcgY29udGV4dCBhZnRlciByZWZyZXNoIChhbmQgbm90IHRoZSByZXR1cm4gdmFsdWUgY29udGV4dCkuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBkcmFmdCBpcyBkaXNjYXJkZWQgb3IgYWN0aXZhdGVkLCBoYXZpbmcgdGhlIGNvbnRleHQgc3RpbGwgYXMgZGVwZW5kZW50IGNvbnRleHQgY2F1c2UgaXNzdWVzXG5cdFx0XHRcdFx0XHRcdC8vIChlLmcuIGlmIGEgc2lkZSBlZmZlY3QgaXMgdHJpZ2dlcmVkKS4gVGhlcmVmb3JlLCB3ZSBkZXN0cm95IHRoZSByZXR1cm4gdmFsdWUgY29udGV4dCBoZXJlLFxuXHRcdFx0XHRcdFx0XHQvLyBhbmQgdG8gYmUgY29tcGF0aWJsZSB3ZSByZXR1cm4gYSBuZXcgY29udGV4dCB3aXRoIHRoZSBzYW1lIHBhdGguXG5cdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiZcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlXG5cdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHJldHVybkNvbnRleHQgPSBjb250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KG9SZXNwb25zZSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdChvUmVzcG9uc2VbMF0gYXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dD4pLnZhbHVlID0gcmV0dXJuQ29udGV4dDtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0b1Jlc3BvbnNlID0gcmV0dXJuQ29udGV4dDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dC5nZXRCaW5kaW5nKCkuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRMb2cuaW5mbyhcIk5hdmlnYXRpb24gdG8gdGhlIHNhbWUgY29udGV4dCBpcyBub3QgYWxsb3dlZFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyQWN0aW9uRXhlY3V0aW9uKHNBY3Rpb25OYW1lKTtcblx0XHRcdHJldHVybiBvUmVzcG9uc2U7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlamVjdG9yKCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBlcnJQcm9taXNlID0gZXJyIGFzIHsgY2FuY2VsZWQ/OiBib29sZWFuOyByZWplY3RlZEl0ZW1zPzogeyBjYW5jZWxlZDogYm9vbGVhbiB9W10gfTtcblx0XHRcdC8vIEZJWE1FOiBpbiBtb3N0IHNpdHVhdGlvbnMgdGhlcmUgaXMgbm8gaGFuZGxlciBmb3IgdGhlIHJlamVjdGVkIHByb21pc2VzIHJldHVybmVkcVxuXHRcdFx0aWYgKGVyciA9PT0gQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZykge1xuXHRcdFx0XHQvLyBUaGlzIGxlYWRzIHRvIGNvbnNvbGUgZXJyb3IuIEFjdHVhbGx5IHRoZSBlcnJvciBpcyBhbHJlYWR5IGhhbmRsZWQgKGN1cnJlbnRseSBkaXJlY3RseSBpbiBwcmVzcyBoYW5kbGVyIG9mIGVuZCBidXR0b24gaW4gZGlhbG9nKSwgc28gaXQgc2hvdWxkIG5vdCBiZSBmb3J3YXJkZWRcblx0XHRcdFx0Ly8gdXAgdG8gaGVyZS4gSG93ZXZlciwgd2hlbiBkaWFsb2cgaGFuZGxpbmcgYW5kIGJhY2tlbmQgZXhlY3V0aW9uIGFyZSBzZXBhcmF0ZWQsIGluZm9ybWF0aW9uIHdoZXRoZXIgZGlhbG9nIHdhcyBjYW5jZWxsZWQsIG9yIGJhY2tlbmQgZXhlY3V0aW9uIGhhcyBmYWlsZWQgbmVlZHNcblx0XHRcdFx0Ly8gdG8gYmUgdHJhbnNwb3J0ZWQgdG8gdGhlIHBsYWNlIHJlc3BvbnNpYmxlIGZvciBjb25uZWN0aW5nIHRoZXNlIHR3byB0aGluZ3MuXG5cdFx0XHRcdC8vIFRPRE86IHJlbW92ZSBzcGVjaWFsIGhhbmRsaW5nIG9uZSBkaWFsb2cgaGFuZGxpbmcgYW5kIGJhY2tlbmQgZXhlY3V0aW9uIGFyZSBzZXBhcmF0ZWRcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRGlhbG9nIGNhbmNlbGxlZFwiKTtcblx0XHRcdH0gZWxzZSBpZiAoIShlcnIgJiYgKGVyclByb21pc2UuY2FuY2VsZWQgfHwgKGVyclByb21pc2UucmVqZWN0ZWRJdGVtcyAmJiBlcnJQcm9taXNlLnJlamVjdGVkSXRlbXNbMF0uY2FuY2VsZWQpKSkpIHtcblx0XHRcdFx0Ly8gVE9ETzogYW5hbHl6ZSwgd2hldGhlciB0aGlzIGlzIG9mIHRoZSBzYW1lIGNhdGVnb3J5IGFzIGFib3ZlXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gRWRpdEZsb3cuaW52b2tlQWN0aW9uOiR7ZXJyfWApO1xuXHRcdFx0fVxuXHRcdFx0Ly8gVE9ETzogQW55IHVuZXhwZWN0ZWQgZXJyb3JzIHByb2JhYmx5IHNob3VsZCBub3QgYmUgaWdub3JlZCFcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSG9vayB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBhZnRlciB0aGUgYWN0aW9uIGV4ZWN1dGlvbi5cblx0ICpcblx0ICogQHBhcmFtIF9hY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAc2luY2UgMS4xMTQuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyQWN0aW9uRXhlY3V0aW9uKF9hY3Rpb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvL3RvIGJlIG92ZXJyaWRkZW5cblx0fVxuXG5cdC8qKlxuXHQgKiBTZWN1cmVkIGV4ZWN1dGlvbiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24uIEVuc3VyZXMgdGhhdCB0aGUgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCB3aGVuIGNlcnRhaW4gY29uZGl0aW9ucyBhcmUgZnVsZmlsbGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gZm5GdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuIFNob3VsZCByZXR1cm4gYSBwcm9taXNlIHRoYXQgaXMgc2V0dGxlZCBhZnRlciBjb21wbGV0aW9uIG9mIHRoZSBleGVjdXRpb24uIElmIG5vdGhpbmcgaXMgcmV0dXJuZWQsIGltbWVkaWF0ZSBjb21wbGV0aW9uIGlzIGFzc3VtZWQuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBEZWZpbml0aW9ucyBvZiB0aGUgcHJlY29uZGl0aW9ucyB0byBiZSBjaGVja2VkIGJlZm9yZSBleGVjdXRpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kgRGVmaW5lcyB0aGUgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuc2V0IFRyaWdnZXJzIGEgYnVzeSBpbmRpY2F0b3Igd2hlbiB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5LmNoZWNrIEV4ZWN1dGVzIGZ1bmN0aW9uIG9ubHkgaWYgYXBwbGljYXRpb24gaXNuJ3QgYnVzeS5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnVwZGF0ZXNEb2N1bWVudCBUaGlzIG9wZXJhdGlvbiB1cGRhdGVzIHRoZSBjdXJyZW50IGRvY3VtZW50IHdpdGhvdXQgdXNpbmcgdGhlIGJvdW5kIG1vZGVsIGFuZCBjb250ZXh0LiBBcyBhIHJlc3VsdCwgdGhlIGRyYWZ0IHN0YXR1cyBpcyB1cGRhdGVkIGlmIGEgZHJhZnQgZG9jdW1lbnQgZXhpc3RzLCBhbmQgdGhlIHVzZXIgaGFzIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgZWRpdGluZyBwcm9jZXNzLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBpcyByZWplY3RlZCBpZiB0aGUgZXhlY3V0aW9uIGlzIHByb2hpYml0ZWQgYW5kIHJlc29sdmVkIGJ5IHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IHRoZSBmbkZ1bmN0aW9uLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBzZWN1cmVkRXhlY3V0aW9uKFxuXHRcdGZuRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRcdG1QYXJhbWV0ZXJzPzoge1xuXHRcdFx0YnVzeT86IHtcblx0XHRcdFx0c2V0PzogYm9vbGVhbjtcblx0XHRcdFx0Y2hlY2s/OiBib29sZWFuO1xuXHRcdFx0fTtcblx0XHRcdHVwZGF0ZXNEb2N1bWVudD86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBiQnVzeVNldCA9IG1QYXJhbWV0ZXJzPy5idXN5Py5zZXQgPz8gdHJ1ZSxcblx0XHRcdGJCdXN5Q2hlY2sgPSBtUGFyYW1ldGVycz8uYnVzeT8uY2hlY2sgPz8gdHJ1ZSxcblx0XHRcdGJVcGRhdGVzRG9jdW1lbnQgPSBtUGFyYW1ldGVycz8udXBkYXRlc0RvY3VtZW50ID8/IGZhbHNlLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKSxcblx0XHRcdG9Db250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0IGFzIENvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0aWYgKGJCdXN5Q2hlY2sgJiYgQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFwcGxpY2F0aW9uIGFscmVhZHkgYnVzeSB0aGVyZWZvcmUgZXhlY3V0aW9uIHJlamVjdGVkXCIpO1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgdG8gc2V0IGJ1c3kgYW5kIGRyYWZ0IGluZGljYXRvciBpbW1lZGlhdGVseSBhbHNvIHRoZSBmdW5jdGlvbiBtaWdodCBiZSBleGVjdXRlZCBsYXRlciBpbiBxdWV1ZVxuXHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHR9XG5cblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzayhmbkZ1bmN0aW9uIGFzICgpID0+IHVua25vd24gfCBQcm9taXNlPHVua25vd24+KVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGJJc0RyYWZ0KSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiB1bmtub3duKTogdm9pZCA9PiB7XG5cdFx0XHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0aWYgKGJCdXN5U2V0KSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgcGF0Y2hTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdGhhbmRsZVBhdGNoU2VudChvRXZlbnQ6IE9EYXRhQ29udGV4dEJpbmRpbmckUGF0Y2hTZW50RXZlbnQpOiB2b2lkIHtcblx0XHQvLyBJbiBjb2xsYWJvcmF0aXZlIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uLCBkaXNhYmxlIEVUYWcgY2hlY2sgZm9yIFBBVENIIHJlcXVlc3RzXG5cdFx0Y29uc3QgaW50ZXJuYWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3QgaWdub3JlRVRhZyA9IHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSB8fCBpbnRlcm5hbENvbnRleHQuZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0aWYgKGlnbm9yZUVUYWcpIHtcblx0XHRcdCgob0V2ZW50LmdldFNvdXJjZSgpIGFzIEJpbmRpbmcpLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuc2V0SWdub3JlRVRhZyh0cnVlKTtcblx0XHR9XG5cdFx0aWYgKCFpbnRlcm5hbENvbnRleHQ/LmdldFByb3BlcnR5KFwic2tpcFBhdGNoSGFuZGxlcnNcIikpIHtcblx0XHRcdGNvbnN0IHNvdXJjZUJpbmRpbmcgPSBvRXZlbnQuZ2V0U291cmNlKCkgYXMgdW5rbm93biBhcyBPRGF0YUxpc3RCaW5kaW5nOyAvLyBGSVhNRTogVUk1IHR5cGUgc2F5cyB0aGlzIHNob3VsZCBiZSBhbiBPRGF0YUNvbnRleHRCaW5kaW5nXG5cdFx0XHQvLyBDcmVhdGUgYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIHRoZSBwYXRoIGlzIGNvbXBsZXRlZFxuXHRcdFx0Y29uc3Qgb1BhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0b0V2ZW50LmdldFNvdXJjZSgpLmF0dGFjaEV2ZW50T25jZShcInBhdGNoQ29tcGxldGVkXCIsIChwYXRjaENvbXBsZXRlZEV2ZW50OiBVSTVFdmVudDx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4pID0+IHtcblx0XHRcdFx0XHQvLyBSZS1lbmFibGUgRVRhZyBjaGVja3Ncblx0XHRcdFx0XHRpZiAoaWdub3JlRVRhZykge1xuXHRcdFx0XHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5zZXRJZ25vcmVFVGFnKGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAob0V2ZW50LmdldFNvdXJjZSgpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoKFxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRcdFx0c291cmNlQmluZGluZyxcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGJTdWNjZXNzID0gcGF0Y2hDb21wbGV0ZWRFdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0XHRcdGlmIChiU3VjY2Vzcykge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLnVwZGF0ZURvY3VtZW50KHNvdXJjZUJpbmRpbmcsIG9QYXRjaFByb21pc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBjcmVhdGVTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgc2VudCBieSB0aGUgYmluZGluZ1xuXHQgKi9cblx0aGFuZGxlQ3JlYXRlU2VudChldmVudDogVUk1RXZlbnQ8eyBjb250ZXh0OiBDb250ZXh0IH0+KTogdm9pZCB7XG5cdFx0Y29uc3QgY29udGV4dCA9IGV2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIik7XG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhmYWxzZSwgZmFsc2UsIGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQZXJmb3JtcyBhIHRhc2sgaW4gc3luYyB3aXRoIG90aGVyIHRhc2tzIGNyZWF0ZWQgdmlhIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFJldHVybnMgdGhlIHByb21pc2UgY2hhaW4gb2YgdGhlIHRhc2suXG5cdCAqXG5cdCAqIEBwYXJhbSBbbmV3VGFza10gT3B0aW9uYWwsIGEgcHJvbWlzZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBzeW5jaHJvbm91c2x5XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgdGFzayBpcyBjb21wbGV0ZWRcblx0ICovXG5cdGFzeW5jIHN5bmNUYXNrPFQ+KG5ld1Rhc2s/OiAoKCkgPT4gVCkgfCBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG5cdFx0aWYgKG5ld1Rhc2spIHtcblx0XHRcdGlmICh0eXBlb2YgbmV3VGFzayA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRoaXMuc3luY1Rhc2tzID0gdGhpcy5zeW5jVGFza3MudGhlbihuZXdUYXNrKS5jYXRjaChmdW5jdGlvbiAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0TG9nLmRlYnVnKGVyciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuc3luY1Rhc2tzID0gdGhpcy5zeW5jVGFza3Ncblx0XHRcdFx0XHQudGhlbihhc3luYyAoKSA9PiBuZXdUYXNrKVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZGVidWcoZXJyIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2tzIGFzIFByb21pc2U8VD47XG5cdH1cblxuXHQvKipcblx0ICogRGVjaWRlcyBpZiBhIGRvY3VtZW50IGlzIHRvIGJlIHNob3duIGluIGRpc3BsYXkgb3IgZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgZGlzcGxheWVkIG9yIGVkaXRlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0IG1vZGUgaXMgY29tcHV0ZWRcblx0ICovXG5cblx0YXN5bmMgY29tcHV0ZUVkaXRNb2RlKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHRjb25zdCBnbG9iYWxNb2RlbCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlUGVuZGluZ1wiLCB0cnVlLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0XHRjb25zdCBpc0FjdGl2ZUVudGl0eSA9IGF3YWl0IGNvbnRleHQucmVxdWVzdE9iamVjdChcIklzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRpZiAoaXNBY3RpdmVFbnRpdHkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0Ly8gaW4gY2FzZSB0aGUgZG9jdW1lbnQgaXMgZHJhZnQgc2V0IGl0IGluIGVkaXQgbW9kZVxuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUpO1xuXHRcdFx0XHRcdGNvbnN0IGhhc0FjdGl2ZUVudGl0eSA9IGF3YWl0IGNvbnRleHQucmVxdWVzdE9iamVjdChcIkhhc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKHVuZGVmaW5lZCwgIWhhc0FjdGl2ZUVudGl0eSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gYWN0aXZlIGRvY3VtZW50LCBzdGF5IG9uIGRpc3BsYXkgbW9kZVxuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVQZW5kaW5nXCIsIGZhbHNlLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGV0ZXJtaW5pbmcgdGhlIGVkaXRNb2RlIGZvciBkcmFmdFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBsYXN0SW52b2tlZEFjdGlvbk5hbWUgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiKTtcblx0XHRcdGlmIChsYXN0SW52b2tlZEFjdGlvbk5hbWUgJiYgdGhpcy5pc05ld0FjdGlvbkZvclN0aWNreShsYXN0SW52b2tlZEFjdGlvbk5hbWUsIGNvbnRleHQpKSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIHRydWUpO1xuXHRcdFx0XHRpZiAoIXRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPbihjb250ZXh0KTtcblx0XHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCksIGNvbnRleHQuZ2V0TW9kZWwoKSk7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHJpdmF0ZSBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIEludGVybmFsIG1ldGhvZCB0byBkZWxldGUgYSBjb250ZXh0IG9yIGFuIGFycmF5IG9mIGNvbnRleHRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dHMgVGhlIGNvbnRleHQocykgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBQYXJhbWV0ZXJzIGZvciBkZWxldGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFja1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY29udHJvbElkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm5vRGlhbG9nXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRpdGxlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRlc2NyaXB0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5sb2NrZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmVcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihcblx0XHRjb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSxcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRyb2w/OiBDb250cm9sO1xuXHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0cz86IGJvb2xlYW47XG5cdFx0XHRub0RpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHR0aXRsZT86IHN0cmluZztcblx0XHRcdGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgeyBwYXRoOiBzdHJpbmcgfTtcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHM/OiBudW1iZXI7XG5cdFx0XHR1blNhdmVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRsb2NrZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmU/OiBEcmFmdFNpYmxpbmdQYWlyW107XG5cdFx0XHRkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlPzogQ29udGV4dFtdO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0Ly8gYXMgc2VsZWN0ZWQgY29udGV4dHMgbWF5IGluY2x1ZGUgaW5hY3RpdmUgY29udGV4dCB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhpcyBwYXJhbWV0ZXIgYWdhaW4gdG8gZW5zdXJlIGRlbGV0ZSBoZWxwZXIgd29ya3MgcHJvcGVybHlcblx0XHRcdHBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID0gcGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzLmxlbmd0aDtcblx0XHR9XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IHRoaXMuX2dldFJlc291cmNlTW9kZWwoKTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdC8vIFRPRE86IHRoaXMgc2V0dGluZyBhbmQgcmVtb3Zpbmcgb2YgY29udGV4dHMgc2hvdWxkbid0IGJlIGluIHRoZSB0cmFuc2FjdGlvbiBoZWxwZXIgYXQgYWxsXG5cdFx0Ly8gZm9yIHRoZSB0aW1lIGJlaW5nIEkga2VwdCBpdCBhbmQgcHJvdmlkZSB0aGUgaW50ZXJuYWwgbW9kZWwgY29udGV4dCB0byBub3QgYnJlYWsgc29tZXRoaW5nXG5cdFx0cGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IHBhcmFtZXRlcnMuY29udHJvbElkXG5cdFx0XHQ/IChFbGVtZW50LmdldEVsZW1lbnRCeUlkKHBhcmFtZXRlcnMuY29udHJvbElkKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IHVuZGVmaW5lZClcblx0XHRcdDogbnVsbDtcblxuXHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5kZWxldGVEb2N1bWVudChjb250ZXh0cywgcGFyYW1ldGVycywgdGhpcy5nZXRBcHBDb21wb25lbnQoKSwgcmVzb3VyY2VNb2RlbCwgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpKTtcblx0fVxuXG5cdF9nZXRSZXNvdXJjZU1vZGVsKCk6IFJlc291cmNlTW9kZWwge1xuXHRcdHJldHVybiBnZXRSZXNvdXJjZU1vZGVsKHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTogdHlwZW9mIFRyYW5zYWN0aW9uSGVscGVyIHtcblx0XHRyZXR1cm4gVHJhbnNhY3Rpb25IZWxwZXI7XG5cdH1cblxuXHRwcml2YXRlIGdldE1lc3NhZ2VIYW5kbGVyKCk6IE1lc3NhZ2VIYW5kbGVyIHtcblx0XHRpZiAodGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSBoYW5kbGVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0SW50ZXJuYWxNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0R2xvYmFsVUlNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gYkNyZWF0aW9uTW9kZSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbmV3XG5cdCAqL1xuXHRwcml2YXRlIHNldENyZWF0aW9uTW9kZShiQ3JlYXRpb25Nb2RlOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3QgdWlNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpIGFzIENvbnRleHQ7XG5cdFx0dGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuc2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5DcmVhdGVNb2RlLCBiQ3JlYXRpb25Nb2RlLCB1aU1vZGVsQ29udGV4dCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0IG9yIG5vdC5cblx0ICpcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0Z2V0Q3JlYXRpb25Nb2RlKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHVpTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJ1aVwiKSBhcyBDb250ZXh0O1xuXHRcdHJldHVybiAhIXRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuQ3JlYXRlTW9kZSwgdWlNb2RlbENvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIChvciBvbmUgb2YgaXRzIHN1Yi1vYmplY3RzKSBoYXMgYmVlbiBtb2RpZmllZCBvciBub3QuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZFxuXHQgKi9cblx0cHJpdmF0ZSBpc0RvY3VtZW50TW9kaWZpZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICEhdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIG9iamVjdCBiZWluZyBlZGl0ZWQgKG9yIG9uZSBvZiBpdHMgc3ViLW9iamVjdHMpIGhhcyBiZWVuIG1vZGlmaWVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gbW9kaWZpZWQgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkXG5cdCAqL1xuXHRwcml2YXRlIHNldERvY3VtZW50TW9kaWZpZWQobW9kaWZpZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5zZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkRvY3VtZW50TW9kaWZpZWQsIG1vZGlmaWVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIG9iamVjdCBiZWluZyBlZGl0ZWQgaGFzIGJlZW4gbW9kaWZpZWQgYnkgY3JlYXRpbmcgYSBzdWItb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZyBvbiB3aGljaCB0aGUgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogdm9pZCB7XG5cdFx0Ly8gU2V0IHRoZSBtb2RpZmllZCBmbGFnIG9ubHkgb24gcmVsYXRpdmUgbGlzdEJpbmRpbmdzLCBpLmUuIHdoZW4gY3JlYXRpbmcgYSBzdWItb2JqZWN0XG5cdFx0Ly8gSWYgdGhlIGxpc3RCaW5kaW5nIGlzIG5vdCByZWxhdGl2ZSwgdGhlbiBpdCdzIGEgY3JlYXRpb24gZnJvbSB0aGUgTGlzdFJlcG9ydCwgYW5kIGJ5IGRlZmF1bHQgYSBuZXdseSBjcmVhdGVkIHJvb3Qgb2JqZWN0IGlzbid0IGNvbnNpZGVyZWQgYXMgbW9kaWZpZWRcblx0XHRpZiAobGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIGNyZWF0ZSBldmVudDogc2hvd3MgbWVzc2FnZXMgYW5kIGluIGNhc2Ugb2YgYSBkcmFmdCwgdXBkYXRlcyB0aGUgZHJhZnQgaW5kaWNhdG9yLlxuXHQgKlxuXHQgKiBAcGFyYW0gYmluZGluZyBPRGF0YSBsaXN0IGJpbmRpbmcgb2JqZWN0XG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZUNyZWF0ZUV2ZW50cyhiaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGJpbmRpbmcpO1xuXG5cdFx0YmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZVNlbnRcIiwgKCkgPT4ge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGJpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVDb21wbGV0ZWRcIiwgKG9FdmVudDogVUk1RXZlbnQ8eyBzdWNjZXNzOiBib29sZWFuIH0+KTogdm9pZCA9PiB7XG5cdFx0XHRjb25zdCBzdWNjZXNzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKHN1Y2Nlc3MgPyBEcmFmdFN0YXR1cy5TYXZlZCA6IERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBtZXNzYWdlIChkaXNwbGF5ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSkuXG5cdCAqXG5cdCAqIEBwYXJhbSBkcmFmdFN0YXR1cyBUaGUgZHJhZnQgc3RhdHVzIG1lc3NhZ2Vcblx0ICovXG5cdHNldERyYWZ0U3RhdHVzKGRyYWZ0U3RhdHVzOiBzdHJpbmcpOiB2b2lkIHtcblx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWwpLnNldFByb3BlcnR5KFwiL2RyYWZ0U3RhdHVzXCIsIGRyYWZ0U3RhdHVzLCB1bmRlZmluZWQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb2dyYW1taW5nIG1vZGVsIGZyb20gYSBiaW5kaW5nIG9yIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHNvdXJjZSBUaGUgYmluZGluZyBvciBjb250ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKi9cblx0cHJpdmF0ZSBnZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZTogQ29udGV4dCB8IEJpbmRpbmcpOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5nZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBAcGFyYW0gZWRpdE1vZGUgVGhlIGVkaXQgbW9kZVxuXHQgKiBAcGFyYW0gaXNDcmVhdGlvbiBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbmV3bHkgY3JlYXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXRFZGl0TW9kZShlZGl0TW9kZT86IHN0cmluZywgaXNDcmVhdGlvbj86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBmcmVlc3R5bGUgdXNhZ2UgdGhlcmVmb3JlIHdlIGNhblxuXHRcdC8vIHJlbHkgb24gdGhlIGdsb2JhbCBVSSBtb2RlbCB0byBleGlzdFxuXHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHRpZiAoZWRpdE1vZGUpIHtcblx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIiwgZWRpdE1vZGUgPT09IFwiRWRpdGFibGVcIiwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdGlmIChlZGl0TW9kZSAhPT0gXCJFZGl0YWJsZVwiKSB7XG5cdFx0XHRcdHRoaXMuZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQoZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChpc0NyZWF0aW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFNpbmNlIHNldENyZWF0aW9uTW9kZSBpcyBwdWJsaWMgaW4gRWRpdEZsb3cgYW5kIGNhbiBiZSBvdmVycmlkZW4sIG1ha2Ugc3VyZSB0byBjYWxsIGl0IHZpYSB0aGUgY29udHJvbGxlclxuXHRcdFx0Ly8gdG8gZW5zdXJlIGFueSBvdmVycmlkZXMgYXJlIHRha2VuIGludG8gYWNjb3VudFxuXHRcdFx0dGhpcy5zZXRDcmVhdGlvbk1vZGUoaXNDcmVhdGlvbik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGZsYWcgdG8gZm9yY2UgU2F2ZSBvciBEaXNjYXJkIHdoZW4gbGVhdmluZyBhIGRyYWZ0LlxuXHQgKiBAcGFyYW0gZm9yY2VkXG5cdCAqL1xuXHRwcml2YXRlIGZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKGZvcmNlZDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFwiL2ZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkXCIsIGZvcmNlZCwgdW5kZWZpbmVkLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgd2Ugc2hvdWxkIGZvcmNlIHRoZSB1c2VyIHRvIFNhdmUgb3IgRGlzY2FyZCB3aGVuIGxlYXZpbmcgYSBkcmFmdCwgb3IgaWYga2VlcGluZyB0aGUgZHJhZnQgaXMgYWxsb3dlZC5cblx0ICpcblx0ICogQHJldHVybnMgVHJ1ZSBpZiBrZWVwaW5nIHRoZSBkcmFmdCBpcyBub3QgYWxsb3dlZFxuXHQgKi9cblx0c2hhbGxGb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvZm9yY2VEcmFmdFNhdmVPckRpc2NhcmRcIikgPT09IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGFuIGFjdGlvbiBjb3JyZXNwb25kcyB0byBhIGNyZWF0ZSBhY3Rpb24gZm9yIGEgc3RpY2t5IHNlc3Npb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBmb3IgdGhlIHN0aWNreSBzZXNzaW9uXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGFjdGlvbiBpcyBhIGNyZWF0ZSBhY3Rpb25cblx0ICovXG5cdHByaXZhdGUgaXNOZXdBY3Rpb25Gb3JTdGlja3koYWN0aW9uTmFtZTogc3RyaW5nLCBjb250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkuc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdFx0Y29uc3Qgc3RpY2t5U2Vzc2lvbiA9IGVudGl0eVNldC5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkO1xuXHRcdFx0aWYgKHN0aWNreVNlc3Npb24/Lk5ld0FjdGlvbiA9PT0gYWN0aW9uTmFtZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChzdGlja3lTZXNzaW9uPy5BZGRpdGlvbmFsTmV3QWN0aW9ucyAmJiBzdGlja3lTZXNzaW9uPy5BZGRpdGlvbmFsTmV3QWN0aW9ucy5pbmNsdWRlcyhhY3Rpb25OYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvLyBUT0RPIE1vdmUgYWxsIHN0aWNreS1yZWxhdGVkIGJlbG93IHRvIGEgc3RpY2t5IHNlc3Npb24gbWFuYWdlciBjbGFzc1xuXG5cdC8qKlxuXHQgKiBFbmFibGVzIHRoZSBzdGlja3kgZWRpdCBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWRcblx0ICogQHJldHVybnMgVHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVTdGlja3lPbihjb250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T25cIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuaGFzTmF2aWdhdGlvbkd1YXJkKCkpIHtcblx0XHRcdFx0Y29uc3QgaGFzaFRyYWNrZXIgPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCk7XG5cdFx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblxuXHRcdFx0XHQvLyBTZXQgYSBndWFyZCBpbiB0aGUgUm91dGVyUHJveHlcblx0XHRcdFx0Ly8gQSB0aW1lb3V0IGlzIG5lY2Vzc2FyeSwgYXMgd2l0aCBkZWZlcnJlZCBjcmVhdGlvbiB0aGUgaGFzaENoYW5nZXIgaXMgbm90IHVwZGF0ZWQgeWV0IHdpdGhcblx0XHRcdFx0Ly8gdGhlIG5ldyBoYXNoLCBhbmQgdGhlIGd1YXJkIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5IG9mIHRoZSByb3V0ZXIgcHJveHlcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0TmF2aWdhdGlvbkd1YXJkKGNvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7XG5cdFx0XHRcdH0sIDApO1xuXG5cdFx0XHRcdC8vIFNldHRpbmcgYmFjayBuYXZpZ2F0aW9uIG9uIHNoZWxsIHNlcnZpY2UsIHRvIGdldCB0aGUgZGljYXJkIG1lc3NhZ2UgYm94IGluIGNhc2Ugb2Ygc3RpY2t5XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24odGhpcy5vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uLmJpbmQodGhpcywgY29udGV4dCkpO1xuXG5cdFx0XHRcdHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24gPSB0aGlzLmdldERpcnR5U3RhdGVQcm92aWRlcihhcHBDb21wb25lbnQsIGludGVybmFsTW9kZWwsIGhhc2hUcmFja2VyKTtcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcih0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uKTtcblxuXHRcdFx0XHQvLyBoYW5kbGUgc2Vzc2lvbiB0aW1lb3V0XG5cdFx0XHRcdGNvbnN0IGkxOG5Nb2RlbCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5zZXNzaW9uVGltZW91dEZ1bmN0aW9uID0gdGhpcy5nZXRTZXNzaW9uVGltZW91dEZ1bmN0aW9uKGNvbnRleHQsIGkxOG5Nb2RlbCk7XG5cdFx0XHRcdHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoKS5hdHRhY2hTZXNzaW9uVGltZW91dCh0aGlzLnNlc3Npb25UaW1lb3V0RnVuY3Rpb24pO1xuXG5cdFx0XHRcdHRoaXMuc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uID0gdGhpcy5nZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbihjb250ZXh0LCBhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5hdHRhY2hSb3V0ZU1hdGNoZWQoe30sIHRoaXMuc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICpcblx0ICogQHJldHVybnMgVHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVTdGlja3lPZmYoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9mZlwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSkge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbikge1xuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLmRlcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIodGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbik7XG5cdFx0XHRcdHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRcdFx0aWYgKG1vZGVsICYmIHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbikge1xuXHRcdFx0XHRtb2RlbC5kZXRhY2hTZXNzaW9uVGltZW91dCh0aGlzLnNlc3Npb25UaW1lb3V0RnVuY3Rpb24pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24pIHtcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoUm91dGVNYXRjaGVkKHRoaXMuc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG5cblx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdF9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWw6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwpOiB2b2lkIHtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIHRydWUpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zdGlja3lTZXNzaW9uVG9rZW5cIiwgbW9kZWwuZ2V0SHR0cEhlYWRlcnModHJ1ZSlbXCJTQVAtQ29udGV4dElkXCJdKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYXMgYSBEaXJ0eVN0YXRlUHJvdmlkZXIgaW4gdGhlIFNoZWxsLlxuXHQgKlxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsIFRoZSBtb2RlbCBcImludGVybmFsXCJcblx0ICogQHBhcmFtIGhhc2hUcmFja2VyIEhhc2ggdHJhY2tlclxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0RGlydHlTdGF0ZVByb3ZpZGVyKGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBpbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwsIGhhc2hUcmFja2VyOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gKG5hdmlnYXRpb25Db250ZXh0OiB7IGlubmVyQXBwUm91dGU6IHN0cmluZyB9KTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAobmF2aWdhdGlvbkNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBmb3IgRGlydHlTdGF0ZVByb3ZpZGVyIGZ1bmN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgdGFyZ2V0SGFzaCA9IG5hdmlnYXRpb25Db250ZXh0LmlubmVyQXBwUm91dGU7XG5cdFx0XHRcdGNvbnN0IHJvdXRlclByb3h5ID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cdFx0XHRcdGxldCBsY2xIYXNoVHJhY2tlciA9IFwiXCI7XG5cdFx0XHRcdGxldCBpc0RpcnR5OiBib29sZWFuO1xuXHRcdFx0XHRjb25zdCBpc1Nlc3Npb25PbiA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0XHRcdGlmICghaXNTZXNzaW9uT24pIHtcblx0XHRcdFx0XHQvLyBJZiB0aGUgc3RpY2t5IHNlc3Npb24gd2FzIHRlcm1pbmF0ZWQgYmVmb3JlIGhhbmQuXG5cdFx0XHRcdFx0Ly8gRXhhbXBsZSBpbiBjYXNlIG9mIG5hdmlnYXRpbmcgYXdheSBmcm9tIGFwcGxpY2F0aW9uIHVzaW5nIElCTi5cblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFyb3V0ZXJQcm94eS5pc05hdmlnYXRpb25GaW5hbGl6ZWQoKSkge1xuXHRcdFx0XHRcdC8vIElmIG5hdmlnYXRpb24gaXMgY3VycmVudGx5IGhhcHBlbmluZyBpbiBSb3V0ZXJQcm94eSwgaXQncyBhIHRyYW5zaWVudCBzdGF0ZVxuXHRcdFx0XHRcdC8vIChub3QgZGlydHkpXG5cdFx0XHRcdFx0aXNEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHRcdGxjbEhhc2hUcmFja2VyID0gdGFyZ2V0SGFzaDtcblx0XHRcdFx0fSBlbHNlIGlmIChoYXNoVHJhY2tlciA9PT0gdGFyZ2V0SGFzaCkge1xuXHRcdFx0XHRcdC8vIHRoZSBoYXNoIGRpZG4ndCBjaGFuZ2Ugc28gZWl0aGVyIHRoZSB1c2VyIGF0dGVtcHRzIHRvIHJlZnJlc2ggb3IgdG8gbGVhdmUgdGhlIGFwcFxuXHRcdFx0XHRcdGlzRGlydHkgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHJvdXRlclByb3h5LmNoZWNrSGFzaFdpdGhHdWFyZCh0YXJnZXRIYXNoKSB8fCByb3V0ZXJQcm94eS5pc0d1YXJkQ3Jvc3NBbGxvd2VkQnlVc2VyKCkpIHtcblx0XHRcdFx0XHQvLyB0aGUgdXNlciBhdHRlbXB0cyB0byBuYXZpZ2F0ZSB3aXRoaW4gdGhlIHJvb3Qgb2JqZWN0XG5cdFx0XHRcdFx0Ly8gb3IgY3Jvc3NpbmcgdGhlIGd1YXJkIGhhcyBhbHJlYWR5IGJlZW4gYWxsb3dlZCBieSB0aGUgUm91dGVyUHJveHlcblx0XHRcdFx0XHRsY2xIYXNoVHJhY2tlciA9IHRhcmdldEhhc2g7XG5cdFx0XHRcdFx0aXNEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgYXBwLCBmb3IgZXhhbXBsZSBiYWNrIHRvIHRoZSBsaXN0IHJlcG9ydFxuXHRcdFx0XHRcdGlzRGlydHkgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzRGlydHkpIHtcblx0XHRcdFx0XHQvLyB0aGUgRkxQIGRvZXNuJ3QgY2FsbCB0aGUgZGlydHkgc3RhdGUgcHJvdmlkZXIgYW55bW9yZSBvbmNlIGl0J3MgZGlydHksIGFzIHRoZXkgY2FuJ3Rcblx0XHRcdFx0XHQvLyBjaGFuZ2UgdGhpcyBkdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHNldCBpdCBiYWNrIHRvIG5vdC1kaXJ0eVxuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXREaXJ0eUZsYWcoZmFsc2UpO1xuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGhhc2hUcmFja2VyID0gbGNsSGFzaFRyYWNrZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gaXNEaXJ0eTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgdXNlZCB3aGVuIGEgc3RpY2t5IHNlc3Npb24gdGltZXMgb3V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc3RpY2t5Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHN0aWNreSBzZXNzaW9uXG5cdCAqIEBwYXJhbSBpMThuTW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24oc3RpY2t5Q29udGV4dDogQ29udGV4dCwgaTE4bk1vZGVsOiBNb2RlbCkge1xuXHRcdHJldHVybiAoKTogdW5kZWZpbmVkIHwgYm9vbGVhbiA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoc3RpY2t5Q29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBtaXNzaW5nIGZvciBTZXNzaW9uVGltZW91dCBmdW5jdGlvblwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyByZW1vdmUgdHJhbnNpZW50IG1lc3NhZ2VzIHNpbmNlIHdlIHdpbGwgc2hvd2luZyBvdXIgb3duIG1lc3NhZ2Vcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0XHRcdGNvbnN0IHdhcm5pbmdEaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHR0aXRsZTogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX1RJVExFfVwiLFxuXHRcdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0XHRjb250ZW50OiBuZXcgVGV4dCh7IHRleHQ6IFwie3NhcC5mZS5pMThuPkNfRURJVEZMT1dfT0JKRUNUX1BBR0VfU0VTU0lPTl9FWFBJUkVEX0RJQUxPR19NRVNTQUdFfVwiIH0pLFxuXHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IFwie3NhcC5mZS5pMThuPkNfQ09NTU9OX0RJQUxPR19PS31cIixcblx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0cHJlc3M6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIHN0aWNreSBoYW5kbGluZyBhZnRlciBuYXZpZ2F0aW9uIHNpbmNlIHNlc3Npb24gaGFzIGFscmVhZHkgYmVlbiB0ZXJtaW5hdGVkXG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQoc3RpY2t5Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdFx0d2FybmluZ0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d2FybmluZ0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0d2FybmluZ0RpYWxvZy5zZXRNb2RlbChpMThuTW9kZWwsIFwic2FwLmZlLmkxOG5cIik7XG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLmFkZERlcGVuZGVudCh3YXJuaW5nRGlhbG9nKTtcblx0XHRcdFx0d2FybmluZ0RpYWxvZy5vcGVuKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBvblJvdXRlTWF0Y2hlZCBldmVudCBpbiBjYXNlIG9mIHN0aWNreSBlZGl0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgKHJvb3Qgb2YgdGhlIHN0aWNreSBzZXNzaW9uKVxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbihjb250ZXh0OiBDb250ZXh0LCBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCkge1xuXHRcdHJldHVybiAoKTogdm9pZCA9PiB7XG5cdFx0XHRjb25zdCBjdXJyZW50SGFzaCA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRcdC8vIGVpdGhlciBjdXJyZW50IGhhc2ggaXMgZW1wdHkgc28gdGhlIHVzZXIgbGVmdCB0aGUgYXBwIG9yIGhlIG5hdmlnYXRlZCBhd2F5IGZyb20gdGhlIG9iamVjdFxuXHRcdFx0aWYgKCFjdXJyZW50SGFzaCB8fCAhYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuY2hlY2tIYXNoV2l0aEd1YXJkKGN1cnJlbnRIYXNoKSkge1xuXHRcdFx0XHR0aGlzLmRpc2NhcmRTdGlja3lTZXNzaW9uKGNvbnRleHQpO1xuXHRcdFx0XHRjb250ZXh0LmdldE1vZGVsKCkuY2xlYXJTZXNzaW9uQ29udGV4dCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogRW5kcyBhIHN0aWNreSBzZXNzaW9uIGJ5IGRpc2NhcmRpbmcgY2hhbmdlcy5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkIChyb290IG9mIHRoZSBzdGlja3kgc2Vzc2lvbilcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGRpc2NhcmRlZENvbnRleHQgPSBhd2FpdCBzdGlja3kuZGlzY2FyZERvY3VtZW50KGNvbnRleHQpO1xuXHRcdGlmIChkaXNjYXJkZWRDb250ZXh0Py5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRkaXNjYXJkZWRDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLmdldENyZWF0aW9uTW9kZSgpKSB7XG5cdFx0XHRkaXNjYXJkZWRDb250ZXh0Py5yZWZyZXNoKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBpbnRlcm5hbCByb3V0aW5nIGV4dGVuc2lvbi5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGludGVybmFsIHJvdXRpbmcgZXh0ZW5zaW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldEludGVybmFsUm91dGluZygpOiBJbnRlcm5hbFJvdXRpbmcge1xuXHRcdGlmICh0aGlzLmJhc2UuX3JvdXRpbmcpIHtcblx0XHRcdHJldHVybiB0aGlzLmJhc2UuX3JvdXRpbmc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgRmxvdyB3b3JrcyBvbmx5IHdpdGggYSBnaXZlbiByb3V0aW5nIGxpc3RlbmVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTogUm9vdFZpZXdCYXNlQ29udHJvbGxlciB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdH1cblxuXHRfZ2V0U2VtYW50aWNNYXBwaW5nKCk6IFNlbWFudGljTWFwcGluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRMYXN0U2VtYW50aWNNYXBwaW5nKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBwcm9taXNlIHRvIHdhaXQgZm9yIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZC5cblx0ICpcblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udHJvbElkIFRoZSBJRCBvZiB0aGUgY29udHJvbFxuXHQgKiBAcmV0dXJucyBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXh0ZXJuYWxseSByZXNvbHZlIHRoZSBwcm9taXNlXG5cdCAqL1xuXHRwcml2YXRlIGNyZWF0ZUFjdGlvblByb21pc2UoYWN0aW9uTmFtZTogc3RyaW5nLCBjb250cm9sSWQ6IHN0cmluZyk6IHsgZlJlc29sdmVyOiBGdW5jdGlvbjsgZlJlamVjdG9yOiBGdW5jdGlvbiB9IHtcblx0XHRsZXQgcmVzb2x2ZUZ1bmN0aW9uOiBGdW5jdGlvbiwgcmVqZWN0RnVuY3Rpb246IEZ1bmN0aW9uO1xuXHRcdHRoaXMuYWN0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPHsgY29udHJvbElkPzogc3RyaW5nOyBvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM6IHN0cmluZ1tdIH0+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHJlc29sdmVGdW5jdGlvbiA9IHJlc29sdmU7XG5cdFx0XHRyZWplY3RGdW5jdGlvbiA9IHJlamVjdDtcblx0XHR9KS50aGVuKChvUmVzcG9uc2U6IHVua25vd24pID0+IHtcblx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKFxuXHRcdFx0XHR7IGNvbnRyb2xJZCB9LFxuXHRcdFx0XHR0aGlzLmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoXG5cdFx0XHRcdFx0YWN0aW9uTmFtZSxcblx0XHRcdFx0XHRvUmVzcG9uc2UgYXMgdW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH0pO1xuXHRcdHJldHVybiB7IGZSZXNvbHZlcjogcmVzb2x2ZUZ1bmN0aW9uISwgZlJlamVjdG9yOiByZWplY3RGdW5jdGlvbiEgfTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRoYXQgaXMgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHJlc3BvbnNlIFRoZSBib3VuZCBhY3Rpb24ncyByZXNwb25zZSBkYXRhIG9yIHJlc3BvbnNlIGNvbnRleHRcblx0ICogQHJldHVybnMgT2JqZWN0IHdpdGggZGF0YSBhbmQgbmFtZXMgb2YgdGhlIGtleSBmaWVsZHMgb2YgdGhlIHJlc3BvbnNlXG5cdCAqL1xuXHRwcml2YXRlIGdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoXG5cdFx0YWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdHJlc3BvbnNlPzogKHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10pIHwgbnVsbFxuXHQpOiB7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2UpKSB7XG5cdFx0XHRpZiAocmVzcG9uc2UubGVuZ3RoID49IDEpIHtcblx0XHRcdFx0cmVzcG9uc2UgPSAocmVzcG9uc2VbMF0gYXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4pLnZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCFyZXNwb25zZSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgY3VycmVudFZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbERhdGEgPSAoY3VycmVudFZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXREYXRhKCkgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdGNvbnN0IG1ldGFNb2RlbEFjdGlvbiA9IG1ldGFNb2RlbERhdGFbYWN0aW9uTmFtZV0gYXMgTWV0YU1vZGVsQWN0aW9uW10gfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgYWN0aW9uUmV0dXJuVHlwZSA9IG1ldGFNb2RlbEFjdGlvbj8uWzBdLiRSZXR1cm5UeXBlID8gbWV0YU1vZGVsQWN0aW9uPy5bMF0uJFJldHVyblR5cGUuJFR5cGUgOiBudWxsO1xuXHRcdGNvbnN0IGtleXMgPVxuXHRcdFx0YWN0aW9uUmV0dXJuVHlwZSAmJiAobWV0YU1vZGVsRGF0YVthY3Rpb25SZXR1cm5UeXBlXSBhcyBNZXRhTW9kZWxFbnRpdHlUeXBlKVxuXHRcdFx0XHQ/IChtZXRhTW9kZWxEYXRhW2FjdGlvblJldHVyblR5cGVdIGFzIE1ldGFNb2RlbEVudGl0eVR5cGUpLiRLZXlcblx0XHRcdFx0OiBbXTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRvRGF0YTogcmVzcG9uc2UuZ2V0T2JqZWN0KCksXG5cdFx0XHRrZXlzXG5cdFx0fTtcblx0fVxuXG5cdGFzeW5jIGdldEN1cnJlbnRBY3Rpb25Qcm9taXNlKCk6IFByb21pc2U8eyBjb250cm9sSWQ/OiBzdHJpbmc7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfSB8IHVuZGVmaW5lZD4ge1xuXHRcdHJldHVybiB0aGlzLmFjdGlvblByb21pc2U7XG5cdH1cblxuXHRkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpOiB2b2lkIHtcblx0XHR0aGlzLmFjdGlvblByb21pc2UgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRhc3luYyBzaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyhpc1NhdmU6IGJvb2xlYW4pOiBQcm9taXNlPFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24+IHtcblx0XHRpZiAoIXRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZykge1xuXHRcdFx0dGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nID0gbmV3IENvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ0Jsb2NrKHtcblx0XHRcdFx0dmlldzogdGhpcy5nZXRWaWV3KClcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nPy5vcGVuKGlzU2F2ZSk7XG5cdH1cblxuXHRfc2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93KHRhYmxlOiBUYWJsZSk6IHZvaWQge1xuXHRcdGNvbnN0IHJvd0JpbmRpbmcgPSB0YWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0Y29uc3QgYWN0aXZlUm93SW5kZXg6IG51bWJlciA9IHJvd0JpbmRpbmcuZ2V0Q291bnQoKSB8fCAwO1xuXHRcdGlmICh0YWJsZS5kYXRhKFwidGFibGVUeXBlXCIpICE9PSBcIlJlc3BvbnNpdmVUYWJsZVwiKSB7XG5cdFx0XHRpZiAoYWN0aXZlUm93SW5kZXggPiAwKSB7XG5cdFx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgoYWN0aXZlUm93SW5kZXggLSAxKTtcblx0XHRcdH1cblx0XHRcdHRhYmxlLmZvY3VzUm93KGFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0LyogSW4gYSByZXNwb25zaXZlIHRhYmxlLCB0aGUgZW1wdHkgcm93cyBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFibGUuIEJ1dCB3aGVuIHdlIGNyZWF0ZSBtb3JlLCB0aGV5IGFwcGVhciBiZWxvdyB0aGUgbmV3IGxpbmUuXG5cdFx0XHQgKiBTbyB3ZSBjaGVjayB0aGUgZmlyc3QgaW5hY3RpdmUgcm93IGZpcnN0LCB0aGVuIHdlIHNldCB0aGUgZm9jdXMgb24gaXQgd2hlbiB3ZSBwcmVzcyB0aGUgYnV0dG9uLlxuXHRcdFx0ICogVGhpcyBkb2Vzbid0IGltcGFjdCB0aGUgR3JpZFRhYmxlIGJlY2F1c2UgdGhleSBhcHBlYXIgYXQgdGhlIGVuZCwgYW5kIHdlIGFscmVhZHkgZm9jdXMgdGhlIGJlZm9yZS10aGUtbGFzdCByb3cgKGJlY2F1c2UgMiBlbXB0eSByb3dzIGV4aXN0KVxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBhbGxSb3dDb250ZXh0cyA9IHJvd0JpbmRpbmcuZ2V0Q29udGV4dHMoKTtcblx0XHRcdGlmICghYWxsUm93Q29udGV4dHM/Lmxlbmd0aCkge1xuXHRcdFx0XHR0YWJsZS5mb2N1c1JvdyhhY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBmb2N1c1JvdyA9IGFjdGl2ZVJvd0luZGV4LFxuXHRcdFx0XHRpbmRleCA9IDA7XG5cdFx0XHRmb3IgKGNvbnN0IHNpbmdsZUNvbnRleHQgb2YgYWxsUm93Q29udGV4dHMpIHtcblx0XHRcdFx0aWYgKHNpbmdsZUNvbnRleHQuaXNJbmFjdGl2ZSgpICYmIGluZGV4IDwgZm9jdXNSb3cpIHtcblx0XHRcdFx0XHRmb2N1c1JvdyA9IGluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZm9jdXNSb3cgPiAwKSB7XG5cdFx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgoZm9jdXNSb3cpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coZm9jdXNSb3csIHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzKHRhYmxlOiBUYWJsZSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHRhYmxlQVBJID0gdGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0aWYgKFxuXHRcdFx0dGFibGVBUEk/LnRhYmxlRGVmaW5pdGlvbj8uY29udHJvbD8uaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSAmJlxuXHRcdFx0IXRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwidWlcIik/LmdldFByb3BlcnR5KFwiY3JlYXRlTW9kZVwiKVxuXHRcdCkge1xuXHRcdFx0Ly8gV2l0aCB0aGUgcGFyYW1ldGVyLCB3ZSBkb24ndCBoYXZlIGVtcHR5IHJvd3MgaW4gRWRpdCBtb2RlLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGVtIGJlZm9yZSBzZXR0aW5nIHRoZSBmb2N1cyBvbiB0aGVtXG5cdFx0XHRhd2FpdCB0YWJsZUFQSS5zZXRVcEVtcHR5Um93cyh0YWJsZSwgdHJ1ZSk7XG5cdFx0fVxuXHRcdHRoaXMuX3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyh0YWJsZSk7XG5cdH1cblxuXHRfc2VuZEFjdGl2aXR5KFxuXHRcdGFjdGlvbjogQWN0aXZpdHksXG5cdFx0cmVsYXRlZENvbnRleHRzOiBDb250ZXh0IHwgQ29udGV4dFtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcblx0XHR0cmlnZ2VyZWRBY3Rpb25OYW1lPzogc3RyaW5nLFxuXHRcdHJlZnJlc2hMaXN0QmluZGluZz86IGJvb2xlYW4sXG5cdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcz86IHN0cmluZ1tdXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBBcnJheS5pc0FycmF5KHJlbGF0ZWRDb250ZXh0cykgPyByZWxhdGVkQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSkgOiByZWxhdGVkQ29udGV4dHM/LmdldFBhdGgoKTtcblx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LnNlbmQoeyBhY3Rpb24sIGNvbnRlbnQsIHRyaWdnZXJlZEFjdGlvbk5hbWUsIHJlZnJlc2hMaXN0QmluZGluZywgYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyB9KTtcblx0fVxuXG5cdF90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShzQWN0aW9uTmFtZTogc3RyaW5nLCB0cmlnZ2VyVHlwZTogVHJpZ2dlclR5cGUpOiB2b2lkIHtcblx0XHR0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSh0aGlzLmJhc2UuZ2V0VmlldygpLCBzQWN0aW9uTmFtZSwgdHJpZ2dlclR5cGUpO1xuXHR9XG5cblx0YXN5bmMgX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gU3VibWl0IGFueSBsZWZ0b3ZlciBjaGFuZ2VzIHRoYXQgYXJlIG5vdCB5ZXQgc3VibWl0dGVkXG5cdFx0XHQvLyBDdXJyZW50bHkgd2UgYXJlIHVzaW5nIG9ubHkgMSB1cGRhdGVHcm91cElkLCBoZW5jZSBzdWJtaXR0aW5nIHRoZSBiYXRjaCBkaXJlY3RseSBoZXJlXG5cdFx0XHRhd2FpdCBvTW9kZWwuc3VibWl0QmF0Y2goXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gV2FpdCBmb3IgYWxsIGN1cnJlbnRseSBydW5uaW5nIGNoYW5nZXNcblx0XHRcdC8vIEZvciB0aGUgdGltZSBiZWluZyB3ZSBhZ3JlZWQgd2l0aCB0aGUgdjQgbW9kZWwgdGVhbSB0byB1c2UgYW4gaW50ZXJuYWwgbWV0aG9kLiBXZSdsbCByZXBsYWNlIGl0IG9uY2Vcblx0XHRcdC8vIGEgcHVibGljIG9yIHJlc3RyaWN0ZWQgbWV0aG9kIHdhcyBwcm92aWRlZFxuXHRcdFx0YXdhaXQgKG9Nb2RlbC5vUmVxdWVzdG9yIGFzIHVua25vd24gYXMgeyB3YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzOiBGdW5jdGlvbiB9KS53YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIENoZWNrIGlmIGFsbCBjaGFuZ2VzIHdlcmUgc3VibWl0dGVkIHN1Y2Nlc3NmdWxseVxuXHRcdFx0aWYgKG9Nb2RlbC5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInN1Ym1pdCBvZiBvcGVuIGNoYW5nZXMgZmFpbGVkXCIpO1xuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgZmFsc2UpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zdGlja3lTZXNzaW9uVG9rZW5cIiwgdW5kZWZpbmVkKTtcblx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkaXNwbGF5IGEgJ2Rpc2NhcmQnIHBvcG92ZXIgd2hlbiBleGl0aW5nIGEgc3RpY2t5IHNlc3Npb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0XG5cdCAqL1xuXHRwcml2YXRlIG9uQmFja05hdmlnYXRpb25JblNlc3Npb24oY29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IHJvdXRlclByb3h5ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpO1xuXG5cdFx0aWYgKHJvdXRlclByb3h5LmNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkKCkpIHtcblx0XHRcdHN0aWNreS5wcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24oXG5cdFx0XHRcdGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRpc2NhcmRTdGlja3lTZXNzaW9uKGNvbnRleHQpO1xuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpO1xuXHRcdFx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR2aWV3LFxuXHRcdFx0XHRQcm9ncmFtbWluZ01vZGVsLlN0aWNreVxuXHRcdFx0KTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRoaXN0b3J5LmJhY2soKTtcblx0fVxuXG5cdGFzeW5jIF9oYW5kbGVOZXdDb250ZXh0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzOiB7IGVkaXRhYmxlOiBib29sZWFuOyByZWNyZWF0ZUNvbnRleHQ6IGJvb2xlYW47IGZvcmNlRm9jdXM/OiBib29sZWFuIH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwge1xuXHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHRydWUsXG5cdFx0XHRlZGl0YWJsZTogbmF2aWdhdGlvblBhcmFtZXRlcnMuZWRpdGFibGUsXG5cdFx0XHRwZXJzaXN0T1BTY3JvbGw6IHRydWUsXG5cdFx0XHRyZWNyZWF0ZUNvbnRleHQ6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLnJlY3JlYXRlQ29udGV4dCxcblx0XHRcdHJlYXNvbjogTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogZmFsc2UsXG5cdFx0XHRmb3JjZUZvY3VzOiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5mb3JjZUZvY3VzID8/IGZhbHNlLFxuXHRcdFx0a2VlcEN1cnJlbnRMYXlvdXQ6IHRydWVcblx0XHR9KTtcblx0fVxuXG5cdF9nZXRCb3VuZENvbnRleHQodmlldzogRkVWaWV3LCBwYXJhbXM6IHsgY29udHJvbElkPzogc3RyaW5nOyBpc05hdmlnYWJsZT86IGJvb2xlYW4gfSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHZpZXdMZXZlbCA9IHZpZXcuZ2V0Vmlld0RhdGEoKS52aWV3TGV2ZWw7XG5cdFx0Y29uc3QgYlJlZnJlc2hBZnRlckFjdGlvbiA9IHZpZXdMZXZlbCA+IDEgfHwgKHZpZXdMZXZlbCA9PT0gMSAmJiBwYXJhbXMuY29udHJvbElkKTtcblx0XHRyZXR1cm4gIXBhcmFtcy5pc05hdmlnYWJsZSB8fCAhIWJSZWZyZXNoQWZ0ZXJBY3Rpb247XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIChwYXJzZSkgZXJyb3JzIGZvciBjb250cm9scyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHRcblx0ICpcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRpb24gZXJyb3JzLCBhbmQgcmVqZWN0cyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiBlcnJvcnNcblx0ICovXG5cblx0YXN5bmMgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZCB8IHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzaygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc1ZpZXdJZCA9IHRoaXMuZ2V0VmlldygpLmdldElkKCk7XG5cdFx0XHRjb25zdCBhTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0bGV0IG9Db250cm9sO1xuXG5cdFx0XHRpZiAoIWFNZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRcdFx0TG9nLmluZm8oXCJObyB2YWxpZGF0aW9uIGVycm9ycyBmb3VuZFwiKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgYU1lc3NhZ2VzKSB7XG5cdFx0XHRcdGlmIChtZXNzYWdlLnZhbGlkYXRpb24pIHtcblx0XHRcdFx0XHRvQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQobWVzc2FnZS5nZXRDb250cm9sSWQoKSk7XG5cdFx0XHRcdFx0d2hpbGUgKG9Db250cm9sKSB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRyb2wuZ2V0SWQoKSA9PT0gc1ZpZXdJZCkge1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBcInZhbGlkYXRpb24gZXJyb3JzIGV4aXN0XCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvQ29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9mIHRoZSBib3VuZCBhY3Rpb24gYW5kIHRoZSBuYW1lcyBvZiB0aGUga2V5IGZpZWxkc1xuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlLm9EYXRhXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2Uua2V5c1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJvdW5kIGNvbnRleHQgb24gd2hpY2ggdGhlIGFjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgQWx3YXlzIHJlc29sdmVzIHRvIHBhcmFtIG9SZXNwb25zZVxuXHQgKi9cblx0YXN5bmMgX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRvUmVzcG9uc2U/OiB7IG9EYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM/OiBzdHJpbmdbXSB8IG51bGwgfSxcblx0XHRvQ29udGV4dD86IENvbnRleHRcblx0KTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG5cdFx0aWYgKCFvQ29udGV4dCB8fCAhb1Jlc3BvbnNlIHx8ICFvUmVzcG9uc2Uub0RhdGEgfHwgIW9SZXNwb25zZS5rZXlzKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdC8vIHJlZnJlc2ggb25seSBsaXN0c1xuXHRcdGlmIChvQmluZGluZyAmJiBvQmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1Jlc3BvbnNlLm9EYXRhO1xuXHRcdFx0Y29uc3QgYUtleXMgPSBvUmVzcG9uc2Uua2V5cztcblx0XHRcdGNvbnN0IG9DdXJyZW50RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0bGV0IGJSZXR1cm5lZENvbnRleHRJc1NhbWUgPSB0cnVlO1xuXHRcdFx0Ly8gZW5zdXJlIGNvbnRleHQgaXMgaW4gdGhlIHJlc3BvbnNlXG5cdFx0XHRpZiAoT2JqZWN0LmtleXMob0NvbnRleHREYXRhKS5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gY2hlY2sgaWYgY29udGV4dCBpbiByZXNwb25zZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgYm91bmQgY29udGV4dFxuXHRcdFx0XHRiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gYUtleXMuZXZlcnkoZnVuY3Rpb24gKHNLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdFx0XHRcdHJldHVybiBvQ3VycmVudERhdGFbc0tleV0gPT09IG9Db250ZXh0RGF0YVtzS2V5XTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmICghYlJldHVybmVkQ29udGV4dElzU2FtZSkge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRcdFx0XHRcdGlmIChvQmluZGluZy5pc1Jvb3QoKSkge1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwob0JpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2UgdXNlIGEgc2lkZS1lZmZlY3QgcmVmcmVzaCBmb3IgYSBUcmVlVGFibGUsIHRvIHByZXNlcnZlIGV4cGFuc2lvbiBzdGF0ZXNcblx0XHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogXCJcIiB9XSwgb0JpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpISlcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0YWJsZVwiLCBlIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRvQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRvQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IG9CaW5kaW5nLmdldFBhdGgoKSB9XSwgb0JpbmRpbmcuZ2V0Q29udGV4dCgpKVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goKGU6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIsIGUgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gcmVzb2x2ZSB3aXRoIG9SZXNwb25zZSB0byBub3QgZGlzdHVyYiB0aGUgcHJvbWlzZSBjaGFpbiBhZnRlcndhcmRzXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHR9XG5cblx0YXN5bmMgX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNFbnRpdHlTZXROYW1lID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpLFxuXHRcdFx0YVNlbWFudGljS2V5cyA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhvTWV0YU1vZGVsLCBzRW50aXR5U2V0TmFtZSk7XG5cblx0XHRpZiAoYVNlbWFudGljS2V5cyAmJiBhU2VtYW50aWNLZXlzLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYVJlcXVlc3RQcm9taXNlcyA9IGFTZW1hbnRpY0tleXMubWFwKGFzeW5jIGZ1bmN0aW9uIChvS2V5OiB7ICRQcm9wZXJ0eVBhdGg6IHN0cmluZyB9KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RPYmplY3Qob0tleS4kUHJvcGVydHlQYXRoKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVJlcXVlc3RQcm9taXNlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvdmlkZXMgdGhlIGxhdGVzdCBjb250ZXh0IGluIHRoZSBtZXRhZGF0YSBoaWVyYXJjaHkgZnJvbSByb290QmluZGluZyB0byBnaXZlbiBjb250ZXh0IHBvaW50aW5nIHRvIGdpdmVuIGVudGl0eVR5cGVcblx0ICogaWYgYW55IHN1Y2ggY29udGV4dCBleGlzdHMuIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0aGUgb3JpZ2luYWwgY29udGV4dC5cblx0ICogTm90ZTogSXQgaXMgb25seSBuZWVkZWQgYXMgd29yay1hcm91bmQgZm9yIGluY29ycmVjdCBtb2RlbGxpbmcuIENvcnJlY3QgbW9kZWxsaW5nIHdvdWxkIGltcGx5IGEgRGF0YUZpZWxkRm9yQWN0aW9uIGluIGEgTGluZUl0ZW1cblx0ICogdG8gcG9pbnQgdG8gYW4gb3ZlcmxvYWQgZGVmaW5lZCBlaXRoZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgRW50aXR5VHlwZSBvciBhIGNvbGxlY3Rpb24gb2YgdGhlIHNhbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSByb290Q29udGV4dCBUaGUgY29udGV4dCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3RCaW5kaW5nIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gb3ZlcmxvYWRFbnRpdHlUeXBlIFRoZSBBY3Rpb25PdmVybG9hZCBlbnRpdHkgdHlwZSB0byBzZWFyY2ggZm9yXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIEFjdGlvbk92ZXJsb2FkIGVudGl0eVxuXHQgKi9cblx0X2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgocm9vdENvbnRleHQ6IENvbnRleHQsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBvdmVybG9hZEVudGl0eVR5cGU6IHN0cmluZyk6IENvbnRleHQge1xuXHRcdGNvbnN0IG1vZGVsOiBPRGF0YU1vZGVsID0gcm9vdENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IGNvbnRleHRTZWdtZW50czogc3RyaW5nW10gPSBsaXN0QmluZGluZy5nZXRQYXRoKCkuc3BsaXQoXCIvXCIpO1xuXHRcdGxldCBjdXJyZW50Q29udGV4dDogQ29udGV4dCA9IHJvb3RDb250ZXh0O1xuXG5cdFx0Ly8gV2UgZXhwZWN0IHRoYXQgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgbGlzdEJpbmRpbmcgaXMgdGhlIExpc3RCaW5kaW5nIG9mIHRoZSB0YWJsZS4gUmVtb3ZlIHRoaXMgZnJvbSBjb250ZXh0U2VnbWVudHNcblx0XHQvLyBiZWNhdXNlIGl0IGlzIGluY29ycmVjdCB0byBleGVjdXRlIGJpbmRDb250ZXh0IG9uIGEgbGlzdC4gV2UgZG8gbm90IGFueXdheSBuZWVkIHRvIHNlYXJjaCB0aGlzIGNvbnRleHQgZm9yIHRoZSBvdmVybG9hZC5cblx0XHRjb250ZXh0U2VnbWVudHMucG9wKCk7XG5cdFx0aWYgKGNvbnRleHRTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnRleHRTZWdtZW50cyA9IFtcIlwiXTsgLy8gRG9uJ3QgbGVhdmUgY29udGV4dFNlZ21lbnRzIHVuZGVmaW5lZFxuXHRcdH1cblxuXHRcdGlmIChjb250ZXh0U2VnbWVudHNbMF0gIT09IFwiXCIpIHtcblx0XHRcdGNvbnRleHRTZWdtZW50cy51bnNoaWZ0KFwiXCIpOyAvLyB0byBhbHNvIGdldCB0aGUgcm9vdCBjb250ZXh0LCBpLmUuIHRoZSBiaW5kaW5nQ29udGV4dCBvZiB0aGUgdGFibGVcblx0XHR9XG5cdFx0Ly8gbG9hZCBhbGwgdGhlIHBhcmVudCBjb250ZXh0cyBpbnRvIGFuIGFycmF5XG5cdFx0Y29uc3QgcGFyZW50Q29udGV4dHM6IENvbnRleHRbXSA9IGNvbnRleHRTZWdtZW50c1xuXHRcdFx0Lm1hcCgocGF0aFNlZ21lbnQ6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRpZiAocGF0aFNlZ21lbnQgIT09IFwiXCIpIHtcblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KHBhdGhTZWdtZW50LCBjdXJyZW50Q29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQ3JlYXRpbmcgYSBuZXcgY29udGV4dCB1c2luZyBiaW5kQ29udGV4dCguLi4pLmdldEJvdW5kQ29udGV4dCgpIGRvZXMgbm90IHdvcmsgaWYgdGhlIGV0YWcgaXMgbmVlZGVkLiBBY2NvcmRpbmcgdG8gbW9kZWwgY29sbGVhZ3Vlcyxcblx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgYWx3YXlzIHVzZSBhbiBleGlzdGluZyBjb250ZXh0IGlmIHBvc3NpYmxlLlxuXHRcdFx0XHRcdC8vIEN1cnJlbnRseSwgdGhlIG9ubHkgZXhhbXBsZSB3ZSBrbm93IGFib3V0IGlzIHVzaW5nIHRoZSByb290Q29udGV4dCAtIGFuZCBpbiB0aGlzIGNhc2UsIHdlIGNhbiBvYnZpb3VzbHkgcmV1c2UgdGhhdCBleGlzdGluZyBjb250ZXh0LlxuXHRcdFx0XHRcdC8vIElmIG90aGVyIGV4YW1wbGVzIHNob3VsZCBjb21lIHVwLCB0aGUgYmVzdCBwb3NzaWJsZSB3b3JrIGFyb3VuZCB3b3VsZCBiZSB0byByZXF1ZXN0IHNvbWUgZGF0YSB0byBnZXQgYW4gZXhpc3RpbmcgY29udGV4dC4gVG8ga2VlcCB0aGVcblx0XHRcdFx0XHQvLyByZXF1ZXN0IGFzIHNtYWxsIGFuZCBmYXN0IGFzIHBvc3NpYmxlLCB3ZSBzaG91bGQgcmVxdWVzdCBvbmx5IHRoZSBmaXJzdCBrZXkgcHJvcGVydHkuIEFzIHRoaXMgd291bGQgaW50cm9kdWNlIGFzeW5jaHJvbmlzbSwgYW5kIGFueXdheVxuXHRcdFx0XHRcdC8vIHRoZSB3aG9sZSBsb2dpYyBpcyBvbmx5IHBhcnQgb2Ygd29yay1hcm91bmQgZm9yIGluY29ycmVjdCBtb2RlbGxpbmcsIHdlIHdhaXQgdW50aWwgd2UgaGF2ZSBhbiBleGFtcGxlIG5lZWRpbmcgaXQgYmVmb3JlIGltcGxlbWVudGluZyB0aGlzLlxuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0ID0gcm9vdENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRDb250ZXh0O1xuXHRcdFx0fSlcblx0XHRcdC5yZXZlcnNlKCk7XG5cdFx0Ly8gc2VhcmNoIGZvciBjb250ZXh0IGJhY2t3YXJkc1xuXHRcdGNvbnN0IG92ZXJsb2FkQ29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZCA9IHBhcmVudENvbnRleHRzLmZpbmQoXG5cdFx0XHQocGFyZW50Q29udGV4dDogQ29udGV4dCkgPT5cblx0XHRcdFx0KG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChwYXJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiJFR5cGVcIikgYXMgdW5rbm93biBhcyBzdHJpbmcpID09PSBvdmVybG9hZEVudGl0eVR5cGVcblx0XHQpO1xuXHRcdHJldHVybiBvdmVybG9hZENvbnRleHQgfHwgbGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpITtcblx0fVxuXG5cdF9jcmVhdGVTaWJsaW5nSW5mbyhjdXJyZW50Q29udGV4dDogQ29udGV4dCwgbmV3Q29udGV4dDogQ29udGV4dCk6IFNpYmxpbmdJbmZvcm1hdGlvbiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG5ld0NvbnRleHQsXG5cdFx0XHRwYXRoTWFwcGluZzogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b2xkUGF0aDogY3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld0NvbnRleHQuZ2V0UGF0aCgpXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9O1xuXHR9XG5cblx0X3VwZGF0ZVBhdGhzSW5IaXN0b3J5KG1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSk6IHZvaWQge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXRQYXRoTWFwcGluZyhtYXBwaW5ncyk7XG5cblx0XHQvLyBBbHNvIHVwZGF0ZSB0aGUgc2VtYW50aWMgbWFwcGluZyBpbiB0aGUgcm91dGluZyBzZXJ2aWNlXG5cdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdGlmIChtYXBwaW5ncy5sZW5ndGggJiYgbGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ub2xkUGF0aCkge1xuXHRcdFx0bGFzdFNlbWFudGljTWFwcGluZy50ZWNobmljYWxQYXRoID0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHR9XG5cdH1cblxuXHRfZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQoXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRuZXdEb2N1bWVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0c2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZFxuXHQpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhjb250ZXh0LCBuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT0gbmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdH1cblx0XHRyZXR1cm4gY29udGV4dFRvTmF2aWdhdGU7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWJvYmplY3QgcGFnZSwgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGhcblx0ICogZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHMgYmV0d2VlbiB0aGUgb2JqZWN0IHBhZ2UgYW5kIHRoZSBzdWJvYmplY3QgcGFnZS5cblx0ICpcblx0ICogQHBhcmFtIHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3Vib2JqZWN0XG5cdCAqIEBwYXJhbSBzUHJvZ3JhbW1pbmdNb2RlbCBUaGUgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQHBhcmFtIGRvTm90Q29tcHV0ZUlmUm9vdCBJZiB0cnVlLCB3ZSBkb24ndCBjb21wdXRlIHNpYmxpbmdJbmZvIGlmIHRoZSByb290IGFuZCB0aGUgcmlnaHRtb3N0IGNvbnRleHRzIGFyZSB0aGUgc2FtZVxuXHQgKiBAcGFyYW0gcm9vdENvbnRleHRJbmZvIFRoZSByb290IGNvbnRleHQgaW5mb3JtYXRpb24gb2Ygcm9vdCBvZiB0aGUgZHJhZnRcblx0ICogQHBhcmFtIGdyb3VwSWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuXHQgKi9cblx0YXN5bmMgX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0cm9vdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0LFxuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCxcblx0XHRzUHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLFxuXHRcdGRvTm90Q29tcHV0ZUlmUm9vdDogYm9vbGVhbixcblx0XHRyb290Q29udGV4dEluZm8/OiBSb290Q29udGV4dEluZm8sXG5cdFx0Z3JvdXBJZD86IHN0cmluZ1xuXHQpOiBQcm9taXNlPFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZD4ge1xuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgPz8gcm9vdEN1cnJlbnRDb250ZXh0O1xuXHRcdGlmICghcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdC8vIFdyb25nIHVzYWdlICEhXG5cdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHR9XG5cdFx0bGV0IHJpZ2h0TW9zdENvbnRleHRUb1VzZSA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0O1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwocmlnaHRtb3N0Q3VycmVudENvbnRleHQpICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHQvLyB3ZSBjaGVjayB0aGUgcmlnaHRNb3N0Q3VycmVudENvbnRleHQgY2FuIGJlIHVzZWQgaW4gZHJhZnRcblx0XHRcdHJpZ2h0TW9zdENvbnRleHRUb1VzZSA9IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHR9XG5cdFx0aWYgKGRvTm90Q29tcHV0ZUlmUm9vdCAmJiByaWdodE1vc3RDb250ZXh0VG9Vc2UuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRNb3N0Q29udGV4dFRvVXNlLCByb290Q29udGV4dEluZm8sIGdyb3VwSWQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBub3QgaW4gZHJhZnQgbW9kZSwgd2UganVzdCByZWNyZWF0ZSBhIGNvbnRleHQgZnJvbSB0aGUgcGF0aCBvZiB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdC8vIE5vIHBhdGggbWFwcGluZyBpcyBuZWVkZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCksXG5cdFx0XHRcdHBhdGhNYXBwaW5nOiBbXVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHRfaXNGY2xFbmFibGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKTtcblx0fVxuXG5cdGFzeW5jIGNoZWNrUmVjb21tZW5kYXRpb25PcHRpb24oKTogUHJvbWlzZTxSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIHwgdW5kZWZpbmVkPiB7XG5cdFx0bGV0IHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3Nlbjtcblx0XHRpZiAodGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5jaGVja0lmUmVjb21tZW5kYXRpb25zRXhpc3QoKSkge1xuXHRcdFx0cmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuID0gYXdhaXQgdGhpcy5zaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyh0cnVlKTtcblx0XHRcdGlmIChyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVkaXRGbG93O1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXFFQSxNQUFNQSxZQUFZLEdBQUdDLFNBQVMsQ0FBQ0QsWUFBWTtJQUMxQ0UsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ0MsZ0JBQWdCO0lBQzdDQyxTQUFTLEdBQUdGLFNBQVMsQ0FBQ0UsU0FBUztJQUMvQkMsV0FBVyxHQUFHSCxTQUFTLENBQUNHLFdBQVc7SUFDbkNDLFFBQVEsR0FBR0osU0FBUyxDQUFDSSxRQUFRO0lBQzdCQyxXQUFXLEdBQUdMLFNBQVMsQ0FBQ0ssV0FBVztJQUNuQ0MsV0FBVyxHQUFHQyxXQUFXLENBQUNELFdBQVc7RUF3QnRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTkEsSUFRTUUsUUFBUSxXQURiQyxjQUFjLENBQUMsMkNBQTJDLENBQUMsVUFvQzFEQyxlQUFlLEVBQUUsVUFDakJDLGNBQWMsRUFBRSxVQThQaEJELGVBQWUsRUFBRSxVQUNqQkMsY0FBYyxFQUFFLFVBbUdoQkQsZUFBZSxFQUFFLFVBQ2pCQyxjQUFjLEVBQUUsVUF3eUJoQkQsZUFBZSxFQUFFLFVBQ2pCRSxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0FvQm5DSixlQUFlLEVBQUUsV0FDakJFLFVBQVUsQ0FBQyxZQUFZLENBQUMsV0FvQnhCRixlQUFlLEVBQUUsV0FDakJFLFVBQVUsQ0FBQyxZQUFZLENBQUMsV0FDeEJHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBb0J2QkwsZUFBZSxFQUFFLFdBQ2pCRSxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0FvQm5DSixlQUFlLEVBQUUsV0FDakJFLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxXQW1CbkNKLGVBQWUsRUFBRSxXQUNqQkssUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUNqQkgsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFdBbUJuQ0osZUFBZSxFQUFFLFdBQ2pCRSxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0FtQm5DSixlQUFlLEVBQUUsV0FDakJFLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxXQW1CbkNKLGVBQWUsRUFBRSxXQUNqQkUsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFdBbUJuQ0osZUFBZSxFQUFFLFdBQ2pCRSxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0FxQm5DSixlQUFlLEVBQUUsV0FDakJDLGNBQWMsRUFBRSxXQW9MaEJELGVBQWUsRUFBRSxXQUNqQkMsY0FBYyxFQUFFLFdBd0toQkQsZUFBZSxFQUFFLFdBQ2pCQyxjQUFjLEVBQUUsV0FrR2hCRCxlQUFlLEVBQUUsV0FDakJDLGNBQWMsRUFBRSxXQTJEaEJELGVBQWUsRUFBRSxXQUNqQkMsY0FBYyxFQUFFLFdBdVJoQkQsZUFBZSxFQUFFLFdBQ2pCRSxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0FrQm5DSixlQUFlLEVBQUUsV0FDakJDLGNBQWMsRUFBRTtJQUFBO0lBQUE7TUFBQTtNQUFBO1FBQUE7TUFBQTtNQUFBO01BQUEsTUEvcEVUSyxTQUFTLEdBQXFCQyxPQUFPLENBQUNDLE9BQU8sRUFBRTtNQUFBLE1BcTRCdkRDLGlCQUFpQixHQUFHLE9BQU9DLFdBQTZCLEVBQUVDLGVBQWlDLEtBQW9CO1FBQzlHLElBQUk7VUFDSCxNQUFNQyxrQkFBa0IsR0FBRyxNQUFLQyxPQUFPLEVBQUUsQ0FBQ0MsaUJBQWlCLEVBQUU7VUFDN0QsTUFBTUMsVUFBVSxHQUFHLE1BQU1KLGVBQWU7VUFDeEM7VUFDQSxNQUFNSSxVQUFVLENBQUNDLE9BQU8sRUFBRTtVQUMxQjtVQUNBO1VBQ0E7VUFDQSxJQUFJLENBQUNDLFdBQVcsQ0FBQ0MsbUJBQW1CLENBQUNSLFdBQVcsQ0FBQyxJQUFJRSxrQkFBa0IsRUFBRTtZQUN4RSxNQUFLTyxlQUFlLEVBQUUsQ0FDcEJDLHFCQUFxQixFQUFFLENBQ3ZCQyx1Q0FBdUMsQ0FBQ1gsV0FBVyxDQUFDWSxPQUFPLEVBQUUsRUFBRVYsa0JBQWtCLENBQVk7VUFDaEc7UUFDRCxDQUFDLENBQUMsT0FBT1csS0FBYyxFQUFFO1VBQ3hCQyxHQUFHLENBQUNELEtBQUssQ0FBQyxtQ0FBbUMsRUFBRUEsS0FBSyxDQUFXO1FBQ2hFO01BQ0QsQ0FBQztNQUFBLE1BUURFLDhCQUE4QixHQUFHLENBQUNDLGtCQUFxRSxFQUFFQyxLQUFZLEtBQVc7UUFBQTtRQUMvSCxNQUFNQyx3QkFBd0IsR0FBR0QsS0FBSyxDQUFDRSxjQUFjLEVBQUUsQ0FBQ0MsSUFBSSxDQUFDLDBCQUEwQixDQUFDO1FBQ3hGLE1BQU1DLGNBQWMsNEJBQUdKLEtBQUssQ0FBQ2IsaUJBQWlCLENBQUMsVUFBVSxDQUFDLDBEQUFuQyxzQkFBcUNrQixXQUFXLENBQUMsMkJBQTJCLENBQUM7UUFDcEcsTUFBTUMsY0FBK0IsR0FBRyxFQUFFO1FBQzFDLElBQUlDLFlBQVk7UUFDaEIsSUFBSUMsV0FBbUI7O1FBRXZCO1FBQ0EsTUFBTUMsV0FBVyxHQUFHQyxTQUFTLENBQUNDLGVBQWUsRUFBRSxDQUM3Q0MsT0FBTyxFQUFFLENBQ1RDLE1BQU0sQ0FBRUMsT0FBZ0IsSUFBS0EsT0FBTyxDQUFDQyxPQUFPLEVBQUUsS0FBS2Qsd0JBQXdCLENBQUM7UUFDOUVTLFNBQVMsQ0FBQ00sY0FBYyxDQUFDUCxXQUFXLENBQUM7UUFFckNWLGtCQUFrQixDQUFDa0IsT0FBTyxDQUFFQyxpQkFBaUIsSUFBSztVQUNqRDtVQUNBLElBQUlBLGlCQUFpQixDQUFDQyxhQUFhLEVBQUU7WUFBQTtZQUNwQ1osWUFBWSxHQUFHYSxPQUFPLENBQUNDLGNBQWMsQ0FBQ2pCLGNBQWMsQ0FBQ2MsaUJBQWlCLENBQUNDLGFBQWEsQ0FBQyxDQUFDRyxPQUFPLENBQVk7WUFDekdkLFdBQVcsR0FBSSw0QkFBRUQsWUFBWSxDQUFDcEIsaUJBQWlCLEVBQUUsMERBQWhDLHNCQUFrQ1EsT0FBTyxFQUFHLElBQUdZLFlBQVksQ0FBQ2dCLGNBQWMsQ0FBQyxPQUFPLENBQUUsRUFBQztZQUN0RztZQUNBLElBQ0MsQ0FBQ2IsU0FBUyxDQUFDQyxlQUFlLEVBQUUsQ0FDMUJDLE9BQU8sRUFBRSxDQUNUQyxNQUFNLENBQUVDLE9BQWdCLElBQUtBLE9BQU8sQ0FBQ1UsVUFBVSxFQUFFLENBQUNDLElBQUksQ0FBRUMsTUFBTSxJQUFLQSxNQUFNLEtBQUtsQixXQUFXLENBQUMsQ0FBQyxDQUFDbUIsTUFBTSxFQUNuRztjQUNEakIsU0FBUyxDQUFDa0IsV0FBVyxDQUNwQixJQUFJQyxPQUFPLENBQUM7Z0JBQ1hmLE9BQU8sRUFBRUksaUJBQWlCLENBQUNZLFdBQVc7Z0JBQ3RDQyxTQUFTLEVBQUUsTUFBSzdDLE9BQU8sRUFBRSxDQUFDOEMsUUFBUSxFQUFFO2dCQUNwQ0MsSUFBSSxFQUFFaEUsV0FBVyxDQUFDaUUsS0FBSztnQkFDdkJDLElBQUksRUFBRWxDLHdCQUF3QjtnQkFDOUJtQyxTQUFTLEVBQUUsS0FBSztnQkFDaEJDLFVBQVUsRUFBRSxLQUFLO2dCQUNqQlgsTUFBTSxFQUFFbEI7Y0FDVCxDQUFDLENBQUMsQ0FDRjtZQUNGO1lBQ0E7WUFDQSxNQUFNOEIsMEJBQTBCLEdBQUc1QixTQUFTLENBQUNDLGVBQWUsRUFBRSxDQUM1REMsT0FBTyxFQUFFLENBQ1RDLE1BQU0sQ0FBRUMsT0FBZ0IsSUFBS0EsT0FBTyxDQUFDVSxVQUFVLEVBQUUsQ0FBQ0MsSUFBSSxDQUFFQyxNQUFNLElBQUtBLE1BQU0sS0FBS2xCLFdBQVcsQ0FBQyxDQUFDO1lBQzdGOEIsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUNDLFlBQVksQ0FBQ25DLGNBQWMsQ0FBQ2MsaUJBQWlCLENBQUNDLGFBQWEsQ0FBQyxDQUFDRyxPQUFPLENBQUM7O1lBRW5HO1VBQ0QsQ0FBQyxNQUFNO1lBQ05oQixjQUFjLENBQUNrQyxJQUFJLENBQUM7Y0FDbkJMLElBQUksRUFBRWxDLHdCQUF3QjtjQUM5QndDLElBQUksRUFBRXZCLGlCQUFpQixDQUFDWSxXQUFXO2NBQ25DTyxVQUFVLEVBQUUsSUFBSTtjQUNoQkosSUFBSSxFQUFFaEUsV0FBVyxDQUFDaUU7WUFDbkIsQ0FBQyxDQUFDO1VBQ0g7UUFDRCxDQUFDLENBQUM7UUFFRixJQUFJNUIsY0FBYyxDQUFDcUIsTUFBTSxFQUFFO1VBQzFCLE1BQUtlLGlCQUFpQixFQUFFLENBQUNDLGlCQUFpQixDQUFDO1lBQzFDckMsY0FBYyxFQUFFQTtVQUNqQixDQUFDLENBQUM7UUFDSDtNQUNELENBQUM7TUFBQSxNQWFEc0MsbUJBQW1CLEdBQUcsQ0FBQ0MsbUJBQTJCLEVBQUU5RCxXQUE2QixFQUFFK0QsVUFBOEIsS0FBYTtRQUM3SCxJQUFJRCxtQkFBbUIsS0FBS25GLFlBQVksQ0FBQ3FGLE9BQU8sRUFBRTtVQUNqRDtVQUNBLE9BQU9GLG1CQUFtQjtRQUMzQixDQUFDLE1BQU07VUFDTixNQUFNRyxTQUFTLEdBQUdqRSxXQUFXLENBQUNpRCxRQUFRLEVBQUUsQ0FBQ2lCLFlBQVksRUFBRTtVQUN2RCxNQUFNQyxnQkFBd0IsR0FBRyxNQUFLQyxtQkFBbUIsQ0FBQ3BFLFdBQVcsQ0FBQztVQUN0RTtVQUNBLElBQUksQ0FBQ0EsV0FBVyxDQUFDcUUsVUFBVSxFQUFFLEVBQUU7WUFBQTtZQUM5QixNQUFNQyx3QkFBd0IsR0FBR0MsMkJBQTJCLENBQUNOLFNBQVMsQ0FBQ08sY0FBYyxDQUFDeEUsV0FBVyxDQUFDWSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzdHLE1BQU02RCxTQUFTLEdBQUdILHdCQUF3QixDQUFDSSxlQUF3QztjQUNsRjtjQUNBO2NBQ0FDLFNBQVMsV0FDUlIsZ0JBQWdCLEtBQUt0RixnQkFBZ0IsQ0FBQytGLEtBQUssR0FDeENILFNBQVMsYUFBVEEsU0FBUyxnREFBVEEsU0FBUyxDQUFFSSxXQUFXLENBQUNDLE1BQU0sMERBQTdCLHNCQUErQkMsU0FBUyxHQUN4Q04sU0FBUyxhQUFUQSxTQUFTLGlEQUFUQSxTQUFTLENBQUVJLFdBQVcsQ0FBQ0csT0FBTywyREFBOUIsdUJBQWdDQyxzQkFBc0IsMkRBSDlDLEtBSVRDLFNBQVMsbURBSkEsZUFJRUMsUUFBUSxFQUFFO1lBRXpCLElBQUlSLFNBQVMsSUFBSUwsd0JBQXdCLENBQUNjLGdCQUFnQixDQUFDQyxPQUFPLENBQUNWLFNBQVMsQ0FBQyxDQUFDVyxVQUFVLENBQUMxQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2NBQ3BHO2NBQ0EsT0FBT2pFLFlBQVksQ0FBQzRHLFFBQVE7WUFDN0I7VUFDRDtVQUNBLE1BQU1DLGtCQUFrQixHQUFHLE1BQUtDLG9CQUFvQixFQUFFLENBQUNDLHFCQUFxQixDQUFDMUYsV0FBVyxFQUFFK0QsVUFBVSxFQUFFLE1BQUt0RCxlQUFlLEVBQUUsQ0FBQztVQUM3SCxJQUFJK0Usa0JBQWtCLENBQUM1QyxNQUFNLEVBQUU7WUFDOUIsT0FBT2pFLFlBQVksQ0FBQzRHLFFBQVE7VUFDN0I7VUFDQSxPQUFPNUcsWUFBWSxDQUFDZ0gsS0FBSztRQUMxQjtNQUNELENBQUM7TUFBQTtJQUFBO0lBQUE7SUE3L0JEO0lBQ0E7SUFDQTtJQUFBLE9BRUFDLFlBQVksR0FBWix3QkFBMkI7TUFDMUIsdUNBQWFBLFlBQVk7SUFDMUIsQ0FBQztJQUFBLE9BRURuRixlQUFlLEdBQWYsMkJBQWdDO01BQy9CLE9BQU8sSUFBSSxDQUFDb0YsSUFBSSxDQUFDcEYsZUFBZSxFQUFFO0lBQ25DOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FQQztJQUFBLE9BVU1xRixZQUFZLEdBRmxCLDRCQUVtQkMsT0FBZ0IsRUFBa0M7TUFDcEUsTUFBTUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDUCxvQkFBb0IsRUFBRTtNQUNyRCxNQUFNUSxrQkFBa0IsR0FBRyxJQUFJLENBQUNDLHNCQUFzQixFQUFFO01BQ3hELE1BQU1DLEtBQUssR0FBR0osT0FBTyxDQUFDOUMsUUFBUSxFQUFFO01BQ2hDLE1BQU1tRCxRQUFRLEdBQUcsSUFBSSxDQUFDakcsT0FBTyxFQUFFLENBQUNrRyxXQUFXLEVBQTBCO01BQ3JFLE1BQU1sQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUNDLG1CQUFtQixDQUFDMkIsT0FBTyxDQUFDO01BQzFELElBQUlPLFdBQW9CLEdBQUdQLE9BQU87TUFDbEMsTUFBTVEsSUFBSSxHQUFHLElBQUksQ0FBQ1YsSUFBSSxDQUFDMUYsT0FBTyxFQUFFO01BQ2hDLE1BQU1xRyxPQUFPLEdBQUcsV0FBVztNQUMzQixJQUFJO1FBQ0gsSUFBSSxDQUFDSixRQUFRLGFBQVJBLFFBQVEsdUJBQVJBLFFBQVEsQ0FBRUssU0FBUyxJQUFjLENBQUMsRUFBRTtVQUN4QyxJQUFJdEMsZ0JBQWdCLEtBQUt0RixnQkFBZ0IsQ0FBQytGLEtBQUssSUFBSVQsZ0JBQWdCLEtBQUt0RixnQkFBZ0IsQ0FBQzZILE1BQU0sRUFBRTtZQUNoR0osV0FBVyxHQUFJLE1BQU0vRixXQUFXLENBQUNvRyxpQkFBaUIsQ0FBQ3hDLGdCQUFnQixFQUFFb0MsSUFBSSxFQUFFLElBQUksQ0FBQzlGLGVBQWUsRUFBRSxDQUFhO1VBQy9HO1FBQ0Q7UUFDQSxNQUFNLElBQUksQ0FBQ29GLElBQUksQ0FBQ2UsUUFBUSxDQUFDQyxZQUFZLENBQUM7VUFBRWQsT0FBTyxFQUFFTztRQUFZLENBQUMsQ0FBQztRQUUvRCxJQUFJUSxnQkFBZ0IsR0FBRyxJQUFJLENBQUNDLGFBQWEsRUFBRSxHQUFJZCxrQkFBa0IsQ0FBbUJlLG1CQUFtQixFQUFFLEdBQUdqQixPQUFPO1FBQ25ILElBQ0NlLGdCQUFnQixLQUFLRyxTQUFTLElBQzdCOUMsZ0JBQWdCLEtBQUt0RixnQkFBZ0IsQ0FBQytGLEtBQUssSUFBSSxJQUFJLENBQUNSLG1CQUFtQixDQUFDMEMsZ0JBQWdCLENBQUMsS0FBS2pJLGdCQUFnQixDQUFDK0YsS0FBTSxFQUNySDtVQUNEO1VBQ0FrQyxnQkFBZ0IsR0FBR2YsT0FBTztRQUMzQjtRQUNBLE1BQU1tQix5QkFBeUIsR0FBR2xCLGlCQUFpQixDQUFDRixZQUFZLENBQy9EUSxXQUFXLEVBQ1gsSUFBSSxDQUFDVCxJQUFJLENBQUMxRixPQUFPLEVBQUUsRUFDbkIsSUFBSSxDQUFDTSxlQUFlLEVBQUUsRUFDdEIsSUFBSSxDQUFDa0QsaUJBQWlCLEVBQUUsRUFDeEI2QyxPQUFPLENBQ1A7UUFDRCxNQUFNVyxlQUFlLEdBQUc7VUFDdkJDLHNCQUFzQixFQUFFRjtRQUN6QixDQUFDO1FBQ0QsSUFBSSxDQUFDRyxtQ0FBbUMsQ0FBQ2xELGdCQUFnQixFQUFFZ0MsS0FBSyxDQUFDO1FBRWpFLElBQUltQixrQkFBa0I7UUFDdEI7UUFDQSxNQUFNQyxrQkFBa0IsR0FBR1QsZ0JBQWdCLEtBQUtSLFdBQVcsSUFBSSxDQUFDRixRQUFRLGFBQVJBLFFBQVEsdUJBQVJBLFFBQVEsQ0FBRUssU0FBUyxJQUFjLENBQUM7UUFDbEcsSUFBSWMsa0JBQWtCLEVBQUU7VUFDdkJELGtCQUFrQixHQUFHLElBQUksQ0FBQ0UsMEJBQTBCLENBQ25EbEIsV0FBVyxFQUNYUSxnQkFBZ0IsRUFDaEIzQyxnQkFBZ0IsRUFDaEIsSUFBSSxFQUNKZ0QsZUFBZSxFQUNmWCxPQUFPLENBQ1A7UUFDRjtRQUNBVCxPQUFPLENBQUM5QyxRQUFRLEVBQUUsQ0FBQ3dFLFdBQVcsQ0FBQ2pCLE9BQU8sQ0FBQztRQUV2QyxJQUFJa0IsV0FBVyxHQUFHLE1BQU1KLGtCQUFrQjtRQUMxQyxNQUFNSyxrQkFBa0IsR0FBSSxNQUFNVCx5QkFBcUM7UUFDdkUsSUFBSVUsaUJBQXNDLEdBQUdELGtCQUFrQjtRQUMvRCxJQUFJSixrQkFBa0IsRUFBRTtVQUN2QixJQUFJRyxXQUFXLEtBQUtULFNBQVMsRUFBRTtZQUM5QlMsV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDRiwwQkFBMEIsQ0FDbERsQixXQUFXLEVBQ1hRLGdCQUFnQixFQUNoQjNDLGdCQUFnQixFQUNoQixJQUFJLEVBQ0pnRCxlQUFlLEVBQ2YsT0FBTyxDQUNQO1VBQ0Y7VUFDQVMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDQywyQkFBMkIsQ0FBQzlCLE9BQU8sRUFBRTRCLGtCQUFrQixFQUFFRCxXQUFXLENBQUM7UUFDL0YsQ0FBQyxNQUFNO1VBQ04sSUFBSSxDQUFDSSxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7UUFDL0I7UUFFQSxJQUFJSCxrQkFBa0IsRUFBRTtVQUN2QixJQUFJLENBQUNJLFdBQVcsQ0FBQy9JLFFBQVEsQ0FBQ2dKLFFBQVEsRUFBRSxLQUFLLENBQUM7VUFDMUMsSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7VUFDL0IsSUFBSSxDQUFDdEUsaUJBQWlCLEVBQUUsQ0FBQ0MsaUJBQWlCLEVBQUU7VUFFNUMsSUFBSStELGtCQUFrQixLQUFLckIsV0FBVyxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxDQUFDVCxJQUFJLENBQUNlLFFBQVEsQ0FBQ3NCLFdBQVcsQ0FBQztjQUFFbkMsT0FBTyxFQUFFNkI7WUFBa0IsQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sSUFBSSxDQUFDTyxpQkFBaUIsQ0FBQ1AsaUJBQWlCLEVBQWE7Y0FDMURRLFFBQVEsRUFBRSxJQUFJO2NBQ2RDLGVBQWUsRUFBRSxLQUFLO2NBQ3RCQyxVQUFVLEVBQUU7WUFDYixDQUFDLENBQUM7WUFDRixJQUFJbkUsZ0JBQWdCLEtBQUt0RixnQkFBZ0IsQ0FBQzZILE1BQU0sRUFBRTtjQUNqRDtjQUNBO2NBQ0EsSUFBSTZCLGFBQXNCO2NBQzFCLElBQUksSUFBSSxDQUFDeEIsYUFBYSxFQUFFLEVBQUU7Z0JBQ3pCO2dCQUNBd0IsYUFBYSxHQUFHWixrQkFBa0IsYUFBbEJBLGtCQUFrQix1QkFBbEJBLGtCQUFrQixDQUFFMUUsUUFBUSxFQUFFLENBQUN1RixtQkFBbUIsQ0FBQ2Isa0JBQWtCLENBQUMvRyxPQUFPLEVBQUUsQ0FBQztjQUNqRyxDQUFDLE1BQU07Z0JBQ04ySCxhQUFhLEdBQUdaLGtCQUFrQjtjQUNuQztjQUNBLElBQUksQ0FBQ2MsY0FBYyxDQUFDRixhQUFhLENBQUM7WUFDbkMsQ0FBQyxNQUFNLElBQUlHLFdBQVcsQ0FBQ0MsNkJBQTZCLENBQUN4QyxLQUFLLENBQUNqQyxZQUFZLEVBQUUsQ0FBQyxFQUFFO2NBQzNFO2NBQ0EsTUFBTTBFLFdBQVcsQ0FBQ2pCLGtCQUFrQixDQUFDO1lBQ3RDO1lBQ0EsT0FBT0MsaUJBQWlCO1VBQ3pCO1FBQ0Q7TUFDRCxDQUFDLENBQUMsT0FBTy9HLEtBQUssRUFBRTtRQUNmQyxHQUFHLENBQUNELEtBQUssQ0FBQyxrQ0FBa0MsRUFBRUEsS0FBSyxDQUFXO1FBQzlELE9BQU9oQixPQUFPLENBQUNnSixNQUFNLENBQUNoSSxLQUFLLENBQUM7TUFDN0I7SUFDRDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FMQztJQUFBLE9BTVFpSSwwQkFBMEIsR0FBbEMsb0NBQW1DOUksV0FBeUMsRUFBRStJLGFBQWtDLEVBQVE7TUFDdkgsSUFBSSxDQUFDL0ksV0FBVyxJQUFJLENBQUMrSSxhQUFhLElBQUl4SSxXQUFXLENBQUNDLG1CQUFtQixDQUFDUixXQUFXLENBQUMsRUFBRTtRQUNuRjtRQUNBO1FBQ0E7UUFDQTtNQUNEO01BRUEsTUFBTWdKLGlCQUFpQixHQUFHLElBQUksQ0FBQ3ZJLGVBQWUsRUFBRSxDQUFDQyxxQkFBcUIsRUFBRTtNQUN4RXNJLGlCQUFpQixDQUFDckksdUNBQXVDLENBQUNYLFdBQVcsQ0FBQ1ksT0FBTyxFQUFFLEVBQUVtSSxhQUFhLENBQUM7TUFFL0YsTUFBTUUsaUJBQWlCLEdBQUdQLFdBQVcsQ0FBQ1EsZUFBZSxDQUFDbEosV0FBVyxDQUFDaUQsUUFBUSxFQUFFLENBQUNpQixZQUFZLEVBQUUsRUFBRTZFLGFBQWEsQ0FBQ25JLE9BQU8sRUFBRSxDQUFDO01BQ3JIO01BQ0E7TUFDQSxJQUFJcUksaUJBQWlCLElBQUksSUFBSSxDQUFDeEQsb0JBQW9CLEVBQUUsQ0FBQzBELHlCQUF5QixDQUFDbkosV0FBVyxDQUFDLEVBQUU7UUFDNUZnSixpQkFBaUIsQ0FBQ0ksa0JBQWtCLENBQUMsQ0FBQ0gsaUJBQWlCLENBQUMsRUFBRUYsYUFBYSxDQUFDO01BQ3pFO0lBQ0Q7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQWJDO0lBQUEsT0FjTU0sdUJBQXVCLEdBQTdCLHVDQUNDQyxnQkFBMkIsRUFDM0JoRSxVQVFDLEVBQ2U7TUFDaEJBLFVBQVUsQ0FBQ2lFLG9CQUFvQixHQUFHLElBQUksQ0FBQzFELElBQUksQ0FBQ2UsUUFBUSxDQUFDNEMsY0FBYztNQUNuRWxFLFVBQVUsQ0FBQzhELGtCQUFrQixHQUFHOUQsVUFBVSxDQUFDOEQsa0JBQWtCLEtBQUssS0FBSztNQUV2RSxNQUFNSyxVQUFVLEdBQUcsSUFBSSxDQUFDQyxnQkFBZ0IsRUFBRTtNQUMxQyxNQUFNQyxhQUFhLEdBQUcsSUFBSSxDQUFDeEosT0FBTyxFQUFFLENBQUN5SixJQUFJLENBQUN0RSxVQUFVLENBQUN1RSxTQUFTLENBQUMsSUFBSXhILE9BQU8sQ0FBQ0MsY0FBYyxDQUFDZ0QsVUFBVSxDQUFDdUUsU0FBUyxDQUFDO01BQy9HLElBQUlDLHdCQUFtQyxHQUFHLEVBQUU7TUFDNUMsSUFBSUgsYUFBYSxhQUFiQSxhQUFhLGVBQWJBLGFBQWEsQ0FBRUksR0FBRyxDQUFRLGtCQUFrQixDQUFDLEVBQUU7UUFDbERELHdCQUF3QixHQUFHUixnQkFBZ0IsQ0FBQ3hILE1BQU0sQ0FBRWlFLE9BQU8sSUFBS0EsT0FBTyxDQUFDaUUsVUFBVSxFQUFFLENBQUM7TUFDdEY7TUFDQSxJQUFJLENBQUNMLGFBQWEsRUFBRTtRQUNuQixNQUFNLElBQUl4RyxLQUFLLENBQUMsMENBQTBDLENBQUM7TUFDNUQsQ0FBQyxNQUFNO1FBQ05tQyxVQUFVLENBQUNxRSxhQUFhLEdBQUdBLGFBQXdCO01BQ3BEO01BQ0EsTUFBTTNKLFdBQVcsR0FBSTJKLGFBQWEsQ0FBQ00sVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFLTixhQUFhLENBQVdPLGFBQWEsRUFBdUI7TUFDdkg1RSxVQUFVLENBQUM2RSxtQkFBbUIsR0FBRyxJQUFJO01BQ3JDQyxVQUFVLENBQUNDLElBQUksQ0FBQ1osVUFBVSxDQUFDO01BRTNCLElBQUk7UUFBQTtRQUNILElBQUksSUFBSSxDQUFDckYsbUJBQW1CLENBQUMsQ0FBQWtCLFVBQVUsYUFBVkEsVUFBVSxnREFBVkEsVUFBVSxDQUFFZ0YsZ0JBQWdCLDBEQUE1QixzQkFBK0IsQ0FBQyxDQUFDLEtBQUloQixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLekssZ0JBQWdCLENBQUM2SCxNQUFNLEVBQUU7VUFDbkgsSUFBSSxDQUFDdUIsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1FBQy9CO1FBQ0EsTUFBTSxJQUFJLENBQUNzQyx5QkFBeUIsQ0FBQ2pCLGdCQUFnQixFQUFFaEUsVUFBVSxDQUFDO1FBRWxFLElBQUlrRixNQUFNOztRQUVWO1FBQ0E7UUFDQSxJQUFJYixhQUFhLENBQUNJLEdBQUcsQ0FBUSxrQkFBa0IsQ0FBQyxFQUFFO1VBQ2pESixhQUFhLENBQUNjLGNBQWMsRUFBRTtRQUMvQjs7UUFFQTtRQUNBLE1BQU12SyxrQkFBa0IsR0FBRyxJQUFJLENBQUNDLE9BQU8sRUFBRSxDQUFDQyxpQkFBaUIsRUFBYTtRQUN4RSxJQUFJSixXQUFXLENBQUMwSyxNQUFNLEVBQUUsRUFBRTtVQUN6QjtVQUNBLElBQUksSUFBSSxDQUFDakYsb0JBQW9CLEVBQUUsQ0FBQzBELHlCQUF5QixDQUFDbkosV0FBVyxDQUFDLEVBQUU7WUFDdkU7WUFDQXdLLE1BQU0sR0FBRyxJQUFJLENBQUMvSixlQUFlLEVBQUUsQ0FDN0JDLHFCQUFxQixFQUFFLENBQ3ZCMEksa0JBQWtCLENBQUMsQ0FBQztjQUFFdUIsdUJBQXVCLEVBQUU7WUFBRyxDQUFDLENBQUMsRUFBRTNLLFdBQVcsQ0FBQzRLLGdCQUFnQixFQUFFLENBQUU7VUFDekYsQ0FBQyxNQUFNO1lBQ05KLE1BQU0sR0FBRyxJQUFJM0ssT0FBTyxDQUFRQyxPQUFPLElBQUs7Y0FDdkNFLFdBQVcsQ0FBQzZLLGVBQWUsQ0FBQyxjQUFjLEVBQUUsWUFBWTtnQkFDdkQvSyxPQUFPLEVBQUU7Y0FDVixDQUFDLENBQUM7WUFDSCxDQUFDLENBQUM7WUFDRkUsV0FBVyxDQUFDOEssT0FBTyxFQUFFO1VBQ3RCO1FBQ0QsQ0FBQyxNQUFNLElBQUl4RixVQUFVLENBQUM4RCxrQkFBa0IsRUFBRTtVQUN6QyxJQUFJLENBQUNOLDBCQUEwQixDQUFDOUksV0FBVyxFQUFFRSxrQkFBa0IsQ0FBQztRQUNqRTs7UUFFQTtRQUNBLElBQUksQ0FBQyxJQUFJLENBQUNPLGVBQWUsRUFBRSxDQUFDc0csYUFBYSxFQUFFLEVBQUU7VUFDNUNnRSxTQUFTLENBQUNDLGlCQUFpQixFQUFFO1FBQzlCO1FBQ0EsTUFBTUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDcEYsSUFBSSxDQUFDcUYsZUFBZSxDQUFDRCx1QkFBdUIsRUFBRTtRQUNuRjtRQUNBLElBQUlBLHVCQUF1QixFQUFFO1VBQzVCLElBQUksQ0FBQ3BGLElBQUksQ0FBQ3FGLGVBQWUsQ0FBQ0MsK0JBQStCLENBQUM3QixnQkFBZ0IsQ0FBQztRQUM1RTtRQUNBO1FBQ0EsTUFBTSxJQUFJLENBQUN6RCxJQUFJLENBQUNlLFFBQVEsQ0FBQ3dFLGFBQWEsQ0FBQztVQUFFQyxRQUFRLEVBQUUvQjtRQUFpQixDQUFDLENBQUM7UUFFdEUsSUFBSUssYUFBYSxDQUFDSSxHQUFHLENBQVEsa0JBQWtCLENBQUMsRUFBRTtVQUFBO1VBQ2pELE1BQU11QixRQUFRLEdBQUczQixhQUFhLENBQUM0QixTQUFTLEVBQWM7VUFDdEQsSUFDQyxDQUFBRCxRQUFRLGFBQVJBLFFBQVEsZ0RBQVJBLFFBQVEsQ0FBRUUsZUFBZSxvRkFBekIsc0JBQTJCQyxPQUFPLDJEQUFsQyx1QkFBb0NDLFlBQVksTUFBSy9NLFlBQVksQ0FBQ2dOLGtCQUFrQixJQUNwRjdCLHdCQUF3QixDQUFDbEgsTUFBTSxHQUFHLENBQUMsRUFDbEM7WUFDRDBJLFFBQVEsQ0FBQ00sdUJBQXVCLENBQUM5Qix3QkFBd0IsQ0FBQztZQUMxRCxNQUFNd0IsUUFBUSxDQUFDTyxjQUFjLENBQUNsQyxhQUFhLEVBQUUsS0FBSyxDQUFDO1VBQ3BEO1FBQ0Q7UUFFQSxJQUFJLENBQUNtQyxhQUFhLENBQUNDLFFBQVEsQ0FBQ0MsTUFBTSxFQUFFMUMsZ0JBQWdCLENBQUM7UUFFckQsT0FBTyxNQUFNa0IsTUFBTTtNQUNwQixDQUFDLENBQUMsT0FBTzNKLEtBQWMsRUFBRTtRQUN4QkMsR0FBRyxDQUFDRCxLQUFLLENBQUMsc0NBQXNDLEVBQUVBLEtBQUssQ0FBVztNQUNuRSxDQUFDLFNBQVM7UUFDVHVKLFVBQVUsQ0FBQzZCLE1BQU0sQ0FBQ3hDLFVBQVUsQ0FBQztNQUM5QjtJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVJDO0lBQUEsT0FXTXlDLGNBQWMsR0FGcEIsOEJBRXFCQyxjQUFzQixFQUFFQyxhQUErQixFQUFpQjtNQUM1RixNQUFNQyxzQkFBc0IsR0FBRyxJQUFJLENBQUNsTSxPQUFPLEVBQUUsQ0FBQ0MsaUJBQWlCLEVBQUU7TUFDakUsTUFBTWtNLE9BQU8sR0FBRyxJQUFJLENBQUNsSSxtQkFBbUIsQ0FBQytILGNBQWMsQ0FBc0IsS0FBS3ROLGdCQUFnQixDQUFDK0YsS0FBSztNQUV4RyxJQUFJLENBQUNqQixpQkFBaUIsRUFBRSxDQUFDNEksd0JBQXdCLEVBQUU7TUFDbkQsT0FBTyxJQUFJLENBQUNDLFFBQVEsQ0FBQyxZQUFZO1FBQ2hDLElBQUlILHNCQUFzQixFQUFFO1VBQzNCLElBQUksQ0FBQ3BFLG1CQUFtQixDQUFDLElBQUksQ0FBQztVQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDbEIsYUFBYSxFQUFFLEVBQUU7WUFDMUJnRSxTQUFTLENBQUNDLGlCQUFpQixFQUFFO1VBQzlCO1VBRUEsSUFBSXNCLE9BQU8sRUFBRTtZQUNaLElBQUksQ0FBQ0csY0FBYyxDQUFDMU4sV0FBVyxDQUFDMk4sTUFBTSxDQUFDO1VBQ3hDO1FBQ0Q7UUFFQSxJQUFJO1VBQ0gsTUFBTU4sYUFBYTtVQUNuQixNQUFNTyxxQkFBcUIsR0FBRyxJQUFJLENBQUN4TSxPQUFPLEVBQUUsQ0FBQ0MsaUJBQWlCLEVBQXVDO1VBQ3JHLElBQUksQ0FBQ2tNLE9BQU8sSUFBSSxDQUFDSyxxQkFBcUIsSUFBSUEscUJBQXFCLEtBQUtOLHNCQUFzQixFQUFFO1lBQzNGO1lBQ0E7VUFDRDs7VUFFQTtVQUNBLE1BQU1wSSxTQUFTLEdBQUcwSSxxQkFBcUIsQ0FBQzFKLFFBQVEsRUFBRSxDQUFDaUIsWUFBWSxFQUFFO1VBQ2pFLE1BQU0wSSxhQUFhLEdBQUczSSxTQUFTLENBQUNPLGNBQWMsQ0FBQ21JLHFCQUFxQixDQUFDL0wsT0FBTyxFQUFFLENBQUMsQ0FBQ2lNLFNBQVMsQ0FBQyxhQUFhLENBQUM7VUFDeEcsTUFBTUMsWUFBWSxHQUFHQyxpQkFBaUIsQ0FBQ0MsZUFBZSxDQUFDL0ksU0FBUyxFQUFFMkksYUFBYSxDQUFDO1VBQ2hGLElBQ0NFLFlBQVksYUFBWkEsWUFBWSxlQUFaQSxZQUFZLENBQUVsSyxNQUFNLElBQ3BCK0oscUJBQXFCLENBQUNyTCxXQUFXLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxLQUFLO1VBQUk7VUFDakVxTCxxQkFBcUIsQ0FBQ3JMLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksRUFDNUQ7WUFDRCxNQUFNMkwsc0JBQXNCLEdBQUcsSUFBSSxDQUFDQyxtQkFBbUIsRUFBRTtZQUN6RCxNQUFNQyxtQkFBbUIsR0FBR0Ysc0JBQXNCLGFBQXRCQSxzQkFBc0IsdUJBQXRCQSxzQkFBc0IsQ0FBRUcsWUFBWTtjQUMvREMsWUFBWSxHQUFHTixpQkFBaUIsQ0FBQ08sZUFBZSxDQUFDWCxxQkFBcUIsRUFBRSxJQUFJLENBQUM7WUFDOUU7WUFDQSxJQUFJUSxtQkFBbUIsSUFBSUEsbUJBQW1CLEtBQUtFLFlBQVksRUFBRTtjQUNoRSxNQUFNLElBQUksQ0FBQ2xGLGlCQUFpQixDQUFDd0UscUJBQXFCLEVBQUU7Z0JBQUV2RSxRQUFRLEVBQUUsSUFBSTtnQkFBRUMsZUFBZSxFQUFFO2NBQU0sQ0FBQyxDQUFDO1lBQ2hHO1VBQ0Q7VUFFQSxJQUFJLENBQUNvRSxjQUFjLENBQUMxTixXQUFXLENBQUN3TyxLQUFLLENBQUM7UUFDdkMsQ0FBQyxDQUFDLE9BQU8xTSxLQUFjLEVBQUU7VUFDeEJDLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDLG1DQUFtQyxFQUFFQSxLQUFLLENBQVc7VUFDL0QsSUFBSXlMLE9BQU8sSUFBSUQsc0JBQXNCLEVBQUU7WUFDdEMsSUFBSSxDQUFDSSxjQUFjLENBQUMxTixXQUFXLENBQUN5TyxLQUFLLENBQUM7VUFDdkM7UUFDRCxDQUFDLFNBQVM7VUFDVCxNQUFNLElBQUksQ0FBQzdKLGlCQUFpQixFQUFFLENBQUM4SixZQUFZLEVBQUU7UUFDOUM7TUFDRCxDQUFDLENBQUM7SUFDSCxDQUFDO0lBQUEsT0FFT0MsNkJBQTZCLEdBQXJDLHVDQUFzQ3BELGdCQUE4QyxFQUE4QjtNQUNqSCxJQUFJQSxnQkFBZ0IsSUFBSUEsZ0JBQWdCLENBQUMxSCxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3BEO1FBQ0EsTUFBTSxJQUFJTyxLQUFLLENBQUUsb0RBQW1EbUgsZ0JBQWdCLENBQUMxSCxNQUFPLFVBQVMsQ0FBQztNQUN2RztNQUVBLE9BQU8sQ0FBQTBILGdCQUFnQixhQUFoQkEsZ0JBQWdCLHVCQUFoQkEsZ0JBQWdCLENBQUUxSCxNQUFNLE1BQUssQ0FBQyxHQUFHMEgsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUdyRCxTQUFTO0lBQ3hFOztJQUVBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0F6QkM7SUFBQSxPQTRCTTBHLGNBQWMsR0FGcEIsOEJBR0NDLFlBQXVDLEVBQ3ZDQyxhQWVDLEVBQ2U7TUFBQTtNQUNoQixJQUFJQyxnQkFBbUM7TUFDdkMsSUFBSS9FLGFBQXlDO01BRTdDLElBQUk4RSxhQUFhLENBQUNuQyxZQUFZLEtBQUsvTSxZQUFZLENBQUNvUCxRQUFRLEVBQUU7UUFDekQsSUFBSSxPQUFPSCxZQUFZLEtBQUssUUFBUSxFQUFFO1VBQ3JDLE1BQU1JLFVBQVUsR0FBRyxJQUFJLENBQUM3TixPQUFPLEVBQUUsQ0FBQzhDLFFBQVEsRUFBRTtVQUM1QyxJQUFJLENBQUMrSyxVQUFVLEVBQUU7WUFDaEI7VUFDRDtVQUNBRixnQkFBZ0IsR0FBR0UsVUFBVSxDQUFDQyxRQUFRLENBQUNMLFlBQVksQ0FBcUI7VUFDeEVDLGFBQWEsQ0FBQ25DLFlBQVksR0FBRy9NLFlBQVksQ0FBQ3VQLElBQUk7VUFDOUMsT0FBT0wsYUFBYSxDQUFDTSxXQUFXO1FBQ2pDLENBQUMsTUFBTSxJQUFJUCxZQUFZLENBQUM3RCxHQUFHLENBQW1CLHdDQUF3QyxDQUFDLEVBQUU7VUFDeEYrRCxnQkFBZ0IsR0FBR0YsWUFBWTtRQUNoQyxDQUFDLE1BQU07VUFDTixNQUFNLElBQUl6SyxLQUFLLENBQUMsaUNBQWlDLENBQUM7UUFDbkQ7UUFFQSxJQUFJLElBQUksQ0FBQ3NDLG9CQUFvQixFQUFFLENBQUMwRCx5QkFBeUIsQ0FBQzJFLGdCQUFnQixDQUFDLEVBQUU7VUFDNUUvRSxhQUFhLEdBQUcsSUFBSSxDQUFDMkUsNkJBQTZCLENBQUNHLGFBQWEsQ0FBQ3ZELGdCQUFnQixDQUFDO1FBQ25GO01BQ0Q7TUFFQSxNQUFNOEQsb0JBQW9CLEdBQUcsSUFBSSxDQUFDdkssbUJBQW1CLENBQUNnSyxhQUFhLENBQUNuQyxZQUFZLEVBQUVvQyxnQkFBZ0IsRUFBRUQsYUFBYSxDQUFDek0sSUFBSSxDQUFDO01BRXZILElBQUksQ0FBQ1gsZUFBZSxFQUFFLENBQUM0TixjQUFjLEVBQUUsQ0FBQ0Msa0JBQWtCLEVBQUU7TUFFNUQsSUFDQyxDQUFDVCxhQUFhLENBQUNVLG9CQUFvQixLQUFLdEgsU0FBUyxHQUM5QzRHLGFBQWEsQ0FBQ1Usb0JBQW9CLDRCQUNsQyxJQUFJLENBQUM5TixlQUFlLEVBQUUsQ0FBQytOLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxvRkFBOUMsc0JBQWdEQyxHQUFHLDJEQUFuRCx1QkFBcURGLG9CQUFvQixLQUM1RVQsZ0JBQWdCLEtBQUtBLGdCQUFnQixDQUFDWSxjQUFjLEVBQUUsSUFDdERaLGdCQUFnQixDQUFDbEQsZ0JBQWdCLEVBQUUsS0FBSyxJQUFJLEVBQzNDO1FBQUE7UUFDRCxNQUFNK0QsVUFBVSw0QkFBR2IsZ0JBQWdCLENBQUM3SyxRQUFRLEVBQUUsMERBQTNCLHNCQUE2QmdMLFFBQVEsQ0FDdkRILGdCQUFnQixDQUFDbE4sT0FBTyxFQUFFLEVBQzFCa04sZ0JBQWdCLENBQUNjLFVBQVUsRUFBRSxFQUM3QixJQUFJQyxNQUFNLENBQUMsNENBQTRDLEVBQUUsSUFBSSxDQUFDLEVBQzlELElBQUlDLE1BQU0sQ0FBQztVQUNWQyxPQUFPLEVBQUUsQ0FDUixJQUFJRCxNQUFNLENBQUM7WUFDVkUsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QkMsUUFBUSxFQUFFLElBQUk7WUFDZEMsTUFBTSxFQUFFO1VBQ1QsQ0FBQyxDQUFDLEVBQ0YsSUFBSUosTUFBTSxDQUFDO1lBQ1ZFLElBQUksRUFBRSxpQkFBaUI7WUFDdkJDLFFBQVEsRUFBRSxJQUFJO1lBQ2RDLE1BQU0sRUFBRTtVQUNULENBQUMsQ0FBQyxDQUNGO1VBQ0RDLEdBQUcsRUFBRTtRQUNOLENBQUMsQ0FBQyxDQUNGO1FBQ0QsTUFBTTNFLE1BQU0sR0FBRyxPQUFNbUUsVUFBVSxhQUFWQSxVQUFVLHVCQUFWQSxVQUFVLENBQUVTLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELElBQUk1RSxNQUFNLENBQUM1SCxNQUFNLEdBQUcsQ0FBQyxFQUFFO1VBQ3RCLE9BQU8sSUFBSSxDQUFDdUYsaUJBQWlCLENBQUNxQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFBRXBDLFFBQVEsRUFBRSxJQUFJO1lBQUVDLGVBQWUsRUFBRTtVQUFNLENBQUMsQ0FBQyxDQUFDZ0gsSUFBSSxDQUFDLE1BQU1WLFVBQVUsYUFBVkEsVUFBVSx1QkFBVkEsVUFBVSxDQUFFVyxPQUFPLEVBQUUsQ0FBQztRQUN2SDtRQUNBWCxVQUFVLGFBQVZBLFVBQVUsdUJBQVZBLFVBQVUsQ0FBRVcsT0FBTyxFQUFFO1FBQ3JCLE9BQU8sSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQ25CLG9CQUFvQixFQUFFUixZQUFZLEVBQUVDLGFBQWEsRUFBRUMsZ0JBQWdCLEVBQUUvRSxhQUFhLENBQUM7TUFDcEg7TUFDQSxPQUFPLElBQUksQ0FBQ3dHLG1CQUFtQixDQUFDbkIsb0JBQW9CLEVBQUVSLFlBQVksRUFBRUMsYUFBYSxFQUFFQyxnQkFBZ0IsRUFBRS9FLGFBQWEsQ0FBQztJQUNwSCxDQUFDO0lBQUEsT0FFS3dHLG1CQUFtQixHQUF6QixtQ0FDQ25CLG9CQUE0QixFQUM1QlIsWUFBdUMsRUFDdkN0SSxVQUFvQyxFQUNwQ3dJLGdCQUFrQyxFQUNsQy9FLGFBQWtDLEVBQ2xCO01BQ2hCLElBQUksQ0FBQ2pCLHFCQUFxQixDQUFDLEVBQUUsQ0FBQztNQUM5QixRQUFRc0csb0JBQW9CO1FBQzNCLEtBQUt6UCxZQUFZLENBQUNvUCxRQUFRO1VBQ3pCLE9BQU8sSUFBSSxDQUFDeUIsc0JBQXNCLENBQUM1QixZQUFZLEVBQUV0SSxVQUFVLENBQUNtSyxRQUFRLENBQUM7UUFDdEUsS0FBSzlRLFlBQVksQ0FBQzRHLFFBQVE7VUFDekIsT0FBTyxJQUFJLENBQUNtSyxzQkFBc0IsQ0FBQzVCLGdCQUFnQixFQUFFL0UsYUFBYSxFQUFFekQsVUFBVSxDQUFDbEUsSUFBSSxDQUFDO1FBQ3JGLEtBQUt6QyxZQUFZLENBQUNnUixXQUFXO1VBQzVCLE9BQU9ySyxVQUFVLENBQUNzSyxXQUFXLEdBQzFCLElBQUksQ0FBQ0MsdUJBQXVCLENBQUM7WUFDN0JELFdBQVcsRUFBRXRLLFVBQVUsQ0FBQ3NLLFdBQVc7WUFDbkNFLGVBQWUsRUFBRXhLLFVBQVUsQ0FBQ3dLLGVBQWU7WUFDM0MzQixXQUFXLEVBQUU3SSxVQUFVLENBQUM2STtVQUN4QixDQUFDLENBQUMsR0FDRmxILFNBQVM7UUFDYixLQUFLdEksWUFBWSxDQUFDb1IsTUFBTTtVQUN2QixPQUFPLElBQUksQ0FBQ0Msb0JBQW9CLENBQy9CO1lBQ0NDLE9BQU8sRUFBRTNLLFVBQVUsQ0FBQzJLLE9BQU87WUFDM0I5QixXQUFXLEVBQUU3SSxVQUFVLENBQUM2SSxXQUFXO1lBQ25DMkIsZUFBZSxFQUFFeEssVUFBVSxDQUFDd0ssZUFBZTtZQUMzQy9HLGFBQWE7WUFDYjNILElBQUksRUFBRWtFLFVBQVUsQ0FBQ2xFO1VBQ2xCLENBQUMsRUFDRDBNLGdCQUFnQixDQUNoQjtRQUNGLEtBQUtuUCxZQUFZLENBQUN1UCxJQUFJO1FBQ3RCLEtBQUt2UCxZQUFZLENBQUNnSCxLQUFLO1VBQ3RCLE9BQU8sSUFBSSxDQUFDdUssdUJBQXVCLENBQ2xDO1lBQ0N4RSxZQUFZLEVBQUUwQyxvQkFBb0I7WUFDbENoTixJQUFJLEVBQUVrRSxVQUFVLENBQUNsRSxJQUErQjtZQUNoRCtPLGFBQWEsRUFBRTdLLFVBQVUsQ0FBQzZLLGFBQWE7WUFDdkNMLGVBQWUsRUFBRXhLLFVBQVUsQ0FBQ3dLLGVBQWU7WUFDM0NNLFlBQVksRUFBRTlLLFVBQVUsQ0FBQzhLLFlBQVk7WUFDckNySDtVQUNELENBQUMsRUFDRCtFLGdCQUFnQixDQUNoQjtRQUNGO1VBQ0MsTUFBTSxJQUFJM0ssS0FBSyxDQUFFLDBCQUF5QmlMLG9CQUFxQixFQUFDLENBQUM7TUFBQztJQUVyRTs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQU5DO0lBQUEsT0FPTWlDLG9CQUFvQixHQUExQixvQ0FBMkJDLFlBQXlDLEVBQUV0USxXQUE2QixFQUFpQjtNQUNuSCxNQUFNbUUsZ0JBQXdCLEdBQUcsSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQ3BFLFdBQVcsQ0FBQztNQUN0RSxNQUFNbUcsS0FBSyxHQUFHbkcsV0FBVyxDQUFDaUQsUUFBUSxFQUFFO01BQ3BDLE1BQU1zTixNQUFNLEdBQUcsTUFBTUQsWUFBWTtNQUNqQyxNQUFNM0ksa0JBQWtCLEdBQUc0SSxNQUFNLENBQUMsQ0FBQyxDQUFDO01BQ3BDLElBQUksQ0FBQ2xKLG1DQUFtQyxDQUFDbEQsZ0JBQWdCLEVBQUVnQyxLQUFLLENBQUM7TUFDakUsTUFBTSxJQUFJLENBQUNOLElBQUksQ0FBQ2UsUUFBUSxDQUFDNEosYUFBYSxDQUFDO1FBQUV6SyxPQUFPLEVBQUU0QjtNQUFtQixDQUFDLENBQUM7TUFDdkUsSUFBSSxDQUFDSSxXQUFXLENBQUMvSSxRQUFRLENBQUNnSixRQUFRLENBQUMsQ0FBQyxDQUFDO01BQ3JDLElBQUksQ0FBQ2hJLFdBQVcsQ0FBQ3FFLFVBQVUsRUFBRSxFQUFFO1FBQzlCLElBQUlGLGdCQUFnQixLQUFLdEYsZ0JBQWdCLENBQUM2SCxNQUFNLEVBQUU7VUFBQTtVQUNqRDtVQUNBLE1BQU0rSixXQUFXLEdBQUd0SyxLQUFLLENBQUNqQyxZQUFZLEVBQUUsQ0FBQ00sY0FBYyxDQUFDeEUsV0FBVyxDQUFDWSxPQUFPLEVBQUUsQ0FBQztVQUM5RSxNQUFNNkQsU0FBUyxHQUFHRiwyQkFBMkIsQ0FBQ2tNLFdBQVcsQ0FBQyxDQUFDQyxpQkFBOEI7VUFDekYsTUFBTS9MLFNBQVMsR0FBR0YsU0FBUyxhQUFUQSxTQUFTLGlEQUFUQSxTQUFTLENBQUVJLFdBQVcsQ0FBQ0csT0FBTyxxRkFBOUIsdUJBQWdDQyxzQkFBc0IsMkRBQXRELHVCQUF3REMsU0FBUztVQUNuRixJQUFJLENBQUN5TCxnQkFBZ0IsRUFBRSxDQUFDQyxXQUFXLENBQUMsb0JBQW9CLEVBQUVqTSxTQUFTLENBQUM7UUFDckUsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDYyxvQkFBb0IsRUFBRSxDQUFDMEQseUJBQXlCLENBQUNuSixXQUFXLENBQUMsRUFBRTtVQUM5RTtVQUNBO1VBQ0EsSUFBSSxDQUFDNlEsdUJBQXVCLENBQUMsSUFBSSxDQUFDO1FBQ25DO01BQ0Q7TUFDQSxJQUFJbEosa0JBQWtCLEVBQUU7UUFDdkIsSUFBSSxDQUFDbUosMkJBQTJCLENBQUM5USxXQUFXLENBQUM7UUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQytHLGFBQWEsRUFBRSxFQUFFO1VBQzFCZ0UsU0FBUyxDQUFDQyxpQkFBaUIsRUFBRTtRQUM5QjtRQUNBLElBQUksQ0FBQ2MsYUFBYSxDQUFDQyxRQUFRLENBQUNnRixNQUFNLEVBQUVwSixrQkFBa0IsQ0FBQztRQUN2RCxJQUNDZSxXQUFXLENBQUNDLDZCQUE2QixDQUFDeEMsS0FBSyxDQUFDakMsWUFBWSxFQUFFLENBQUMsSUFDL0QsSUFBSSxDQUFDOE0sV0FBVyxDQUFDckosa0JBQWtCLENBQUMsSUFDcEMsQ0FBQyxJQUFJLENBQUM5QixJQUFJLENBQUNvTCxrQkFBa0IsQ0FBQ0MsV0FBVyxFQUFFLEVBQzFDO1VBQ0Q7VUFDQSxNQUFNdEksV0FBVyxDQUFDakIsa0JBQWtCLENBQUM7UUFDdEM7TUFDRDtJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVJDO0lBQUEsT0FTTWtJLHVCQUF1QixHQUE3Qix1Q0FBOEJ2SyxVQUk3QixFQUFpQjtNQUFBO01BQ2pCLE1BQU02TCxZQUFZLEdBQUcsSUFBSSxDQUFDMVEsZUFBZSxFQUFFO01BQzNDLE1BQU1tUCxXQUFXLEdBQUd0SyxVQUFVLENBQUNzSyxXQUFXO01BQzFDLE1BQU0zTyxLQUFLLEdBQUdxRSxVQUFVLENBQUNzSyxXQUFXLENBQUNyRSxTQUFTLEVBQXVCO01BQ3JFLElBQUk2RixVQUFVLEdBQUd2UixPQUFPLENBQUNDLE9BQU8sRUFBRTtNQUNsQyxJQUFJLENBQUNtQixLQUFLLEVBQUU7UUFDWDtNQUNEO01BRUEsTUFBTWdELFNBQVMsc0JBQUdoRCxLQUFLLENBQUNnQyxRQUFRLEVBQUUsb0RBQWhCLGdCQUFrQmlCLFlBQVksRUFBb0I7TUFDcEUsTUFBTWxFLFdBQVcsR0FBR2lCLEtBQUssQ0FBQ2lKLGFBQWEsRUFBRTtNQUN6QyxJQUFJLElBQUksQ0FBQ3pFLG9CQUFvQixFQUFFLENBQUMwRCx5QkFBeUIsQ0FBQ25KLFdBQVcsQ0FBQyxFQUFFO1FBQ3ZFLE1BQU0sSUFBSW1ELEtBQUssQ0FBRSx1REFBc0QsQ0FBQztNQUN6RTtNQUNBLE1BQU1rTyxrQkFBa0IsR0FBR3pCLFdBQVcsQ0FBQ3hQLGlCQUFpQixFQUFhO01BQ3JFLE1BQU1rUixrQkFBa0IsR0FBRyxJQUFJLENBQUNDLGdDQUFnQyxDQUFDdFEsS0FBSyxDQUFDO01BQ3ZFO01BQ0EsSUFBSTJPLFdBQVcsQ0FBQ3hPLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxLQUFLLE1BQU0sRUFBRTtRQUFBO1FBQ25FLDBCQUFBSCxLQUFLLENBQUNiLGlCQUFpQixDQUFDLFVBQVUsQ0FBQywyREFBbkMsdUJBQXFDd1EsV0FBVyxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFDO01BQ2pGO01BRUEsTUFBTTVQLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDd0wsUUFBUSxDQUFDOEUsa0JBQWtCLENBQUM7TUFDbEUsSUFBSXRRLGtCQUFrQixDQUFDNEIsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNsQyxJQUFJLENBQUM3Qiw4QkFBOEIsQ0FBQ0Msa0JBQWtCLEVBQUVDLEtBQUssQ0FBQztRQUM5REgsR0FBRyxDQUFDRCxLQUFLLENBQUMsMEJBQTBCLENBQUM7UUFDckM7UUFDQTtNQUNEO01BQ0EsTUFBTTJRLFVBQVUsR0FBR2pOLDJCQUEyQixDQUFDTixTQUFTLENBQUNPLGNBQWMsQ0FBQzZNLGtCQUFrQixDQUFDelEsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDd0UsZ0JBQWdCO01BQ3ZILE1BQU1xTSxrQkFBa0IsR0FBR0osa0JBQWtCLENBQUN4RSxTQUFTLEVBQUU7TUFFekQsTUFBTSxJQUFJLENBQUM2RSx5QkFBeUIsRUFBRTs7TUFFdEM7TUFDQTtNQUNBMVIsV0FBVyxDQUFDNkssZUFBZSxDQUFDLFFBQVEsRUFBRSxZQUFZO1FBQ2pELE1BQU04RyxRQUFRO1FBQ2QxUSxLQUFLLENBQUMyUSxhQUFhLENBQUN0TSxVQUFVLENBQUM2SSxXQUFXLEdBQUdsTixLQUFLLENBQUNpSixhQUFhLEVBQUUsQ0FBQzJILFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztNQUNwRixDQUFDLENBQUM7O01BRUY7TUFDQTtNQUNBLElBQUksQ0FBQ0Msa0JBQWtCLENBQUM5UixXQUFXLENBQUM7TUFFcEMsTUFBTTJSLFFBQVEsR0FBRyxJQUFJLENBQUNsTSxvQkFBb0IsRUFBRSxDQUFDa0ksY0FBYyxDQUMxRDNOLFdBQVcsRUFDWDtRQUNDb0IsSUFBSSxFQUFFMlEsTUFBTSxDQUFDQyxNQUFNLENBQ2xCLENBQUMsQ0FBQyxFQUNGLEdBQUdELE1BQU0sQ0FBQ0UsSUFBSSxDQUFDUixrQkFBa0IsQ0FBQyxDQUNoQzNQLE1BQU0sQ0FDTG9RLFlBQW9CLElBQ3BCVixVQUFVLENBQUNXLG9CQUFvQixDQUFDQyxTQUFTLENBQUVDLFFBQVEsSUFBS0EsUUFBUSxDQUFDQyxJQUFJLEtBQUtKLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUMvRixDQUFDO1FBQUEsQ0FDREssR0FBRyxDQUFFdkQsSUFBSSxLQUFNO1VBQUUsQ0FBQ0EsSUFBSSxHQUFHeUMsa0JBQWtCLENBQUN6QyxJQUFJO1FBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDdkQ7UUFDRHdELDRCQUE0QixFQUFFLEtBQUs7UUFBRTtRQUNyQ0MsUUFBUSxFQUFFLE9BQU87UUFBRTtRQUNuQkMsTUFBTSxFQUFHelIsS0FBSyxhQUFMQSxLQUFLLDJDQUFMQSxLQUFLLENBQUVzSyxTQUFTLEVBQUUsOEVBQW5CLGlCQUE4Q29ILGtCQUFrQixFQUFFLDBEQUFsRSxzQkFBb0VDLFVBQVUsQ0FBQ0MsRUFBRTtRQUN6RmxKLGFBQWEsRUFBRSxJQUFJLENBQUN4SixPQUFPLEVBQUU7UUFDN0IyUyxvQkFBb0IsRUFBRSxJQUFJLENBQUNqTixJQUFJLENBQUNlLFFBQVEsQ0FBQ21NLGNBQWM7UUFDdkRDLG1CQUFtQixFQUFFN0IsWUFBWSxDQUFDOEIsY0FBYyxFQUFFLEtBQUtoVSxXQUFXLENBQUNpVSxVQUFVO1FBQUU7UUFDL0UvRSxXQUFXLEVBQUU3SSxVQUFVLENBQUM2SSxXQUFXO1FBQ25DekMsWUFBWSxFQUFFL00sWUFBWSxDQUFDZ1I7TUFDNUIsQ0FBQyxFQUNEd0IsWUFBWSxFQUNaLElBQUksQ0FBQ3hOLGlCQUFpQixFQUFFLEVBQ3hCLEtBQUssQ0FDTDtNQUNEO01BQ0E7TUFDQSxJQUFJLENBQUMyQixVQUFVLENBQUN3SyxlQUFlLEVBQUU7UUFDaEMsSUFBSSxDQUFDL1AsaUJBQWlCLENBQUNDLFdBQVcsRUFBRTJSLFFBQVEsQ0FBQztNQUM5QztNQUVBLElBQUk7UUFBQTtRQUNILE1BQU13QixzQkFBc0IsR0FBRzlCLGtCQUFrQixDQUFDcEgsVUFBVSxFQUFzQjtRQUNsRixNQUFNbUosbUJBQW1CLEdBQUdELHNCQUFzQixDQUFDRSxNQUFNLEVBQUU7UUFDM0R6RCxXQUFXLENBQUMwRCxpQkFBaUIsQ0FBQ0YsbUJBQW1CLENBQUM7O1FBRWxEO1FBQ0EseUJBQUFBLG1CQUFtQixDQUFDOVMsT0FBTyxFQUFFLDBEQUE3QixzQkFBK0JpVCxLQUFLLENBQUMsTUFBTTtVQUMxQ3pTLEdBQUcsQ0FBQzBTLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQztRQUNyRCxDQUFDLENBQUM7UUFDRnBDLFVBQVUsR0FBR0Msa0JBQWtCLENBQUNvQyxNQUFNLENBQUMsU0FBUyxDQUFDO01BQ2xELENBQUMsQ0FBQyxPQUFPNVMsS0FBYyxFQUFFO1FBQ3hCO1FBQ0EsSUFBSXVKLFVBQVUsQ0FBQ3NKLFFBQVEsQ0FBQyxJQUFJLENBQUM3TixJQUFJLENBQUMxRixPQUFPLEVBQUUsQ0FBQzhDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1VBQzVEbUgsVUFBVSxDQUFDNkIsTUFBTSxDQUFDLElBQUksQ0FBQ3BHLElBQUksQ0FBQzFGLE9BQU8sRUFBRSxDQUFDOEMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3REO1FBQ0FuQyxHQUFHLENBQUNELEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRUEsS0FBSyxDQUFXO01BQzdEO01BQ0EsT0FBTyxJQUFJLENBQUN3UCxvQkFBb0IsQ0FBQ3hRLE9BQU8sQ0FBQzhULEdBQUcsQ0FBQyxDQUFDaEMsUUFBUSxFQUFFUCxVQUFVLENBQUMsQ0FBQyxFQUFFcFIsV0FBVyxDQUFDO0lBQ25GOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVhDO0lBQUEsT0FZTWdRLG9CQUFvQixHQUExQixvQ0FDQzFLLFVBTUMsRUFDRHRGLFdBQTZCLEVBQ2I7TUFBQTtNQUNoQixJQUFJaUIsS0FBd0I7TUFDNUIsSUFBSXFFLFVBQVUsQ0FBQzJLLE9BQU8sRUFBRTtRQUN2QmhQLEtBQUssR0FBRyxJQUFJLENBQUNkLE9BQU8sRUFBRSxDQUFDeUosSUFBSSxDQUFDdEUsVUFBVSxDQUFDMkssT0FBTyxDQUFVO01BQ3pEO01BQ0EsY0FBSWhQLEtBQUssbUNBQUwsT0FBTzhJLEdBQUcsQ0FBUSxrQkFBa0IsQ0FBQyxFQUFFO1FBQzFDOUksS0FBSyxDQUFDaUosYUFBYSxFQUFFLENBQUNXLGVBQWUsQ0FBQyxRQUFRLEVBQUUsWUFBWTtVQUFBO1VBQzNELE1BQU14SyxVQUFVLEdBQUcsTUFBTXNSLFFBQVE7VUFDakMsTUFBTWlDLGtCQUFrQixHQUFHNVQsV0FBVyxDQUFDNlQscUJBQXFCLEVBQUU7VUFDOUQsTUFBTUMsWUFBWSxHQUFHRixrQkFBa0IsQ0FBQ0csT0FBTyxDQUFDMVQsVUFBVSxDQUFDO1VBQzNELFdBQUFZLEtBQUssNENBQUwsUUFBTytTLFFBQVEsQ0FBQ0YsWUFBWSxFQUFFLElBQUksQ0FBQztVQUNuQyxJQUFJLElBQUksQ0FBQ3JPLG9CQUFvQixFQUFFLENBQUMwRCx5QkFBeUIsQ0FBQ25KLFdBQVcsQ0FBQyxFQUFFO1lBQ3ZFO1lBQ0EsTUFBTStJLGFBQWEsR0FBRzFJLFVBQVUsQ0FBQ2tMLFNBQVMsRUFBRTtZQUM1QyxNQUFNMEksV0FBVyxHQUFHbEwsYUFBYSxHQUFHNkssa0JBQWtCLENBQUNHLE9BQU8sQ0FBQ2hMLGFBQWEsQ0FBQyxHQUFHOUIsU0FBUztZQUN6RixJQUFJZ04sV0FBVyxLQUFLaE4sU0FBUyxJQUFJZ04sV0FBVyxJQUFJLENBQUMsRUFBRTtjQUFBO2NBQ2xELFdBQUFoVCxLQUFLLDRDQUFMLFFBQU8yUSxhQUFhLENBQUNxQyxXQUFXLENBQUM7WUFDbEM7VUFDRDtRQUNELENBQUMsQ0FBQztNQUNIOztNQUVBO01BQ0E7TUFDQSxJQUFJLENBQUNuQyxrQkFBa0IsQ0FBQzlSLFdBQVcsQ0FBQztNQUNwQyxNQUFNMlIsUUFBUSxHQUFHLElBQUksQ0FBQ2xNLG9CQUFvQixFQUFFLENBQUNrSSxjQUFjLENBQzFEM04sV0FBVyxFQUNYO1FBQ0M7UUFDQXdTLDRCQUE0QixFQUFFLEtBQUs7UUFBRTtRQUNyQ0MsUUFBUSxFQUFFLE9BQU87UUFBRTtRQUNuQkMsTUFBTSxhQUFHelIsS0FBSyxpRUFBTCxRQUFPc0ssU0FBUyxFQUFFLCtFQUFuQixrQkFBOENvSCxrQkFBa0IsRUFBRSwwREFBbEUsc0JBQW9FQyxVQUFVLENBQUNDLEVBQUU7UUFDekZsSixhQUFhLEVBQUUsSUFBSSxDQUFDeEosT0FBTyxFQUFFO1FBQzdCMlMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDak4sSUFBSSxDQUFDZSxRQUFRLENBQUNtTSxjQUFjO1FBQ3ZEQyxtQkFBbUIsRUFBRSxJQUFJLENBQUN2UyxlQUFlLEVBQUUsQ0FBQ3dTLGNBQWMsRUFBRSxLQUFLaFUsV0FBVyxDQUFDaVUsVUFBVTtRQUFFO1FBQ3pGL0UsV0FBVyxFQUFFN0ksVUFBVSxDQUFDNkksV0FBVztRQUNuQ3pDLFlBQVksRUFBRS9NLFlBQVksQ0FBQ29SLE1BQU07UUFDakNoSCxhQUFhLEVBQUV6RCxVQUFVLENBQUN5RCxhQUFhO1FBQ3ZDM0gsSUFBSSxFQUFFa0UsVUFBVSxDQUFDbEU7TUFDbEIsQ0FBQyxFQUNELElBQUksQ0FBQ1gsZUFBZSxFQUFFLEVBQ3RCLElBQUksQ0FBQ2tELGlCQUFpQixFQUFFLEVBQ3hCLEtBQUssQ0FDTDtNQUVELElBQUksQ0FBQzJCLFVBQVUsQ0FBQ3dLLGVBQWUsRUFBRTtRQUNoQyxJQUFJLENBQUMvUCxpQkFBaUIsQ0FBQ0MsV0FBVyxFQUFFMlIsUUFBUSxDQUFDO01BQzlDO01BQ0EsT0FBTyxJQUFJLENBQUN0QixvQkFBb0IsQ0FBQ3hRLE9BQU8sQ0FBQzhULEdBQUcsQ0FBQyxDQUFDaEMsUUFBUSxFQUFFLElBQUksQ0FBQ25GLFFBQVEsQ0FBQ21GLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTNSLFdBQVcsQ0FBQztJQUNoRzs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BUEM7SUFBQSxPQVFNMFAsc0JBQXNCLEdBQTVCLHNDQUE2QjFQLFdBQTZCLEVBQUUrSSxhQUE4QixFQUFFM0gsSUFBYSxFQUFpQjtNQUN6SCxNQUFNcUksVUFBVSxHQUFHLElBQUksQ0FBQ0MsZ0JBQWdCLEVBQUU7TUFDMUNVLFVBQVUsQ0FBQ0MsSUFBSSxDQUFDWixVQUFVLENBQUM7TUFDM0IsTUFBTSxJQUFJLENBQUN5SyxrQkFBa0IsRUFBRSxDQUFDQyx3QkFBd0IsQ0FBQ25VLFdBQVcsRUFBRTtRQUNyRW9VLDBCQUEwQixFQUFFO1VBQUVDLElBQUksRUFBRSxVQUFVO1VBQUV0TCxhQUFhO1VBQUUvSSxXQUFXO1VBQUVvQjtRQUFLLENBQUM7UUFDbEZnSCxRQUFRLEVBQUUsSUFBSTtRQUNkRSxVQUFVLEVBQUU7TUFDYixDQUFDLENBQUM7TUFDRjhCLFVBQVUsQ0FBQzZCLE1BQU0sQ0FBQ3hDLFVBQVUsQ0FBQztJQUM5Qjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVpDO0lBQUEsT0FhTXlHLHVCQUF1QixHQUE3Qix1Q0FDQzVLLFVBT0MsRUFDRHRGLFdBQTZCLEVBQ2I7TUFDaEIsSUFBSW9SLFVBQXdDO01BQzVDLE1BQU0zSCxVQUFVLEdBQUcsSUFBSSxDQUFDQyxnQkFBZ0IsRUFBRTtNQUMxQyxNQUFNNEssZUFBZSxHQUFHLElBQUksQ0FBQ0osa0JBQWtCLEVBQUU7TUFDakQ5SixVQUFVLENBQUNDLElBQUksQ0FBQ1osVUFBVSxDQUFDO01BRTNCLE1BQU1rSSxRQUFRLEdBQUcsSUFBSSxDQUFDbE0sb0JBQW9CLEVBQUUsQ0FDMUNrSSxjQUFjLENBQ2QzTixXQUFXLEVBQ1g7UUFDQyxHQUFHc0YsVUFBVTtRQUNiLEdBQUc7VUFDRnFFLGFBQWEsRUFBRSxJQUFJLENBQUN4SixPQUFPLEVBQUU7VUFDN0IyUyxvQkFBb0IsRUFBRSxJQUFJLENBQUNqTixJQUFJLENBQUNlLFFBQVEsQ0FBQ21NLGNBQWM7VUFDdkRDLG1CQUFtQixFQUFFLElBQUksQ0FBQ3ZTLGVBQWUsRUFBRSxDQUFDd1MsY0FBYyxFQUFFLEtBQUtoVSxXQUFXLENBQUNpVSxVQUFVLENBQUM7UUFDekY7TUFDRCxDQUFDLEVBQ0QsSUFBSSxDQUFDelMsZUFBZSxFQUFFLEVBQ3RCLElBQUksQ0FBQ2tELGlCQUFpQixFQUFFLEVBQ3hCLEtBQUssQ0FDTCxDQUNBMEwsSUFBSSxDQUFFMUgsa0JBQWtCLElBQUs7UUFDN0IsSUFBSSxJQUFJLENBQUNaLGFBQWEsRUFBRSxJQUFJWSxrQkFBa0IsSUFBSUEsa0JBQWtCLENBQUNzQyxVQUFVLEVBQUUsS0FBS2pLLFdBQVcsRUFBRTtVQUNsRztVQUNBO1VBQ0FBLFdBQVcsQ0FBQzhLLE9BQU8sRUFBRTtRQUN0QjtRQUVBLE9BQU9uRCxrQkFBa0I7TUFDMUIsQ0FBQyxDQUFDOztNQUVIO01BQ0EsSUFBSXJDLFVBQVUsQ0FBQzZLLGFBQWEsS0FBSyxJQUFJLElBQUksQ0FBQzdLLFVBQVUsQ0FBQ3dLLGVBQWUsRUFBRTtRQUNyRSxJQUFJLENBQUMvUCxpQkFBaUIsQ0FBQ0MsV0FBVyxFQUFFMlIsUUFBUSxDQUFDO01BQzlDO01BRUEsSUFBSXJNLFVBQVUsQ0FBQ29HLFlBQVksS0FBSy9NLFlBQVksQ0FBQ2dILEtBQUssRUFBRTtRQUNuRHlMLFVBQVUsR0FBR2tELGVBQWUsQ0FBQ0gsd0JBQXdCLENBQUNuVSxXQUFXLEVBQUU7VUFDbEVvVSwwQkFBMEIsRUFBRTtZQUFFQyxJQUFJLEVBQUUsT0FBTztZQUFFRSxvQkFBb0IsRUFBRTVDO1VBQVMsQ0FBQztVQUM3RXZKLFFBQVEsRUFBRSxJQUFJO1VBQ2RFLFVBQVUsRUFBRTtRQUNiLENBQUMsQ0FBQztNQUNILENBQUMsTUFBTTtRQUNOOEksVUFBVSxHQUFHTyxRQUFRLENBQUN0QyxJQUFJLENBQUMsTUFBTzFILGtCQUFrQixJQUFLO1VBQ3hELElBQUksQ0FBQ0Esa0JBQWtCLEVBQUU7WUFDeEIsTUFBTTZNLGtCQUFrQixHQUFHQyxPQUFPLENBQUNDLG9CQUFvQixDQUFDLGFBQWEsQ0FBRTtZQUN2RSxPQUFPSixlQUFlLENBQUNLLHFCQUFxQixDQUFDSCxrQkFBa0IsQ0FBQ0ksT0FBTyxDQUFDLG9DQUFvQyxDQUFDLEVBQUU7Y0FDOUdDLEtBQUssRUFBRUwsa0JBQWtCLENBQUNJLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztjQUN6REUsV0FBVyxFQUFFTixrQkFBa0IsQ0FBQ0ksT0FBTyxDQUFDLDhDQUE4QztZQUN2RixDQUFDLENBQUM7VUFDSCxDQUFDLE1BQU07WUFDTjtZQUNBO1lBQ0EsTUFBTUcsYUFBMEMsR0FBRztjQUNsRDNNLFFBQVEsRUFBRSxJQUFJO2NBQ2RFLFVBQVUsRUFBRSxJQUFJO2NBQ2hCME0sU0FBUyxFQUNSLElBQUksQ0FBQzVRLG1CQUFtQixDQUFDcEUsV0FBVyxDQUFDLElBQUluQixnQkFBZ0IsQ0FBQzZILE1BQU0sSUFBSXBCLFVBQVUsQ0FBQzhLLFlBQVksR0FBRyxJQUFJLEdBQUduSjtZQUN2RyxDQUFDO1lBRUQsT0FBTzNCLFVBQVUsQ0FBQzZLLGFBQWEsR0FDNUJtRSxlQUFlLENBQUNXLGlCQUFpQixDQUFDdE4sa0JBQWtCLEVBQUVvTixhQUFhLENBQUMsR0FDcEVULGVBQWUsQ0FBQ0gsd0JBQXdCLENBQUN4TSxrQkFBa0IsRUFBRW9OLGFBQWEsQ0FBQztVQUMvRTtRQUNELENBQUMsQ0FBQztNQUNIO01BQ0EsSUFBSTtRQUNILE1BQU0sSUFBSSxDQUFDMUUsb0JBQW9CLENBQUN4USxPQUFPLENBQUM4VCxHQUFHLENBQUMsQ0FBQ2hDLFFBQVEsRUFBRVAsVUFBVSxDQUFDLENBQUMsRUFBRXBSLFdBQVcsQ0FBQztNQUNsRixDQUFDLENBQUMsT0FBT2EsS0FBYyxFQUFFO1FBQ3hCO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxJQUNDLENBQ0MvQixTQUFTLENBQUNvVyxrQkFBa0IsRUFDNUJwVyxTQUFTLENBQUNxVyxxQkFBcUIsRUFDL0JyVyxTQUFTLENBQUNzVyxjQUFjLEVBQ3hCdFcsU0FBUyxDQUFDdVcsb0JBQW9CLENBQzlCLENBQUNDLFFBQVEsQ0FBQ3pVLEtBQUssQ0FBQyxFQUNoQjtVQUNELElBQUksQ0FBQ3FULGtCQUFrQixFQUFFLENBQUNxQiw4QkFBOEIsRUFBRTtRQUMzRDtRQUNBLE1BQU0xVSxLQUFLO01BQ1osQ0FBQyxTQUFTO1FBQ1R1SixVQUFVLENBQUM2QixNQUFNLENBQUN4QyxVQUFVLENBQUM7TUFDOUI7SUFDRDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQU5DO0lBQUEsT0FPTStGLHNCQUFzQixHQUE1QixzQ0FBNkJ4UCxXQUFzQyxFQUFFeVAsUUFBaUIsRUFBaUI7TUFDdEc7TUFDQSxJQUFJQSxRQUFRLEVBQUU7UUFDYixJQUFJLE9BQU96UCxXQUFXLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQ3lGLG9CQUFvQixFQUFFLENBQUMwRCx5QkFBeUIsQ0FBQ25KLFdBQVcsQ0FBQyxFQUFFO1VBQzFHLE1BQU0sSUFBSW1ELEtBQUssQ0FBRSxvREFBbUQsQ0FBQztRQUN0RTtRQUVBLE1BQU0sSUFBSSxDQUFDcUosUUFBUSxFQUFFO1FBQ3JCLE1BQU1nSixVQUFVLEdBQUcsSUFBSSxDQUFDclYsT0FBTyxFQUFFLENBQUNzVixhQUFhLEVBQW9CO1FBQ25FLE1BQU1DLFVBQVUsR0FBR2hOLFdBQVcsQ0FBQ2lOLGlDQUFpQyxDQUFDLElBQUksQ0FBQzlQLElBQUksQ0FBQzFGLE9BQU8sRUFBRSxFQUFFSCxXQUFXLENBQUM7UUFDbEd3VixVQUFVLENBQUNJLHNCQUFzQixDQUFDQyw4QkFBOEIsQ0FBQ0wsVUFBVSxFQUFFL0YsUUFBUSxFQUFFeEksU0FBUyxFQUFFeU8sVUFBVSxDQUFDO01BQzlHO0lBQ0Q7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FOQztJQXVJQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBSkMsT0FNTUksZ0JBQWdCLEdBQXRCLGdDQUNDL1AsT0FBZ0IsRUFDaEJULFVBQWdGLEVBQ25CO01BQzdELE9BQU8sSUFBSSxDQUFDRyxvQkFBb0IsRUFBRSxDQUFDcVEsZ0JBQWdCLENBQUMvUCxPQUFPLEVBQUVULFVBQVUsRUFBRSxJQUFJLENBQUNuRixPQUFPLEVBQUUsQ0FBQztJQUN6Rjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BUEM7SUFBQSxPQVFBb1IsZ0NBQWdDLEdBQWhDLDBDQUFpQ3RRLEtBQXdCLEVBQW9FO01BQzVILE1BQU0yTyxXQUFXLEdBQUczTyxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRUUsY0FBYyxFQUFFO01BQzNDLElBQUl5TyxXQUFXLElBQUkzTyxLQUFLLEVBQUU7UUFDekIsT0FBTyxZQUF3RTtVQUM5RSxNQUFNOFUsa0JBQWtCLEdBQUluRyxXQUFXLENBQUN4UCxpQkFBaUIsRUFBRSxDQUFheU0sU0FBUyxFQUFFO1VBQ25GLE9BQU9rSixrQkFBa0IsQ0FBQywyQkFBMkIsQ0FBQztVQUN0RCxPQUFPLElBQUksQ0FBQ0QsZ0JBQWdCLENBQUM3VSxLQUFLLENBQUNiLGlCQUFpQixFQUFFLEVBQWE7WUFDbEVnQixJQUFJLEVBQUUyVSxrQkFBa0I7WUFDeEI3VSx3QkFBd0IsRUFBRUQsS0FBSyxDQUFDRSxjQUFjLEVBQUUsQ0FBQ0MsSUFBSSxDQUFDLDBCQUEwQjtVQUNqRixDQUFDLENBQUM7UUFDSCxDQUFDO01BQ0Y7TUFDQSxPQUFPLFlBQVl2QixPQUFPLENBQUNDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDdkM7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BWEM7SUFBQSxPQVlNa1csdUJBQXVCLEdBQTdCLHVDQUNDaFcsV0FBNkIsRUFDN0JpVyxhQUF3QyxFQUN4QzlILFdBQW9CLEVBQ3BCK0gsZUFBd0IsRUFDeEJwRCxvQkFBK0IsRUFHVjtNQUFBLElBRnJCcUQsZ0JBQWdCLHVFQUFHLEtBQUs7TUFBQSxJQUN4Qi9NLGtCQUE0QjtNQUU1QixNQUFNcEQsaUJBQWlCLEdBQUcsSUFBSSxDQUFDUCxvQkFBb0IsRUFBRTtNQUNyRCxNQUFNZ0UsVUFBVSxHQUFHLElBQUksQ0FBQ0MsZ0JBQWdCLEVBQUU7TUFDMUMsTUFBTTBNLGlCQUFpQixHQUFHcFcsV0FBVztNQUNyQ29KLGtCQUFrQixHQUFHQSxrQkFBa0IsS0FBSyxLQUFLO01BQ2pELElBQUksQ0FBQytNLGdCQUFnQixFQUFFO1FBQ3RCL0wsVUFBVSxDQUFDQyxJQUFJLENBQUNaLFVBQVUsQ0FBQztNQUM1QjtNQUNBLElBQUk7UUFDSCxNQUFNLElBQUksQ0FBQytDLFFBQVEsRUFBRTtRQUNyQixJQUFJc0csb0JBQW9CLEVBQUU7VUFDekIsTUFBTUEsb0JBQW9CLENBQUM7WUFBRXVELFdBQVcsRUFBRUQsaUJBQWlCLENBQUN4VixPQUFPO1VBQUcsQ0FBQyxDQUFDO1FBQ3pFO1FBRUEsTUFBTXFELFNBQVMsR0FBR21TLGlCQUFpQixDQUFDblQsUUFBUSxFQUFFLENBQUNpQixZQUFZLEVBQUU7UUFDN0QsSUFBSW9TLFFBQWdCO1FBRXBCLElBQUlGLGlCQUFpQixDQUFDeEgsVUFBVSxFQUFFLEVBQUU7VUFDbkMwSCxRQUFRLEdBQUdyUyxTQUFTLENBQUNzUyxXQUFXLENBQUUsR0FBRUgsaUJBQWlCLENBQUN4SCxVQUFVLEVBQUUsQ0FBQ2hPLE9BQU8sRUFBRyxJQUFHd1YsaUJBQWlCLENBQUN4VixPQUFPLEVBQUcsRUFBQyxDQUFDO1FBQy9HLENBQUMsTUFBTTtVQUNOMFYsUUFBUSxHQUFHclMsU0FBUyxDQUFDc1MsV0FBVyxDQUFDSCxpQkFBaUIsQ0FBQ3hWLE9BQU8sRUFBRSxDQUFDO1FBQzlEO1FBRUEsSUFBSSxDQUFDa1Isa0JBQWtCLENBQUNzRSxpQkFBaUIsQ0FBQzs7UUFFMUM7UUFDQSxNQUFNSSxnQkFBZ0IsR0FBR1AsYUFBYSxDQUFDMUQsR0FBRyxDQUFDLE1BQU9rRSxjQUFjLElBQUs7VUFDcEUsTUFBTUMsZ0JBQWtDLEdBQUc7WUFBRXRWLElBQUksRUFBRSxDQUFDLENBQUM7WUFBRXVJLGFBQWEsRUFBRSxJQUFJLENBQUN4SixPQUFPO1VBQUcsQ0FBQztVQUV0RnVXLGdCQUFnQixDQUFDbEUsNEJBQTRCLEdBQUcsS0FBSyxDQUFDLENBQUM7VUFDdkRrRSxnQkFBZ0IsQ0FBQ2hMLFlBQVksR0FBRy9NLFlBQVksQ0FBQ2dSLFdBQVc7VUFDeEQrRyxnQkFBZ0IsQ0FBQ3ZJLFdBQVcsR0FBR0EsV0FBVztVQUMxQ3VJLGdCQUFnQixDQUFDQyxRQUFRLEdBQUdSLGdCQUFnQjs7VUFFNUM7VUFDQSxLQUFLLE1BQU1qRSxZQUFZLElBQUl1RSxjQUFjLEVBQUU7WUFDMUMsTUFBTXBFLFFBQVEsR0FBR3BPLFNBQVMsQ0FBQzRJLFNBQVMsQ0FBRSxHQUFFeUosUUFBUyxJQUFHcEUsWUFBYSxFQUFDLENBQUM7WUFDbkUsSUFDQ0csUUFBUSxJQUNSQSxRQUFRLENBQUN1RSxLQUFLLEtBQUssb0JBQW9CLElBQ3ZDLENBQUMxRSxZQUFZLENBQUNvRCxRQUFRLENBQUMsR0FBRyxDQUFDLElBQzNCbUIsY0FBYyxDQUFDdkUsWUFBWSxDQUFDLEVBQzNCO2NBQ0R3RSxnQkFBZ0IsQ0FBQ3RWLElBQUksQ0FBRThRLFlBQVksQ0FBQyxHQUFHdUUsY0FBYyxDQUFDdkUsWUFBWSxDQUFDO1lBQ3BFO1VBQ0Q7VUFFQSxPQUFPbE0saUJBQWlCLENBQUMySCxjQUFjLENBQ3RDeUksaUJBQWlCLEVBQ2pCTSxnQkFBZ0IsRUFDaEIsSUFBSSxDQUFDalcsZUFBZSxFQUFFLEVBQ3RCLElBQUksQ0FBQ2tELGlCQUFpQixFQUFFLEVBQ3hCdVMsZUFBZSxDQUNmO1FBQ0YsQ0FBQyxDQUFDO1FBRUYsTUFBTVcsZUFBZSxHQUFHLE1BQU1oWCxPQUFPLENBQUM4VCxHQUFHLENBQUM2QyxnQkFBZ0IsQ0FBQztRQUMzRCxJQUFJLENBQUNMLGdCQUFnQixFQUFFO1VBQ3RCLElBQUksQ0FBQ3JGLDJCQUEyQixDQUFDc0YsaUJBQWlCLENBQUM7UUFDcEQ7UUFDQTtRQUNBLE1BQU1VLGNBQWMsR0FBR0QsZUFBZSxDQUFDL1UsTUFBTSxDQUFFekIsVUFBVSxJQUFLLENBQUNBLFVBQVUsQ0FBQzJKLFVBQVUsRUFBRSxDQUFDO1FBQ3ZGLE1BQU1uSyxPQUFPLENBQUM4VCxHQUFHLENBQUNtRCxjQUFjLENBQUN2RSxHQUFHLENBQUMsTUFBT2xTLFVBQVUsSUFBS0EsVUFBVSxDQUFDQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRWpGLE1BQU1KLGtCQUFrQixHQUFHLElBQUksQ0FBQ0MsT0FBTyxFQUFFLENBQUNDLGlCQUFpQixFQUFFOztRQUU3RDtRQUNBO1FBQ0E7UUFDQSxJQUFJZ0osa0JBQWtCLElBQUksQ0FBQzdJLFdBQVcsQ0FBQ0MsbUJBQW1CLENBQUM0VixpQkFBaUIsQ0FBQyxFQUFFO1VBQzlFLElBQUksQ0FBQzNWLGVBQWUsRUFBRSxDQUNwQkMscUJBQXFCLEVBQUUsQ0FDdkJDLHVDQUF1QyxDQUFDeVYsaUJBQWlCLENBQUN4VixPQUFPLEVBQUUsRUFBRVYsa0JBQWtCLENBQVk7UUFDdEc7UUFFQSxJQUFJLElBQUksQ0FBQzJGLElBQUksQ0FBQ29MLGtCQUFrQixDQUFDQyxXQUFXLEVBQUUsSUFBSTRGLGNBQWMsQ0FBQ2xVLE1BQU0sR0FBRyxDQUFDLEVBQUU7VUFDNUUsSUFBSSxDQUFDa0osYUFBYSxDQUFDQyxRQUFRLENBQUNnRixNQUFNLEVBQUUrRixjQUFjLENBQUM7UUFDcEQ7UUFFQSxPQUFPRCxlQUFlO01BQ3ZCLENBQUMsQ0FBQyxPQUFPRSxHQUFZLEVBQUU7UUFDdEJqVyxHQUFHLENBQUNELEtBQUssQ0FBQywwQ0FBMEMsQ0FBQztRQUNyRCxNQUFNa1csR0FBRztNQUNWLENBQUMsU0FBUztRQUNULElBQUksQ0FBQ1osZ0JBQWdCLEVBQUU7VUFDdEIvTCxVQUFVLENBQUM2QixNQUFNLENBQUN4QyxVQUFVLENBQUM7UUFDOUI7TUFDRDtJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQWRDO0lBQUEsT0FpQk1zSixjQUFjLEdBRnBCLDhCQUVxQmlFLFlBQXFFLEVBQWlCO01BQzFHO01BQ0EsT0FBT25YLE9BQU8sQ0FBQ0MsT0FBTyxFQUFFO0lBQ3pCOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FiQztJQUFBLE9BZ0JNK0csWUFBWSxHQUZsQiw0QkFFbUJtUSxZQUFvQyxFQUFpQjtNQUN2RTtNQUNBLE9BQU9uWCxPQUFPLENBQUNDLE9BQU8sRUFBRTtJQUN6Qjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BYkM7SUFBQSxPQWlCTW1YLFlBQVksR0FIbEIsNEJBR21CRCxZQUFvQyxFQUFpQjtNQUN2RTtNQUNBLE9BQU9uWCxPQUFPLENBQUNDLE9BQU8sRUFBRTtJQUN6Qjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BYkM7SUFBQSxPQWdCTW9YLGVBQWUsR0FGckIsK0JBRXNCRixZQUFvQyxFQUFpQjtNQUMxRTtNQUNBLE9BQU9uWCxPQUFPLENBQUNDLE9BQU8sRUFBRTtJQUN6Qjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BYkM7SUFBQSxPQWdCTTBKLGNBQWMsR0FGcEIsOEJBRXFCd04sWUFBdUMsRUFBaUI7TUFDNUU7TUFDQSxPQUFPblgsT0FBTyxDQUFDQyxPQUFPLEVBQUU7SUFDekI7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FaQztJQUFBLE9BZ0JNcVgsV0FBVyxHQUhqQiwyQkFHa0JILFlBQW9DLEVBQWlCO01BQ3RFO01BQ0EsT0FBT25YLE9BQU8sQ0FBQ0MsT0FBTyxFQUFFO0lBQ3pCOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BWkM7SUFBQSxPQWVNMFEsYUFBYSxHQUZuQiw2QkFFb0J3RyxZQUFvQyxFQUFpQjtNQUN4RTtNQUNBLE9BQU9uWCxPQUFPLENBQUNDLE9BQU8sRUFBRTtJQUN6Qjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVpDO0lBQUEsT0FlTW9JLFdBQVcsR0FGakIsMkJBRWtCOE8sWUFBb0MsRUFBaUI7TUFDdEU7TUFDQSxPQUFPblgsT0FBTyxDQUFDQyxPQUFPLEVBQUU7SUFDekI7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FaQztJQUFBLE9BZU1zWCxjQUFjLEdBRnBCLDhCQUVxQkosWUFBb0MsRUFBaUI7TUFDekU7TUFDQSxPQUFPblgsT0FBTyxDQUFDQyxPQUFPLEVBQUU7SUFDekI7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FaQztJQUFBLE9BZU1zTCxhQUFhLEdBRm5CLDZCQUVvQjRMLFlBQXVDLEVBQWlCO01BQzNFO01BQ0EsT0FBT25YLE9BQU8sQ0FBQ0MsT0FBTyxFQUFFO0lBQ3pCOztJQUVBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BUkM7SUFBQSxPQVdNdVgsWUFBWSxHQUZsQiw0QkFFbUJDLFFBQWlCLEVBQUVDLFdBQW1DLEVBQWlCO01BQ3pGQSxXQUFXLEdBQUdBLFdBQVcsSUFBSSxDQUFDLENBQUM7TUFDL0IsTUFBTUMsMEJBQTBCLEdBQUdELFdBQVcsQ0FBQ0MsMEJBQTBCLElBQUl2USxTQUFTO01BQ3RGLE1BQU1qQixpQkFBaUIsR0FBRyxJQUFJLENBQUNQLG9CQUFvQixFQUFFO01BQ3JELE1BQU1nUyxTQUFTLEdBQUdGLFdBQVcsQ0FBQ0csUUFBOEI7TUFFNUQsSUFBSTtRQUNILE1BQU0sSUFBSSxDQUFDbEwsUUFBUSxFQUFFO1FBQ3JCO1FBQ0E7UUFDQSxJQUFJLENBQUM3SSxpQkFBaUIsRUFBRSxDQUFDNEksd0JBQXdCLEVBQUU7UUFDbkQsSUFBSWdMLFdBQVcsQ0FBQ0ksZUFBZSxLQUFLLElBQUksRUFBRTtVQUN6QyxNQUFNLElBQUksQ0FBQ0Msa0JBQWtCLENBQUNOLFFBQVEsQ0FBQztVQUN2QztRQUNEOztRQUNBLE1BQU0sSUFBSSxDQUFDNUYseUJBQXlCLEVBQUU7UUFFdEMsTUFBTW1HLDJCQUEyQixHQUFHLE1BQU0sSUFBSSxDQUFDQyx5QkFBeUIsRUFBRTtRQUUxRSxNQUFNLElBQUksQ0FBQ2pTLElBQUksQ0FBQ2UsUUFBUSxDQUFDcVEsWUFBWSxDQUFDO1VBQUVsUixPQUFPLEVBQUV1UjtRQUFTLENBQUMsQ0FBQztRQUU1RCxNQUFNUyxpQkFBaUIsR0FBRyxJQUFJLENBQUMzVCxtQkFBbUIsQ0FBQ2tULFFBQVEsQ0FBQztRQUM1RCxNQUFNclIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDQyxzQkFBc0IsRUFBRTtRQUN4RCxJQUFJd0IsV0FBMkM7UUFDL0MsSUFDQyxDQUFDcVEsaUJBQWlCLEtBQUtsWixnQkFBZ0IsQ0FBQzZILE1BQU0sSUFBSTRRLFFBQVEsQ0FBQ2hXLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUN6RjJFLGtCQUFrQixDQUFDK1IsWUFBWSxFQUFFLEVBQ2hDO1VBQ0Q7VUFDQXRRLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQ0YsMEJBQTBCLENBQ2xEOFAsUUFBUSxFQUNSclIsa0JBQWtCLENBQUNlLG1CQUFtQixFQUFFLEVBQ3hDK1EsaUJBQWlCLEVBQ2pCLElBQUksQ0FDSjtRQUNGOztRQUVBO1FBQ0E7UUFDQTtRQUNBLElBQUlULFFBQVEsQ0FBQ3JVLFFBQVEsRUFBRSxDQUFDZ1YsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUlWLFdBQVcsQ0FBQ0ksZUFBZSxFQUFFO1VBQ2xGTCxRQUFRLENBQUNyVSxRQUFRLEVBQUUsQ0FBQ3dFLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDekM7UUFDQSxNQUFNeVEscUJBQXFCLEdBQUcsTUFBTWxTLGlCQUFpQixDQUFDcVIsWUFBWSxDQUNqRUMsUUFBUSxFQUNSLElBQUksQ0FBQzdXLGVBQWUsRUFBRSxFQUN0QixJQUFJLENBQUMwWCxpQkFBaUIsRUFBRSxFQUN4QlgsMEJBQTBCLEVBQzFCQyxTQUFTLEVBQ1QsSUFBSSxDQUFDOVQsaUJBQWlCLEVBQUUsRUFDeEIsSUFBSSxDQUFDeVUsZUFBZSxFQUFFLENBQ3RCO1FBQ0QsSUFBSSxDQUFDQyxzQ0FBc0MsQ0FBQ04saUJBQWlCLENBQUM7UUFFOUQsSUFBSSxDQUFDak0sYUFBYSxDQUFDQyxRQUFRLENBQUN1TSxRQUFRLEVBQUVKLHFCQUFxQixDQUFDO1FBQzVELElBQUksQ0FBQ3JTLElBQUksQ0FBQ29MLGtCQUFrQixDQUFDc0gsVUFBVSxFQUFFO1FBRXpDLElBQUksQ0FBQ0Msd0JBQXdCLENBQUNDLGVBQWUsQ0FBQ0MsSUFBSSxFQUFFQyxXQUFXLENBQUNDLGNBQWMsQ0FBQztRQUUvRSxJQUFJLENBQUMzUSxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7UUFDL0IsSUFBSSxDQUFDRixXQUFXLENBQUMvSSxRQUFRLENBQUM2WixPQUFPLEVBQUUsS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQ2xWLGlCQUFpQixFQUFFLENBQUNDLGlCQUFpQixFQUFFO1FBRTVDLElBQUksQ0FBQ2lDLElBQUksQ0FBQ2UsUUFBUSxDQUFDdVEsV0FBVyxDQUFDO1VBQzlCcFIsT0FBTyxFQUFFbVM7UUFDVixDQUFDLENBQUM7O1FBRUY7UUFDQSxJQUFJLENBQUNyUyxJQUFJLENBQUNxRixlQUFlLENBQUM0TixxQkFBcUIsQ0FBQ2pCLDJCQUEyQixDQUFDO1FBRTVFLElBQUlLLHFCQUFxQixLQUFLWixRQUFRLEVBQUU7VUFDdkMsSUFBSTFQLGlCQUFpQixHQUFHc1EscUJBQXFCO1VBQzdDeFEsV0FBVyxHQUFHQSxXQUFXLElBQUksSUFBSSxDQUFDcVIsa0JBQWtCLENBQUN6QixRQUFRLEVBQUVZLHFCQUFxQixDQUFDO1VBRXJGLElBQUlILGlCQUFpQixLQUFLbFosZ0JBQWdCLENBQUMrRixLQUFLLEVBQUU7WUFDakQ7WUFDQTtZQUNBLE1BQU1vVSxvQkFBb0IsR0FBR2pNLGlCQUFpQixDQUFDTyxlQUFlLENBQUNnSyxRQUFRLEVBQUUsSUFBSSxDQUFDO1lBQzlFLE1BQU0yQixlQUFlLEdBQUdsTSxpQkFBaUIsQ0FBQ08sZUFBZSxDQUFDNEsscUJBQXFCLEVBQUUsSUFBSSxDQUFDO1lBQ3RGLElBQUljLG9CQUFvQixJQUFJQyxlQUFlLElBQUlELG9CQUFvQixLQUFLQyxlQUFlLEVBQUU7Y0FDeEZ2UixXQUFXLENBQUN3UixXQUFXLENBQUN6VixJQUFJLENBQUM7Z0JBQUUwVixPQUFPLEVBQUVILG9CQUFvQjtnQkFBRUksT0FBTyxFQUFFSDtjQUFnQixDQUFDLENBQUM7WUFDMUY7VUFDRDtVQUVBLElBQUksQ0FBQ25SLHFCQUFxQixDQUFDSixXQUFXLENBQUN3UixXQUFXLENBQUM7VUFDbkQsSUFBSWpULGtCQUFrQixDQUFDK1IsWUFBWSxFQUFFLEVBQUU7WUFDdEMsSUFBSXRRLFdBQVcsQ0FBQzJSLGFBQWEsQ0FBQ3pZLE9BQU8sRUFBRSxLQUFLc1gscUJBQXFCLENBQUN0WCxPQUFPLEVBQUUsRUFBRTtjQUM1RWdILGlCQUFpQixHQUFHRixXQUFXLENBQUMyUixhQUFhO1lBQzlDO1VBQ0Q7VUFFQSxNQUFNLElBQUksQ0FBQ2xSLGlCQUFpQixDQUFDUCxpQkFBaUIsRUFBRTtZQUFFUSxRQUFRLEVBQUUsS0FBSztZQUFFQyxlQUFlLEVBQUUsS0FBSztZQUFFQyxVQUFVLEVBQUU7VUFBSyxDQUFDLENBQUM7UUFDL0c7TUFDRCxDQUFDLENBQUMsT0FBT2dSLE1BQWUsRUFBRTtRQUN6QixJQUFJLEVBQUVBLE1BQU0sSUFBS0EsTUFBTSxDQUE0QkMsUUFBUSxDQUFDLEVBQUU7VUFDN0R6WSxHQUFHLENBQUNELEtBQUssQ0FBQyxpQ0FBaUMsRUFBRXlZLE1BQU0sQ0FBVztRQUMvRDtRQUNBLE1BQU1BLE1BQU07TUFDYjtJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUxDO0lBQUEsT0FNTUUsaUJBQWlCLEdBQXZCLGlDQUF3QmxDLFFBQWlCLEVBQWlCO01BQ3pELE1BQU1tQyxZQUFZLEdBQUduQyxRQUFRLENBQUN6SyxTQUFTLEVBQUU7TUFDekMsSUFBSXpFLFFBQWlCO01BQ3JCLE1BQU1zUixRQUFRLEdBQUdwQyxRQUFRLElBQUksSUFBSSxDQUFDbFQsbUJBQW1CLENBQUNrVCxRQUFRLENBQUMsS0FBS3pZLGdCQUFnQixDQUFDK0YsS0FBSzs7TUFFMUY7TUFDQSxJQUNDLENBQUM4VSxRQUFRLElBQ1QsRUFDRSxDQUFDRCxZQUFZLENBQUNFLGNBQWMsSUFBSUYsWUFBWSxDQUFDRyxlQUFlLElBQzVESCxZQUFZLENBQUNFLGNBQWMsSUFBSUYsWUFBWSxDQUFDSSxjQUFlLENBQzVELEVBQ0E7UUFDRDtNQUNEO01BRUEsSUFBSSxDQUFDSixZQUFZLENBQUNFLGNBQWMsSUFBSUYsWUFBWSxDQUFDRyxlQUFlLEVBQUU7UUFDakU7UUFDQXhSLFFBQVEsR0FBRyxLQUFLO01BQ2pCLENBQUMsTUFBTTtRQUNOO1FBQ0FBLFFBQVEsR0FBRyxJQUFJO01BQ2hCO01BRUEsSUFBSTtRQUNILE1BQU0wUixtQkFBbUIsR0FBRyxJQUFJLENBQUM1VCxzQkFBc0IsRUFBRTtRQUN6RCxNQUFNNlQsaUJBQWlCLEdBQUdELG1CQUFtQixDQUFDOUIsWUFBWSxFQUFFLEdBQUc4QixtQkFBbUIsQ0FBQzlTLG1CQUFtQixFQUFFLEdBQUdzUSxRQUFRO1FBQ25ILElBQUk1UCxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUNGLDBCQUEwQixDQUFDOFAsUUFBUSxFQUFFeUMsaUJBQWlCLEVBQUVsYixnQkFBZ0IsQ0FBQytGLEtBQUssRUFBRSxLQUFLLENBQUM7UUFDbkgsSUFBSSxDQUFDOEMsV0FBVyxJQUFJNFAsUUFBUSxLQUFLeUMsaUJBQWlCLEVBQUU7VUFDbkQ7VUFDQTtVQUNBclMsV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDRiwwQkFBMEIsQ0FBQzhQLFFBQVEsRUFBRUEsUUFBUSxFQUFFelksZ0JBQWdCLENBQUMrRixLQUFLLEVBQUUsS0FBSyxDQUFDO1FBQ3ZHO1FBQ0EsSUFBSThDLFdBQVcsRUFBRTtVQUNoQixJQUFJLENBQUNLLFdBQVcsQ0FBQ0ssUUFBUSxHQUFHcEosUUFBUSxDQUFDZ0osUUFBUSxHQUFHaEosUUFBUSxDQUFDNlosT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7O1VBRTFFLElBQUlpQixtQkFBbUIsQ0FBQzlCLFlBQVksRUFBRSxFQUFFO1lBQ3ZDLE1BQU1nQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM5TSxtQkFBbUIsRUFBRTtZQUN0RCxJQUFJLENBQUE4TSxtQkFBbUIsYUFBbkJBLG1CQUFtQix1QkFBbkJBLG1CQUFtQixDQUFFQyxhQUFhLE1BQUszQyxRQUFRLENBQUMxVyxPQUFPLEVBQUUsRUFBRTtjQUM5RCxNQUFNc1osVUFBVSxHQUFHeFMsV0FBVyxDQUFDd1IsV0FBVyxDQUFDeFIsV0FBVyxDQUFDd1IsV0FBVyxDQUFDdFcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDd1csT0FBTztjQUN0RjFSLFdBQVcsQ0FBQ3dSLFdBQVcsQ0FBQ3pWLElBQUksQ0FBQztnQkFBRTBWLE9BQU8sRUFBRWEsbUJBQW1CLENBQUM1TSxZQUFZO2dCQUFFZ00sT0FBTyxFQUFFYztjQUFXLENBQUMsQ0FBQztZQUNqRztVQUNEO1VBQ0EsSUFBSSxDQUFDcFMscUJBQXFCLENBQUNKLFdBQVcsQ0FBQ3dSLFdBQVcsQ0FBQztVQUVuRCxNQUFNLElBQUksQ0FBQy9RLGlCQUFpQixDQUFDVCxXQUFXLENBQUMyUixhQUFhLEVBQUU7WUFBRWpSLFFBQVE7WUFBRUMsZUFBZSxFQUFFLElBQUk7WUFBRUMsVUFBVSxFQUFFO1VBQUssQ0FBQyxDQUFDO1FBQy9HLENBQUMsTUFBTTtVQUNOLE1BQU0sSUFBSW5GLEtBQUssQ0FBQywyREFBMkQsQ0FBQztRQUM3RTtNQUNELENBQUMsQ0FBQyxPQUFPbVcsTUFBTSxFQUFFO1FBQ2hCLE1BQU0sSUFBSW5XLEtBQUssQ0FBRSx1Q0FBc0NtVyxNQUFPLEVBQUMsQ0FBQztNQUNqRTtJQUNEOztJQUVBO0lBQ0E7SUFDQTs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BYkM7SUFBQSxPQWdCTWEsY0FBYyxHQUZwQiw4QkFHQzdDLFFBQWlCLEVBQ2pCQyxXQU1DLEVBQzhCO01BQy9CLE1BQU12UixpQkFBaUIsR0FBRyxJQUFJLENBQUNQLG9CQUFvQixFQUFFO01BRXJELElBQUlpQyxXQUEyQztNQUMvQyxJQUFJMFMsYUFBYSxHQUFHLEtBQUs7TUFDekIsTUFBTUMsZ0JBQWtDLEdBQUc7UUFDMUNDLGtCQUFrQixFQUFFL0MsV0FBVyxDQUFDK0Msa0JBQWtCLEtBQUssSUFBSTtRQUMzREMsWUFBWSxFQUFHaEQsV0FBVyxDQUFDOUwsT0FBTyxJQUFJOEwsV0FBVyxDQUFDZ0QsWUFBYztRQUNoRUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDM1UsSUFBSSxDQUFDZSxRQUFRLENBQUNzUTtNQUMxQyxDQUFDO01BRUQsSUFBSTtRQUNILE1BQU0sSUFBSSxDQUFDMUssUUFBUSxFQUFFO1FBQ3JCLE1BQU11TCxpQkFBaUIsR0FBRyxJQUFJLENBQUMzVCxtQkFBbUIsQ0FBQ2tULFFBQVEsQ0FBQztRQUM1RCxJQUFJLENBQUNTLGlCQUFpQixLQUFLbFosZ0JBQWdCLENBQUM2SCxNQUFNLElBQUk0USxRQUFRLENBQUNoVyxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxJQUFJLENBQUN5RixhQUFhLEVBQUUsRUFBRTtVQUN2SCxNQUFNK1MsbUJBQW1CLEdBQUcsSUFBSSxDQUFDNVQsc0JBQXNCLEVBQUU7O1VBRXpEO1VBQ0F3QixXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUNGLDBCQUEwQixDQUNsRDhQLFFBQVEsRUFDUHdDLG1CQUFtQixDQUFtQjlTLG1CQUFtQixFQUFFLEVBQzVEK1EsaUJBQWlCLEVBQ2pCLElBQUksQ0FDSjtRQUNGO1FBRUEsTUFBTTBDLFlBQVksR0FBRyxNQUFNelUsaUJBQWlCLENBQUNtVSxjQUFjLENBQzFEN0MsUUFBUSxFQUNSK0MsZ0JBQWdCLEVBQ2hCLElBQUksQ0FBQzVaLGVBQWUsRUFBRSxFQUN0QixJQUFJLENBQUMwWCxpQkFBaUIsRUFBRSxFQUN4QixJQUFJLENBQUN4VSxpQkFBaUIsRUFBRSxFQUN4QixJQUFJLENBQUN5VSxlQUFlLEVBQUUsRUFDdEIsSUFBSSxDQUFDc0Msa0JBQWtCLEVBQUUsQ0FDekI7UUFDRCxJQUFJLENBQUN4VSxzQkFBc0IsRUFBRSxDQUMzQnlVLGlCQUFpQixFQUFFLENBQ25CelksT0FBTyxDQUFFcUUsSUFBSSxJQUFLO1VBQ2xCLE1BQU1SLE9BQU8sR0FBR1EsSUFBSSxDQUFDbkcsaUJBQWlCLEVBQW9CO1VBQzFELElBQUkyRixPQUFPLElBQUlBLE9BQU8sQ0FBQzZVLFdBQVcsRUFBRSxFQUFFO1lBQ3JDN1UsT0FBTyxDQUFDOFUsWUFBWSxDQUFDLEtBQUssQ0FBQztVQUM1QjtRQUNELENBQUMsQ0FBQztRQUNILElBQUksQ0FBQ3hDLHNDQUFzQyxDQUFDTixpQkFBaUIsQ0FBQztRQUU5RCxJQUFJLENBQUNoUSxXQUFXLENBQUMvSSxRQUFRLENBQUM2WixPQUFPLEVBQUUsS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQzVRLG1CQUFtQixDQUFDLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUN3RSxjQUFjLENBQUMxTixXQUFXLENBQUN5TyxLQUFLLENBQUM7UUFFdEMsTUFBTSxJQUFJLENBQUMzSCxJQUFJLENBQUNlLFFBQVEsQ0FBQ3dRLGNBQWMsQ0FBQztVQUN2Q3JSLE9BQU8sRUFBRSxPQUFPMFUsWUFBWSxLQUFLLFNBQVMsSUFBSUEsWUFBWSxLQUFLLElBQUksR0FBR3hULFNBQVMsR0FBR3dUO1FBQ25GLENBQUMsQ0FBQztRQUNGO1FBQ0E7UUFDQTFQLFNBQVMsQ0FBQ0MsaUJBQWlCLEVBQUU7UUFDN0IsSUFBSSxDQUFDeVAsWUFBWSxFQUFFO1VBQ2xCLElBQUksQ0FBQzNPLGFBQWEsQ0FBQ0MsUUFBUSxDQUFDK08sT0FBTyxFQUFFeEQsUUFBUSxDQUFDO1VBQzlDLElBQUksQ0FBQ3pSLElBQUksQ0FBQ29MLGtCQUFrQixDQUFDc0gsVUFBVSxFQUFFO1VBQ3pDO1VBQ0EsSUFBSSxDQUFDaEIsV0FBVyxDQUFDd0Qsa0JBQWtCLEVBQUU7WUFDcEMsTUFBTSxJQUFJLENBQUM3RyxrQkFBa0IsRUFBRSxDQUFDOEcsdUJBQXVCLENBQUMxRCxRQUFRLENBQUM7WUFDakU4QyxhQUFhLEdBQUcsSUFBSTtVQUNyQjtRQUNELENBQUMsTUFBTTtVQUNOLE1BQU1hLHNCQUFzQixHQUFHUixZQUFZO1VBQzNDLElBQUksQ0FBQzNPLGFBQWEsQ0FBQ0MsUUFBUSxDQUFDK08sT0FBTyxFQUFFRyxzQkFBc0IsQ0FBQztVQUM1RCxJQUFJLENBQUNwVixJQUFJLENBQUNvTCxrQkFBa0IsQ0FBQ3NILFVBQVUsRUFBRTtVQUN6QyxJQUFJM1EsaUJBQWlCLEdBQUdxVCxzQkFBc0I7VUFDOUN2VCxXQUFXLEdBQUdBLFdBQVcsSUFBSSxJQUFJLENBQUNxUixrQkFBa0IsQ0FBQ3pCLFFBQVEsRUFBRTJELHNCQUFzQixDQUFDO1VBQ3RGLElBQUksQ0FBQ25ULHFCQUFxQixDQUFDSixXQUFXLENBQUN3UixXQUFXLENBQUM7VUFDbkQsSUFBSSxJQUFJLENBQUNuUyxhQUFhLEVBQUUsRUFBRTtZQUN6QixJQUFJVyxXQUFXLENBQUMyUixhQUFhLENBQUN6WSxPQUFPLEVBQUUsS0FBS3FhLHNCQUFzQixDQUFDcmEsT0FBTyxFQUFFLEVBQUU7Y0FDN0VnSCxpQkFBaUIsR0FBR0YsV0FBVyxDQUFDMlIsYUFBYTtZQUM5QztVQUNEO1VBRUEsSUFBSXRCLGlCQUFpQixLQUFLbFosZ0JBQWdCLENBQUMrRixLQUFLLEVBQUU7WUFDakQ7WUFDQTtZQUNBLE1BQU0sSUFBSSxDQUFDc1csdUJBQXVCLENBQUNELHNCQUFzQixDQUFDO1lBQzFEO1lBQ0E7WUFDQTtZQUNBLElBQUksQ0FBQzFELFdBQVcsQ0FBQzRELGlCQUFpQixFQUFFO2NBQ25DLE1BQU0sSUFBSSxDQUFDaFQsaUJBQWlCLENBQUNQLGlCQUFpQixFQUFFO2dCQUFFUSxRQUFRLEVBQUUsS0FBSztnQkFBRUMsZUFBZSxFQUFFLElBQUk7Z0JBQUVDLFVBQVUsRUFBRTtjQUFLLENBQUMsQ0FBQztZQUM5RyxDQUFDLE1BQU07Y0FDTixPQUFPMlMsc0JBQXNCO1lBQzlCO1VBQ0QsQ0FBQyxNQUFNO1lBQ047WUFDQTtZQUNBO1lBQ0EsTUFBTSxJQUFJLENBQUM5UyxpQkFBaUIsQ0FBQ1AsaUJBQWlCLEVBQUU7Y0FBRVEsUUFBUSxFQUFFLEtBQUs7Y0FBRUMsZUFBZSxFQUFFLElBQUk7Y0FBRUMsVUFBVSxFQUFFO1lBQUssQ0FBQyxDQUFDO1VBQzlHO1FBQ0Q7UUFDQSxJQUFJeVAsaUJBQWlCLEtBQUtsWixnQkFBZ0IsQ0FBQytGLEtBQUssRUFBRTtVQUNqRDtVQUNBLElBQUksQ0FBQ3dXLDBCQUEwQixDQUFDaEIsYUFBYSxDQUFDO1FBQy9DO01BQ0QsQ0FBQyxDQUFDLE9BQU9kLE1BQWUsRUFBRTtRQUN6QnhZLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDLHFDQUFxQyxFQUFFeVksTUFBTSxDQUFXO01BQ25FO0lBQ0Q7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQSxPQUpDO0lBQUEsT0FLQThCLDBCQUEwQixHQUExQixvQ0FBMkJoQixhQUF1QixFQUFRO01BQ3pELE1BQU1pQixhQUFhLEdBQUcsSUFBSSxDQUFDbEQsaUJBQWlCLEVBQUU7TUFDOUMsTUFBTXBXLE9BQU8sR0FBR3NaLGFBQWEsQ0FBQ3pHLE9BQU8sQ0FBQywwQ0FBMEMsQ0FBQztNQUNqRixJQUFJd0YsYUFBYSxJQUFJLElBQUksRUFBRTtRQUMxQixNQUFNakosWUFBWSxHQUFHLElBQUksQ0FBQzFRLGVBQWUsRUFBRTtRQUMzQzBRLFlBQVksQ0FBQ21LLGlCQUFpQixFQUFFLENBQUNDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQ0Msd0JBQXdCLEVBQUUsSUFBSSxDQUFDO01BQ2xHLENBQUMsTUFBTTtRQUNOQyxZQUFZLENBQUNDLElBQUksQ0FBQzNaLE9BQU8sQ0FBQztNQUMzQjtJQUNEOztJQUVBO0FBQ0Q7QUFDQSxPQUZDO0lBQUEsT0FHQXlaLHdCQUF3QixHQUF4QixvQ0FBaUM7TUFDaEMsTUFBTUgsYUFBYSxHQUFHLElBQUksQ0FBQ2xELGlCQUFpQixFQUFFO01BQzlDLE1BQU1wVyxPQUFPLEdBQUdzWixhQUFhLENBQUN6RyxPQUFPLENBQUMsMENBQTBDLENBQUM7TUFDakYsTUFBTXpELFlBQVksR0FBRyxJQUFJLENBQUMxUSxlQUFlLEVBQUU7TUFDM0NnYixZQUFZLENBQUNDLElBQUksQ0FBQzNaLE9BQU8sQ0FBQztNQUMxQm9QLFlBQVksQ0FBQ21LLGlCQUFpQixFQUFFLENBQUNLLHVCQUF1QixDQUFDLElBQUksQ0FBQ0gsd0JBQXdCLEVBQUUsSUFBSSxDQUFDO0lBQzlGOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUxDO0lBQUEsT0FNUXhLLFdBQVcsR0FBbkIscUJBQW9CakwsT0FBZ0IsRUFBVztNQUM5QyxNQUFNOUIsU0FBUyxHQUFHOEIsT0FBTyxDQUFDOUMsUUFBUSxFQUFFLENBQUNpQixZQUFZLEVBQUU7TUFDbkQsTUFBTXVNLFdBQVcsR0FBR3hNLFNBQVMsQ0FBQ08sY0FBYyxDQUFDdUIsT0FBTyxDQUFDbkYsT0FBTyxFQUFFLENBQUM7TUFDL0QsT0FBTzhILFdBQVcsQ0FBQ3NJLFdBQVcsQ0FBQ3pNLDJCQUEyQixDQUFDa00sV0FBVyxDQUFDLENBQUMvTCxlQUFlLENBQUM7SUFDekY7O0lBRUE7SUFDQTs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FYQztJQUFBLE9BY01rWCxjQUFjLEdBRnBCLDhCQUVxQnRFLFFBQWlCLEVBQUV6SixhQUE2RSxFQUFpQjtNQUNySSxNQUFNZ08sYUFBYSxHQUFHLElBQUksQ0FBQ3BiLGVBQWUsRUFBRTtNQUM1QyxNQUFNOFcsV0FXTCxHQUFHO1FBQUUsR0FBRzFKLGFBQWE7UUFBRTFELG1CQUFtQixFQUFFLEtBQUs7UUFBRVosb0JBQW9CLEVBQUUsSUFBSSxDQUFDMUQsSUFBSSxDQUFDZSxRQUFRLENBQUM0QztNQUFlLENBQUM7TUFFN0csSUFBSTtRQUNILElBQ0MsSUFBSSxDQUFDekMsYUFBYSxFQUFFLElBQ3BCLElBQUksQ0FBQ2lLLFdBQVcsQ0FBQ3NHLFFBQVEsQ0FBQyxJQUMxQkEsUUFBUSxDQUFDd0UsUUFBUSxFQUFFLEtBQUs3VSxTQUFTLElBQ2pDcVEsUUFBUSxDQUFDaFcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxJQUMvQ2dXLFFBQVEsQ0FBQ2hXLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksRUFDOUM7VUFDRDtVQUNBO1VBQ0E7VUFDQWlXLFdBQVcsQ0FBQ2hPLG9CQUFvQixHQUFHLE1BQU9qRSxVQUFxQyxJQUFvQjtZQUNsRyxNQUFNLElBQUksQ0FBQ08sSUFBSSxDQUFDZSxRQUFRLENBQUM0QyxjQUFjLENBQUNsRSxVQUFVLENBQUM7WUFFbkQsSUFBSTtjQUNILE1BQU1hLEtBQUssR0FBR21SLFFBQVEsQ0FBQ3JVLFFBQVEsRUFBRTtjQUNqQyxNQUFNOFksY0FBYyxHQUFHNVYsS0FBSyxDQUFDNlYsV0FBVyxDQUFFLEdBQUUxRSxRQUFRLENBQUMxVyxPQUFPLEVBQUcsZ0JBQWUsQ0FBQyxDQUFDcWIsZUFBZSxFQUFFO2NBQ2pHLE1BQU1DLFNBQVMsR0FBRyxNQUFNSCxjQUFjLENBQUNJLG9CQUFvQixFQUFFO2NBQzdELE1BQU1DLG9CQUFvQixHQUFHalcsS0FBSyxDQUFDcUMsbUJBQW1CLENBQUMwVCxTQUFTLENBQUM7Y0FDakVFLG9CQUFvQixDQUFDQyxXQUFXLENBQUMvRSxRQUFRLENBQUM7WUFDM0MsQ0FBQyxDQUFDLE9BQU96VyxLQUFjLEVBQUU7Y0FDeEJDLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDLHlEQUF5RCxFQUFFQSxLQUFLLENBQVc7WUFDdEY7VUFDRCxDQUFDO1FBQ0Y7UUFFQSxJQUFJLElBQUksQ0FBQ3VELG1CQUFtQixDQUFDa1QsUUFBUSxDQUFDLEtBQUt6WSxnQkFBZ0IsQ0FBQzZILE1BQU0sRUFBRTtVQUNuRSxJQUFJLENBQUN1QixtQkFBbUIsQ0FBQyxJQUFJLENBQUM7UUFDL0I7UUFFQSxNQUFNLElBQUksQ0FBQ3NDLHlCQUF5QixDQUFDK00sUUFBUSxFQUFFQyxXQUFXLENBQUM7O1FBRTNEO1FBQ0E7UUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDeFEsYUFBYSxFQUFFLEVBQUU7VUFDMUJnRSxTQUFTLENBQUNDLGlCQUFpQixFQUFFO1FBQzlCLENBQUMsTUFBTTtVQUNOLE1BQU1zUixjQUFjLEdBQUdoRixRQUFRLENBQUNyTixVQUFVLEVBQUU7VUFDNUMsTUFBTXNTLGlCQUFpQixHQUFHRCxjQUFjLENBQUN2UyxHQUFHLENBQW1CLHdDQUF3QyxDQUFDLEdBQ3JHdVMsY0FBYyxHQUNkclYsU0FBUztVQUVaLElBQUksQ0FBQzZCLDBCQUEwQixDQUFDeVQsaUJBQWlCLEVBQUVBLGlCQUFpQixhQUFqQkEsaUJBQWlCLHVCQUFqQkEsaUJBQWlCLENBQUUzTixVQUFVLEVBQUUsQ0FBQztRQUNwRjtRQUVBLElBQUksQ0FBQzlDLGFBQWEsQ0FBQ0MsUUFBUSxDQUFDQyxNQUFNLEVBQUVzTCxRQUFRLENBQUM7O1FBRTdDO1FBQ0F1RSxhQUFhLGFBQWJBLGFBQWEsdUJBQWJBLGFBQWEsQ0FBRVcsZ0JBQWdCLEVBQUUsQ0FBQ0MsaUJBQWlCLEVBQUU7UUFDckQsTUFBTXhSLHVCQUF1QixHQUFHLElBQUksQ0FBQ3BGLElBQUksQ0FBQ3FGLGVBQWUsQ0FBQ0QsdUJBQXVCLEVBQUU7UUFDbkY7UUFDQSxJQUFJQSx1QkFBdUIsRUFBRTtVQUM1QixJQUFJLENBQUNwRixJQUFJLENBQUNxRixlQUFlLENBQUNDLCtCQUErQixDQUFDLENBQUNtTSxRQUFRLENBQUMsQ0FBQztRQUN0RTtRQUNBO1FBQ0EsTUFBTSxJQUFJLENBQUN6UixJQUFJLENBQUNlLFFBQVEsQ0FBQ3dFLGFBQWEsQ0FBQztVQUFFQyxRQUFRLEVBQUUsQ0FBQ2lNLFFBQVE7UUFBRSxDQUFDLENBQUM7UUFFaEUsSUFBSSxDQUFDLElBQUksQ0FBQ3ZRLGFBQWEsRUFBRSxFQUFFO1VBQzFCLElBQUksQ0FBQThVLGFBQWEsYUFBYkEsYUFBYSx1QkFBYkEsYUFBYSxDQUFFNUksY0FBYyxFQUFFLE1BQUtoVSxXQUFXLENBQUN5ZCxRQUFRLEVBQUU7WUFDN0Q7WUFDQTtZQUNBYixhQUFhLENBQUN4TixjQUFjLEVBQUUsQ0FBQ3NPLFdBQVcsRUFBRTtVQUM3QyxDQUFDLE1BQU07WUFDTjtZQUNBLElBQUksQ0FBQ3pJLGtCQUFrQixFQUFFLENBQUM4Ryx1QkFBdUIsQ0FBQzFELFFBQVEsQ0FBQztVQUM1RDtRQUNEO1FBRUEsSUFBSSxDQUFDM1QsaUJBQWlCLEVBQUUsQ0FBQzhKLFlBQVksRUFBRTtNQUN4QyxDQUFDLENBQUMsT0FBTzVNLEtBQWMsRUFBRTtRQUN4QkMsR0FBRyxDQUFDRCxLQUFLLENBQUMsbUNBQW1DLEVBQUVBLEtBQUssQ0FBVztNQUNoRTtJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FQQztJQUFBLE9BVU0rYixhQUFhLEdBRm5CLDZCQUVvQnRGLFFBQWlCLEVBQWlCO01BQ3JELE1BQU11RixXQUFXLEdBQUcsSUFBSSxDQUFDblQsZ0JBQWdCLEVBQUU7TUFFM0MsSUFBSTtRQUNILE1BQU0sSUFBSSxDQUFDOEMsUUFBUSxFQUFFO1FBQ3JCLElBQUk4SyxRQUFRLENBQUNyVSxRQUFRLEVBQUUsQ0FBQ2dWLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFFO1VBQ25EN04sVUFBVSxDQUFDQyxJQUFJLENBQUN3UyxXQUFXLENBQUM7VUFDNUIsTUFBTSxJQUFJLENBQUNqRixrQkFBa0IsQ0FBQ04sUUFBUSxDQUFDO1VBQ3ZDO1FBQ0Q7O1FBQ0EsSUFBSSxJQUFJLENBQUN6UixJQUFJLENBQUNxRixlQUFlLENBQUM0UiwyQkFBMkIsRUFBRSxFQUFFO1VBQzVELE1BQU1DLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQ0MsZ0NBQWdDLENBQUMsS0FBSyxDQUFDO1VBQ3JFLElBQUlELFVBQVUsS0FBS0UsNEJBQTRCLENBQUNDLFFBQVEsRUFBRTtZQUN6RDtVQUNEO1FBQ0Q7UUFDQSxNQUFNLElBQUksQ0FBQ3hMLHlCQUF5QixFQUFFO1FBQ3RDLE1BQU0sSUFBSSxDQUFDL04saUJBQWlCLEVBQUUsQ0FBQ0MsaUJBQWlCLEVBQUU7UUFDbEQsTUFBTSxJQUFJLENBQUNzUSxrQkFBa0IsRUFBRSxDQUFDOEcsdUJBQXVCLENBQUMxRCxRQUFRLENBQUM7TUFDbEUsQ0FBQyxTQUFTO1FBQ1QsSUFBSWxOLFVBQVUsQ0FBQ3NKLFFBQVEsQ0FBQ21KLFdBQVcsQ0FBQyxFQUFFO1VBQ3JDelMsVUFBVSxDQUFDNkIsTUFBTSxDQUFDNFEsV0FBVyxDQUFDO1FBQy9CO01BQ0Q7SUFDRDs7SUFFQTtJQUNBO0lBQ0E7SUFDQTs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0ExQkM7SUFBQSxPQTZCTU0sWUFBWSxHQUZsQiw0QkFHQ0MsV0FBbUIsRUFDbkJ2UCxhQWlCQyxFQUNEd1AsWUFBaUIsRUFDRTtNQUFBO01BQ25CLE1BQU1yWCxpQkFBaUIsR0FBRyxJQUFJLENBQUNQLG9CQUFvQixFQUFFO01BQ3JELElBQUk2WCxNQUFNO01BQ1YsSUFBSUMsbUJBQW1CO01BQ3ZCLElBQUlDLHVCQUtRO01BQ1osTUFBTUMsS0FBSyxHQUFHLElBQUksQ0FBQzVYLElBQUksQ0FBQzFGLE9BQU8sRUFBRTs7TUFFakM7TUFDQTtNQUNBO01BQ0EsSUFDRSxrQkFBQzBOLGFBQWEsMkNBQWQsZUFBNEI5RCxHQUFHLHVCQUFLOEQsYUFBYSw0Q0FBZCxnQkFBNEI5RCxHQUFHLENBQVUsK0JBQStCLENBQUMsSUFDN0cyVCxLQUFLLENBQUNDLE9BQU8sQ0FBQzlQLGFBQWEsQ0FBQyxJQUM1QndQLFlBQVksS0FBS3BXLFNBQVMsRUFDekI7UUFDRCxNQUFNb0UsUUFBdUQsR0FBR3dDLGFBQThEO1FBQzlIQSxhQUFhLEdBQUd3UCxZQUFZLElBQUksQ0FBQyxDQUFDO1FBQ2xDLElBQUloUyxRQUFRLEVBQUU7VUFDYndDLGFBQWEsQ0FBQ3hDLFFBQVEsR0FBR0EsUUFBUTtRQUNsQyxDQUFDLE1BQU07VUFDTndDLGFBQWEsQ0FBQzFILEtBQUssR0FBRyxJQUFJLENBQUNOLElBQUksQ0FBQzFGLE9BQU8sRUFBRSxDQUFDOEMsUUFBUSxFQUFFO1FBQ3JEO01BQ0Q7TUFFQSxNQUFNc1UsV0EwQkwsR0FBRztRQUFFLEdBQUcxSixhQUFhO1FBQUVsRSxhQUFhLEVBQUUsSUFBSSxDQUFDOUQsSUFBSSxDQUFDMUYsT0FBTztNQUFHLENBQUMsSUFBSTtRQUFFd0osYUFBYSxFQUFFLElBQUksQ0FBQzlELElBQUksQ0FBQzFGLE9BQU87TUFBRyxDQUFDO01BRXRHb1gsV0FBVyxDQUFDcUcsV0FBVyxHQUFHckcsV0FBVyxDQUFDc0csa0JBQWtCLElBQUl0RyxXQUFXLENBQUNxRyxXQUFXOztNQUVuRjtNQUNBLE1BQU1FLGlCQUFpQixHQUFHQyxZQUFZLDBCQUFDLElBQUksQ0FBQzVkLE9BQU8sRUFBRSxDQUFDOEMsUUFBUSxFQUFFLDBEQUF6QixzQkFBMkJpQixZQUFZLEVBQUUsQ0FBbUI7TUFDbkc7TUFDQTtNQUNBO01BQ0EsSUFBSWtaLFdBQVcsQ0FBQzlILFFBQVEsQ0FBQyxFQUFFLEdBQUd3SSxpQkFBaUIsQ0FBQ0UsZUFBZSxDQUFDMUwsSUFBSSxDQUFDLEVBQUU7UUFDdEU7UUFDQTtRQUNBaUYsV0FBVyxDQUFDMEcsT0FBTyxHQUFHLEtBQUs7TUFDNUIsQ0FBQyxNQUFNO1FBQ047UUFDQTFHLFdBQVcsQ0FBQzBHLE9BQU8sR0FBRyxJQUFJO01BQzNCO01BRUEsSUFBSSxDQUFDMUcsV0FBVyxDQUFDM0ssYUFBYSxJQUFJMkssV0FBVyxDQUFDbE0sUUFBUSxJQUFJa00sV0FBVyxDQUFDcFIsS0FBSyxFQUFFO1FBQzVFb1IsV0FBVyxDQUFDM0ssYUFBYSxHQUFHMkssV0FBVyxDQUFDcFIsS0FBSyxDQUMzQ2pDLFlBQVksRUFBRSxDQUNkTSxjQUFjLENBQUUrUyxXQUFXLENBQUNsTSxRQUFRLENBQWF6SyxPQUFPLEVBQUUsQ0FBQyxDQUMzRGlNLFNBQVMsQ0FBQyxhQUFhLENBQUM7TUFDM0I7TUFDQSxJQUFJcVIsUUFBNkI7TUFDakMsSUFBSTNHLFdBQVcsQ0FBQzFOLFNBQVMsRUFBRTtRQUMxQnFVLFFBQVEsR0FBRyxJQUFJLENBQUMvZCxPQUFPLEVBQUUsQ0FBQ3lKLElBQUksQ0FBQzJOLFdBQVcsQ0FBQzFOLFNBQVMsQ0FBWTtRQUNoRSxJQUFJcVUsUUFBUSxFQUFFO1VBQ2I7VUFDQTNHLFdBQVcsQ0FBQzRHLG9CQUFvQixHQUFHRCxRQUFRLENBQUM5ZCxpQkFBaUIsQ0FBQyxVQUFVLENBQWdDO1FBQ3pHO01BQ0QsQ0FBQyxNQUFNO1FBQ05tWCxXQUFXLENBQUM0RyxvQkFBb0IsR0FBR1YsS0FBSyxDQUFDcmQsaUJBQWlCLENBQUMsVUFBVSxDQUFnQztNQUN0Rzs7TUFFQTtNQUNBbVgsV0FBVyxDQUFDNkcsVUFBVSw0QkFBRzdHLFdBQVcsQ0FBQzRHLG9CQUFvQiwwREFBaEMsc0JBQWtDN2MsV0FBVyxDQUFDLFlBQVksQ0FBQztNQUVwRixJQUFJOGIsV0FBVyxJQUFJQSxXQUFXLENBQUM5SCxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDN0M7UUFDQTtRQUNBO1FBQ0E7UUFDQWdJLE1BQU0sR0FBR0YsV0FBVyxDQUFDaUIsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUMvQmpCLFdBQVcsR0FBR0UsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN2QkMsbUJBQW1CLEdBQUdELE1BQU0sQ0FBQ0EsTUFBTSxDQUFDMWEsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDMGIsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7TUFDcEU7TUFFQSxJQUFJL0csV0FBVyxDQUFDZ0gsYUFBYSxJQUFJTCxRQUFRLEVBQUU7UUFDMUMsSUFBSUEsUUFBUSxDQUFDblUsR0FBRyxJQUFJbVUsUUFBUSxDQUFDblUsR0FBRyxDQUFRLGtCQUFrQixDQUFDLElBQUltVSxRQUFRLENBQUNNLFlBQVksRUFBRSxFQUFFO1VBQUE7VUFDdkZqSCxXQUFXLENBQUNsTSxRQUFRLEdBQUcsMkJBQ3RCLElBQUksQ0FBQ2xMLE9BQU8sRUFBRSxDQUFDOEMsUUFBUSxFQUFFLDJEQUF6Qix1QkFBMkJnTCxRQUFRLENBQUNpUSxRQUFRLENBQUNoVSxhQUFhLEVBQUUsQ0FBQ1UsZ0JBQWdCLEVBQUUsQ0FBRWhLLE9BQU8sRUFBRSxDQUFDLEVBQzFGZ0ssZ0JBQWdCLEVBQUU7UUFDckIsQ0FBQyxNQUFNO1VBQ04sTUFBTTZULFlBQVksR0FBR1AsUUFBUSxDQUFDOWMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM0TixJQUFJO1lBQ3pEMFAsWUFBWSxHQUFHLElBQUksQ0FBQzdZLElBQUksQ0FBQzFGLE9BQU8sRUFBRSxDQUFDOEMsUUFBUSxFQUFFLENBQUNnTCxRQUFRLENBQUN3USxZQUFZLENBQUM7VUFDckVsSCxXQUFXLENBQUNsTSxRQUFRLEdBQUdxVCxZQUFZLENBQUM5VCxnQkFBZ0IsRUFBRTtRQUN2RDtRQUVBLElBQUkyUyxtQkFBbUIsSUFBSVcsUUFBUSxDQUFDOWQsaUJBQWlCLEVBQUUsSUFBSThkLFFBQVEsQ0FBQ25VLEdBQUcsSUFBSW1VLFFBQVEsQ0FBQ25VLEdBQUcsQ0FBUSxrQkFBa0IsQ0FBQyxFQUFFO1VBQ25Id04sV0FBVyxDQUFDbE0sUUFBUSxHQUFHLElBQUksQ0FBQ3NULHlDQUF5QyxDQUNwRVQsUUFBUSxDQUFDOWQsaUJBQWlCLEVBQUUsRUFDNUI4ZCxRQUFRLENBQUNoVSxhQUFhLEVBQUUsRUFDeEJxVCxtQkFBbUIsQ0FDbkI7UUFDRjtRQUVBLElBQUloRyxXQUFXLENBQUNxSCxnQkFBZ0IsRUFBRTtVQUNqQ3BCLHVCQUF1QixHQUFHLElBQUksQ0FBQ3FCLG1CQUFtQixDQUFDekIsV0FBVyxFQUFFYyxRQUFRLENBQUNZLEtBQUssRUFBRSxDQUFDO1FBQ2xGO01BQ0Q7TUFDQXZILFdBQVcsQ0FBQ3dILGdCQUFnQixHQUFHLElBQUksQ0FBQ0MsZ0JBQWdCLENBQUN2QixLQUFLLEVBQUVsRyxXQUFXLENBQUM7TUFDeEU7TUFDQUEsV0FBVyxDQUFDMEgsV0FBVyxHQUFHeEIsS0FBSyxDQUFDcFgsV0FBVyxFQUFFLENBQUM2WSxhQUFhLEtBQUssWUFBWTtNQUU1RSxJQUFJO1FBQ0gsTUFBTSxJQUFJLENBQUMxUyxRQUFRLEVBQUU7UUFDckIsSUFBSTJTLFNBQVMsR0FBRyxNQUFNblosaUJBQWlCLENBQUNvWixVQUFVLENBQ2pEaEMsV0FBVyxFQUNYN0YsV0FBVyxFQUNYLElBQUksQ0FBQ3BYLE9BQU8sRUFBRSxFQUNkLElBQUksQ0FBQ00sZUFBZSxFQUFFLEVBQ3RCLElBQUksQ0FBQ2tELGlCQUFpQixFQUFFLENBQ3hCO1FBQ0QsSUFBSTBiLGFBQWtDO1FBQ3RDLElBQUk5SCxXQUFXLENBQUNsTSxRQUFRLElBQUlxUyxLQUFLLENBQUNDLE9BQU8sQ0FBQ3BHLFdBQVcsQ0FBQ2xNLFFBQVEsQ0FBQyxJQUFJa00sV0FBVyxDQUFDMEcsT0FBTyxLQUFLLElBQUksRUFBRTtVQUNoR29CLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQ0Msc0JBQXNCLENBQ2hELElBQUksQ0FBQ0MsNEJBQTRCLENBQUNuQyxXQUFXLEVBQUUrQixTQUFTLENBQUMsRUFDekQ1SCxXQUFXLENBQUNsTSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQ3ZCO1FBQ0Y7UUFDQSxJQUFJLElBQUksQ0FBQ3hGLElBQUksQ0FBQ29MLGtCQUFrQixDQUFDQyxXQUFXLEVBQUUsRUFBRTtVQUMvQyxJQUFJc08seUJBQW1DLEdBQUcsRUFBRTtVQUM1QyxJQUFJTCxTQUFTLEVBQUU7WUFBQTtZQUNkSyx5QkFBeUIsR0FBRzlCLEtBQUssQ0FBQ0MsT0FBTyxDQUFDd0IsU0FBUyxDQUFDLEdBQ2pEcE4sTUFBTSxDQUFDRSxJQUFJLFdBQUVrTixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQXdETSxLQUFLLDJDQUExRSxPQUE0RTVTLFNBQVMsRUFBRSxDQUFDLEdBQ3BHa0YsTUFBTSxDQUFDRSxJQUFJLENBQUNrTixTQUFTLENBQUN0UyxTQUFTLEVBQUUsQ0FBQztVQUN0QztVQUNBLElBQUksQ0FBQ2YsYUFBYSxDQUFDQyxRQUFRLENBQUMyVCxNQUFNLEVBQUVuSSxXQUFXLENBQUNsTSxRQUFRLEVBQUUrUixXQUFXLEVBQUVpQyxhQUFhLEVBQUVHLHlCQUF5QixDQUFDO1FBQ2pIO1FBQ0EsSUFBSSxDQUFDaEgsd0JBQXdCLENBQUM0RSxXQUFXLEVBQUV6RSxXQUFXLENBQUNnSCxNQUFNLENBQUM7UUFFOUQsSUFBSW5DLHVCQUF1QixFQUFFO1VBQzVCQSx1QkFBdUIsQ0FBQ29DLFNBQVMsQ0FBQ1QsU0FBUyxDQUFDO1FBQzdDO1FBQ0E7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO1FBQ0csSUFBSTVILFdBQVcsQ0FBQ2xNLFFBQVEsRUFBRTtVQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDdEUsYUFBYSxFQUFFLElBQUksSUFBSSxDQUFDbEIsSUFBSSxDQUFDMUYsT0FBTyxFQUFFLENBQUNrRyxXQUFXLEVBQUUsQ0FBQzZZLGFBQWEsS0FBSyxZQUFZLEVBQUU7WUFDOUZuVSxTQUFTLENBQUNDLGlCQUFpQixFQUFFO1VBQzlCO1VBQ0EsSUFBSSxDQUFDMkYsZ0JBQWdCLEVBQUUsQ0FBQ0MsV0FBVyxDQUFDLG9CQUFvQixFQUFFd00sV0FBVyxDQUFDO1FBQ3ZFO1FBQ0EsSUFBSTdGLFdBQVcsQ0FBQ3FHLFdBQVcsRUFBRTtVQUM1QixJQUFJaUMsUUFBUSxHQUFHVixTQUFTO1VBQ3hCLElBQUl6QixLQUFLLENBQUNDLE9BQU8sQ0FBQ2tDLFFBQVEsQ0FBQyxJQUFJQSxRQUFRLENBQUNqZCxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3JEaWQsUUFBUSxHQUFJQSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQXdESixLQUFLO1VBQ3JGO1VBQ0EsSUFBSUksUUFBUSxJQUFJLENBQUNuQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ2tDLFFBQVEsQ0FBQyxFQUFFO1lBQ3pDLE1BQU05WixPQUFPLEdBQUc4WixRQUFRO1lBQ3hCLE1BQU1DLFVBQVUsR0FBR3JDLEtBQUssQ0FBQ3hhLFFBQVEsRUFBRSxDQUFDaUIsWUFBWSxFQUFFO1lBQ2xELE1BQU02YixnQkFBZ0IsR0FBR0QsVUFBVSxDQUFDdkosV0FBVyxDQUFDeFEsT0FBTyxDQUFDbkYsT0FBTyxFQUFFLENBQUM7WUFDbEUsTUFBTW9mLGdCQUFnQixHQUFHLENBQUMzVSxRQUFtQixFQUFFNFUsa0JBQThCLEtBQWdCO2NBQzVGLE9BQU81VSxRQUFRLENBQUN2SixNQUFNLENBQUVvZSxPQUFPLElBQUs7Z0JBQ25DLElBQUlELGtCQUFrQixFQUFFO2tCQUN2QixPQUFPQSxrQkFBa0IsQ0FBQzNLLFFBQVEsQ0FBQzRLLE9BQU8sQ0FBQztnQkFDNUM7Z0JBQ0EsT0FBTyxJQUFJO2NBQ1osQ0FBQyxDQUFDO1lBQ0gsQ0FBQztZQUNELE1BQU1DLGNBQWMsR0FBR3pDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDcEcsV0FBVyxDQUFDbE0sUUFBUSxDQUFDLEdBQ3ZEMlUsZ0JBQWdCLENBQUN6SSxXQUFXLENBQUNsTSxRQUFRLEVBQUVrTSxXQUFXLENBQUMwSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUN6RTFJLFdBQVcsQ0FBQ2xNLFFBQVE7WUFDdkIsTUFBTStVLHNCQUFzQixHQUFHRCxjQUFjLElBQUlMLFVBQVUsQ0FBQ3ZKLFdBQVcsQ0FBQzRKLGNBQWMsQ0FBQ3ZmLE9BQU8sRUFBRSxDQUFDO1lBRWpHLElBQUltZixnQkFBZ0IsSUFBSTlZLFNBQVMsSUFBSThZLGdCQUFnQixLQUFLSyxzQkFBc0IsRUFBRTtjQUNqRixJQUFJLENBQUFELGNBQWMsYUFBZEEsY0FBYyx1QkFBZEEsY0FBYyxDQUFFdmYsT0FBTyxFQUFFLE1BQUttRixPQUFPLENBQUNuRixPQUFPLEVBQUUsRUFBRTtnQkFDcEQsSUFBSSxDQUFDc1Qsa0JBQWtCLEVBQUUsQ0FBQ0Msd0JBQXdCLENBQUNwTyxPQUFPLEVBQUU7a0JBQzNEc2EsaUJBQWlCLEVBQUU7Z0JBQ3BCLENBQUMsQ0FBQzs7Z0JBRUY7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0EsSUFDQyxJQUFJLENBQUNqYyxtQkFBbUIsQ0FBQzJCLE9BQU8sQ0FBQyxLQUFLbEgsZ0JBQWdCLENBQUMrRixLQUFLLElBQzVEbUIsT0FBTyxDQUFDekUsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEtBQUssS0FBSyxFQUM5QztrQkFDRCxNQUFNZ2YsYUFBYSxHQUFHdmEsT0FBTyxDQUFDOUMsUUFBUSxFQUFFLENBQUMrWSxXQUFXLENBQUNqVyxPQUFPLENBQUNuRixPQUFPLEVBQUUsQ0FBQyxDQUFDcWIsZUFBZSxFQUFFO2tCQUN6RixJQUFJeUIsS0FBSyxDQUFDQyxPQUFPLENBQUN3QixTQUFTLENBQUMsRUFBRTtvQkFDNUJBLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBNENNLEtBQUssR0FBR2EsYUFBYTtrQkFDL0UsQ0FBQyxNQUFNO29CQUNObkIsU0FBUyxHQUFHbUIsYUFBYTtrQkFDMUI7a0JBQ0F2YSxPQUFPLENBQUNrRSxVQUFVLEVBQUUsQ0FBQ3FGLE9BQU8sRUFBRTtnQkFDL0I7Y0FDRCxDQUFDLE1BQU07Z0JBQ054TyxHQUFHLENBQUN5ZixJQUFJLENBQUMsK0NBQStDLENBQUM7Y0FDMUQ7WUFDRDtVQUNEO1FBQ0Q7UUFDQSxJQUFJLENBQUMxYSxJQUFJLENBQUNlLFFBQVEsQ0FBQzRaLHNCQUFzQixDQUFDcEQsV0FBVyxDQUFDO1FBQ3RELE9BQU8rQixTQUFTO01BQ2pCLENBQUMsQ0FBQyxPQUFPcEksR0FBWSxFQUFFO1FBQ3RCLElBQUl5Ryx1QkFBdUIsRUFBRTtVQUM1QkEsdUJBQXVCLENBQUNpRCxTQUFTLEVBQUU7UUFDcEM7UUFDQSxNQUFNQyxVQUFVLEdBQUczSixHQUFzRTtRQUN6RjtRQUNBLElBQUlBLEdBQUcsS0FBS2pZLFNBQVMsQ0FBQ29XLGtCQUFrQixFQUFFO1VBQ3pDO1VBQ0E7VUFDQTtVQUNBO1VBQ0EsTUFBTSxJQUFJL1IsS0FBSyxDQUFDLGtCQUFrQixDQUFDO1FBQ3BDLENBQUMsTUFBTSxJQUFJLEVBQUU0VCxHQUFHLEtBQUsySixVQUFVLENBQUNuSCxRQUFRLElBQUttSCxVQUFVLENBQUNDLGFBQWEsSUFBSUQsVUFBVSxDQUFDQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUNwSCxRQUFTLENBQUMsQ0FBQyxFQUFFO1VBQ2pIO1VBQ0EsTUFBTSxJQUFJcFcsS0FBSyxDQUFFLGtDQUFpQzRULEdBQUksRUFBQyxDQUFDO1FBQ3pEO1FBQ0E7TUFDRDtJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUxDO0lBQUEsT0FRTXlKLHNCQUFzQixHQUY1QixzQ0FFNkJJLFdBQW1CLEVBQWlCO01BQ2hFO0lBQUE7O0lBR0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FaQztJQUFBLE9BZU1DLGdCQUFnQixHQUZ0QixnQ0FHQ0MsVUFBb0IsRUFDcEJ2SixXQU1DLEVBQ2U7TUFBQTtNQUNoQixNQUFNd0osUUFBUSxHQUFHLENBQUF4SixXQUFXLGFBQVhBLFdBQVcsNENBQVhBLFdBQVcsQ0FBRXlKLElBQUksc0RBQWpCLGtCQUFtQkMsR0FBRyxLQUFJLElBQUk7UUFDOUNDLFVBQVUsR0FBRyxDQUFBM0osV0FBVyxhQUFYQSxXQUFXLDZDQUFYQSxXQUFXLENBQUV5SixJQUFJLHVEQUFqQixtQkFBbUJHLEtBQUssS0FBSSxJQUFJO1FBQzdDQyxnQkFBZ0IsR0FBRyxDQUFBN0osV0FBVyxhQUFYQSxXQUFXLHVCQUFYQSxXQUFXLENBQUU4SixlQUFlLEtBQUksS0FBSztRQUN4RHhFLFdBQVcsR0FBRyxJQUFJLENBQUNuVCxnQkFBZ0IsRUFBRTtRQUNyQzROLFFBQVEsR0FBRyxJQUFJLENBQUNuWCxPQUFPLEVBQUUsQ0FBQ0MsaUJBQWlCLEVBQUU7UUFDN0NzWixRQUFRLEdBQUdwQyxRQUFRLElBQUksSUFBSSxDQUFDbFQsbUJBQW1CLENBQUNrVCxRQUFRLENBQVksS0FBS3pZLGdCQUFnQixDQUFDK0YsS0FBSztNQUVoRyxJQUFJc2MsVUFBVSxJQUFJOVcsVUFBVSxDQUFDc0osUUFBUSxDQUFDbUosV0FBVyxDQUFDLEVBQUU7UUFDbkQsT0FBT2hkLE9BQU8sQ0FBQ2dKLE1BQU0sQ0FBQyx1REFBdUQsQ0FBQztNQUMvRTs7TUFFQTtNQUNBLElBQUlrWSxRQUFRLEVBQUU7UUFDYjNXLFVBQVUsQ0FBQ0MsSUFBSSxDQUFDd1MsV0FBVyxDQUFDO01BQzdCO01BQ0EsSUFBSXVFLGdCQUFnQixJQUFJMUgsUUFBUSxFQUFFO1FBQ2pDLElBQUksQ0FBQ2pOLGNBQWMsQ0FBQzFOLFdBQVcsQ0FBQzJOLE1BQU0sQ0FBQztNQUN4QztNQUVBLElBQUksQ0FBQy9JLGlCQUFpQixFQUFFLENBQUM0SSx3QkFBd0IsRUFBRTtNQUVuRCxPQUFPLElBQUksQ0FBQ0MsUUFBUSxDQUFDc1UsVUFBVSxDQUFxQyxDQUNsRXpSLElBQUksQ0FBQyxNQUFNO1FBQ1gsSUFBSStSLGdCQUFnQixFQUFFO1VBQ3JCLElBQUksQ0FBQ25aLG1CQUFtQixDQUFDLElBQUksQ0FBQztVQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDbEIsYUFBYSxFQUFFLEVBQUU7WUFDMUJnRSxTQUFTLENBQUNDLGlCQUFpQixFQUFFO1VBQzlCO1VBQ0EsSUFBSTBPLFFBQVEsRUFBRTtZQUNiLElBQUksQ0FBQ2pOLGNBQWMsQ0FBQzFOLFdBQVcsQ0FBQ3dPLEtBQUssQ0FBQztVQUN2QztRQUNEO1FBQ0E7TUFDRCxDQUFDLENBQUMsQ0FDRGdHLEtBQUssQ0FBRStGLE1BQWUsSUFBVztRQUNqQyxJQUFJOEgsZ0JBQWdCLElBQUkxSCxRQUFRLEVBQUU7VUFDakMsSUFBSSxDQUFDak4sY0FBYyxDQUFDMU4sV0FBVyxDQUFDeU8sS0FBSyxDQUFDO1FBQ3ZDO1FBQ0EsTUFBTThMLE1BQU07TUFDYixDQUFDLENBQUMsQ0FDRGdJLE9BQU8sQ0FBQyxNQUFNO1FBQ2QsSUFBSVAsUUFBUSxFQUFFO1VBQ2IzVyxVQUFVLENBQUM2QixNQUFNLENBQUM0USxXQUFXLENBQUM7UUFDL0I7UUFDQSxJQUFJLENBQUNsWixpQkFBaUIsRUFBRSxDQUFDQyxpQkFBaUIsRUFBRTtNQUM3QyxDQUFDLENBQUM7SUFDSjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBLE9BSkM7SUFBQSxPQUtBMmQsZUFBZSxHQUFmLHlCQUFnQkMsTUFBMEMsRUFBUTtNQUFBO01BQ2pFO01BQ0EsTUFBTUMsZUFBZSxvQkFBRyxJQUFJLENBQUN0aEIsT0FBTyxFQUFFLGtEQUFkLGNBQWdCQyxpQkFBaUIsQ0FBQyxVQUFVLENBQXlCO01BQzdGLE1BQU1nZSxVQUFVLEdBQUcsSUFBSSxDQUFDdlksSUFBSSxDQUFDb0wsa0JBQWtCLENBQUNDLFdBQVcsRUFBRSxJQUFJdVEsZUFBZSxDQUFDbmdCLFdBQVcsQ0FBQyxZQUFZLENBQUM7TUFFMUcsSUFBSThjLFVBQVUsRUFBRTtRQUNib0QsTUFBTSxDQUFDRSxTQUFTLEVBQUUsQ0FBYXplLFFBQVEsRUFBRSxDQUFnQjBlLGFBQWEsQ0FBQyxJQUFJLENBQUM7TUFDL0U7TUFDQSxJQUFJLEVBQUNGLGVBQWUsYUFBZkEsZUFBZSxlQUFmQSxlQUFlLENBQUVuZ0IsV0FBVyxDQUFDLG1CQUFtQixDQUFDLEdBQUU7UUFDdkQsTUFBTXNnQixhQUFhLEdBQUdKLE1BQU0sQ0FBQ0UsU0FBUyxFQUFpQyxDQUFDLENBQUM7UUFDekU7UUFDQSxNQUFNRyxhQUFhLEdBQUcsSUFBSWhpQixPQUFPLENBQU8sQ0FBQ0MsT0FBTyxFQUFFK0ksTUFBTSxLQUFLO1VBQzVEMlksTUFBTSxDQUFDRSxTQUFTLEVBQUUsQ0FBQzdXLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBR2lYLG1CQUFtRCxJQUFLO1lBQzdHO1lBQ0EsSUFBSTFELFVBQVUsRUFBRTtjQUNib0QsTUFBTSxDQUFDRSxTQUFTLEVBQUUsQ0FBYXplLFFBQVEsRUFBRSxDQUFnQjBlLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDaEY7WUFFQSxJQUFJSCxNQUFNLENBQUNFLFNBQVMsRUFBRSxDQUFDM1gsR0FBRyxDQUFDLHdDQUF3QyxDQUFDLEVBQUU7Y0FBQTtjQUNyRWdZLGFBQWEsQ0FBQ0MsNkJBQTZCLENBQzFDLElBQUksQ0FBQzdoQixPQUFPLEVBQUUsRUFDZHloQixhQUFhLG9CQUNiLElBQUksQ0FBQ3poQixPQUFPLEVBQUUsbURBQWQsZUFBZ0JDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUM3QztZQUNGO1lBQ0EsTUFBTTZoQixRQUFRLEdBQUdILG1CQUFtQixDQUFDSSxZQUFZLENBQUMsU0FBUyxDQUFDO1lBQzVELElBQUlELFFBQVEsRUFBRTtjQUNibmlCLE9BQU8sRUFBRTtZQUNWLENBQUMsTUFBTTtjQUNOK0ksTUFBTSxFQUFFO1lBQ1Q7VUFDRCxDQUFDLENBQUM7UUFDSCxDQUFDLENBQUM7UUFDRixJQUFJLENBQUNxRCxjQUFjLENBQUMwVixhQUFhLEVBQUVDLGFBQWEsQ0FBQztNQUNsRDtJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsT0FKQztJQUFBLE9BS0FNLGdCQUFnQixHQUFoQiwwQkFBaUJDLEtBQXFDLEVBQVE7TUFDN0QsTUFBTXJjLE9BQU8sR0FBR3FjLEtBQUssQ0FBQ0YsWUFBWSxDQUFDLFNBQVMsQ0FBQztNQUM3QyxJQUFJLENBQUN2ZSxpQkFBaUIsRUFBRSxDQUFDNEksd0JBQXdCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRXhHLE9BQU8sQ0FBQ25GLE9BQU8sRUFBRSxDQUFDO0lBQ25GOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BTkM7SUFBQSxPQU9NNEwsUUFBUSxHQUFkLHdCQUFrQjZWLE9BQWdDLEVBQWM7TUFDL0QsSUFBSUEsT0FBTyxFQUFFO1FBQ1osSUFBSSxPQUFPQSxPQUFPLEtBQUssVUFBVSxFQUFFO1VBQ2xDLElBQUksQ0FBQ3ppQixTQUFTLEdBQUcsSUFBSSxDQUFDQSxTQUFTLENBQUN5UCxJQUFJLENBQUNnVCxPQUFPLENBQUMsQ0FBQzlPLEtBQUssQ0FBQyxVQUFVd0QsR0FBWSxFQUFFO1lBQzNFalcsR0FBRyxDQUFDd2hCLEtBQUssQ0FBQ3ZMLEdBQUcsQ0FBVztVQUN6QixDQUFDLENBQUM7UUFDSCxDQUFDLE1BQU07VUFDTixJQUFJLENBQUNuWCxTQUFTLEdBQUcsSUFBSSxDQUFDQSxTQUFTLENBQzdCeVAsSUFBSSxDQUFDLFlBQVlnVCxPQUFPLENBQUMsQ0FDekI5TyxLQUFLLENBQUMsVUFBVXdELEdBQVksRUFBRTtZQUM5QmpXLEdBQUcsQ0FBQ3doQixLQUFLLENBQUN2TCxHQUFHLENBQVc7VUFDekIsQ0FBQyxDQUFDO1FBQ0o7TUFDRDtNQUVBLE9BQU8sSUFBSSxDQUFDblgsU0FBUztJQUN0Qjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FMQztJQUFBLE9BT00yaUIsZUFBZSxHQUFyQiwrQkFBc0J4YyxPQUFnQixFQUFpQjtNQUN0RCxNQUFNNUIsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQzJCLE9BQU8sQ0FBQztNQUUxRCxJQUFJNUIsZ0JBQWdCLEtBQUt0RixnQkFBZ0IsQ0FBQytGLEtBQUssRUFBRTtRQUNoRCxJQUFJO1VBQ0gsSUFBSSxDQUFDNkgsY0FBYyxDQUFDMU4sV0FBVyxDQUFDeU8sS0FBSyxDQUFDO1VBQ3RDLE1BQU1nVixXQUFXLEdBQUcsSUFBSSxDQUFDOVksZ0JBQWdCLEVBQUU7VUFDM0M4WSxXQUFXLENBQUM1UixXQUFXLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFM0osU0FBUyxFQUFFLElBQUksQ0FBQztVQUNwRSxNQUFNd2IsY0FBYyxHQUFHLE1BQU0xYyxPQUFPLENBQUMyYyxhQUFhLENBQUMsZ0JBQWdCLENBQUM7VUFDcEUsSUFBSUQsY0FBYyxLQUFLLEtBQUssRUFBRTtZQUM3QjtZQUNBLElBQUksQ0FBQzFhLFdBQVcsQ0FBQy9JLFFBQVEsQ0FBQ2dKLFFBQVEsQ0FBQztZQUNuQyxNQUFNMmEsZUFBZSxHQUFHLE1BQU01YyxPQUFPLENBQUMyYyxhQUFhLENBQUMsaUJBQWlCLENBQUM7WUFDdEUsSUFBSSxDQUFDM2EsV0FBVyxDQUFDZCxTQUFTLEVBQUUsQ0FBQzBiLGVBQWUsQ0FBQztVQUM5QyxDQUFDLE1BQU07WUFDTjtZQUNBLElBQUksQ0FBQzVhLFdBQVcsQ0FBQy9JLFFBQVEsQ0FBQzZaLE9BQU8sRUFBRSxLQUFLLENBQUM7VUFDMUM7VUFDQTJKLFdBQVcsQ0FBQzVSLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUzSixTQUFTLEVBQUUsSUFBSSxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxPQUFPcEcsS0FBYyxFQUFFO1VBQ3hCQyxHQUFHLENBQUNELEtBQUssQ0FBQyxnREFBZ0QsRUFBRUEsS0FBSyxDQUFXO1VBQzVFLE1BQU1BLEtBQUs7UUFDWjtNQUNELENBQUMsTUFBTSxJQUFJc0QsZ0JBQWdCLEtBQUt0RixnQkFBZ0IsQ0FBQzZILE1BQU0sRUFBRTtRQUN4RCxNQUFNa2MscUJBQXFCLEdBQUcsSUFBSSxDQUFDalMsZ0JBQWdCLEVBQUUsQ0FBQ3JQLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQztRQUN2RixJQUFJc2hCLHFCQUFxQixJQUFJLElBQUksQ0FBQ0Msb0JBQW9CLENBQUNELHFCQUFxQixFQUFFN2MsT0FBTyxDQUFDLEVBQUU7VUFDdkYsSUFBSSxDQUFDZ0MsV0FBVyxDQUFDL0ksUUFBUSxDQUFDZ0osUUFBUSxFQUFFLElBQUksQ0FBQztVQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDdkgsZUFBZSxFQUFFLENBQUNzRyxhQUFhLEVBQUUsRUFBRTtZQUM1Q2dFLFNBQVMsQ0FBQ0MsaUJBQWlCLEVBQUU7VUFDOUI7VUFDQSxJQUFJLENBQUN2QyxjQUFjLENBQUMxQyxPQUFPLENBQUM7VUFDNUIsSUFBSSxDQUFDc0IsbUNBQW1DLENBQUMsSUFBSSxDQUFDakQsbUJBQW1CLENBQUMyQixPQUFPLENBQUMsRUFBRUEsT0FBTyxDQUFDOUMsUUFBUSxFQUFFLENBQUM7VUFDL0YsSUFBSSxDQUFDME4sZ0JBQWdCLEVBQUUsQ0FBQ0MsV0FBVyxDQUFDLG9CQUFvQixFQUFFM0osU0FBUyxDQUFDO1FBQ3JFO01BQ0Q7SUFDRDs7SUFFQTtJQUNBO0lBQ0E7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FyQkM7SUFBQSxPQXNCY3NELHlCQUF5QixHQUF2Qyx5Q0FDQ2MsUUFBNkIsRUFDN0IvRixVQWlCQyxFQUNlO01BQUE7TUFDaEIsSUFBSUEsVUFBVSxDQUFDZ0YsZ0JBQWdCLEVBQUU7UUFDaEM7UUFDQWhGLFVBQVUsQ0FBQ3dkLHdCQUF3QixHQUFHeGQsVUFBVSxDQUFDZ0YsZ0JBQWdCLENBQUMxSCxNQUFNO01BQ3pFO01BQ0EsTUFBTXlZLGFBQWEsR0FBRyxJQUFJLENBQUNsRCxpQkFBaUIsRUFBRTtNQUM5QyxNQUFNblMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDUCxvQkFBb0IsRUFBRTs7TUFFckQ7TUFDQTtNQUNBSCxVQUFVLENBQUM2WSxvQkFBb0IsR0FBRzdZLFVBQVUsQ0FBQ3VFLFNBQVMsNEJBQ2xEeEgsT0FBTyxDQUFDQyxjQUFjLENBQUNnRCxVQUFVLENBQUN1RSxTQUFTLENBQUMsMERBQTVDLHNCQUE4Q3pKLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxHQUM1RSxJQUFJO01BRVAsTUFBTSxJQUFJLENBQUNvTSxRQUFRLEVBQUU7TUFDckIsTUFBTXhHLGlCQUFpQixDQUFDNFYsY0FBYyxDQUFDdlEsUUFBUSxFQUFFL0YsVUFBVSxFQUFFLElBQUksQ0FBQzdFLGVBQWUsRUFBRSxFQUFFNGEsYUFBYSxFQUFFLElBQUksQ0FBQzFYLGlCQUFpQixFQUFFLENBQUM7SUFDOUgsQ0FBQztJQUFBLE9BRUR3VSxpQkFBaUIsR0FBakIsNkJBQW1DO01BQ2xDLE9BQU80SyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM1aUIsT0FBTyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUFBLE9BRU9zRixvQkFBb0IsR0FBNUIsZ0NBQXlEO01BQ3hELE9BQU91ZCxpQkFBaUI7SUFDekIsQ0FBQztJQUFBLE9BRU9yZixpQkFBaUIsR0FBekIsNkJBQTRDO01BQzNDLElBQUksSUFBSSxDQUFDa0MsSUFBSSxDQUFDb2QsY0FBYyxFQUFFO1FBQzdCLE9BQU8sSUFBSSxDQUFDcGQsSUFBSSxDQUFDb2QsY0FBYztNQUNoQyxDQUFDLE1BQU07UUFDTixNQUFNLElBQUk5ZixLQUFLLENBQUMsbURBQW1ELENBQUM7TUFDckU7SUFDRCxDQUFDO0lBQUEsT0FFT3dOLGdCQUFnQixHQUF4Qiw0QkFBc0M7TUFDckMsT0FBTyxJQUFJLENBQUN4USxPQUFPLEVBQUUsQ0FBQzhDLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFDM0MsQ0FBQztJQUFBLE9BRU95RyxnQkFBZ0IsR0FBeEIsNEJBQXNDO01BQ3JDLE9BQU8sSUFBSSxDQUFDdkosT0FBTyxFQUFFLENBQUM4QyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQ3JDOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsT0FKQztJQUFBLE9BS1FpZ0IsZUFBZSxHQUF2Qix5QkFBd0JDLGFBQXNCLEVBQVE7TUFDckQsTUFBTUMsY0FBYyxHQUFHLElBQUksQ0FBQ2pqQixPQUFPLEVBQUUsQ0FBQ0MsaUJBQWlCLENBQUMsSUFBSSxDQUFZO01BQ3hFLElBQUksQ0FBQ3NKLGdCQUFnQixFQUFFLENBQUNrSCxXQUFXLENBQUN5UyxnQkFBZ0IsQ0FBQ0MsVUFBVSxFQUFFSCxhQUFhLEVBQUVDLGNBQWMsRUFBRSxJQUFJLENBQUM7SUFDdEc7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQSxPQUpDO0lBQUEsT0FLQWhMLGVBQWUsR0FBZiwyQkFBMkI7TUFDMUIsTUFBTWdMLGNBQWMsR0FBRyxJQUFJLENBQUNqakIsT0FBTyxFQUFFLENBQUNDLGlCQUFpQixDQUFDLElBQUksQ0FBWTtNQUN4RSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUNzSixnQkFBZ0IsRUFBRSxDQUFDcEksV0FBVyxDQUFDK2hCLGdCQUFnQixDQUFDQyxVQUFVLEVBQUVGLGNBQWMsQ0FBQztJQUMxRjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBLE9BSkM7SUFBQSxPQUtRMUksa0JBQWtCLEdBQTFCLDhCQUFzQztNQUNyQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUNoUixnQkFBZ0IsRUFBRSxDQUFDcEksV0FBVyxDQUFDK2hCLGdCQUFnQixDQUFDRSxnQkFBZ0IsQ0FBQztJQUNoRjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBLE9BSkM7SUFBQSxPQUtRdGIsbUJBQW1CLEdBQTNCLDZCQUE0QnViLFFBQWlCLEVBQVE7TUFDcEQsSUFBSSxDQUFDOVosZ0JBQWdCLEVBQUUsQ0FBQ2tILFdBQVcsQ0FBQ3lTLGdCQUFnQixDQUFDRSxnQkFBZ0IsRUFBRUMsUUFBUSxDQUFDO0lBQ2pGOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsT0FKQztJQUFBLE9BS1ExUywyQkFBMkIsR0FBbkMscUNBQW9DOVEsV0FBNkIsRUFBUTtNQUN4RTtNQUNBO01BQ0EsSUFBSUEsV0FBVyxDQUFDcUUsVUFBVSxFQUFFLEVBQUU7UUFDN0IsSUFBSSxDQUFDNEQsbUJBQW1CLENBQUMsSUFBSSxDQUFDO01BQy9CO0lBQ0Q7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQSxPQUpDO0lBQUEsT0FLUTZKLGtCQUFrQixHQUExQiw0QkFBMkIyUixPQUF5QixFQUFRO01BQzNELElBQUksQ0FBQ2hYLGNBQWMsQ0FBQzFOLFdBQVcsQ0FBQ3lPLEtBQUssQ0FBQztNQUV0QyxNQUFNckosZ0JBQWdCLEdBQUcsSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQ3FmLE9BQU8sQ0FBQztNQUUxREEsT0FBTyxDQUFDQyxXQUFXLENBQUMsWUFBWSxFQUFFLE1BQU07UUFDdkMsSUFBSXZmLGdCQUFnQixLQUFLdEYsZ0JBQWdCLENBQUMrRixLQUFLLEVBQUU7VUFDaEQsSUFBSSxDQUFDNkgsY0FBYyxDQUFDMU4sV0FBVyxDQUFDMk4sTUFBTSxDQUFDO1FBQ3hDO01BQ0QsQ0FBQyxDQUFDO01BQ0YrVyxPQUFPLENBQUNDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBR2xDLE1BQXNDLElBQVc7UUFDeEYsTUFBTW1DLE9BQU8sR0FBR25DLE1BQU0sQ0FBQ1UsWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxJQUFJL2QsZ0JBQWdCLEtBQUt0RixnQkFBZ0IsQ0FBQytGLEtBQUssRUFBRTtVQUNoRCxJQUFJLENBQUM2SCxjQUFjLENBQUNrWCxPQUFPLEdBQUc1a0IsV0FBVyxDQUFDd08sS0FBSyxHQUFHeE8sV0FBVyxDQUFDeU8sS0FBSyxDQUFDO1FBQ3JFO1FBQ0EsSUFBSSxDQUFDN0osaUJBQWlCLEVBQUUsQ0FBQ0MsaUJBQWlCLEVBQUU7TUFDN0MsQ0FBQyxDQUFDO0lBQ0g7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQSxPQUpDO0lBQUEsT0FLQTZJLGNBQWMsR0FBZCx3QkFBZW1YLFdBQW1CLEVBQVE7TUFDeEMsSUFBSSxDQUFDempCLE9BQU8sRUFBRSxDQUFDOEMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFlMk4sV0FBVyxDQUFDLGNBQWMsRUFBRWdULFdBQVcsRUFBRTNjLFNBQVMsRUFBRSxJQUFJLENBQUM7SUFDdkc7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BTEM7SUFBQSxPQU1RN0MsbUJBQW1CLEdBQTNCLDZCQUE0QnlmLE1BQXlCLEVBQTJCO01BQy9FLE9BQU8sSUFBSSxDQUFDcGUsb0JBQW9CLEVBQUUsQ0FBQ3JCLG1CQUFtQixDQUFDeWYsTUFBTSxDQUFDO0lBQy9EOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUxDO0lBQUEsT0FNUTliLFdBQVcsR0FBbkIscUJBQW9CK2IsUUFBaUIsRUFBRUMsVUFBb0IsRUFBUTtNQUNsRTtNQUNBO01BQ0EsTUFBTXZCLFdBQVcsR0FBRyxJQUFJLENBQUM5WSxnQkFBZ0IsRUFBRTtNQUUzQyxJQUFJb2EsUUFBUSxFQUFFO1FBQ2J0QixXQUFXLENBQUM1UixXQUFXLENBQUMsYUFBYSxFQUFFa1QsUUFBUSxLQUFLLFVBQVUsRUFBRTdjLFNBQVMsRUFBRSxJQUFJLENBQUM7UUFDaEYsSUFBSTZjLFFBQVEsS0FBSyxVQUFVLEVBQUU7VUFDNUIsSUFBSSxDQUFDalQsdUJBQXVCLENBQUMsS0FBSyxDQUFDO1FBQ3BDO01BQ0Q7TUFFQSxJQUFJa1QsVUFBVSxLQUFLOWMsU0FBUyxFQUFFO1FBQzdCO1FBQ0E7UUFDQSxJQUFJLENBQUNpYyxlQUFlLENBQUNhLFVBQVUsQ0FBQztNQUNqQztJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBLE9BSEM7SUFBQSxPQUlRbFQsdUJBQXVCLEdBQS9CLGlDQUFnQ21ULE1BQWUsRUFBUTtNQUN0RCxJQUFJLENBQUN0YSxnQkFBZ0IsRUFBRSxDQUFDa0gsV0FBVyxDQUFDLDBCQUEwQixFQUFFb1QsTUFBTSxFQUFFL2MsU0FBUyxFQUFFLElBQUksQ0FBQztJQUN6Rjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBLE9BSkM7SUFBQSxPQUtBZ2QsNEJBQTRCLEdBQTVCLHdDQUF3QztNQUN2QyxPQUFPLElBQUksQ0FBQ3ZhLGdCQUFnQixFQUFFLENBQUNwSSxXQUFXLENBQUMsMEJBQTBCLENBQUMsS0FBSyxJQUFJO0lBQ2hGOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BTkM7SUFBQSxPQU9RdWhCLG9CQUFvQixHQUE1Qiw4QkFBNkJxQixVQUFrQixFQUFFbmUsT0FBZ0IsRUFBVztNQUMzRSxJQUFJO1FBQUE7UUFDSCxNQUFNOUIsU0FBUyxHQUFHOEIsT0FBTyxDQUFDOUMsUUFBUSxFQUFFLENBQUNpQixZQUFZLEVBQUU7UUFDbkQsTUFBTXVNLFdBQVcsR0FBR3hNLFNBQVMsQ0FBQ08sY0FBYyxDQUFDdUIsT0FBTyxDQUFDbkYsT0FBTyxFQUFFLENBQUM7UUFDL0QsTUFBTTZELFNBQVMsR0FBR0YsMkJBQTJCLENBQUNrTSxXQUFXLENBQUMsQ0FBQ0MsaUJBQThCO1FBQ3pGLE1BQU15VCxhQUFhLDZCQUFHMWYsU0FBUyxDQUFDSSxXQUFXLENBQUNHLE9BQU8sMkRBQTdCLHVCQUErQkMsc0JBQXNCO1FBQzNFLElBQUksQ0FBQWtmLGFBQWEsYUFBYkEsYUFBYSx1QkFBYkEsYUFBYSxDQUFFamYsU0FBUyxNQUFLZ2YsVUFBVSxFQUFFO1VBQzVDLE9BQU8sSUFBSTtRQUNaO1FBQ0EsSUFBSUMsYUFBYSxhQUFiQSxhQUFhLGVBQWJBLGFBQWEsQ0FBRUMsb0JBQW9CLElBQUlELGFBQWEsYUFBYkEsYUFBYSxlQUFiQSxhQUFhLENBQUVDLG9CQUFvQixDQUFDOU8sUUFBUSxDQUFDNE8sVUFBVSxDQUFDLEVBQUU7VUFDcEcsT0FBTyxJQUFJO1FBQ1o7UUFDQSxPQUFPLEtBQUs7TUFDYixDQUFDLENBQUMsT0FBT3JqQixLQUFjLEVBQUU7UUFDeEJDLEdBQUcsQ0FBQ3lmLElBQUksQ0FBQzFmLEtBQUssQ0FBVztRQUN6QixPQUFPLEtBQUs7TUFDYjtJQUNEOztJQUVBOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUxDO0lBQUEsT0FNUTRILGNBQWMsR0FBdEIsd0JBQXVCMUMsT0FBZ0IsRUFBVztNQUNqRCxNQUFNb0wsWUFBWSxHQUFHLElBQUksQ0FBQzFRLGVBQWUsRUFBRTtNQUUzQyxJQUFJO1FBQ0gsSUFBSTBRLFlBQVksS0FBS2xLLFNBQVMsRUFBRTtVQUMvQixNQUFNLElBQUk5RCxLQUFLLENBQUMsb0RBQW9ELENBQUM7UUFDdEU7UUFFQSxJQUFJLENBQUNnTyxZQUFZLENBQUM5QyxjQUFjLEVBQUUsQ0FBQ2dXLGtCQUFrQixFQUFFLEVBQUU7VUFDeEQsTUFBTUMsV0FBVyxHQUFHblQsWUFBWSxDQUFDOUMsY0FBYyxFQUFFLENBQUNrVyxPQUFPLEVBQUU7VUFDM0QsTUFBTUMsYUFBYSxHQUFHLElBQUksQ0FBQzdULGdCQUFnQixFQUFFOztVQUU3QztVQUNBO1VBQ0E7VUFDQThULFVBQVUsQ0FBQyxZQUFZO1lBQ3RCdFQsWUFBWSxDQUFDOUMsY0FBYyxFQUFFLENBQUNxVyxrQkFBa0IsQ0FBQzNlLE9BQU8sQ0FBQ25GLE9BQU8sRUFBRSxDQUFDK2pCLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUNqRixDQUFDLEVBQUUsQ0FBQyxDQUFDOztVQUVMO1VBQ0F4VCxZQUFZLENBQUNxTCxnQkFBZ0IsRUFBRSxDQUFDQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUNtSSx5QkFBeUIsQ0FBQ0MsSUFBSSxDQUFDLElBQUksRUFBRTllLE9BQU8sQ0FBQyxDQUFDO1VBRXJHLElBQUksQ0FBQytlLDBCQUEwQixHQUFHLElBQUksQ0FBQ0MscUJBQXFCLENBQUM1VCxZQUFZLEVBQUVxVCxhQUFhLEVBQUVGLFdBQVcsQ0FBQztVQUN0R25ULFlBQVksQ0FBQ3FMLGdCQUFnQixFQUFFLENBQUN3SSwwQkFBMEIsQ0FBQyxJQUFJLENBQUNGLDBCQUEwQixDQUFDOztVQUUzRjtVQUNBLE1BQU1HLFNBQVMsR0FBRyxJQUFJLENBQUNwZixJQUFJLENBQUMxRixPQUFPLEVBQUUsQ0FBQzhDLFFBQVEsQ0FBQyxhQUFhLENBQUM7VUFDN0QsSUFBSSxDQUFDaWlCLHNCQUFzQixHQUFHLElBQUksQ0FBQ0MseUJBQXlCLENBQUNwZixPQUFPLEVBQUVrZixTQUFTLENBQUM7VUFDaEYsSUFBSSxDQUFDcGYsSUFBSSxDQUFDMUYsT0FBTyxFQUFFLENBQUM4QyxRQUFRLEVBQUUsQ0FBQ21pQixvQkFBb0IsQ0FBQyxJQUFJLENBQUNGLHNCQUFzQixDQUFDO1VBRWhGLElBQUksQ0FBQ0csb0NBQW9DLEdBQUcsSUFBSSxDQUFDQyx1QkFBdUIsQ0FBQ3ZmLE9BQU8sRUFBRW9MLFlBQVksQ0FBQztVQUMvRkEsWUFBWSxDQUFDbUssaUJBQWlCLEVBQUUsQ0FBQ2lLLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQ0Ysb0NBQW9DLENBQUM7UUFDbkc7TUFDRCxDQUFDLENBQUMsT0FBT3hrQixLQUFjLEVBQUU7UUFDeEJDLEdBQUcsQ0FBQ3lmLElBQUksQ0FBQzFmLEtBQUssQ0FBVztRQUN6QixPQUFPLEtBQUs7TUFDYjtNQUVBLE9BQU8sSUFBSTtJQUNaOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsT0FKQztJQUFBLE9BS1Eya0IsZUFBZSxHQUF2QiwyQkFBbUM7TUFDbEMsTUFBTXJVLFlBQVksR0FBRyxJQUFJLENBQUMxUSxlQUFlLEVBQUU7TUFDM0MsSUFBSTtRQUNILElBQUkwUSxZQUFZLEtBQUtsSyxTQUFTLEVBQUU7VUFDL0IsTUFBTSxJQUFJOUQsS0FBSyxDQUFDLHFEQUFxRCxDQUFDO1FBQ3ZFO1FBRUEsSUFBSWdPLFlBQVksQ0FBQzlDLGNBQWMsRUFBRTtVQUNoQztVQUNBO1VBQ0E4QyxZQUFZLENBQUM5QyxjQUFjLEVBQUUsQ0FBQ29YLHNCQUFzQixFQUFFO1FBQ3ZEO1FBRUEsSUFBSSxJQUFJLENBQUNYLDBCQUEwQixFQUFFO1VBQ3BDM1QsWUFBWSxDQUFDcUwsZ0JBQWdCLEVBQUUsQ0FBQ2tKLDRCQUE0QixDQUFDLElBQUksQ0FBQ1osMEJBQTBCLENBQUM7VUFDN0YsSUFBSSxDQUFDQSwwQkFBMEIsR0FBRzdkLFNBQVM7UUFDNUM7UUFFQSxNQUFNZCxLQUFLLEdBQUcsSUFBSSxDQUFDaEcsT0FBTyxFQUFFLENBQUM4QyxRQUFRLEVBQWdCO1FBQ3JELElBQUlrRCxLQUFLLElBQUksSUFBSSxDQUFDK2Usc0JBQXNCLEVBQUU7VUFDekMvZSxLQUFLLENBQUN3ZixvQkFBb0IsQ0FBQyxJQUFJLENBQUNULHNCQUFzQixDQUFDO1FBQ3hEO1FBRUEsSUFBSSxJQUFJLENBQUNHLG9DQUFvQyxFQUFFO1VBQzlDbFUsWUFBWSxDQUFDbUssaUJBQWlCLEVBQUUsQ0FBQ3NLLGtCQUFrQixDQUFDLElBQUksQ0FBQ1Asb0NBQW9DLENBQUM7UUFDL0Y7UUFFQSxJQUFJLENBQUNBLG9DQUFvQyxHQUFHcGUsU0FBUztRQUVyRCxJQUFJLENBQUNjLFdBQVcsQ0FBQy9JLFFBQVEsQ0FBQzZaLE9BQU8sRUFBRSxLQUFLLENBQUM7UUFFekMsSUFBSTFILFlBQVksQ0FBQ3FMLGdCQUFnQixFQUFFO1VBQ2xDO1VBQ0E7VUFDQXJMLFlBQVksQ0FBQ3FMLGdCQUFnQixFQUFFLENBQUNDLGlCQUFpQixFQUFFO1FBQ3BEO01BQ0QsQ0FBQyxDQUFDLE9BQU81YixLQUFjLEVBQUU7UUFDeEJDLEdBQUcsQ0FBQ3lmLElBQUksQ0FBQzFmLEtBQUssQ0FBVztRQUN6QixPQUFPLEtBQUs7TUFDYjtNQUVBLE9BQU8sSUFBSTtJQUNaLENBQUM7SUFBQSxPQUVEd0csbUNBQW1DLEdBQW5DLDZDQUFvQ2xELGdCQUF3QixFQUFFZ0MsS0FBaUIsRUFBUTtNQUN0RixJQUFJaEMsZ0JBQWdCLEtBQUt0RixnQkFBZ0IsQ0FBQzZILE1BQU0sRUFBRTtRQUNqRCxNQUFNOGQsYUFBYSxHQUFHLElBQUksQ0FBQzdULGdCQUFnQixFQUFFO1FBQzdDNlQsYUFBYSxDQUFDNVQsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7UUFDN0M0VCxhQUFhLENBQUM1VCxXQUFXLENBQUMscUJBQXFCLEVBQUV6SyxLQUFLLENBQUMwZixjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7TUFDOUY7SUFDRDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BUEM7SUFBQSxPQVFRZCxxQkFBcUIsR0FBN0IsK0JBQThCNVQsWUFBMEIsRUFBRXFULGFBQXdCLEVBQUVGLFdBQW1CLEVBQUU7TUFDeEcsT0FBUXdCLGlCQUE0QyxJQUEwQjtRQUM3RSxJQUFJO1VBQ0gsSUFBSUEsaUJBQWlCLEtBQUs3ZSxTQUFTLEVBQUU7WUFDcEMsTUFBTSxJQUFJOUQsS0FBSyxDQUFDLDBEQUEwRCxDQUFDO1VBQzVFO1VBRUEsTUFBTTRpQixVQUFVLEdBQUdELGlCQUFpQixDQUFDRSxhQUFhO1VBQ2xELE1BQU1DLFdBQVcsR0FBRzlVLFlBQVksQ0FBQzlDLGNBQWMsRUFBRTtVQUNqRCxJQUFJNlgsY0FBYyxHQUFHLEVBQUU7VUFDdkIsSUFBSUMsT0FBZ0I7VUFDcEIsTUFBTUMsV0FBVyxHQUFHNUIsYUFBYSxDQUFDbGpCLFdBQVcsQ0FBQyxZQUFZLENBQUM7VUFFM0QsSUFBSSxDQUFDOGtCLFdBQVcsRUFBRTtZQUNqQjtZQUNBO1lBQ0EsT0FBT25mLFNBQVM7VUFDakI7VUFFQSxJQUFJLENBQUNnZixXQUFXLENBQUNJLHFCQUFxQixFQUFFLEVBQUU7WUFDekM7WUFDQTtZQUNBRixPQUFPLEdBQUcsS0FBSztZQUNmRCxjQUFjLEdBQUdILFVBQVU7VUFDNUIsQ0FBQyxNQUFNLElBQUl6QixXQUFXLEtBQUt5QixVQUFVLEVBQUU7WUFDdEM7WUFDQUksT0FBTyxHQUFHLElBQUk7VUFDZixDQUFDLE1BQU0sSUFBSUYsV0FBVyxDQUFDSyxrQkFBa0IsQ0FBQ1AsVUFBVSxDQUFDLElBQUlFLFdBQVcsQ0FBQ00seUJBQXlCLEVBQUUsRUFBRTtZQUNqRztZQUNBO1lBQ0FMLGNBQWMsR0FBR0gsVUFBVTtZQUMzQkksT0FBTyxHQUFHLEtBQUs7VUFDaEIsQ0FBQyxNQUFNO1lBQ047WUFDQUEsT0FBTyxHQUFHLElBQUk7VUFDZjtVQUVBLElBQUlBLE9BQU8sRUFBRTtZQUNaO1lBQ0E7WUFDQTFCLFVBQVUsQ0FBQyxZQUFZO2NBQ3RCdFQsWUFBWSxDQUFDcUwsZ0JBQWdCLEVBQUUsQ0FBQ2dLLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDcEQsQ0FBQyxFQUFFLENBQUMsQ0FBQztVQUNOLENBQUMsTUFBTTtZQUNObEMsV0FBVyxHQUFHNEIsY0FBYztVQUM3QjtVQUVBLE9BQU9DLE9BQU87UUFDZixDQUFDLENBQUMsT0FBT3RsQixLQUFjLEVBQUU7VUFDeEJDLEdBQUcsQ0FBQ3lmLElBQUksQ0FBQzFmLEtBQUssQ0FBVztVQUN6QixPQUFPb0csU0FBUztRQUNqQjtNQUNELENBQUM7SUFDRjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQU5DO0lBQUEsT0FPUWtlLHlCQUF5QixHQUFqQyxtQ0FBa0M1YyxhQUFzQixFQUFFMGMsU0FBZ0IsRUFBRTtNQUMzRSxPQUFPLE1BQTJCO1FBQ2pDLElBQUk7VUFDSCxJQUFJMWMsYUFBYSxLQUFLdEIsU0FBUyxFQUFFO1lBQ2hDLE1BQU0sSUFBSTlELEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQztVQUMvRDtVQUNBO1VBQ0EsSUFBSSxDQUFDUSxpQkFBaUIsRUFBRSxDQUFDNEksd0JBQXdCLEVBQUU7VUFFbkQsTUFBTWthLGFBQWEsR0FBRyxJQUFJQyxNQUFNLENBQUM7WUFDaEM3UixLQUFLLEVBQUUsbUVBQW1FO1lBQzFFOFIsS0FBSyxFQUFFLFNBQVM7WUFDaEJDLE9BQU8sRUFBRSxJQUFJQyxJQUFJLENBQUM7Y0FBRW5qQixJQUFJLEVBQUU7WUFBc0UsQ0FBQyxDQUFDO1lBQ2xHb2pCLFdBQVcsRUFBRSxJQUFJQyxNQUFNLENBQUM7Y0FDdkJyakIsSUFBSSxFQUFFLGtDQUFrQztjQUN4Q1IsSUFBSSxFQUFFLFlBQVk7Y0FDbEI4akIsS0FBSyxFQUFFLE1BQVk7Z0JBQ2xCO2dCQUNBLElBQUksQ0FBQ3hCLGVBQWUsRUFBRTtnQkFDdEIsSUFBSSxDQUFDdFIsa0JBQWtCLEVBQUUsQ0FBQzhHLHVCQUF1QixDQUFDelMsYUFBYSxDQUFDO2NBQ2pFO1lBQ0QsQ0FBQyxDQUFDO1lBQ0YwZSxVQUFVLEVBQUUsWUFBa0I7Y0FDN0JSLGFBQWEsQ0FBQ25YLE9BQU8sRUFBRTtZQUN4QjtVQUNELENBQUMsQ0FBQztVQUNGbVgsYUFBYSxDQUFDUyxhQUFhLENBQUMscUJBQXFCLENBQUM7VUFDbERULGFBQWEsQ0FBQ1UsUUFBUSxDQUFDbEMsU0FBUyxFQUFFLGFBQWEsQ0FBQztVQUNoRCxJQUFJLENBQUM5a0IsT0FBTyxFQUFFLENBQUNpbkIsWUFBWSxDQUFDWCxhQUFhLENBQUM7VUFDMUNBLGFBQWEsQ0FBQ1ksSUFBSSxFQUFFO1FBQ3JCLENBQUMsQ0FBQyxPQUFPeG1CLEtBQWMsRUFBRTtVQUN4QkMsR0FBRyxDQUFDeWYsSUFBSSxDQUFDMWYsS0FBSyxDQUFXO1VBQ3pCLE9BQU9vRyxTQUFTO1FBQ2pCO1FBQ0EsT0FBTyxJQUFJO01BQ1osQ0FBQztJQUNGOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BTkM7SUFBQSxPQU9RcWUsdUJBQXVCLEdBQS9CLGlDQUFnQ3ZmLE9BQWdCLEVBQUVvTCxZQUEwQixFQUFFO01BQzdFLE9BQU8sTUFBWTtRQUNsQixNQUFNbVcsV0FBVyxHQUFHblcsWUFBWSxDQUFDOUMsY0FBYyxFQUFFLENBQUNrVyxPQUFPLEVBQUU7UUFDM0Q7UUFDQSxJQUFJLENBQUMrQyxXQUFXLElBQUksQ0FBQ25XLFlBQVksQ0FBQzlDLGNBQWMsRUFBRSxDQUFDaVksa0JBQWtCLENBQUNnQixXQUFXLENBQUMsRUFBRTtVQUNuRixJQUFJLENBQUNDLG9CQUFvQixDQUFDeGhCLE9BQU8sQ0FBQztVQUNsQ0EsT0FBTyxDQUFDOUMsUUFBUSxFQUFFLENBQUN1a0IsbUJBQW1CLEVBQUU7UUFDekM7TUFDRCxDQUFDO0lBQ0Y7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQSxPQUpDO0lBQUEsT0FLY0Qsb0JBQW9CLEdBQWxDLG9DQUFtQ3hoQixPQUFnQixFQUFpQjtNQUNuRSxNQUFNMGhCLGdCQUFnQixHQUFHLE1BQU1DLE1BQU0sQ0FBQ0MsZUFBZSxDQUFDNWhCLE9BQU8sQ0FBQztNQUM5RCxJQUFJMGhCLGdCQUFnQixhQUFoQkEsZ0JBQWdCLGVBQWhCQSxnQkFBZ0IsQ0FBRXhQLGlCQUFpQixFQUFFLEVBQUU7UUFDMUN3UCxnQkFBZ0IsQ0FBQ3hkLFVBQVUsRUFBRSxDQUFDMmQsWUFBWSxFQUFFO01BQzdDO01BQ0EsSUFBSSxDQUFDLElBQUksQ0FBQ3hQLGVBQWUsRUFBRSxFQUFFO1FBQzVCcVAsZ0JBQWdCLGFBQWhCQSxnQkFBZ0IsdUJBQWhCQSxnQkFBZ0IsQ0FBRTNjLE9BQU8sRUFBRTtNQUM1QjtNQUVBLElBQUksQ0FBQzBhLGVBQWUsRUFBRTtJQUN2Qjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBLE9BSkM7SUFBQSxPQUtRdFIsa0JBQWtCLEdBQTFCLDhCQUE4QztNQUM3QyxJQUFJLElBQUksQ0FBQ3JPLElBQUksQ0FBQ2dpQixRQUFRLEVBQUU7UUFDdkIsT0FBTyxJQUFJLENBQUNoaUIsSUFBSSxDQUFDZ2lCLFFBQVE7TUFDMUIsQ0FBQyxNQUFNO1FBQ04sTUFBTSxJQUFJMWtCLEtBQUssQ0FBQyxvREFBb0QsQ0FBQztNQUN0RTtJQUNELENBQUM7SUFBQSxPQUVEK0Msc0JBQXNCLEdBQXRCLGtDQUFpRDtNQUNoRCxPQUFPLElBQUksQ0FBQ3pGLGVBQWUsRUFBRSxDQUFDcW5CLHFCQUFxQixFQUFFO0lBQ3RELENBQUM7SUFBQSxPQUVENWEsbUJBQW1CLEdBQW5CLCtCQUFtRDtNQUNsRCxPQUFPLElBQUksQ0FBQ3pNLGVBQWUsRUFBRSxDQUFDNmEsaUJBQWlCLEVBQUUsQ0FBQ3lNLHNCQUFzQixFQUFFO0lBQzNFOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BTkM7SUFBQSxPQU9RbEosbUJBQW1CLEdBQTNCLDZCQUE0QnFGLFVBQWtCLEVBQUVyYSxTQUFpQixFQUFnRDtNQUNoSCxJQUFJbWUsZUFBeUIsRUFBRUMsY0FBd0I7TUFDdkQsSUFBSSxDQUFDQyxhQUFhLEdBQUcsSUFBSXJvQixPQUFPLENBQXlFLENBQUNDLE9BQU8sRUFBRStJLE1BQU0sS0FBSztRQUM3SG1mLGVBQWUsR0FBR2xvQixPQUFPO1FBQ3pCbW9CLGNBQWMsR0FBR3BmLE1BQU07TUFDeEIsQ0FBQyxDQUFDLENBQUN3RyxJQUFJLENBQUU4UCxTQUFrQixJQUFLO1FBQy9CLE9BQU9wTixNQUFNLENBQUNDLE1BQU0sQ0FDbkI7VUFBRW5JO1FBQVUsQ0FBQyxFQUNiLElBQUksQ0FBQzBWLDRCQUE0QixDQUNoQzJFLFVBQVUsRUFDVi9FLFNBQVMsQ0FDVCxDQUNEO01BQ0YsQ0FBQyxDQUFDO01BQ0YsT0FBTztRQUFFUyxTQUFTLEVBQUVvSSxlQUFnQjtRQUFFdkgsU0FBUyxFQUFFd0g7TUFBZ0IsQ0FBQztJQUNuRTs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FMQztJQUFBLE9BTVExSSw0QkFBNEIsR0FBcEMsc0NBQ0MyRSxVQUFrQixFQUNsQmlFLFFBQW1HLEVBQ2xDO01BQ2pFLElBQUl6SyxLQUFLLENBQUNDLE9BQU8sQ0FBQ3dLLFFBQVEsQ0FBQyxFQUFFO1FBQzVCLElBQUlBLFFBQVEsQ0FBQ3ZsQixNQUFNLElBQUksQ0FBQyxFQUFFO1VBQ3pCdWxCLFFBQVEsR0FBSUEsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUF3RDFJLEtBQUs7UUFDckYsQ0FBQyxNQUFNO1VBQ04sT0FBT3hZLFNBQVM7UUFDakI7TUFDRDtNQUNBLElBQUksQ0FBQ2toQixRQUFRLEVBQUU7UUFDZCxPQUFPbGhCLFNBQVM7TUFDakI7TUFDQSxNQUFNbWhCLFdBQVcsR0FBRyxJQUFJLENBQUN2aUIsSUFBSSxDQUFDMUYsT0FBTyxFQUFFO01BQ3ZDLE1BQU1rb0IsYUFBYSxHQUFJRCxXQUFXLENBQUNubEIsUUFBUSxFQUFFLENBQUNpQixZQUFZLEVBQUUsQ0FBQ3JDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBNkI7TUFDeEcsTUFBTXltQixlQUFlLEdBQUdELGFBQWEsQ0FBQ25FLFVBQVUsQ0FBa0M7TUFDbEYsTUFBTXFFLGdCQUFnQixHQUFHRCxlQUFlLGFBQWZBLGVBQWUsZUFBZkEsZUFBZSxDQUFHLENBQUMsQ0FBQyxDQUFDRSxXQUFXLEdBQUdGLGVBQWUsYUFBZkEsZUFBZSx1QkFBZkEsZUFBZSxDQUFHLENBQUMsQ0FBQyxDQUFDRSxXQUFXLENBQUNDLEtBQUssR0FBRyxJQUFJO01BQ3pHLE1BQU14VyxJQUFJLEdBQ1RzVyxnQkFBZ0IsSUFBS0YsYUFBYSxDQUFDRSxnQkFBZ0IsQ0FBeUIsR0FDeEVGLGFBQWEsQ0FBQ0UsZ0JBQWdCLENBQUMsQ0FBeUJHLElBQUksR0FDN0QsRUFBRTtNQUVOLE9BQU87UUFDTkMsS0FBSyxFQUFFUixRQUFRLENBQUN0YixTQUFTLEVBQUU7UUFDM0JvRjtNQUNELENBQUM7SUFDRixDQUFDO0lBQUEsT0FFSzJXLHVCQUF1QixHQUE3Qix5Q0FBNkg7TUFDNUgsT0FBTyxJQUFJLENBQUNWLGFBQWE7SUFDMUIsQ0FBQztJQUFBLE9BRURXLDBCQUEwQixHQUExQixzQ0FBbUM7TUFDbEMsSUFBSSxDQUFDWCxhQUFhLEdBQUdqaEIsU0FBUztJQUMvQixDQUFDO0lBQUEsT0FFSytWLGdDQUFnQyxHQUF0QyxnREFBdUM4TCxNQUFlLEVBQXlDO01BQUE7TUFDOUYsSUFBSSxDQUFDLElBQUksQ0FBQ0MsNEJBQTRCLEVBQUU7UUFDdkMsSUFBSSxDQUFDQSw0QkFBNEIsR0FBRyxJQUFJQyxnQ0FBZ0MsQ0FBQztVQUN4RXppQixJQUFJLEVBQUUsSUFBSSxDQUFDcEcsT0FBTztRQUNuQixDQUFDLENBQUM7TUFDSDtNQUNBLGdDQUFPLElBQUksQ0FBQzRvQiw0QkFBNEIsMERBQWpDLHNCQUFtQzFCLElBQUksQ0FBQ3lCLE1BQU0sQ0FBQztJQUN2RCxDQUFDO0lBQUEsT0FFREcsNEJBQTRCLEdBQTVCLHNDQUE2QmhvQixLQUFZLEVBQVE7TUFDaEQsTUFBTWlvQixVQUFVLEdBQUdqb0IsS0FBSyxDQUFDaUosYUFBYSxFQUFFO01BQ3hDLE1BQU1pZixjQUFzQixHQUFHRCxVQUFVLENBQUNFLFFBQVEsRUFBRSxJQUFJLENBQUM7TUFDekQsSUFBSW5vQixLQUFLLENBQUNHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxpQkFBaUIsRUFBRTtRQUNsRCxJQUFJK25CLGNBQWMsR0FBRyxDQUFDLEVBQUU7VUFDdkJsb0IsS0FBSyxDQUFDMlEsYUFBYSxDQUFDdVgsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUN4QztRQUNBbG9CLEtBQUssQ0FBQytTLFFBQVEsQ0FBQ21WLGNBQWMsRUFBRSxJQUFJLENBQUM7TUFDckMsQ0FBQyxNQUFNO1FBQ047QUFDSDtBQUNBO0FBQ0E7UUFDRyxNQUFNRSxjQUFjLEdBQUdILFVBQVUsQ0FBQ0ksV0FBVyxFQUFFO1FBQy9DLElBQUksRUFBQ0QsY0FBYyxhQUFkQSxjQUFjLGVBQWRBLGNBQWMsQ0FBRXptQixNQUFNLEdBQUU7VUFDNUIzQixLQUFLLENBQUMrUyxRQUFRLENBQUNtVixjQUFjLEVBQUUsSUFBSSxDQUFDO1VBQ3BDO1FBQ0Q7UUFDQSxJQUFJblYsUUFBUSxHQUFHbVYsY0FBYztVQUM1QkksS0FBSyxHQUFHLENBQUM7UUFDVixLQUFLLE1BQU1DLGFBQWEsSUFBSUgsY0FBYyxFQUFFO1VBQzNDLElBQUlHLGFBQWEsQ0FBQ3hmLFVBQVUsRUFBRSxJQUFJdWYsS0FBSyxHQUFHdlYsUUFBUSxFQUFFO1lBQ25EQSxRQUFRLEdBQUd1VixLQUFLO1VBQ2pCO1VBQ0FBLEtBQUssRUFBRTtRQUNSO1FBQ0EsSUFBSXZWLFFBQVEsR0FBRyxDQUFDLEVBQUU7VUFDakIvUyxLQUFLLENBQUMyUSxhQUFhLENBQUNvQyxRQUFRLENBQUM7UUFDOUI7UUFDQS9TLEtBQUssQ0FBQytTLFFBQVEsQ0FBQ0EsUUFBUSxFQUFFLElBQUksQ0FBQztNQUMvQjtJQUNELENBQUM7SUFBQSxPQUVLeVYsdUJBQXVCLEdBQTdCLHVDQUE4QnhvQixLQUFZLEVBQWlCO01BQUE7TUFDMUQsTUFBTXFLLFFBQVEsR0FBR3JLLEtBQUssQ0FBQ3NLLFNBQVMsRUFBYztNQUM5QyxJQUNDRCxRQUFRLGFBQVJBLFFBQVEseUNBQVJBLFFBQVEsQ0FBRUUsZUFBZSw2RUFBekIsdUJBQTJCQyxPQUFPLG1EQUFsQyx1QkFBb0NpZSxrQ0FBa0MsSUFDdEUsNEJBQUN6b0IsS0FBSyxDQUFDYixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsbURBQTdCLHVCQUErQmtCLFdBQVcsQ0FBQyxZQUFZLENBQUMsR0FDeEQ7UUFDRDtRQUNBLE1BQU1nSyxRQUFRLENBQUNPLGNBQWMsQ0FBQzVLLEtBQUssRUFBRSxJQUFJLENBQUM7TUFDM0M7TUFDQSxJQUFJLENBQUNnb0IsNEJBQTRCLENBQUNob0IsS0FBSyxDQUFDO0lBQ3pDLENBQUM7SUFBQSxPQUVENkssYUFBYSxHQUFiLHVCQUNDNlQsTUFBZ0IsRUFDaEJnSyxlQUF1RCxFQUN2REMsbUJBQTRCLEVBQzVCQyxrQkFBNEIsRUFDNUJySyx5QkFBb0MsRUFDN0I7TUFDUCxNQUFNb0gsT0FBTyxHQUFHbEosS0FBSyxDQUFDQyxPQUFPLENBQUNnTSxlQUFlLENBQUMsR0FBR0EsZUFBZSxDQUFDcFgsR0FBRyxDQUFFeE0sT0FBTyxJQUFLQSxPQUFPLENBQUNuRixPQUFPLEVBQUUsQ0FBQyxHQUFHK29CLGVBQWUsYUFBZkEsZUFBZSx1QkFBZkEsZUFBZSxDQUFFL29CLE9BQU8sRUFBRTtNQUNqSSxJQUFJLENBQUNpRixJQUFJLENBQUNvTCxrQkFBa0IsQ0FBQzZZLElBQUksQ0FBQztRQUFFbkssTUFBTTtRQUFFaUgsT0FBTztRQUFFZ0QsbUJBQW1CO1FBQUVDLGtCQUFrQjtRQUFFcks7TUFBMEIsQ0FBQyxDQUFDO0lBQzNILENBQUM7SUFBQSxPQUVEaEgsd0JBQXdCLEdBQXhCLGtDQUF5QjRFLFdBQW1CLEVBQUUyTSxXQUF3QixFQUFRO01BQzdFQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUNua0IsSUFBSSxDQUFDMUYsT0FBTyxFQUFFLEVBQUVpZCxXQUFXLEVBQUUyTSxXQUFXLENBQUM7SUFDdkUsQ0FBQztJQUFBLE9BRUtuUyxrQkFBa0IsR0FBeEIsa0NBQXlCTixRQUFpQixFQUFpQjtNQUMxRCxNQUFNMlMsTUFBTSxHQUFHM1MsUUFBUSxDQUFDclUsUUFBUSxFQUFFO1FBQ2pDNFosV0FBVyxHQUFHLElBQUksQ0FBQ25ULGdCQUFnQixFQUFFO01BRXRDLElBQUk7UUFDSDtRQUNBO1FBQ0EsTUFBTXVnQixNQUFNLENBQUN4aUIsV0FBVyxDQUFDLE9BQU8sQ0FBQzs7UUFFakM7UUFDQTtRQUNBO1FBQ0EsTUFBT3dpQixNQUFNLENBQUNDLFVBQVUsQ0FBMkRDLDRCQUE0QixDQUFDLE9BQU8sQ0FBQzs7UUFFeEg7UUFDQSxJQUFJRixNQUFNLENBQUNoUyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtVQUN0QyxNQUFNLElBQUk5VSxLQUFLLENBQUMsK0JBQStCLENBQUM7UUFDakQ7TUFDRCxDQUFDLFNBQVM7UUFDVCxJQUFJaUgsVUFBVSxDQUFDc0osUUFBUSxDQUFDbUosV0FBVyxDQUFDLEVBQUU7VUFDckN6UyxVQUFVLENBQUM2QixNQUFNLENBQUM0USxXQUFXLENBQUM7UUFDL0I7TUFDRDtJQUNELENBQUM7SUFBQSxPQUVEeEUsc0NBQXNDLEdBQXRDLGdEQUF1Q2xVLGdCQUF3QixFQUFRO01BQ3RFLElBQUlBLGdCQUFnQixLQUFLdEYsZ0JBQWdCLENBQUM2SCxNQUFNLEVBQUU7UUFDakQsTUFBTThkLGFBQWEsR0FBRyxJQUFJLENBQUM3VCxnQkFBZ0IsRUFBRTtRQUM3QzZULGFBQWEsQ0FBQzVULFdBQVcsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDO1FBQzlDNFQsYUFBYSxDQUFDNVQsV0FBVyxDQUFDLHFCQUFxQixFQUFFM0osU0FBUyxDQUFDO1FBQzNELElBQUksQ0FBQ3VlLGVBQWUsRUFBRTtNQUN2QjtJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsT0FKQztJQUFBLE9BS1FaLHlCQUF5QixHQUFqQyxtQ0FBa0M3ZSxPQUFnQixFQUFRO01BQ3pELE1BQU1RLElBQUksR0FBRyxJQUFJLENBQUNWLElBQUksQ0FBQzFGLE9BQU8sRUFBRTtNQUNoQyxNQUFNOGxCLFdBQVcsR0FBRyxJQUFJLENBQUN4bEIsZUFBZSxFQUFFLENBQUM0TixjQUFjLEVBQUU7TUFFM0QsSUFBSTRYLFdBQVcsQ0FBQ21FLHVCQUF1QixFQUFFLEVBQUU7UUFDMUMxQyxNQUFNLENBQUMyQywyQkFBMkIsQ0FDakMsWUFBWTtVQUNYLE1BQU0sSUFBSSxDQUFDOUMsb0JBQW9CLENBQUN4aEIsT0FBTyxDQUFDO1VBQ3hDLElBQUksQ0FBQ3NTLHNDQUFzQyxDQUFDeFosZ0JBQWdCLENBQUM2SCxNQUFNLENBQUM7VUFDcEU0akIsT0FBTyxDQUFDQyxJQUFJLEVBQUU7UUFDZixDQUFDLEVBQ0Roa0IsSUFBSSxFQUNKMUgsZ0JBQWdCLENBQUM2SCxNQUFNLENBQ3ZCO1FBRUQ7TUFDRDtNQUNBNGpCLE9BQU8sQ0FBQ0MsSUFBSSxFQUFFO0lBQ2YsQ0FBQztJQUFBLE9BRUtwaUIsaUJBQWlCLEdBQXZCLGlDQUNDbVAsUUFBaUIsRUFDakJrVCxvQkFBMkYsRUFDM0U7TUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQ3pqQixhQUFhLEVBQUUsRUFBRTtRQUMxQmdFLFNBQVMsQ0FBQ0MsaUJBQWlCLEVBQUU7TUFDOUI7TUFFQSxNQUFNLElBQUksQ0FBQ2tKLGtCQUFrQixFQUFFLENBQUNlLGlCQUFpQixDQUFDcUMsUUFBUSxFQUFFO1FBQzNEK0ksaUJBQWlCLEVBQUUsSUFBSTtRQUN2QmpZLFFBQVEsRUFBRW9pQixvQkFBb0IsQ0FBQ3BpQixRQUFRO1FBQ3ZDcWlCLGVBQWUsRUFBRSxJQUFJO1FBQ3JCcGlCLGVBQWUsRUFBRW1pQixvQkFBb0IsQ0FBQ25pQixlQUFlO1FBQ3JEcWlCLE1BQU0sRUFBRUMsZ0JBQWdCLENBQUNDLGNBQWM7UUFDdkNDLGVBQWUsRUFBRSxLQUFLO1FBQ3RCdmlCLFVBQVUsRUFBRWtpQixvQkFBb0IsQ0FBQ2xpQixVQUFVLElBQUksS0FBSztRQUNwRHdpQixpQkFBaUIsRUFBRTtNQUNwQixDQUFDLENBQUM7SUFDSCxDQUFDO0lBQUEsT0FFRDlMLGdCQUFnQixHQUFoQiwwQkFBaUJ6WSxJQUFZLEVBQUVnSyxNQUFxRCxFQUFXO01BQzlGLE1BQU05SixTQUFTLEdBQUdGLElBQUksQ0FBQ0YsV0FBVyxFQUFFLENBQUNJLFNBQVM7TUFDOUMsTUFBTXNrQixtQkFBbUIsR0FBR3RrQixTQUFTLEdBQUcsQ0FBQyxJQUFLQSxTQUFTLEtBQUssQ0FBQyxJQUFJOEosTUFBTSxDQUFDMUcsU0FBVTtNQUNsRixPQUFPLENBQUMwRyxNQUFNLENBQUNxTixXQUFXLElBQUksQ0FBQyxDQUFDbU4sbUJBQW1CO0lBQ3BEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsT0FKQztJQUFBLE9BTU1yWix5QkFBeUIsR0FBL0IsMkNBQXNFO01BQ3JFLE9BQU8sSUFBSSxDQUFDbEYsUUFBUSxFQUFFLENBQUM2QyxJQUFJLENBQUMsTUFBTTtRQUNqQyxNQUFNMmIsT0FBTyxHQUFHLElBQUksQ0FBQzdxQixPQUFPLEVBQUUsQ0FBQzJlLEtBQUssRUFBRTtRQUN0QyxNQUFNbU0sU0FBUyxHQUFHdHBCLFNBQVMsQ0FBQ0MsZUFBZSxFQUFFLENBQUNDLE9BQU8sRUFBRTtRQUN2RCxJQUFJcWMsUUFBUTtRQUVaLElBQUksQ0FBQytNLFNBQVMsQ0FBQ3JvQixNQUFNLEVBQUU7VUFDdEI5QixHQUFHLENBQUN5ZixJQUFJLENBQUMsNEJBQTRCLENBQUM7VUFDdEM7UUFDRDtRQUVBLEtBQUssTUFBTXhlLE9BQU8sSUFBSWtwQixTQUFTLEVBQUU7VUFDaEMsSUFBSWxwQixPQUFPLENBQUNtcEIsVUFBVSxFQUFFO1lBQ3ZCaE4sUUFBUSxHQUFHN2IsT0FBTyxDQUFDQyxjQUFjLENBQUNQLE9BQU8sQ0FBQ29wQixZQUFZLEVBQUUsQ0FBQztZQUN6RCxPQUFPak4sUUFBUSxFQUFFO2NBQ2hCLElBQUlBLFFBQVEsQ0FBQ1ksS0FBSyxFQUFFLEtBQUtrTSxPQUFPLEVBQUU7Z0JBQ2pDLE1BQU0seUJBQXlCO2NBQ2hDO2NBQ0E5TSxRQUFRLEdBQUdBLFFBQVEsQ0FBQzNTLFNBQVMsRUFBRTtZQUNoQztVQUNEO1FBQ0Q7UUFDQTtNQUNELENBQUMsQ0FBQztJQUNIOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BTkM7SUFBQSxPQU9NK1Qsc0JBQXNCLEdBQTVCLHNDQUNDSCxTQUF1RSxFQUN2RTdILFFBQWtCLEVBQ2E7TUFDL0IsSUFBSSxDQUFDQSxRQUFRLElBQUksQ0FBQzZILFNBQVMsSUFBSSxDQUFDQSxTQUFTLENBQUN3SixLQUFLLElBQUksQ0FBQ3hKLFNBQVMsQ0FBQ2xOLElBQUksRUFBRTtRQUNuRSxPQUFPcFMsT0FBTyxDQUFDQyxPQUFPLENBQUNtSCxTQUFTLENBQUM7TUFDbEM7TUFDQSxNQUFNbWtCLFFBQVEsR0FBRzlULFFBQVEsQ0FBQ3JOLFVBQVUsRUFBRTtNQUN0QztNQUNBLElBQUltaEIsUUFBUSxJQUFJQSxRQUFRLENBQUNyaEIsR0FBRyxDQUFtQix3Q0FBd0MsQ0FBQyxFQUFFO1FBQ3pGLE1BQU0wUCxZQUFZLEdBQUcwRixTQUFTLENBQUN3SixLQUFLO1FBQ3BDLE1BQU0wQyxLQUFLLEdBQUdsTSxTQUFTLENBQUNsTixJQUFJO1FBQzVCLE1BQU1xWixZQUFZLEdBQUdoVSxRQUFRLENBQUN6SyxTQUFTLEVBQUU7UUFDekMsSUFBSTBlLHNCQUFzQixHQUFHLElBQUk7UUFDakM7UUFDQSxJQUFJeFosTUFBTSxDQUFDRSxJQUFJLENBQUN3SCxZQUFZLENBQUMsQ0FBQzdXLE1BQU0sRUFBRTtVQUNyQztVQUNBMm9CLHNCQUFzQixHQUFHRixLQUFLLENBQUNHLEtBQUssQ0FBQyxVQUFVQyxJQUFZLEVBQVc7WUFDckUsT0FBT0gsWUFBWSxDQUFDRyxJQUFJLENBQUMsS0FBS2hTLFlBQVksQ0FBQ2dTLElBQUksQ0FBQztVQUNqRCxDQUFDLENBQUM7VUFDRixJQUFJLENBQUNGLHNCQUFzQixFQUFFO1lBQzVCLE9BQU8sSUFBSTFyQixPQUFPLENBQVdDLE9BQU8sSUFBSztjQUN4QyxNQUFNcVIsWUFBWSxHQUFHLElBQUksQ0FBQzFRLGVBQWUsRUFBRTtjQUMzQyxJQUFJMnFCLFFBQVEsQ0FBQzFnQixNQUFNLEVBQUUsRUFBRTtnQkFDdEIsSUFBSSxJQUFJLENBQUNqRixvQkFBb0IsRUFBRSxDQUFDMEQseUJBQXlCLENBQUNpaUIsUUFBUSxDQUFDLEVBQUU7a0JBQ3BFO2tCQUNBamEsWUFBWSxDQUNWelEscUJBQXFCLEVBQUUsQ0FDdkIwSSxrQkFBa0IsQ0FBQyxDQUFDO29CQUFFdUIsdUJBQXVCLEVBQUU7a0JBQUcsQ0FBQyxDQUFDLEVBQUV5Z0IsUUFBUSxDQUFDeGdCLGdCQUFnQixFQUFFLENBQUUsQ0FDbkZ5RSxJQUFJLENBQUMsTUFBTTtvQkFDWHZQLE9BQU8sQ0FBQyxJQUFJLENBQUM7b0JBQ2I7a0JBQ0QsQ0FBQyxDQUFDLENBQ0R5VCxLQUFLLENBQUVtWSxDQUFVLElBQUs7b0JBQ3RCNXFCLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDLGtDQUFrQyxFQUFFNnFCLENBQUMsQ0FBVztvQkFDMUQ1ckIsT0FBTyxDQUFDLElBQUksQ0FBQztrQkFDZCxDQUFDLENBQUM7Z0JBQ0osQ0FBQyxNQUFNO2tCQUNOc3JCLFFBQVEsQ0FBQ3ZnQixlQUFlLENBQUMsY0FBYyxFQUFFLFlBQVk7b0JBQ3BEL0ssT0FBTyxDQUFDLElBQUksQ0FBQztrQkFDZCxDQUFDLENBQUM7a0JBQ0ZzckIsUUFBUSxDQUFDdGdCLE9BQU8sRUFBRTtnQkFDbkI7Y0FDRCxDQUFDLE1BQU07Z0JBQ05xRyxZQUFZLENBQ1Z6USxxQkFBcUIsRUFBRSxDQUN2QjBJLGtCQUFrQixDQUFDLENBQUM7a0JBQUV1Qix1QkFBdUIsRUFBRXlnQixRQUFRLENBQUN4cUIsT0FBTztnQkFBRyxDQUFDLENBQUMsRUFBRXdxQixRQUFRLENBQUN4YyxVQUFVLEVBQUUsQ0FBQyxDQUM1RlMsSUFBSSxDQUFDLE1BQU07a0JBQ1h2UCxPQUFPLENBQUMsSUFBSSxDQUFDO2tCQUNiO2dCQUNELENBQUMsQ0FBQyxDQUNEeVQsS0FBSyxDQUFFbVksQ0FBVSxJQUFLO2tCQUN0QjVxQixHQUFHLENBQUNELEtBQUssQ0FBQyxrQ0FBa0MsRUFBRTZxQixDQUFDLENBQVc7a0JBQzFENXJCLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQyxDQUFDO2NBQ0o7WUFDRCxDQUFDLENBQUM7VUFDSDtRQUNEO01BQ0Q7TUFDQTtNQUNBLE9BQU9ELE9BQU8sQ0FBQ0MsT0FBTyxDQUFDbUgsU0FBUyxDQUFDO0lBQ2xDLENBQUM7SUFBQSxPQUVLaVUsdUJBQXVCLEdBQTdCLHVDQUE4QjVELFFBQWlCLEVBQW9CO01BQ2xFLE1BQU13SSxVQUFVLEdBQUd4SSxRQUFRLENBQUNyVSxRQUFRLEVBQUUsQ0FBQ2lCLFlBQVksRUFBRTtRQUNwRHluQixjQUFjLEdBQUc3TCxVQUFVLENBQUN0YixjQUFjLENBQUM4UyxRQUFRLENBQUMxVyxPQUFPLEVBQUUsQ0FBQyxDQUFDaU0sU0FBUyxDQUFDLGFBQWEsQ0FBQztRQUN2RitlLGFBQWEsR0FBRzdlLGlCQUFpQixDQUFDQyxlQUFlLENBQUM4UyxVQUFVLEVBQUU2TCxjQUFjLENBQUM7TUFFOUUsSUFBSUMsYUFBYSxJQUFJQSxhQUFhLENBQUNocEIsTUFBTSxFQUFFO1FBQzFDLE1BQU1pcEIsZ0JBQWdCLEdBQUdELGFBQWEsQ0FBQ3JaLEdBQUcsQ0FBQyxnQkFBZ0J1WixJQUErQixFQUFtQjtVQUM1RyxPQUFPeFUsUUFBUSxDQUFDb0wsYUFBYSxDQUFDb0osSUFBSSxDQUFDQyxhQUFhLENBQUM7UUFDbEQsQ0FBQyxDQUFDO1FBRUYsT0FBT2xzQixPQUFPLENBQUM4VCxHQUFHLENBQUNrWSxnQkFBZ0IsQ0FBQztNQUNyQyxDQUFDLE1BQU07UUFDTixPQUFPaHNCLE9BQU8sQ0FBQ0MsT0FBTyxFQUFFO01BQ3pCO0lBQ0Q7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVZDO0lBQUEsT0FXQTZlLHlDQUF5QyxHQUF6QyxtREFBMENyWSxXQUFvQixFQUFFdEcsV0FBNkIsRUFBRWdzQixrQkFBMEIsRUFBVztNQUNuSSxNQUFNN2xCLEtBQWlCLEdBQUdHLFdBQVcsQ0FBQ3JELFFBQVEsRUFBRTtNQUNoRCxNQUFNZ0IsU0FBeUIsR0FBR2tDLEtBQUssQ0FBQ2pDLFlBQVksRUFBRTtNQUN0RCxJQUFJK25CLGVBQXlCLEdBQUdqc0IsV0FBVyxDQUFDWSxPQUFPLEVBQUUsQ0FBQ3lkLEtBQUssQ0FBQyxHQUFHLENBQUM7TUFDaEUsSUFBSTZOLGNBQXVCLEdBQUc1bEIsV0FBVzs7TUFFekM7TUFDQTtNQUNBMmxCLGVBQWUsQ0FBQ0UsR0FBRyxFQUFFO01BQ3JCLElBQUlGLGVBQWUsQ0FBQ3JwQixNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2pDcXBCLGVBQWUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFDekI7O01BRUEsSUFBSUEsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUM5QkEsZUFBZSxDQUFDRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUM5QjtNQUNBO01BQ0EsTUFBTUMsY0FBeUIsR0FBR0osZUFBZSxDQUMvQzFaLEdBQUcsQ0FBRStaLFdBQW1CLElBQUs7UUFDN0IsSUFBSUEsV0FBVyxLQUFLLEVBQUUsRUFBRTtVQUN2QkosY0FBYyxHQUFHL2xCLEtBQUssQ0FBQzZWLFdBQVcsQ0FBQ3NRLFdBQVcsRUFBRUosY0FBYyxDQUFDLENBQUNqUSxlQUFlLEVBQUU7UUFDbEYsQ0FBQyxNQUFNO1VBQ047VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0FpUSxjQUFjLEdBQUc1bEIsV0FBVztRQUM3QjtRQUNBLE9BQU80bEIsY0FBYztNQUN0QixDQUFDLENBQUMsQ0FDREssT0FBTyxFQUFFO01BQ1g7TUFDQSxNQUFNQyxlQUFvQyxHQUFHSCxjQUFjLENBQUNJLElBQUksQ0FDOUQxakIsYUFBc0IsSUFDckI5RSxTQUFTLENBQUNPLGNBQWMsQ0FBQ3VFLGFBQWEsQ0FBQ25JLE9BQU8sRUFBRSxDQUFDLENBQUNpTSxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQTJCbWYsa0JBQWtCLENBQ25IO01BQ0QsT0FBT1EsZUFBZSxJQUFJeHNCLFdBQVcsQ0FBQzRLLGdCQUFnQixFQUFHO0lBQzFELENBQUM7SUFBQSxPQUVEbU8sa0JBQWtCLEdBQWxCLDRCQUFtQm1ULGNBQXVCLEVBQUU3ckIsVUFBbUIsRUFBc0I7TUFDcEYsT0FBTztRQUNOZ1osYUFBYSxFQUFFaFosVUFBVTtRQUN6QjZZLFdBQVcsRUFBRSxDQUNaO1VBQ0NDLE9BQU8sRUFBRStTLGNBQWMsQ0FBQ3RyQixPQUFPLEVBQUU7VUFDakN3WSxPQUFPLEVBQUUvWSxVQUFVLENBQUNPLE9BQU87UUFDNUIsQ0FBQztNQUVILENBQUM7SUFDRixDQUFDO0lBQUEsT0FFRGtILHFCQUFxQixHQUFyQiwrQkFBc0I0a0IsUUFBZ0QsRUFBUTtNQUM3RSxNQUFNN1EsYUFBYSxHQUFHLElBQUksQ0FBQ3BiLGVBQWUsRUFBRTtNQUM1Q29iLGFBQWEsQ0FBQ3hOLGNBQWMsRUFBRSxDQUFDc2UsY0FBYyxDQUFDRCxRQUFRLENBQUM7O01BRXZEO01BQ0EsTUFBTTFTLG1CQUFtQixHQUFHLElBQUksQ0FBQzlNLG1CQUFtQixFQUFFO01BQ3RELElBQUl3ZixRQUFRLENBQUM5cEIsTUFBTSxJQUFJLENBQUFvWCxtQkFBbUIsYUFBbkJBLG1CQUFtQix1QkFBbkJBLG1CQUFtQixDQUFFQyxhQUFhLE1BQUt5UyxRQUFRLENBQUNBLFFBQVEsQ0FBQzlwQixNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUN1VyxPQUFPLEVBQUU7UUFDcEdhLG1CQUFtQixDQUFDQyxhQUFhLEdBQUd5UyxRQUFRLENBQUNBLFFBQVEsQ0FBQzlwQixNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUN3VyxPQUFPO01BQzFFO0lBQ0QsQ0FBQztJQUFBLE9BRUR2UiwyQkFBMkIsR0FBM0IscUNBQ0M5QixPQUFnQixFQUNoQjRCLGtCQUEyQixFQUMzQkQsV0FBMkMsRUFDckI7TUFDdEIsSUFBSUUsaUJBQXNDO01BQzFDRixXQUFXLEdBQUdBLFdBQVcsSUFBSSxJQUFJLENBQUNxUixrQkFBa0IsQ0FBQ2hULE9BQU8sRUFBRTRCLGtCQUFrQixDQUFDO01BQ2pGLElBQUksQ0FBQ0cscUJBQXFCLENBQUNKLFdBQVcsQ0FBQ3dSLFdBQVcsQ0FBQztNQUNuRCxJQUFJeFIsV0FBVyxDQUFDMlIsYUFBYSxDQUFDelksT0FBTyxFQUFFLElBQUkrRyxrQkFBa0IsQ0FBQy9HLE9BQU8sRUFBRSxFQUFFO1FBQ3hFZ0gsaUJBQWlCLEdBQUdGLFdBQVcsQ0FBQzJSLGFBQWE7TUFDOUM7TUFDQSxPQUFPelIsaUJBQWlCO0lBQ3pCOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVhDO0lBQUEsT0FZTUosMEJBQTBCLEdBQWhDLDBDQUNDb2xCLGtCQUEyQixFQUMzQkMsdUJBQW1ELEVBQ25EOVUsaUJBQXlCLEVBQ3pCK1Usa0JBQTJCLEVBQzNCM2xCLGVBQWlDLEVBQ2pDWCxPQUFnQixFQUMwQjtNQUMxQ3FtQix1QkFBdUIsR0FBR0EsdUJBQXVCLElBQUlELGtCQUFrQjtNQUN2RSxJQUFJLENBQUNDLHVCQUF1QixDQUFDanNCLE9BQU8sRUFBRSxDQUFDbXNCLFVBQVUsQ0FBQ0gsa0JBQWtCLENBQUNoc0IsT0FBTyxFQUFFLENBQUMsRUFBRTtRQUNoRjtRQUNBRSxHQUFHLENBQUNELEtBQUssQ0FBQywwQ0FBMEMsQ0FBQztRQUNyRCxNQUFNLElBQUlzQyxLQUFLLENBQUMsMENBQTBDLENBQUM7TUFDNUQ7TUFDQSxJQUFJNnBCLHFCQUFxQixHQUFHSCx1QkFBdUI7TUFDbkQsSUFBSTlVLGlCQUFpQixLQUFLbFosZ0JBQWdCLENBQUMrRixLQUFLLElBQUksSUFBSSxDQUFDUixtQkFBbUIsQ0FBQ3lvQix1QkFBdUIsQ0FBQyxLQUFLaHVCLGdCQUFnQixDQUFDK0YsS0FBSyxFQUFFO1FBQ2pJO1FBQ0Fvb0IscUJBQXFCLEdBQUdKLGtCQUFrQjtNQUMzQztNQUNBLElBQUlFLGtCQUFrQixJQUFJRSxxQkFBcUIsQ0FBQ3BzQixPQUFPLEVBQUUsS0FBS2dzQixrQkFBa0IsQ0FBQ2hzQixPQUFPLEVBQUUsRUFBRTtRQUMzRixPQUFPZixPQUFPLENBQUNDLE9BQU8sQ0FBQ21ILFNBQVMsQ0FBQztNQUNsQztNQUVBLE1BQU1kLEtBQUssR0FBR3ltQixrQkFBa0IsQ0FBQzNwQixRQUFRLEVBQUU7TUFDM0MsSUFBSThVLGlCQUFpQixLQUFLbFosZ0JBQWdCLENBQUMrRixLQUFLLEVBQUU7UUFDakQsT0FBT3FvQixLQUFLLENBQUNDLHlCQUF5QixDQUFDTixrQkFBa0IsRUFBRUkscUJBQXFCLEVBQUU3bEIsZUFBZSxFQUFFWCxPQUFPLENBQUM7TUFDNUcsQ0FBQyxNQUFNO1FBQ047UUFDQTtRQUNBLE9BQU87VUFDTjZTLGFBQWEsRUFBRWxULEtBQUssQ0FBQzZWLFdBQVcsQ0FBQzZRLHVCQUF1QixDQUFDanNCLE9BQU8sRUFBRSxDQUFDLENBQUNxYixlQUFlLEVBQUU7VUFDckYvQyxXQUFXLEVBQUU7UUFDZCxDQUFDO01BQ0Y7SUFDRCxDQUFDO0lBQUEsT0FFRG5TLGFBQWEsR0FBYix5QkFBeUI7TUFDeEIsT0FBTyxJQUFJLENBQUN0RyxlQUFlLEVBQUUsQ0FBQ3NHLGFBQWEsRUFBRTtJQUM5QyxDQUFDO0lBQUEsT0FFSytRLHlCQUF5QixHQUEvQiwyQ0FBcUY7TUFDcEYsSUFBSUQsMkJBQTJCO01BQy9CLElBQUksSUFBSSxDQUFDaFMsSUFBSSxDQUFDcUYsZUFBZSxDQUFDNFIsMkJBQTJCLEVBQUUsRUFBRTtRQUM1RGpGLDJCQUEyQixHQUFHLE1BQU0sSUFBSSxDQUFDbUYsZ0NBQWdDLENBQUMsSUFBSSxDQUFDO1FBQy9FLElBQUluRiwyQkFBMkIsS0FBS29GLDRCQUE0QixDQUFDQyxRQUFRLEVBQUU7VUFDMUUsT0FBT3JkLE9BQU8sQ0FBQ2dKLE1BQU0sQ0FBQ29VLDRCQUE0QixDQUFDQyxRQUFRLENBQUM7UUFDN0Q7TUFDRDtNQUNBLE9BQU9yRiwyQkFBMkI7SUFDbkMsQ0FBQztJQUFBO0VBQUEsRUE5MEdxQnNWLHVCQUF1QjtFQUFBLE9BaTFHL0IvdEIsUUFBUTtBQUFBIn0=
|