parse-server 4.10.2 → 5.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/README.md +450 -153
  2. package/lib/AccountLockout.js +23 -2
  3. package/lib/Adapters/AdapterLoader.js +1 -1
  4. package/lib/Adapters/Analytics/AnalyticsAdapter.js +1 -1
  5. package/lib/Adapters/Auth/AuthAdapter.js +1 -1
  6. package/lib/Adapters/Auth/OAuth1Client.js +1 -1
  7. package/lib/Adapters/Auth/facebook.js +110 -10
  8. package/lib/Adapters/Auth/gcenter.js +1 -1
  9. package/lib/Adapters/Auth/gpgames.js +1 -1
  10. package/lib/Adapters/Auth/instagram.js +4 -2
  11. package/lib/Adapters/Auth/keycloak.js +1 -1
  12. package/lib/Adapters/Auth/ldap.js +3 -1
  13. package/lib/Adapters/Auth/oauth2.js +1 -1
  14. package/lib/Adapters/Auth/phantauth.js +1 -1
  15. package/lib/Adapters/Cache/CacheAdapter.js +1 -1
  16. package/lib/Adapters/Cache/RedisCacheAdapter.js +143 -0
  17. package/lib/Adapters/Cache/SchemaCache.js +31 -0
  18. package/lib/Adapters/Email/MailAdapter.js +1 -1
  19. package/lib/Adapters/Files/FilesAdapter.js +1 -1
  20. package/lib/Adapters/Files/GridFSBucketAdapter.js +1 -1
  21. package/lib/Adapters/Files/GridStoreAdapter.js +1 -1
  22. package/lib/Adapters/Logger/LoggerAdapter.js +1 -1
  23. package/lib/Adapters/Logger/WinstonLogger.js +4 -4
  24. package/lib/Adapters/PubSub/EventEmitterPubSub.js +5 -1
  25. package/lib/Adapters/PubSub/PubSubAdapter.js +1 -1
  26. package/lib/Adapters/Push/PushAdapter.js +1 -1
  27. package/lib/Adapters/Storage/Mongo/MongoCollection.js +1 -1
  28. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +1 -1
  29. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +51 -11
  30. package/lib/Adapters/Storage/Mongo/MongoTransform.js +9 -6
  31. package/lib/Adapters/Storage/Postgres/PostgresClient.js +11 -1
  32. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +91 -57
  33. package/lib/Adapters/WebSocketServer/WSAdapter.js +1 -1
  34. package/lib/Adapters/WebSocketServer/WSSAdapter.js +1 -1
  35. package/lib/Auth.js +2 -39
  36. package/lib/Config.js +149 -8
  37. package/lib/Controllers/AdaptableController.js +1 -9
  38. package/lib/Controllers/CacheController.js +1 -1
  39. package/lib/Controllers/DatabaseController.js +148 -44
  40. package/lib/Controllers/FilesController.js +1 -1
  41. package/lib/Controllers/HooksController.js +2 -2
  42. package/lib/Controllers/LiveQueryController.js +16 -3
  43. package/lib/Controllers/LoggerController.js +1 -1
  44. package/lib/Controllers/ParseGraphQLController.js +2 -2
  45. package/lib/Controllers/PushController.js +1 -1
  46. package/lib/Controllers/SchemaController.js +101 -88
  47. package/lib/Controllers/UserController.js +16 -5
  48. package/lib/Controllers/index.js +10 -11
  49. package/lib/Deprecator/Deprecations.js +28 -0
  50. package/lib/Deprecator/Deprecator.js +135 -0
  51. package/lib/GraphQL/ParseGraphQLSchema.js +71 -39
  52. package/lib/GraphQL/ParseGraphQLServer.js +3 -3
  53. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +2 -2
  54. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +2 -2
  55. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +4 -7
  56. package/lib/GraphQL/loaders/defaultRelaySchema.js +3 -3
  57. package/lib/GraphQL/loaders/filesMutations.js +2 -2
  58. package/lib/GraphQL/loaders/functionsMutations.js +9 -5
  59. package/lib/GraphQL/loaders/parseClassMutations.js +21 -9
  60. package/lib/GraphQL/loaders/parseClassQueries.js +9 -6
  61. package/lib/GraphQL/loaders/parseClassTypes.js +5 -5
  62. package/lib/GraphQL/loaders/schemaDirectives.js +1 -1
  63. package/lib/GraphQL/loaders/schemaMutations.js +8 -6
  64. package/lib/GraphQL/loaders/schemaQueries.js +6 -4
  65. package/lib/GraphQL/loaders/usersMutations.js +65 -7
  66. package/lib/GraphQL/transformers/constraintType.js +2 -2
  67. package/lib/GraphQL/transformers/inputType.js +2 -2
  68. package/lib/GraphQL/transformers/mutation.js +45 -10
  69. package/lib/GraphQL/transformers/outputType.js +2 -2
  70. package/lib/GraphQL/transformers/query.js +2 -2
  71. package/lib/GraphQL/transformers/schemaFields.js +1 -1
  72. package/lib/KeyPromiseQueue.js +59 -0
  73. package/lib/LiveQuery/Client.js +1 -1
  74. package/lib/LiveQuery/Id.js +1 -1
  75. package/lib/LiveQuery/ParseLiveQueryServer.js +158 -38
  76. package/lib/LiveQuery/ParseWebSocketServer.js +2 -2
  77. package/lib/LiveQuery/QueryTools.js +50 -1
  78. package/lib/LiveQuery/equalObjects.js +1 -1
  79. package/lib/Options/Definitions.js +220 -33
  80. package/lib/Options/docs.js +79 -21
  81. package/lib/Options/index.js +3 -1
  82. package/lib/Page.js +53 -0
  83. package/lib/ParseServer.js +37 -16
  84. package/lib/ParseServerRESTController.js +55 -45
  85. package/lib/PromiseRouter.js +7 -20
  86. package/lib/Push/PushQueue.js +1 -1
  87. package/lib/Push/PushWorker.js +2 -2
  88. package/lib/Push/utils.js +1 -1
  89. package/lib/RestQuery.js +45 -9
  90. package/lib/RestWrite.js +60 -10
  91. package/lib/Routers/AggregateRouter.js +23 -18
  92. package/lib/Routers/AudiencesRouter.js +2 -2
  93. package/lib/Routers/ClassesRouter.js +11 -11
  94. package/lib/Routers/CloudCodeRouter.js +1 -1
  95. package/lib/Routers/FeaturesRouter.js +2 -2
  96. package/lib/Routers/FilesRouter.js +34 -7
  97. package/lib/Routers/FunctionsRouter.js +2 -2
  98. package/lib/Routers/GlobalConfigRouter.js +2 -2
  99. package/lib/Routers/GraphQLRouter.js +3 -3
  100. package/lib/Routers/HooksRouter.js +2 -2
  101. package/lib/Routers/LogsRouter.js +2 -2
  102. package/lib/Routers/PagesRouter.js +722 -0
  103. package/lib/Routers/PurgeRouter.js +2 -2
  104. package/lib/Routers/PushRouter.js +3 -3
  105. package/lib/Routers/SchemasRouter.js +2 -2
  106. package/lib/Routers/SecurityRouter.js +47 -0
  107. package/lib/Routers/SessionsRouter.js +4 -2
  108. package/lib/Routers/UsersRouter.js +88 -17
  109. package/lib/Security/Check.js +118 -0
  110. package/lib/Security/CheckGroup.js +54 -0
  111. package/lib/Security/CheckGroups/CheckGroupDatabase.js +57 -0
  112. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +82 -0
  113. package/lib/Security/CheckGroups/CheckGroups.js +24 -0
  114. package/lib/Security/CheckRunner.js +236 -0
  115. package/lib/StatusHandler.js +27 -36
  116. package/lib/TestUtils.js +1 -1
  117. package/lib/Utils.js +226 -0
  118. package/lib/batch.js +55 -44
  119. package/lib/cli/utils/commander.js +8 -3
  120. package/lib/cloud-code/HTTPResponse.js +1 -1
  121. package/lib/cloud-code/Parse.Cloud.js +155 -19
  122. package/lib/cloud-code/httpRequest.js +1 -1
  123. package/lib/index.js +6 -12
  124. package/lib/middlewares.js +39 -4
  125. package/lib/rest.js +4 -4
  126. package/lib/triggers.js +134 -121
  127. package/lib/vendor/mongodbUrl.js +8 -10
  128. package/package.json +54 -29
  129. package/CHANGELOG.md +0 -1769
  130. package/lib/Adapters/Cache/RedisCacheAdapter/KeyPromiseQueue.js +0 -59
  131. package/lib/Adapters/Cache/RedisCacheAdapter/index.js +0 -130
  132. package/lib/Controllers/SchemaCache.js +0 -75
@@ -17,6 +17,10 @@ var _rest = _interopRequireDefault(require("../rest"));
17
17
 
18
18
  var _node = _interopRequireDefault(require("parse/node"));
19
19
 
20
+ var _AccountLockout = _interopRequireDefault(require("../AccountLockout"));
21
+
22
+ var _Config = _interopRequireDefault(require("../Config"));
23
+
20
24
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
25
 
22
26
  var RestQuery = require('../RestQuery');
@@ -28,6 +32,10 @@ class UserController extends _AdaptableController.default {
28
32
  super(adapter, appId, options);
29
33
  }
30
34
 
35
+ get config() {
36
+ return _Config.default.get(this.appId);
37
+ }
38
+
31
39
  validateAdapter(adapter) {
32
40
  // Allow no adapter
33
41
  if (!adapter && !this.shouldVerifyEmails) {
@@ -301,7 +309,10 @@ class UserController extends _AdaptableController.default {
301
309
  }
302
310
 
303
311
  updatePassword(username, token, password) {
304
- return this.checkResetTokenValidity(username, token).then(user => updateUserPassword(user.objectId, password, this.config)).catch(error => {
312
+ return this.checkResetTokenValidity(username, token).then(user => updateUserPassword(user, password, this.config)).then(user => {
313
+ const accountLockoutPolicy = new _AccountLockout.default(user, this.config);
314
+ return accountLockoutPolicy.unlockAccount();
315
+ }).catch(error => {
305
316
  if (error && error.message) {
306
317
  // in case of Parse.Error, fail with the error message only
307
318
  return Promise.reject(error.message);
@@ -346,12 +357,12 @@ class UserController extends _AdaptableController.default {
346
357
 
347
358
  exports.UserController = UserController;
348
359
 
349
- function updateUserPassword(userId, password, config) {
360
+ function updateUserPassword(user, password, config) {
350
361
  return _rest.default.update(config, Auth.master(config), '_User', {
351
- objectId: userId
362
+ objectId: user.objectId
352
363
  }, {
353
364
  password: password
354
- });
365
+ }).then(() => user);
355
366
  }
356
367
 
357
368
  function buildEmailLink(destination, username, token, config) {
@@ -367,4 +378,4 @@ function buildEmailLink(destination, username, token, config) {
367
378
 
368
379
  var _default = UserController;
369
380
  exports.default = _default;
370
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db250cm9sbGVycy9Vc2VyQ29udHJvbGxlci5qcyJdLCJuYW1lcyI6WyJSZXN0UXVlcnkiLCJyZXF1aXJlIiwiQXV0aCIsIlVzZXJDb250cm9sbGVyIiwiQWRhcHRhYmxlQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYWRhcHRlciIsImFwcElkIiwib3B0aW9ucyIsInZhbGlkYXRlQWRhcHRlciIsInNob3VsZFZlcmlmeUVtYWlscyIsImV4cGVjdGVkQWRhcHRlclR5cGUiLCJNYWlsQWRhcHRlciIsInZlcmlmeVVzZXJFbWFpbHMiLCJzZXRFbWFpbFZlcmlmeVRva2VuIiwidXNlciIsIl9lbWFpbF92ZXJpZnlfdG9rZW4iLCJlbWFpbFZlcmlmaWVkIiwiY29uZmlnIiwiZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQiLCJQYXJzZSIsIl9lbmNvZGUiLCJnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQiLCJ2ZXJpZnlFbWFpbCIsInVzZXJuYW1lIiwidG9rZW4iLCJ1bmRlZmluZWQiLCJxdWVyeSIsInVwZGF0ZUZpZWxkcyIsIl9fb3AiLCIkZ3QiLCJEYXRlIiwibWFzdGVyQXV0aCIsIm1hc3RlciIsImZpbmRVc2VyRm9yRW1haWxWZXJpZmljYXRpb24iLCJleGVjdXRlIiwidGhlbiIsInJlc3VsdCIsInJlc3VsdHMiLCJsZW5ndGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9iamVjdElkIiwicmVzdCIsInVwZGF0ZSIsImNoZWNrUmVzZXRUb2tlblZhbGlkaXR5IiwiZGF0YWJhc2UiLCJmaW5kIiwiX3BlcmlzaGFibGVfdG9rZW4iLCJsaW1pdCIsInBhc3N3b3JkUG9saWN5IiwicmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJleHBpcmVzRGF0ZSIsIl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQiLCJfX3R5cGUiLCJpc28iLCJnZXRVc2VySWZOZWVkZWQiLCJlbWFpbCIsIndoZXJlIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwibGluayIsImJ1aWxkRW1haWxMaW5rIiwidmVyaWZ5RW1haWxVUkwiLCJhcHBOYW1lIiwic2VuZE1haWwiLCJkZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwiLCJyZWdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbiIsImVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQiLCJyZXNlbmRWZXJpZmljYXRpb25FbWFpbCIsImFVc2VyIiwic2V0UGFzc3dvcmRSZXNldFRva2VuIiwiZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQiLCIkb3IiLCIkZXhpc3RzIiwic2VuZFBhc3N3b3JkUmVzZXRFbWFpbCIsInJlc2V0VG9rZW5SZXVzZUlmVmFsaWQiLCJyZXF1ZXN0UmVzZXRQYXNzd29yZFVSTCIsImRlZmF1bHRSZXNldFBhc3N3b3JkRW1haWwiLCJ1cGRhdGVQYXNzd29yZCIsInBhc3N3b3JkIiwidXBkYXRlVXNlclBhc3N3b3JkIiwiY2F0Y2giLCJlcnJvciIsIm1lc3NhZ2UiLCJyZWplY3QiLCJ0ZXh0IiwiZ2V0IiwidG8iLCJzdWJqZWN0IiwidXNlcklkIiwiZGVzdGluYXRpb24iLCJ1c2VybmFtZUFuZFRva2VuIiwicGFyc2VGcmFtZVVSTCIsImRlc3RpbmF0aW9uV2l0aG91dEhvc3QiLCJyZXBsYWNlIiwicHVibGljU2VydmVyVVJMIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxJQUFJQSxTQUFTLEdBQUdDLE9BQU8sQ0FBQyxjQUFELENBQXZCOztBQUNBLElBQUlDLElBQUksR0FBR0QsT0FBTyxDQUFDLFNBQUQsQ0FBbEI7O0FBRU8sTUFBTUUsY0FBTixTQUE2QkMsNEJBQTdCLENBQWlEO0FBQ3REQyxFQUFBQSxXQUFXLENBQUNDLE9BQUQsRUFBVUMsS0FBVixFQUFpQkMsT0FBTyxHQUFHLEVBQTNCLEVBQStCO0FBQ3hDLFVBQU1GLE9BQU4sRUFBZUMsS0FBZixFQUFzQkMsT0FBdEI7QUFDRDs7QUFFREMsRUFBQUEsZUFBZSxDQUFDSCxPQUFELEVBQVU7QUFDdkI7QUFDQSxRQUFJLENBQUNBLE9BQUQsSUFBWSxDQUFDLEtBQUtJLGtCQUF0QixFQUEwQztBQUN4QztBQUNEOztBQUNELFVBQU1ELGVBQU4sQ0FBc0JILE9BQXRCO0FBQ0Q7O0FBRURLLEVBQUFBLG1CQUFtQixHQUFHO0FBQ3BCLFdBQU9DLG9CQUFQO0FBQ0Q7O0FBRUQsTUFBSUYsa0JBQUosR0FBeUI7QUFDdkIsV0FBTyxLQUFLRixPQUFMLENBQWFLLGdCQUFwQjtBQUNEOztBQUVEQyxFQUFBQSxtQkFBbUIsQ0FBQ0MsSUFBRCxFQUFPO0FBQ3hCLFFBQUksS0FBS0wsa0JBQVQsRUFBNkI7QUFDM0JLLE1BQUFBLElBQUksQ0FBQ0MsbUJBQUwsR0FBMkIsK0JBQWEsRUFBYixDQUEzQjtBQUNBRCxNQUFBQSxJQUFJLENBQUNFLGFBQUwsR0FBcUIsS0FBckI7O0FBRUEsVUFBSSxLQUFLQyxNQUFMLENBQVlDLGdDQUFoQixFQUFrRDtBQUNoREosUUFBQUEsSUFBSSxDQUFDSyw4QkFBTCxHQUFzQ0MsY0FBTUMsT0FBTixDQUNwQyxLQUFLSixNQUFMLENBQVlLLGlDQUFaLEVBRG9DLENBQXRDO0FBR0Q7QUFDRjtBQUNGOztBQUVEQyxFQUFBQSxXQUFXLENBQUNDLFFBQUQsRUFBV0MsS0FBWCxFQUFrQjtBQUMzQixRQUFJLENBQUMsS0FBS2hCLGtCQUFWLEVBQThCO0FBQzVCO0FBQ0E7QUFDQSxZQUFNaUIsU0FBTjtBQUNEOztBQUVELFVBQU1DLEtBQUssR0FBRztBQUFFSCxNQUFBQSxRQUFRLEVBQUVBLFFBQVo7QUFBc0JULE1BQUFBLG1CQUFtQixFQUFFVTtBQUEzQyxLQUFkO0FBQ0EsVUFBTUcsWUFBWSxHQUFHO0FBQ25CWixNQUFBQSxhQUFhLEVBQUUsSUFESTtBQUVuQkQsTUFBQUEsbUJBQW1CLEVBQUU7QUFBRWMsUUFBQUEsSUFBSSxFQUFFO0FBQVI7QUFGRixLQUFyQixDQVIyQixDQWEzQjtBQUNBOztBQUNBLFFBQUksS0FBS1osTUFBTCxDQUFZQyxnQ0FBaEIsRUFBa0Q7QUFDaERTLE1BQUFBLEtBQUssQ0FBQ1gsYUFBTixHQUFzQixLQUF0QjtBQUNBVyxNQUFBQSxLQUFLLENBQUNSLDhCQUFOLEdBQXVDO0FBQUVXLFFBQUFBLEdBQUcsRUFBRVYsY0FBTUMsT0FBTixDQUFjLElBQUlVLElBQUosRUFBZDtBQUFQLE9BQXZDO0FBRUFILE1BQUFBLFlBQVksQ0FBQ1QsOEJBQWIsR0FBOEM7QUFBRVUsUUFBQUEsSUFBSSxFQUFFO0FBQVIsT0FBOUM7QUFDRDs7QUFDRCxVQUFNRyxVQUFVLEdBQUcvQixJQUFJLENBQUNnQyxNQUFMLENBQVksS0FBS2hCLE1BQWpCLENBQW5CO0FBQ0EsUUFBSWlCLDRCQUE0QixHQUFHLElBQUluQyxTQUFKLENBQ2pDLEtBQUtrQixNQUQ0QixFQUVqQ2hCLElBQUksQ0FBQ2dDLE1BQUwsQ0FBWSxLQUFLaEIsTUFBakIsQ0FGaUMsRUFHakMsT0FIaUMsRUFJakM7QUFBRU8sTUFBQUEsUUFBUSxFQUFFQTtBQUFaLEtBSmlDLENBQW5DO0FBTUEsV0FBT1UsNEJBQTRCLENBQUNDLE9BQTdCLEdBQXVDQyxJQUF2QyxDQUE0Q0MsTUFBTSxJQUFJO0FBQzNELFVBQUlBLE1BQU0sQ0FBQ0MsT0FBUCxDQUFlQyxNQUFmLElBQXlCRixNQUFNLENBQUNDLE9BQVAsQ0FBZSxDQUFmLEVBQWtCdEIsYUFBL0MsRUFBOEQ7QUFDNUQsZUFBT3dCLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQkosTUFBTSxDQUFDQyxPQUFQLENBQWVDLE1BQWYsQ0FBc0IsQ0FBdEIsQ0FBaEIsQ0FBUDtBQUNELE9BRkQsTUFFTyxJQUFJRixNQUFNLENBQUNDLE9BQVAsQ0FBZUMsTUFBbkIsRUFBMkI7QUFDaENaLFFBQUFBLEtBQUssQ0FBQ2UsUUFBTixHQUFpQkwsTUFBTSxDQUFDQyxPQUFQLENBQWUsQ0FBZixFQUFrQkksUUFBbkM7QUFDRDs7QUFDRCxhQUFPQyxjQUFLQyxNQUFMLENBQVksS0FBSzNCLE1BQWpCLEVBQXlCZSxVQUF6QixFQUFxQyxPQUFyQyxFQUE4Q0wsS0FBOUMsRUFBcURDLFlBQXJELENBQVA7QUFDRCxLQVBNLENBQVA7QUFRRDs7QUFFRGlCLEVBQUFBLHVCQUF1QixDQUFDckIsUUFBRCxFQUFXQyxLQUFYLEVBQWtCO0FBQ3ZDLFdBQU8sS0FBS1IsTUFBTCxDQUFZNkIsUUFBWixDQUNKQyxJQURJLENBRUgsT0FGRyxFQUdIO0FBQ0V2QixNQUFBQSxRQUFRLEVBQUVBLFFBRFo7QUFFRXdCLE1BQUFBLGlCQUFpQixFQUFFdkI7QUFGckIsS0FIRyxFQU9IO0FBQUV3QixNQUFBQSxLQUFLLEVBQUU7QUFBVCxLQVBHLEVBU0piLElBVEksQ0FTQ0UsT0FBTyxJQUFJO0FBQ2YsVUFBSUEsT0FBTyxDQUFDQyxNQUFSLElBQWtCLENBQXRCLEVBQXlCO0FBQ3ZCLGNBQU0sK0RBQU47QUFDRDs7QUFFRCxVQUFJLEtBQUt0QixNQUFMLENBQVlpQyxjQUFaLElBQThCLEtBQUtqQyxNQUFMLENBQVlpQyxjQUFaLENBQTJCQywwQkFBN0QsRUFBeUY7QUFDdkYsWUFBSUMsV0FBVyxHQUFHZCxPQUFPLENBQUMsQ0FBRCxDQUFQLENBQVdlLDRCQUE3Qjs7QUFDQSxZQUFJRCxXQUFXLElBQUlBLFdBQVcsQ0FBQ0UsTUFBWixJQUFzQixNQUF6QyxFQUFpRDtBQUMvQ0YsVUFBQUEsV0FBVyxHQUFHLElBQUlyQixJQUFKLENBQVNxQixXQUFXLENBQUNHLEdBQXJCLENBQWQ7QUFDRDs7QUFDRCxZQUFJSCxXQUFXLEdBQUcsSUFBSXJCLElBQUosRUFBbEIsRUFBOEIsTUFBTSxxQ0FBTjtBQUMvQjs7QUFDRCxhQUFPTyxPQUFPLENBQUMsQ0FBRCxDQUFkO0FBQ0QsS0F0QkksQ0FBUDtBQXVCRDs7QUFFRGtCLEVBQUFBLGVBQWUsQ0FBQzFDLElBQUQsRUFBTztBQUNwQixRQUFJQSxJQUFJLENBQUNVLFFBQUwsSUFBaUJWLElBQUksQ0FBQzJDLEtBQTFCLEVBQWlDO0FBQy9CLGFBQU9qQixPQUFPLENBQUNDLE9BQVIsQ0FBZ0IzQixJQUFoQixDQUFQO0FBQ0Q7O0FBQ0QsUUFBSTRDLEtBQUssR0FBRyxFQUFaOztBQUNBLFFBQUk1QyxJQUFJLENBQUNVLFFBQVQsRUFBbUI7QUFDakJrQyxNQUFBQSxLQUFLLENBQUNsQyxRQUFOLEdBQWlCVixJQUFJLENBQUNVLFFBQXRCO0FBQ0Q7O0FBQ0QsUUFBSVYsSUFBSSxDQUFDMkMsS0FBVCxFQUFnQjtBQUNkQyxNQUFBQSxLQUFLLENBQUNELEtBQU4sR0FBYzNDLElBQUksQ0FBQzJDLEtBQW5CO0FBQ0Q7O0FBRUQsUUFBSTlCLEtBQUssR0FBRyxJQUFJNUIsU0FBSixDQUFjLEtBQUtrQixNQUFuQixFQUEyQmhCLElBQUksQ0FBQ2dDLE1BQUwsQ0FBWSxLQUFLaEIsTUFBakIsQ0FBM0IsRUFBcUQsT0FBckQsRUFBOER5QyxLQUE5RCxDQUFaO0FBQ0EsV0FBTy9CLEtBQUssQ0FBQ1EsT0FBTixHQUFnQkMsSUFBaEIsQ0FBcUIsVUFBVUMsTUFBVixFQUFrQjtBQUM1QyxVQUFJQSxNQUFNLENBQUNDLE9BQVAsQ0FBZUMsTUFBZixJQUF5QixDQUE3QixFQUFnQztBQUM5QixjQUFNYixTQUFOO0FBQ0Q7O0FBQ0QsYUFBT1csTUFBTSxDQUFDQyxPQUFQLENBQWUsQ0FBZixDQUFQO0FBQ0QsS0FMTSxDQUFQO0FBTUQ7O0FBRURxQixFQUFBQSxxQkFBcUIsQ0FBQzdDLElBQUQsRUFBTztBQUMxQixRQUFJLENBQUMsS0FBS0wsa0JBQVYsRUFBOEI7QUFDNUI7QUFDRDs7QUFDRCxVQUFNZ0IsS0FBSyxHQUFHbUMsa0JBQWtCLENBQUM5QyxJQUFJLENBQUNDLG1CQUFOLENBQWhDLENBSjBCLENBSzFCOztBQUNBLFNBQUt5QyxlQUFMLENBQXFCMUMsSUFBckIsRUFBMkJzQixJQUEzQixDQUFnQ3RCLElBQUksSUFBSTtBQUN0QyxZQUFNVSxRQUFRLEdBQUdvQyxrQkFBa0IsQ0FBQzlDLElBQUksQ0FBQ1UsUUFBTixDQUFuQztBQUVBLFlBQU1xQyxJQUFJLEdBQUdDLGNBQWMsQ0FBQyxLQUFLN0MsTUFBTCxDQUFZOEMsY0FBYixFQUE2QnZDLFFBQTdCLEVBQXVDQyxLQUF2QyxFQUE4QyxLQUFLUixNQUFuRCxDQUEzQjtBQUNBLFlBQU1WLE9BQU8sR0FBRztBQUNkeUQsUUFBQUEsT0FBTyxFQUFFLEtBQUsvQyxNQUFMLENBQVkrQyxPQURQO0FBRWRILFFBQUFBLElBQUksRUFBRUEsSUFGUTtBQUdkL0MsUUFBQUEsSUFBSSxFQUFFLHVCQUFRLE9BQVIsRUFBaUJBLElBQWpCO0FBSFEsT0FBaEI7O0FBS0EsVUFBSSxLQUFLVCxPQUFMLENBQWFzRCxxQkFBakIsRUFBd0M7QUFDdEMsYUFBS3RELE9BQUwsQ0FBYXNELHFCQUFiLENBQW1DcEQsT0FBbkM7QUFDRCxPQUZELE1BRU87QUFDTCxhQUFLRixPQUFMLENBQWE0RCxRQUFiLENBQXNCLEtBQUtDLHdCQUFMLENBQThCM0QsT0FBOUIsQ0FBdEI7QUFDRDtBQUNGLEtBZEQ7QUFlRDtBQUVEOzs7Ozs7OztBQU1BNEQsRUFBQUEsMEJBQTBCLENBQUNyRCxJQUFELEVBQU87QUFDL0IsVUFBTTtBQUFFQyxNQUFBQTtBQUFGLFFBQTBCRCxJQUFoQztBQUNBLFFBQUk7QUFBRUssTUFBQUE7QUFBRixRQUFxQ0wsSUFBekM7O0FBQ0EsUUFBSUssOEJBQThCLElBQUlBLDhCQUE4QixDQUFDbUMsTUFBL0IsS0FBMEMsTUFBaEYsRUFBd0Y7QUFDdEZuQyxNQUFBQSw4QkFBOEIsR0FBR0EsOEJBQThCLENBQUNvQyxHQUFoRTtBQUNEOztBQUNELFFBQ0UsS0FBS3RDLE1BQUwsQ0FBWW1ELDRCQUFaLElBQ0EsS0FBS25ELE1BQUwsQ0FBWUMsZ0NBRFosSUFFQUgsbUJBRkEsSUFHQSxJQUFJZ0IsSUFBSixLQUFhLElBQUlBLElBQUosQ0FBU1osOEJBQVQsQ0FKZixFQUtFO0FBQ0EsYUFBT3FCLE9BQU8sQ0FBQ0MsT0FBUixFQUFQO0FBQ0Q7O0FBQ0QsU0FBSzVCLG1CQUFMLENBQXlCQyxJQUF6QjtBQUNBLFdBQU8sS0FBS0csTUFBTCxDQUFZNkIsUUFBWixDQUFxQkYsTUFBckIsQ0FBNEIsT0FBNUIsRUFBcUM7QUFBRXBCLE1BQUFBLFFBQVEsRUFBRVYsSUFBSSxDQUFDVTtBQUFqQixLQUFyQyxFQUFrRVYsSUFBbEUsQ0FBUDtBQUNEOztBQUVEdUQsRUFBQUEsdUJBQXVCLENBQUM3QyxRQUFELEVBQVc7QUFDaEMsV0FBTyxLQUFLZ0MsZUFBTCxDQUFxQjtBQUFFaEMsTUFBQUEsUUFBUSxFQUFFQTtBQUFaLEtBQXJCLEVBQTZDWSxJQUE3QyxDQUFrRGtDLEtBQUssSUFBSTtBQUNoRSxVQUFJLENBQUNBLEtBQUQsSUFBVUEsS0FBSyxDQUFDdEQsYUFBcEIsRUFBbUM7QUFDakMsY0FBTVUsU0FBTjtBQUNEOztBQUNELGFBQU8sS0FBS3lDLDBCQUFMLENBQWdDRyxLQUFoQyxFQUF1Q2xDLElBQXZDLENBQTRDLE1BQU07QUFDdkQsYUFBS3VCLHFCQUFMLENBQTJCVyxLQUEzQjtBQUNELE9BRk0sQ0FBUDtBQUdELEtBUE0sQ0FBUDtBQVFEOztBQUVEQyxFQUFBQSxxQkFBcUIsQ0FBQ2QsS0FBRCxFQUFRO0FBQzNCLFVBQU1oQyxLQUFLLEdBQUc7QUFBRXVCLE1BQUFBLGlCQUFpQixFQUFFLCtCQUFhLEVBQWI7QUFBckIsS0FBZDs7QUFFQSxRQUFJLEtBQUsvQixNQUFMLENBQVlpQyxjQUFaLElBQThCLEtBQUtqQyxNQUFMLENBQVlpQyxjQUFaLENBQTJCQywwQkFBN0QsRUFBeUY7QUFDdkYxQixNQUFBQSxLQUFLLENBQUM0Qiw0QkFBTixHQUFxQ2pDLGNBQU1DLE9BQU4sQ0FDbkMsS0FBS0osTUFBTCxDQUFZdUQsbUNBQVosRUFEbUMsQ0FBckM7QUFHRDs7QUFFRCxXQUFPLEtBQUt2RCxNQUFMLENBQVk2QixRQUFaLENBQXFCRixNQUFyQixDQUNMLE9BREssRUFFTDtBQUFFNkIsTUFBQUEsR0FBRyxFQUFFLENBQUM7QUFBRWhCLFFBQUFBO0FBQUYsT0FBRCxFQUFZO0FBQUVqQyxRQUFBQSxRQUFRLEVBQUVpQyxLQUFaO0FBQW1CQSxRQUFBQSxLQUFLLEVBQUU7QUFBRWlCLFVBQUFBLE9BQU8sRUFBRTtBQUFYO0FBQTFCLE9BQVo7QUFBUCxLQUZLLEVBR0xqRCxLQUhLLEVBSUwsRUFKSyxFQUtMLElBTEssQ0FBUDtBQU9EOztBQUVELFFBQU1rRCxzQkFBTixDQUE2QmxCLEtBQTdCLEVBQW9DO0FBQ2xDLFFBQUksQ0FBQyxLQUFLcEQsT0FBVixFQUFtQjtBQUNqQixZQUFNLHVEQUFOLENBRGlCLENBRWpCO0FBQ0Q7O0FBQ0QsUUFBSVMsSUFBSjs7QUFDQSxRQUNFLEtBQUtHLE1BQUwsQ0FBWWlDLGNBQVosSUFDQSxLQUFLakMsTUFBTCxDQUFZaUMsY0FBWixDQUEyQjBCLHNCQUQzQixJQUVBLEtBQUszRCxNQUFMLENBQVlpQyxjQUFaLENBQTJCQywwQkFIN0IsRUFJRTtBQUNBLFlBQU1iLE9BQU8sR0FBRyxNQUFNLEtBQUtyQixNQUFMLENBQVk2QixRQUFaLENBQXFCQyxJQUFyQixDQUNwQixPQURvQixFQUVwQjtBQUNFMEIsUUFBQUEsR0FBRyxFQUFFLENBQ0g7QUFBRWhCLFVBQUFBLEtBQUY7QUFBU1QsVUFBQUEsaUJBQWlCLEVBQUU7QUFBRTBCLFlBQUFBLE9BQU8sRUFBRTtBQUFYO0FBQTVCLFNBREcsRUFFSDtBQUFFbEQsVUFBQUEsUUFBUSxFQUFFaUMsS0FBWjtBQUFtQkEsVUFBQUEsS0FBSyxFQUFFO0FBQUVpQixZQUFBQSxPQUFPLEVBQUU7QUFBWCxXQUExQjtBQUE4QzFCLFVBQUFBLGlCQUFpQixFQUFFO0FBQUUwQixZQUFBQSxPQUFPLEVBQUU7QUFBWDtBQUFqRSxTQUZHO0FBRFAsT0FGb0IsRUFRcEI7QUFBRXpCLFFBQUFBLEtBQUssRUFBRTtBQUFULE9BUm9CLENBQXRCOztBQVVBLFVBQUlYLE9BQU8sQ0FBQ0MsTUFBUixJQUFrQixDQUF0QixFQUF5QjtBQUN2QixZQUFJYSxXQUFXLEdBQUdkLE9BQU8sQ0FBQyxDQUFELENBQVAsQ0FBV2UsNEJBQTdCOztBQUNBLFlBQUlELFdBQVcsSUFBSUEsV0FBVyxDQUFDRSxNQUFaLElBQXNCLE1BQXpDLEVBQWlEO0FBQy9DRixVQUFBQSxXQUFXLEdBQUcsSUFBSXJCLElBQUosQ0FBU3FCLFdBQVcsQ0FBQ0csR0FBckIsQ0FBZDtBQUNEOztBQUNELFlBQUlILFdBQVcsR0FBRyxJQUFJckIsSUFBSixFQUFsQixFQUE4QjtBQUM1QmpCLFVBQUFBLElBQUksR0FBR3dCLE9BQU8sQ0FBQyxDQUFELENBQWQ7QUFDRDtBQUNGO0FBQ0Y7O0FBQ0QsUUFBSSxDQUFDeEIsSUFBRCxJQUFTLENBQUNBLElBQUksQ0FBQ2tDLGlCQUFuQixFQUFzQztBQUNwQ2xDLE1BQUFBLElBQUksR0FBRyxNQUFNLEtBQUt5RCxxQkFBTCxDQUEyQmQsS0FBM0IsQ0FBYjtBQUNEOztBQUNELFVBQU1oQyxLQUFLLEdBQUdtQyxrQkFBa0IsQ0FBQzlDLElBQUksQ0FBQ2tDLGlCQUFOLENBQWhDO0FBQ0EsVUFBTXhCLFFBQVEsR0FBR29DLGtCQUFrQixDQUFDOUMsSUFBSSxDQUFDVSxRQUFOLENBQW5DO0FBRUEsVUFBTXFDLElBQUksR0FBR0MsY0FBYyxDQUFDLEtBQUs3QyxNQUFMLENBQVk0RCx1QkFBYixFQUFzQ3JELFFBQXRDLEVBQWdEQyxLQUFoRCxFQUF1RCxLQUFLUixNQUE1RCxDQUEzQjtBQUNBLFVBQU1WLE9BQU8sR0FBRztBQUNkeUQsTUFBQUEsT0FBTyxFQUFFLEtBQUsvQyxNQUFMLENBQVkrQyxPQURQO0FBRWRILE1BQUFBLElBQUksRUFBRUEsSUFGUTtBQUdkL0MsTUFBQUEsSUFBSSxFQUFFLHVCQUFRLE9BQVIsRUFBaUJBLElBQWpCO0FBSFEsS0FBaEI7O0FBTUEsUUFBSSxLQUFLVCxPQUFMLENBQWFzRSxzQkFBakIsRUFBeUM7QUFDdkMsV0FBS3RFLE9BQUwsQ0FBYXNFLHNCQUFiLENBQW9DcEUsT0FBcEM7QUFDRCxLQUZELE1BRU87QUFDTCxXQUFLRixPQUFMLENBQWE0RCxRQUFiLENBQXNCLEtBQUthLHlCQUFMLENBQStCdkUsT0FBL0IsQ0FBdEI7QUFDRDs7QUFFRCxXQUFPaUMsT0FBTyxDQUFDQyxPQUFSLENBQWdCM0IsSUFBaEIsQ0FBUDtBQUNEOztBQUVEaUUsRUFBQUEsY0FBYyxDQUFDdkQsUUFBRCxFQUFXQyxLQUFYLEVBQWtCdUQsUUFBbEIsRUFBNEI7QUFDeEMsV0FBTyxLQUFLbkMsdUJBQUwsQ0FBNkJyQixRQUE3QixFQUF1Q0MsS0FBdkMsRUFDSlcsSUFESSxDQUNDdEIsSUFBSSxJQUFJbUUsa0JBQWtCLENBQUNuRSxJQUFJLENBQUM0QixRQUFOLEVBQWdCc0MsUUFBaEIsRUFBMEIsS0FBSy9ELE1BQS9CLENBRDNCLEVBRUppRSxLQUZJLENBRUVDLEtBQUssSUFBSTtBQUNkLFVBQUlBLEtBQUssSUFBSUEsS0FBSyxDQUFDQyxPQUFuQixFQUE0QjtBQUMxQjtBQUNBLGVBQU81QyxPQUFPLENBQUM2QyxNQUFSLENBQWVGLEtBQUssQ0FBQ0MsT0FBckIsQ0FBUDtBQUNELE9BSEQsTUFHTztBQUNMLGVBQU81QyxPQUFPLENBQUM2QyxNQUFSLENBQWVGLEtBQWYsQ0FBUDtBQUNEO0FBQ0YsS0FUSSxDQUFQO0FBVUQ7O0FBRURqQixFQUFBQSx3QkFBd0IsQ0FBQztBQUFFTCxJQUFBQSxJQUFGO0FBQVEvQyxJQUFBQSxJQUFSO0FBQWNrRCxJQUFBQTtBQUFkLEdBQUQsRUFBMEI7QUFDaEQsVUFBTXNCLElBQUksR0FDUixZQUNBLG9EQURBLEdBRUF4RSxJQUFJLENBQUN5RSxHQUFMLENBQVMsT0FBVCxDQUZBLEdBR0EsUUFIQSxHQUlBdkIsT0FKQSxHQUtBLE1BTEEsR0FNQSxFQU5BLEdBT0EsNkJBUEEsR0FRQUgsSUFURjtBQVVBLFVBQU0yQixFQUFFLEdBQUcxRSxJQUFJLENBQUN5RSxHQUFMLENBQVMsT0FBVCxDQUFYO0FBQ0EsVUFBTUUsT0FBTyxHQUFHLG1DQUFtQ3pCLE9BQW5EO0FBQ0EsV0FBTztBQUFFc0IsTUFBQUEsSUFBRjtBQUFRRSxNQUFBQSxFQUFSO0FBQVlDLE1BQUFBO0FBQVosS0FBUDtBQUNEOztBQUVEWCxFQUFBQSx5QkFBeUIsQ0FBQztBQUFFakIsSUFBQUEsSUFBRjtBQUFRL0MsSUFBQUEsSUFBUjtBQUFja0QsSUFBQUE7QUFBZCxHQUFELEVBQTBCO0FBQ2pELFVBQU1zQixJQUFJLEdBQ1IsWUFDQSwyQ0FEQSxHQUVBdEIsT0FGQSxJQUdDbEQsSUFBSSxDQUFDeUUsR0FBTCxDQUFTLFVBQVQsSUFBdUIseUJBQXlCekUsSUFBSSxDQUFDeUUsR0FBTCxDQUFTLFVBQVQsQ0FBekIsR0FBZ0QsSUFBdkUsR0FBOEUsRUFIL0UsSUFJQSxPQUpBLEdBS0EsRUFMQSxHQU1BLDJCQU5BLEdBT0ExQixJQVJGO0FBU0EsVUFBTTJCLEVBQUUsR0FBRzFFLElBQUksQ0FBQ3lFLEdBQUwsQ0FBUyxPQUFULEtBQXFCekUsSUFBSSxDQUFDeUUsR0FBTCxDQUFTLFVBQVQsQ0FBaEM7QUFDQSxVQUFNRSxPQUFPLEdBQUcsd0JBQXdCekIsT0FBeEM7QUFDQSxXQUFPO0FBQUVzQixNQUFBQSxJQUFGO0FBQVFFLE1BQUFBLEVBQVI7QUFBWUMsTUFBQUE7QUFBWixLQUFQO0FBQ0Q7O0FBbFNxRCxDLENBcVN4RDs7Ozs7QUFDQSxTQUFTUixrQkFBVCxDQUE0QlMsTUFBNUIsRUFBb0NWLFFBQXBDLEVBQThDL0QsTUFBOUMsRUFBc0Q7QUFDcEQsU0FBTzBCLGNBQUtDLE1BQUwsQ0FDTDNCLE1BREssRUFFTGhCLElBQUksQ0FBQ2dDLE1BQUwsQ0FBWWhCLE1BQVosQ0FGSyxFQUdMLE9BSEssRUFJTDtBQUFFeUIsSUFBQUEsUUFBUSxFQUFFZ0Q7QUFBWixHQUpLLEVBS0w7QUFDRVYsSUFBQUEsUUFBUSxFQUFFQTtBQURaLEdBTEssQ0FBUDtBQVNEOztBQUVELFNBQVNsQixjQUFULENBQXdCNkIsV0FBeEIsRUFBcUNuRSxRQUFyQyxFQUErQ0MsS0FBL0MsRUFBc0RSLE1BQXRELEVBQThEO0FBQzVELFFBQU0yRSxnQkFBZ0IsR0FBSSxTQUFRbkUsS0FBTSxhQUFZRCxRQUFTLEVBQTdEOztBQUVBLE1BQUlQLE1BQU0sQ0FBQzRFLGFBQVgsRUFBMEI7QUFDeEIsVUFBTUMsc0JBQXNCLEdBQUdILFdBQVcsQ0FBQ0ksT0FBWixDQUFvQjlFLE1BQU0sQ0FBQytFLGVBQTNCLEVBQTRDLEVBQTVDLENBQS9CO0FBRUEsV0FBUSxHQUFFL0UsTUFBTSxDQUFDNEUsYUFBYyxTQUFRakMsa0JBQWtCLENBQ3ZEa0Msc0JBRHVELENBRXZELElBQUdGLGdCQUFpQixFQUZ0QjtBQUdELEdBTkQsTUFNTztBQUNMLFdBQVEsR0FBRUQsV0FBWSxJQUFHQyxnQkFBaUIsRUFBMUM7QUFDRDtBQUNGOztlQUVjMUYsYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVN0cmluZyB9IGZyb20gJy4uL2NyeXB0b1V0aWxzJztcbmltcG9ydCB7IGluZmxhdGUgfSBmcm9tICcuLi90cmlnZ2Vycyc7XG5pbXBvcnQgQWRhcHRhYmxlQ29udHJvbGxlciBmcm9tICcuL0FkYXB0YWJsZUNvbnRyb2xsZXInO1xuaW1wb3J0IE1haWxBZGFwdGVyIGZyb20gJy4uL0FkYXB0ZXJzL0VtYWlsL01haWxBZGFwdGVyJztcbmltcG9ydCByZXN0IGZyb20gJy4uL3Jlc3QnO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuXG52YXIgUmVzdFF1ZXJ5ID0gcmVxdWlyZSgnLi4vUmVzdFF1ZXJ5Jyk7XG52YXIgQXV0aCA9IHJlcXVpcmUoJy4uL0F1dGgnKTtcblxuZXhwb3J0IGNsYXNzIFVzZXJDb250cm9sbGVyIGV4dGVuZHMgQWRhcHRhYmxlQ29udHJvbGxlciB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXIsIGFwcElkLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihhZGFwdGVyLCBhcHBJZCwgb3B0aW9ucyk7XG4gIH1cblxuICB2YWxpZGF0ZUFkYXB0ZXIoYWRhcHRlcikge1xuICAgIC8vIEFsbG93IG5vIGFkYXB0ZXJcbiAgICBpZiAoIWFkYXB0ZXIgJiYgIXRoaXMuc2hvdWxkVmVyaWZ5RW1haWxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLnZhbGlkYXRlQWRhcHRlcihhZGFwdGVyKTtcbiAgfVxuXG4gIGV4cGVjdGVkQWRhcHRlclR5cGUoKSB7XG4gICAgcmV0dXJuIE1haWxBZGFwdGVyO1xuICB9XG5cbiAgZ2V0IHNob3VsZFZlcmlmeUVtYWlscygpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnZlcmlmeVVzZXJFbWFpbHM7XG4gIH1cblxuICBzZXRFbWFpbFZlcmlmeVRva2VuKHVzZXIpIHtcbiAgICBpZiAodGhpcy5zaG91bGRWZXJpZnlFbWFpbHMpIHtcbiAgICAgIHVzZXIuX2VtYWlsX3ZlcmlmeV90b2tlbiA9IHJhbmRvbVN0cmluZygyNSk7XG4gICAgICB1c2VyLmVtYWlsVmVyaWZpZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICAgIHVzZXIuX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0ID0gUGFyc2UuX2VuY29kZShcbiAgICAgICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZlcmlmeUVtYWlsKHVzZXJuYW1lLCB0b2tlbikge1xuICAgIGlmICghdGhpcy5zaG91bGRWZXJpZnlFbWFpbHMpIHtcbiAgICAgIC8vIFRyeWluZyB0byB2ZXJpZnkgZW1haWwgd2hlbiBub3QgZW5hYmxlZFxuICAgICAgLy8gVE9ETzogQmV0dGVyIGVycm9yIGhlcmUuXG4gICAgICB0aHJvdyB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnkgPSB7IHVzZXJuYW1lOiB1c2VybmFtZSwgX2VtYWlsX3ZlcmlmeV90b2tlbjogdG9rZW4gfTtcbiAgICBjb25zdCB1cGRhdGVGaWVsZHMgPSB7XG4gICAgICBlbWFpbFZlcmlmaWVkOiB0cnVlLFxuICAgICAgX2VtYWlsX3ZlcmlmeV90b2tlbjogeyBfX29wOiAnRGVsZXRlJyB9LFxuICAgIH07XG5cbiAgICAvLyBpZiB0aGUgZW1haWwgdmVyaWZ5IHRva2VuIG5lZWRzIHRvIGJlIHZhbGlkYXRlZCB0aGVuXG4gICAgLy8gYWRkIGFkZGl0aW9uYWwgcXVlcnkgcGFyYW1zIGFuZCBhZGRpdGlvbmFsIGZpZWxkcyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZFxuICAgIGlmICh0aGlzLmNvbmZpZy5lbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbikge1xuICAgICAgcXVlcnkuZW1haWxWZXJpZmllZCA9IGZhbHNlO1xuICAgICAgcXVlcnkuX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0ID0geyAkZ3Q6IFBhcnNlLl9lbmNvZGUobmV3IERhdGUoKSkgfTtcblxuICAgICAgdXBkYXRlRmllbGRzLl9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCA9IHsgX19vcDogJ0RlbGV0ZScgfTtcbiAgICB9XG4gICAgY29uc3QgbWFzdGVyQXV0aCA9IEF1dGgubWFzdGVyKHRoaXMuY29uZmlnKTtcbiAgICB2YXIgZmluZFVzZXJGb3JFbWFpbFZlcmlmaWNhdGlvbiA9IG5ldyBSZXN0UXVlcnkoXG4gICAgICB0aGlzLmNvbmZpZyxcbiAgICAgIEF1dGgubWFzdGVyKHRoaXMuY29uZmlnKSxcbiAgICAgICdfVXNlcicsXG4gICAgICB7IHVzZXJuYW1lOiB1c2VybmFtZSB9XG4gICAgKTtcbiAgICByZXR1cm4gZmluZFVzZXJGb3JFbWFpbFZlcmlmaWNhdGlvbi5leGVjdXRlKCkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5yZXN1bHRzLmxlbmd0aCAmJiByZXN1bHQucmVzdWx0c1swXS5lbWFpbFZlcmlmaWVkKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0LnJlc3VsdHMubGVuZ3RoWzBdKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXJ5Lm9iamVjdElkID0gcmVzdWx0LnJlc3VsdHNbMF0ub2JqZWN0SWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdC51cGRhdGUodGhpcy5jb25maWcsIG1hc3RlckF1dGgsICdfVXNlcicsIHF1ZXJ5LCB1cGRhdGVGaWVsZHMpO1xuICAgIH0pO1xuICB9XG5cbiAgY2hlY2tSZXNldFRva2VuVmFsaWRpdHkodXNlcm5hbWUsIHRva2VuKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgICAuZmluZChcbiAgICAgICAgJ19Vc2VyJyxcbiAgICAgICAge1xuICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcbiAgICAgICAgICBfcGVyaXNoYWJsZV90b2tlbjogdG9rZW4sXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGltaXQ6IDEgfVxuICAgICAgKVxuICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgdGhyb3cgJ0ZhaWxlZCB0byByZXNldCBwYXNzd29yZDogdXNlcm5hbWUgLyBlbWFpbCAvIHRva2VuIGlzIGludmFsaWQnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICAgICAgbGV0IGV4cGlyZXNEYXRlID0gcmVzdWx0c1swXS5fcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0O1xuICAgICAgICAgIGlmIChleHBpcmVzRGF0ZSAmJiBleHBpcmVzRGF0ZS5fX3R5cGUgPT0gJ0RhdGUnKSB7XG4gICAgICAgICAgICBleHBpcmVzRGF0ZSA9IG5ldyBEYXRlKGV4cGlyZXNEYXRlLmlzbyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChleHBpcmVzRGF0ZSA8IG5ldyBEYXRlKCkpIHRocm93ICdUaGUgcGFzc3dvcmQgcmVzZXQgbGluayBoYXMgZXhwaXJlZCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHNbMF07XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldFVzZXJJZk5lZWRlZCh1c2VyKSB7XG4gICAgaWYgKHVzZXIudXNlcm5hbWUgJiYgdXNlci5lbWFpbCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1c2VyKTtcbiAgICB9XG4gICAgdmFyIHdoZXJlID0ge307XG4gICAgaWYgKHVzZXIudXNlcm5hbWUpIHtcbiAgICAgIHdoZXJlLnVzZXJuYW1lID0gdXNlci51c2VybmFtZTtcbiAgICB9XG4gICAgaWYgKHVzZXIuZW1haWwpIHtcbiAgICAgIHdoZXJlLmVtYWlsID0gdXNlci5lbWFpbDtcbiAgICB9XG5cbiAgICB2YXIgcXVlcnkgPSBuZXcgUmVzdFF1ZXJ5KHRoaXMuY29uZmlnLCBBdXRoLm1hc3Rlcih0aGlzLmNvbmZpZyksICdfVXNlcicsIHdoZXJlKTtcbiAgICByZXR1cm4gcXVlcnkuZXhlY3V0ZSgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgaWYgKHJlc3VsdC5yZXN1bHRzLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQucmVzdWx0c1swXTtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbmRWZXJpZmljYXRpb25FbWFpbCh1c2VyKSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFZlcmlmeUVtYWlscykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbiA9IGVuY29kZVVSSUNvbXBvbmVudCh1c2VyLl9lbWFpbF92ZXJpZnlfdG9rZW4pO1xuICAgIC8vIFdlIG1heSBuZWVkIHRvIGZldGNoIHRoZSB1c2VyIGluIGNhc2Ugb2YgdXBkYXRlIGVtYWlsXG4gICAgdGhpcy5nZXRVc2VySWZOZWVkZWQodXNlcikudGhlbih1c2VyID0+IHtcbiAgICAgIGNvbnN0IHVzZXJuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIudXNlcm5hbWUpO1xuXG4gICAgICBjb25zdCBsaW5rID0gYnVpbGRFbWFpbExpbmsodGhpcy5jb25maWcudmVyaWZ5RW1haWxVUkwsIHVzZXJuYW1lLCB0b2tlbiwgdGhpcy5jb25maWcpO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgYXBwTmFtZTogdGhpcy5jb25maWcuYXBwTmFtZSxcbiAgICAgICAgbGluazogbGluayxcbiAgICAgICAgdXNlcjogaW5mbGF0ZSgnX1VzZXInLCB1c2VyKSxcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5hZGFwdGVyLnNlbmRWZXJpZmljYXRpb25FbWFpbCkge1xuICAgICAgICB0aGlzLmFkYXB0ZXIuc2VuZFZlcmlmaWNhdGlvbkVtYWlsKG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hZGFwdGVyLnNlbmRNYWlsKHRoaXMuZGVmYXVsdFZlcmlmaWNhdGlvbkVtYWlsKG9wdGlvbnMpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdlbmVyYXRlcyB0aGUgZ2l2ZW4gdXNlcidzIGVtYWlsIHZlcmlmaWNhdGlvbiB0b2tlblxuICAgKlxuICAgKiBAcGFyYW0gdXNlclxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHJlZ2VuZXJhdGVFbWFpbFZlcmlmeVRva2VuKHVzZXIpIHtcbiAgICBjb25zdCB7IF9lbWFpbF92ZXJpZnlfdG9rZW4gfSA9IHVzZXI7XG4gICAgbGV0IHsgX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0IH0gPSB1c2VyO1xuICAgIGlmIChfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgJiYgX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0Ll9fdHlwZSA9PT0gJ0RhdGUnKSB7XG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQuaXNvO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbmZpZy5lbWFpbFZlcmlmeVRva2VuUmV1c2VJZlZhbGlkICYmXG4gICAgICB0aGlzLmNvbmZpZy5lbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbiAmJlxuICAgICAgX2VtYWlsX3ZlcmlmeV90b2tlbiAmJlxuICAgICAgbmV3IERhdGUoKSA8IG5ldyBEYXRlKF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdClcbiAgICApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgdGhpcy5zZXRFbWFpbFZlcmlmeVRva2VuKHVzZXIpO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS51cGRhdGUoJ19Vc2VyJywgeyB1c2VybmFtZTogdXNlci51c2VybmFtZSB9LCB1c2VyKTtcbiAgfVxuXG4gIHJlc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHVzZXJuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VXNlcklmTmVlZGVkKHsgdXNlcm5hbWU6IHVzZXJuYW1lIH0pLnRoZW4oYVVzZXIgPT4ge1xuICAgICAgaWYgKCFhVXNlciB8fCBhVXNlci5lbWFpbFZlcmlmaWVkKSB7XG4gICAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlZ2VuZXJhdGVFbWFpbFZlcmlmeVRva2VuKGFVc2VyKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZW5kVmVyaWZpY2F0aW9uRW1haWwoYVVzZXIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzZXRQYXNzd29yZFJlc2V0VG9rZW4oZW1haWwpIHtcbiAgICBjb25zdCB0b2tlbiA9IHsgX3BlcmlzaGFibGVfdG9rZW46IHJhbmRvbVN0cmluZygyNSkgfTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeSAmJiB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvbikge1xuICAgICAgdG9rZW4uX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdCA9IFBhcnNlLl9lbmNvZGUoXG4gICAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlUGFzc3dvcmRSZXNldFRva2VuRXhwaXJlc0F0KClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLnVwZGF0ZShcbiAgICAgICdfVXNlcicsXG4gICAgICB7ICRvcjogW3sgZW1haWwgfSwgeyB1c2VybmFtZTogZW1haWwsIGVtYWlsOiB7ICRleGlzdHM6IGZhbHNlIH0gfV0gfSxcbiAgICAgIHRva2VuLFxuICAgICAge30sXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRQYXNzd29yZFJlc2V0RW1haWwoZW1haWwpIHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgdGhyb3cgJ1RyeWluZyB0byBzZW5kIGEgcmVzZXQgcGFzc3dvcmQgYnV0IG5vIGFkYXB0ZXIgaXMgc2V0JztcbiAgICAgIC8vICBUT0RPOiBObyBhZGFwdGVyP1xuICAgIH1cbiAgICBsZXQgdXNlcjtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeSAmJlxuICAgICAgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblJldXNlSWZWYWxpZCAmJlxuICAgICAgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb25cbiAgICApIHtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmNvbmZpZy5kYXRhYmFzZS5maW5kKFxuICAgICAgICAnX1VzZXInLFxuICAgICAgICB7XG4gICAgICAgICAgJG9yOiBbXG4gICAgICAgICAgICB7IGVtYWlsLCBfcGVyaXNoYWJsZV90b2tlbjogeyAkZXhpc3RzOiB0cnVlIH0gfSxcbiAgICAgICAgICAgIHsgdXNlcm5hbWU6IGVtYWlsLCBlbWFpbDogeyAkZXhpc3RzOiBmYWxzZSB9LCBfcGVyaXNoYWJsZV90b2tlbjogeyAkZXhpc3RzOiB0cnVlIH0gfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7IGxpbWl0OiAxIH1cbiAgICAgICk7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT0gMSkge1xuICAgICAgICBsZXQgZXhwaXJlc0RhdGUgPSByZXN1bHRzWzBdLl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQ7XG4gICAgICAgIGlmIChleHBpcmVzRGF0ZSAmJiBleHBpcmVzRGF0ZS5fX3R5cGUgPT0gJ0RhdGUnKSB7XG4gICAgICAgICAgZXhwaXJlc0RhdGUgPSBuZXcgRGF0ZShleHBpcmVzRGF0ZS5pc28pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleHBpcmVzRGF0ZSA+IG5ldyBEYXRlKCkpIHtcbiAgICAgICAgICB1c2VyID0gcmVzdWx0c1swXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXVzZXIgfHwgIXVzZXIuX3BlcmlzaGFibGVfdG9rZW4pIHtcbiAgICAgIHVzZXIgPSBhd2FpdCB0aGlzLnNldFBhc3N3b3JkUmVzZXRUb2tlbihlbWFpbCk7XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIuX3BlcmlzaGFibGVfdG9rZW4pO1xuICAgIGNvbnN0IHVzZXJuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIudXNlcm5hbWUpO1xuXG4gICAgY29uc3QgbGluayA9IGJ1aWxkRW1haWxMaW5rKHRoaXMuY29uZmlnLnJlcXVlc3RSZXNldFBhc3N3b3JkVVJMLCB1c2VybmFtZSwgdG9rZW4sIHRoaXMuY29uZmlnKTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgYXBwTmFtZTogdGhpcy5jb25maWcuYXBwTmFtZSxcbiAgICAgIGxpbms6IGxpbmssXG4gICAgICB1c2VyOiBpbmZsYXRlKCdfVXNlcicsIHVzZXIpLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5hZGFwdGVyLnNlbmRQYXNzd29yZFJlc2V0RW1haWwpIHtcbiAgICAgIHRoaXMuYWRhcHRlci5zZW5kUGFzc3dvcmRSZXNldEVtYWlsKG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkYXB0ZXIuc2VuZE1haWwodGhpcy5kZWZhdWx0UmVzZXRQYXNzd29yZEVtYWlsKG9wdGlvbnMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVzZXIpO1xuICB9XG5cbiAgdXBkYXRlUGFzc3dvcmQodXNlcm5hbWUsIHRva2VuLCBwYXNzd29yZCkge1xuICAgIHJldHVybiB0aGlzLmNoZWNrUmVzZXRUb2tlblZhbGlkaXR5KHVzZXJuYW1lLCB0b2tlbilcbiAgICAgIC50aGVuKHVzZXIgPT4gdXBkYXRlVXNlclBhc3N3b3JkKHVzZXIub2JqZWN0SWQsIHBhc3N3b3JkLCB0aGlzLmNvbmZpZykpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgIC8vIGluIGNhc2Ugb2YgUGFyc2UuRXJyb3IsIGZhaWwgd2l0aCB0aGUgZXJyb3IgbWVzc2FnZSBvbmx5XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgZGVmYXVsdFZlcmlmaWNhdGlvbkVtYWlsKHsgbGluaywgdXNlciwgYXBwTmFtZSB9KSB7XG4gICAgY29uc3QgdGV4dCA9XG4gICAgICAnSGksXFxuXFxuJyArXG4gICAgICAnWW91IGFyZSBiZWluZyBhc2tlZCB0byBjb25maXJtIHRoZSBlLW1haWwgYWRkcmVzcyAnICtcbiAgICAgIHVzZXIuZ2V0KCdlbWFpbCcpICtcbiAgICAgICcgd2l0aCAnICtcbiAgICAgIGFwcE5hbWUgK1xuICAgICAgJ1xcblxcbicgK1xuICAgICAgJycgK1xuICAgICAgJ0NsaWNrIGhlcmUgdG8gY29uZmlybSBpdDpcXG4nICtcbiAgICAgIGxpbms7XG4gICAgY29uc3QgdG8gPSB1c2VyLmdldCgnZW1haWwnKTtcbiAgICBjb25zdCBzdWJqZWN0ID0gJ1BsZWFzZSB2ZXJpZnkgeW91ciBlLW1haWwgZm9yICcgKyBhcHBOYW1lO1xuICAgIHJldHVybiB7IHRleHQsIHRvLCBzdWJqZWN0IH07XG4gIH1cblxuICBkZWZhdWx0UmVzZXRQYXNzd29yZEVtYWlsKHsgbGluaywgdXNlciwgYXBwTmFtZSB9KSB7XG4gICAgY29uc3QgdGV4dCA9XG4gICAgICAnSGksXFxuXFxuJyArXG4gICAgICAnWW91IHJlcXVlc3RlZCB0byByZXNldCB5b3VyIHBhc3N3b3JkIGZvciAnICtcbiAgICAgIGFwcE5hbWUgK1xuICAgICAgKHVzZXIuZ2V0KCd1c2VybmFtZScpID8gXCIgKHlvdXIgdXNlcm5hbWUgaXMgJ1wiICsgdXNlci5nZXQoJ3VzZXJuYW1lJykgKyBcIicpXCIgOiAnJykgK1xuICAgICAgJy5cXG5cXG4nICtcbiAgICAgICcnICtcbiAgICAgICdDbGljayBoZXJlIHRvIHJlc2V0IGl0OlxcbicgK1xuICAgICAgbGluaztcbiAgICBjb25zdCB0byA9IHVzZXIuZ2V0KCdlbWFpbCcpIHx8IHVzZXIuZ2V0KCd1c2VybmFtZScpO1xuICAgIGNvbnN0IHN1YmplY3QgPSAnUGFzc3dvcmQgUmVzZXQgZm9yICcgKyBhcHBOYW1lO1xuICAgIHJldHVybiB7IHRleHQsIHRvLCBzdWJqZWN0IH07XG4gIH1cbn1cblxuLy8gTWFyayB0aGlzIHByaXZhdGVcbmZ1bmN0aW9uIHVwZGF0ZVVzZXJQYXNzd29yZCh1c2VySWQsIHBhc3N3b3JkLCBjb25maWcpIHtcbiAgcmV0dXJuIHJlc3QudXBkYXRlKFxuICAgIGNvbmZpZyxcbiAgICBBdXRoLm1hc3Rlcihjb25maWcpLFxuICAgICdfVXNlcicsXG4gICAgeyBvYmplY3RJZDogdXNlcklkIH0sXG4gICAge1xuICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRFbWFpbExpbmsoZGVzdGluYXRpb24sIHVzZXJuYW1lLCB0b2tlbiwgY29uZmlnKSB7XG4gIGNvbnN0IHVzZXJuYW1lQW5kVG9rZW4gPSBgdG9rZW49JHt0b2tlbn0mdXNlcm5hbWU9JHt1c2VybmFtZX1gO1xuXG4gIGlmIChjb25maWcucGFyc2VGcmFtZVVSTCkge1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uV2l0aG91dEhvc3QgPSBkZXN0aW5hdGlvbi5yZXBsYWNlKGNvbmZpZy5wdWJsaWNTZXJ2ZXJVUkwsICcnKTtcblxuICAgIHJldHVybiBgJHtjb25maWcucGFyc2VGcmFtZVVSTH0/bGluaz0ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIGRlc3RpbmF0aW9uV2l0aG91dEhvc3RcbiAgICApfSYke3VzZXJuYW1lQW5kVG9rZW59YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYCR7ZGVzdGluYXRpb259PyR7dXNlcm5hbWVBbmRUb2tlbn1gO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVzZXJDb250cm9sbGVyO1xuIl19
381
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db250cm9sbGVycy9Vc2VyQ29udHJvbGxlci5qcyJdLCJuYW1lcyI6WyJSZXN0UXVlcnkiLCJyZXF1aXJlIiwiQXV0aCIsIlVzZXJDb250cm9sbGVyIiwiQWRhcHRhYmxlQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYWRhcHRlciIsImFwcElkIiwib3B0aW9ucyIsImNvbmZpZyIsIkNvbmZpZyIsImdldCIsInZhbGlkYXRlQWRhcHRlciIsInNob3VsZFZlcmlmeUVtYWlscyIsImV4cGVjdGVkQWRhcHRlclR5cGUiLCJNYWlsQWRhcHRlciIsInZlcmlmeVVzZXJFbWFpbHMiLCJzZXRFbWFpbFZlcmlmeVRva2VuIiwidXNlciIsIl9lbWFpbF92ZXJpZnlfdG9rZW4iLCJlbWFpbFZlcmlmaWVkIiwiZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQiLCJQYXJzZSIsIl9lbmNvZGUiLCJnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQiLCJ2ZXJpZnlFbWFpbCIsInVzZXJuYW1lIiwidG9rZW4iLCJ1bmRlZmluZWQiLCJxdWVyeSIsInVwZGF0ZUZpZWxkcyIsIl9fb3AiLCIkZ3QiLCJEYXRlIiwibWFzdGVyQXV0aCIsIm1hc3RlciIsImZpbmRVc2VyRm9yRW1haWxWZXJpZmljYXRpb24iLCJleGVjdXRlIiwidGhlbiIsInJlc3VsdCIsInJlc3VsdHMiLCJsZW5ndGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9iamVjdElkIiwicmVzdCIsInVwZGF0ZSIsImNoZWNrUmVzZXRUb2tlblZhbGlkaXR5IiwiZGF0YWJhc2UiLCJmaW5kIiwiX3BlcmlzaGFibGVfdG9rZW4iLCJsaW1pdCIsInBhc3N3b3JkUG9saWN5IiwicmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJleHBpcmVzRGF0ZSIsIl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQiLCJfX3R5cGUiLCJpc28iLCJnZXRVc2VySWZOZWVkZWQiLCJlbWFpbCIsIndoZXJlIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwibGluayIsImJ1aWxkRW1haWxMaW5rIiwidmVyaWZ5RW1haWxVUkwiLCJhcHBOYW1lIiwic2VuZE1haWwiLCJkZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwiLCJyZWdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbiIsImVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQiLCJyZXNlbmRWZXJpZmljYXRpb25FbWFpbCIsImFVc2VyIiwic2V0UGFzc3dvcmRSZXNldFRva2VuIiwiZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQiLCIkb3IiLCIkZXhpc3RzIiwic2VuZFBhc3N3b3JkUmVzZXRFbWFpbCIsInJlc2V0VG9rZW5SZXVzZUlmVmFsaWQiLCJyZXF1ZXN0UmVzZXRQYXNzd29yZFVSTCIsImRlZmF1bHRSZXNldFBhc3N3b3JkRW1haWwiLCJ1cGRhdGVQYXNzd29yZCIsInBhc3N3b3JkIiwidXBkYXRlVXNlclBhc3N3b3JkIiwiYWNjb3VudExvY2tvdXRQb2xpY3kiLCJBY2NvdW50TG9ja291dCIsInVubG9ja0FjY291bnQiLCJjYXRjaCIsImVycm9yIiwibWVzc2FnZSIsInJlamVjdCIsInRleHQiLCJ0byIsInN1YmplY3QiLCJkZXN0aW5hdGlvbiIsInVzZXJuYW1lQW5kVG9rZW4iLCJwYXJzZUZyYW1lVVJMIiwiZGVzdGluYXRpb25XaXRob3V0SG9zdCIsInJlcGxhY2UiLCJwdWJsaWNTZXJ2ZXJVUkwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLElBQUlBLFNBQVMsR0FBR0MsT0FBTyxDQUFDLGNBQUQsQ0FBdkI7O0FBQ0EsSUFBSUMsSUFBSSxHQUFHRCxPQUFPLENBQUMsU0FBRCxDQUFsQjs7QUFFTyxNQUFNRSxjQUFOLFNBQTZCQyw0QkFBN0Is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RUFLSDtBQUFFb0MsSUFBQUEsUUFBUSxFQUFFM0IsSUFBSSxDQUFDMkI7QUFBakIsR0FMRyxFQU1IO0FBQ0VzQyxJQUFBQSxRQUFRLEVBQUVBO0FBRFosR0FORyxFQVVKNUMsSUFWSSxDQVVDLE1BQU1yQixJQVZQLENBQVA7QUFXRDs7QUFFRCxTQUFTK0MsY0FBVCxDQUF3QjhCLFdBQXhCLEVBQXFDcEUsUUFBckMsRUFBK0NDLEtBQS9DLEVBQXNEbkIsTUFBdEQsRUFBOEQ7QUFDNUQsUUFBTXVGLGdCQUFnQixHQUFJLFNBQVFwRSxLQUFNLGFBQVlELFFBQVMsRUFBN0Q7O0FBRUEsTUFBSWxCLE1BQU0sQ0FBQ3dGLGFBQVgsRUFBMEI7QUFDeEIsVUFBTUMsc0JBQXNCLEdBQUdILFdBQVcsQ0FBQ0ksT0FBWixDQUFvQjFGLE1BQU0sQ0FBQzJGLGVBQTNCLEVBQTRDLEVBQTVDLENBQS9CO0FBRUEsV0FBUSxHQUFFM0YsTUFBTSxDQUFDd0YsYUFBYyxTQUFRbEMsa0JBQWtCLENBQ3ZEbUMsc0JBRHVELENBRXZELElBQUdGLGdCQUFpQixFQUZ0QjtBQUdELEdBTkQsTUFNTztBQUNMLFdBQVEsR0FBRUQsV0FBWSxJQUFHQyxnQkFBaUIsRUFBMUM7QUFDRDtBQUNGOztlQUVjN0YsYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVN0cmluZyB9IGZyb20gJy4uL2NyeXB0b1V0aWxzJztcbmltcG9ydCB7IGluZmxhdGUgfSBmcm9tICcuLi90cmlnZ2Vycyc7XG5pbXBvcnQgQWRhcHRhYmxlQ29udHJvbGxlciBmcm9tICcuL0FkYXB0YWJsZUNvbnRyb2xsZXInO1xuaW1wb3J0IE1haWxBZGFwdGVyIGZyb20gJy4uL0FkYXB0ZXJzL0VtYWlsL01haWxBZGFwdGVyJztcbmltcG9ydCByZXN0IGZyb20gJy4uL3Jlc3QnO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IEFjY291bnRMb2Nrb3V0IGZyb20gJy4uL0FjY291bnRMb2Nrb3V0JztcbmltcG9ydCBDb25maWcgZnJvbSAnLi4vQ29uZmlnJztcblxudmFyIFJlc3RRdWVyeSA9IHJlcXVpcmUoJy4uL1Jlc3RRdWVyeScpO1xudmFyIEF1dGggPSByZXF1aXJlKCcuLi9BdXRoJyk7XG5cbmV4cG9ydCBjbGFzcyBVc2VyQ29udHJvbGxlciBleHRlbmRzIEFkYXB0YWJsZUNvbnRyb2xsZXIge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyLCBhcHBJZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoYWRhcHRlciwgYXBwSWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gQ29uZmlnLmdldCh0aGlzLmFwcElkKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWRhcHRlcihhZGFwdGVyKSB7XG4gICAgLy8gQWxsb3cgbm8gYWRhcHRlclxuICAgIGlmICghYWRhcHRlciAmJiAhdGhpcy5zaG91bGRWZXJpZnlFbWFpbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIudmFsaWRhdGVBZGFwdGVyKGFkYXB0ZXIpO1xuICB9XG5cbiAgZXhwZWN0ZWRBZGFwdGVyVHlwZSgpIHtcbiAgICByZXR1cm4gTWFpbEFkYXB0ZXI7XG4gIH1cblxuICBnZXQgc2hvdWxkVmVyaWZ5RW1haWxzKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudmVyaWZ5VXNlckVtYWlscztcbiAgfVxuXG4gIHNldEVtYWlsVmVyaWZ5VG9rZW4odXNlcikge1xuICAgIGlmICh0aGlzLnNob3VsZFZlcmlmeUVtYWlscykge1xuICAgICAgdXNlci5fZW1haWxfdmVyaWZ5X3Rva2VuID0gcmFuZG9tU3RyaW5nKDI1KTtcbiAgICAgIHVzZXIuZW1haWxWZXJpZmllZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcuZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgICAgdXNlci5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSBQYXJzZS5fZW5jb2RlKFxuICAgICAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbkV4cGlyZXNBdCgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmVyaWZ5RW1haWwodXNlcm5hbWUsIHRva2VuKSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFZlcmlmeUVtYWlscykge1xuICAgICAgLy8gVHJ5aW5nIHRvIHZlcmlmeSBlbWFpbCB3aGVuIG5vdCBlbmFibGVkXG4gICAgICAvLyBUT0RPOiBCZXR0ZXIgZXJyb3IgaGVyZS5cbiAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeSA9IHsgdXNlcm5hbWU6IHVzZXJuYW1lLCBfZW1haWxfdmVyaWZ5X3Rva2VuOiB0b2tlbiB9O1xuICAgIGNvbnN0IHVwZGF0ZUZpZWxkcyA9IHtcbiAgICAgIGVtYWlsVmVyaWZpZWQ6IHRydWUsXG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuOiB7IF9fb3A6ICdEZWxldGUnIH0sXG4gICAgfTtcblxuICAgIC8vIGlmIHRoZSBlbWFpbCB2ZXJpZnkgdG9rZW4gbmVlZHMgdG8gYmUgdmFsaWRhdGVkIHRoZW5cbiAgICAvLyBhZGQgYWRkaXRpb25hbCBxdWVyeSBwYXJhbXMgYW5kIGFkZGl0aW9uYWwgZmllbGRzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkXG4gICAgaWYgKHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICBxdWVyeS5lbWFpbFZlcmlmaWVkID0gZmFsc2U7XG4gICAgICBxdWVyeS5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSB7ICRndDogUGFyc2UuX2VuY29kZShuZXcgRGF0ZSgpKSB9O1xuXG4gICAgICB1cGRhdGVGaWVsZHMuX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0ID0geyBfX29wOiAnRGVsZXRlJyB9O1xuICAgIH1cbiAgICBjb25zdCBtYXN0ZXJBdXRoID0gQXV0aC5tYXN0ZXIodGhpcy5jb25maWcpO1xuICAgIHZhciBmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uID0gbmV3IFJlc3RRdWVyeShcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgQXV0aC5tYXN0ZXIodGhpcy5jb25maWcpLFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgdXNlcm5hbWU6IHVzZXJuYW1lIH1cbiAgICApO1xuICAgIHJldHVybiBmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uLmV4ZWN1dGUoKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICYmIHJlc3VsdC5yZXN1bHRzWzBdLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQucmVzdWx0cy5sZW5ndGhbMF0pO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQucmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgcXVlcnkub2JqZWN0SWQgPSByZXN1bHQucmVzdWx0c1swXS5vYmplY3RJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN0LnVwZGF0ZSh0aGlzLmNvbmZpZywgbWFzdGVyQXV0aCwgJ19Vc2VyJywgcXVlcnksIHVwZGF0ZUZpZWxkcyk7XG4gICAgfSk7XG4gIH1cblxuICBjaGVja1Jlc2V0VG9rZW5WYWxpZGl0eSh1c2VybmFtZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgIC5maW5kKFxuICAgICAgICAnX1VzZXInLFxuICAgICAgICB7XG4gICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgICAgIF9wZXJpc2hhYmxlX3Rva2VuOiB0b2tlbixcbiAgICAgICAgfSxcbiAgICAgICAgeyBsaW1pdDogMSB9XG4gICAgICApXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICB0aHJvdyAnRmFpbGVkIHRvIHJlc2V0IHBhc3N3b3JkOiB1c2VybmFtZSAvIGVtYWlsIC8gdG9rZW4gaXMgaW52YWxpZCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kgJiYgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgICAgICBsZXQgZXhwaXJlc0RhdGUgPSByZXN1bHRzWzBdLl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQ7XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlICYmIGV4cGlyZXNEYXRlLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICAgICAgICAgIGV4cGlyZXNEYXRlID0gbmV3IERhdGUoZXhwaXJlc0RhdGUuaXNvKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlIDwgbmV3IERhdGUoKSkgdGhyb3cgJ1RoZSBwYXNzd29yZCByZXNldCBsaW5rIGhhcyBleHBpcmVkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0c1swXTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0VXNlcklmTmVlZGVkKHVzZXIpIHtcbiAgICBpZiAodXNlci51c2VybmFtZSAmJiB1c2VyLmVtYWlsKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVzZXIpO1xuICAgIH1cbiAgICB2YXIgd2hlcmUgPSB7fTtcbiAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgd2hlcmUudXNlcm5hbWUgPSB1c2VyLnVzZXJuYW1lO1xuICAgIH1cbiAgICBpZiAodXNlci5lbWFpbCkge1xuICAgICAgd2hlcmUuZW1haWwgPSB1c2VyLmVtYWlsO1xuICAgIH1cblxuICAgIHZhciBxdWVyeSA9IG5ldyBSZXN0UXVlcnkodGhpcy5jb25maWcsIEF1dGgubWFzdGVyKHRoaXMuY29uZmlnKSwgJ19Vc2VyJywgd2hlcmUpO1xuICAgIHJldHVybiBxdWVyeS5leGVjdXRlKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHRzWzBdO1xuICAgIH0pO1xuICB9XG5cbiAgc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHVzZXIpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkVmVyaWZ5RW1haWxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIuX2VtYWlsX3ZlcmlmeV90b2tlbik7XG4gICAgLy8gV2UgbWF5IG5lZWQgdG8gZmV0Y2ggdGhlIHVzZXIgaW4gY2FzZSBvZiB1cGRhdGUgZW1haWxcbiAgICB0aGlzLmdldFVzZXJJZk5lZWRlZCh1c2VyKS50aGVuKHVzZXIgPT4ge1xuICAgICAgY29uc3QgdXNlcm5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSk7XG5cbiAgICAgIGNvbnN0IGxpbmsgPSBidWlsZEVtYWlsTGluayh0aGlzLmNvbmZpZy52ZXJpZnlFbWFpbFVSTCwgdXNlcm5hbWUsIHRva2VuLCB0aGlzLmNvbmZpZyk7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBhcHBOYW1lOiB0aGlzLmNvbmZpZy5hcHBOYW1lLFxuICAgICAgICBsaW5rOiBsaW5rLFxuICAgICAgICB1c2VyOiBpbmZsYXRlKCdfVXNlcicsIHVzZXIpLFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmFkYXB0ZXIuc2VuZFZlcmlmaWNhdGlvbkVtYWlsKSB7XG4gICAgICAgIHRoaXMuYWRhcHRlci5zZW5kVmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkYXB0ZXIuc2VuZE1haWwodGhpcy5kZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2VuZXJhdGVzIHRoZSBnaXZlbiB1c2VyJ3MgZW1haWwgdmVyaWZpY2F0aW9uIHRva2VuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgcmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4odXNlcikge1xuICAgIGNvbnN0IHsgX2VtYWlsX3ZlcmlmeV90b2tlbiB9ID0gdXNlcjtcbiAgICBsZXQgeyBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgfSA9IHVzZXI7XG4gICAgaWYgKF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCAmJiBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQuX190eXBlID09PSAnRGF0ZScpIHtcbiAgICAgIF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCA9IF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdC5pc287XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQgJiZcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uICYmXG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuICYmXG4gICAgICBuZXcgRGF0ZSgpIDwgbmV3IERhdGUoX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0KVxuICAgICkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICB0aGlzLnNldEVtYWlsVmVyaWZ5VG9rZW4odXNlcik7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLnVwZGF0ZSgnX1VzZXInLCB7IHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lIH0sIHVzZXIpO1xuICB9XG5cbiAgcmVzZW5kVmVyaWZpY2F0aW9uRW1haWwodXNlcm5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRVc2VySWZOZWVkZWQoeyB1c2VybmFtZTogdXNlcm5hbWUgfSkudGhlbihhVXNlciA9PiB7XG4gICAgICBpZiAoIWFVc2VyIHx8IGFVc2VyLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4oYVVzZXIpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNlbmRWZXJpZmljYXRpb25FbWFpbChhVXNlcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFBhc3N3b3JkUmVzZXRUb2tlbihlbWFpbCkge1xuICAgIGNvbnN0IHRva2VuID0geyBfcGVyaXNoYWJsZV90b2tlbjogcmFuZG9tU3RyaW5nKDI1KSB9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICB0b2tlbi5fcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0ID0gUGFyc2UuX2VuY29kZShcbiAgICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UudXBkYXRlKFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgJG9yOiBbeyBlbWFpbCB9LCB7IHVzZXJuYW1lOiBlbWFpbCwgZW1haWw6IHsgJGV4aXN0czogZmFsc2UgfSB9XSB9LFxuICAgICAgdG9rZW4sXG4gICAgICB7fSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbChlbWFpbCkge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICB0aHJvdyAnVHJ5aW5nIHRvIHNlbmQgYSByZXNldCBwYXNzd29yZCBidXQgbm8gYWRhcHRlciBpcyBzZXQnO1xuICAgICAgLy8gIFRPRE86IE5vIGFkYXB0ZXI/XG4gICAgfVxuICAgIGxldCB1c2VyO1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuUmV1c2VJZlZhbGlkICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvblxuICAgICkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICdfVXNlcicsXG4gICAgICAgIHtcbiAgICAgICAgICAkb3I6IFtcbiAgICAgICAgICAgIHsgZW1haWwsIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgICAgeyB1c2VybmFtZTogZW1haWwsIGVtYWlsOiB7ICRleGlzdHM6IGZhbHNlIH0sIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGltaXQ6IDEgfVxuICAgICAgKTtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIGxldCBleHBpcmVzRGF0ZSA9IHJlc3VsdHNbMF0uX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdDtcbiAgICAgICAgaWYgKGV4cGlyZXNEYXRlICYmIGV4cGlyZXNEYXRlLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICAgICAgICBleHBpcmVzRGF0ZSA9IG5ldyBEYXRlKGV4cGlyZXNEYXRlLmlzbyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGlyZXNEYXRlID4gbmV3IERhdGUoKSkge1xuICAgICAgICAgIHVzZXIgPSByZXN1bHRzWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdXNlciB8fCAhdXNlci5fcGVyaXNoYWJsZV90b2tlbikge1xuICAgICAgdXNlciA9IGF3YWl0IHRoaXMuc2V0UGFzc3dvcmRSZXNldFRva2VuKGVtYWlsKTtcbiAgICB9XG4gICAgY29uc3QgdG9rZW4gPSBlbmNvZGVVUklDb21wb25lbnQodXNlci5fcGVyaXNoYWJsZV90b2tlbik7XG4gICAgY29uc3QgdXNlcm5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSk7XG5cbiAgICBjb25zdCBsaW5rID0gYnVpbGRFbWFpbExpbmsodGhpcy5jb25maWcucmVxdWVzdFJlc2V0UGFzc3dvcmRVUkwsIHVzZXJuYW1lLCB0b2tlbiwgdGhpcy5jb25maWcpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBhcHBOYW1lOiB0aGlzLmNvbmZpZy5hcHBOYW1lLFxuICAgICAgbGluazogbGluayxcbiAgICAgIHVzZXI6IGluZmxhdGUoJ19Vc2VyJywgdXNlciksXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmFkYXB0ZXIuc2VuZFBhc3N3b3JkUmVzZXRFbWFpbCkge1xuICAgICAgdGhpcy5hZGFwdGVyLnNlbmRQYXNzd29yZFJlc2V0RW1haWwob3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRhcHRlci5zZW5kTWFpbCh0aGlzLmRlZmF1bHRSZXNldFBhc3N3b3JkRW1haWwob3B0aW9ucykpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXNlcik7XG4gIH1cblxuICB1cGRhdGVQYXNzd29yZCh1c2VybmFtZSwgdG9rZW4sIHBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tSZXNldFRva2VuVmFsaWRpdHkodXNlcm5hbWUsIHRva2VuKVxuICAgICAgLnRoZW4odXNlciA9PiB1cGRhdGVVc2VyUGFzc3dvcmQodXNlciwgcGFzc3dvcmQsIHRoaXMuY29uZmlnKSlcbiAgICAgIC50aGVuKHVzZXIgPT4ge1xuICAgICAgICBjb25zdCBhY2NvdW50TG9ja291dFBvbGljeSA9IG5ldyBBY2NvdW50TG9ja291dCh1c2VyLCB0aGlzLmNvbmZpZyk7XG4gICAgICAgIHJldHVybiBhY2NvdW50TG9ja291dFBvbGljeS51bmxvY2tBY2NvdW50KCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICAvLyBpbiBjYXNlIG9mIFBhcnNlLkVycm9yLCBmYWlsIHdpdGggdGhlIGVycm9yIG1lc3NhZ2Ugb25seVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGRlZmF1bHRWZXJpZmljYXRpb25FbWFpbCh7IGxpbmssIHVzZXIsIGFwcE5hbWUgfSkge1xuICAgIGNvbnN0IHRleHQgPVxuICAgICAgJ0hpLFxcblxcbicgK1xuICAgICAgJ1lvdSBhcmUgYmVpbmcgYXNrZWQgdG8gY29uZmlybSB0aGUgZS1tYWlsIGFkZHJlc3MgJyArXG4gICAgICB1c2VyLmdldCgnZW1haWwnKSArXG4gICAgICAnIHdpdGggJyArXG4gICAgICBhcHBOYW1lICtcbiAgICAgICdcXG5cXG4nICtcbiAgICAgICcnICtcbiAgICAgICdDbGljayBoZXJlIHRvIGNvbmZpcm0gaXQ6XFxuJyArXG4gICAgICBsaW5rO1xuICAgIGNvbnN0IHRvID0gdXNlci5nZXQoJ2VtYWlsJyk7XG4gICAgY29uc3Qgc3ViamVjdCA9ICdQbGVhc2UgdmVyaWZ5IHlvdXIgZS1tYWlsIGZvciAnICsgYXBwTmFtZTtcbiAgICByZXR1cm4geyB0ZXh0LCB0bywgc3ViamVjdCB9O1xuICB9XG5cbiAgZGVmYXVsdFJlc2V0UGFzc3dvcmRFbWFpbCh7IGxpbmssIHVzZXIsIGFwcE5hbWUgfSkge1xuICAgIGNvbnN0IHRleHQgPVxuICAgICAgJ0hpLFxcblxcbicgK1xuICAgICAgJ1lvdSByZXF1ZXN0ZWQgdG8gcmVzZXQgeW91ciBwYXNzd29yZCBmb3IgJyArXG4gICAgICBhcHBOYW1lICtcbiAgICAgICh1c2VyLmdldCgndXNlcm5hbWUnKSA/IFwiICh5b3VyIHVzZXJuYW1lIGlzICdcIiArIHVzZXIuZ2V0KCd1c2VybmFtZScpICsgXCInKVwiIDogJycpICtcbiAgICAgICcuXFxuXFxuJyArXG4gICAgICAnJyArXG4gICAgICAnQ2xpY2sgaGVyZSB0byByZXNldCBpdDpcXG4nICtcbiAgICAgIGxpbms7XG4gICAgY29uc3QgdG8gPSB1c2VyLmdldCgnZW1haWwnKSB8fCB1c2VyLmdldCgndXNlcm5hbWUnKTtcbiAgICBjb25zdCBzdWJqZWN0ID0gJ1Bhc3N3b3JkIFJlc2V0IGZvciAnICsgYXBwTmFtZTtcbiAgICByZXR1cm4geyB0ZXh0LCB0bywgc3ViamVjdCB9O1xuICB9XG59XG5cbi8vIE1hcmsgdGhpcyBwcml2YXRlXG5mdW5jdGlvbiB1cGRhdGVVc2VyUGFzc3dvcmQodXNlciwgcGFzc3dvcmQsIGNvbmZpZykge1xuICByZXR1cm4gcmVzdFxuICAgIC51cGRhdGUoXG4gICAgICBjb25maWcsXG4gICAgICBBdXRoLm1hc3Rlcihjb25maWcpLFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgb2JqZWN0SWQ6IHVzZXIub2JqZWN0SWQgfSxcbiAgICAgIHtcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgfVxuICAgIClcbiAgICAudGhlbigoKSA9PiB1c2VyKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRFbWFpbExpbmsoZGVzdGluYXRpb24sIHVzZXJuYW1lLCB0b2tlbiwgY29uZmlnKSB7XG4gIGNvbnN0IHVzZXJuYW1lQW5kVG9rZW4gPSBgdG9rZW49JHt0b2tlbn0mdXNlcm5hbWU9JHt1c2VybmFtZX1gO1xuXG4gIGlmIChjb25maWcucGFyc2VGcmFtZVVSTCkge1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uV2l0aG91dEhvc3QgPSBkZXN0aW5hdGlvbi5yZXBsYWNlKGNvbmZpZy5wdWJsaWNTZXJ2ZXJVUkwsICcnKTtcblxuICAgIHJldHVybiBgJHtjb25maWcucGFyc2VGcmFtZVVSTH0/bGluaz0ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIGRlc3RpbmF0aW9uV2l0aG91dEhvc3RcbiAgICApfSYke3VzZXJuYW1lQW5kVG9rZW59YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYCR7ZGVzdGluYXRpb259PyR7dXNlcm5hbWVBbmRUb2tlbn1gO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVzZXJDb250cm9sbGVyO1xuIl19
@@ -49,8 +49,6 @@ var _PushWorker = require("../Push/PushWorker");
49
49
 
50
50
  var _DatabaseController = _interopRequireDefault(require("./DatabaseController"));
51
51
 
52
- var _SchemaCache = _interopRequireDefault(require("./SchemaCache"));
53
-
54
52
  var _GridFSBucketAdapter = require("../Adapters/Files/GridFSBucketAdapter");
55
53
 
56
54
  var _WinstonLoggerAdapter = require("../Adapters/Logger/WinstonLoggerAdapter");
@@ -67,9 +65,11 @@ var _pushAdapter = _interopRequireDefault(require("@parse/push-adapter"));
67
65
 
68
66
  var _ParseGraphQLController = _interopRequireDefault(require("./ParseGraphQLController"));
69
67
 
68
+ var _SchemaCache = _interopRequireDefault(require("../Adapters/Cache/SchemaCache"));
69
+
70
70
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
71
71
 
72
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
72
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
73
73
 
74
74
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
75
75
 
@@ -89,7 +89,7 @@ function getControllers(options) {
89
89
  const cacheController = getCacheController(options);
90
90
  const analyticsController = getAnalyticsController(options);
91
91
  const liveQueryController = getLiveQueryController(options);
92
- const databaseController = getDatabaseController(options, cacheController);
92
+ const databaseController = getDatabaseController(options);
93
93
  const hooksController = getHooksController(options, databaseController);
94
94
  const authDataManager = getAuthDataManager(options);
95
95
  const parseGraphQLController = getParseGraphQLController(options, {
@@ -111,7 +111,8 @@ function getControllers(options) {
111
111
  liveQueryController,
112
112
  databaseController,
113
113
  hooksController,
114
- authDataManager
114
+ authDataManager,
115
+ schemaCache: _SchemaCache.default
115
116
  };
116
117
  }
117
118
 
@@ -205,13 +206,11 @@ function getLiveQueryController(options) {
205
206
  return new _LiveQueryController.LiveQueryController(options.liveQuery);
206
207
  }
207
208
 
208
- function getDatabaseController(options, cacheController) {
209
+ function getDatabaseController(options) {
209
210
  const {
210
211
  databaseURI,
211
- databaseOptions,
212
212
  collectionPrefix,
213
- schemaCacheTTL,
214
- enableSingleSchemaCache
213
+ databaseOptions
215
214
  } = options;
216
215
  let {
217
216
  databaseAdapter
@@ -225,7 +224,7 @@ function getDatabaseController(options, cacheController) {
225
224
  databaseAdapter = (0, _AdapterLoader.loadAdapter)(databaseAdapter);
226
225
  }
227
226
 
228
- return new _DatabaseController.default(databaseAdapter, new _SchemaCache.default(cacheController, schemaCacheTTL, enableSingleSchemaCache));
227
+ return new _DatabaseController.default(databaseAdapter);
229
228
  }
230
229
 
231
230
  function getHooksController(options, databaseController) {
@@ -309,4 +308,4 @@ function getDatabaseAdapter(databaseURI, collectionPrefix, databaseOptions) {
309
308
  });
310
309
  }
311
310
  }
312
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db250cm9sbGVycy9pbmRleC5qcyJdLCJuYW1lcyI6WyJnZXRDb250cm9sbGVycyIsIm9wdGlvbnMiLCJsb2dnZXJDb250cm9sbGVyIiwiZ2V0TG9nZ2VyQ29udHJvbGxlciIsImZpbGVzQ29udHJvbGxlciIsImdldEZpbGVzQ29udHJvbGxlciIsInVzZXJDb250cm9sbGVyIiwiZ2V0VXNlckNvbnRyb2xsZXIiLCJwdXNoQ29udHJvbGxlciIsImhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0IiwiaGFzUHVzaFN1cHBvcnQiLCJwdXNoQ29udHJvbGxlclF1ZXVlIiwicHVzaFdvcmtlciIsImdldFB1c2hDb250cm9sbGVyIiwiY2FjaGVDb250cm9sbGVyIiwiZ2V0Q2FjaGVDb250cm9sbGVyIiwiYW5hbHl0aWNzQ29udHJvbGxlciIsImdldEFuYWx5dGljc0NvbnRyb2xsZXIiLCJsaXZlUXVlcnlDb250cm9sbGVyIiwiZ2V0TGl2ZVF1ZXJ5Q29udHJvbGxlciIsImRhdGFiYXNlQ29udHJvbGxlciIsImdldERhdGFiYXNlQ29udHJvbGxlciIsImhvb2tzQ29udHJvbGxlciIsImdldEhvb2tzQ29udHJvbGxlciIsImF1dGhEYXRhTWFuYWdlciIsImdldEF1dGhEYXRhTWFuYWdlciIsInBhcnNlR3JhcGhRTENvbnRyb2xsZXIiLCJnZXRQYXJzZUdyYXBoUUxDb250cm9sbGVyIiwiYXBwSWQiLCJqc29uTG9ncyIsImxvZ3NGb2xkZXIiLCJ2ZXJib3NlIiwibG9nTGV2ZWwiLCJtYXhMb2dGaWxlcyIsInNpbGVudCIsImxvZ2dlckFkYXB0ZXIiLCJsb2dnZXJPcHRpb25zIiwibG9nZ2VyQ29udHJvbGxlckFkYXB0ZXIiLCJXaW5zdG9uTG9nZ2VyQWRhcHRlciIsIkxvZ2dlckNvbnRyb2xsZXIiLCJkYXRhYmFzZVVSSSIsImZpbGVzQWRhcHRlciIsImRhdGFiYXNlQWRhcHRlciIsInByZXNlcnZlRmlsZU5hbWUiLCJmaWxlS2V5IiwiZmlsZXNDb250cm9sbGVyQWRhcHRlciIsIkdyaWRGU0J1Y2tldEFkYXB0ZXIiLCJGaWxlc0NvbnRyb2xsZXIiLCJlbWFpbEFkYXB0ZXIiLCJ2ZXJpZnlVc2VyRW1haWxzIiwiZW1haWxDb250cm9sbGVyQWRhcHRlciIsIlVzZXJDb250cm9sbGVyIiwiY2FjaGVBZGFwdGVyIiwiY2FjaGVUVEwiLCJjYWNoZU1heFNpemUiLCJjYWNoZUNvbnRyb2xsZXJBZGFwdGVyIiwiSW5NZW1vcnlDYWNoZUFkYXB0ZXIiLCJ0dGwiLCJtYXhTaXplIiwiQ2FjaGVDb250cm9sbGVyIiwiY29udHJvbGxlckRlcHMiLCJQYXJzZUdyYXBoUUxDb250cm9sbGVyIiwibW91bnRHcmFwaFFMIiwiYW5hbHl0aWNzQWRhcHRlciIsImFuYWx5dGljc0NvbnRyb2xsZXJBZGFwdGVyIiwiQW5hbHl0aWNzQWRhcHRlciIsIkFuYWx5dGljc0NvbnRyb2xsZXIiLCJMaXZlUXVlcnlDb250cm9sbGVyIiwibGl2ZVF1ZXJ5IiwiZGF0YWJhc2VPcHRpb25zIiwiY29sbGVjdGlvblByZWZpeCIsInNjaGVtYUNhY2hlVFRMIiwiZW5hYmxlU2luZ2xlU2NoZW1hQ2FjaGUiLCJkZWZhdWx0cyIsImdldERhdGFiYXNlQWRhcHRlciIsIkRhdGFiYXNlQ29udHJvbGxlciIsIlNjaGVtYUNhY2hlIiwid2ViaG9va0tleSIsIkhvb2tzQ29udHJvbGxlciIsInNjaGVkdWxlZFB1c2giLCJwdXNoIiwicHVzaE9wdGlvbnMiLCJPYmplY3QiLCJhc3NpZ24iLCJwdXNoUXVldWVPcHRpb25zIiwicXVldWVPcHRpb25zIiwicHVzaEFkYXB0ZXIiLCJhZGFwdGVyIiwiUGFyc2VQdXNoQWRhcHRlciIsIlB1c2hDb250cm9sbGVyIiwiZGlzYWJsZVB1c2hXb3JrZXIiLCJQdXNoUXVldWUiLCJQdXNoV29ya2VyIiwiYXV0aCIsImVuYWJsZUFub255bW91c1VzZXJzIiwicHJvdG9jb2wiLCJwYXJzZWRVUkkiLCJ1cmwiLCJwYXJzZSIsInRvTG93ZXJDYXNlIiwiZSIsIlBvc3RncmVzU3Rv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QUEsR0FBRyxFQUFFOUQsV0FEMkI7QUFFaEM4QixRQUFBQSxnQkFGZ0M7QUFHaENELFFBQUFBO0FBSGdDLE9BQTNCLENBQVA7O0FBS0Y7QUFDRSxhQUFPLElBQUlrQyw0QkFBSixDQUF3QjtBQUM3QkQsUUFBQUEsR0FBRyxFQUFFOUQsV0FEd0I7QUFFN0I4QixRQUFBQSxnQkFGNkI7QUFHN0JrQyxRQUFBQSxZQUFZLEVBQUVuQztBQUhlLE9BQXhCLENBQVA7QUFSSjtBQWNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGF1dGhEYXRhTWFuYWdlciBmcm9tICcuLi9BZGFwdGVycy9BdXRoJztcbmltcG9ydCB7IFBhcnNlU2VydmVyT3B0aW9ucyB9IGZyb20gJy4uL09wdGlvbnMnO1xuaW1wb3J0IHsgbG9hZEFkYXB0ZXIgfSBmcm9tICcuLi9BZGFwdGVycy9BZGFwdGVyTG9hZGVyJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cyc7XG5pbXBvcnQgdXJsIGZyb20gJ3VybCc7XG4vLyBDb250cm9sbGVyc1xuaW1wb3J0IHsgTG9nZ2VyQ29udHJvbGxlciB9IGZyb20gJy4vTG9nZ2VyQ29udHJvbGxlcic7XG5pbXBvcnQgeyBGaWxlc0NvbnRyb2xsZXIgfSBmcm9tICcuL0ZpbGVzQ29udHJvbGxlcic7XG5pbXBvcnQgeyBIb29rc0NvbnRyb2xsZXIgfSBmcm9tICcuL0hvb2tzQ29udHJvbGxlcic7XG5pbXBvcnQgeyBVc2VyQ29udHJvbGxlciB9IGZyb20gJy4vVXNlckNvbnRyb2xsZXInO1xuaW1wb3J0IHsgQ2FjaGVDb250cm9sbGVyIH0gZnJvbSAnLi9DYWNoZUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgTGl2ZVF1ZXJ5Q29udHJvbGxlciB9IGZyb20gJy4vTGl2ZVF1ZXJ5Q29udHJvbGxlcic7XG5pbXBvcnQgeyBBbmFseXRpY3NDb250cm9sbGVyIH0gZnJvbSAnLi9BbmFseXRpY3NDb250cm9sbGVyJztcbmltcG9ydCB7IFB1c2hDb250cm9sbGVyIH0gZnJvbSAnLi9QdXNoQ29udHJvbGxlcic7XG5pbXBvcnQgeyBQdXNoUXVldWUgfSBmcm9tICcuLi9QdXNoL1B1c2hRdWV1ZSc7XG5pbXBvcnQgeyBQdXNoV29ya2VyIH0gZnJvbSAnLi4vUHVzaC9QdXNoV29ya2VyJztcbmltcG9ydCBEYXRhYmFzZUNvbnRyb2xsZXIgZnJvbSAnLi9EYXRhYmFzZUNvbnRyb2xsZXInO1xuaW1wb3J0IFNjaGVtYUNhY2hlIGZyb20gJy4vU2NoZW1hQ2FjaGUnO1xuXG4vLyBBZGFwdGVyc1xuaW1wb3J0IHsgR3JpZEZTQnVja2V0QWRhcHRlciB9IGZyb20gJy4uL0FkYXB0ZXJzL0ZpbGVzL0dyaWRGU0J1Y2tldEFkYXB0ZXInO1xuaW1wb3J0IHsgV2luc3RvbkxvZ2dlckFkYXB0ZXIgfSBmcm9tICcuLi9BZGFwdGVycy9Mb2dnZXIvV2luc3RvbkxvZ2dlckFkYXB0ZXInO1xuaW1wb3J0IHsgSW5NZW1vcnlDYWNoZUFkYXB0ZXIgfSBmcm9tICcuLi9BZGFwdGVycy9DYWNoZS9Jbk1lbW9yeUNhY2hlQWRhcHRlcic7XG5pbXBvcnQgeyBBbmFseXRpY3NBZGFwdGVyIH0gZnJvbSAnLi4vQWRhcHRlcnMvQW5hbHl0aWNzL0FuYWx5dGljc0FkYXB0ZXInO1xuaW1wb3J0IE1vbmdvU3RvcmFnZUFkYXB0ZXIgZnJvbSAnLi4vQWRhcHRlcnMvU3RvcmFnZS9Nb25nby9Nb25nb1N0b3JhZ2VBZGFwdGVyJztcbmltcG9ydCBQb3N0Z3Jlc1N0b3JhZ2VBZGFwdGVyIGZyb20gJy4uL0FkYXB0ZXJzL1N0b3JhZ2UvUG9zdGdyZXMvUG9zdGdyZXNTdG9yYWdlQWRhcHRlcic7XG5pbXBvcnQgUGFyc2VQdXNoQWRhcHRlciBmcm9tICdAcGFyc2UvcHVzaC1hZGFwdGVyJztcbmltcG9ydCBQYXJzZUdyYXBoUUxDb250cm9sbGVyIGZyb20gJy4vUGFyc2VHcmFwaFFMQ29udHJvbGxlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cm9sbGVycyhvcHRpb25zOiBQYXJzZVNlcnZlck9wdGlvbnMpIHtcbiAgY29uc3QgbG9nZ2VyQ29udHJvbGxlciA9IGdldExvZ2dlckNvbnRyb2xsZXIob3B0aW9ucyk7XG4gIGNvbnN0IGZpbGVzQ29udHJvbGxlciA9IGdldEZpbGVzQ29udHJvbGxlcihvcHRpb25zKTtcbiAgY29uc3QgdXNlckNvbnRyb2xsZXIgPSBnZXRVc2VyQ29udHJvbGxlcihvcHRpb25zKTtcbiAgY29uc3Qge1xuICAgIHB1c2hDb250cm9sbGVyLFxuICAgIGhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0LFxuICAgIGhhc1B1c2hTdXBwb3J0LFxuICAgIHB1c2hDb250cm9sbGVyUXVldWUsXG4gICAgcHVzaFdvcmtlcixcbiAgfSA9IGdldFB1c2hDb250cm9sbGVyKG9wdGlvbnMpO1xuICBjb25zdCBjYWNoZUNvbnRyb2xsZXIgPSBnZXRDYWNoZUNvbnRyb2xsZXIob3B0aW9ucyk7XG4gIGNvbnN0IGFuYWx5dGljc0NvbnRyb2xsZXIgPSBnZXRBbmFseXRpY3NDb250cm9sbGVyKG9wdGlvbnMpO1xuICBjb25zdCBsaXZlUXVlcnlDb250cm9sbGVyID0gZ2V0TGl2ZVF1ZXJ5Q29udHJvbGxlcihvcHRpb25zKTtcbiAgY29uc3QgZGF0YWJhc2VDb250cm9sbGVyID0gZ2V0RGF0YWJhc2VDb250cm9sbGVyKG9wdGlvbnMsIGNhY2hlQ29udHJvbGxlcik7XG4gIGNvbnN0IGhvb2tzQ29udHJvbGxlciA9IGdldEhvb2tzQ29udHJvbGxlcihvcHRpb25zLCBkYXRhYmFzZUNvbnRyb2xsZXIpO1xuICBjb25zdCBhdXRoRGF0YU1hbmFnZXIgPSBnZXRBdXRoRGF0YU1hbmFnZXIob3B0aW9ucyk7XG4gIGNvbnN0IHBhcnNlR3JhcGhRTENvbnRyb2xsZXIgPSBnZXRQYXJzZUdyYXBoUUxDb250cm9sbGVyKG9wdGlvbnMsIHtcbiAgICBkYXRhYmFzZUNvbnRyb2xsZXIsXG4gICAgY2FjaGVDb250cm9sbGVyLFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBsb2dnZXJDb250cm9sbGVyLFxuICAgIGZpbGVzQ29udHJvbGxlcixcbiAgICB1c2VyQ29udHJvbGxlcixcbiAgICBwdXNoQ29udHJvbGxlcixcbiAgICBoYXNQdXNoU2NoZWR1bGVkU3VwcG9ydCxcbiAgICBoYXNQdXNoU3VwcG9ydCxcbiAgICBwdXNoV29ya2VyLFxuICAgIHB1c2hDb250cm9sbGVyUXVldWUsXG4gICAgYW5hbHl0aWNzQ29udHJvbGxlcixcbiAgICBjYWNoZUNvbnRyb2xsZXIsXG4gICAgcGFyc2VHcmFwaFFMQ29udHJvbGxlcixcbiAgICBsaXZlUXVlcnlDb250cm9sbGVyLFxuICAgIGRhdGFiYXNlQ29udHJvbGxlcixcbiAgICBob29rc0NvbnRyb2xsZXIsXG4gICAgYXV0aERhdGFNYW5hZ2VyLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9nZ2VyQ29udHJvbGxlcihvcHRpb25zOiBQYXJzZVNlcnZlck9wdGlvbnMpOiBMb2dnZXJDb250cm9sbGVyIHtcbiAgY29uc3Qge1xuICAgIGFwcElkLFxuICAgIGpzb25Mb2dzLFxuICAgIGxvZ3NGb2xkZXIsXG4gICAgdmVyYm9zZSxcbiAgICBsb2dMZXZlbCxcbiAgICBtYXhMb2dGaWxlcyxcbiAgICBzaWxlbnQsXG4gICAgbG9nZ2VyQWRhcHRlcixcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxvZ2dlck9wdGlvbnMgPSB7XG4gICAganNvbkxvZ3MsXG4gICAgbG9nc0ZvbGRlcixcbiAgICB2ZXJib3NlLFxuICAgIGxvZ0xldmVsLFxuICAgIHNpbGVudCxcbiAgICBtYXhMb2dGaWxlcyxcbiAgfTtcbiAgY29uc3QgbG9nZ2VyQ29udHJvbGxlckFkYXB0ZXIgPSBsb2FkQWRhcHRlcihsb2dnZXJBZGFwdGVyLCBXaW5zdG9uTG9nZ2VyQWRhcHRlciwgbG9nZ2VyT3B0aW9ucyk7XG4gIHJldHVybiBuZXcgTG9nZ2VyQ29udHJvbGxlcihsb2dnZXJDb250cm9sbGVyQWRhcHRlciwgYXBwSWQsIGxvZ2dlck9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZXNDb250cm9sbGVyKG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucyk6IEZpbGVzQ29udHJvbGxlciB7XG4gIGNvbnN0IHsgYXBwSWQsIGRhdGFiYXNlVVJJLCBmaWxlc0FkYXB0ZXIsIGRhdGFiYXNlQWRhcHRlciwgcHJlc2VydmVGaWxlTmFtZSwgZmlsZUtleSB9ID0gb3B0aW9ucztcbiAgaWYgKCFmaWxlc0FkYXB0ZXIgJiYgZGF0YWJhc2VBZGFwdGVyKSB7XG4gICAgdGhyb3cgJ1doZW4gdXNpbmcgYW4gZXhwbGljaXQgZGF0YWJhc2UgYWRhcHRlciwgeW91IG11c3QgYWxzbyB1c2UgYW4gZXhwbGljaXQgZmlsZXNBZGFwdGVyLic7XG4gIH1cbiAgY29uc3QgZmlsZXNDb250cm9sbGVyQWRhcHRlciA9IGxvYWRBZGFwdGVyKGZpbGVzQWRhcHRlciwgKCkgPT4ge1xuICAgIHJldHVybiBuZXcgR3JpZEZTQnVja2V0QWRhcHRlcihkYXRhYmFzZVVSSSwge30sIGZpbGVLZXkpO1xuICB9KTtcbiAgcmV0dXJuIG5ldyBGaWxlc0NvbnRyb2xsZXIoZmlsZXNDb250cm9sbGVyQWRhcHRlciwgYXBwSWQsIHtcbiAgICBwcmVzZXJ2ZUZpbGVOYW1lLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJDb250cm9sbGVyKG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucyk6IFVzZXJDb250cm9sbGVyIHtcbiAgY29uc3QgeyBhcHBJZCwgZW1haWxBZGFwdGVyLCB2ZXJpZnlVc2VyRW1haWxzIH0gPSBvcHRpb25zO1xuICBjb25zdCBlbWFpbENvbnRyb2xsZXJBZGFwdGVyID0gbG9hZEFkYXB0ZXIoZW1haWxBZGFwdGVyKTtcbiAgcmV0dXJuIG5ldyBVc2VyQ29udHJvbGxlcihlbWFpbENvbnRyb2xsZXJBZGFwdGVyLCBhcHBJZCwge1xuICAgIHZlcmlmeVVzZXJFbWFpbHMsXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVDb250cm9sbGVyKG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucyk6IENhY2hlQ29udHJvbGxlciB7XG4gIGNvbnN0IHsgYXBwSWQsIGNhY2hlQWRhcHRlciwgY2FjaGVUVEwsIGNhY2hlTWF4U2l6ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgY2FjaGVDb250cm9sbGVyQWRhcHRlciA9IGxvYWRBZGFwdGVyKGNhY2hlQWRhcHRlciwgSW5NZW1vcnlDYWNoZUFkYXB0ZXIsIHtcbiAgICBhcHBJZDogYXBwSWQsXG4gICAgdHRsOiBjYWNoZVRUTCxcbiAgICBtYXhTaXplOiBjYWNoZU1heFNpemUsXG4gIH0pO1xuICByZXR1cm4gbmV3IENhY2hlQ29udHJvbGxlcihjYWNoZUNvbnRyb2xsZXJBZGFwdGVyLCBhcHBJZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJzZUdyYXBoUUxDb250cm9sbGVyKFxuICBvcHRpb25zOiBQYXJzZVNlcnZlck9wdGlvbnMsXG4gIGNvbnRyb2xsZXJEZXBzXG4pOiBQYXJzZUdyYXBoUUxDb250cm9sbGVyIHtcbiAgcmV0dXJuIG5ldyBQYXJzZUdyYXBoUUxDb250cm9sbGVyKHtcbiAgICBtb3VudEdyYXBoUUw6IG9wdGlvbnMubW91bnRHcmFwaFFMLFxuICAgIC4uLmNvbnRyb2xsZXJEZXBzLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFuYWx5dGljc0NvbnRyb2xsZXIob3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zKTogQW5hbHl0aWNzQ29udHJvbGxlciB7XG4gIGNvbnN0IHsgYW5hbHl0aWNzQWRhcHRlciB9ID0gb3B0aW9ucztcbiAgY29uc3QgYW5hbHl0aWNzQ29udHJvbGxlckFkYXB0ZXIgPSBsb2FkQWRhcHRlcihhbmFseXRpY3NBZGFwdGVyLCBBbmFseXRpY3NBZGFwdGVyKTtcbiAgcmV0dXJuIG5ldyBBbmFseXRpY3NDb250cm9sbGVyKGFuYWx5dGljc0NvbnRyb2xsZXJBZGFwdGVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExpdmVRdWVyeUNvbnRyb2xsZXIob3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zKTogTGl2ZVF1ZXJ5Q29udHJvbGxlciB7XG4gIHJldHVybiBuZXcgTGl2ZVF1ZXJ5Q29udHJvbGxlcihvcHRpb25zLmxpdmVRdWVyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhYmFzZUNvbnRyb2xsZXIoXG4gIG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucyxcbiAgY2FjaGVDb250cm9sbGVyOiBDYWNoZUNvbnRyb2xsZXJcbik6IERhdGFiYXNlQ29udHJvbGxlciB7XG4gIGNvbnN0IHtcbiAgICBkYXRhYmFzZVVSSSxcbiAgICBkYXRhYmFzZU9wdGlvbnMsXG4gICAgY29sbGVjdGlvblByZWZpeCxcbiAgICBzY2hlbWFDYWNoZVRUTCxcbiAgICBlbmFibGVTaW5nbGVTY2hlbWFDYWNoZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGxldCB7IGRhdGFiYXNlQWRhcHRlciB9ID0gb3B0aW9ucztcbiAgaWYgKFxuICAgIChkYXRhYmFzZU9wdGlvbnMgfHxcbiAgICAgIChkYXRhYmFzZVVSSSAmJiBkYXRhYmFzZVVSSSAhPT0gZGVmYXVsdHMuZGF0YWJhc2VVUkkpIHx8XG4gICAgICBjb2xsZWN0aW9uUHJlZml4ICE9PSBkZWZhdWx0cy5jb2xsZWN0aW9uUHJlZml4KSAmJlxuICAgIGRhdGFiYXNlQWRhcHRlclxuICApIHtcbiAgICB0aHJvdyAnWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggYSBkYXRhYmFzZUFkYXB0ZXIgYW5kIGEgZGF0YWJhc2VVUkkvZGF0YWJhc2VPcHRpb25zL2NvbGxlY3Rpb25QcmVmaXguJztcbiAgfSBlbHNlIGlmICghZGF0YWJhc2VBZGFwdGVyKSB7XG4gICAgZGF0YWJhc2VBZGFwdGVyID0gZ2V0RGF0YWJhc2VBZGFwdGVyKGRhdGFiYXNlVVJJLCBjb2xsZWN0aW9uUHJlZml4LCBkYXRhYmFzZU9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIGRhdGFiYXNlQWRhcHRlciA9IGxvYWRBZGFwdGVyKGRhdGFiYXNlQWRhcHRlcik7XG4gIH1cbiAgcmV0dXJuIG5ldyBEYXRhYmFzZUNvbnRyb2xsZXIoXG4gICAgZGF0YWJhc2VBZGFwdGVyLFxuICAgIG5ldyBTY2hlbWFDYWNoZShjYWNoZUNvbnRyb2xsZXIsIHNjaGVtYUNhY2hlVFRMLCBlbmFibGVTaW5nbGVTY2hlbWFDYWNoZSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhvb2tzQ29udHJvbGxlcihcbiAgb3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zLFxuICBkYXRhYmFzZUNvbnRyb2xsZXI6IERhdGFiYXNlQ29udHJvbGxlclxuKTogSG9va3NDb250cm9sbGVyIHtcbiAgY29uc3QgeyBhcHBJZCwgd2ViaG9va0tleSB9ID0gb3B0aW9ucztcbiAgcmV0dXJuIG5ldyBIb29rc0NvbnRyb2xsZXIoYXBwSWQsIGRhdGFiYXNlQ29udHJvbGxlciwgd2ViaG9va0tleSk7XG59XG5cbmludGVyZmFjZSBQdXNoQ29udHJvbGxpbmcge1xuICBwdXNoQ29udHJvbGxlcjogUHVzaENvbnRyb2xsZXI7XG4gIGhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0OiBib29sZWFuO1xuICBwdXNoQ29udHJvbGxlclF1ZXVlOiBQdXNoUXVldWU7XG4gIHB1c2hXb3JrZXI6IFB1c2hXb3JrZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQdXNoQ29udHJvbGxlcihvcHRpb25zOiBQYXJzZVNlcnZlck9wdGlvbnMpOiBQdXNoQ29udHJvbGxpbmcge1xuICBjb25zdCB7IHNjaGVkdWxlZFB1c2gsIHB1c2ggfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgcHVzaE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwdXNoKTtcbiAgY29uc3QgcHVzaFF1ZXVlT3B0aW9ucyA9IHB1c2hPcHRpb25zLnF1ZXVlT3B0aW9ucyB8fCB7fTtcbiAgaWYgKHB1c2hPcHRpb25zLnF1ZXVlT3B0aW9ucykge1xuICAgIGRlbGV0ZSBwdXNoT3B0aW9ucy5xdWV1ZU9wdGlvbnM7XG4gIH1cblxuICAvLyBQYXNzIHRoZSBwdXNoIG9wdGlvbnMgdG9vIGFzIGl0IHdvcmtzIHdpdGggdGhlIGRlZmF1bHRcbiAgY29uc3QgcHVzaEFkYXB0ZXIgPSBsb2FkQWRhcHRlcihcbiAgICBwdXNoT3B0aW9ucyAmJiBwdXNoT3B0aW9ucy5hZGFwdGVyLFxuICAgIFBhcnNlUHVzaEFkYXB0ZXIsXG4gICAgcHVzaE9wdGlvbnNcbiAgKTtcbiAgLy8gV2UgcGFzcyB0aGUgb3B0aW9ucyBhbmQgdGhlIGJhc2UgY2xhc3MgZm9yIHRoZSBhZGF0cGVyLFxuICAvLyBOb3RlIHRoYXQgcGFzc2luZyBhbiBpbnN0YW5jZSB3b3VsZCB3b3JrIHRvb1xuICBjb25zdCBwdXNoQ29udHJvbGxlciA9IG5ldyBQdXNoQ29udHJvbGxlcigpO1xuICBjb25zdCBoYXNQdXNoU3VwcG9ydCA9ICEhKHB1c2hBZGFwdGVyICYmIHB1c2gpO1xuICBjb25zdCBoYXNQdXNoU2NoZWR1bGVkU3VwcG9ydCA9IGhhc1B1c2hTdXBwb3J0ICYmIHNjaGVkdWxlZFB1c2ggPT09IHRydWU7XG5cbiAgY29uc3QgeyBkaXNhYmxlUHVzaFdvcmtlciB9ID0gcHVzaFF1ZXVlT3B0aW9ucztcblxuICBjb25zdCBwdXNoQ29udHJvbGxlclF1ZXVlID0gbmV3IFB1c2hRdWV1ZShwdXNoUXVldWVPcHRpb25zKTtcbiAgbGV0IHB1c2hXb3JrZXI7XG4gIGlmICghZGlzYWJsZVB1c2hXb3JrZXIpIHtcbiAgICBwdXNoV29ya2VyID0gbmV3IFB1c2hXb3JrZXIocHVzaEFkYXB0ZXIsIHB1c2hRdWV1ZU9wdGlvbnMpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHVzaENvbnRyb2xsZXIsXG4gICAgaGFzUHVzaFN1cHBvcnQsXG4gICAgaGFzUHVzaFNjaGVkdWxlZFN1cHBvcnQsXG4gICAgcHVzaENvbnRyb2xsZXJRdWV1ZSxcbiAgICBwdXNoV29ya2VyLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXV0aERhdGFNYW5hZ2VyKG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucykge1xuICBjb25zdCB7IGF1dGgsIGVuYWJsZUFub255bW91c1VzZXJzIH0gPSBvcHRpb25zO1xuICByZXR1cm4gYXV0aERhdGFNYW5hZ2VyKGF1dGgsIGVuYWJsZUFub255bW91c1VzZXJzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFiYXNlQWRhcHRlcihkYXRhYmFzZVVSSSwgY29sbGVjdGlvblByZWZpeCwgZGF0YWJhc2VPcHRpb25zKSB7XG4gIGxldCBwcm90b2NvbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWRVUkkgPSB1cmwucGFyc2UoZGF0YWJhc2VVUkkpO1xuICAgIHByb3RvY29sID0gcGFyc2VkVVJJLnByb3RvY29sID8gcGFyc2VkVVJJLnByb3RvY29sLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLyogKi9cbiAgfVxuICBzd2l0Y2ggKHByb3RvY29sKSB7XG4gICAgY2FzZSAncG9zdGdyZXM6JzpcbiAgICAgIHJldHVybiBuZXcgUG9zdGdyZXNTdG9yYWdlQWRhcHRlcih7XG4gICAgICAgIHVyaTogZGF0YWJhc2VVUkksXG4gICAgICAgIGNvbGxlY3Rpb25QcmVmaXgsXG4gICAgICAgIGRhdGFiYXNlT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbmV3IE1vbmdvU3RvcmFnZUFkYXB0ZXIoe1xuICAgICAgICB1cmk6IGRhdGFiYXNlVVJJLFxuICAgICAgICBjb2xsZWN0aW9uUHJlZml4LFxuICAgICAgICBtb25nb09wdGlvbnM6IGRhdGFiYXNlT3B0aW9ucyxcbiAgICAgIH0pO1xuICB9XG59XG4iXX0=
311
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db250cm9sbGVycy9pbmRleC5qcyJdLCJuYW1lcyI6WyJnZXRDb250cm9sbGVycyIsIm9wdGlvbnMiLCJsb2dnZXJDb250cm9sbGVyIiwiZ2V0TG9nZ2VyQ29udHJvbGxlciIsImZpbGVzQ29udHJvbGxlciIsImdldEZpbGVzQ29udHJvbGxlciIsInVzZXJDb250cm9sbGVyIiwiZ2V0VXNlckNvbnRyb2xsZXIiLCJwdXNoQ29udHJvbGxlciIsImhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0IiwiaGFzUHVzaFN1cHBvcnQiLCJwdXNoQ29udHJvbGxlclF1ZXVlIiwicHVzaFdvcmtlciIsImdldFB1c2hDb250cm9sbGVyIiwiY2FjaGVDb250cm9sbGVyIiwiZ2V0Q2FjaGVDb250cm9sbGVyIiwiYW5hbHl0aWNzQ29udHJvbGxlciIsImdldEFuYWx5dGljc0NvbnRyb2xsZXIiLCJsaXZlUXVlcnlDb250cm9sbGVyIiwiZ2V0TGl2ZVF1ZXJ5Q29udHJvbGxlciIsImRhdGFiYXNlQ29udHJvbGxlciIsImdldERhdGFiYXNlQ29udHJvbGxlciIsImhvb2tzQ29udHJvbGxlciIsImdldEhvb2tzQ29udHJvbGxlciIsImF1dGhEYXRhTWFuYWdlciIsImdldEF1dGhEYXRhTWFuYWdlciIsInBhcnNlR3JhcGhRTENvbnRyb2xsZXIiLCJnZXRQYXJzZUdyYXBoUUxDb250cm9sbGVyIiwic2NoZW1hQ2FjaGUiLCJTY2hlbWFDYWNoZSIsImFwcElkIiwianNvbkxvZ3MiLCJsb2dzRm9sZGVyIiwidmVyYm9zZSIsImxvZ0xldmVsIiwibWF4TG9nRmlsZXMiLCJzaWxlbnQiLCJsb2dnZXJBZGFwdGVyIiwibG9nZ2VyT3B0aW9ucyIsImxvZ2dlckNvbnRyb2xsZXJBZGFwdGVyIiwiV2luc3RvbkxvZ2dlckFkYXB0ZXIiLCJMb2dnZXJDb250cm9sbGVyIiwiZGF0YWJhc2VVUkkiLCJmaWxlc0FkYXB0ZXIiLCJkYXRhYmFzZUFkYXB0ZXIiLCJwcmVzZXJ2ZUZpbGVOYW1lIiwiZmlsZUtleSIsImZpbGVzQ29udHJvbGxlckFkYXB0ZXIiLCJHcmlkRlNCdWNrZXRBZGFwdGVyIiwiRmlsZXNDb250cm9sbGVyIiwiZW1haWxBZGFwdGVyIiwidmVyaWZ5VXNlckVtYWlscyIsImVtYWlsQ29udHJvbGxlckFkYXB0ZXIiLCJVc2VyQ29udHJvbGxlciIsImNhY2hlQWRhcHRlciIsImNhY2hlVFRMIiwiY2FjaGVNYXhTaXplIiwiY2FjaGVDb250cm9sbGVyQWRhcHRlciIsIkluTWVtb3J5Q2FjaGVBZGFwdGVyIiwidHRsIiwibWF4U2l6ZSIsIkNhY2hlQ29udHJvbGxlciIsImNvbnRyb2xsZXJEZXBzIiwiUGFyc2VHcmFwaFFMQ29udHJvbGxlciIsIm1vdW50R3JhcGhRTCIsImFuYWx5dGljc0FkYXB0ZXIiLCJhbmFseXRpY3NDb250cm9sbGVyQWRhcHRlciIsIkFuYWx5dGljc0FkYXB0ZXIiLCJBbmFseXRpY3NDb250cm9sbGVyIiwiTGl2ZVF1ZXJ5Q29udHJvbGxlciIsImxpdmVRdWVyeSIsImNvbGxlY3Rpb25QcmVmaXgiLCJkYXRhYmFzZU9wdGlvbnMiLCJkZWZhdWx0cyIsImdldERhdGFiYXNlQWRhcHRlciIsIkRhdGFiYXNlQ29udHJvbGxlciIsIndlYmhvb2tLZXkiLCJIb29rc0NvbnRyb2xsZXIiLCJzY2hlZHVsZWRQdXNoIiwicHVzaCIsInB1c2hPcHRpb25zIiwiT2JqZWN0IiwiYXNzaWduIiwicHVzaFF1ZXVlT3B0aW9ucyIsInF1ZXVlT3B0aW9ucyIsInB1c2hBZGFwdGVyIiwiYWRhcHRlciIsIlBhcnNlUHVzaEFkYXB0ZXIiLCJQdXNoQ29udHJvbGxlciIsImRpc2FibGVQdXNoV29ya2VyIiwiUHVzaFF1ZXVlIiwiUHVzaFdvcmtlciIsImF1dGgiLCJlbmFibGVBbm9ueW1vdXNVc2VycyIsInByb3RvY29sIiwicGFyc2VkVVJJIiwidXJsIiwicGFyc2UiLCJ0b0xvd2VyQ2FzZSIsImUiLCJQb3N0Z3Jlc1N0b3JhZ2VBZGFwdGVyIiwidXJpIiwiTW9uZ29TdG9y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N0JELFFBQUFBLEdBQUcsRUFBRTNELFdBRHdCO0FBRTdCNkIsUUFBQUEsZ0JBRjZCO0FBRzdCZ0MsUUFBQUEsWUFBWSxFQUFFL0I7QUFIZSxPQUF4QixDQUFQO0FBUko7QUFjRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhdXRoRGF0YU1hbmFnZXIgZnJvbSAnLi4vQWRhcHRlcnMvQXV0aCc7XG5pbXBvcnQgeyBQYXJzZVNlcnZlck9wdGlvbnMgfSBmcm9tICcuLi9PcHRpb25zJztcbmltcG9ydCB7IGxvYWRBZGFwdGVyIH0gZnJvbSAnLi4vQWRhcHRlcnMvQWRhcHRlckxvYWRlcic7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMnO1xuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xuLy8gQ29udHJvbGxlcnNcbmltcG9ydCB7IExvZ2dlckNvbnRyb2xsZXIgfSBmcm9tICcuL0xvZ2dlckNvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmlsZXNDb250cm9sbGVyIH0gZnJvbSAnLi9GaWxlc0NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSG9va3NDb250cm9sbGVyIH0gZnJvbSAnLi9Ib29rc0NvbnRyb2xsZXInO1xuaW1wb3J0IHsgVXNlckNvbnRyb2xsZXIgfSBmcm9tICcuL1VzZXJDb250cm9sbGVyJztcbmltcG9ydCB7IENhY2hlQ29udHJvbGxlciB9IGZyb20gJy4vQ2FjaGVDb250cm9sbGVyJztcbmltcG9ydCB7IExpdmVRdWVyeUNvbnRyb2xsZXIgfSBmcm9tICcuL0xpdmVRdWVyeUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgQW5hbHl0aWNzQ29udHJvbGxlciB9IGZyb20gJy4vQW5hbHl0aWNzQ29udHJvbGxlcic7XG5pbXBvcnQgeyBQdXNoQ29udHJvbGxlciB9IGZyb20gJy4vUHVzaENvbnRyb2xsZXInO1xuaW1wb3J0IHsgUHVzaFF1ZXVlIH0gZnJvbSAnLi4vUHVzaC9QdXNoUXVldWUnO1xuaW1wb3J0IHsgUHVzaFdvcmtlciB9IGZyb20gJy4uL1B1c2gvUHVzaFdvcmtlcic7XG5pbXBvcnQgRGF0YWJhc2VDb250cm9sbGVyIGZyb20gJy4vRGF0YWJhc2VDb250cm9sbGVyJztcblxuLy8gQWRhcHRlcnNcbmltcG9ydCB7IEdyaWRGU0J1Y2tldEFkYXB0ZXIgfSBmcm9tICcuLi9BZGFwdGVycy9GaWxlcy9HcmlkRlNCdWNrZXRBZGFwdGVyJztcbmltcG9ydCB7IFdpbnN0b25Mb2dnZXJBZGFwdGVyIH0gZnJvbSAnLi4vQWRhcHRlcnMvTG9nZ2VyL1dpbnN0b25Mb2dnZXJBZGFwdGVyJztcbmltcG9ydCB7IEluTWVtb3J5Q2FjaGVBZGFwdGVyIH0gZnJvbSAnLi4vQWRhcHRlcnMvQ2FjaGUvSW5NZW1vcnlDYWNoZUFkYXB0ZXInO1xuaW1wb3J0IHsgQW5hbHl0aWNzQWRhcHRlciB9IGZyb20gJy4uL0FkYXB0ZXJzL0FuYWx5dGljcy9BbmFseXRpY3NBZGFwdGVyJztcbmltcG9ydCBNb25nb1N0b3JhZ2VBZGFwdGVyIGZyb20gJy4uL0FkYXB0ZXJzL1N0b3JhZ2UvTW9uZ28vTW9uZ29TdG9yYWdlQWRhcHRlcic7XG5pbXBvcnQgUG9zdGdyZXNTdG9yYWdlQWRhcHRlciBmcm9tICcuLi9BZGFwdGVycy9TdG9yYWdlL1Bvc3RncmVzL1Bvc3RncmVzU3RvcmFnZUFkYXB0ZXInO1xuaW1wb3J0IFBhcnNlUHVzaEFkYXB0ZXIgZnJvbSAnQHBhcnNlL3B1c2gtYWRhcHRlcic7XG5pbXBvcnQgUGFyc2VHcmFwaFFMQ29udHJvbGxlciBmcm9tICcuL1BhcnNlR3JhcGhRTENvbnRyb2xsZXInO1xuaW1wb3J0IFNjaGVtYUNhY2hlIGZyb20gJy4uL0FkYXB0ZXJzL0NhY2hlL1NjaGVtYUNhY2hlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRyb2xsZXJzKG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucykge1xuICBjb25zdCBsb2dnZXJDb250cm9sbGVyID0gZ2V0TG9nZ2VyQ29udHJvbGxlcihvcHRpb25zKTtcbiAgY29uc3QgZmlsZXNDb250cm9sbGVyID0gZ2V0RmlsZXNDb250cm9sbGVyKG9wdGlvbnMpO1xuICBjb25zdCB1c2VyQ29udHJvbGxlciA9IGdldFVzZXJDb250cm9sbGVyKG9wdGlvbnMpO1xuICBjb25zdCB7XG4gICAgcHVzaENvbnRyb2xsZXIsXG4gICAgaGFzUHVzaFNjaGVkdWxlZFN1cHBvcnQsXG4gICAgaGFzUHVzaFN1cHBvcnQsXG4gICAgcHVzaENvbnRyb2xsZXJRdWV1ZSxcbiAgICBwdXNoV29ya2VyLFxuICB9ID0gZ2V0UHVzaENvbnRyb2xsZXIob3B0aW9ucyk7XG4gIGNvbnN0IGNhY2hlQ29udHJvbGxlciA9IGdldENhY2hlQ29udHJvbGxlcihvcHRpb25zKTtcbiAgY29uc3QgYW5hbHl0aWNzQ29udHJvbGxlciA9IGdldEFuYWx5dGljc0NvbnRyb2xsZXIob3B0aW9ucyk7XG4gIGNvbnN0IGxpdmVRdWVyeUNvbnRyb2xsZXIgPSBnZXRMaXZlUXVlcnlDb250cm9sbGVyKG9wdGlvbnMpO1xuICBjb25zdCBkYXRhYmFzZUNvbnRyb2xsZXIgPSBnZXREYXRhYmFzZUNvbnRyb2xsZXIob3B0aW9ucyk7XG4gIGNvbnN0IGhvb2tzQ29udHJvbGxlciA9IGdldEhvb2tzQ29udHJvbGxlcihvcHRpb25zLCBkYXRhYmFzZUNvbnRyb2xsZXIpO1xuICBjb25zdCBhdXRoRGF0YU1hbmFnZXIgPSBnZXRBdXRoRGF0YU1hbmFnZXIob3B0aW9ucyk7XG4gIGNvbnN0IHBhcnNlR3JhcGhRTENvbnRyb2xsZXIgPSBnZXRQYXJzZUdyYXBoUUxDb250cm9sbGVyKG9wdGlvbnMsIHtcbiAgICBkYXRhYmFzZUNvbnRyb2xsZXIsXG4gICAgY2FjaGVDb250cm9sbGVyLFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBsb2dnZXJDb250cm9sbGVyLFxuICAgIGZpbGVzQ29udHJvbGxlcixcbiAgICB1c2VyQ29udHJvbGxlcixcbiAgICBwdXNoQ29udHJvbGxlcixcbiAgICBoYXNQdXNoU2NoZWR1bGVkU3VwcG9ydCxcbiAgICBoYXNQdXNoU3VwcG9ydCxcbiAgICBwdXNoV29ya2VyLFxuICAgIHB1c2hDb250cm9sbGVyUXVldWUsXG4gICAgYW5hbHl0aWNzQ29udHJvbGxlcixcbiAgICBjYWNoZUNvbnRyb2xsZXIsXG4gICAgcGFyc2VHcmFwaFFMQ29udHJvbGxlcixcbiAgICBsaXZlUXVlcnlDb250cm9sbGVyLFxuICAgIGRhdGFiYXNlQ29udHJvbGxlcixcbiAgICBob29rc0NvbnRyb2xsZXIsXG4gICAgYXV0aERhdGFNYW5hZ2VyLFxuICAgIHNjaGVtYUNhY2hlOiBTY2hlbWFDYWNoZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2dlckNvbnRyb2xsZXIob3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zKTogTG9nZ2VyQ29udHJvbGxlciB7XG4gIGNvbnN0IHtcbiAgICBhcHBJZCxcbiAgICBqc29uTG9ncyxcbiAgICBsb2dzRm9sZGVyLFxuICAgIHZlcmJvc2UsXG4gICAgbG9nTGV2ZWwsXG4gICAgbWF4TG9nRmlsZXMsXG4gICAgc2lsZW50LFxuICAgIGxvZ2dlckFkYXB0ZXIsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBsb2dnZXJPcHRpb25zID0ge1xuICAgIGpzb25Mb2dzLFxuICAgIGxvZ3NGb2xkZXIsXG4gICAgdmVyYm9zZSxcbiAgICBsb2dMZXZlbCxcbiAgICBzaWxlbnQsXG4gICAgbWF4TG9nRmlsZXMsXG4gIH07XG4gIGNvbnN0IGxvZ2dlckNvbnRyb2xsZXJBZGFwdGVyID0gbG9hZEFkYXB0ZXIobG9nZ2VyQWRhcHRlciwgV2luc3RvbkxvZ2dlckFkYXB0ZXIsIGxvZ2dlck9wdGlvbnMpO1xuICByZXR1cm4gbmV3IExvZ2dlckNvbnRyb2xsZXIobG9nZ2VyQ29udHJvbGxlckFkYXB0ZXIsIGFwcElkLCBsb2dnZXJPcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVzQ29udHJvbGxlcihvcHRpb25zOiBQYXJzZVNlcnZlck9wdGlvbnMpOiBGaWxlc0NvbnRyb2xsZXIge1xuICBjb25zdCB7IGFwcElkLCBkYXRhYmFzZVVSSSwgZmlsZXNBZGFwdGVyLCBkYXRhYmFzZUFkYXB0ZXIsIHByZXNlcnZlRmlsZU5hbWUsIGZpbGVLZXkgfSA9IG9wdGlvbnM7XG4gIGlmICghZmlsZXNBZGFwdGVyICYmIGRhdGFiYXNlQWRhcHRlcikge1xuICAgIHRocm93ICdXaGVuIHVzaW5nIGFuIGV4cGxpY2l0IGRhdGFiYXNlIGFkYXB0ZXIsIHlvdSBtdXN0IGFsc28gdXNlIGFuIGV4cGxpY2l0IGZpbGVzQWRhcHRlci4nO1xuICB9XG4gIGNvbnN0IGZpbGVzQ29udHJvbGxlckFkYXB0ZXIgPSBsb2FkQWRhcHRlcihmaWxlc0FkYXB0ZXIsICgpID0+IHtcbiAgICByZXR1cm4gbmV3IEdyaWRGU0J1Y2tldEFkYXB0ZXIoZGF0YWJhc2VVUkksIHt9LCBmaWxlS2V5KTtcbiAgfSk7XG4gIHJldHVybiBuZXcgRmlsZXNDb250cm9sbGVyKGZpbGVzQ29udHJvbGxlckFkYXB0ZXIsIGFwcElkLCB7XG4gICAgcHJlc2VydmVGaWxlTmFtZSxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVc2VyQ29udHJvbGxlcihvcHRpb25zOiBQYXJzZVNlcnZlck9wdGlvbnMpOiBVc2VyQ29udHJvbGxlciB7XG4gIGNvbnN0IHsgYXBwSWQsIGVtYWlsQWRhcHRlciwgdmVyaWZ5VXNlckVtYWlscyB9ID0gb3B0aW9ucztcbiAgY29uc3QgZW1haWxDb250cm9sbGVyQWRhcHRlciA9IGxvYWRBZGFwdGVyKGVtYWlsQWRhcHRlcik7XG4gIHJldHVybiBuZXcgVXNlckNvbnRyb2xsZXIoZW1haWxDb250cm9sbGVyQWRhcHRlciwgYXBwSWQsIHtcbiAgICB2ZXJpZnlVc2VyRW1haWxzLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENhY2hlQ29udHJvbGxlcihvcHRpb25zOiBQYXJzZVNlcnZlck9wdGlvbnMpOiBDYWNoZUNvbnRyb2xsZXIge1xuICBjb25zdCB7IGFwcElkLCBjYWNoZUFkYXB0ZXIsIGNhY2hlVFRMLCBjYWNoZU1heFNpemUgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNhY2hlQ29udHJvbGxlckFkYXB0ZXIgPSBsb2FkQWRhcHRlcihjYWNoZUFkYXB0ZXIsIEluTWVtb3J5Q2FjaGVBZGFwdGVyLCB7XG4gICAgYXBwSWQ6IGFwcElkLFxuICAgIHR0bDogY2FjaGVUVEwsXG4gICAgbWF4U2l6ZTogY2FjaGVNYXhTaXplLFxuICB9KTtcbiAgcmV0dXJuIG5ldyBDYWNoZUNvbnRyb2xsZXIoY2FjaGVDb250cm9sbGVyQWRhcHRlciwgYXBwSWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyc2VHcmFwaFFMQ29udHJvbGxlcihcbiAgb3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zLFxuICBjb250cm9sbGVyRGVwc1xuKTogUGFyc2VHcmFwaFFMQ29udHJvbGxlciB7XG4gIHJldHVybiBuZXcgUGFyc2VHcmFwaFFMQ29udHJvbGxlcih7XG4gICAgbW91bnRHcmFwaFFMOiBvcHRpb25zLm1vdW50R3JhcGhRTCxcbiAgICAuLi5jb250cm9sbGVyRGVwcyxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmFseXRpY3NDb250cm9sbGVyKG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucyk6IEFuYWx5dGljc0NvbnRyb2xsZXIge1xuICBjb25zdCB7IGFuYWx5dGljc0FkYXB0ZXIgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGFuYWx5dGljc0NvbnRyb2xsZXJBZGFwdGVyID0gbG9hZEFkYXB0ZXIoYW5hbHl0aWNzQWRhcHRlciwgQW5hbHl0aWNzQWRhcHRlcik7XG4gIHJldHVybiBuZXcgQW5hbHl0aWNzQ29udHJvbGxlcihhbmFseXRpY3NDb250cm9sbGVyQWRhcHRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXZlUXVlcnlDb250cm9sbGVyKG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucyk6IExpdmVRdWVyeUNvbnRyb2xsZXIge1xuICByZXR1cm4gbmV3IExpdmVRdWVyeUNvbnRyb2xsZXIob3B0aW9ucy5saXZlUXVlcnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YWJhc2VDb250cm9sbGVyKG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucyk6IERhdGFiYXNlQ29udHJvbGxlciB7XG4gIGNvbnN0IHsgZGF0YWJhc2VVUkksIGNvbGxlY3Rpb25QcmVmaXgsIGRhdGFiYXNlT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgbGV0IHsgZGF0YWJhc2VBZGFwdGVyIH0gPSBvcHRpb25zO1xuICBpZiAoXG4gICAgKGRhdGFiYXNlT3B0aW9ucyB8fFxuICAgICAgKGRhdGFiYXNlVVJJICYmIGRhdGFiYXNlVVJJICE9PSBkZWZhdWx0cy5kYXRhYmFzZVVSSSkgfHxcbiAgICAgIGNvbGxlY3Rpb25QcmVmaXggIT09IGRlZmF1bHRzLmNvbGxlY3Rpb25QcmVmaXgpICYmXG4gICAgZGF0YWJhc2VBZGFwdGVyXG4gICkge1xuICAgIHRocm93ICdZb3UgY2Fubm90IHNwZWNpZnkgYm90aCBhIGRhdGFiYXNlQWRhcHRlciBhbmQgYSBkYXRhYmFzZVVSSS9kYXRhYmFzZU9wdGlvbnMvY29sbGVjdGlvblByZWZpeC4nO1xuICB9IGVsc2UgaWYgKCFkYXRhYmFzZUFkYXB0ZXIpIHtcbiAgICBkYXRhYmFzZUFkYXB0ZXIgPSBnZXREYXRhYmFzZUFkYXB0ZXIoZGF0YWJhc2VVUkksIGNvbGxlY3Rpb25QcmVmaXgsIGRhdGFiYXNlT3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgZGF0YWJhc2VBZGFwdGVyID0gbG9hZEFkYXB0ZXIoZGF0YWJhc2VBZGFwdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3IERhdGFiYXNlQ29udHJvbGxlcihkYXRhYmFzZUFkYXB0ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SG9va3NDb250cm9sbGVyKFxuICBvcHRpb25zOiBQYXJzZVNlcnZlck9wdGlvbnMsXG4gIGRhdGFiYXNlQ29udHJvbGxlcjogRGF0YWJhc2VDb250cm9sbGVyXG4pOiBIb29rc0NvbnRyb2xsZXIge1xuICBjb25zdCB7IGFwcElkLCB3ZWJob29rS2V5IH0gPSBvcHRpb25zO1xuICByZXR1cm4gbmV3IEhvb2tzQ29udHJvbGxlcihhcHBJZCwgZGF0YWJhc2VDb250cm9sbGVyLCB3ZWJob29rS2V5KTtcbn1cblxuaW50ZXJmYWNlIFB1c2hDb250cm9sbGluZyB7XG4gIHB1c2hDb250cm9sbGVyOiBQdXNoQ29udHJvbGxlcjtcbiAgaGFzUHVzaFNjaGVkdWxlZFN1cHBvcnQ6IGJvb2xlYW47XG4gIHB1c2hDb250cm9sbGVyUXVldWU6IFB1c2hRdWV1ZTtcbiAgcHVzaFdvcmtlcjogUHVzaFdvcmtlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFB1c2hDb250cm9sbGVyKG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucyk6IFB1c2hDb250cm9sbGluZyB7XG4gIGNvbnN0IHsgc2NoZWR1bGVkUHVzaCwgcHVzaCB9ID0gb3B0aW9ucztcblxuICBjb25zdCBwdXNoT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHB1c2gpO1xuICBjb25zdCBwdXNoUXVldWVPcHRpb25zID0gcHVzaE9wdGlvbnMucXVldWVPcHRpb25zIHx8IHt9O1xuICBpZiAocHVzaE9wdGlvbnMucXVldWVPcHRpb25zKSB7XG4gICAgZGVsZXRlIHB1c2hPcHRpb25zLnF1ZXVlT3B0aW9ucztcbiAgfVxuXG4gIC8vIFBhc3MgdGhlIHB1c2ggb3B0aW9ucyB0b28gYXMgaXQgd29ya3Mgd2l0aCB0aGUgZGVmYXVsdFxuICBjb25zdCBwdXNoQWRhcHRlciA9IGxvYWRBZGFwdGVyKFxuICAgIHB1c2hPcHRpb25zICYmIHB1c2hPcHRpb25zLmFkYXB0ZXIsXG4gICAgUGFyc2VQdXNoQWRhcHRlcixcbiAgICBwdXNoT3B0aW9uc1xuICApO1xuICAvLyBXZSBwYXNzIHRoZSBvcHRpb25zIGFuZCB0aGUgYmFzZSBjbGFzcyBmb3IgdGhlIGFkYXRwZXIsXG4gIC8vIE5vdGUgdGhhdCBwYXNzaW5nIGFuIGluc3RhbmNlIHdvdWxkIHdvcmsgdG9vXG4gIGNvbnN0IHB1c2hDb250cm9sbGVyID0gbmV3IFB1c2hDb250cm9sbGVyKCk7XG4gIGNvbnN0IGhhc1B1c2hTdXBwb3J0ID0gISEocHVzaEFkYXB0ZXIgJiYgcHVzaCk7XG4gIGNvbnN0IGhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0ID0gaGFzUHVzaFN1cHBvcnQgJiYgc2NoZWR1bGVkUHVzaCA9PT0gdHJ1ZTtcblxuICBjb25zdCB7IGRpc2FibGVQdXNoV29ya2VyIH0gPSBwdXNoUXVldWVPcHRpb25zO1xuXG4gIGNvbnN0IHB1c2hDb250cm9sbGVyUXVldWUgPSBuZXcgUHVzaFF1ZXVlKHB1c2hRdWV1ZU9wdGlvbnMpO1xuICBsZXQgcHVzaFdvcmtlcjtcbiAgaWYgKCFkaXNhYmxlUHVzaFdvcmtlcikge1xuICAgIHB1c2hXb3JrZXIgPSBuZXcgUHVzaFdvcmtlcihwdXNoQWRhcHRlciwgcHVzaFF1ZXVlT3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwdXNoQ29udHJvbGxlcixcbiAgICBoYXNQdXNoU3VwcG9ydCxcbiAgICBoYXNQdXNoU2NoZWR1bGVkU3VwcG9ydCxcbiAgICBwdXNoQ29udHJvbGxlclF1ZXVlLFxuICAgIHB1c2hXb3JrZXIsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdXRoRGF0YU1hbmFnZXIob3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zKSB7XG4gIGNvbnN0IHsgYXV0aCwgZW5hYmxlQW5vbnltb3VzVXNlcnMgfSA9IG9wdGlvbnM7XG4gIHJldHVybiBhdXRoRGF0YU1hbmFnZXIoYXV0aCwgZW5hYmxlQW5vbnltb3VzVXNlcnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YWJhc2VBZGFwdGVyKGRhdGFiYXNlVVJJLCBjb2xsZWN0aW9uUHJlZml4LCBkYXRhYmFzZU9wdGlvbnMpIHtcbiAgbGV0IHByb3RvY29sO1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZFVSSSA9IHVybC5wYXJzZShkYXRhYmFzZVVSSSk7XG4gICAgcHJvdG9jb2wgPSBwYXJzZWRVUkkucHJvdG9jb2wgPyBwYXJzZWRVUkkucHJvdG9jb2wudG9Mb3dlckNhc2UoKSA6IG51bGw7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvKiAqL1xuICB9XG4gIHN3aXRjaCAocHJvdG9jb2wpIHtcbiAgICBjYXNlICdwb3N0Z3JlczonOlxuICAgICAgcmV0dXJuIG5ldyBQb3N0Z3Jlc1N0b3JhZ2VBZGFwdGVyKHtcbiAgICAgICAgdXJpOiBkYXRhYmFzZVVSSSxcbiAgICAgICAgY29sbGVjdGlvblByZWZpeCxcbiAgICAgICAgZGF0YWJhc2VPcHRpb25zLFxuICAgICAgfSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBuZXcgTW9uZ29TdG9yYWdlQWRhcHRlcih7XG4gICAgICAgIHVyaTogZGF0YWJhc2VVUkksXG4gICAgICAgIGNvbGxlY3Rpb25QcmVmaXgsXG4gICAgICAgIG1vbmdvT3B0aW9uczogZGF0YWJhc2VPcHRpb25zLFxuICAgICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * The deprecations.
5
+ *
6
+ * Add deprecations to the array using the following keys:
7
+ * - `optionKey` {String}: The option key incl. its path, e.g. `security.enableCheck`.
8
+ * - `envKey` {String}: The environment key, e.g. `PARSE_SERVER_SECURITY`.
9
+ * - `changeNewKey` {String}: Set the new key name if the current key will be replaced,
10
+ * or set to an empty string if the current key will be removed without replacement.
11
+ * - `changeNewDefault` {String}: Set the new default value if the key's default value
12
+ * will change in a future version.
13
+ * - `solution`: The instruction to resolve this deprecation warning. Optional. This
14
+ * instruction must not include the deprecation warning which is auto-generated.
15
+ * It should only contain additional instruction regarding the deprecation if
16
+ * necessary.
17
+ *
18
+ * If there are no deprecations, this must return an empty array.
19
+ */
20
+ module.exports = [{
21
+ optionKey: 'directAccess',
22
+ changeNewDefault: 'true',
23
+ solution: "Additionally, the environment variable 'PARSE_SERVER_ENABLE_EXPERIMENTAL_DIRECT_ACCESS' will be deprecated and renamed to 'PARSE_SERVER_DIRECT_ACCESS' in a future version; it is currently possible to use either one."
24
+ }, {
25
+ optionKey: 'enforcePrivateUsers',
26
+ changeNewDefault: 'true'
27
+ }];
28
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9EZXByZWNhdG9yL0RlcHJlY2F0aW9ucy5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwib3B0aW9uS2V5IiwiY2hhbmdlTmV3RGVmYXVsdCIsInNvbHV0aW9uIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQUEsTUFBTSxDQUFDQyxPQUFQLEdBQWlCLENBQ2Y7QUFDRUMsRUFBQUEsU0FBUyxFQUFFLGNBRGI7QUFFRUMsRUFBQUEsZ0JBQWdCLEVBQUUsTUFGcEI7QUFHRUMsRUFBQUEsUUFBUSxFQUNOO0FBSkosQ0FEZSxFQU9mO0FBQUVGLEVBQUFBLFNBQVMsRUFBRSxxQkFBYjtBQUFvQ0MsRUFBQUEsZ0JBQWdCLEVBQUU7QUFBdEQsQ0FQZSxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGRlcHJlY2F0aW9ucy5cbiAqXG4gKiBBZGQgZGVwcmVjYXRpb25zIHRvIHRoZSBhcnJheSB1c2luZyB0aGUgZm9sbG93aW5nIGtleXM6XG4gKiAtIGBvcHRpb25LZXlgIHtTdHJpbmd9OiBUaGUgb3B0aW9uIGtleSBpbmNsLiBpdHMgcGF0aCwgZS5nLiBgc2VjdXJpdHkuZW5hYmxlQ2hlY2tgLlxuICogLSBgZW52S2V5YCB7U3RyaW5nfTogVGhlIGVudmlyb25tZW50IGtleSwgZS5nLiBgUEFSU0VfU0VSVkVSX1NFQ1VSSVRZYC5cbiAqIC0gYGNoYW5nZU5ld0tleWAge1N0cmluZ306IFNldCB0aGUgbmV3IGtleSBuYW1lIGlmIHRoZSBjdXJyZW50IGtleSB3aWxsIGJlIHJlcGxhY2VkLFxuICogb3Igc2V0IHRvIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgY3VycmVudCBrZXkgd2lsbCBiZSByZW1vdmVkIHdpdGhvdXQgcmVwbGFjZW1lbnQuXG4gKiAtIGBjaGFuZ2VOZXdEZWZhdWx0YCB7U3RyaW5nfTogU2V0IHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBpZiB0aGUga2V5J3MgZGVmYXVsdCB2YWx1ZVxuICogd2lsbCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbi5cbiAqIC0gYHNvbHV0aW9uYDogVGhlIGluc3RydWN0aW9uIHRvIHJlc29sdmUgdGhpcyBkZXByZWNhdGlvbiB3YXJuaW5nLiBPcHRpb25hbC4gVGhpc1xuICogaW5zdHJ1Y3Rpb24gbXVzdCBub3QgaW5jbHVkZSB0aGUgZGVwcmVjYXRpb24gd2FybmluZyB3aGljaCBpcyBhdXRvLWdlbmVyYXRlZC5cbiAqIEl0IHNob3VsZCBvbmx5IGNvbnRhaW4gYWRkaXRpb25hbCBpbnN0cnVjdGlvbiByZWdhcmRpbmcgdGhlIGRlcHJlY2F0aW9uIGlmXG4gKiBuZWNlc3NhcnkuXG4gKlxuICogSWYgdGhlcmUgYXJlIG5vIGRlcHJlY2F0aW9ucywgdGhpcyBtdXN0IHJldHVybiBhbiBlbXB0eSBhcnJheS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBbXG4gIHtcbiAgICBvcHRpb25LZXk6ICdkaXJlY3RBY2Nlc3MnLFxuICAgIGNoYW5nZU5ld0RlZmF1bHQ6ICd0cnVlJyxcbiAgICBzb2x1dGlvbjpcbiAgICAgIFwiQWRkaXRpb25hbGx5LCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJ1BBUlNFX1NFUlZFUl9FTkFCTEVfRVhQRVJJTUVOVEFMX0RJUkVDVF9BQ0NFU1MnIHdpbGwgYmUgZGVwcmVjYXRlZCBhbmQgcmVuYW1lZCB0byAnUEFSU0VfU0VSVkVSX0RJUkVDVF9BQ0NFU1MnIGluIGEgZnV0dXJlIHZlcnNpb247IGl0IGlzIGN1cnJlbnRseSBwb3NzaWJsZSB0byB1c2UgZWl0aGVyIG9uZS5cIixcbiAgfSxcbiAgeyBvcHRpb25LZXk6ICdlbmZvcmNlUHJpdmF0ZVVzZXJzJywgY2hhbmdlTmV3RGVmYXVsdDogJ3RydWUnIH0sXG5dO1xuIl19
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+
3
+ var _logger = _interopRequireDefault(require("../logger"));
4
+
5
+ var _Deprecations = _interopRequireDefault(require("./Deprecations"));
6
+
7
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
+
9
+ /**
10
+ * The deprecator class.
11
+ */
12
+ class Deprecator {
13
+ /**
14
+ * Scans the Parse Server for deprecated options.
15
+ * This needs to be called before setting option defaults, otherwise it
16
+ * becomes indistinguishable whether an option has been set manually or
17
+ * by default.
18
+ * @param {any} options The Parse Server options.
19
+ */
20
+ static scanParseServerOptions(options) {
21
+ // Scan for deprecations
22
+ for (const deprecation of Deprecator._getDeprecations()) {
23
+ // Get deprecation properties
24
+ const solution = deprecation.solution;
25
+ const optionKey = deprecation.optionKey;
26
+ const changeNewDefault = deprecation.changeNewDefault; // If default will change, only throw a warning if option is not set
27
+
28
+ if (changeNewDefault != null && options[optionKey] == null) {
29
+ Deprecator._logOption({
30
+ optionKey,
31
+ changeNewDefault,
32
+ solution
33
+ });
34
+ }
35
+ }
36
+ }
37
+ /**
38
+ * Logs a deprecation warning for a parameter that can only be determined dynamically
39
+ * during runtime.
40
+ *
41
+ * Note: Do not use this to log deprecations of Parse Server options, but add such
42
+ * deprecations to `Deprecations.js` instead. See the contribution docs for more
43
+ * details.
44
+ *
45
+ * For consistency, the deprecation warning is composed of the following parts:
46
+ *
47
+ * > DeprecationWarning: `usage` is deprecated and will be removed in a future version.
48
+ * `solution`.
49
+ *
50
+ * - `usage`: The deprecated usage.
51
+ * - `solution`: The instruction to resolve this deprecation warning.
52
+ *
53
+ * For example:
54
+ * > DeprecationWarning: `Prefixing field names with dollar sign ($) in aggregation query`
55
+ * is deprecated and will be removed in a future version. `Reference field names without
56
+ * dollar sign prefix.`
57
+ *
58
+ * @param {Object} options The deprecation options.
59
+ * @param {String} options.usage The usage that is deprecated.
60
+ * @param {String} [options.solution] The instruction to resolve this deprecation warning.
61
+ * Optional. It is recommended to add an instruction for the convenience of the developer.
62
+ */
63
+
64
+
65
+ static logRuntimeDeprecation(options) {
66
+ Deprecator._logGeneric(options);
67
+ }
68
+ /**
69
+ * Returns the deprecation definitions.
70
+ * @returns {Array<Object>} The deprecations.
71
+ */
72
+
73
+
74
+ static _getDeprecations() {
75
+ return _Deprecations.default;
76
+ }
77
+ /**
78
+ * Logs a generic deprecation warning.
79
+ *
80
+ * @param {Object} options The deprecation options.
81
+ * @param {String} options.usage The usage that is deprecated.
82
+ * @param {String} [options.solution] The instruction to resolve this deprecation warning.
83
+ * Optional. It is recommended to add an instruction for the convenience of the developer.
84
+ */
85
+
86
+
87
+ static _logGeneric({
88
+ usage,
89
+ solution
90
+ }) {
91
+ // Compose message
92
+ let output = `DeprecationWarning: ${usage} is deprecated and will be removed in a future version.`;
93
+ output += solution ? ` ${solution}` : '';
94
+
95
+ _logger.default.warn(output);
96
+ }
97
+ /**
98
+ * Logs a deprecation warning for a Parse Server option.
99
+ *
100
+ * @param {String} optionKey The option key incl. its path, e.g. `security.enableCheck`.
101
+ * @param {String} envKey The environment key, e.g. `PARSE_SERVER_SECURITY`.
102
+ * @param {String} changeNewKey Set the new key name if the current key will be replaced,
103
+ * or set to an empty string if the current key will be removed without replacement.
104
+ * @param {String} changeNewDefault Set the new default value if the key's default value
105
+ * will change in a future version.
106
+ * @param {String} [solution] The instruction to resolve this deprecation warning. This
107
+ * message must not include the warning that the parameter is deprecated, that is
108
+ * automatically added to the message. It should only contain the instruction on how
109
+ * to resolve this warning.
110
+ */
111
+
112
+
113
+ static _logOption({
114
+ optionKey,
115
+ envKey,
116
+ changeNewKey,
117
+ changeNewDefault,
118
+ solution
119
+ }) {
120
+ const type = optionKey ? 'option' : 'environment key';
121
+ const key = optionKey ? optionKey : envKey;
122
+ const keyAction = changeNewKey == null ? undefined : changeNewKey.length > 0 ? `renamed to '${changeNewKey}'` : `removed`; // Compose message
123
+
124
+ let output = `DeprecationWarning: The Parse Server ${type} '${key}' `;
125
+ output += changeNewKey ? `is deprecated and will be ${keyAction} in a future version.` : '';
126
+ output += changeNewDefault ? `default will change to '${changeNewDefault}' in a future version.` : '';
127
+ output += solution ? ` ${solution}` : '';
128
+
129
+ _logger.default.warn(output);
130
+ }
131
+
132
+ }
133
+
134
+ module.exports = Deprecator;
135
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9EZXByZWNhdG9yL0RlcHJlY2F0b3IuanMiXSwibmFtZXMiOlsiRGVwcmVjYXRvciIsInNjYW5QYXJzZVNlcnZlck9wdGlvbnMiLCJvcHRpb25zIiwiZGVwcmVjYXRpb24iLCJfZ2V0RGVwcmVjYXRpb25zIiwic29sdXRpb24iLCJvcHRpb25LZXkiLCJjaGFuZ2VOZXdEZWZhdWx0IiwiX2xvZ09wdGlvbiIsImxvZ1J1bnRpbWVEZXByZWNhdGlvbiIsIl9sb2dHZW5lcmljIiwiRGVwcmVjYXRpb25zIiwidXNhZ2UiLCJvdXRwdXQiLCJsb2dnZXIiLCJ3YXJuIiwiZW52S2V5IiwiY2hhbmdlTmV3S2V5IiwidHlwZSIsImtleSIsImtleUFjdGlvbiIsInVuZGVmaW5lZCIsImxlbmd0aCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7O0FBQ0E7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQSxVQUFOLENBQWlCO0FBQ2Y7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDK0IsU0FBdEJDLHNCQUFzQixDQUFDQyxPQUFELEVBQVU7QUFDckM7QUFDQSxTQUFLLE1BQU1DLFdBQVgsSUFBMEJILFVBQVUsQ0FBQ0ksZ0JBQVgsRUFBMUIsRUFBeUQ7QUFDdkQ7QUFDQSxZQUFNQyxRQUFRLEdBQUdGLFdBQVcsQ0FBQ0UsUUFBN0I7QUFDQSxZQUFNQyxTQUFTLEdBQUdILFdBQVcsQ0FBQ0csU0FBOUI7QUFDQSxZQUFNQyxnQkFBZ0IsR0FBR0osV0FBVyxDQUFDSSxnQkFBckMsQ0FKdUQsQ0FNdkQ7O0FBQ0EsVUFBSUEsZ0JBQWdCLElBQUksSUFBcEIsSUFBNEJMLE9BQU8sQ0FBQ0ksU0FBRCxDQUFQLElBQXNCLElBQXRELEVBQTREO0FBQzFETixRQUFBQSxVQUFVLENBQUNRLFVBQVgsQ0FBc0I7QUFBRUYsVUFBQUEsU0FBRjtBQUFhQyxVQUFBQSxnQkFBYjtBQUErQkYsVUFBQUE7QUFBL0IsU0FBdEI7QUFDRDtBQUNGO0FBQ0Y7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDOEIsU0FBckJJLHFCQUFxQixDQUFDUCxPQUFELEVBQVU7QUFDcENGLElBQUFBLFVBQVUsQ0FBQ1UsV0FBWCxDQUF1QlIsT0FBdkI7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBOzs7QUFDeUIsU0FBaEJFLGdCQUFnQixHQUFHO0FBQ3hCLFdBQU9PLHFCQUFQO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDb0IsU0FBWEQsV0FBVyxDQUFDO0FBQUVFLElBQUFBLEtBQUY7QUFBU1AsSUFBQUE7QUFBVCxHQUFELEVBQXNCO0FBQ3RDO0FBQ0EsUUFBSVEsTUFBTSxHQUFJLHVCQUFzQkQsS0FBTSx5REFBMUM7QUFDQUMsSUFBQUEsTUFBTSxJQUFJUixRQUFRLEdBQUksSUFBR0EsUUFBUyxFQUFoQixHQUFvQixFQUF0Qzs7QUFDQVMsb0JBQU9DLElBQVAsQ0FBWUYsTUFBWjtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ21CLFNBQVZMLFVBQVUsQ0FBQztBQUFFRixJQUFBQSxTQUFGO0FBQWFVLElBQUFBLE1BQWI7QUFBcUJDLElBQUFBLFlBQXJCO0FBQW1DVixJQUFBQSxnQkFBbkM7QUFBcURGLElBQUFBO0FBQXJELEdBQUQsRUFBa0U7QUFDakYsVUFBTWEsSUFBSSxHQUFHWixTQUFTLEdBQUcsUUFBSCxHQUFjLGlCQUFwQztBQUNBLFVBQU1hLEdBQUcsR0FBR2IsU0FBUyxHQUFHQSxTQUFILEdBQWVVLE1BQXBDO0FBQ0EsVUFBTUksU0FBUyxHQUNiSCxZQUFZLElBQUksSUFBaEIsR0FDSUksU0FESixHQUVJSixZQUFZLENBQUNLLE1BQWIsR0FBc0IsQ0FBdEIsR0FDRyxlQUFjTCxZQUFhLEdBRDlCLEdBRUcsU0FMVCxDQUhpRixDQVVqRjs7QUFDQSxRQUFJSixNQUFNLEdBQUksd0NBQXVDSyxJQUFLLEtBQUlDLEdBQUksSUFBbEU7QUFDQU4sSUFBQUEsTUFBTSxJQUFJSSxZQUFZLEdBQUksNkJBQTRCRyxTQUFVLHVCQUExQyxHQUFtRSxFQUF6RjtBQUNBUCxJQUFBQSxNQUFNLElBQUlOLGdCQUFnQixHQUNyQiwyQkFBMEJBLGdCQUFpQix3QkFEdEIsR0FFdEIsRUFGSjtBQUdBTSxJQUFBQSxNQUFNLElBQUlSLFFBQVEsR0FBSSxJQUFHQSxRQUFTLEVBQWhCLEdBQW9CLEVBQXRDOztBQUNBUyxvQkFBT0MsSUFBUCxDQUFZRixNQUFaO0FBQ0Q7O0FBNUdjOztBQStHakJVLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnhCLFVBQWpCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IERlcHJlY2F0aW9ucyBmcm9tICcuL0RlcHJlY2F0aW9ucyc7XG5cbi8qKlxuICogVGhlIGRlcHJlY2F0b3IgY2xhc3MuXG4gKi9cbmNsYXNzIERlcHJlY2F0b3Ige1xuICAvKipcbiAgICogU2NhbnMgdGhlIFBhcnNlIFNlcnZlciBmb3IgZGVwcmVjYXRlZCBvcHRpb25zLlxuICAgKiBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgc2V0dGluZyBvcHRpb24gZGVmYXVsdHMsIG90aGVyd2lzZSBpdFxuICAgKiBiZWNvbWVzIGluZGlzdGluZ3Vpc2hhYmxlIHdoZXRoZXIgYW4gb3B0aW9uIGhhcyBiZWVuIHNldCBtYW51YWxseSBvclxuICAgKiBieSBkZWZhdWx0LlxuICAgKiBAcGFyYW0ge2FueX0gb3B0aW9ucyBUaGUgUGFyc2UgU2VydmVyIG9wdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgc2NhblBhcnNlU2VydmVyT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgLy8gU2NhbiBmb3IgZGVwcmVjYXRpb25zXG4gICAgZm9yIChjb25zdCBkZXByZWNhdGlvbiBvZiBEZXByZWNhdG9yLl9nZXREZXByZWNhdGlvbnMoKSkge1xuICAgICAgLy8gR2V0IGRlcHJlY2F0aW9uIHByb3BlcnRpZXNcbiAgICAgIGNvbnN0IHNvbHV0aW9uID0gZGVwcmVjYXRpb24uc29sdXRpb247XG4gICAgICBjb25zdCBvcHRpb25LZXkgPSBkZXByZWNhdGlvbi5vcHRpb25LZXk7XG4gICAgICBjb25zdCBjaGFuZ2VOZXdEZWZhdWx0ID0gZGVwcmVjYXRpb24uY2hhbmdlTmV3RGVmYXVsdDtcblxuICAgICAgLy8gSWYgZGVmYXVsdCB3aWxsIGNoYW5nZSwgb25seSB0aHJvdyBhIHdhcm5pbmcgaWYgb3B0aW9uIGlzIG5vdCBzZXRcbiAgICAgIGlmIChjaGFuZ2VOZXdEZWZhdWx0ICE9IG51bGwgJiYgb3B0aW9uc1tvcHRpb25LZXldID09IG51bGwpIHtcbiAgICAgICAgRGVwcmVjYXRvci5fbG9nT3B0aW9uKHsgb3B0aW9uS2V5LCBjaGFuZ2VOZXdEZWZhdWx0LCBzb2x1dGlvbiB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgZm9yIGEgcGFyYW1ldGVyIHRoYXQgY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZCBkeW5hbWljYWxseVxuICAgKiBkdXJpbmcgcnVudGltZS5cbiAgICpcbiAgICogTm90ZTogRG8gbm90IHVzZSB0aGlzIHRvIGxvZyBkZXByZWNhdGlvbnMgb2YgUGFyc2UgU2VydmVyIG9wdGlvbnMsIGJ1dCBhZGQgc3VjaFxuICAgKiBkZXByZWNhdGlvbnMgdG8gYERlcHJlY2F0aW9ucy5qc2AgaW5zdGVhZC4gU2VlIHRoZSBjb250cmlidXRpb24gZG9jcyBmb3IgbW9yZVxuICAgKiBkZXRhaWxzLlxuICAgKlxuICAgKiBGb3IgY29uc2lzdGVuY3ksIHRoZSBkZXByZWNhdGlvbiB3YXJuaW5nIGlzIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgcGFydHM6XG4gICAqXG4gICAqID4gRGVwcmVjYXRpb25XYXJuaW5nOiBgdXNhZ2VgIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLlxuICAgKiBgc29sdXRpb25gLlxuICAgKlxuICAgKiAtIGB1c2FnZWA6IFRoZSBkZXByZWNhdGVkIHVzYWdlLlxuICAgKiAtIGBzb2x1dGlvbmA6IFRoZSBpbnN0cnVjdGlvbiB0byByZXNvbHZlIHRoaXMgZGVwcmVjYXRpb24gd2FybmluZy5cbiAgICpcbiAgICogRm9yIGV4YW1wbGU6XG4gICAqID4gRGVwcmVjYXRpb25XYXJuaW5nOiBgUHJlZml4aW5nIGZpZWxkIG5hbWVzIHdpdGggZG9sbGFyIHNpZ24gKCQpIGluIGFnZ3JlZ2F0aW9uIHF1ZXJ5YFxuICAgKiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gYFJlZmVyZW5jZSBmaWVsZCBuYW1lcyB3aXRob3V0XG4gICAqIGRvbGxhciBzaWduIHByZWZpeC5gXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBkZXByZWNhdGlvbiBvcHRpb25zLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy51c2FnZSBUaGUgdXNhZ2UgdGhhdCBpcyBkZXByZWNhdGVkLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc29sdXRpb25dIFRoZSBpbnN0cnVjdGlvbiB0byByZXNvbHZlIHRoaXMgZGVwcmVjYXRpb24gd2FybmluZy5cbiAgICogT3B0aW9uYWwuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGFkZCBhbiBpbnN0cnVjdGlvbiBmb3IgdGhlIGNvbnZlbmllbmNlIG9mIHRoZSBkZXZlbG9wZXIuXG4gICAqL1xuICBzdGF0aWMgbG9nUnVudGltZURlcHJlY2F0aW9uKG9wdGlvbnMpIHtcbiAgICBEZXByZWNhdG9yLl9sb2dHZW5lcmljKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRlcHJlY2F0aW9uIGRlZmluaXRpb25zLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8T2JqZWN0Pn0gVGhlIGRlcHJlY2F0aW9ucy5cbiAgICovXG4gIHN0YXRpYyBfZ2V0RGVwcmVjYXRpb25zKCkge1xuICAgIHJldHVybiBEZXByZWNhdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBhIGdlbmVyaWMgZGVwcmVjYXRpb24gd2FybmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgVGhlIGRlcHJlY2F0aW9uIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnVzYWdlIFRoZSB1c2FnZSB0aGF0IGlzIGRlcHJlY2F0ZWQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zb2x1dGlvbl0gVGhlIGluc3RydWN0aW9uIHRvIHJlc29sdmUgdGhpcyBkZXByZWNhdGlvbiB3YXJuaW5nLlxuICAgKiBPcHRpb25hbC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gYWRkIGFuIGluc3RydWN0aW9uIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgdGhlIGRldmVsb3Blci5cbiAgICovXG4gIHN0YXRpYyBfbG9nR2VuZXJpYyh7IHVzYWdlLCBzb2x1dGlvbiB9KSB7XG4gICAgLy8gQ29tcG9zZSBtZXNzYWdlXG4gICAgbGV0IG91dHB1dCA9IGBEZXByZWNhdGlvbldhcm5pbmc6ICR7dXNhZ2V9IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLmA7XG4gICAgb3V0cHV0ICs9IHNvbHV0aW9uID8gYCAke3NvbHV0aW9ufWAgOiAnJztcbiAgICBsb2dnZXIud2FybihvdXRwdXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgYSBkZXByZWNhdGlvbiB3YXJuaW5nIGZvciBhIFBhcnNlIFNlcnZlciBvcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25LZXkgVGhlIG9wdGlvbiBrZXkgaW5jbC4gaXRzIHBhdGgsIGUuZy4gYHNlY3VyaXR5LmVuYWJsZUNoZWNrYC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGVudktleSBUaGUgZW52aXJvbm1lbnQga2V5LCBlLmcuIGBQQVJTRV9TRVJWRVJfU0VDVVJJVFlgLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2hhbmdlTmV3S2V5IFNldCB0aGUgbmV3IGtleSBuYW1lIGlmIHRoZSBjdXJyZW50IGtleSB3aWxsIGJlIHJlcGxhY2VkLFxuICAgKiBvciBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBjdXJyZW50IGtleSB3aWxsIGJlIHJlbW92ZWQgd2l0aG91dCByZXBsYWNlbWVudC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5nZU5ld0RlZmF1bHQgU2V0IHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBpZiB0aGUga2V5J3MgZGVmYXVsdCB2YWx1ZVxuICAgKiB3aWxsIGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3NvbHV0aW9uXSBUaGUgaW5zdHJ1Y3Rpb24gdG8gcmVzb2x2ZSB0aGlzIGRlcHJlY2F0aW9uIHdhcm5pbmcuIFRoaXNcbiAgICogbWVzc2FnZSBtdXN0IG5vdCBpbmNsdWRlIHRoZSB3YXJuaW5nIHRoYXQgdGhlIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkLCB0aGF0IGlzXG4gICAqIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIG1lc3NhZ2UuIEl0IHNob3VsZCBvbmx5IGNvbnRhaW4gdGhlIGluc3RydWN0aW9uIG9uIGhvd1xuICAgKiB0byByZXNvbHZlIHRoaXMgd2FybmluZy5cbiAgICovXG4gIHN0YXRpYyBfbG9nT3B0aW9uKHsgb3B0aW9uS2V5LCBlbnZLZXksIGNoYW5nZU5ld0tleSwgY2hhbmdlTmV3RGVmYXVsdCwgc29sdXRpb24gfSkge1xuICAgIGNvbnN0IHR5cGUgPSBvcHRpb25LZXkgPyAnb3B0aW9uJyA6ICdlbnZpcm9ubWVudCBrZXknO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbktleSA/IG9wdGlvbktleSA6IGVudktleTtcbiAgICBjb25zdCBrZXlBY3Rpb24gPVxuICAgICAgY2hhbmdlTmV3S2V5ID09IG51bGxcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBjaGFuZ2VOZXdLZXkubGVuZ3RoID4gMFxuICAgICAgICAgID8gYHJlbmFtZWQgdG8gJyR7Y2hhbmdlTmV3S2V5fSdgXG4gICAgICAgICAgOiBgcmVtb3ZlZGA7XG5cbiAgICAvLyBDb21wb3NlIG1lc3NhZ2VcbiAgICBsZXQgb3V0cHV0ID0gYERlcHJlY2F0aW9uV2FybmluZzogVGhlIFBhcnNlIFNlcnZlciAke3R5cGV9ICcke2tleX0nIGA7XG4gICAgb3V0cHV0ICs9IGNoYW5nZU5ld0tleSA/IGBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlICR7a2V5QWN0aW9ufSBpbiBhIGZ1dHVyZSB2ZXJzaW9uLmAgOiAnJztcbiAgICBvdXRwdXQgKz0gY2hhbmdlTmV3RGVmYXVsdFxuICAgICAgPyBgZGVmYXVsdCB3aWxsIGNoYW5nZSB0byAnJHtjaGFuZ2VOZXdEZWZhdWx0fScgaW4gYSBmdXR1cmUgdmVyc2lvbi5gXG4gICAgICA6ICcnO1xuICAgIG91dHB1dCArPSBzb2x1dGlvbiA/IGAgJHtzb2x1dGlvbn1gIDogJyc7XG4gICAgbG9nZ2VyLndhcm4ob3V0cHV0KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERlcHJlY2F0b3I7XG4iXX0=