parse-server 2.8.4 → 8.6.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 (240) hide show
  1. package/LICENSE +167 -25
  2. package/NOTICE +10 -0
  3. package/README.md +929 -278
  4. package/lib/AccountLockout.js +47 -30
  5. package/lib/Adapters/AdapterLoader.js +21 -6
  6. package/lib/Adapters/Analytics/AnalyticsAdapter.js +15 -12
  7. package/lib/Adapters/Auth/AuthAdapter.js +116 -13
  8. package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +99 -0
  9. package/lib/Adapters/Auth/OAuth1Client.js +27 -46
  10. package/lib/Adapters/Auth/apple.js +123 -0
  11. package/lib/Adapters/Auth/facebook.js +162 -35
  12. package/lib/Adapters/Auth/gcenter.js +217 -0
  13. package/lib/Adapters/Auth/github.js +118 -48
  14. package/lib/Adapters/Auth/google.js +160 -51
  15. package/lib/Adapters/Auth/gpgames.js +125 -0
  16. package/lib/Adapters/Auth/httpsRequest.js +6 -7
  17. package/lib/Adapters/Auth/index.js +170 -62
  18. package/lib/Adapters/Auth/instagram.js +114 -40
  19. package/lib/Adapters/Auth/janraincapture.js +52 -23
  20. package/lib/Adapters/Auth/janrainengage.js +19 -36
  21. package/lib/Adapters/Auth/keycloak.js +148 -0
  22. package/lib/Adapters/Auth/ldap.js +167 -0
  23. package/lib/Adapters/Auth/line.js +125 -0
  24. package/lib/Adapters/Auth/linkedin.js +111 -55
  25. package/lib/Adapters/Auth/meetup.js +24 -34
  26. package/lib/Adapters/Auth/mfa.js +324 -0
  27. package/lib/Adapters/Auth/microsoft.js +111 -0
  28. package/lib/Adapters/Auth/oauth2.js +97 -162
  29. package/lib/Adapters/Auth/phantauth.js +53 -0
  30. package/lib/Adapters/Auth/qq.js +108 -49
  31. package/lib/Adapters/Auth/spotify.js +107 -55
  32. package/lib/Adapters/Auth/twitter.js +188 -48
  33. package/lib/Adapters/Auth/utils.js +28 -0
  34. package/lib/Adapters/Auth/vkontakte.js +26 -39
  35. package/lib/Adapters/Auth/wechat.js +106 -44
  36. package/lib/Adapters/Auth/weibo.js +132 -58
  37. package/lib/Adapters/Cache/CacheAdapter.js +13 -8
  38. package/lib/Adapters/Cache/InMemoryCache.js +3 -13
  39. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +5 -13
  40. package/lib/Adapters/Cache/LRUCache.js +13 -27
  41. package/lib/Adapters/Cache/NullCacheAdapter.js +3 -8
  42. package/lib/Adapters/Cache/RedisCacheAdapter.js +85 -76
  43. package/lib/Adapters/Cache/SchemaCache.js +25 -0
  44. package/lib/Adapters/Email/MailAdapter.js +10 -8
  45. package/lib/Adapters/Files/FilesAdapter.js +83 -25
  46. package/lib/Adapters/Files/GridFSBucketAdapter.js +231 -0
  47. package/lib/Adapters/Files/GridStoreAdapter.js +4 -91
  48. package/lib/Adapters/Logger/LoggerAdapter.js +18 -14
  49. package/lib/Adapters/Logger/WinstonLogger.js +69 -88
  50. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +7 -16
  51. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +8 -26
  52. package/lib/Adapters/PubSub/EventEmitterPubSub.js +12 -25
  53. package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
  54. package/lib/Adapters/PubSub/RedisPubSub.js +42 -19
  55. package/lib/Adapters/Push/PushAdapter.js +14 -7
  56. package/lib/Adapters/Storage/Mongo/MongoCollection.js +137 -45
  57. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +158 -63
  58. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +320 -168
  59. package/lib/Adapters/Storage/Mongo/MongoTransform.js +279 -306
  60. package/lib/Adapters/Storage/Postgres/PostgresClient.js +14 -10
  61. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +47 -21
  62. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +854 -468
  63. package/lib/Adapters/Storage/Postgres/sql/index.js +4 -6
  64. package/lib/Adapters/Storage/StorageAdapter.js +1 -1
  65. package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
  66. package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
  67. package/lib/Auth.js +488 -125
  68. package/lib/ClientSDK.js +2 -6
  69. package/lib/Config.js +525 -94
  70. package/lib/Controllers/AdaptableController.js +5 -25
  71. package/lib/Controllers/AnalyticsController.js +22 -23
  72. package/lib/Controllers/CacheController.js +10 -31
  73. package/lib/Controllers/DatabaseController.js +767 -313
  74. package/lib/Controllers/FilesController.js +49 -54
  75. package/lib/Controllers/HooksController.js +80 -84
  76. package/lib/Controllers/LiveQueryController.js +35 -22
  77. package/lib/Controllers/LoggerController.js +22 -58
  78. package/lib/Controllers/ParseGraphQLController.js +293 -0
  79. package/lib/Controllers/PushController.js +58 -49
  80. package/lib/Controllers/SchemaController.js +916 -422
  81. package/lib/Controllers/UserController.js +265 -180
  82. package/lib/Controllers/index.js +90 -125
  83. package/lib/Controllers/types.js +1 -1
  84. package/lib/Deprecator/Deprecations.js +30 -0
  85. package/lib/Deprecator/Deprecator.js +127 -0
  86. package/lib/Error.js +48 -0
  87. package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
  88. package/lib/GraphQL/ParseGraphQLServer.js +214 -0
  89. package/lib/GraphQL/helpers/objectsMutations.js +30 -0
  90. package/lib/GraphQL/helpers/objectsQueries.js +246 -0
  91. package/lib/GraphQL/loaders/configMutations.js +87 -0
  92. package/lib/GraphQL/loaders/configQueries.js +79 -0
  93. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
  94. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
  95. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1098 -0
  96. package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
  97. package/lib/GraphQL/loaders/filesMutations.js +107 -0
  98. package/lib/GraphQL/loaders/functionsMutations.js +78 -0
  99. package/lib/GraphQL/loaders/parseClassMutations.js +268 -0
  100. package/lib/GraphQL/loaders/parseClassQueries.js +127 -0
  101. package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
  102. package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
  103. package/lib/GraphQL/loaders/schemaMutations.js +162 -0
  104. package/lib/GraphQL/loaders/schemaQueries.js +81 -0
  105. package/lib/GraphQL/loaders/schemaTypes.js +341 -0
  106. package/lib/GraphQL/loaders/usersMutations.js +433 -0
  107. package/lib/GraphQL/loaders/usersQueries.js +90 -0
  108. package/lib/GraphQL/parseGraphQLUtils.js +63 -0
  109. package/lib/GraphQL/transformers/className.js +14 -0
  110. package/lib/GraphQL/transformers/constraintType.js +53 -0
  111. package/lib/GraphQL/transformers/inputType.js +51 -0
  112. package/lib/GraphQL/transformers/mutation.js +274 -0
  113. package/lib/GraphQL/transformers/outputType.js +51 -0
  114. package/lib/GraphQL/transformers/query.js +237 -0
  115. package/lib/GraphQL/transformers/schemaFields.js +99 -0
  116. package/lib/KeyPromiseQueue.js +48 -0
  117. package/lib/LiveQuery/Client.js +25 -33
  118. package/lib/LiveQuery/Id.js +2 -5
  119. package/lib/LiveQuery/ParseCloudCodePublisher.js +26 -23
  120. package/lib/LiveQuery/ParseLiveQueryServer.js +560 -285
  121. package/lib/LiveQuery/ParsePubSub.js +7 -16
  122. package/lib/LiveQuery/ParseWebSocketServer.js +42 -39
  123. package/lib/LiveQuery/QueryTools.js +76 -15
  124. package/lib/LiveQuery/RequestSchema.js +111 -97
  125. package/lib/LiveQuery/SessionTokenCache.js +23 -36
  126. package/lib/LiveQuery/Subscription.js +8 -17
  127. package/lib/LiveQuery/equalObjects.js +2 -3
  128. package/lib/Options/Definitions.js +1355 -382
  129. package/lib/Options/docs.js +301 -62
  130. package/lib/Options/index.js +11 -1
  131. package/lib/Options/parsers.js +14 -10
  132. package/lib/Page.js +44 -0
  133. package/lib/ParseMessageQueue.js +6 -13
  134. package/lib/ParseServer.js +474 -235
  135. package/lib/ParseServerRESTController.js +102 -40
  136. package/lib/PromiseRouter.js +39 -50
  137. package/lib/Push/PushQueue.js +24 -30
  138. package/lib/Push/PushWorker.js +32 -56
  139. package/lib/Push/utils.js +22 -35
  140. package/lib/RestQuery.js +361 -139
  141. package/lib/RestWrite.js +713 -344
  142. package/lib/Routers/AggregateRouter.js +97 -71
  143. package/lib/Routers/AnalyticsRouter.js +8 -14
  144. package/lib/Routers/AudiencesRouter.js +16 -35
  145. package/lib/Routers/ClassesRouter.js +86 -72
  146. package/lib/Routers/CloudCodeRouter.js +28 -37
  147. package/lib/Routers/FeaturesRouter.js +22 -25
  148. package/lib/Routers/FilesRouter.js +266 -171
  149. package/lib/Routers/FunctionsRouter.js +87 -103
  150. package/lib/Routers/GlobalConfigRouter.js +94 -33
  151. package/lib/Routers/GraphQLRouter.js +41 -0
  152. package/lib/Routers/HooksRouter.js +43 -47
  153. package/lib/Routers/IAPValidationRouter.js +57 -70
  154. package/lib/Routers/InstallationsRouter.js +17 -25
  155. package/lib/Routers/LogsRouter.js +10 -25
  156. package/lib/Routers/PagesRouter.js +647 -0
  157. package/lib/Routers/PublicAPIRouter.js +104 -112
  158. package/lib/Routers/PurgeRouter.js +19 -29
  159. package/lib/Routers/PushRouter.js +14 -28
  160. package/lib/Routers/RolesRouter.js +7 -14
  161. package/lib/Routers/SchemasRouter.js +63 -42
  162. package/lib/Routers/SecurityRouter.js +34 -0
  163. package/lib/Routers/SessionsRouter.js +25 -38
  164. package/lib/Routers/UsersRouter.js +463 -190
  165. package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
  166. package/lib/SchemaMigrations/Migrations.js +30 -0
  167. package/lib/Security/Check.js +109 -0
  168. package/lib/Security/CheckGroup.js +44 -0
  169. package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
  170. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +96 -0
  171. package/lib/Security/CheckGroups/CheckGroups.js +21 -0
  172. package/lib/Security/CheckRunner.js +213 -0
  173. package/lib/SharedRest.js +29 -0
  174. package/lib/StatusHandler.js +96 -93
  175. package/lib/TestUtils.js +70 -14
  176. package/lib/Utils.js +468 -0
  177. package/lib/batch.js +74 -40
  178. package/lib/cache.js +8 -8
  179. package/lib/cli/definitions/parse-live-query-server.js +4 -3
  180. package/lib/cli/definitions/parse-server.js +4 -3
  181. package/lib/cli/parse-live-query-server.js +9 -17
  182. package/lib/cli/parse-server.js +49 -47
  183. package/lib/cli/utils/commander.js +20 -29
  184. package/lib/cli/utils/runner.js +31 -32
  185. package/lib/cloud-code/Parse.Cloud.js +711 -36
  186. package/lib/cloud-code/Parse.Server.js +21 -0
  187. package/lib/cryptoUtils.js +6 -11
  188. package/lib/defaults.js +21 -15
  189. package/lib/deprecated.js +1 -1
  190. package/lib/index.js +78 -67
  191. package/lib/logger.js +12 -20
  192. package/lib/middlewares.js +484 -160
  193. package/lib/password.js +10 -6
  194. package/lib/request.js +175 -0
  195. package/lib/requiredParameter.js +4 -3
  196. package/lib/rest.js +157 -82
  197. package/lib/triggers.js +627 -185
  198. package/lib/vendor/README.md +3 -3
  199. package/lib/vendor/mongodbUrl.js +224 -137
  200. package/package.json +135 -57
  201. package/postinstall.js +38 -50
  202. package/public_html/invalid_verification_link.html +3 -3
  203. package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
  204. package/types/@types/deepcopy/index.d.ts +5 -0
  205. package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
  206. package/types/Options/index.d.ts +301 -0
  207. package/types/ParseServer.d.ts +65 -0
  208. package/types/eslint.config.mjs +30 -0
  209. package/types/index.d.ts +21 -0
  210. package/types/logger.d.ts +2 -0
  211. package/types/tests.ts +44 -0
  212. package/types/tsconfig.json +24 -0
  213. package/CHANGELOG.md +0 -1246
  214. package/PATENTS +0 -37
  215. package/bin/dev +0 -37
  216. package/lib/.DS_Store +0 -0
  217. package/lib/Adapters/Auth/common.js +0 -2
  218. package/lib/Adapters/Auth/facebookaccountkit.js +0 -69
  219. package/lib/Controllers/SchemaCache.js +0 -97
  220. package/lib/LiveQuery/.DS_Store +0 -0
  221. package/lib/cli/utils/parsers.js +0 -77
  222. package/lib/cloud-code/.DS_Store +0 -0
  223. package/lib/cloud-code/HTTPResponse.js +0 -57
  224. package/lib/cloud-code/Untitled-1 +0 -123
  225. package/lib/cloud-code/httpRequest.js +0 -102
  226. package/lib/cloud-code/team.html +0 -123
  227. package/lib/graphql/ParseClass.js +0 -234
  228. package/lib/graphql/Schema.js +0 -197
  229. package/lib/graphql/index.js +0 -1
  230. package/lib/graphql/types/ACL.js +0 -35
  231. package/lib/graphql/types/Date.js +0 -25
  232. package/lib/graphql/types/File.js +0 -24
  233. package/lib/graphql/types/GeoPoint.js +0 -35
  234. package/lib/graphql/types/JSONObject.js +0 -30
  235. package/lib/graphql/types/NumberInput.js +0 -43
  236. package/lib/graphql/types/NumberQuery.js +0 -42
  237. package/lib/graphql/types/Pointer.js +0 -35
  238. package/lib/graphql/types/QueryConstraint.js +0 -61
  239. package/lib/graphql/types/StringQuery.js +0 -39
  240. package/lib/graphql/types/index.js +0 -110
package/lib/RestWrite.js CHANGED
@@ -1,38 +1,29 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
-
7
- var _RestQuery = require('./RestQuery');
8
-
9
- var _RestQuery2 = _interopRequireDefault(_RestQuery);
10
-
11
- var _lodash = require('lodash');
12
-
13
- var _lodash2 = _interopRequireDefault(_lodash);
14
-
15
- var _logger = require('./logger');
16
-
17
- var _logger2 = _interopRequireDefault(_logger);
18
-
19
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
-
6
+ exports.default = void 0;
7
+ var _RestQuery = _interopRequireDefault(require("./RestQuery"));
8
+ var _lodash = _interopRequireDefault(require("lodash"));
9
+ var _logger = _interopRequireDefault(require("./logger"));
10
+ var _SchemaController = require("./Controllers/SchemaController");
11
+ var _Error = require("./Error");
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
21
13
  // A RestWrite encapsulates everything we need to run an operation
22
14
  // that writes to the database.
23
15
  // This could be either a "create" or an "update".
24
16
 
25
17
  var SchemaController = require('./Controllers/SchemaController');
26
18
  var deepcopy = require('deepcopy');
27
-
28
19
  const Auth = require('./Auth');
20
+ const Utils = require('./Utils');
29
21
  var cryptoUtils = require('./cryptoUtils');
30
22
  var passwordCrypto = require('./password');
31
23
  var Parse = require('parse/node');
32
24
  var triggers = require('./triggers');
33
25
  var ClientSDK = require('./ClientSDK');
34
-
35
-
26
+ const util = require('util');
36
27
  // query and data are both provided in REST API format. So data
37
28
  // types are encoded by plain old objects.
38
29
  // If query is null, this is a "create" and the data in data should be
@@ -42,9 +33,9 @@ var ClientSDK = require('./ClientSDK');
42
33
  // RestWrite will handle objectId, createdAt, and updatedAt for
43
34
  // everything. It also knows to use triggers and special modifications
44
35
  // for the _User class.
45
- function RestWrite(config, auth, className, query, data, originalData, clientSDK) {
36
+ function RestWrite(config, auth, className, query, data, originalData, clientSDK, context, action) {
46
37
  if (auth.isReadOnly) {
47
- throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, 'Cannot perform a write operation when using readOnlyMasterKey');
38
+ throw (0, _Error.createSanitizedError)(Parse.Error.OPERATION_FORBIDDEN, 'Cannot perform a write operation when using readOnlyMasterKey', config);
48
39
  }
49
40
  this.config = config;
50
41
  this.auth = auth;
@@ -52,8 +43,23 @@ function RestWrite(config, auth, className, query, data, originalData, clientSDK
52
43
  this.clientSDK = clientSDK;
53
44
  this.storage = {};
54
45
  this.runOptions = {};
55
- if (!query && data.objectId) {
56
- throw new Parse.Error(Parse.Error.INVALID_KEY_NAME, 'objectId is an invalid field name.');
46
+ this.context = context || {};
47
+ if (action) {
48
+ this.runOptions.action = action;
49
+ }
50
+ if (!query) {
51
+ if (this.config.allowCustomObjectId) {
52
+ if (Object.prototype.hasOwnProperty.call(data, 'objectId') && !data.objectId) {
53
+ throw new Parse.Error(Parse.Error.MISSING_OBJECT_ID, 'objectId must not be empty, null or undefined');
54
+ }
55
+ } else {
56
+ if (data.objectId) {
57
+ throw new Parse.Error(Parse.Error.INVALID_KEY_NAME, 'objectId is an invalid field name.');
58
+ }
59
+ if (data.id) {
60
+ throw new Parse.Error(Parse.Error.INVALID_KEY_NAME, 'id is an invalid field name.');
61
+ }
62
+ }
57
63
  }
58
64
 
59
65
  // When the operation is complete, this.response may have several
@@ -72,6 +78,14 @@ function RestWrite(config, auth, className, query, data, originalData, clientSDK
72
78
 
73
79
  // The timestamp we'll use for this whole operation
74
80
  this.updatedAt = Parse._encode(new Date()).iso;
81
+
82
+ // Shared SchemaController to be reused to reduce the number of loadSchema() calls per request
83
+ // Once set the schemaData should be immutable
84
+ this.validSchemaController = null;
85
+ this.pendingOps = {
86
+ operations: null,
87
+ identifier: null
88
+ };
75
89
  }
76
90
 
77
91
  // A convenient method to perform all the steps of processing the
@@ -90,10 +104,17 @@ RestWrite.prototype.execute = function () {
90
104
  }).then(() => {
91
105
  return this.validateAuthData();
92
106
  }).then(() => {
93
- return this.runBeforeTrigger();
107
+ return this.checkRestrictedFields();
94
108
  }).then(() => {
95
- return this.validateSchema();
109
+ return this.runBeforeSaveTrigger();
110
+ }).then(() => {
111
+ return this.ensureUniqueAuthDataId();
96
112
  }).then(() => {
113
+ return this.deleteEmailResetTokenIfNeeded();
114
+ }).then(() => {
115
+ return this.validateSchema();
116
+ }).then(schemaController => {
117
+ this.validSchemaController = schemaController;
97
118
  return this.setRequiredFieldsIfNeeded();
98
119
  }).then(() => {
99
120
  return this.transformUser();
@@ -108,22 +129,29 @@ RestWrite.prototype.execute = function () {
108
129
  }).then(() => {
109
130
  return this.handleFollowup();
110
131
  }).then(() => {
111
- return this.runAfterTrigger();
132
+ return this.runAfterSaveTrigger();
112
133
  }).then(() => {
113
134
  return this.cleanUserAuthData();
114
135
  }).then(() => {
136
+ // Append the authDataResponse if exists
137
+ if (this.authDataResponse) {
138
+ if (this.response && this.response.response) {
139
+ this.response.response.authDataResponse = this.authDataResponse;
140
+ }
141
+ }
142
+ if (this.storage.rejectSignup && this.config.preventSignupWithUnverifiedEmail) {
143
+ throw new Parse.Error(Parse.Error.EMAIL_NOT_FOUND, 'User email is not verified.');
144
+ }
115
145
  return this.response;
116
146
  });
117
147
  };
118
148
 
119
149
  // Uses the Auth object to get the list of roles, adds the user id
120
150
  RestWrite.prototype.getUserAndRoleACL = function () {
121
- if (this.auth.isMaster) {
151
+ if (this.auth.isMaster || this.auth.isMaintenance) {
122
152
  return Promise.resolve();
123
153
  }
124
-
125
154
  this.runOptions.acl = ['*'];
126
-
127
155
  if (this.auth.user) {
128
156
  return this.auth.getUserRoles().then(roles => {
129
157
  this.runOptions.acl = this.runOptions.acl.concat(roles, [this.auth.user.id]);
@@ -136,10 +164,10 @@ RestWrite.prototype.getUserAndRoleACL = function () {
136
164
 
137
165
  // Validates this operation against the allowClientClassCreation config.
138
166
  RestWrite.prototype.validateClientClassCreation = function () {
139
- if (this.config.allowClientClassCreation === false && !this.auth.isMaster && SchemaController.systemClasses.indexOf(this.className) === -1) {
167
+ if (this.config.allowClientClassCreation === false && !this.auth.isMaster && !this.auth.isMaintenance && SchemaController.systemClasses.indexOf(this.className) === -1) {
140
168
  return this.config.database.loadSchema().then(schemaController => schemaController.hasClass(this.className)).then(hasClass => {
141
169
  if (hasClass !== true) {
142
- throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, 'This user is not allowed to access ' + 'non-existent class: ' + this.className);
170
+ throw (0, _Error.createSanitizedError)(Parse.Error.OPERATION_FORBIDDEN, 'This user is not allowed to access non-existent class: ' + this.className, this.config);
143
171
  }
144
172
  });
145
173
  } else {
@@ -149,13 +177,13 @@ RestWrite.prototype.validateClientClassCreation = function () {
149
177
 
150
178
  // Validates this operation against the schema.
151
179
  RestWrite.prototype.validateSchema = function () {
152
- return this.config.database.validateObject(this.className, this.data, this.query, this.runOptions);
180
+ return this.config.database.validateObject(this.className, this.data, this.query, this.runOptions, this.auth.isMaintenance);
153
181
  };
154
182
 
155
183
  // Runs any beforeSave triggers against this operation.
156
184
  // Any change leads to our data being mutated.
157
- RestWrite.prototype.runBeforeTrigger = function () {
158
- if (this.response) {
185
+ RestWrite.prototype.runBeforeSaveTrigger = function () {
186
+ if (this.response || this.runOptions.many) {
159
187
  return;
160
188
  }
161
189
 
@@ -163,26 +191,41 @@ RestWrite.prototype.runBeforeTrigger = function () {
163
191
  if (!triggers.triggerExists(this.className, triggers.Types.beforeSave, this.config.applicationId)) {
164
192
  return Promise.resolve();
165
193
  }
166
-
167
- // Cloud code gets a bit of extra data for its objects
168
- var extraData = { className: this.className };
169
- if (this.query && this.query.objectId) {
170
- extraData.objectId = this.query.objectId;
171
- }
172
-
173
- let originalObject = null;
174
- const updatedObject = this.buildUpdatedObject(extraData);
175
- if (this.query && this.query.objectId) {
176
- // This is an update for existing object.
177
- originalObject = triggers.inflate(extraData, this.originalData);
178
- }
179
-
194
+ const {
195
+ originalObject,
196
+ updatedObject
197
+ } = this.buildParseObjects();
198
+ const identifier = updatedObject._getStateIdentifier();
199
+ const stateController = Parse.CoreManager.getObjectStateController();
200
+ const [pending] = stateController.getPendingOps(identifier);
201
+ this.pendingOps = {
202
+ operations: {
203
+ ...pending
204
+ },
205
+ identifier
206
+ };
180
207
  return Promise.resolve().then(() => {
181
- return triggers.maybeRunTrigger(triggers.Types.beforeSave, this.auth, updatedObject, originalObject, this.config);
208
+ // Before calling the trigger, validate the permissions for the save operation
209
+ let databasePromise = null;
210
+ if (this.query) {
211
+ // Validate for updating
212
+ databasePromise = this.config.database.update(this.className, this.query, this.data, this.runOptions, true, true);
213
+ } else {
214
+ // Validate for creating
215
+ databasePromise = this.config.database.create(this.className, this.data, this.runOptions, true);
216
+ }
217
+ // In the case that there is no permission for the operation, it throws an error
218
+ return databasePromise.then(result => {
219
+ if (!result || result.length <= 0) {
220
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Object not found.');
221
+ }
222
+ });
223
+ }).then(() => {
224
+ return triggers.maybeRunTrigger(triggers.Types.beforeSave, this.auth, updatedObject, originalObject, this.config, this.context);
182
225
  }).then(response => {
183
226
  if (response && response.object) {
184
- this.storage.fieldsChangedByTrigger = _lodash2.default.reduce(response.object, (result, value, key) => {
185
- if (!_lodash2.default.isEqual(this.data[key], value)) {
227
+ this.storage.fieldsChangedByTrigger = _lodash.default.reduce(response.object, (result, value, key) => {
228
+ if (!_lodash.default.isEqual(this.data[key], value)) {
186
229
  result.push(key);
187
230
  }
188
231
  return result;
@@ -193,21 +236,106 @@ RestWrite.prototype.runBeforeTrigger = function () {
193
236
  delete this.data.objectId;
194
237
  }
195
238
  }
239
+ try {
240
+ Utils.checkProhibitedKeywords(this.config, this.data);
241
+ } catch (error) {
242
+ throw new Parse.Error(Parse.Error.INVALID_KEY_NAME, error);
243
+ }
196
244
  });
197
245
  };
246
+ RestWrite.prototype.runBeforeLoginTrigger = async function (userData) {
247
+ // Avoid doing any setup for triggers if there is no 'beforeLogin' trigger
248
+ if (!triggers.triggerExists(this.className, triggers.Types.beforeLogin, this.config.applicationId)) {
249
+ return;
250
+ }
251
+
252
+ // Cloud code gets a bit of extra data for its objects
253
+ const extraData = {
254
+ className: this.className
255
+ };
256
+
257
+ // Expand file objects
258
+ await this.config.filesController.expandFilesInObject(this.config, userData);
259
+ const user = triggers.inflate(extraData, userData);
198
260
 
261
+ // no need to return a response
262
+ await triggers.maybeRunTrigger(triggers.Types.beforeLogin, this.auth, user, null, this.config, this.context);
263
+ };
199
264
  RestWrite.prototype.setRequiredFieldsIfNeeded = function () {
200
265
  if (this.data) {
201
- // Add default fields
202
- this.data.updatedAt = this.updatedAt;
203
- if (!this.query) {
204
- this.data.createdAt = this.updatedAt;
266
+ return this.validSchemaController.getAllClasses().then(allClasses => {
267
+ const schema = allClasses.find(oneClass => oneClass.className === this.className);
268
+ const setRequiredFieldIfNeeded = (fieldName, setDefault) => {
269
+ if (this.data[fieldName] === undefined || this.data[fieldName] === null || this.data[fieldName] === '' || typeof this.data[fieldName] === 'object' && this.data[fieldName].__op === 'Delete') {
270
+ if (setDefault && schema.fields[fieldName] && schema.fields[fieldName].defaultValue !== null && schema.fields[fieldName].defaultValue !== undefined && (this.data[fieldName] === undefined || typeof this.data[fieldName] === 'object' && this.data[fieldName].__op === 'Delete')) {
271
+ this.data[fieldName] = schema.fields[fieldName].defaultValue;
272
+ this.storage.fieldsChangedByTrigger = this.storage.fieldsChangedByTrigger || [];
273
+ if (this.storage.fieldsChangedByTrigger.indexOf(fieldName) < 0) {
274
+ this.storage.fieldsChangedByTrigger.push(fieldName);
275
+ }
276
+ } else if (schema.fields[fieldName] && schema.fields[fieldName].required === true) {
277
+ throw new Parse.Error(Parse.Error.VALIDATION_ERROR, `${fieldName} is required`);
278
+ }
279
+ }
280
+ };
205
281
 
206
- // Only assign new objectId if we are creating new object
207
- if (!this.data.objectId) {
208
- this.data.objectId = cryptoUtils.newObjectId(this.config.objectIdSize);
282
+ // add default ACL
283
+ if (schema?.classLevelPermissions?.ACL && !this.data.ACL && JSON.stringify(schema.classLevelPermissions.ACL) !== JSON.stringify({
284
+ '*': {
285
+ read: true,
286
+ write: true
287
+ }
288
+ })) {
289
+ const acl = deepcopy(schema.classLevelPermissions.ACL);
290
+ if (acl.currentUser) {
291
+ if (this.auth.user?.id) {
292
+ acl[this.auth.user?.id] = deepcopy(acl.currentUser);
293
+ }
294
+ delete acl.currentUser;
295
+ }
296
+ this.data.ACL = acl;
297
+ this.storage.fieldsChangedByTrigger = this.storage.fieldsChangedByTrigger || [];
298
+ this.storage.fieldsChangedByTrigger.push('ACL');
209
299
  }
210
- }
300
+
301
+ // Add default fields
302
+ if (!this.query) {
303
+ // allow customizing createdAt and updatedAt when using maintenance key
304
+ if (this.auth.isMaintenance && this.data.createdAt && this.data.createdAt.__type === 'Date') {
305
+ this.data.createdAt = this.data.createdAt.iso;
306
+ if (this.data.updatedAt && this.data.updatedAt.__type === 'Date') {
307
+ const createdAt = new Date(this.data.createdAt);
308
+ const updatedAt = new Date(this.data.updatedAt.iso);
309
+ if (updatedAt < createdAt) {
310
+ throw new Parse.Error(Parse.Error.VALIDATION_ERROR, 'updatedAt cannot occur before createdAt');
311
+ }
312
+ this.data.updatedAt = this.data.updatedAt.iso;
313
+ }
314
+ // if no updatedAt is provided, set it to createdAt to match default behavior
315
+ else {
316
+ this.data.updatedAt = this.data.createdAt;
317
+ }
318
+ } else {
319
+ this.data.updatedAt = this.updatedAt;
320
+ this.data.createdAt = this.updatedAt;
321
+ }
322
+
323
+ // Only assign new objectId if we are creating new object
324
+ if (!this.data.objectId) {
325
+ this.data.objectId = cryptoUtils.newObjectId(this.config.objectIdSize);
326
+ }
327
+ if (schema) {
328
+ Object.keys(schema.fields).forEach(fieldName => {
329
+ setRequiredFieldIfNeeded(fieldName, true);
330
+ });
331
+ }
332
+ } else if (schema) {
333
+ this.data.updatedAt = this.updatedAt;
334
+ Object.keys(this.data).forEach(fieldName => {
335
+ setRequiredFieldIfNeeded(fieldName, false);
336
+ });
337
+ }
338
+ });
211
339
  }
212
340
  return Promise.resolve();
213
341
  };
@@ -219,74 +347,37 @@ RestWrite.prototype.validateAuthData = function () {
219
347
  if (this.className !== '_User') {
220
348
  return;
221
349
  }
222
-
223
- if (!this.query && !this.data.authData) {
224
- if (typeof this.data.username !== 'string' || _lodash2.default.isEmpty(this.data.username)) {
350
+ const authData = this.data.authData;
351
+ const hasUsernameAndPassword = typeof this.data.username === 'string' && typeof this.data.password === 'string';
352
+ if (!this.query && !authData) {
353
+ if (typeof this.data.username !== 'string' || _lodash.default.isEmpty(this.data.username)) {
225
354
  throw new Parse.Error(Parse.Error.USERNAME_MISSING, 'bad or missing username');
226
355
  }
227
- if (typeof this.data.password !== 'string' || _lodash2.default.isEmpty(this.data.password)) {
356
+ if (typeof this.data.password !== 'string' || _lodash.default.isEmpty(this.data.password)) {
228
357
  throw new Parse.Error(Parse.Error.PASSWORD_MISSING, 'password is required');
229
358
  }
230
359
  }
231
-
232
- if (!this.data.authData || !Object.keys(this.data.authData).length) {
360
+ if (authData && !Object.keys(authData).length || !Object.prototype.hasOwnProperty.call(this.data, 'authData')) {
361
+ // Nothing to validate here
233
362
  return;
363
+ } else if (Object.prototype.hasOwnProperty.call(this.data, 'authData') && !this.data.authData) {
364
+ // Handle saving authData to null
365
+ throw new Parse.Error(Parse.Error.UNSUPPORTED_SERVICE, 'This authentication method is unsupported.');
234
366
  }
235
-
236
- var authData = this.data.authData;
237
367
  var providers = Object.keys(authData);
238
368
  if (providers.length > 0) {
239
- const canHandleAuthData = providers.reduce((canHandle, provider) => {
240
- var providerAuthData = authData[provider];
241
- var hasToken = providerAuthData && providerAuthData.id;
242
- return canHandle && (hasToken || providerAuthData == null);
243
- }, true);
244
- if (canHandleAuthData) {
369
+ const canHandleAuthData = providers.some(provider => {
370
+ const providerAuthData = authData[provider] || {};
371
+ return !!Object.keys(providerAuthData).length;
372
+ });
373
+ if (canHandleAuthData || hasUsernameAndPassword || this.auth.isMaster || this.getUserId()) {
245
374
  return this.handleAuthData(authData);
246
375
  }
247
376
  }
248
377
  throw new Parse.Error(Parse.Error.UNSUPPORTED_SERVICE, 'This authentication method is unsupported.');
249
378
  };
250
-
251
- RestWrite.prototype.handleAuthDataValidation = function (authData) {
252
- const validations = Object.keys(authData).map(provider => {
253
- if (authData[provider] === null) {
254
- return Promise.resolve();
255
- }
256
- const validateAuthData = this.config.authDataManager.getValidatorForProvider(provider);
257
- if (!validateAuthData) {
258
- throw new Parse.Error(Parse.Error.UNSUPPORTED_SERVICE, 'This authentication method is unsupported.');
259
- }
260
- return validateAuthData(authData[provider]);
261
- });
262
- return Promise.all(validations);
263
- };
264
-
265
- RestWrite.prototype.findUsersWithAuthData = function (authData) {
266
- const providers = Object.keys(authData);
267
- const query = providers.reduce((memo, provider) => {
268
- if (!authData[provider]) {
269
- return memo;
270
- }
271
- const queryKey = `authData.${provider}.id`;
272
- const query = {};
273
- query[queryKey] = authData[provider].id;
274
- memo.push(query);
275
- return memo;
276
- }, []).filter(q => {
277
- return typeof q !== 'undefined';
278
- });
279
-
280
- let findPromise = Promise.resolve([]);
281
- if (query.length > 0) {
282
- findPromise = this.config.database.find(this.className, { '$or': query }, {});
283
- }
284
-
285
- return findPromise;
286
- };
287
-
288
379
  RestWrite.prototype.filteredObjectsByACL = function (objects) {
289
- if (this.auth.isMaster) {
380
+ if (this.auth.isMaster || this.auth.isMaintenance) {
290
381
  return objects;
291
382
  }
292
383
  return objects.filter(object => {
@@ -297,134 +388,186 @@ RestWrite.prototype.filteredObjectsByACL = function (objects) {
297
388
  return object.ACL && Object.keys(object.ACL).length > 0;
298
389
  });
299
390
  };
391
+ RestWrite.prototype.getUserId = function () {
392
+ if (this.query && this.query.objectId && this.className === '_User') {
393
+ return this.query.objectId;
394
+ } else if (this.auth && this.auth.user && this.auth.user.id) {
395
+ return this.auth.user.id;
396
+ }
397
+ };
300
398
 
301
- RestWrite.prototype.handleAuthData = function (authData) {
302
- let results;
303
- return this.findUsersWithAuthData(authData).then(r => {
304
- results = this.filteredObjectsByACL(r);
305
- if (results.length > 1) {
306
- // More than 1 user with the passed id's
307
- throw new Parse.Error(Parse.Error.ACCOUNT_ALREADY_LINKED, 'this auth is already used');
308
- }
399
+ // Developers are allowed to change authData via before save trigger
400
+ // we need after before save to ensure that the developer
401
+ // is not currently duplicating auth data ID
402
+ RestWrite.prototype.ensureUniqueAuthDataId = async function () {
403
+ if (this.className !== '_User' || !this.data.authData) {
404
+ return;
405
+ }
406
+ const hasAuthDataId = Object.keys(this.data.authData).some(key => this.data.authData[key] && this.data.authData[key].id);
407
+ if (!hasAuthDataId) {
408
+ return;
409
+ }
410
+ const r = await Auth.findUsersWithAuthData(this.config, this.data.authData);
411
+ const results = this.filteredObjectsByACL(r);
412
+ if (results.length > 1) {
413
+ throw new Parse.Error(Parse.Error.ACCOUNT_ALREADY_LINKED, 'this auth is already used');
414
+ }
415
+ // use data.objectId in case of login time and found user during handle validateAuthData
416
+ const userId = this.getUserId() || this.data.objectId;
417
+ if (results.length === 1 && userId !== results[0].objectId) {
418
+ throw new Parse.Error(Parse.Error.ACCOUNT_ALREADY_LINKED, 'this auth is already used');
419
+ }
420
+ };
421
+ RestWrite.prototype.handleAuthData = async function (authData) {
422
+ const r = await Auth.findUsersWithAuthData(this.config, authData, true);
423
+ const results = this.filteredObjectsByACL(r);
424
+ const userId = this.getUserId();
425
+ const userResult = results[0];
426
+ const foundUserIsNotCurrentUser = userId && userResult && userId !== userResult.objectId;
427
+ if (results.length > 1 || foundUserIsNotCurrentUser) {
428
+ // To avoid https://github.com/parse-community/parse-server/security/advisories/GHSA-8w3j-g983-8jh5
429
+ // Let's run some validation before throwing
430
+ await Auth.handleAuthDataValidation(authData, this, userResult);
431
+ throw new Parse.Error(Parse.Error.ACCOUNT_ALREADY_LINKED, 'this auth is already used');
432
+ }
433
+
434
+ // No user found with provided authData we need to validate
435
+ if (!results.length) {
436
+ const {
437
+ authData: validatedAuthData,
438
+ authDataResponse
439
+ } = await Auth.handleAuthDataValidation(authData, this);
440
+ this.authDataResponse = authDataResponse;
441
+ // Replace current authData by the new validated one
442
+ this.data.authData = validatedAuthData;
443
+ return;
444
+ }
309
445
 
310
- this.storage['authProvider'] = Object.keys(authData).join(',');
446
+ // User found with provided authData
447
+ if (results.length === 1) {
448
+ this.storage.authProvider = Object.keys(authData).join(',');
449
+ const {
450
+ hasMutatedAuthData,
451
+ mutatedAuthData
452
+ } = Auth.hasMutatedAuthData(authData, userResult.authData);
453
+ const isCurrentUserLoggedOrMaster = this.auth && this.auth.user && this.auth.user.id === userResult.objectId || this.auth.isMaster;
454
+ const isLogin = !userId;
455
+ if (isLogin || isCurrentUserLoggedOrMaster) {
456
+ // no user making the call
457
+ // OR the user making the call is the right one
458
+ // Login with auth data
459
+ delete results[0].password;
460
+
461
+ // need to set the objectId first otherwise location has trailing undefined
462
+ this.data.objectId = userResult.objectId;
463
+ if (!this.query || !this.query.objectId) {
464
+ this.response = {
465
+ response: userResult,
466
+ location: this.location()
467
+ };
468
+ // Run beforeLogin hook before storing any updates
469
+ // to authData on the db; changes to userResult
470
+ // will be ignored.
471
+ await this.runBeforeLoginTrigger(deepcopy(userResult));
472
+
473
+ // If we are in login operation via authData
474
+ // we need to be sure that the user has provided
475
+ // required authData
476
+ Auth.checkIfUserHasProvidedConfiguredProvidersForLogin({
477
+ config: this.config,
478
+ auth: this.auth
479
+ }, authData, userResult.authData, this.config);
480
+ }
311
481
 
312
- if (results.length > 0) {
313
- const userResult = results[0];
314
- const mutatedAuthData = {};
315
- Object.keys(authData).forEach(provider => {
316
- const providerData = authData[provider];
317
- const userAuthData = userResult.authData[provider];
318
- if (!_lodash2.default.isEqual(providerData, userAuthData)) {
319
- mutatedAuthData[provider] = providerData;
320
- }
321
- });
322
- const hasMutatedAuthData = Object.keys(mutatedAuthData).length !== 0;
323
- let userId;
324
- if (this.query && this.query.objectId) {
325
- userId = this.query.objectId;
326
- } else if (this.auth && this.auth.user && this.auth.user.id) {
327
- userId = this.auth.user.id;
482
+ // Prevent validating if no mutated data detected on update
483
+ if (!hasMutatedAuthData && isCurrentUserLoggedOrMaster) {
484
+ return;
328
485
  }
329
- if (!userId || userId === userResult.objectId) {
330
- // no user making the call
331
- // OR the user making the call is the right one
332
- // Login with auth data
333
- delete results[0].password;
334
486
 
335
- // need to set the objectId first otherwise location has trailing undefined
336
- this.data.objectId = userResult.objectId;
487
+ // Force to validate all provided authData on login
488
+ // on update only validate mutated ones
489
+ if (hasMutatedAuthData || !this.config.allowExpiredAuthDataToken) {
490
+ const res = await Auth.handleAuthDataValidation(isLogin ? authData : mutatedAuthData, this, userResult);
491
+ this.data.authData = res.authData;
492
+ this.authDataResponse = res.authDataResponse;
493
+ }
337
494
 
338
- if (!this.query || !this.query.objectId) {
339
- // this a login call, no userId passed
340
- this.response = {
341
- response: userResult,
342
- location: this.location()
343
- };
344
- }
345
- // If we didn't change the auth data, just keep going
346
- if (!hasMutatedAuthData) {
347
- return;
348
- }
349
- // We have authData that is updated on login
350
- // that can happen when token are refreshed,
351
- // We should update the token and let the user in
352
- // We should only check the mutated keys
353
- return this.handleAuthDataValidation(mutatedAuthData).then(() => {
354
- // IF we have a response, we'll skip the database operation / beforeSave / afterSave etc...
355
- // we need to set it up there.
356
- // We are supposed to have a response only on LOGIN with authData, so we skip those
357
- // If we're not logging in, but just updating the current user, we can safely skip that part
358
- if (this.response) {
359
- // Assign the new authData in the response
360
- Object.keys(mutatedAuthData).forEach(provider => {
361
- this.response.response.authData[provider] = mutatedAuthData[provider];
362
- });
363
- // Run the DB update directly, as 'master'
364
- // Just update the authData part
365
- // Then we're good for the user, early exit of sorts
366
- return this.config.database.update(this.className, { objectId: this.data.objectId }, { authData: mutatedAuthData }, {});
367
- }
495
+ // IF we are in login we'll skip the database operation / beforeSave / afterSave etc...
496
+ // we need to set it up there.
497
+ // We are supposed to have a response only on LOGIN with authData, so we skip those
498
+ // If we're not logging in, but just updating the current user, we can safely skip that part
499
+ if (this.response) {
500
+ // Assign the new authData in the response
501
+ Object.keys(mutatedAuthData).forEach(provider => {
502
+ this.response.response.authData[provider] = mutatedAuthData[provider];
368
503
  });
369
- } else if (userId) {
370
- // Trying to update auth data but users
371
- // are different
372
- if (userResult.objectId !== userId) {
373
- throw new Parse.Error(Parse.Error.ACCOUNT_ALREADY_LINKED, 'this auth is already used');
374
- }
375
- // No auth data was mutated, just keep going
376
- if (!hasMutatedAuthData) {
377
- return;
504
+
505
+ // Run the DB update directly, as 'master' only if authData contains some keys
506
+ // authData could not contains keys after validation if the authAdapter
507
+ // uses the `doNotSave` option. Just update the authData part
508
+ // Then we're good for the user, early exit of sorts
509
+ if (Object.keys(this.data.authData).length) {
510
+ await this.config.database.update(this.className, {
511
+ objectId: this.data.objectId
512
+ }, {
513
+ authData: this.data.authData
514
+ }, {});
378
515
  }
379
516
  }
380
517
  }
381
- return this.handleAuthDataValidation(authData);
382
- });
518
+ }
519
+ };
520
+ RestWrite.prototype.checkRestrictedFields = async function () {
521
+ if (this.className !== '_User') {
522
+ return;
523
+ }
524
+ if (!this.auth.isMaintenance && !this.auth.isMaster && 'emailVerified' in this.data) {
525
+ throw (0, _Error.createSanitizedError)(Parse.Error.OPERATION_FORBIDDEN, "Clients aren't allowed to manually update email verification.", this.config);
526
+ }
383
527
  };
384
528
 
385
529
  // The non-third-party parts of User transformation
386
- RestWrite.prototype.transformUser = function () {
530
+ RestWrite.prototype.transformUser = async function () {
387
531
  var promise = Promise.resolve();
388
-
389
532
  if (this.className !== '_User') {
390
533
  return promise;
391
534
  }
392
535
 
393
- if (!this.auth.isMaster && "emailVerified" in this.data) {
394
- const error = `Clients aren't allowed to manually update email verification.`;
395
- throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, error);
396
- }
397
-
398
536
  // Do not cleanup session if objectId is not set
399
537
  if (this.query && this.objectId()) {
400
538
  // If we're updating a _User object, we need to clear out the cache for that user. Find all their
401
539
  // session tokens, and remove them from the cache.
402
- promise = new _RestQuery2.default(this.config, Auth.master(this.config), '_Session', {
403
- user: {
404
- __type: "Pointer",
405
- className: "_User",
406
- objectId: this.objectId()
540
+ const query = await (0, _RestQuery.default)({
541
+ method: _RestQuery.default.Method.find,
542
+ config: this.config,
543
+ auth: Auth.master(this.config),
544
+ className: '_Session',
545
+ runBeforeFind: false,
546
+ restWhere: {
547
+ user: {
548
+ __type: 'Pointer',
549
+ className: '_User',
550
+ objectId: this.objectId()
551
+ }
407
552
  }
408
- }).execute().then(results => {
553
+ });
554
+ promise = query.execute().then(results => {
409
555
  results.results.forEach(session => this.config.cacheController.user.del(session.sessionToken));
410
556
  });
411
557
  }
412
-
413
558
  return promise.then(() => {
414
559
  // Transform the password
415
560
  if (this.data.password === undefined) {
416
561
  // ignore only if undefined. should proceed if empty ('')
417
562
  return Promise.resolve();
418
563
  }
419
-
420
564
  if (this.query) {
421
565
  this.storage['clearSessions'] = true;
422
566
  // Generate a new session only if the user requested
423
- if (!this.auth.isMaster) {
567
+ if (!this.auth.isMaster && !this.auth.isMaintenance) {
424
568
  this.storage['generateNewSession'] = true;
425
569
  }
426
570
  }
427
-
428
571
  return this._validatePasswordPolicy().then(() => {
429
572
  return passwordCrypto.hash(this.data.password).then(hashedPassword => {
430
573
  this.data._hashed_password = hashedPassword;
@@ -437,7 +580,6 @@ RestWrite.prototype.transformUser = function () {
437
580
  return this._validateEmail();
438
581
  });
439
582
  };
440
-
441
583
  RestWrite.prototype._validateUserName = function () {
442
584
  // Check for username uniqueness
443
585
  if (!this.data.username) {
@@ -447,9 +589,21 @@ RestWrite.prototype._validateUserName = function () {
447
589
  }
448
590
  return Promise.resolve();
449
591
  }
450
- // We need to a find to check for duplicate username in case they are missing the unique index on usernames
451
- // TODO: Check if there is a unique index, and if so, skip this query.
452
- return this.config.database.find(this.className, { username: this.data.username, objectId: { '$ne': this.objectId() } }, { limit: 1 }).then(results => {
592
+ /*
593
+ Usernames should be unique when compared case insensitively
594
+ Users should be able to make case sensitive usernames and
595
+ login using the case they entered. I.e. 'Snoopy' should preclude
596
+ 'snoopy' as a valid username.
597
+ */
598
+ return this.config.database.find(this.className, {
599
+ username: this.data.username,
600
+ objectId: {
601
+ $ne: this.objectId()
602
+ }
603
+ }, {
604
+ limit: 1,
605
+ caseInsensitive: true
606
+ }, {}, this.validSchemaController).then(results => {
453
607
  if (results.length > 0) {
454
608
  throw new Parse.Error(Parse.Error.USERNAME_TAKEN, 'Account already exists for this username.');
455
609
  }
@@ -457,6 +611,18 @@ RestWrite.prototype._validateUserName = function () {
457
611
  });
458
612
  };
459
613
 
614
+ /*
615
+ As with usernames, Parse should not allow case insensitive collisions of email.
616
+ unlike with usernames (which can have case insensitive collisions in the case of
617
+ auth adapters), emails should never have a case insensitive collision.
618
+
619
+ This behavior can be enforced through a properly configured index see:
620
+ https://docs.mongodb.com/manual/core/index-case-insensitive/#create-a-case-insensitive-index
621
+ which could be implemented instead of this code based validation.
622
+
623
+ Given that this lookup should be a relatively low use case and that the case sensitive
624
+ unique index will be used by the db for the query, this is an adequate solution.
625
+ */
460
626
  RestWrite.prototype._validateEmail = function () {
461
627
  if (!this.data.email || this.data.email.__op === 'Delete') {
462
628
  return Promise.resolve();
@@ -465,29 +631,55 @@ RestWrite.prototype._validateEmail = function () {
465
631
  if (!this.data.email.match(/^.+@.+$/)) {
466
632
  return Promise.reject(new Parse.Error(Parse.Error.INVALID_EMAIL_ADDRESS, 'Email address format is invalid.'));
467
633
  }
468
- // Same problem for email as above for username
469
- return this.config.database.find(this.className, { email: this.data.email, objectId: { '$ne': this.objectId() } }, { limit: 1 }).then(results => {
634
+ // Case insensitive match, see note above function.
635
+ return this.config.database.find(this.className, {
636
+ email: this.data.email,
637
+ objectId: {
638
+ $ne: this.objectId()
639
+ }
640
+ }, {
641
+ limit: 1,
642
+ caseInsensitive: true
643
+ }, {}, this.validSchemaController).then(results => {
470
644
  if (results.length > 0) {
471
645
  throw new Parse.Error(Parse.Error.EMAIL_TAKEN, 'Account already exists for this email address.');
472
646
  }
473
647
  if (!this.data.authData || !Object.keys(this.data.authData).length || Object.keys(this.data.authData).length === 1 && Object.keys(this.data.authData)[0] === 'anonymous') {
474
648
  // We updated the email, send a new validation
475
- this.storage['sendVerificationEmail'] = true;
476
- this.config.userController.setEmailVerifyToken(this.data);
649
+ const {
650
+ originalObject,
651
+ updatedObject
652
+ } = this.buildParseObjects();
653
+ const request = {
654
+ original: originalObject,
655
+ object: updatedObject,
656
+ master: this.auth.isMaster,
657
+ ip: this.config.ip,
658
+ installationId: this.auth.installationId
659
+ };
660
+ return this.config.userController.setEmailVerifyToken(this.data, request, this.storage);
477
661
  }
478
662
  });
479
663
  };
480
-
481
664
  RestWrite.prototype._validatePasswordPolicy = function () {
482
- if (!this.config.passwordPolicy) return Promise.resolve();
665
+ if (!this.config.passwordPolicy) {
666
+ return Promise.resolve();
667
+ }
483
668
  return this._validatePasswordRequirements().then(() => {
484
669
  return this._validatePasswordHistory();
485
670
  });
486
671
  };
487
-
488
672
  RestWrite.prototype._validatePasswordRequirements = function () {
489
673
  // check if the password conforms to the defined password policy if configured
490
- const policyError = 'Password does not meet the Password Policy requirements.';
674
+ // If we specified a custom error in our configuration use it.
675
+ // Example: "Passwords must include a Capital Letter, Lowercase Letter, and a number."
676
+ //
677
+ // This is especially useful on the generic "password reset" page,
678
+ // as it allows the programmer to communicate specific requirements instead of:
679
+ // a. making the user guess whats wrong
680
+ // b. making a custom password reset page that shows the requirements
681
+ const policyError = this.config.passwordPolicy.validationError ? this.config.passwordPolicy.validationError : 'Password does not meet the Password Policy requirements.';
682
+ const containsUsernameError = 'Password cannot contain your username.';
491
683
 
492
684
  // check whether the password meets the password strength requirements
493
685
  if (this.config.passwordPolicy.patternValidator && !this.config.passwordPolicy.patternValidator(this.data.password) || this.config.passwordPolicy.validatorCallback && !this.config.passwordPolicy.validatorCallback(this.data.password)) {
@@ -498,38 +690,52 @@ RestWrite.prototype._validatePasswordRequirements = function () {
498
690
  if (this.config.passwordPolicy.doNotAllowUsername === true) {
499
691
  if (this.data.username) {
500
692
  // username is not passed during password reset
501
- if (this.data.password.indexOf(this.data.username) >= 0) return Promise.reject(new Parse.Error(Parse.Error.VALIDATION_ERROR, policyError));
693
+ if (this.data.password.indexOf(this.data.username) >= 0) {
694
+ return Promise.reject(new Parse.Error(Parse.Error.VALIDATION_ERROR, containsUsernameError));
695
+ }
502
696
  } else {
503
697
  // retrieve the User object using objectId during password reset
504
- return this.config.database.find('_User', { objectId: this.objectId() }).then(results => {
698
+ return this.config.database.find('_User', {
699
+ objectId: this.objectId()
700
+ }).then(results => {
505
701
  if (results.length != 1) {
506
702
  throw undefined;
507
703
  }
508
- if (this.data.password.indexOf(results[0].username) >= 0) return Promise.reject(new Parse.Error(Parse.Error.VALIDATION_ERROR, policyError));
704
+ if (this.data.password.indexOf(results[0].username) >= 0) {
705
+ return Promise.reject(new Parse.Error(Parse.Error.VALIDATION_ERROR, containsUsernameError));
706
+ }
509
707
  return Promise.resolve();
510
708
  });
511
709
  }
512
710
  }
513
711
  return Promise.resolve();
514
712
  };
515
-
516
713
  RestWrite.prototype._validatePasswordHistory = function () {
517
714
  // check whether password is repeating from specified history
518
715
  if (this.query && this.config.passwordPolicy.maxPasswordHistory) {
519
- return this.config.database.find('_User', { objectId: this.objectId() }, { keys: ["_password_history", "_hashed_password"] }).then(results => {
716
+ return this.config.database.find('_User', {
717
+ objectId: this.objectId()
718
+ }, {
719
+ keys: ['_password_history', '_hashed_password']
720
+ }, Auth.maintenance(this.config)).then(results => {
520
721
  if (results.length != 1) {
521
722
  throw undefined;
522
723
  }
523
724
  const user = results[0];
524
725
  let oldPasswords = [];
525
- if (user._password_history) oldPasswords = _lodash2.default.take(user._password_history, this.config.passwordPolicy.maxPasswordHistory - 1);
726
+ if (user._password_history) {
727
+ oldPasswords = _lodash.default.take(user._password_history, this.config.passwordPolicy.maxPasswordHistory - 1);
728
+ }
526
729
  oldPasswords.push(user.password);
527
730
  const newPassword = this.data.password;
528
731
  // compare the new password hash with all old password hashes
529
732
  const promises = oldPasswords.map(function (hash) {
530
733
  return passwordCrypto.compare(newPassword, hash).then(result => {
531
- if (result) // reject if there is a match
532
- return Promise.reject("REPEAT_PASSWORD");
734
+ if (result)
735
+ // reject if there is a match
736
+ {
737
+ return Promise.reject('REPEAT_PASSWORD');
738
+ }
533
739
  return Promise.resolve();
534
740
  });
535
741
  });
@@ -537,57 +743,127 @@ RestWrite.prototype._validatePasswordHistory = function () {
537
743
  return Promise.all(promises).then(() => {
538
744
  return Promise.resolve();
539
745
  }).catch(err => {
540
- if (err === "REPEAT_PASSWORD") // a match was found
541
- return Promise.reject(new Parse.Error(Parse.Error.VALIDATION_ERROR, `New password should not be the same as last ${this.config.passwordPolicy.maxPasswordHistory} passwords.`));
746
+ if (err === 'REPEAT_PASSWORD')
747
+ // a match was found
748
+ {
749
+ return Promise.reject(new Parse.Error(Parse.Error.VALIDATION_ERROR, `New password should not be the same as last ${this.config.passwordPolicy.maxPasswordHistory} passwords.`));
750
+ }
542
751
  throw err;
543
752
  });
544
753
  });
545
754
  }
546
755
  return Promise.resolve();
547
756
  };
548
-
549
- RestWrite.prototype.createSessionTokenIfNeeded = function () {
757
+ RestWrite.prototype.createSessionTokenIfNeeded = async function () {
550
758
  if (this.className !== '_User') {
551
759
  return;
552
760
  }
553
- if (this.query) {
761
+ // Don't generate session for updating user (this.query is set) unless authData exists
762
+ if (this.query && !this.data.authData) {
763
+ return;
764
+ }
765
+ // Don't generate new sessionToken if linking via sessionToken
766
+ if (this.auth.user && this.data.authData) {
554
767
  return;
555
768
  }
556
- if (!this.storage['authProvider'] // signup call, with
557
- && this.config.preventLoginWithUnverifiedEmail // no login without verification
558
- && this.config.verifyUserEmails) {
559
- // verification is on
560
- return; // do not create the session token in that case!
769
+ // If sign-up call
770
+ if (!this.storage.authProvider) {
771
+ // Create request object for verification functions
772
+ const {
773
+ originalObject,
774
+ updatedObject
775
+ } = this.buildParseObjects();
776
+ const request = {
777
+ original: originalObject,
778
+ object: updatedObject,
779
+ master: this.auth.isMaster,
780
+ ip: this.config.ip,
781
+ installationId: this.auth.installationId
782
+ };
783
+ // Get verification conditions which can be booleans or functions; the purpose of this async/await
784
+ // structure is to avoid unnecessarily executing subsequent functions if previous ones fail in the
785
+ // conditional statement below, as a developer may decide to execute expensive operations in them
786
+ const verifyUserEmails = async () => this.config.verifyUserEmails === true || typeof this.config.verifyUserEmails === 'function' && (await Promise.resolve(this.config.verifyUserEmails(request))) === true;
787
+ const preventLoginWithUnverifiedEmail = async () => this.config.preventLoginWithUnverifiedEmail === true || typeof this.config.preventLoginWithUnverifiedEmail === 'function' && (await Promise.resolve(this.config.preventLoginWithUnverifiedEmail(request))) === true;
788
+ // If verification is required
789
+ if ((await verifyUserEmails()) && (await preventLoginWithUnverifiedEmail())) {
790
+ this.storage.rejectSignup = true;
791
+ return;
792
+ }
561
793
  }
562
794
  return this.createSessionToken();
563
795
  };
564
-
565
- RestWrite.prototype.createSessionToken = function () {
796
+ RestWrite.prototype.createSessionToken = async function () {
566
797
  // cloud installationId from Cloud Code,
567
798
  // never create session tokens from there.
568
799
  if (this.auth.installationId && this.auth.installationId === 'cloud') {
569
800
  return;
570
801
  }
571
-
802
+ if (this.storage.authProvider == null && this.data.authData) {
803
+ this.storage.authProvider = Object.keys(this.data.authData).join(',');
804
+ }
572
805
  const {
573
806
  sessionData,
574
807
  createSession
575
- } = Auth.createSession(this.config, {
808
+ } = RestWrite.createSession(this.config, {
576
809
  userId: this.objectId(),
577
810
  createdWith: {
578
- 'action': this.storage['authProvider'] ? 'login' : 'signup',
579
- 'authProvider': this.storage['authProvider'] || 'password'
811
+ action: this.storage.authProvider ? 'login' : 'signup',
812
+ authProvider: this.storage.authProvider || 'password'
580
813
  },
581
814
  installationId: this.auth.installationId
582
815
  });
583
-
584
816
  if (this.response && this.response.response) {
585
817
  this.response.response.sessionToken = sessionData.sessionToken;
586
818
  }
587
-
588
819
  return createSession();
589
820
  };
821
+ RestWrite.createSession = function (config, {
822
+ userId,
823
+ createdWith,
824
+ installationId,
825
+ additionalSessionData
826
+ }) {
827
+ const token = 'r:' + cryptoUtils.newToken();
828
+ const expiresAt = config.generateSessionExpiresAt();
829
+ const sessionData = {
830
+ sessionToken: token,
831
+ user: {
832
+ __type: 'Pointer',
833
+ className: '_User',
834
+ objectId: userId
835
+ },
836
+ createdWith,
837
+ expiresAt: Parse._encode(expiresAt)
838
+ };
839
+ if (installationId) {
840
+ sessionData.installationId = installationId;
841
+ }
842
+ Object.assign(sessionData, additionalSessionData);
843
+ return {
844
+ sessionData,
845
+ createSession: () => new RestWrite(config, Auth.master(config), '_Session', null, sessionData).execute()
846
+ };
847
+ };
590
848
 
849
+ // Delete email reset tokens if user is changing password or email.
850
+ RestWrite.prototype.deleteEmailResetTokenIfNeeded = function () {
851
+ if (this.className !== '_User' || this.query === null) {
852
+ // null query means create
853
+ return;
854
+ }
855
+ if ('password' in this.data || 'email' in this.data) {
856
+ const addOps = {
857
+ _perishable_token: {
858
+ __op: 'Delete'
859
+ },
860
+ _perishable_token_expires_at: {
861
+ __op: 'Delete'
862
+ }
863
+ };
864
+ this.data = Object.assign(this.data, addOps);
865
+ }
866
+ };
591
867
  RestWrite.prototype.destroyDuplicatedSessions = function () {
592
868
  // Only for _Session, and at creation time
593
869
  if (this.className != '_Session' || this.query) {
@@ -608,8 +884,10 @@ RestWrite.prototype.destroyDuplicatedSessions = function () {
608
884
  this.config.database.destroy('_Session', {
609
885
  user,
610
886
  installationId,
611
- sessionToken: { '$ne': sessionToken }
612
- });
887
+ sessionToken: {
888
+ $ne: sessionToken
889
+ }
890
+ }, {}, this.validSchemaController);
613
891
  };
614
892
 
615
893
  // Handles any followup logic
@@ -625,16 +903,16 @@ RestWrite.prototype.handleFollowup = function () {
625
903
  delete this.storage['clearSessions'];
626
904
  return this.config.database.destroy('_Session', sessionQuery).then(this.handleFollowup.bind(this));
627
905
  }
628
-
629
906
  if (this.storage && this.storage['generateNewSession']) {
630
907
  delete this.storage['generateNewSession'];
631
908
  return this.createSessionToken().then(this.handleFollowup.bind(this));
632
909
  }
633
-
634
910
  if (this.storage && this.storage['sendVerificationEmail']) {
635
911
  delete this.storage['sendVerificationEmail'];
636
912
  // Fire and forget!
637
- this.config.userController.sendVerificationEmail(this.data);
913
+ this.config.userController.sendVerificationEmail(this.data, {
914
+ auth: this.auth
915
+ });
638
916
  return this.handleFollowup.bind(this);
639
917
  }
640
918
  };
@@ -645,8 +923,7 @@ RestWrite.prototype.handleSession = function () {
645
923
  if (this.response || this.className !== '_Session') {
646
924
  return;
647
925
  }
648
-
649
- if (!this.auth.user && !this.auth.isMaster) {
926
+ if (!this.auth.user && !this.auth.isMaster && !this.auth.isMaintenance) {
650
927
  throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'Session token required.');
651
928
  }
652
929
 
@@ -654,7 +931,6 @@ RestWrite.prototype.handleSession = function () {
654
931
  if (this.data.ACL) {
655
932
  throw new Parse.Error(Parse.Error.INVALID_KEY_NAME, 'Cannot set ' + 'ACL on a Session.');
656
933
  }
657
-
658
934
  if (this.query) {
659
935
  if (this.data.user && !this.auth.isMaster && this.data.user.objectId != this.auth.user.id) {
660
936
  throw new Parse.Error(Parse.Error.INVALID_KEY_NAME);
@@ -663,9 +939,19 @@ RestWrite.prototype.handleSession = function () {
663
939
  } else if (this.data.sessionToken) {
664
940
  throw new Parse.Error(Parse.Error.INVALID_KEY_NAME);
665
941
  }
942
+ if (!this.auth.isMaster) {
943
+ this.query = {
944
+ $and: [this.query, {
945
+ user: {
946
+ __type: 'Pointer',
947
+ className: '_User',
948
+ objectId: this.auth.user.id
949
+ }
950
+ }]
951
+ };
952
+ }
666
953
  }
667
-
668
- if (!this.query && !this.auth.isMaster) {
954
+ if (!this.query && !this.auth.isMaster && !this.auth.isMaintenance) {
669
955
  const additionalSessionData = {};
670
956
  for (var key in this.data) {
671
957
  if (key === 'objectId' || key === 'user') {
@@ -673,15 +959,16 @@ RestWrite.prototype.handleSession = function () {
673
959
  }
674
960
  additionalSessionData[key] = this.data[key];
675
961
  }
676
-
677
- const { sessionData, createSession } = Auth.createSession(this.config, {
962
+ const {
963
+ sessionData,
964
+ createSession
965
+ } = RestWrite.createSession(this.config, {
678
966
  userId: this.auth.user.id,
679
967
  createdWith: {
680
968
  action: 'create'
681
969
  },
682
970
  additionalSessionData
683
971
  });
684
-
685
972
  return createSession().then(results => {
686
973
  if (!results.response) {
687
974
  throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'Error creating session.');
@@ -705,7 +992,6 @@ RestWrite.prototype.handleInstallation = function () {
705
992
  if (this.response || this.className !== '_Installation') {
706
993
  return;
707
994
  }
708
-
709
995
  if (!this.query && !this.data.deviceToken && !this.data.installationId && !this.auth.installationId) {
710
996
  throw new Parse.Error(135, 'at least one ID field (deviceToken, installationId) ' + 'must be specified in this operation');
711
997
  }
@@ -720,14 +1006,12 @@ RestWrite.prototype.handleInstallation = function () {
720
1006
  if (this.data.installationId) {
721
1007
  this.data.installationId = this.data.installationId.toLowerCase();
722
1008
  }
723
-
724
1009
  let installationId = this.data.installationId;
725
1010
 
726
1011
  // If data.installationId is not set and we're not master, we can lookup in auth
727
- if (!installationId && !this.auth.isMaster) {
1012
+ if (!installationId && !this.auth.isMaster && !this.auth.isMaintenance) {
728
1013
  installationId = this.auth.installationId;
729
1014
  }
730
-
731
1015
  if (installationId) {
732
1016
  installationId = installationId.toLowerCase();
733
1017
  }
@@ -736,9 +1020,7 @@ RestWrite.prototype.handleInstallation = function () {
736
1020
  if (this.query && !this.data.deviceToken && !installationId && !this.data.deviceType) {
737
1021
  return;
738
1022
  }
739
-
740
1023
  var promise = Promise.resolve();
741
-
742
1024
  var idMatch; // Will be a match on either objectId or installationId
743
1025
  var objectIdMatch;
744
1026
  var installationIdMatch;
@@ -753,20 +1035,20 @@ RestWrite.prototype.handleInstallation = function () {
753
1035
  }
754
1036
  if (installationId) {
755
1037
  orQueries.push({
756
- 'installationId': installationId
1038
+ installationId: installationId
757
1039
  });
758
1040
  }
759
1041
  if (this.data.deviceToken) {
760
- orQueries.push({ 'deviceToken': this.data.deviceToken });
1042
+ orQueries.push({
1043
+ deviceToken: this.data.deviceToken
1044
+ });
761
1045
  }
762
-
763
1046
  if (orQueries.length == 0) {
764
1047
  return;
765
1048
  }
766
-
767
1049
  promise = promise.then(() => {
768
1050
  return this.config.database.find('_Installation', {
769
- '$or': orQueries
1051
+ $or: orQueries
770
1052
  }, {});
771
1053
  }).then(results => {
772
1054
  results.forEach(result => {
@@ -796,11 +1078,9 @@ RestWrite.prototype.handleInstallation = function () {
796
1078
  throw new Parse.Error(136, 'deviceType may not be changed in this ' + 'operation');
797
1079
  }
798
1080
  }
799
-
800
1081
  if (this.query && this.query.objectId && objectIdMatch) {
801
1082
  idMatch = objectIdMatch;
802
1083
  }
803
-
804
1084
  if (installationId && installationIdMatch) {
805
1085
  idMatch = installationIdMatch;
806
1086
  }
@@ -826,9 +1106,9 @@ RestWrite.prototype.handleInstallation = function () {
826
1106
  // the deviceToken, and return nil to signal that a new object should
827
1107
  // be created.
828
1108
  var delQuery = {
829
- 'deviceToken': this.data.deviceToken,
830
- 'installationId': {
831
- '$ne': installationId
1109
+ deviceToken: this.data.deviceToken,
1110
+ installationId: {
1111
+ $ne: installationId
832
1112
  }
833
1113
  };
834
1114
  if (this.data.appIdentifier) {
@@ -849,7 +1129,9 @@ RestWrite.prototype.handleInstallation = function () {
849
1129
  // Exactly one device token match and it doesn't have an installation
850
1130
  // ID. This is the one case where we want to merge with the existing
851
1131
  // object.
852
- const delQuery = { objectId: idMatch.objectId };
1132
+ const delQuery = {
1133
+ objectId: idMatch.objectId
1134
+ };
853
1135
  return this.config.database.destroy('_Installation', delQuery).then(() => {
854
1136
  return deviceTokenMatches[0]['objectId'];
855
1137
  }).catch(err => {
@@ -866,18 +1148,18 @@ RestWrite.prototype.handleInstallation = function () {
866
1148
  // we should try cleaning out old installations that match this
867
1149
  // device token.
868
1150
  const delQuery = {
869
- 'deviceToken': this.data.deviceToken
1151
+ deviceToken: this.data.deviceToken
870
1152
  };
871
1153
  // We have a unique install Id, use that to preserve
872
1154
  // the interesting installation
873
1155
  if (this.data.installationId) {
874
1156
  delQuery['installationId'] = {
875
- '$ne': this.data.installationId
1157
+ $ne: this.data.installationId
876
1158
  };
877
1159
  } else if (idMatch.objectId && this.data.objectId && idMatch.objectId == this.data.objectId) {
878
1160
  // we passed an objectId, preserve that instalation
879
1161
  delQuery['objectId'] = {
880
- '$ne': idMatch.objectId
1162
+ $ne: idMatch.objectId
881
1163
  };
882
1164
  } else {
883
1165
  // What to do here? can't really clean up everything...
@@ -901,7 +1183,9 @@ RestWrite.prototype.handleInstallation = function () {
901
1183
  }
902
1184
  }).then(objId => {
903
1185
  if (objId) {
904
- this.query = { objectId: objId };
1186
+ this.query = {
1187
+ objectId: objId
1188
+ };
905
1189
  delete this.data.objectId;
906
1190
  delete this.data.createdAt;
907
1191
  }
@@ -910,29 +1194,28 @@ RestWrite.prototype.handleInstallation = function () {
910
1194
  return promise;
911
1195
  };
912
1196
 
913
- // If we short-circuted the object response - then we need to make sure we expand all the files,
1197
+ // If we short-circuited the object response - then we need to make sure we expand all the files,
914
1198
  // since this might not have a query, meaning it won't return the full result back.
915
1199
  // TODO: (nlutsenko) This should die when we move to per-class based controllers on _Session/_User
916
- RestWrite.prototype.expandFilesForExistingObjects = function () {
1200
+ RestWrite.prototype.expandFilesForExistingObjects = async function () {
917
1201
  // Check whether we have a short-circuited response - only then run expansion.
918
1202
  if (this.response && this.response.response) {
919
- this.config.filesController.expandFilesInObject(this.config, this.response.response);
1203
+ await this.config.filesController.expandFilesInObject(this.config, this.response.response);
920
1204
  }
921
1205
  };
922
-
923
1206
  RestWrite.prototype.runDatabaseOperation = function () {
924
1207
  if (this.response) {
925
1208
  return;
926
1209
  }
927
-
928
1210
  if (this.className === '_Role') {
929
1211
  this.config.cacheController.role.clear();
1212
+ if (this.config.liveQueryController) {
1213
+ this.config.liveQueryController.clearCachedRoles(this.auth.user);
1214
+ }
930
1215
  }
931
-
932
1216
  if (this.className === '_User' && this.query && this.auth.isUnauthenticated()) {
933
- throw new Parse.Error(Parse.Error.SESSION_MISSING, `Cannot modify user ${this.query.objectId}.`);
1217
+ throw (0, _Error.createSanitizedError)(Parse.Error.SESSION_MISSING, `Cannot modify user ${this.query.objectId}.`, this.config);
934
1218
  }
935
-
936
1219
  if (this.className === '_Product' && this.data.download) {
937
1220
  this.data.downloadName = this.data.download.name;
938
1221
  }
@@ -942,12 +1225,14 @@ RestWrite.prototype.runDatabaseOperation = function () {
942
1225
  if (this.data.ACL && this.data.ACL['*unresolved']) {
943
1226
  throw new Parse.Error(Parse.Error.INVALID_ACL, 'Invalid ACL.');
944
1227
  }
945
-
946
1228
  if (this.query) {
947
1229
  // Force the user to not lockout
948
1230
  // Matched with parse.com
949
- if (this.className === '_User' && this.data.ACL && this.auth.isMaster !== true) {
950
- this.data.ACL[this.query.objectId] = { read: true, write: true };
1231
+ if (this.className === '_User' && this.data.ACL && this.auth.isMaster !== true && this.auth.isMaintenance !== true) {
1232
+ this.data.ACL[this.query.objectId] = {
1233
+ read: true,
1234
+ write: true
1235
+ };
951
1236
  }
952
1237
  // update password timestamp if user password is being changed
953
1238
  if (this.className === '_User' && this.data._hashed_password && this.config.passwordPolicy && this.config.passwordPolicy.maxPasswordAge) {
@@ -955,34 +1240,38 @@ RestWrite.prototype.runDatabaseOperation = function () {
955
1240
  }
956
1241
  // Ignore createdAt when update
957
1242
  delete this.data.createdAt;
958
-
959
1243
  let defer = Promise.resolve();
960
1244
  // if password history is enabled then save the current password to history
961
1245
  if (this.className === '_User' && this.data._hashed_password && this.config.passwordPolicy && this.config.passwordPolicy.maxPasswordHistory) {
962
- defer = this.config.database.find('_User', { objectId: this.objectId() }, { keys: ["_password_history", "_hashed_password"] }).then(results => {
1246
+ defer = this.config.database.find('_User', {
1247
+ objectId: this.objectId()
1248
+ }, {
1249
+ keys: ['_password_history', '_hashed_password']
1250
+ }, Auth.maintenance(this.config)).then(results => {
963
1251
  if (results.length != 1) {
964
1252
  throw undefined;
965
1253
  }
966
1254
  const user = results[0];
967
1255
  let oldPasswords = [];
968
1256
  if (user._password_history) {
969
- oldPasswords = _lodash2.default.take(user._password_history, this.config.passwordPolicy.maxPasswordHistory);
1257
+ oldPasswords = _lodash.default.take(user._password_history, this.config.passwordPolicy.maxPasswordHistory);
970
1258
  }
971
1259
  //n-1 passwords go into history including last password
972
- while (oldPasswords.length > this.config.passwordPolicy.maxPasswordHistory - 2) {
1260
+ while (oldPasswords.length > Math.max(0, this.config.passwordPolicy.maxPasswordHistory - 2)) {
973
1261
  oldPasswords.shift();
974
1262
  }
975
1263
  oldPasswords.push(user.password);
976
1264
  this.data._password_history = oldPasswords;
977
1265
  });
978
1266
  }
979
-
980
1267
  return defer.then(() => {
981
1268
  // Run an update
982
- return this.config.database.update(this.className, this.query, this.data, this.runOptions).then(response => {
1269
+ return this.config.database.update(this.className, this.query, this.data, this.runOptions, false, false, this.validSchemaController).then(response => {
983
1270
  response.updatedAt = this.updatedAt;
984
1271
  this._updateResponseWithData(response, this.data);
985
- this.response = { response };
1272
+ this.response = {
1273
+ response
1274
+ };
986
1275
  });
987
1276
  });
988
1277
  } else {
@@ -992,10 +1281,18 @@ RestWrite.prototype.runDatabaseOperation = function () {
992
1281
  // default public r/w ACL
993
1282
  if (!ACL) {
994
1283
  ACL = {};
995
- ACL['*'] = { read: true, write: false };
1284
+ if (!this.config.enforcePrivateUsers) {
1285
+ ACL['*'] = {
1286
+ read: true,
1287
+ write: false
1288
+ };
1289
+ }
996
1290
  }
997
1291
  // make sure the user is not locked down
998
- ACL[this.data.objectId] = { read: true, write: true };
1292
+ ACL[this.data.objectId] = {
1293
+ read: true,
1294
+ write: true
1295
+ };
999
1296
  this.data.ACL = ACL;
1000
1297
  // password timestamp to be used when password expiry policy is enforced
1001
1298
  if (this.config.passwordPolicy && this.config.passwordPolicy.maxPasswordAge) {
@@ -1004,7 +1301,7 @@ RestWrite.prototype.runDatabaseOperation = function () {
1004
1301
  }
1005
1302
 
1006
1303
  // Run a create
1007
- return this.config.database.create(this.className, this.data, this.runOptions).catch(error => {
1304
+ return this.config.database.create(this.className, this.data, this.runOptions, false, this.validSchemaController).catch(error => {
1008
1305
  if (this.className !== '_User' || error.code !== Parse.Error.DUPLICATE_VALUE) {
1009
1306
  throw error;
1010
1307
  }
@@ -1013,7 +1310,6 @@ RestWrite.prototype.runDatabaseOperation = function () {
1013
1310
  if (error && error.userInfo && error.userInfo.duplicated_field === 'username') {
1014
1311
  throw new Parse.Error(Parse.Error.USERNAME_TAKEN, 'Account already exists for this username.');
1015
1312
  }
1016
-
1017
1313
  if (error && error.userInfo && error.userInfo.duplicated_field === 'email') {
1018
1314
  throw new Parse.Error(Parse.Error.EMAIL_TAKEN, 'Account already exists for this email address.');
1019
1315
  }
@@ -1022,11 +1318,25 @@ RestWrite.prototype.runDatabaseOperation = function () {
1022
1318
  // check whether it was username or email and return the appropriate error.
1023
1319
  // Fallback to the original method
1024
1320
  // TODO: See if we can later do this without additional queries by using named indexes.
1025
- return this.config.database.find(this.className, { username: this.data.username, objectId: { '$ne': this.objectId() } }, { limit: 1 }).then(results => {
1321
+ return this.config.database.find(this.className, {
1322
+ username: this.data.username,
1323
+ objectId: {
1324
+ $ne: this.objectId()
1325
+ }
1326
+ }, {
1327
+ limit: 1
1328
+ }).then(results => {
1026
1329
  if (results.length > 0) {
1027
1330
  throw new Parse.Error(Parse.Error.USERNAME_TAKEN, 'Account already exists for this username.');
1028
1331
  }
1029
- return this.config.database.find(this.className, { email: this.data.email, objectId: { '$ne': this.objectId() } }, { limit: 1 });
1332
+ return this.config.database.find(this.className, {
1333
+ email: this.data.email,
1334
+ objectId: {
1335
+ $ne: this.objectId()
1336
+ }
1337
+ }, {
1338
+ limit: 1
1339
+ });
1030
1340
  }).then(results => {
1031
1341
  if (results.length > 0) {
1032
1342
  throw new Parse.Error(Parse.Error.EMAIL_TAKEN, 'Account already exists for this email address.');
@@ -1036,7 +1346,6 @@ RestWrite.prototype.runDatabaseOperation = function () {
1036
1346
  }).then(response => {
1037
1347
  response.objectId = this.data.objectId;
1038
1348
  response.createdAt = this.data.createdAt;
1039
-
1040
1349
  if (this.responseShouldHaveUsername) {
1041
1350
  response.username = this.data.username;
1042
1351
  }
@@ -1051,8 +1360,8 @@ RestWrite.prototype.runDatabaseOperation = function () {
1051
1360
  };
1052
1361
 
1053
1362
  // Returns nothing - doesn't wait for the trigger.
1054
- RestWrite.prototype.runAfterTrigger = function () {
1055
- if (!this.response || !this.response.response) {
1363
+ RestWrite.prototype.runAfterSaveTrigger = function () {
1364
+ if (!this.response || !this.response.response || this.runOptions.many) {
1056
1365
  return;
1057
1366
  }
1058
1367
 
@@ -1062,36 +1371,40 @@ RestWrite.prototype.runAfterTrigger = function () {
1062
1371
  if (!hasAfterSaveHook && !hasLiveQuery) {
1063
1372
  return Promise.resolve();
1064
1373
  }
1065
-
1066
- var extraData = { className: this.className };
1067
- if (this.query && this.query.objectId) {
1068
- extraData.objectId = this.query.objectId;
1374
+ const {
1375
+ originalObject,
1376
+ updatedObject
1377
+ } = this.buildParseObjects();
1378
+ updatedObject._handleSaveResponse(this.response.response, this.response.status || 200);
1379
+ if (hasLiveQuery) {
1380
+ this.config.database.loadSchema().then(schemaController => {
1381
+ // Notify LiveQueryServer if possible
1382
+ const perms = schemaController.getClassLevelPermissions(updatedObject.className);
1383
+ this.config.liveQueryController.onAfterSave(updatedObject.className, updatedObject, originalObject, perms);
1384
+ });
1069
1385
  }
1070
-
1071
- // Build the original object, we only do this for a update write.
1072
- let originalObject;
1073
- if (this.query && this.query.objectId) {
1074
- originalObject = triggers.inflate(extraData, this.originalData);
1386
+ if (!hasAfterSaveHook) {
1387
+ return Promise.resolve();
1075
1388
  }
1076
-
1077
- // Build the inflated object, different from beforeSave, originalData is not empty
1078
- // since developers can change data in the beforeSave.
1079
- const updatedObject = this.buildUpdatedObject(extraData);
1080
- updatedObject._handleSaveResponse(this.response.response, this.response.status || 200);
1081
-
1082
- // Notifiy LiveQueryServer if possible
1083
- this.config.liveQueryController.onAfterSave(updatedObject.className, updatedObject, originalObject);
1084
-
1085
1389
  // Run afterSave trigger
1086
- return triggers.maybeRunTrigger(triggers.Types.afterSave, this.auth, updatedObject, originalObject, this.config).catch(function (err) {
1087
- _logger2.default.warn('afterSave caught an error', err);
1390
+ return triggers.maybeRunTrigger(triggers.Types.afterSave, this.auth, updatedObject, originalObject, this.config, this.context).then(result => {
1391
+ const jsonReturned = result && !result._toFullJSON;
1392
+ if (jsonReturned) {
1393
+ this.pendingOps.operations = {};
1394
+ this.response.response = result;
1395
+ } else {
1396
+ this.response.response = this._updateResponseWithData((result || updatedObject).toJSON(), this.data);
1397
+ }
1398
+ }).catch(function (err) {
1399
+ _logger.default.warn('afterSave caught an error', err);
1088
1400
  });
1089
1401
  };
1090
1402
 
1091
1403
  // A helper to figure out what location this operation happens at.
1092
1404
  RestWrite.prototype.location = function () {
1093
1405
  var middle = this.className === '_User' ? '/users/' : '/classes/' + this.className + '/';
1094
- return this.config.mount + middle + this.data.objectId;
1406
+ const mount = this.config.mount || this.config.serverURL;
1407
+ return mount + middle + this.data.objectId;
1095
1408
  };
1096
1409
 
1097
1410
  // A helper to get the object id for this operation.
@@ -1113,28 +1426,62 @@ RestWrite.prototype.sanitizedData = function () {
1113
1426
  };
1114
1427
 
1115
1428
  // Returns an updated copy of the object
1116
- RestWrite.prototype.buildUpdatedObject = function (extraData) {
1429
+ RestWrite.prototype.buildParseObjects = function () {
1430
+ const extraData = {
1431
+ className: this.className,
1432
+ objectId: this.query?.objectId
1433
+ };
1434
+ let originalObject;
1435
+ if (this.query && this.query.objectId) {
1436
+ originalObject = triggers.inflate(extraData, this.originalData);
1437
+ }
1438
+ const className = Parse.Object.fromJSON(extraData);
1439
+ const readOnlyAttributes = className.constructor.readOnlyAttributes ? className.constructor.readOnlyAttributes() : [];
1440
+
1441
+ // For _Role class, 'name' cannot be set after the role has an objectId.
1442
+ // In afterSave context, _handleSaveResponse has already set the objectId,
1443
+ // so we treat 'name' as read-only to avoid Parse SDK validation errors.
1444
+ const isRoleAfterSave = this.className === '_Role' && this.response && !this.query;
1445
+ if (isRoleAfterSave && this.data.name && !readOnlyAttributes.includes('name')) {
1446
+ readOnlyAttributes.push('name');
1447
+ }
1448
+ if (!this.originalData) {
1449
+ for (const attribute of readOnlyAttributes) {
1450
+ extraData[attribute] = this.data[attribute];
1451
+ }
1452
+ }
1117
1453
  const updatedObject = triggers.inflate(extraData, this.originalData);
1118
1454
  Object.keys(this.data).reduce(function (data, key) {
1119
- if (key.indexOf(".") > 0) {
1120
- // subdocument key with dot notation ('x.y':v => 'x':{'y':v})
1121
- const splittedKey = key.split(".");
1122
- const parentProp = splittedKey[0];
1123
- let parentVal = updatedObject.get(parentProp);
1124
- if (typeof parentVal !== 'object') {
1125
- parentVal = {};
1455
+ if (key.indexOf('.') > 0) {
1456
+ if (typeof data[key].__op === 'string') {
1457
+ if (!readOnlyAttributes.includes(key)) {
1458
+ updatedObject.set(key, data[key]);
1459
+ }
1460
+ } else {
1461
+ // subdocument key with dot notation { 'x.y': v } => { 'x': { 'y' : v } })
1462
+ const splittedKey = key.split('.');
1463
+ const parentProp = splittedKey[0];
1464
+ let parentVal = updatedObject.get(parentProp);
1465
+ if (typeof parentVal !== 'object') {
1466
+ parentVal = {};
1467
+ }
1468
+ parentVal[splittedKey[1]] = data[key];
1469
+ updatedObject.set(parentProp, parentVal);
1126
1470
  }
1127
- parentVal[splittedKey[1]] = data[key];
1128
- updatedObject.set(parentProp, parentVal);
1129
1471
  delete data[key];
1130
1472
  }
1131
1473
  return data;
1132
1474
  }, deepcopy(this.data));
1133
-
1134
- updatedObject.set(this.sanitizedData());
1135
- return updatedObject;
1475
+ const sanitized = this.sanitizedData();
1476
+ for (const attribute of readOnlyAttributes) {
1477
+ delete sanitized[attribute];
1478
+ }
1479
+ updatedObject.set(sanitized);
1480
+ return {
1481
+ updatedObject,
1482
+ originalObject
1483
+ };
1136
1484
  };
1137
-
1138
1485
  RestWrite.prototype.cleanUserAuthData = function () {
1139
1486
  if (this.response && this.response.response && this.className === '_User') {
1140
1487
  const user = this.response.response;
@@ -1150,16 +1497,40 @@ RestWrite.prototype.cleanUserAuthData = function () {
1150
1497
  }
1151
1498
  }
1152
1499
  };
1153
-
1154
1500
  RestWrite.prototype._updateResponseWithData = function (response, data) {
1155
- if (_lodash2.default.isEmpty(this.storage.fieldsChangedByTrigger)) {
1501
+ const stateController = Parse.CoreManager.getObjectStateController();
1502
+ const [pending] = stateController.getPendingOps(this.pendingOps.identifier);
1503
+ for (const key in this.pendingOps.operations) {
1504
+ if (!pending[key]) {
1505
+ data[key] = this.originalData ? this.originalData[key] : {
1506
+ __op: 'Delete'
1507
+ };
1508
+ this.storage.fieldsChangedByTrigger.push(key);
1509
+ }
1510
+ }
1511
+ const skipKeys = [...(_SchemaController.requiredColumns.read[this.className] || [])];
1512
+ if (!this.query) {
1513
+ skipKeys.push('objectId', 'createdAt');
1514
+ } else {
1515
+ skipKeys.push('updatedAt');
1516
+ delete response.objectId;
1517
+ }
1518
+ for (const key in response) {
1519
+ if (skipKeys.includes(key)) {
1520
+ continue;
1521
+ }
1522
+ const value = response[key];
1523
+ if (value == null || value.__type && value.__type === 'Pointer' || util.isDeepStrictEqual(data[key], value) || util.isDeepStrictEqual((this.originalData || {})[key], value)) {
1524
+ delete response[key];
1525
+ }
1526
+ }
1527
+ if (_lodash.default.isEmpty(this.storage.fieldsChangedByTrigger)) {
1156
1528
  return response;
1157
1529
  }
1158
1530
  const clientSupportsDelete = ClientSDK.supportsForwardDelete(this.clientSDK);
1159
1531
  this.storage.fieldsChangedByTrigger.forEach(fieldName => {
1160
1532
  const dataValue = data[fieldName];
1161
-
1162
- if (!response.hasOwnProperty(fieldName)) {
1533
+ if (!Object.prototype.hasOwnProperty.call(response, fieldName)) {
1163
1534
  response[fieldName] = dataValue;
1164
1535
  }
1165
1536
 
@@ -1173,8 +1544,6 @@ RestWrite.prototype._updateResponseWithData = function (response, data) {
1173
1544
  });
1174
1545
  return response;
1175
1546
  };
1176
-
1177
- exports.default = RestWrite;
1178
-
1547
+ var _default = exports.default = RestWrite;
1179
1548
  module.exports = RestWrite;
1180
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9SZXN0V3JpdGUuanMiXSwibmFtZXMiOlsiU2NoZW1hQ29udHJvbGxlciIsInJlcXVpcmUiLCJkZWVwY29weSIsIkF1dGgiLCJjcnlwdG9VdGlscyIsInBhc3N3b3JkQ3J5cHRvIiwiUGFyc2UiLCJ0cmlnZ2VycyIsIkNsaWVudFNESyIsIlJlc3RXcml0ZSIsImNvbmZpZyIsImF1dGgiLCJjbGFzc05hbWUiLCJxdWVyeSIsImRhdGEiLCJvcmlnaW5hbERhdGEiLCJjbGllbnRTREsiLCJpc1JlYWRPbmx5IiwiRXJyb3IiLCJPUEVSQVRJT05fRk9SQklEREVOIiwic3RvcmFnZSIsInJ1bk9wdGlvbnMiLCJvYmplY3RJZCIsIklOVkFMSURfS0VZX05BTUUiLCJyZXNwb25zZSIsInVwZGF0ZWRBdCIsIl9lbmNvZGUiLCJEYXRlIiwiaXNvIiwicHJvdG90eXBlIiwiZXhlY3V0ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsImdldFVzZXJBbmRSb2xlQUNMIiwidmFsaWRhdGVDbGllbnRDbGFzc0NyZWF0aW9uIiwiaGFuZGxlSW5zdGFsbGF0aW9uIiwiaGFuZGxlU2Vzc2lvbiIsInZhbGlkYXRlQXV0aERhdGEiLCJydW5CZWZvcmVUcmlnZ2VyIiwidmFsaWRhdGVTY2hlbWEiLCJzZXRSZXF1aXJlZEZpZWxkc0lmTmVlZGVkIiwidHJhbnNmb3JtVXNlciIsImV4cGFuZEZpbGVzRm9yRXhpc3RpbmdPYmplY3RzIiwiZGVzdHJveUR1cGxpY2F0ZWRTZXNzaW9ucyIsInJ1bkRhdGFiYXNlT3BlcmF0aW9uIiwiY3JlYXRlU2Vzc2lvblRva2VuSWZOZWVkZWQiLCJoYW5kbGVGb2xsb3d1cCIsInJ1bkFmdGVyVHJpZ2dlciIsImNsZWFuVXNlckF1dGhEYXRhIiwiaXNNYXN0ZXIiLCJhY2wiLCJ1c2VyIiwiZ2V0VXNlclJvbGVzIiwicm9sZXMiLCJjb25jYXQiLCJpZCIsImFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiIsInN5c3RlbUNsYXNzZXMiLCJpbmRleE9mIiwiZGF0YWJhc2UiLCJsb2FkU2NoZW1hIiwic2NoZW1hQ29udHJvbGxlciIsImhhc0NsYXNzIiwidmFsaWRhdGVPYmplY3QiLCJ0cmlnZ2VyRXhpc3RzIiwiVHlwZXMiLCJiZWZvcmVTYXZlIiwiYXBwbGljYXRpb25JZCIsImV4dHJhRGF0YSIsIm9yaWdpbmFsT2JqZWN0IiwidXBkYXRlZE9iamVjdCIsImJ1aWxkVXBkYXRlZE9iamVjdCIsImluZmxhdGUiLCJtYXliZVJ1blRyaWdnZXIiLCJvYmplY3QiLCJmaWVsZHNDaGFuZ2VkQnlUcmlnZ2VyIiwiXyIsInJlZHVjZSIsInJlc3VsdCIsInZhbHVlIiwia2V5IiwiaXNFcXVhbCIsInB1c2giLCJjcmVhdGVkQXQiLCJuZXdPYmplY3RJZCIsIm9iamVjdElkU2l6ZSIsImF1dGhEYXRhIiwidXNlcm5hbWUiLCJpc0VtcHR5IiwiVVNFUk5BTUVfTUlTU0lORyIsInBhc3N3b3JkIiwiUEFTU1dPUkRfTUlTU0lORyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJwcm92aWRlcnMiLCJjYW5IYW5kbGVBdXRoRGF0YSIsImNhbkhhbmRsZSIsInByb3ZpZGVyIiwicHJvdmlkZXJBdXRoRGF0YSIsImhhc1Rva2VuIiwiaGFuZGxlQXV0aERhdGEiLCJVTlNVUFBPUlRFRF9TRVJWSUNFIiwiaGFuZGxlQXV0aERhdGFWYWxpZGF0aW9uIiwidmFsaWRhdGlvbnMiLCJtYXAiLCJhdXRoRGF0YU1hbmFnZXIiLCJnZXRWYWxpZGF0b3JGb3JQcm92aWRlciIsImFsbCIsImZpbmRVc2Vyc1dpdGhBdXRoRGF0YSIsIm1lbW8iLCJxdWVyeUtleSIsImZpbHRlciIsInEiLCJmaW5kUHJvbWlzZSIsImZpbmQiLCJmaWx0ZXJlZE9iamVjdHNCeUFDTCIsIm9iamVjdHMiLCJBQ0wiLCJyZXN1bHRzIiwiciIsIkFDQ09VTlRfQUxSRUFEWV9MSU5LRUQiLCJqb2luIiwidXNlclJlc3VsdCIsIm11dGF0ZWRBdXRoRGF0YSIsImZvckVhY2giLCJwcm92aWRlckRhdGEiLCJ1c2VyQXV0aERhdGEiLCJoYXNNdXRhdGVkQXV0aERhdGEiLCJ1c2VySWQiLCJsb2NhdGlvbiIsInVwZGF0ZSIsInByb21pc2UiLCJlcnJvciIsIlJlc3RRdWVyeSIsIm1hc3RlciIsIl9fdHlwZSIsInNlc3Npb24iLCJjYWNoZUNvbnRyb2xsZXIiLCJkZWwiLCJzZXNzaW9uVG9rZW4iLCJ1bmRlZmluZWQiLCJfdmFsaWRhdGVQYXNzd29yZFBvbGljeSIsImhhc2giLCJoYXNoZWRQYXNzd29yZCIsIl9oYXNoZWRfcGFzc3dvcmQiLCJfdmFsaWRhdGVVc2VyTmFtZSIsIl92YWxpZGF0ZUVtYWlsIiwicmFuZG9tU3RyaW5nIiwicmVzcG9uc2VTaG91bGRIYXZlVXNlcm5hbWUiLCJsaW1pdCIsIlVTRVJOQU1FX1RBS0VOIiwiZW1haWwiLCJfX29wIiwibWF0Y2giLCJyZWplY3QiLCJJTlZBTElEX0VNQUlMX0FERFJFU1MiLCJFTUFJTF9UQUtFTiIsInVzZXJDb250cm9sbGVyIiwic2V0RW1haWxWZXJpZnlUb2tlbiIsInBhc3N3b3JkUG9saWN5IiwiX3ZhbGlkYXRlUGFzc3dvcmRSZXF1aXJlbWVudHMiLCJfdmFsaWRhdGVQYXNzd29yZEhpc3RvcnkiLCJwb2xpY3lFcnJvciIsInBhdHRlcm5WYWxpZGF0b3IiLCJ2YWxpZGF0b3JDYWxsYmFjayIsIlZBTElEQVRJT05fRVJST1IiLCJkb05vdEFsbG93VXNlcm5hbWUiLCJtYXhQYXNzd29yZEhpc3RvcnkiLCJvbGRQYXNzd29yZHMiLCJfcGFzc3dvcmRfaGlzdG9yeSIsInRha2UiLCJuZXdQYXNzd29yZCIsInByb21pc2VzIiwiY29tcGFyZSIsImNhdGNoIiwiZXJyIiwicHJldmVudExvZ2luV2l0aFVudmVyaWZpZWRFbWFpbCIsInZlcmlmeVVzZXJFbWFpbHMiLCJjcmVhdGVTZXNzaW9uVG9rZW4iLCJpbnN0YWxsYXRpb25JZCIsInNlc3Npb25EYXRhIiwiY3JlYXRlU2Vzc2lvbiIsImNyZWF0ZWRXaXRoIiwiZGVzdHJveSIsInJldm9rZVNlc3Npb25PblBhc3N3b3JkUmVzZXQiLCJzZXNzaW9uUXVlcnkiLCJiaW5kIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiSU5WQUxJRF9TRVNTSU9OX1RPS0VOIiwiYWRkaXRpb25hbFNlc3Npb25EYXRhIiwiYWN0aW9uIiwiSU5URVJOQUxfU0VSVkVSX0VSUk9SIiwic3RhdHVzIiwiZGV2aWNlVG9rZW4iLCJ0b0xvd2VyQ2FzZSIsImRldmljZVR5cGUiLCJpZE1hdGNoIiwib2JqZWN0SWRNYXRjaCIsImluc3RhbGxhdGlvbklkTWF0Y2giLCJkZXZpY2VUb2tlbk1hdGNoZXMiLCJvclF1ZXJpZXMiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwiZGVsUXVlcnkiLCJhcHBJZGVudGlmaWVyIiwiY29kZSIsIm9iaklkIiwiZmlsZXNDb250cm9sbGVyIiwiZXhwYW5kRmlsZXNJbk9iamVjdCIsInJvbGUiLCJjbGVhciIsImlzVW5hdXRoZW50aWNhdGVkIiwiU0VTU0lPTl9NSVNTSU5HIiwiZG93bmxvYWQiLCJkb3dubG9hZE5hbWUiLCJuYW1lIiwiSU5WQUxJRF9BQ0wiLCJyZWFkIiwid3JpdGUiLCJtYXhQYXNzd29yZEFnZSIsIl9wYXNzd29yZF9jaGFuZ2VkX2F0IiwiZGVmZXIiLCJzaGlmdCIsIl91cGRhdGVSZXNwb25zZVdpdGhEYXRhIiwiY3JlYXRlIiwiRFVQTElDQVRFX1ZBTFVFIiwidXNlckluZm8iLCJkdXBsaWNhdGVkX2ZpZWxkIiwiaGFzQWZ0ZXJTYXZlSG9vayIsImFmdGVyU2F2ZSIsImhhc0xpdmVRdWVyeSIsImxpdmVRdWVyeUNvbnRyb2xsZXIiLCJfaGFuZGxlU2F2ZVJlc3BvbnNlIiwib25BZnRlclNhdmUiLCJsb2dnZXIiLCJ3YXJuIiwibWlkZGxlIiwibW91bnQiLCJzYW5pdGl6ZWREYXRhIiwidGVzdCIsIl9kZWNvZGUiLCJzcGxpdHRlZEtleSIsInNwbGl0IiwicGFyZW50UHJvcCIsInBhcmVudFZhbCIsImdldCIsInNldCIsImNsaWVudFN1cHBvcnRzRGVsZXRlIiwic3VwcG9ydHNGb3J3YXJkRGVsZXRlIiwiZmllbGROYW1lIiwiZGF0YVZhbHVlIiwiaGFzT3duUHJvcGVydHkiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFhQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQWZBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJQSxtQkFBbUJDLFFBQVEsZ0NBQVIsQ0FBdkI7QUFDQSxJQUFJQyxXQUFXRCxRQUFRLFVBQVIsQ0FBZjs7QUFFQSxNQUFNRSxPQUFPRixRQUFRLFFBQVIsQ0FBYjtBQUNBLElBQUlHLGNBQWNILFFBQVEsZUFBUixDQUFsQjtBQUNBLElBQUlJLGlCQUFpQkosUUFBUSxZQUFSLENBQXJCO0FBQ0EsSUFBSUssUUFBUUwsUUFBUSxZQUFSLENBQVo7QUFDQSxJQUFJTSxXQUFXTixRQUFRLFlBQVIsQ0FBZjtBQUNBLElBQUlPLFlBQVlQLFFBQVEsYUFBUixDQUFoQjs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU1EsU0FBVCxDQUFtQkMsTUFBbkIsRUFBMkJDLElBQTNCLEVBQWlDQyxTQUFqQyxFQUE0Q0MsS0FBNUMsRUFBbURDLElBQW5ELEVBQXlEQyxZQUF6RCxFQUF1RUMsU0FBdkUsRUFBa0Y7QUFDaEYsTUFBSUwsS0FBS00sVUFBVCxFQUFxQjtBQUNuQixVQUFNLElBQUlYLE1BQU1ZLEtBQVYsQ0FBZ0JaLE1BQU1ZLEtBQU4sQ0FBWUMsbUJBQTVCLEVBQWlELCtEQUFqRCxDQUFOO0FBQ0Q7QUFDRCxPQUFLVCxNQUFMLEdBQWNBLE1BQWQ7QUFDQSxPQUFLQyxJQUFMLEdBQVlBLElBQVo7QUFDQSxPQUFLQyxTQUFMLEdBQWlCQSxTQUFqQjtBQUNBLE9BQUtJLFNBQUwsR0FBaUJBLFNBQWpCO0FBQ0EsT0FBS0ksT0FBTCxHQUFlLEVBQWY7QUFDQSxPQUFLQyxVQUFMLEdBQWtCLEVBQWxCO0FBQ0EsTUFBSSxDQUFDUixLQUFELElBQVVDLEtBQUtRLFFBQW5CLEVBQTZCO0FBQzNCLFVBQU0sSUFBSWhCLE1BQU1ZLEtBQVYsQ0FBZ0JaLE1BQU1ZLEtBQU4sQ0FBWUssZ0JBQTVCLEVBQThDLG9DQUE5QyxDQUFOO0FBQ0Q7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQUtDLFFBQUwsR0FBZ0IsSUFBaEI7O0FBRUE7QUFDQTtBQUNBLE9BQUtYLEtBQUwsR0FBYVgsU0FBU1csS0FBVCxDQUFiO0FBQ0EsT0FBS0MsSUFBTCxHQUFZWixTQUFTWSxJQUFULENBQVo7QUFDQTtBQUNBLE9BQUtDLFlBQUwsR0FBb0JBLFlBQXBCOztBQUVBO0FBQ0EsT0FBS1UsU0FBTCxHQUFpQm5CLE1BQU1vQixPQUFOLENBQWMsSUFBSUMsSUFBSixFQUFkLEVBQTBCQyxHQUEzQztBQUNEOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0FuQixVQUFVb0IsU0FBVixDQUFvQkMsT0FBcEIsR0FBOEIsWUFBVztBQUN2QyxTQUFPQyxRQUFRQyxPQUFSLEdBQWtCQyxJQUFsQixDQUF1QixNQUFNO0FBQ2xDLFdBQU8sS0FBS0MsaUJBQUwsRUFBUDtBQUNELEdBRk0sRUFFSkQsSUFGSSxDQUVDLE1BQU07QUFDWixXQUFPLEtBQUtFLDJCQUFMLEVBQVA7QUFDRCxHQUpNLEVBSUpGLElBSkksQ0FJQyxNQUFNO0FBQ1osV0FBTyxLQUFLRyxrQkFBTCxFQUFQO0FBQ0QsR0FOTSxFQU1KSCxJQU5JLENBTUMsTUFBTTtBQUNaLFdBQU8sS0FBS0ksYUFBTCxFQUFQO0FBQ0QsR0FSTSxFQVFKSixJQVJJLENBUUMsTUFBTTtBQUNaLFdBQU8sS0FBS0ssZ0JBQUwsRUFBUDtBQUNELEdBVk0sRUFVSkwsSUFWSSxDQVVDLE1BQU07QUFDWixXQUFPLEtBQUtNLGdCQUFMLEVBQVA7QUFDRCxHQVpNLEVBWUpOLElBWkksQ0FZQyxNQUFNO0FBQ1osV0FBTyxLQUFLTyxjQUFMLEVBQVA7QUFDRCxHQWRNLEVBY0pQLElBZEksQ0FjQyxNQUFNO0FBQ1osV0FBTyxLQUFLUSx5QkFBTCxFQUFQO0FBQ0QsR0FoQk0sRUFnQkpSLElBaEJJLENBZ0JDLE1BQU07QUFDWixXQUFPLEtBQUtTLGFBQUwsRUFBUDtBQUNELEdBbEJNLEVBa0JKVCxJQWxCSSxDQWtCQyxNQUFNO0FBQ1osV0FBTyxLQUFLVSw2QkFBTCxFQUFQO0FBQ0QsR0FwQk0sRUFvQkpWLElBcEJJLENBb0JDLE1BQU07QUFDWixXQUFPLEtBQUtXLHlCQUFMLEVBQVA7QUFDRCxHQXRCTSxFQXNCSlgsSUF0QkksQ0FzQkMsTUFBTTtBQUNaLFdBQU8sS0FBS1ksb0JBQUwsRUFBUDtBQUNELEdBeEJNLEVBd0JKWixJQXhCSSxDQXdCQyxNQUFNO0FBQ1osV0FBTyxLQUFLYSwwQkFBTCxFQUFQO0FBQ0QsR0ExQk0sRUEwQkpiLElBMUJJLENBMEJDLE1BQU07QUFDWixXQUFPLEtBQUtjLGNBQUwsRUFBUDtBQUNELEdBNUJNLEVBNEJKZCxJQTVCSSxDQTRCQyxNQUFNO0FBQ1osV0FBTyxLQUFLZSxlQUFMLEVBQVA7QUFDRCxHQTlCTSxFQThCSmYsSUE5QkksQ0E4QkMsTUFBTTtBQUNaLFdBQU8sS0FBS2dCLGlCQUFMLEVBQVA7QUFDRCxHQWhDTSxFQWdDSmhCLElBaENJLENBZ0NDLE1BQU07QUFDWixXQUFPLEtBQUtULFFBQVo7QUFDRCxHQWxDTSxDQUFQO0FBbUNELENBcENEOztBQXNDQTtBQUNBZixVQUFVb0IsU0FBVixDQUFvQkssaUJBQXBCLEdBQXdDLFlBQVc7QUFDakQsTUFBSSxLQUFLdkIsSUFBTCxDQUFVdUMsUUFBZCxFQUF3QjtBQUN0QixXQUFPbkIsUUFBUUMsT0FBUixFQUFQO0FBQ0Q7O0FBRUQsT0FBS1gsVUFBTCxDQUFnQjhCLEdBQWhCLEdBQXNCLENBQUMsR0FBRCxDQUF0Qjs7QUFFQSxNQUFJLEtBQUt4QyxJQUFMLENBQVV5QyxJQUFkLEVBQW9CO0FBQ2xCLFdBQU8sS0FBS3pDLElBQUwsQ0FBVTBDLFlBQVYsR0FBeUJwQixJQUF6QixDQUErQnFCLEtBQUQsSUFBVztBQUM5QyxXQUFLakMsVUFBTCxDQUFnQjhCLEdBQWhCLEdBQXNCLEtBQUs5QixVQUFMLENBQWdCOEIsR0FBaEIsQ0FBb0JJLE1BQXBCLENBQTJCRCxLQUEzQixFQUFrQyxDQUFDLEtBQUszQyxJQUFMLENBQVV5QyxJQUFWLENBQWVJLEVBQWhCLENBQWxDLENBQXRCO0FBQ0E7QUFDRCxLQUhNLENBQVA7QUFJRCxHQUxELE1BS087QUFDTCxXQUFPekIsUUFBUUMsT0FBUixFQUFQO0FBQ0Q7QUFDRixDQWZEOztBQWlCQTtBQUNBdkIsVUFBVW9CLFNBQVYsQ0FBb0JNLDJCQUFwQixHQUFrRCxZQUFXO0FBQzNELE1BQUksS0FBS3pCLE1BQUwsQ0FBWStDLHdCQUFaLEtBQXlDLEtBQXpDLElBQWtELENBQUMsS0FBSzlDLElBQUwsQ0FBVXVDLFFBQTdELElBQ0dsRCxpQkFBaUIwRCxhQUFqQixDQUErQkMsT0FBL0IsQ0FBdUMsS0FBSy9DLFNBQTVDLE1BQTJELENBQUMsQ0FEbkUsRUFDc0U7QUFDcEUsV0FBTyxLQUFLRixNQUFMLENBQVlrRCxRQUFaLENBQXFCQyxVQUFyQixHQUNKNUIsSUFESSxDQUNDNkIsb0JBQW9CQSxpQkFBaUJDLFFBQWpCLENBQTBCLEtBQUtuRCxTQUEvQixDQURyQixFQUVKcUIsSUFGSSxDQUVDOEIsWUFBWTtBQUNoQixVQUFJQSxhQUFhLElBQWpCLEVBQXVCO0FBQ3JCLGNBQU0sSUFBSXpELE1BQU1ZLEtBQVYsQ0FBZ0JaLE1BQU1ZLEtBQU4sQ0FBWUMsbUJBQTVCLEVBQ0osd0NBQ29CLHNCQURwQixHQUM2QyxLQUFLUCxTQUY5QyxDQUFOO0FBR0Q7QUFDRixLQVJJLENBQVA7QUFTRCxHQVhELE1BV087QUFDTCxXQUFPbUIsUUFBUUMsT0FBUixFQUFQO0FBQ0Q7QUFDRixDQWZEOztBQWlCQTtBQUNBdkIsVUFBVW9CLFNBQVYsQ0FBb0JXLGNBQXBCLEdBQXFDLFlBQVc7QUFDOUMsU0FBTyxLQUFLOUIsTUFBTCxDQUFZa0QsUUFBWixDQUFxQkksY0FBckIsQ0FBb0MsS0FBS3BELFNBQXpDLEVBQW9ELEtBQUtFLElBQXpELEVBQStELEtBQUtELEtBQXBFLEVBQTJFLEtBQUtRLFVBQWhGLENBQVA7QUFDRCxDQUZEOztBQUlBO0FBQ0E7QUFDQVosVUFBVW9CLFNBQVYsQ0FBb0JVLGdCQUFwQixHQUF1QyxZQUFXO0FBQ2hELE1BQUksS0FBS2YsUUFBVCxFQUFtQjtBQUNqQjtBQUNEOztBQUVEO0FBQ0EsTUFBSSxDQUFDakIsU0FBUzBELGFBQVQsQ0FBdUIsS0FBS3JELFNBQTVCLEVBQXVDTCxTQUFTMkQsS0FBVCxDQUFlQyxVQUF0RCxFQUFrRSxLQUFLekQsTUFBTCxDQUFZMEQsYUFBOUUsQ0FBTCxFQUFtRztBQUNqRyxXQUFPckMsUUFBUUMsT0FBUixFQUFQO0FBQ0Q7O0FBRUQ7QUFDQSxNQUFJcUMsWUFBWSxFQUFDekQsV0FBVyxLQUFLQSxTQUFqQixFQUFoQjtBQUNBLE1BQUksS0FBS0MsS0FBTCxJQUFjLEtBQUtBLEtBQUwsQ0FBV1MsUUFBN0IsRUFBdUM7QUFDckMrQyxjQUFVL0MsUUFBVixHQUFxQixLQUFLVCxLQUFMLENBQVdTLFFBQWhDO0FBQ0Q7O0FBRUQsTUFBSWdELGlCQUFpQixJQUFyQjtBQUNBLFFBQU1DLGdCQUFnQixLQUFLQyxrQkFBTCxDQUF3QkgsU0FBeEIsQ0FBdEI7QUFDQSxNQUFJLEtBQUt4RCxLQUFMLElBQWMsS0FBS0EsS0FBTCxDQUFXUyxRQUE3QixFQUF1QztBQUNyQztBQUNBZ0QscUJBQWlCL0QsU0FBU2tFLE9BQVQsQ0FBaUJKLFNBQWpCLEVBQTRCLEtBQUt0RCxZQUFqQyxDQUFqQjtBQUNEOztBQUVELFNBQU9nQixRQUFRQyxPQUFSLEdBQWtCQyxJQUFsQixDQUF1QixNQUFNO0FBQ2xDLFdBQU8xQixTQUFTbUUsZUFBVCxDQUF5Qm5FLFNBQVMyRCxLQUFULENBQWVDLFVBQXhDLEVBQW9ELEtBQUt4RCxJQUF6RCxFQUErRDRELGFBQS9ELEVBQThFRCxjQUE5RSxFQUE4RixLQUFLNUQsTUFBbkcsQ0FBUDtBQUNELEdBRk0sRUFFSnVCLElBRkksQ0FFRVQsUUFBRCxJQUFjO0FBQ3BCLFFBQUlBLFlBQVlBLFNBQVNtRCxNQUF6QixFQUFpQztBQUMvQixXQUFLdkQsT0FBTCxDQUFhd0Qsc0JBQWIsR0FBc0NDLGlCQUFFQyxNQUFGLENBQVN0RCxTQUFTbUQsTUFBbEIsRUFBMEIsQ0FBQ0ksTUFBRCxFQUFTQyxLQUFULEVBQWdCQyxHQUFoQixLQUF3QjtBQUN0RixZQUFJLENBQUNKLGlCQUFFSyxPQUFGLENBQVUsS0FBS3BFLElBQUwsQ0FBVW1FLEdBQVYsQ0FBVixFQUEwQkQsS0FBMUIsQ0FBTCxFQUF1QztBQUNyQ0QsaUJBQU9JLElBQVAsQ0FBWUYsR0FBWjtBQUNEO0FBQ0QsZUFBT0YsTUFBUDtBQUNELE9BTHFDLEVBS25DLEVBTG1DLENBQXRDO0FBTUEsV0FBS2pFLElBQUwsR0FBWVUsU0FBU21ELE1BQXJCO0FBQ0E7QUFDQSxVQUFJLEtBQUs5RCxLQUFMLElBQWMsS0FBS0EsS0FBTCxDQUFXUyxRQUE3QixFQUF1QztBQUNyQyxlQUFPLEtBQUtSLElBQUwsQ0FBVVEsUUFBakI7QUFDRDtBQUNGO0FBQ0YsR0FoQk0sQ0FBUDtBQWlCRCxDQXhDRDs7QUEwQ0FiLFVBQVVvQixTQUFWLENBQW9CWSx5QkFBcEIsR0FBZ0QsWUFBVztBQUN6RCxNQUFJLEtBQUszQixJQUFULEVBQWU7QUFDYjtBQUNBLFNBQUtBLElBQUwsQ0FBVVcsU0FBVixHQUFzQixLQUFLQSxTQUEzQjtBQUNBLFFBQUksQ0FBQyxLQUFLWixLQUFWLEVBQWlCO0FBQ2YsV0FBS0MsSUFBTCxDQUFVc0UsU0FBVixHQUFzQixLQUFLM0QsU0FBM0I7O0FBRUE7QUFDQSxVQUFJLENBQUMsS0FBS1gsSUFBTCxDQUFVUSxRQUFmLEVBQXlCO0FBQ3ZCLGFBQUtSLElBQUwsQ0FBVVEsUUFBVixHQUFxQmxCLFlBQVlpRixXQUFaLENBQXdCLEtBQUszRSxNQUFMLENBQVk0RSxZQUFwQyxDQUFyQjtBQUNEO0FBQ0Y7QUFDRjtBQUNELFNBQU92RCxRQUFRQyxPQUFSLEVBQVA7QUFDRCxDQWREOztBQWdCQTtBQUNBO0FBQ0E7QUFDQXZCLFVBQVVvQixTQUFWLENBQW9CUyxnQkFBcEIsR0FBdUMsWUFBVztBQUNoRCxNQUFJLEtBQUsxQixTQUFMLEtBQW1CLE9BQXZCLEVBQWdDO0FBQzlCO0FBQ0Q7O0FBRUQsTUFBSSxDQUFDLEtBQUtDLEtBQU4sSUFBZSxDQUFDLEtBQUtDLElBQUwsQ0FBVXlFLFFBQTlCLEVBQXdDO0FBQ3RDLFFBQUksT0FBTyxLQUFLekUsSUFBTCxDQUFVMEUsUUFBakIsS0FBOEIsUUFBOUIsSUFBMENYLGlCQUFFWSxPQUFGLENBQVUsS0FBSzNFLElBQUwsQ0FBVTBFLFFBQXBCLENBQTlDLEVBQTZFO0FBQzNFLFlBQU0sSUFBSWxGLE1BQU1ZLEtBQVYsQ0FBZ0JaLE1BQU1ZLEtBQU4sQ0FBWXdFLGdCQUE1QixFQUNKLHlCQURJLENBQU47QUFFRDtBQUNELFFBQUksT0FBTyxLQUFLNUUsSUFBTCxDQUFVNkUsUUFBakIsS0FBOEIsUUFBOUIsSUFBMENkLGlCQUFFWSxPQUFGLENBQVUsS0FBSzNFLElBQUwsQ0FBVTZFLFFBQXBCLENBQTlDLEVBQTZFO0FBQzNFLFlBQU0sSUFBSXJGLE1BQU1ZLEtBQVYsQ0FBZ0JaLE1BQU1ZLEtBQU4sQ0FBWTBFLGdCQUE1QixFQUNKLHNCQURJLENBQU47QUFFRDtBQUNGOztBQUVELE1BQUksQ0FBQyxLQUFLOUUsSUFBTCxDQUFVeUUsUUFBWCxJQUF1QixDQUFDTSxPQUFPQyxJQUFQLENBQVksS0FBS2hGLElBQUwsQ0FBVXlFLFFBQXRCLEVBQWdDUSxNQUE1RCxFQUFvRTtBQUNsRTtBQUNEOztBQUVELE1BQUlSLFdBQVcsS0FBS3pFLElBQUwsQ0FBVXlFLFFBQXpCO0FBQ0EsTUFBSVMsWUFBWUgsT0FBT0MsSUFBUCxDQUFZUCxRQUFaLENBQWhCO0FBQ0EsTUFBSVMsVUFBVUQsTUFBVixHQUFtQixDQUF2QixFQUEwQjtBQUN4QixVQUFNRSxvQkFBb0JELFVBQVVsQixNQUFWLENBQWlCLENBQUNvQixTQUFELEVBQVlDLFFBQVosS0FBeUI7QUFDbEUsVUFBSUMsbUJBQW1CYixTQUFTWSxRQUFULENBQXZCO0FBQ0EsVUFBSUUsV0FBWUQsb0JBQW9CQSxpQkFBaUI1QyxFQUFyRDtBQUNBLGFBQU8wQyxjQUFjRyxZQUFZRCxvQkFBb0IsSUFBOUMsQ0FBUDtBQUNELEtBSnlCLEVBSXZCLElBSnVCLENBQTFCO0FBS0EsUUFBSUgsaUJBQUosRUFBdUI7QUFDckIsYUFBTyxLQUFLSyxjQUFMLENBQW9CZixRQUFwQixDQUFQO0FBQ0Q7QUFDRjtBQUNELFFBQU0sSUFBSWpGLE1BQU1ZLEtBQVYsQ0FBZ0JaLE1BQU1ZLEtBQU4sQ0FBWXFGLG1CQUE1QixFQUNKLDRDQURJLENBQU47QUFFRCxDQWxDRDs7QUFvQ0E5RixVQUFVb0IsU0FBVixDQUFvQjJFLHdCQUFwQixHQUErQyxVQUFTakIsUUFBVCxFQUFtQjtBQUNoRSxRQUFNa0IsY0FBY1osT0FBT0MsSUFBUCxDQUFZUCxRQUFaLEVBQXNCbUIsR0FBdEIsQ0FBMkJQLFFBQUQsSUFBYztBQUMxRCxRQUFJWixTQUFTWSxRQUFULE1BQXVCLElBQTNCLEVBQWlDO0FBQy9CLGFBQU9wRSxRQUFRQyxPQUFSLEVBQVA7QUFDRDtBQUNELFVBQU1NLG1CQUFtQixLQUFLNUIsTUFBTCxDQUFZaUcsZUFBWixDQUE0QkMsdUJBQTVCLENBQW9EVCxRQUFwRCxDQUF6QjtBQUNBLFFBQUksQ0FBQzdELGdCQUFMLEVBQXVCO0FBQ3JCLFlBQU0sSUFBSWhDLE1BQU1ZLEtBQVYsQ0FBZ0JaLE1BQU1ZLEtBQU4sQ0FBWXFGLG1CQUE1QixFQUNKLDRDQURJLENBQU47QUFFRDtBQUNELFdBQU9qRSxpQkFBaUJpRCxTQUFTWSxRQUFULENBQWpCLENBQVA7QUFDRCxHQVZtQixDQUFwQjtBQVdBLFNBQU9wRSxRQUFROEUsR0FBUixDQUFZSixXQUFaLENBQVA7QUFDRCxDQWJEOztBQWVBaEcsVUFBVW9CLFNBQVYsQ0FBb0JpRixxQkFBcEIsR0FBNEMsVUFBU3ZCLFFBQVQsRUFBbUI7QUFDN0QsUUFBTVMsWUFBWUgsT0FBT0MsSUFBUCxDQUFZUCxRQUFaLENBQWxCO0FBQ0EsUUFBTTFFLFFBQVFtRixVQUFVbEIsTUFBVixDQUFpQixDQUFDaUMsSUFBRCxFQUFPWixRQUFQLEtBQW9CO0FBQ2pELFFBQUksQ0FBQ1osU0FBU1ksUUFBVCxDQUFMLEVBQXlCO0FBQ3ZCLGFBQU9ZLElBQVA7QUFDRDtBQUNELFVBQU1DLFdBQVksWUFBV2IsUUFBUyxLQUF0QztBQUNBLFVBQU10RixRQUFRLEVBQWQ7QUFDQUEsVUFBTW1HLFFBQU4sSUFBa0J6QixTQUFTWSxRQUFULEVBQW1CM0MsRUFBckM7QUFDQXVELFNBQUs1QixJQUFMLENBQVV0RSxLQUFWO0FBQ0EsV0FBT2tHLElBQVA7QUFDRCxHQVRhLEVBU1gsRUFUVyxFQVNQRSxNQVRPLENBU0NDLENBQUQsSUFBTztBQUNuQixXQUFPLE9BQU9BLENBQVAsS0FBYSxXQUFwQjtBQUNELEdBWGEsQ0FBZDs7QUFhQSxNQUFJQyxjQUFjcEYsUUFBUUMsT0FBUixDQUFnQixFQUFoQixDQUFsQjtBQUNBLE1BQUluQixNQUFNa0YsTUFBTixHQUFlLENBQW5CLEVBQXNCO0FBQ3BCb0Isa0JBQWMsS0FBS3pHLE1BQUwsQ0FBWWtELFFBQVosQ0FBcUJ3RCxJQUFyQixDQUNaLEtBQUt4RyxTQURPLEVBRVosRUFBQyxPQUFPQyxLQUFSLEVBRlksRUFFSSxFQUZKLENBQWQ7QUFHRDs7QUFFRCxTQUFPc0csV0FBUDtBQUNELENBdkJEOztBQXlCQTFHLFVBQVVvQixTQUFWLENBQW9Cd0Ysb0JBQXBCLEdBQTJDLFVBQVNDLE9BQVQsRUFBa0I7QUFDM0QsTUFBSSxLQUFLM0csSUFBTCxDQUFVdUMsUUFBZCxFQUF3QjtBQUN0QixXQUFPb0UsT0FBUDtBQUNEO0FBQ0QsU0FBT0EsUUFBUUwsTUFBUixDQUFnQnRDLE1BQUQsSUFBWTtBQUNoQyxRQUFJLENBQUNBLE9BQU80QyxHQUFaLEVBQWlCO0FBQ2YsYUFBTyxJQUFQLENBRGUsQ0FDRjtBQUNkO0FBQ0Q7QUFDQSxXQUFPNUMsT0FBTzRDLEdBQVAsSUFBYzFCLE9BQU9DLElBQVAsQ0FBWW5CLE9BQU80QyxHQUFuQixFQUF3QnhCLE1BQXhCLEdBQWlDLENBQXREO0FBQ0QsR0FOTSxDQUFQO0FBT0QsQ0FYRDs7QUFhQXRGLFVBQVVvQixTQUFWLENBQW9CeUUsY0FBcEIsR0FBcUMsVUFBU2YsUUFBVCxFQUFtQjtBQUN0RCxNQUFJaUMsT0FBSjtBQUNBLFNBQU8sS0FBS1YscUJBQUwsQ0FBMkJ2QixRQUEzQixFQUFxQ3RELElBQXJDLENBQTJDd0YsQ0FBRCxJQUFPO0FBQ3RERCxjQUFVLEtBQUtILG9CQUFMLENBQTBCSSxDQUExQixDQUFWO0FBQ0EsUUFBSUQsUUFBUXpCLE1BQVIsR0FBaUIsQ0FBckIsRUFBd0I7QUFDdEI7QUFDQSxZQUFNLElBQUl6RixNQUFNWSxLQUFWLENBQWdCWixNQUFNWSxLQUFOLENBQVl3RyxzQkFBNUIsRUFDSiwyQkFESSxDQUFOO0FBRUQ7O0FBRUQsU0FBS3RHLE9BQUwsQ0FBYSxjQUFiLElBQStCeUUsT0FBT0MsSUFBUCxDQUFZUCxRQUFaLEVBQXNCb0MsSUFBdEIsQ0FBMkIsR0FBM0IsQ0FBL0I7O0FBRUEsUUFBSUgsUUFBUXpCLE1BQVIsR0FBaUIsQ0FBckIsRUFBd0I7QUFDdEIsWUFBTTZCLGFBQWFKLFFBQVEsQ0FBUixDQUFuQjtBQUNBLFlBQU1LLGtCQUFrQixFQUF4QjtBQUNBaEMsYUFBT0MsSUFBUCxDQUFZUCxRQUFaLEVBQXNCdUMsT0FBdEIsQ0FBK0IzQixRQUFELElBQWM7QUFDMUMsY0FBTTRCLGVBQWV4QyxTQUFTWSxRQUFULENBQXJCO0FBQ0EsY0FBTTZCLGVBQWVKLFdBQVdyQyxRQUFYLENBQW9CWSxRQUFwQixDQUFyQjtBQUNBLFlBQUksQ0FBQ3RCLGlCQUFFSyxPQUFGLENBQVU2QyxZQUFWLEVBQXdCQyxZQUF4QixDQUFMLEVBQTRDO0FBQzFDSCwwQkFBZ0IxQixRQUFoQixJQUE0QjRCLFlBQTVCO0FBQ0Q7QUFDRixPQU5EO0FBT0EsWUFBTUUscUJBQXFCcEMsT0FBT0MsSUFBUCxDQUFZK0IsZUFBWixFQUE2QjlCLE1BQTdCLEtBQXdDLENBQW5FO0FBQ0EsVUFBSW1DLE1BQUo7QUFDQSxVQUFJLEtBQUtySCxLQUFMLElBQWMsS0FBS0EsS0FBTCxDQUFXUyxRQUE3QixFQUF1QztBQUNyQzRHLGlCQUFTLEtBQUtySCxLQUFMLENBQVdTLFFBQXBCO0FBQ0QsT0FGRCxNQUVPLElBQUksS0FBS1gsSUFBTCxJQUFhLEtBQUtBLElBQUwsQ0FBVXlDLElBQXZCLElBQStCLEtBQUt6QyxJQUFMLENBQVV5QyxJQUFWLENBQWVJLEVBQWxELEVBQXNEO0FBQzNEMEUsaUJBQVMsS0FBS3ZILElBQUwsQ0FBVXlDLElBQVYsQ0FBZUksRUFBeEI7QUFDRDtBQUNELFVBQUksQ0FBQzBFLE1BQUQsSUFBV0EsV0FBV04sV0FBV3RHLFFBQXJDLEVBQStDO0FBQUU7QUFDL0M7QUFDQTtBQUNBLGVBQU9rRyxRQUFRLENBQVIsRUFBVzdCLFFBQWxCOztBQUVBO0FBQ0EsYUFBSzdFLElBQUwsQ0FBVVEsUUFBVixHQUFxQnNHLFdBQVd0RyxRQUFoQzs7QUFFQSxZQUFJLENBQUMsS0FBS1QsS0FBTixJQUFlLENBQUMsS0FBS0EsS0FBTCxDQUFXUyxRQUEvQixFQUF5QztBQUFFO0FBQ3pDLGVBQUtFLFFBQUwsR0FBZ0I7QUFDZEEsc0JBQVVvRyxVQURJO0FBRWRPLHNCQUFVLEtBQUtBLFFBQUw7QUFGSSxXQUFoQjtBQUlEO0FBQ0Q7QUFDQSxZQUFJLENBQUNGLGtCQUFMLEVBQXlCO0FBQ3ZCO0FBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQU8sS0FBS3pCLHdCQUFMLENBQThCcUIsZUFBOUIsRUFBK0M1RixJQUEvQyxDQUFvRCxNQUFNO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBSSxLQUFLVCxRQUFULEVBQW1CO0FBQ2pCO0FBQ0FxRSxtQkFBT0MsSUFBUCxDQUFZK0IsZUFBWixFQUE2QkMsT0FBN0IsQ0FBc0MzQixRQUFELElBQWM7QUFDakQsbUJBQUszRSxRQUFMLENBQWNBLFFBQWQsQ0FBdUIrRCxRQUF2QixDQUFnQ1ksUUFBaEMsSUFBNEMwQixnQkFBZ0IxQixRQUFoQixDQUE1QztBQUNELGFBRkQ7QUFHQTtBQUNBO0FBQ0E7QUFDQSxtQkFBTyxLQUFLekYsTUFBTCxDQUFZa0QsUUFBWixDQUFxQndFLE1BQXJCLENBQTRCLEtBQUt4SCxTQUFqQyxFQUE0QyxFQUFDVSxVQUFVLEtBQUtSLElBQUwsQ0FBVVEsUUFBckIsRUFBNUMsRUFBNEUsRUFBQ2lFLFVBQVVzQyxlQUFYLEVBQTVFLEVBQXlHLEVBQXpHLENBQVA7QUFDRDtBQUNGLFNBZk0sQ0FBUDtBQWdCRCxPQXRDRCxNQXNDTyxJQUFJSyxNQUFKLEVBQVk7QUFDakI7QUFDQTtBQUNBLFlBQUlOLFdBQVd0RyxRQUFYLEtBQXdCNEcsTUFBNUIsRUFBb0M7QUFDbEMsZ0JBQU0sSUFBSTVILE1BQU1ZLEtBQVYsQ0FBZ0JaLE1BQU1ZLEtBQU4sQ0FBWXdHLHNCQUE1QixFQUNKLDJCQURJLENBQU47QUFFRDtBQUNEO0FBQ0EsWUFBSSxDQUFDTyxrQkFBTCxFQUF5QjtBQUN2QjtBQUNEO0FBQ0Y7QUFDRjtBQUNELFdBQU8sS0FBS3pCLHdCQUFMLENBQThCakIsUUFBOUIsQ0FBUDtBQUNELEdBL0VNLENBQVA7QUFnRkQsQ0FsRkQ7O0FBcUZBO0FBQ0E5RSxVQUFVb0IsU0FBVixDQUFvQmEsYUFBcEIsR0FBb0MsWUFBVztBQUM3QyxNQUFJMkYsVUFBVXRHLFFBQVFDLE9BQVIsRUFBZDs7QUFFQSxNQUFJLEtBQUtwQixTQUFMLEtBQW1CLE9BQXZCLEVBQWdDO0FBQzlCLFdBQU95SCxPQUFQO0FBQ0Q7O0FBRUQsTUFBSSxDQUFDLEtBQUsxSCxJQUFMLENBQVV1QyxRQUFYLElBQXVCLG1CQUFtQixLQUFLcEMsSUFBbkQsRUFBeUQ7QUFDdkQsVUFBTXdILFFBQVMsK0RBQWY7QUFDQSxVQUFNLElBQUloSSxNQUFNWSxLQUFWLENBQWdCWixNQUFNWSxLQUFOLENBQVlDLG1CQUE1QixFQUFpRG1ILEtBQWpELENBQU47QUFDRDs7QUFFRDtBQUNBLE1BQUksS0FBS3pILEtBQUwsSUFBYyxLQUFLUyxRQUFMLEVBQWxCLEVBQW1DO0FBQ2pDO0FBQ0E7QUFDQStHLGNBQVUsSUFBSUUsbUJBQUosQ0FBYyxLQUFLN0gsTUFBbkIsRUFBMkJQLEtBQUtxSSxNQUFMLENBQVksS0FBSzlILE1BQWpCLENBQTNCLEVBQXFELFVBQXJELEVBQWlFO0FBQ3pFMEMsWUFBTTtBQUNKcUYsZ0JBQVEsU0FESjtBQUVKN0gsbUJBQVcsT0FGUDtBQUdKVSxrQkFBVSxLQUFLQSxRQUFMO0FBSE47QUFEbUUsS0FBakUsRUFNUFEsT0FOTyxHQU9QRyxJQVBPLENBT0Z1RixXQUFXO0FBQ2ZBLGNBQVFBLE9BQVIsQ0FBZ0JNLE9BQWhCLENBQXdCWSxXQUFXLEtBQUtoSSxNQUFMLENBQVlpSSxlQUFaLENBQTRCdkYsSUFBNUIsQ0FBaUN3RixHQUFqQyxDQUFxQ0YsUUFBUUcsWUFBN0MsQ0FBbkM7QUFDRCxLQVRPLENBQVY7QUFVRDs7QUFFRCxTQUFPUixRQUFRcEcsSUFBUixDQUFhLE1BQU07QUFDeEI7QUFDQSxRQUFJLEtBQUtuQixJQUFMLENBQVU2RSxRQUFWLEtBQXVCbUQsU0FBM0IsRUFBc0M7QUFBRTtBQUN0QyxhQUFPL0csUUFBUUMsT0FBUixFQUFQO0FBQ0Q7O0FBRUQsUUFBSSxLQUFLbkIsS0FBVCxFQUFnQjtBQUNkLFdBQUtPLE9BQUwsQ0FBYSxlQUFiLElBQWdDLElBQWhDO0FBQ0E7QUFDQSxVQUFJLENBQUMsS0FBS1QsSUFBTCxDQUFVdUMsUUFBZixFQUF5QjtBQUN2QixhQUFLOUIsT0FBTCxDQUFhLG9CQUFiLElBQXFDLElBQXJDO0FBQ0Q7QUFDRjs7QUFFRCxXQUFPLEtBQUsySCx1QkFBTCxHQUErQjlHLElBQS9CLENBQW9DLE1BQU07QUFDL0MsYUFBTzVCLGVBQWUySSxJQUFmLENBQW9CLEtBQUtsSSxJQUFMLENBQVU2RSxRQUE5QixFQUF3QzFELElBQXhDLENBQThDZ0gsY0FBRCxJQUFvQjtBQUN0RSxhQUFLbkksSUFBTCxDQUFVb0ksZ0JBQVYsR0FBNkJELGNBQTdCO0FBQ0EsZUFBTyxLQUFLbkksSUFBTCxDQUFVNkUsUUFBakI7QUFDRCxPQUhNLENBQVA7QUFJRCxLQUxNLENBQVA7QUFPRCxHQXJCTSxFQXFCSjFELElBckJJLENBcUJDLE1BQU07QUFDWixXQUFPLEtBQUtrSCxpQkFBTCxFQUFQO0FBQ0QsR0F2Qk0sRUF1QkpsSCxJQXZCSSxDQXVCQyxNQUFNO0FBQ1osV0FBTyxLQUFLbUgsY0FBTCxFQUFQO0FBQ0QsR0F6Qk0sQ0FBUDtBQTBCRCxDQXRERDs7QUF3REEzSSxVQUFVb0IsU0FBVixDQUFvQnNILGlCQUFwQixHQUF3QyxZQUFZO0FBQ2xEO0FBQ0EsTUFBSSxDQUFDLEtBQUtySSxJQUFMLENBQVUwRSxRQUFmLEVBQXlCO0FBQ3ZCLFFBQUksQ0FBQyxLQUFLM0UsS0FBVixFQUFpQjtBQUNmLFdBQUtDLElBQUwsQ0FBVTBFLFFBQVYsR0FBcUJwRixZQUFZaUosWUFBWixDQUF5QixFQUF6QixDQUFyQjtBQUNBLFdBQUtDLDBCQUFMLEdBQWtDLElBQWxDO0FBQ0Q7QUFDRCxXQUFPdkgsUUFBUUMsT0FBUixFQUFQO0FBQ0Q7QUFDRDtBQUNBO0FBQ0EsU0FBTyxLQUFLdEIsTUFBTCxDQUFZa0QsUUFBWixDQUFxQndELElBQXJCLENBQ0wsS0FBS3hHLFNBREEsRUFFTCxFQUFDNEUsVUFBVSxLQUFLMUUsSUFBTCxDQUFVMEUsUUFBckIsRUFBK0JsRSxVQUFVLEVBQUMsT0FBTyxLQUFLQSxRQUFMLEVBQVIsRUFBekMsRUFGSyxFQUdMLEVBQUNpSSxPQUFPLENBQVIsRUFISyxFQUlMdEgsSUFKSyxDQUlBdUYsV0FBVztBQUNoQixRQUFJQSxRQUFRekIsTUFBUixHQUFpQixDQUFyQixFQUF3QjtBQUN0QixZQUFNLElBQUl6RixNQUFNWSxLQUFWLENBQWdCWixNQUFNWSxLQUFOLENBQVlzSSxjQUE1QixFQUE0QywyQ0FBNUMsQ0FBTjtBQUNEO0FBQ0Q7QUFDRCxHQVRNLENBQVA7QUFVRCxDQXJCRDs7QUF1QkEvSSxVQUFVb0IsU0FBVixDQUFvQnVILGNBQXBCLEdBQXFDLFlBQVc7QUFDOUMsTUFBSSxDQUFDLEtBQUt0SSxJQUFMLENBQVUySSxLQUFYLElBQW9CLEtBQUszSSxJQUFMLENBQVUySSxLQUFWLENBQWdCQyxJQUFoQixLQUF5QixRQUFqRCxFQUEyRDtBQUN6RCxXQUFPM0gsUUFBUUMsT0FBUixFQUFQO0FBQ0Q7QUFDRDtBQUNBLE1BQUksQ0FBQyxLQUFLbEIsSUFBTCxDQUFVMkksS0FBVixDQUFnQkUsS0FBaEIsQ0FBc0IsU0FBdEIsQ0FBTCxFQUF1QztBQUNyQyxXQUFPNUgsUUFBUTZILE1BQVIsQ0FBZSxJQUFJdEosTUFBTVksS0FBVixDQUFnQlosTUFBTVksS0FBTixDQUFZMkkscUJBQTVCLEVBQW1ELGtDQUFuRCxDQUFmLENBQVA7QUFDRDtBQUNEO0FBQ0EsU0FBTyxLQUFLbkosTUFBTCxDQUFZa0QsUUFBWixDQUFxQndELElBQXJCLENBQ0wsS0FBS3hHLFNBREEsRUFFTCxFQUFDNkksT0FBTyxLQUFLM0ksSUFBTCxDQUFVMkksS0FBbEIsRUFBeUJuSSxVQUFVLEVBQUMsT0FBTyxLQUFLQSxRQUFMLEVBQVIsRUFBbkMsRUFGSyxFQUdMLEVBQUNpSSxPQUFPLENBQVIsRUFISyxFQUlMdEgsSUFKSyxDQUlBdUYsV0FBVztBQUNoQixRQUFJQSxRQUFRekIsTUFBUixHQUFpQixDQUFyQixFQUF3QjtBQUN0QixZQUFNLElBQUl6RixNQUFNWSxLQUFWLENBQWdCWixNQUFNWSxLQUFOLENBQVk0SSxXQUE1QixFQUF5QyxnREFBekMsQ0FBTjtBQUNEO0FBQ0QsUUFDRSxDQUFDLEtBQUtoSixJQUFMLENBQVV5RSxRQUFYLElBQ0EsQ0FBQ00sT0FBT0MsSUFBUCxDQUFZLEtBQUtoRixJQUFMLENBQVV5RSxRQUF0QixFQUFnQ1EsTUFEakMsSUFFQUYsT0FBT0MsSUFBUCxDQUFZLEtBQUtoRixJQUFMLENBQVV5RSxRQUF0QixFQUFnQ1EsTUFBaEMsS0FBMkMsQ0FBM0MsSUFBZ0RGLE9BQU9DLElBQVAsQ0FBWSxLQUFLaEYsSUFBTCxDQUFVeUUsUUFBdEIsRUFBZ0MsQ0FBaEMsTUFBdUMsV0FIekYsRUFJRTtBQUNBO0FBQ0EsV0FBS25FLE9BQUwsQ0FBYSx1QkFBYixJQUF3QyxJQUF4QztBQUNBLFdBQUtWLE1BQUwsQ0FBWXFKLGNBQVosQ0FBMkJDLG1CQUEzQixDQUErQyxLQUFLbEosSUFBcEQ7QUFDRDtBQUNGLEdBakJNLENBQVA7QUFrQkQsQ0EzQkQ7O0FBNkJBTCxVQUFVb0IsU0FBVixDQUFvQmtILHVCQUFwQixHQUE4QyxZQUFXO0FBQ3ZELE1BQUksQ0FBQyxLQUFLckksTUFBTCxDQUFZdUosY0FBakIsRUFDRSxPQUFPbEksUUFBUUMsT0FBUixFQUFQO0FBQ0YsU0FBTyxLQUFLa0ksNkJBQUwsR0FBcUNqSSxJQUFyQyxDQUEwQyxNQUFNO0FBQ3JELFdBQU8sS0FBS2tJLHdCQUFMLEVBQVA7QUFDRCxHQUZNLENBQVA7QUFHRCxDQU5EOztBQVNBMUosVUFBVW9CLFNBQVYsQ0FBb0JxSSw2QkFBcEIsR0FBb0QsWUFBVztBQUM3RDtBQUNBLFFBQU1FLGNBQWMsMERBQXBCOztBQUVBO0FBQ0EsTUFBSSxLQUFLMUosTUFBTCxDQUFZdUosY0FBWixDQUEyQkksZ0JBQTNCLElBQStDLENBQUMsS0FBSzNKLE1BQUwsQ0FBWXVKLGNBQVosQ0FBMkJJLGdCQUEzQixDQUE0QyxLQUFLdkosSUFBTCxDQUFVNkUsUUFBdEQsQ0FBaEQsSUFDRixLQUFLakYsTUFBTCxDQUFZdUosY0FBWixDQUEyQkssaUJBQTNCLElBQWdELENBQUMsS0FBSzVKLE1BQUwsQ0FBWXVKLGNBQVosQ0FBMkJLLGlCQUEzQixDQUE2QyxLQUFLeEosSUFBTCxDQUFVNkUsUUFBdkQsQ0FEbkQsRUFDcUg7QUFDbkgsV0FBTzVELFFBQVE2SCxNQUFSLENBQWUsSUFBSXRKLE1BQU1ZLEtBQVYsQ0FBZ0JaLE1BQU1ZLEtBQU4sQ0FBWXFKLGdCQUE1QixFQUE4Q0gsV0FBOUMsQ0FBZixDQUFQO0FBQ0Q7O0FBRUQ7QUFDQSxNQUFJLEtBQUsxSixNQUFMLENBQVl1SixjQUFaLENBQTJCTyxrQkFBM0IsS0FBa0QsSUFBdEQsRUFBNEQ7QUFDMUQsUUFBSSxLQUFLMUosSUFBTCxDQUFVMEUsUUFBZCxFQUF3QjtBQUFFO0FBQ3hCLFVBQUksS0FBSzFFLElBQUwsQ0FBVTZFLFFBQVYsQ0FBbUJoQyxPQUFuQixDQUEyQixLQUFLN0MsSUFBTCxDQUFVMEUsUUFBckMsS0FBa0QsQ0FBdEQsRUFDRSxPQUFPekQsUUFBUTZILE1BQVIsQ0FBZSxJQUFJdEosTUFBTVksS0FBVixDQUFnQlosTUFBTVksS0FBTixDQUFZcUosZ0JBQTVCLEVBQThDSCxXQUE5QyxDQUFmLENBQVA7QUFDSCxLQUhELE1BR087QUFBRTtBQUNQLGFBQU8sS0FBSzFKLE1BQUwsQ0FBWWtELFFBQVosQ0FBcUJ3RCxJQUFyQixDQUEwQixPQUExQixFQUFtQyxFQUFDOUYsVUFBVSxLQUFLQSxRQUFMLEVBQVgsRUFBbkMsRUFDSlcsSUFESSxDQUNDdUYsV0FBVztBQUNmLFlBQUlBLFFBQVF6QixNQUFSLElBQWtCLENBQXRCLEVBQXlCO0FBQ3ZCLGdCQUFNK0MsU0FBTjtBQUNEO0FBQ0QsWUFBSSxLQUFLaEksSUFBTCxDQUFVNkUsUUFBVixDQUFtQmhDLE9BQW5CLENBQTJCNkQsUUFBUSxDQUFSLEVBQVdoQyxRQUF0QyxLQUFtRCxDQUF2RCxFQUNFLE9BQU96RCxRQUFRNkgsTUFBUixDQUFlLElBQUl0SixNQUFNWSxLQUFWLENBQWdCWixNQUFNWSxLQUFOLENBQVlxSixnQkFBNUIsRUFBOENILFdBQTlDLENBQWYsQ0FBUDtBQUNGLGVBQU9ySSxRQUFRQyxPQUFSLEVBQVA7QUFDRCxPQVJJLENBQVA7QUFTRDtBQUNGO0FBQ0QsU0FBT0QsUUFBUUMsT0FBUixFQUFQO0FBQ0QsQ0E1QkQ7O0FBOEJBdkIsVUFBVW9CLFNBQVYsQ0FBb0JzSSx3QkFBcEIsR0FBK0MsWUFBVztBQUN4RDtBQUNBLE1BQUksS0FBS3RKLEtBQUwsSUFBYyxLQUFLSCxNQUFMLENBQVl1SixjQUFaLENBQTJCUSxrQkFBN0MsRUFBaUU7QUFDL0QsV0FBTyxLQUFLL0osTUFBTCxDQUFZa0QsUUFBWixDQUFxQndELElBQXJCLENBQTBCLE9BQTFCLEVBQW1DLEVBQUM5RixVQUFVLEtBQUtBLFFBQUwsRUFBWCxFQUFuQyxFQUFnRSxFQUFDd0UsTUFBTSxDQUFDLG1CQUFELEVBQXNCLGtCQUF0QixDQUFQLEVBQWhFLEVBQ0o3RCxJQURJLENBQ0N1RixXQUFXO0FBQ2YsVUFBSUEsUUFBUXpCLE1BQVIsSUFBa0IsQ0FBdEIsRUFBeUI7QUFDdkIsY0FBTStDLFNBQU47QUFDRDtBQUNELFlBQU0xRixPQUFPb0UsUUFBUSxDQUFSLENBQWI7QUFDQSxVQUFJa0QsZUFBZSxFQUFuQjtBQUNBLFVBQUl0SCxLQUFLdUgsaUJBQVQsRUFDRUQsZUFBZTdGLGlCQUFFK0YsSUFBRixDQUFPeEgsS0FBS3VILGlCQUFaLEVBQStCLEtBQUtqSyxNQUFMLENBQVl1SixjQUFaLENBQTJCUSxrQkFBM0IsR0FBZ0QsQ0FBL0UsQ0FBZjtBQUNGQyxtQkFBYXZGLElBQWIsQ0FBa0IvQixLQUFLdUMsUUFBdkI7QUFDQSxZQUFNa0YsY0FBYyxLQUFLL0osSUFBTCxDQUFVNkUsUUFBOUI7QUFDQTtBQUNBLFlBQU1tRixXQUFXSixhQUFhaEUsR0FBYixDQUFpQixVQUFVc0MsSUFBVixFQUFnQjtBQUNoRCxlQUFPM0ksZUFBZTBLLE9BQWYsQ0FBdUJGLFdBQXZCLEVBQW9DN0IsSUFBcEMsRUFBMEMvRyxJQUExQyxDQUFnRDhDLE1BQUQsSUFBWTtBQUNoRSxjQUFJQSxNQUFKLEVBQVk7QUFDVixtQkFBT2hELFFBQVE2SCxNQUFSLENBQWUsaUJBQWYsQ0FBUDtBQUNGLGlCQUFPN0gsUUFBUUMsT0FBUixFQUFQO0FBQ0QsU0FKTSxDQUFQO0FBS0QsT0FOZ0IsQ0FBakI7QUFPQTtBQUNBLGFBQU9ELFFBQVE4RSxHQUFSLENBQVlpRSxRQUFaLEVBQXNCN0ksSUFBdEIsQ0FBMkIsTUFBTTtBQUN0QyxlQUFPRixRQUFRQyxPQUFSLEVBQVA7QUFDRCxPQUZNLEVBRUpnSixLQUZJLENBRUVDLE9BQU87QUFDZCxZQUFJQSxRQUFRLGlCQUFaLEVBQStCO0FBQzdCLGlCQUFPbEosUUFBUTZILE1BQVIsQ0FBZSxJQUFJdEosTUFBTVksS0FBVixDQUFnQlosTUFBTVksS0FBTixDQUFZcUosZ0JBQTVCLEVBQStDLCtDQUE4QyxLQUFLN0osTUFBTCxDQUFZdUosY0FBWixDQUEyQlEsa0JBQW1CLGFBQTNJLENBQWYsQ0FBUDtBQUNGLGNBQU1RLEdBQU47QUFDRCxPQU5NLENBQVA7QUFPRCxLQTNCSSxDQUFQO0FBNEJEO0FBQ0QsU0FBT2xKLFFBQVFDLE9BQVIsRUFBUDtBQUNELENBakNEOztBQW1DQXZCLFVBQVVvQixTQUFWLENBQW9CaUIsMEJBQXBCLEdBQWlELFlBQVc7QUFDMUQsTUFBSSxLQUFLbEMsU0FBTCxLQUFtQixPQUF2QixFQUFnQztBQUM5QjtBQUNEO0FBQ0QsTUFBSSxLQUFLQyxLQUFULEVBQWdCO0FBQ2Q7QUFDRDtBQUNELE1BQUksQ0FBQyxLQUFLTyxPQUFMLENBQWEsY0FBYixDQUFELENBQThCO0FBQTlCLEtBQ0csS0FBS1YsTUFBTCxDQUFZd0ssK0JBRGYsQ0FDK0M7QUFEL0MsS0FFRyxLQUFLeEssTUFBTCxDQUFZeUssZ0JBRm5CLEVBRXFDO0FBQUU7QUFDckMsV0FEbUMsQ0FDM0I7QUFDVDtBQUNELFNBQU8sS0FBS0Msa0JBQUwsRUFBUDtBQUNELENBYkQ7O0FBZUEzSyxVQUFVb0IsU0FBVixDQUFvQnVKLGtCQUFwQixHQUF5QyxZQUFXO0FBQ2xEO0FBQ0E7QUFDQSxNQUFJLEtBQUt6SyxJQUFMLENBQVUwSyxjQUFWLElBQTRCLEtBQUsxSyxJQUFMLENBQVUwSyxjQUFWLEtBQTZCLE9BQTdELEVBQXNFO0FBQ3BFO0FBQ0Q7O0FBRUQsUUFBTTtBQUNKQyxlQURJO0FBRUpDO0FBRkksTUFHRnBMLEtBQUtvTCxhQUFMLENBQW1CLEtBQUs3SyxNQUF4QixFQUFnQztBQUNsQ3dILFlBQVEsS0FBSzVHLFFBQUwsRUFEMEI7QUFFbENrSyxpQkFBYTtBQUNYLGdCQUFVLEtBQUtwSyxPQUFMLENBQWEsY0FBYixJQUErQixPQUEvQixHQUF5QyxRQUR4QztBQUVYLHNCQUFnQixLQUFLQSxPQUFMLENBQWEsY0FBYixLQUFnQztBQUZyQyxLQUZxQjtBQU1sQ2lLLG9CQUFnQixLQUFLMUssSUFBTCxDQUFVMEs7QUFOUSxHQUFoQyxDQUhKOztBQVlBLE1BQUksS0FBSzdKLFFBQUwsSUFBaUIsS0FBS0EsUUFBTCxDQUFjQSxRQUFuQyxFQUE2QztBQUMzQyxTQUFLQSxRQUFMLENBQWNBLFFBQWQsQ0FBdUJxSCxZQUF2QixHQUFzQ3lDLFlBQVl6QyxZQUFsRDtBQUNEOztBQUVELFNBQU8wQyxlQUFQO0FBQ0QsQ0F4QkQ7O0FBMEJBOUssVUFBVW9CLFNBQVYsQ0FBb0JlLHlCQUFwQixHQUFnRCxZQUFXO0FBQ3pEO0FBQ0EsTUFBSSxLQUFLaEMsU0FBTCxJQUFrQixVQUFsQixJQUFnQyxLQUFLQyxLQUF6QyxFQUFnRDtBQUM5QztBQUNEO0FBQ0Q7QUFDQSxRQUFNO0FBQ0p1QyxRQURJO0FBRUppSSxrQkFGSTtBQUdKeEM7QUFISSxNQUlGLEtBQUsvSCxJQUpUO0FBS0EsTUFBSSxDQUFDc0MsSUFBRCxJQUFTLENBQUNpSSxjQUFkLEVBQStCO0FBQzdCO0FBQ0Q7QUFDRCxNQUFJLENBQUNqSSxLQUFLOUIsUUFBVixFQUFvQjtBQUNsQjtBQUNEO0FBQ0QsT0FBS1osTUFBTCxDQUFZa0QsUUFBWixDQUFxQjZILE9BQXJCLENBQTZCLFVBQTdCLEVBQXlDO0FBQ3ZDckksUUFEdUM7QUFFdkNpSSxrQkFGdUM7QUFHdkN4QyxrQkFBYyxFQUFFLE9BQU9BLFlBQVQ7QUFIeUIsR0FBekM7QUFLRCxDQXRCRDs7QUF3QkE7QUFDQXBJLFVBQVVvQixTQUFWLENBQW9Ca0IsY0FBcEIsR0FBcUMsWUFBVztBQUM5QyxNQUFJLEtBQUszQixPQUFMLElBQWdCLEtBQUtBLE9BQUwsQ0FBYSxlQUFiLENBQWhCLElBQWlELEtBQUtWLE1BQUwsQ0FBWWdMLDRCQUFqRSxFQUErRjtBQUM3RixRQUFJQyxlQUFlO0FBQ2pCdkksWUFBTTtBQUNKcUYsZ0JBQVEsU0FESjtBQUVKN0gsbUJBQVcsT0FGUDtBQUdKVSxrQkFBVSxLQUFLQSxRQUFMO0FBSE47QUFEVyxLQUFuQjtBQU9BLFdBQU8sS0FBS0YsT0FBTCxDQUFhLGVBQWIsQ0FBUDtBQUNBLFdBQU8sS0FBS1YsTUFBTCxDQUFZa0QsUUFBWixDQUFxQjZILE9BQXJCLENBQTZCLFVBQTdCLEVBQXlDRSxZQUF6QyxFQUNKMUosSUFESSxDQUNDLEtBQUtjLGNBQUwsQ0FBb0I2SSxJQUFwQixDQUF5QixJQUF6QixDQURELENBQVA7QUFFRDs7QUFFRCxNQUFJLEtBQUt4SyxPQUFMLElBQWdCLEtBQUtBLE9BQUwsQ0FBYSxvQkFBYixDQUFwQixFQUF3RDtBQUN0RCxXQUFPLEtBQUtBLE9BQUwsQ0FBYSxvQkFBYixDQUFQO0FBQ0EsV0FBTyxLQUFLZ0ssa0JBQUwsR0FDSm5KLElBREksQ0FDQyxLQUFLYyxjQUFMLENBQW9CNkksSUFBcEIsQ0FBeUIsSUFBekIsQ0FERCxDQUFQO0FBRUQ7O0FBRUQsTUFBSSxLQUFLeEssT0FBTCxJQUFnQixLQUFLQSxPQUFMLENBQWEsdUJBQWIsQ0FBcEIsRUFBMkQ7QUFDekQsV0FBTyxLQUFLQSxPQUFMLENBQWEsdUJBQWIsQ0FBUDtBQUNBO0FBQ0EsU0FBS1YsTUFBTCxDQUFZcUosY0FBWixDQUEyQjhCLHFCQUEzQixDQUFpRCxLQUFLL0ssSUFBdEQ7QUFDQSxXQUFPLEtBQUtpQyxjQUFMLENBQW9CNkksSUFBcEIsQ0FBeUIsSUFBekIsQ0FBUDtBQUNEO0FBQ0YsQ0ExQkQ7O0FBNEJBO0FBQ0E7QUFDQW5MLFVBQVVvQixTQUFWLENBQW9CUSxhQUFwQixHQUFvQyxZQUFXO0FBQzdDLE1BQUksS0FBS2IsUUFBTCxJQUFpQixLQUFLWixTQUFMLEtBQW1CLFVBQXhDLEVBQW9EO0FBQ2xEO0FBQ0Q7O0FBRUQsTUFBSSxDQUFDLEtBQUtELElBQUwsQ0FBVXlDLElBQVgsSUFBbUIsQ0FBQyxLQUFLekMsSUFBTCxDQUFVdUMsUUFBbEMsRUFBNEM7QUFDMUMsVUFBTSxJQUFJNUMsTUFBTVksS0FBVixDQUFnQlosTUFBTVksS0FBTixDQUFZNEsscUJBQTVCLEVBQ0oseUJBREksQ0FBTjtBQUVEOztBQUVEO0FBQ0EsTUFBSSxLQUFLaEwsSUFBTCxDQUFVeUcsR0FBZCxFQUFtQjtBQUNqQixVQUFNLElBQUlqSCxNQUFNWSxLQUFWLENBQWdCWixNQUFNWSxLQUFOLENBQVlLLGdCQUE1QixFQUE4QyxnQkFDOUIsbUJBRGhCLENBQU47QUFFRDs7QUFFRCxNQUFJLEtBQUtWLEtBQVQsRUFBZ0I7QUFDZCxRQUFJLEtBQUtDLElBQUwsQ0FBVXNDLElBQVYsSUFBa0IsQ0FBQyxLQUFLekMsSUFBTCxDQUFVdUMsUUFBN0IsSUFBeUMsS0FBS3BDLElBQUwsQ0FBVXNDLElBQVYsQ0FBZTlCLFFBQWYsSUFBMkIsS0FBS1gsSUFBTCxDQUFVeUMsSUFBVixDQUFlSSxFQUF2RixFQUEyRjtBQUN6RixZQUFNLElBQUlsRCxNQUFNWSxLQUFWLENBQWdCWixNQUFNWSxLQUFOLENBQVlLLGdCQUE1QixDQUFOO0FBQ0QsS0FGRCxNQUVPLElBQUksS0FBS1QsSUFBTCxDQUFVdUssY0FBZCxFQUE4QjtBQUNuQyxZQUFNLElBQUkvSyxNQUFNWSxLQUFWLENBQWdCWixNQUFNWSxLQUFOLENBQVlLLGdCQUE1QixDQUFOO0FBQ0QsS0FGTSxNQUVBLElBQUksS0FBS1QsSUFBTCxDQUFVK0gsWUFBZCxFQUE0QjtBQUNqQyxZQUFNLElBQUl2SSxNQUFNWSxLQUFWLENBQWdCWixNQUFNWSxLQUFOLENBQVlLLGdCQUE1QixDQUFOO0FBQ0Q7QUFDRjs7QUFFRCxNQUFJLENBQUMsS0FBS1YsS0FBTixJQUFlLENBQUMsS0FBS0YsSUFBTCxDQUFVdUMsUUFBOUIsRUFBd0M7QUFDdEMsVUFBTTZJLHdCQUF3QixFQUE5QjtBQUNBLFNBQUssSUFBSTlHLEdBQVQsSUFBZ0IsS0FBS25FLElBQXJCLEVBQTJCO0FBQ3pCLFVBQUltRSxRQUFRLFVBQVIsSUFBc0JBLFFBQVEsTUFBbEMsRUFBMEM7QUFDeEM7QUFDRDtBQUNEOEcsNEJBQXNCOUcsR0FBdEIsSUFBNkIsS0FBS25FLElBQUwsQ0FBVW1FLEdBQVYsQ0FBN0I7QUFDRDs7QUFFRCxVQUFNLEVBQUVxRyxXQUFGLEVBQWVDLGFBQWYsS0FBaUNwTCxLQUFLb0wsYUFBTCxDQUFtQixLQUFLN0ssTUFBeEIsRUFBZ0M7QUFDckV3SCxjQUFRLEtBQUt2SCxJQUFMLENBQVV5QyxJQUFWLENBQWVJLEVBRDhDO0FBRXJFZ0ksbUJBQWE7QUFDWFEsZ0JBQVE7QUFERyxPQUZ3RDtBQUtyRUQ7QUFMcUUsS0FBaEMsQ0FBdkM7O0FBUUEsV0FBT1IsZ0JBQWdCdEosSUFBaEIsQ0FBc0J1RixPQUFELElBQWE7QUFDdkMsVUFBSSxDQUFDQSxRQUFRaEcsUUFBYixFQUF1QjtBQUNyQixjQUFNLElBQUlsQixNQUFNWSxLQUFWLENBQWdCWixNQUFNWSxLQUFOLENBQVkrSyxxQkFBNUIsRUFDSix5QkFESSxDQUFOO0FBRUQ7QUFDRFgsa0JBQVksVUFBWixJQUEwQjlELFFBQVFoRyxRQUFSLENBQWlCLFVBQWpCLENBQTFCO0FBQ0EsV0FBS0EsUUFBTCxHQUFnQjtBQUNkMEssZ0JBQVEsR0FETTtBQUVkL0Qsa0JBQVVYLFFBQVFXLFFBRko7QUFHZDNHLGtCQUFVOEo7QUFISSxPQUFoQjtBQUtELEtBWE0sQ0FBUDtBQVlEO0FBQ0YsQ0F4REQ7O0FBMERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTdLLFVBQVVvQixTQUFWLENBQW9CTyxrQkFBcEIsR0FBeUMsWUFBVztBQUNsRCxNQUFJLEtBQUtaLFFBQUwsSUFBaUIsS0FBS1osU0FBTCxLQUFtQixlQUF4QyxFQUF5RDtBQUN2RDtBQUNEOztBQUVELE1BQUksQ0FBQyxLQUFLQyxLQUFOLElBQWUsQ0FBQyxLQUFLQyxJQUFMLENBQVVxTCxXQUExQixJQUF5QyxDQUFDLEtBQUtyTCxJQUFMLENBQVV1SyxjQUFwRCxJQUFzRSxDQUFDLEtBQUsxSyxJQUFMLENBQVUwSyxjQUFyRixFQUFxRztBQUNuRyxVQUFNLElBQUkvSyxNQUFNWSxLQUFWLENBQWdCLEdBQWhCLEVBQ0oseURBQ29CLHFDQUZoQixDQUFOO0FBR0Q7O0FBRUQ7QUFDQTtBQUNBLE1BQUksS0FBS0osSUFBTCxDQUFVcUwsV0FBVixJQUF5QixLQUFLckwsSUFBTCxDQUFVcUwsV0FBVixDQUFzQnBHLE1BQXRCLElBQWdDLEVBQTdELEVBQWlFO0FBQy9ELFNBQUtqRixJQUFMLENBQVVxTCxXQUFWLEdBQXdCLEtBQUtyTCxJQUFMLENBQVVxTCxXQUFWLENBQXNCQyxXQUF0QixFQUF4QjtBQUNEOztBQUVEO0FBQ0EsTUFBSSxLQUFLdEwsSUFBTCxDQUFVdUssY0FBZCxFQUE4QjtBQUM1QixTQUFLdkssSUFBTCxDQUFVdUssY0FBVixHQUEyQixLQUFLdkssSUFBTCxDQUFVdUssY0FBVixDQUF5QmUsV0FBekIsRUFBM0I7QUFDRDs7QUFFRCxNQUFJZixpQkFBaUIsS0FBS3ZLLElBQUwsQ0FBVXVLLGNBQS9COztBQUVBO0FBQ0EsTUFBSSxDQUFDQSxjQUFELElBQW1CLENBQUMsS0FBSzFLLElBQUwsQ0FBVXVDLFFBQWxDLEVBQTRDO0FBQzFDbUkscUJBQWlCLEtBQUsxSyxJQUFMLENBQVUwSyxjQUEzQjtBQUNEOztBQUVELE1BQUlBLGNBQUosRUFBb0I7QUFDbEJBLHFCQUFpQkEsZUFBZWUsV0FBZixFQUFqQjtBQUNEOztBQUVEO0FBQ0EsTUFBSSxLQUFLdkwsS0FBTCxJQUFjLENBQUMsS0FBS0MsSUFBTCxDQUFVcUwsV0FBekIsSUFDZSxDQUFDZCxjQURoQixJQUNrQyxDQUFDLEtBQUt2SyxJQUFMLENBQVV1TCxVQURqRCxFQUM2RDtBQUMzRDtBQUNEOztBQUVELE1BQUloRSxVQUFVdEcsUUFBUUMsT0FBUixFQUFkOztBQUVBLE1BQUlzSyxPQUFKLENBekNrRCxDQXlDckM7QUFDYixNQUFJQyxhQUFKO0FBQ0EsTUFBSUMsbUJBQUo7QUFDQSxNQUFJQyxxQkFBcUIsRUFBekI7O0FBRUE7QUFDQSxRQUFNQyxZQUFZLEVBQWxCO0FBQ0EsTUFBSSxLQUFLN0wsS0FBTCxJQUFjLEtBQUtBLEtBQUwsQ0FBV1MsUUFBN0IsRUFBdUM7QUFDckNvTCxjQUFVdkgsSUFBVixDQUFlO0FBQ2I3RCxnQkFBVSxLQUFLVCxLQUFMLENBQVdTO0FBRFIsS0FBZjtBQUdEO0FBQ0QsTUFBSStKLGNBQUosRUFBb0I7QUFDbEJxQixjQUFVdkgsSUFBVixDQUFlO0FBQ2Isd0JBQWtCa0c7QUFETCxLQUFmO0FBR0Q7QUFDRCxNQUFJLEtBQUt2SyxJQUFMLENBQVVxTCxXQUFkLEVBQTJCO0FBQ3pCTyxjQUFVdkgsSUFBVixDQUFlLEVBQUMsZUFBZSxLQUFLckUsSUFBTCxDQUFVcUwsV0FBMUIsRUFBZjtBQUNEOztBQUVELE1BQUlPLFVBQVUzRyxNQUFWLElBQW9CLENBQXhCLEVBQTJCO0FBQ3pCO0FBQ0Q7O0FBRURzQyxZQUFVQSxRQUFRcEcsSUFBUixDQUFhLE1BQU07QUFDM0IsV0FBTyxLQUFLdkIsTUFBTCxDQUFZa0QsUUFBWixDQUFxQndELElBQXJCLENBQTBCLGVBQTFCLEVBQTJDO0FBQ2hELGFBQU9zRjtBQUR5QyxLQUEzQyxFQUVKLEVBRkksQ0FBUDtBQUdELEdBSlMsRUFJUHpLLElBSk8sQ0FJRHVGLE9BQUQsSUFBYTtBQUNuQkEsWUFBUU0sT0FBUixDQUFpQi9DLE1BQUQsSUFBWTtBQUMxQixVQUFJLEtBQUtsRSxLQUFMLElBQWMsS0FBS0EsS0FBTCxDQUFXUyxRQUF6QixJQUFxQ3lELE9BQU96RCxRQUFQLElBQW1CLEtBQUtULEtBQUwsQ0FBV1MsUUFBdkUsRUFBaUY7QUFDL0VpTCx3QkFBZ0J4SCxNQUFoQjtBQUNEO0FBQ0QsVUFBSUEsT0FBT3NHLGNBQVAsSUFBeUJBLGNBQTdCLEVBQTZDO0FBQzNDbUIsOEJBQXNCekgsTUFBdEI7QUFDRDtBQUNELFVBQUlBLE9BQU9vSCxXQUFQLElBQXNCLEtBQUtyTCxJQUFMLENBQVVxTCxXQUFwQyxFQUFpRDtBQUMvQ00sMkJBQW1CdEgsSUFBbkIsQ0FBd0JKLE1BQXhCO0FBQ0Q7QUFDRixLQVZEOztBQVlBO0FBQ0EsUUFBSSxLQUFLbEUsS0FBTCxJQUFjLEtBQUtBLEtBQUwsQ0FBV1MsUUFBN0IsRUFBdUM7QUFDckMsVUFBSSxDQUFDaUwsYUFBTCxFQUFvQjtBQUNsQixjQUFNLElBQUlqTSxNQUFNWSxLQUFWLENBQWdCWixNQUFNWSxLQUFOLENBQVl5TCxnQkFBNUIsRUFDSiw4QkFESSxDQUFOO0FBRUQ7QUFDRCxVQUFJLEtBQUs3TCxJQUFMLENBQVV1SyxjQUFWLElBQTRCa0IsY0FBY2xCLGNBQTFDLElBQ0EsS0FBS3ZLLElBQUwsQ0FBVXVLLGNBQVYsS0FBNkJrQixjQUFjbEIsY0FEL0MsRUFDK0Q7QUFDN0QsY0FBTSxJQUFJL0ssTUFBTVksS0FBVixDQUFnQixHQUFoQixFQUNKLCtDQUNzQixXQUZsQixDQUFOO0FBR0Q7QUFDRCxVQUFJLEtBQUtKLElBQUwsQ0FBVXFMLFdBQVYsSUFBeUJJLGNBQWNKLFdBQXZDLElBQ0EsS0FBS3JMLElBQUwsQ0FBVXFMLFdBQVYsS0FBMEJJLGNBQWNKLFdBRHhDLElBRUEsQ0FBQyxLQUFLckwsSUFBTCxDQUFVdUssY0FGWCxJQUU2QixDQUFDa0IsY0FBY2xCLGNBRmhELEVBRWdFO0FBQzlELGNBQU0sSUFBSS9LLE1BQU1ZLEtBQVYsQ0FBZ0IsR0FBaEIsRUFDSiw0Q0FDc0IsV0FGbEIsQ0FBTjtBQUdEO0FBQ0QsVUFBSSxLQUFLSixJQUFMLENBQVV1TCxVQUFWLElBQXdCLEtBQUt2TCxJQUFMLENBQVV1TCxVQUFsQyxJQUNBLEtBQUt2TCxJQUFMLENBQVV1TCxVQUFWLEtBQXlCRSxjQUFjRixVQUQzQyxFQUN1RDtBQUNyRCxjQUFNLElBQUkvTCxNQUFNWSxLQUFWLENBQWdCLEdBQWhCLEVBQ0osMkNBQ3NCLFdBRmxCLENBQU47QUFHRDtBQUNGOztBQUVELFFBQUksS0FBS0wsS0FBTCxJQUFjLEtBQUtBLEtBQUwsQ0FBV1MsUUFBekIsSUFBcUNpTCxhQUF6QyxFQUF3RDtBQUN0REQsZ0JBQVVDLGFBQVY7QUFDRDs7QUFFRCxRQUFJbEIsa0JBQWtCbUIsbUJBQXRCLEVBQTJDO0FBQ3pDRixnQkFBVUUsbUJBQVY7QUFDRDtBQUNEO0FBQ0EsUUFBSSxDQUFDLEtBQUszTCxLQUFOLElBQWUsQ0FBQyxLQUFLQyxJQUFMLENBQVV1TCxVQUExQixJQUF3QyxDQUFDQyxPQUE3QyxFQUFzRDtBQUNwRCxZQUFNLElBQUloTSxNQUFNWSxLQUFWLENBQWdCLEdBQWhCLEVBQ0osZ0RBREksQ0FBTjtBQUVEO0FBRUYsR0F6RFMsRUF5RFBlLElBekRPLENBeURGLE1BQU07QUFDWixRQUFJLENBQUNxSyxPQUFMLEVBQWM7QUFDWixVQUFJLENBQUNHLG1CQUFtQjFHLE1BQXhCLEVBQWdDO0FBQzlCO0FBQ0QsT0FGRCxNQUVPLElBQUkwRyxtQkFBbUIxRyxNQUFuQixJQUE2QixDQUE3QixLQUNSLENBQUMwRyxtQkFBbUIsQ0FBbkIsRUFBc0IsZ0JBQXRCLENBQUQsSUFBNEMsQ0FBQ3BCLGNBRHJDLENBQUosRUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQU9vQixtQkFBbUIsQ0FBbkIsRUFBc0IsVUFBdEIsQ0FBUDtBQUNELE9BUE0sTUFPQSxJQUFJLENBQUMsS0FBSzNMLElBQUwsQ0FBVXVLLGNBQWYsRUFBK0I7QUFDcEMsY0FBTSxJQUFJL0ssTUFBTVksS0FBVixDQUFnQixHQUFoQixFQUNKLGtEQUNvQix1Q0FGaEIsQ0FBTjtBQUdELE9BSk0sTUFJQTtBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFJMEwsV0FBVztBQUNiLHlCQUFlLEtBQUs5TCxJQUFMLENBQVVxTCxXQURaO0FBRWIsNEJBQWtCO0FBQ2hCLG1CQUFPZDtBQURTO0FBRkwsU0FBZjtBQU1BLFlBQUksS0FBS3ZLLElBQUwsQ0FBVStMLGFBQWQsRUFBNkI7QUFDM0JELG1CQUFTLGVBQVQsSUFBNEIsS0FBSzlMLElBQUwsQ0FBVStMLGFBQXRDO0FBQ0Q7QUFDRCxhQUFLbk0sTUFBTCxDQUFZa0QsUUFBWixDQUFxQjZILE9BQXJCLENBQTZCLGVBQTdCLEVBQThDbUIsUUFBOUMsRUFDRzVCLEtBREgsQ0FDU0MsT0FBTztBQUNaLGNBQUlBLElBQUk2QixJQUFKLElBQVl4TSxNQUFNWSxLQUFOLENBQVl5TCxnQkFBNUIsRUFBOEM7QUFDNUM7QUFDQTtBQUNEO0FBQ0Q7QUFDQSxnQkFBTTFCLEdBQU47QUFDRCxTQVJIO0FBU0E7QUFDRDtBQUNGLEtBeENELE1Bd0NPO0FBQ0wsVUFBSXdCLG1CQUFtQjFHLE1BQW5CLElBQTZCLENBQTdCLElBQ0YsQ0FBQzBHLG1CQUFtQixDQUFuQixFQUFzQixnQkFBdEIsQ0FESCxFQUM0QztBQUMxQztBQUNBO0FBQ0E7QUFDQSxjQUFNRyxXQUFXLEVBQUN0TCxVQUFVZ0wsUUFBUWhMLFFBQW5CLEVBQWpCO0FBQ0EsZUFBTyxLQUFLWixNQUFMLENBQVlrRCxRQUFaLENBQXFCNkgsT0FBckIsQ0FBNkIsZUFBN0IsRUFBOENtQixRQUE5QyxFQUNKM0ssSUFESSxDQUNDLE1BQU07QUFDVixpQkFBT3dLLG1CQUFtQixDQUFuQixFQUFzQixVQUF0QixDQUFQO0FBQ0QsU0FISSxFQUlKekIsS0FKSSxDQUlFQyxPQUFPO0FBQ1osY0FBSUEsSUFBSTZCLElBQUosSUFBWXhNLE1BQU1ZLEtBQU4sQ0FBWXlMLGdCQUE1QixFQUE4QztBQUM1QztBQUNBO0FBQ0Q7QUFDRDtBQUNBLGdCQUFNMUIsR0FBTjtBQUNELFNBWEksQ0FBUDtBQVlELE9BbEJELE1Ba0JPO0FBQ0wsWUFBSSxLQUFLbkssSUFBTCxDQUFVcUwsV0FBVixJQUNGRyxRQUFRSCxXQUFSLElBQXVCLEtBQUtyTCxJQUFMLENBQVVxTCxXQURuQyxFQUNnRDtBQUM5QztBQUNBO0FBQ0E7QUFDQSxnQkFBTVMsV0FBVztBQUNmLDJCQUFlLEtBQUs5TCxJQUFMLENBQVVxTDtBQURWLFdBQWpCO0FBR0E7QUFDQTtBQUNBLGNBQUksS0FBS3JMLElBQUwsQ0FBVXVLLGNBQWQsRUFBOEI7QUFDNUJ1QixxQkFBUyxnQkFBVCxJQUE2QjtBQUMzQixxQkFBTyxLQUFLOUwsSUFBTCxDQUFVdUs7QUFEVSxhQUE3QjtBQUdELFdBSkQsTUFJTyxJQUFJaUIsUUFBUWhMLFFBQVIsSUFBb0IsS0FBS1IsSUFBTCxDQUFVUSxRQUE5QixJQUNFZ0wsUUFBUWhMLFFBQVIsSUFBb0IsS0FBS1IsSUFBTCxDQUFVUSxRQURwQyxFQUM4QztBQUNuRDtBQUNBc0wscUJBQVMsVUFBVCxJQUF1QjtBQUNyQixxQkFBT04sUUFBUWhMO0FBRE0sYUFBdkI7QUFHRCxXQU5NLE1BTUE7QUFDTDtBQUNBLG1CQUFPZ0wsUUFBUWhMLFFBQWY7QUFDRDtBQUNELGNBQUksS0FBS1IsSUFBTCxDQUFVK0wsYUFBZCxFQUE2QjtBQUMzQkQscUJBQVMsZUFBVCxJQUE0QixLQUFLOUwsSUFBTCxDQUFVK0wsYUFBdEM7QUFDRDtBQUNELGVBQUtuTSxNQUFMLENBQVlrRCxRQUFaLENBQXFCNkgsT0FBckIsQ0FBNkIsZUFBN0IsRUFBOENtQixRQUE5QyxFQUNHNUIsS0FESCxDQUNTQyxPQUFPO0FBQ1osZ0JBQUlBLElBQUk2QixJQUFKLElBQVl4TSxNQUFNWSxLQUFOLENBQVl5TCxnQkFBNUIsRUFBOEM7QUFDNUM7QUFDQTtBQUNEO0FBQ0Q7QUFDQSxrQkFBTTFCLEdBQU47QUFDRCxXQVJIO0FBU0Q7QUFDRDtBQUNBLGVBQU9xQixRQUFRaEwsUUFBZjtBQUNEO0FBQ0Y7QUFDRixHQS9KUyxFQStKUFcsSUEvSk8sQ0ErSkQ4SyxLQUFELElBQVc7QUFDakIsUUFBSUEsS0FBSixFQUFXO0FBQ1QsV0FBS2xNLEtBQUwsR0FBYSxFQUFDUyxVQUFVeUwsS0FBWCxFQUFiO0FBQ0EsYUFBTyxLQUFLak0sSUFBTCxDQUFVUSxRQUFqQjtBQUNBLGFBQU8sS0FBS1IsSUFBTCxDQUFVc0UsU0FBakI7QUFDRDtBQUNEO0FBQ0QsR0F0S1MsQ0FBVjtBQXVLQSxTQUFPaUQsT0FBUDtBQUNELENBMU9EOztBQTRPQTtBQUNBO0FBQ0E7QUFDQTVILFVBQVVvQixTQUFWLENBQW9CYyw2QkFBcEIsR0FBb0QsWUFBVztBQUM3RDtBQUNBLE1BQUksS0FBS25CLFFBQUwsSUFBaUIsS0FBS0EsUUFBTCxDQUFjQSxRQUFuQyxFQUE2QztBQUMzQyxTQUFLZCxNQUFMLENBQVlzTSxlQUFaLENBQTRCQyxtQkFBNUIsQ0FBZ0QsS0FBS3ZNLE1BQXJELEVBQTZELEtBQUtjLFFBQUwsQ0FBY0EsUUFBM0U7QUFDRDtBQUNGLENBTEQ7O0FBT0FmLFVBQVVvQixTQUFWLENBQW9CZ0Isb0JBQXBCLEdBQTJDLFlBQVc7QUFDcEQsTUFBSSxLQUFLckIsUUFBVCxFQUFtQjtBQUNqQjtBQUNEOztBQUVELE1BQUksS0FBS1osU0FBTCxLQUFtQixPQUF2QixFQUFnQztBQUM5QixTQUFLRixNQUFMLENBQVlpSSxlQUFaLENBQTRCdUUsSUFBNUIsQ0FBaUNDLEtBQWpDO0FBQ0Q7O0FBRUQsTUFBSSxLQUFLdk0sU0FBTCxLQUFtQixPQUFuQixJQUNBLEtBQUtDLEtBREwsSUFFQSxLQUFLRixJQUFMLENBQVV5TSxpQkFBVixFQUZKLEVBRW1DO0FBQ2pDLFVBQU0sSUFBSTlNLE1BQU1ZLEtBQVYsQ0FBZ0JaLE1BQU1ZLEtBQU4sQ0FBWW1NLGVBQTVCLEVBQThDLHNCQUFxQixLQUFLeE0sS0FBTCxDQUFXUyxRQUFTLEdBQXZGLENBQU47QUFDRDs7QUFFRCxNQUFJLEtBQUtWLFNBQUwsS0FBbUIsVUFBbkIsSUFBaUMsS0FBS0UsSUFBTCxDQUFVd00sUUFBL0MsRUFBeUQ7QUFDdkQsU0FBS3hNLElBQUwsQ0FBVXlNLFlBQVYsR0FBeUIsS0FBS3pNLElBQUwsQ0FBVXdNLFFBQVYsQ0FBbUJFLElBQTVDO0FBQ0Q7O0FBRUQ7QUFDQTtBQUNBLE1BQUksS0FBSzFNLElBQUwsQ0FBVXlHLEdBQVYsSUFBaUIsS0FBS3pHLElBQUwsQ0FBVXlHLEdBQVYsQ0FBYyxhQUFkLENBQXJCLEVBQW1EO0FBQ2pELFVBQU0sSUFBSWpILE1BQU1ZLEtBQVYsQ0FBZ0JaLE1BQU1ZLEtBQU4sQ0FBWXVNLFdBQTVCLEVBQXlDLGNBQXpDLENBQU47QUFDRDs7QUFFRCxNQUFJLEtBQUs1TSxLQUFULEVBQWdCO0FBQ2Q7QUFDQTtBQUNBLFFBQUksS0FBS0QsU0FBTCxLQUFtQixPQUFuQixJQUE4QixLQUFLRSxJQUFMLENBQVV5RyxHQUF4QyxJQUErQyxLQUFLNUcsSUFBTCxDQUFVdUMsUUFBVixLQUF1QixJQUExRSxFQUFnRjtBQUM5RSxXQUFLcEMsSUFBTCxDQUFVeUcsR0FBVixDQUFjLEtBQUsxRyxLQUFMLENBQVdTLFFBQXpCLElBQXFDLEVBQUVvTSxNQUFNLElBQVIsRUFBY0MsT0FBTyxJQUFyQixFQUFyQztBQUNEO0FBQ0Q7QUFDQSxRQUFJLEtBQUsvTSxTQUFMLEtBQW1CLE9BQW5CLElBQThCLEtBQUtFLElBQUwsQ0FBVW9JLGdCQUF4QyxJQUE0RCxLQUFLeEksTUFBTCxDQUFZdUosY0FBeEUsSUFBMEYsS0FBS3ZKLE1BQUwsQ0FBWXVKLGNBQVosQ0FBMkIyRCxjQUF6SCxFQUF5STtBQUN2SSxXQUFLOU0sSUFBTCxDQUFVK00sb0JBQVYsR0FBaUN2TixNQUFNb0IsT0FBTixDQUFjLElBQUlDLElBQUosRUFBZCxDQUFqQztBQUNEO0FBQ0Q7QUFDQSxXQUFPLEtBQUtiLElBQUwsQ0FBVXNFLFNBQWpCOztBQUVBLFFBQUkwSSxRQUFRL0wsUUFBUUMsT0FBUixFQUFaO0FBQ0E7QUFDQSxRQUFJLEtBQUtwQixTQUFMLEtBQW1CLE9BQW5CLElBQThCLEtBQUtFLElBQUwsQ0FBVW9JLGdCQUF4QyxJQUE0RCxLQUFLeEksTUFBTCxDQUFZdUosY0FBeEUsSUFBMEYsS0FBS3ZKLE1BQUwsQ0FBWXVKLGNBQVosQ0FBMkJRLGtCQUF6SCxFQUE2STtBQUMzSXFELGNBQVEsS0FBS3BOLE1BQUwsQ0FBWWtELFFBQVosQ0FBcUJ3RCxJQUFyQixDQUEwQixPQUExQixFQUFtQyxFQUFDOUYsVUFBVSxLQUFLQSxRQUFMLEVBQVgsRUFBbkMsRUFBZ0UsRUFBQ3dFLE1BQU0sQ0FBQyxtQkFBRCxFQUFzQixrQkFBdEIsQ0FBUCxFQUFoRSxFQUFtSDdELElBQW5ILENBQXdIdUYsV0FBVztBQUN6SSxZQUFJQSxRQUFRekIsTUFBUixJQUFrQixDQUF0QixFQUF5QjtBQUN2QixnQkFBTStDLFNBQU47QUFDRDtBQUNELGNBQU0xRixPQUFPb0UsUUFBUSxDQUFSLENBQWI7QUFDQSxZQUFJa0QsZUFBZSxFQUFuQjtBQUNBLFlBQUl0SCxLQUFLdUgsaUJBQVQsRUFBNEI7QUFDMUJELHlCQUFlN0YsaUJBQUUrRixJQUFGLENBQU94SCxLQUFLdUgsaUJBQVosRUFBK0IsS0FBS2pLLE1BQUwsQ0FBWXVKLGNBQVosQ0FBMkJRLGtCQUExRCxDQUFmO0FBQ0Q7QUFDRDtBQUNBLGVBQU9DLGFBQWEzRSxNQUFiLEdBQXNCLEtBQUtyRixNQUFMLENBQVl1SixjQUFaLENBQTJCUSxrQkFBM0IsR0FBZ0QsQ0FBN0UsRUFBZ0Y7QUFDOUVDLHVCQUFhcUQsS0FBYjtBQUNEO0FBQ0RyRCxxQkFBYXZGLElBQWIsQ0FBa0IvQixLQUFLdUMsUUFBdkI7QUFDQSxhQUFLN0UsSUFBTCxDQUFVNkosaUJBQVYsR0FBOEJELFlBQTlCO0FBQ0QsT0FmTyxDQUFSO0FBZ0JEOztBQUVELFdBQU9vRCxNQUFNN0wsSUFBTixDQUFXLE1BQU07QUFDdEI7QUFDQSxhQUFPLEtBQUt2QixNQUFMLENBQVlrRCxRQUFaLENBQXFCd0UsTUFBckIsQ0FBNEIsS0FBS3hILFNBQWpDLEVBQTRDLEtBQUtDLEtBQWpELEVBQXdELEtBQUtDLElBQTdELEVBQW1FLEtBQUtPLFVBQXhFLEVBQ0pZLElBREksQ0FDQ1QsWUFBWTtBQUNoQkEsaUJBQVNDLFNBQVQsR0FBcUIsS0FBS0EsU0FBMUI7QUFDQSxhQUFLdU0sdUJBQUwsQ0FBNkJ4TSxRQUE3QixFQUF1QyxLQUFLVixJQUE1QztBQUNBLGFBQUtVLFFBQUwsR0FBZ0IsRUFBRUEsUUFBRixFQUFoQjtBQUNELE9BTEksQ0FBUDtBQU1ELEtBUk0sQ0FBUDtBQVNELEdBM0NELE1BMkNPO0FBQ0w7QUFDQSxRQUFJLEtBQUtaLFNBQUwsS0FBbUIsT0FBdkIsRUFBZ0M7QUFDOUIsVUFBSTJHLE1BQU0sS0FBS3pHLElBQUwsQ0FBVXlHLEdBQXBCO0FBQ0E7QUFDQSxVQUFJLENBQUNBLEdBQUwsRUFBVTtBQUNSQSxjQUFNLEVBQU47QUFDQUEsWUFBSSxHQUFKLElBQVcsRUFBRW1HLE1BQU0sSUFBUixFQUFjQyxPQUFPLEtBQXJCLEVBQVg7QUFDRDtBQUNEO0FBQ0FwRyxVQUFJLEtBQUt6RyxJQUFMLENBQVVRLFFBQWQsSUFBMEIsRUFBRW9NLE1BQU0sSUFBUixFQUFjQyxPQUFPLElBQXJCLEVBQTFCO0FBQ0EsV0FBSzdNLElBQUwsQ0FBVXlHLEdBQVYsR0FBZ0JBLEdBQWhCO0FBQ0E7QUFDQSxVQUFJLEtBQUs3RyxNQUFMLENBQVl1SixjQUFaLElBQThCLEtBQUt2SixNQUFMLENBQVl1SixjQUFaLENBQTJCMkQsY0FBN0QsRUFBNkU7QUFDM0UsYUFBSzlNLElBQUwsQ0FBVStNLG9CQUFWLEdBQWlDdk4sTUFBTW9CLE9BQU4sQ0FBYyxJQUFJQyxJQUFKLEVBQWQsQ0FBakM7QUFDRDtBQUNGOztBQUVEO0FBQ0EsV0FBTyxLQUFLakIsTUFBTCxDQUFZa0QsUUFBWixDQUFxQnFLLE1BQXJCLENBQTRCLEtBQUtyTixTQUFqQyxFQUE0QyxLQUFLRSxJQUFqRCxFQUF1RCxLQUFLTyxVQUE1RCxFQUNKMkosS0FESSxDQUNFMUMsU0FBUztBQUNkLFVBQUksS0FBSzFILFNBQUwsS0FBbUIsT0FBbkIsSUFBOEIwSCxNQUFNd0UsSUFBTixLQUFleE0sTUFBTVksS0FBTixDQUFZZ04sZUFBN0QsRUFBOEU7QUFDNUUsY0FBTTVGLEtBQU47QUFDRDs7QUFFRDtBQUNBLFVBQUlBLFNBQVNBLE1BQU02RixRQUFmLElBQTJCN0YsTUFBTTZGLFFBQU4sQ0FBZUMsZ0JBQWYsS0FBb0MsVUFBbkUsRUFBK0U7QUFDN0UsY0FBTSxJQUFJOU4sTUFBTVksS0FBVixDQUFnQlosTUFBTVksS0FBTixDQUFZc0ksY0FBNUIsRUFBNEMsMkNBQTVDLENBQU47QUFDRDs7QUFFRCxVQUFJbEIsU0FBU0EsTUFBTTZGLFFBQWYsSUFBMkI3RixNQUFNNkYsUUFBTixDQUFlQyxnQkFBZixLQUFvQyxPQUFuRSxFQUE0RTtBQUMxRSxjQUFNLElBQUk5TixNQUFNWSxLQUFWLENBQWdCWixNQUFNWSxLQUFOLENBQVk0SSxXQUE1QixFQUF5QyxnREFBekMsQ0FBTjtBQUNEOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBTyxLQUFLcEosTUFBTCxDQUFZa0QsUUFBWixDQUFxQndELElBQXJCLENBQ0wsS0FBS3hHLFNBREEsRUFFTCxFQUFFNEUsVUFBVSxLQUFLMUUsSUFBTCxDQUFVMEUsUUFBdEIsRUFBZ0NsRSxVQUFVLEVBQUMsT0FBTyxLQUFLQSxRQUFMLEVBQVIsRUFBMUMsRUFGSyxFQUdMLEVBQUVpSSxPQUFPLENBQVQsRUFISyxFQUtKdEgsSUFMSSxDQUtDdUYsV0FBVztBQUNmLFlBQUlBLFFBQVF6QixNQUFSLEdBQWlCLENBQXJCLEVBQXdCO0FBQ3RCLGdCQUFNLElBQUl6RixNQUFNWSxLQUFWLENBQWdCWixNQUFNWSxLQUFOLENBQVlzSSxjQUE1QixFQUE0QywyQ0FBNUMsQ0FBTjtBQUNEO0FBQ0QsZUFBTyxLQUFLOUksTUFBTCxDQUFZa0QsUUFBWixDQUFxQndELElBQXJCLENBQ0wsS0FBS3hHLFNBREEsRUFFTCxFQUFFNkksT0FBTyxLQUFLM0ksSUFBTCxDQUFVMkksS0FBbkIsRUFBMEJuSSxVQUFVLEVBQUMsT0FBTyxLQUFLQSxRQUFMLEVBQVIsRUFBcEMsRUFGSyxFQUdMLEVBQUVpSSxPQUFPLENBQVQsRUFISyxDQUFQO0FBS0QsT0FkSSxFQWVKdEgsSUFmSSxDQWVDdUYsV0FBVztBQUNmLFlBQUlBLFFBQVF6QixNQUFSLEdBQWlCLENBQXJCLEVBQXdCO0FBQ3RCLGdCQUFNLElBQUl6RixNQUFNWSxLQUFWLENBQWdCWixNQUFNWSxLQUFOLENBQVk0SSxXQUE1QixFQUF5QyxnREFBekMsQ0FBTjtBQUNEO0FBQ0QsY0FBTSxJQUFJeEosTUFBTVksS0FBVixDQUFnQlosTUFBTVksS0FBTixDQUFZZ04sZUFBNUIsRUFBNkMsK0RBQTdDLENBQU47QUFDRCxPQXBCSSxDQUFQO0FBcUJELEtBeENJLEVBeUNKak0sSUF6Q0ksQ0F5Q0NULFlBQVk7QUFDaEJBLGVBQVNGLFFBQVQsR0FBb0IsS0FBS1IsSUFBTCxDQUFVUSxRQUE5QjtBQUNBRSxlQUFTNEQsU0FBVCxHQUFxQixLQUFLdEUsSUFBTCxDQUFVc0UsU0FBL0I7O0FBRUEsVUFBSSxLQUFLa0UsMEJBQVQsRUFBcUM7QUFDbkM5SCxpQkFBU2dFLFFBQVQsR0FBb0IsS0FBSzFFLElBQUwsQ0FBVTBFLFFBQTlCO0FBQ0Q7QUFDRCxXQUFLd0ksdUJBQUwsQ0FBNkJ4TSxRQUE3QixFQUF1QyxLQUFLVixJQUE1QztBQUNBLFdBQUtVLFFBQUwsR0FBZ0I7QUFDZDBLLGdCQUFRLEdBRE07QUFFZDFLLGdCQUZjO0FBR2QyRyxrQkFBVSxLQUFLQSxRQUFMO0FBSEksT0FBaEI7QUFLRCxLQXRESSxDQUFQO0FBdUREO0FBQ0YsQ0EvSUQ7O0FBaUpBO0FBQ0ExSCxVQUFVb0IsU0FBVixDQUFvQm1CLGVBQXBCLEdBQXNDLFlBQVc7QUFDL0MsTUFBSSxDQUFDLEtBQUt4QixRQUFOLElBQWtCLENBQUMsS0FBS0EsUUFBTCxDQUFjQSxRQUFyQyxFQUErQztBQUM3QztBQUNEOztBQUVEO0FBQ0EsUUFBTTZNLG1CQUFtQjlOLFNBQVMwRCxhQUFULENBQXVCLEtBQUtyRCxTQUE1QixFQUF1Q0wsU0FBUzJELEtBQVQsQ0FBZW9LLFNBQXRELEVBQWlFLEtBQUs1TixNQUFMLENBQVkwRCxhQUE3RSxDQUF6QjtBQUNBLFFBQU1tSyxlQUFlLEtBQUs3TixNQUFMLENBQVk4TixtQkFBWixDQUFnQ0QsWUFBaEMsQ0FBNkMsS0FBSzNOLFNBQWxELENBQXJCO0FBQ0EsTUFBSSxDQUFDeU4sZ0JBQUQsSUFBcUIsQ0FBQ0UsWUFBMUIsRUFBd0M7QUFDdEMsV0FBT3hNLFFBQVFDLE9BQVIsRUFBUDtBQUNEOztBQUVELE1BQUlxQyxZQUFZLEVBQUN6RCxXQUFXLEtBQUtBLFNBQWpCLEVBQWhCO0FBQ0EsTUFBSSxLQUFLQyxLQUFMLElBQWMsS0FBS0EsS0FBTCxDQUFXUyxRQUE3QixFQUF1QztBQUNyQytDLGNBQVUvQyxRQUFWLEdBQXFCLEtBQUtULEtBQUwsQ0FBV1MsUUFBaEM7QUFDRDs7QUFFRDtBQUNBLE1BQUlnRCxjQUFKO0FBQ0EsTUFBSSxLQUFLekQsS0FBTCxJQUFjLEtBQUtBLEtBQUwsQ0FBV1MsUUFBN0IsRUFBdUM7QUFDckNnRCxxQkFBaUIvRCxTQUFTa0UsT0FBVCxDQUFpQkosU0FBakIsRUFBNEIsS0FBS3RELFlBQWpDLENBQWpCO0FBQ0Q7O0FBRUQ7QUFDQTtBQUNBLFFBQU13RCxnQkFBZ0IsS0FBS0Msa0JBQUwsQ0FBd0JILFNBQXhCLENBQXRCO0FBQ0FFLGdCQUFja0ssbUJBQWQsQ0FBa0MsS0FBS2pOLFFBQUwsQ0FBY0EsUUFBaEQsRUFBMEQsS0FBS0EsUUFBTCxDQUFjMEssTUFBZCxJQUF3QixHQUFsRjs7QUFFQTtBQUNBLE9BQUt4TCxNQUFMLENBQVk4TixtQkFBWixDQUFnQ0UsV0FBaEMsQ0FBNENuSyxjQUFjM0QsU0FBMUQsRUFBcUUyRCxhQUFyRSxFQUFvRkQsY0FBcEY7O0FBRUE7QUFDQSxTQUFPL0QsU0FBU21FLGVBQVQsQ0FBeUJuRSxTQUFTMkQsS0FBVCxDQUFlb0ssU0FBeEMsRUFBbUQsS0FBSzNOLElBQXhELEVBQThENEQsYUFBOUQsRUFBNkVELGNBQTdFLEVBQTZGLEtBQUs1RCxNQUFsRyxFQUNKc0ssS0FESSxDQUNFLFVBQVNDLEdBQVQsRUFBYztBQUNuQjBELHFCQUFPQyxJQUFQLENBQVksMkJBQVosRUFBeUMzRCxHQUF6QztBQUNELEdBSEksQ0FBUDtBQUlELENBcENEOztBQXNDQTtBQUNBeEssVUFBVW9CLFNBQVYsQ0FBb0JzRyxRQUFwQixHQUErQixZQUFXO0FBQ3hDLE1BQUkwRyxTQUFVLEtBQUtqTyxTQUFMLEtBQW1CLE9BQW5CLEdBQTZCLFNBQTdCLEdBQ1osY0FBYyxLQUFLQSxTQUFuQixHQUErQixHQURqQztBQUVBLFNBQU8sS0FBS0YsTUFBTCxDQUFZb08sS0FBWixHQUFvQkQsTUFBcEIsR0FBNkIsS0FBSy9OLElBQUwsQ0FBVVEsUUFBOUM7QUFDRCxDQUpEOztBQU1BO0FBQ0E7QUFDQWIsVUFBVW9CLFNBQVYsQ0FBb0JQLFFBQXBCLEdBQStCLFlBQVc7QUFDeEMsU0FBTyxLQUFLUixJQUFMLENBQVVRLFFBQVYsSUFBc0IsS0FBS1QsS0FBTCxDQUFXUyxRQUF4QztBQUNELENBRkQ7O0FBSUE7QUFDQWIsVUFBVW9CLFNBQVYsQ0FBb0JrTixhQUFwQixHQUFvQyxZQUFXO0FBQzdDLFFBQU1qTyxPQUFPK0UsT0FBT0MsSUFBUCxDQUFZLEtBQUtoRixJQUFqQixFQUF1QmdFLE1BQXZCLENBQThCLENBQUNoRSxJQUFELEVBQU9tRSxHQUFQLEtBQWU7QUFDeEQ7QUFDQSxRQUFJLENBQUUseUJBQUQsQ0FBNEIrSixJQUE1QixDQUFpQy9KLEdBQWpDLENBQUwsRUFBNEM7QUFDMUMsYUFBT25FLEtBQUttRSxHQUFMLENBQVA7QUFDRDtBQUNELFdBQU9uRSxJQUFQO0FBQ0QsR0FOWSxFQU1WWixTQUFTLEtBQUtZLElBQWQsQ0FOVSxDQUFiO0FBT0EsU0FBT1IsTUFBTTJPLE9BQU4sQ0FBY25HLFNBQWQsRUFBeUJoSSxJQUF6QixDQUFQO0FBQ0QsQ0FURDs7QUFXQTtBQUNBTCxVQUFVb0IsU0FBVixDQUFvQjJDLGtCQUFwQixHQUF5QyxVQUFVSCxTQUFWLEVBQXFCO0FBQzVELFFBQU1FLGdCQUFnQmhFLFNBQVNrRSxPQUFULENBQWlCSixTQUFqQixFQUE0QixLQUFLdEQsWUFBakMsQ0FBdEI7QUFDQThFLFNBQU9DLElBQVAsQ0FBWSxLQUFLaEYsSUFBakIsRUFBdUJnRSxNQUF2QixDQUE4QixVQUFVaEUsSUFBVixFQUFnQm1FLEdBQWhCLEVBQXFCO0FBQ2pELFFBQUlBLElBQUl0QixPQUFKLENBQVksR0FBWixJQUFtQixDQUF2QixFQUEwQjtBQUN4QjtBQUNBLFlBQU11TCxjQUFjakssSUFBSWtLLEtBQUosQ0FBVSxHQUFWLENBQXBCO0FBQ0EsWUFBTUMsYUFBYUYsWUFBWSxDQUFaLENBQW5CO0FBQ0EsVUFBSUcsWUFBWTlLLGNBQWMrSyxHQUFkLENBQWtCRixVQUFsQixDQUFoQjtBQUNBLFVBQUcsT0FBT0MsU0FBUCxLQUFxQixRQUF4QixFQUFrQztBQUNoQ0Esb0JBQVksRUFBWjtBQUNEO0FBQ0RBLGdCQUFVSCxZQUFZLENBQVosQ0FBVixJQUE0QnBPLEtBQUttRSxHQUFMLENBQTVCO0FBQ0FWLG9CQUFjZ0wsR0FBZCxDQUFrQkgsVUFBbEIsRUFBOEJDLFNBQTlCO0FBQ0EsYUFBT3ZPLEtBQUttRSxHQUFMLENBQVA7QUFDRDtBQUNELFdBQU9uRSxJQUFQO0FBQ0QsR0FkRCxFQWNHWixTQUFTLEtBQUtZLElBQWQsQ0FkSDs7QUFnQkF5RCxnQkFBY2dMLEdBQWQsQ0FBa0IsS0FBS1IsYUFBTCxFQUFsQjtBQUNBLFNBQU94SyxhQUFQO0FBQ0QsQ0FwQkQ7O0FBc0JBOUQsVUFBVW9CLFNBQVYsQ0FBb0JvQixpQkFBcEIsR0FBd0MsWUFBVztBQUNqRCxNQUFJLEtBQUt6QixRQUFMLElBQWlCLEtBQUtBLFFBQUwsQ0FBY0EsUUFBL0IsSUFBMkMsS0FBS1osU0FBTCxLQUFtQixPQUFsRSxFQUEyRTtBQUN6RSxVQUFNd0MsT0FBTyxLQUFLNUIsUUFBTCxDQUFjQSxRQUEzQjtBQUNBLFFBQUk0QixLQUFLbUMsUUFBVCxFQUFtQjtBQUNqQk0sYUFBT0MsSUFBUCxDQUFZMUMsS0FBS21DLFFBQWpCLEVBQTJCdUMsT0FBM0IsQ0FBb0MzQixRQUFELElBQWM7QUFDL0MsWUFBSS9DLEtBQUttQyxRQUFMLENBQWNZLFFBQWQsTUFBNEIsSUFBaEMsRUFBc0M7QUFDcEMsaUJBQU8vQyxLQUFLbUMsUUFBTCxDQUFjWSxRQUFkLENBQVA7QUFDRDtBQUNGLE9BSkQ7QUFLQSxVQUFJTixPQUFPQyxJQUFQLENBQVkxQyxLQUFLbUMsUUFBakIsRUFBMkJRLE1BQTNCLElBQXFDLENBQXpDLEVBQTRDO0FBQzFDLGVBQU8zQyxLQUFLbUMsUUFBWjtBQUNEO0FBQ0Y7QUFDRjtBQUNGLENBZEQ7O0FBZ0JBOUUsVUFBVW9CLFNBQVYsQ0FBb0JtTSx1QkFBcEIsR0FBOEMsVUFBU3hNLFFBQVQsRUFBbUJWLElBQW5CLEVBQXlCO0FBQ3JFLE1BQUkrRCxpQkFBRVksT0FBRixDQUFVLEtBQUtyRSxPQUFMLENBQWF3RCxzQkFBdkIsQ0FBSixFQUFvRDtBQUNsRCxXQUFPcEQsUUFBUDtBQUNEO0FBQ0QsUUFBTWdPLHVCQUF1QmhQLFVBQVVpUCxxQkFBVixDQUFnQyxLQUFLek8sU0FBckMsQ0FBN0I7QUFDQSxPQUFLSSxPQUFMLENBQWF3RCxzQkFBYixDQUFvQ2tELE9BQXBDLENBQTRDNEgsYUFBYTtBQUN2RCxVQUFNQyxZQUFZN08sS0FBSzRPLFNBQUwsQ0FBbEI7O0FBRUEsUUFBRyxDQUFDbE8sU0FBU29PLGNBQVQsQ0FBd0JGLFNBQXhCLENBQUosRUFBd0M7QUFDdENsTyxlQUFTa08sU0FBVCxJQUFzQkMsU0FBdEI7QUFDRDs7QUFFRDtBQUNBLFFBQUluTyxTQUFTa08sU0FBVCxLQUF1QmxPLFNBQVNrTyxTQUFULEVBQW9CaEcsSUFBL0MsRUFBcUQ7QUFDbkQsYUFBT2xJLFNBQVNrTyxTQUFULENBQVA7QUFDQSxVQUFJRix3QkFBd0JHLFVBQVVqRyxJQUFWLElBQWtCLFFBQTlDLEVBQXdEO0FBQ3REbEksaUJBQVNrTyxTQUFULElBQXNCQyxTQUF0QjtBQUNEO0FBQ0Y7QUFDRixHQWREO0FBZUEsU0FBT25PLFFBQVA7QUFDRCxDQXJCRDs7a0JBdUJlZixTOztBQUNmb1AsT0FBT0MsT0FBUCxHQUFpQnJQLFNBQWpCIiwiZmlsZSI6IlJlc3RXcml0ZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEEgUmVzdFdyaXRlIGVuY2Fwc3VsYXRlcyBldmVyeXRoaW5nIHdlIG5lZWQgdG8gcnVuIGFuIG9wZXJhdGlvblxuLy8gdGhhdCB3cml0ZXMgdG8gdGhlIGRhdGFiYXNlLlxuLy8gVGhpcyBjb3VsZCBiZSBlaXRoZXIgYSBcImNyZWF0ZVwiIG9yIGFuIFwidXBkYXRlXCIuXG5cbnZhciBTY2hlbWFDb250cm9sbGVyID0gcmVxdWlyZSgnLi9Db250cm9sbGVycy9TY2hlbWFDb250cm9sbGVyJyk7XG52YXIgZGVlcGNvcHkgPSByZXF1aXJlKCdkZWVwY29weScpO1xuXG5jb25zdCBBdXRoID0gcmVxdWlyZSgnLi9BdXRoJyk7XG52YXIgY3J5cHRvVXRpbHMgPSByZXF1aXJlKCcuL2NyeXB0b1V0aWxzJyk7XG52YXIgcGFzc3dvcmRDcnlwdG8gPSByZXF1aXJlKCcuL3Bhc3N3b3JkJyk7XG52YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJyk7XG52YXIgdHJpZ2dlcnMgPSByZXF1aXJlKCcuL3RyaWdnZXJzJyk7XG52YXIgQ2xpZW50U0RLID0gcmVxdWlyZSgnLi9DbGllbnRTREsnKTtcbmltcG9ydCBSZXN0UXVlcnkgZnJvbSAnLi9SZXN0UXVlcnknO1xuaW1wb3J0IF8gICAgICAgICBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZ2dlciAgICBmcm9tICcuL2xvZ2dlcic7XG5cbi8vIHF1ZXJ5IGFuZCBkYXRhIGFyZSBib3RoIHByb3ZpZGVkIGluIFJFU1QgQVBJIGZvcm1hdC4gU28gZGF0YVxuLy8gdHlwZXMgYXJlIGVuY29kZWQgYnkgcGxhaW4gb2xkIG9iamVjdHMuXG4vLyBJZiBxdWVyeSBpcyBudWxsLCB0aGlzIGlzIGEgXCJjcmVhdGVcIiBhbmQgdGhlIGRhdGEgaW4gZGF0YSBzaG91bGQgYmVcbi8vIGNyZWF0ZWQuXG4vLyBPdGhlcndpc2UgdGhpcyBpcyBhbiBcInVwZGF0ZVwiIC0gdGhlIG9iamVjdCBtYXRjaGluZyB0aGUgcXVlcnlcbi8vIHNob3VsZCBnZXQgdXBkYXRlZCB3aXRoIGRhdGEuXG4vLyBSZXN0V3JpdGUgd2lsbCBoYW5kbGUgb2JqZWN0SWQsIGNyZWF0ZWRBdCwgYW5kIHVwZGF0ZWRBdCBmb3Jcbi8vIGV2ZXJ5dGhpbmcuIEl0IGFsc28ga25vd3MgdG8gdXNlIHRyaWdnZXJzIGFuZCBzcGVjaWFsIG1vZGlmaWNhdGlvbnNcbi8vIGZvciB0aGUgX1VzZXIgY2xhc3MuXG5mdW5jdGlvbiBSZXN0V3JpdGUoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIHF1ZXJ5LCBkYXRhLCBvcmlnaW5hbERhdGEsIGNsaWVudFNESykge1xuICBpZiAoYXV0aC5pc1JlYWRPbmx5KSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sICdDYW5ub3QgcGVyZm9ybSBhIHdyaXRlIG9wZXJhdGlvbiB3aGVuIHVzaW5nIHJlYWRPbmx5TWFzdGVyS2V5Jyk7XG4gIH1cbiAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIHRoaXMuYXV0aCA9IGF1dGg7XG4gIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICB0aGlzLmNsaWVudFNESyA9IGNsaWVudFNESztcbiAgdGhpcy5zdG9yYWdlID0ge307XG4gIHRoaXMucnVuT3B0aW9ucyA9IHt9O1xuICBpZiAoIXF1ZXJ5ICYmIGRhdGEub2JqZWN0SWQpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSwgJ29iamVjdElkIGlzIGFuIGludmFsaWQgZmllbGQgbmFtZS4nKTtcbiAgfVxuXG4gIC8vIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSwgdGhpcy5yZXNwb25zZSBtYXkgaGF2ZSBzZXZlcmFsXG4gIC8vIGZpZWxkcy5cbiAgLy8gcmVzcG9uc2U6IHRoZSBhY3R1YWwgZGF0YSB0byBiZSByZXR1cm5lZFxuICAvLyBzdGF0dXM6IHRoZSBodHRwIHN0YXR1cyBjb2RlLiBpZiBub3QgcHJlc2VudCwgdHJlYXRlZCBsaWtlIGEgMjAwXG4gIC8vIGxvY2F0aW9uOiB0aGUgbG9jYXRpb24gaGVhZGVyLiBpZiBub3QgcHJlc2VudCwgbm8gbG9jYXRpb24gaGVhZGVyXG4gIHRoaXMucmVzcG9uc2UgPSBudWxsO1xuXG4gIC8vIFByb2Nlc3NpbmcgdGhpcyBvcGVyYXRpb24gbWF5IG11dGF0ZSBvdXIgZGF0YSwgc28gd2Ugb3BlcmF0ZSBvbiBhXG4gIC8vIGNvcHlcbiAgdGhpcy5xdWVyeSA9IGRlZXBjb3B5KHF1ZXJ5KTtcbiAgdGhpcy5kYXRhID0gZGVlcGNvcHkoZGF0YSk7XG4gIC8vIFdlIG5ldmVyIGNoYW5nZSBvcmlnaW5hbERhdGEsIHNvIHdlIGRvIG5vdCBuZWVkIGEgZGVlcCBjb3B5XG4gIHRoaXMub3JpZ2luYWxEYXRhID0gb3JpZ2luYWxEYXRhO1xuXG4gIC8vIFRoZSB0aW1lc3RhbXAgd2UnbGwgdXNlIGZvciB0aGlzIHdob2xlIG9wZXJhdGlvblxuICB0aGlzLnVwZGF0ZWRBdCA9IFBhcnNlLl9lbmNvZGUobmV3IERhdGUoKSkuaXNvO1xufVxuXG4vLyBBIGNvbnZlbmllbnQgbWV0aG9kIHRvIHBlcmZvcm0gYWxsIHRoZSBzdGVwcyBvZiBwcm9jZXNzaW5nIHRoZVxuLy8gd3JpdGUsIGluIG9yZGVyLlxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIGEge3Jlc3BvbnNlLCBzdGF0dXMsIGxvY2F0aW9ufSBvYmplY3QuXG4vLyBzdGF0dXMgYW5kIGxvY2F0aW9uIGFyZSBvcHRpb25hbC5cblJlc3RXcml0ZS5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VXNlckFuZFJvbGVBQ0woKTtcbiAgfSkudGhlbigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVDbGllbnRDbGFzc0NyZWF0aW9uKCk7XG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZUluc3RhbGxhdGlvbigpO1xuICB9KS50aGVuKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVTZXNzaW9uKCk7XG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQXV0aERhdGEoKTtcbiAgfSkudGhlbigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMucnVuQmVmb3JlVHJpZ2dlcigpO1xuICB9KS50aGVuKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVNjaGVtYSgpO1xuICB9KS50aGVuKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zZXRSZXF1aXJlZEZpZWxkc0lmTmVlZGVkKCk7XG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVVzZXIoKTtcbiAgfSkudGhlbigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kRmlsZXNGb3JFeGlzdGluZ09iamVjdHMoKTtcbiAgfSkudGhlbigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZGVzdHJveUR1cGxpY2F0ZWRTZXNzaW9ucygpO1xuICB9KS50aGVuKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5ydW5EYXRhYmFzZU9wZXJhdGlvbigpO1xuICB9KS50aGVuKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTZXNzaW9uVG9rZW5JZk5lZWRlZCgpO1xuICB9KS50aGVuKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVGb2xsb3d1cCgpO1xuICB9KS50aGVuKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5ydW5BZnRlclRyaWdnZXIoKTtcbiAgfSkudGhlbigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xlYW5Vc2VyQXV0aERhdGEoKTtcbiAgfSkudGhlbigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2U7XG4gIH0pXG59O1xuXG4vLyBVc2VzIHRoZSBBdXRoIG9iamVjdCB0byBnZXQgdGhlIGxpc3Qgb2Ygcm9sZXMsIGFkZHMgdGhlIHVzZXIgaWRcblJlc3RXcml0ZS5wcm90b3R5cGUuZ2V0VXNlckFuZFJvbGVBQ0wgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuYXV0aC5pc01hc3Rlcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHRoaXMucnVuT3B0aW9ucy5hY2wgPSBbJyonXTtcblxuICBpZiAodGhpcy5hdXRoLnVzZXIpIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLmdldFVzZXJSb2xlcygpLnRoZW4oKHJvbGVzKSA9PiB7XG4gICAgICB0aGlzLnJ1bk9wdGlvbnMuYWNsID0gdGhpcy5ydW5PcHRpb25zLmFjbC5jb25jYXQocm9sZXMsIFt0aGlzLmF1dGgudXNlci5pZF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufTtcblxuLy8gVmFsaWRhdGVzIHRoaXMgb3BlcmF0aW9uIGFnYWluc3QgdGhlIGFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiBjb25maWcuXG5SZXN0V3JpdGUucHJvdG90eXBlLnZhbGlkYXRlQ2xpZW50Q2xhc3NDcmVhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5jb25maWcuYWxsb3dDbGllbnRDbGFzc0NyZWF0aW9uID09PSBmYWxzZSAmJiAhdGhpcy5hdXRoLmlzTWFzdGVyXG4gICAgICAmJiBTY2hlbWFDb250cm9sbGVyLnN5c3RlbUNsYXNzZXMuaW5kZXhPZih0aGlzLmNsYXNzTmFtZSkgPT09IC0xKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLmxvYWRTY2hlbWEoKVxuICAgICAgLnRoZW4oc2NoZW1hQ29udHJvbGxlciA9PiBzY2hlbWFDb250cm9sbGVyLmhhc0NsYXNzKHRoaXMuY2xhc3NOYW1lKSlcbiAgICAgIC50aGVuKGhhc0NsYXNzID0+IHtcbiAgICAgICAgaWYgKGhhc0NsYXNzICE9PSB0cnVlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sXG4gICAgICAgICAgICAnVGhpcyB1c2VyIGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vbi1leGlzdGVudCBjbGFzczogJyArIHRoaXMuY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG59O1xuXG4vLyBWYWxpZGF0ZXMgdGhpcyBvcGVyYXRpb24gYWdhaW5zdCB0aGUgc2NoZW1hLlxuUmVzdFdyaXRlLnByb3RvdHlwZS52YWxpZGF0ZVNjaGVtYSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UudmFsaWRhdGVPYmplY3QodGhpcy5jbGFzc05hbWUsIHRoaXMuZGF0YSwgdGhpcy5xdWVyeSwgdGhpcy5ydW5PcHRpb25zKTtcbn07XG5cbi8vIFJ1bnMgYW55IGJlZm9yZVNhdmUgdHJpZ2dlcnMgYWdhaW5zdCB0aGlzIG9wZXJhdGlvbi5cbi8vIEFueSBjaGFuZ2UgbGVhZHMgdG8gb3VyIGRhdGEgYmVpbmcgbXV0YXRlZC5cblJlc3RXcml0ZS5wcm90b3R5cGUucnVuQmVmb3JlVHJpZ2dlciA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEF2b2lkIGRvaW5nIGFueSBzZXR1cCBmb3IgdHJpZ2dlcnMgaWYgdGhlcmUgaXMgbm8gJ2JlZm9yZVNhdmUnIHRyaWdnZXIgZm9yIHRoaXMgY2xhc3MuXG4gIGlmICghdHJpZ2dlcnMudHJpZ2dlckV4aXN0cyh0aGlzLmNsYXNzTmFtZSwgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlU2F2ZSwgdGhpcy5jb25maWcuYXBwbGljYXRpb25JZCkpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICAvLyBDbG91ZCBjb2RlIGdldHMgYSBiaXQgb2YgZXh0cmEgZGF0YSBmb3IgaXRzIG9iamVjdHNcbiAgdmFyIGV4dHJhRGF0YSA9IHtjbGFzc05hbWU6IHRoaXMuY2xhc3NOYW1lfTtcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgIGV4dHJhRGF0YS5vYmplY3RJZCA9IHRoaXMucXVlcnkub2JqZWN0SWQ7XG4gIH1cblxuICBsZXQgb3JpZ2luYWxPYmplY3QgPSBudWxsO1xuICBjb25zdCB1cGRhdGVkT2JqZWN0ID0gdGhpcy5idWlsZFVwZGF0ZWRPYmplY3QoZXh0cmFEYXRhKTtcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgIC8vIFRoaXMgaXMgYW4gdXBkYXRlIGZvciBleGlzdGluZyBvYmplY3QuXG4gICAgb3JpZ2luYWxPYmplY3QgPSB0cmlnZ2Vycy5pbmZsYXRlKGV4dHJhRGF0YSwgdGhpcy5vcmlnaW5hbERhdGEpO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIodHJpZ2dlcnMuVHlwZXMuYmVmb3JlU2F2ZSwgdGhpcy5hdXRoLCB1cGRhdGVkT2JqZWN0LCBvcmlnaW5hbE9iamVjdCwgdGhpcy5jb25maWcpO1xuICB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5vYmplY3QpIHtcbiAgICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyID0gXy5yZWR1Y2UocmVzcG9uc2Uub2JqZWN0LCAocmVzdWx0LCB2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmICghXy5pc0VxdWFsKHRoaXMuZGF0YVtrZXldLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LCBbXSk7XG4gICAgICB0aGlzLmRhdGEgPSByZXNwb25zZS5vYmplY3Q7XG4gICAgICAvLyBXZSBzaG91bGQgZGVsZXRlIHRoZSBvYmplY3RJZCBmb3IgYW4gdXBkYXRlIHdyaXRlXG4gICAgICBpZiAodGhpcy5xdWVyeSAmJiB0aGlzLnF1ZXJ5Lm9iamVjdElkKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRhdGEub2JqZWN0SWRcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5zZXRSZXF1aXJlZEZpZWxkc0lmTmVlZGVkID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLmRhdGEpIHtcbiAgICAvLyBBZGQgZGVmYXVsdCBmaWVsZHNcbiAgICB0aGlzLmRhdGEudXBkYXRlZEF0ID0gdGhpcy51cGRhdGVkQXQ7XG4gICAgaWYgKCF0aGlzLnF1ZXJ5KSB7XG4gICAgICB0aGlzLmRhdGEuY3JlYXRlZEF0ID0gdGhpcy51cGRhdGVkQXQ7XG5cbiAgICAgIC8vIE9ubHkgYXNzaWduIG5ldyBvYmplY3RJZCBpZiB3ZSBhcmUgY3JlYXRpbmcgbmV3IG9iamVjdFxuICAgICAgaWYgKCF0aGlzLmRhdGEub2JqZWN0SWQpIHtcbiAgICAgICAgdGhpcy5kYXRhLm9iamVjdElkID0gY3J5cHRvVXRpbHMubmV3T2JqZWN0SWQodGhpcy5jb25maWcub2JqZWN0SWRTaXplKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufTtcblxuLy8gVHJhbnNmb3JtcyBhdXRoIGRhdGEgZm9yIGEgdXNlciBvYmplY3QuXG4vLyBEb2VzIG5vdGhpbmcgaWYgdGhpcyBpc24ndCBhIHVzZXIgb2JqZWN0LlxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHdoZW4gd2UncmUgZG9uZSBpZiBpdCBjYW4ndCBmaW5pc2ggdGhpcyB0aWNrLlxuUmVzdFdyaXRlLnByb3RvdHlwZS52YWxpZGF0ZUF1dGhEYXRhID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLmNsYXNzTmFtZSAhPT0gJ19Vc2VyJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghdGhpcy5xdWVyeSAmJiAhdGhpcy5kYXRhLmF1dGhEYXRhKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmRhdGEudXNlcm5hbWUgIT09ICdzdHJpbmcnIHx8IF8uaXNFbXB0eSh0aGlzLmRhdGEudXNlcm5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVVNFUk5BTUVfTUlTU0lORyxcbiAgICAgICAgJ2JhZCBvciBtaXNzaW5nIHVzZXJuYW1lJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLnBhc3N3b3JkICE9PSAnc3RyaW5nJyB8fCBfLmlzRW1wdHkodGhpcy5kYXRhLnBhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLlBBU1NXT1JEX01JU1NJTkcsXG4gICAgICAgICdwYXNzd29yZCBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghdGhpcy5kYXRhLmF1dGhEYXRhIHx8ICFPYmplY3Qua2V5cyh0aGlzLmRhdGEuYXV0aERhdGEpLmxlbmd0aCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBhdXRoRGF0YSA9IHRoaXMuZGF0YS5hdXRoRGF0YTtcbiAgdmFyIHByb3ZpZGVycyA9IE9iamVjdC5rZXlzKGF1dGhEYXRhKTtcbiAgaWYgKHByb3ZpZGVycy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY2FuSGFuZGxlQXV0aERhdGEgPSBwcm92aWRlcnMucmVkdWNlKChjYW5IYW5kbGUsIHByb3ZpZGVyKSA9PiB7XG4gICAgICB2YXIgcHJvdmlkZXJBdXRoRGF0YSA9IGF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICAgIHZhciBoYXNUb2tlbiA9IChwcm92aWRlckF1dGhEYXRhICYmIHByb3ZpZGVyQXV0aERhdGEuaWQpO1xuICAgICAgcmV0dXJuIGNhbkhhbmRsZSAmJiAoaGFzVG9rZW4gfHwgcHJvdmlkZXJBdXRoRGF0YSA9PSBudWxsKTtcbiAgICB9LCB0cnVlKTtcbiAgICBpZiAoY2FuSGFuZGxlQXV0aERhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUF1dGhEYXRhKGF1dGhEYXRhKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLlVOU1VQUE9SVEVEX1NFUlZJQ0UsXG4gICAgJ1RoaXMgYXV0aGVudGljYXRpb24gbWV0aG9kIGlzIHVuc3VwcG9ydGVkLicpO1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5oYW5kbGVBdXRoRGF0YVZhbGlkYXRpb24gPSBmdW5jdGlvbihhdXRoRGF0YSkge1xuICBjb25zdCB2YWxpZGF0aW9ucyA9IE9iamVjdC5rZXlzKGF1dGhEYXRhKS5tYXAoKHByb3ZpZGVyKSA9PiB7XG4gICAgaWYgKGF1dGhEYXRhW3Byb3ZpZGVyXSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBjb25zdCB2YWxpZGF0ZUF1dGhEYXRhID0gdGhpcy5jb25maWcuYXV0aERhdGFNYW5hZ2VyLmdldFZhbGlkYXRvckZvclByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICBpZiAoIXZhbGlkYXRlQXV0aERhdGEpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5VTlNVUFBPUlRFRF9TRVJWSUNFLFxuICAgICAgICAnVGhpcyBhdXRoZW50aWNhdGlvbiBtZXRob2QgaXMgdW5zdXBwb3J0ZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0ZUF1dGhEYXRhKGF1dGhEYXRhW3Byb3ZpZGVyXSk7XG4gIH0pO1xuICByZXR1cm4gUHJvbWlzZS5hbGwodmFsaWRhdGlvbnMpO1xufVxuXG5SZXN0V3JpdGUucHJvdG90eXBlLmZpbmRVc2Vyc1dpdGhBdXRoRGF0YSA9IGZ1bmN0aW9uKGF1dGhEYXRhKSB7XG4gIGNvbnN0IHByb3ZpZGVycyA9IE9iamVjdC5rZXlzKGF1dGhEYXRhKTtcbiAgY29uc3QgcXVlcnkgPSBwcm92aWRlcnMucmVkdWNlKChtZW1vLCBwcm92aWRlcikgPT4ge1xuICAgIGlmICghYXV0aERhdGFbcHJvdmlkZXJdKSB7XG4gICAgICByZXR1cm4gbWVtbztcbiAgICB9XG4gICAgY29uc3QgcXVlcnlLZXkgPSBgYXV0aERhdGEuJHtwcm92aWRlcn0uaWRgO1xuICAgIGNvbnN0IHF1ZXJ5ID0ge307XG4gICAgcXVlcnlbcXVlcnlLZXldID0gYXV0aERhdGFbcHJvdmlkZXJdLmlkO1xuICAgIG1lbW8ucHVzaChxdWVyeSk7XG4gICAgcmV0dXJuIG1lbW87XG4gIH0sIFtdKS5maWx0ZXIoKHEpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIHEgIT09ICd1bmRlZmluZWQnO1xuICB9KTtcblxuICBsZXQgZmluZFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoW10pO1xuICBpZiAocXVlcnkubGVuZ3RoID4gMCkge1xuICAgIGZpbmRQcm9taXNlID0gdGhpcy5jb25maWcuZGF0YWJhc2UuZmluZChcbiAgICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgeyckb3InOiBxdWVyeX0sIHt9KVxuICB9XG5cbiAgcmV0dXJuIGZpbmRQcm9taXNlO1xufVxuXG5SZXN0V3JpdGUucHJvdG90eXBlLmZpbHRlcmVkT2JqZWN0c0J5QUNMID0gZnVuY3Rpb24ob2JqZWN0cykge1xuICBpZiAodGhpcy5hdXRoLmlzTWFzdGVyKSB7XG4gICAgcmV0dXJuIG9iamVjdHM7XG4gIH1cbiAgcmV0dXJuIG9iamVjdHMuZmlsdGVyKChvYmplY3QpID0+IHtcbiAgICBpZiAoIW9iamVjdC5BQ0wpIHtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBsZWdhY3kgdXNlcnMgdGhhdCBoYXZlIG5vIEFDTCBmaWVsZCBvbiB0aGVtXG4gICAgfVxuICAgIC8vIFJlZ3VsYXIgdXNlcnMgdGhhdCBoYXZlIGJlZW4gbG9ja2VkIG91dC5cbiAgICByZXR1cm4gb2JqZWN0LkFDTCAmJiBPYmplY3Qua2V5cyhvYmplY3QuQUNMKS5sZW5ndGggPiAwO1xuICB9KTtcbn1cblxuUmVzdFdyaXRlLnByb3RvdHlwZS5oYW5kbGVBdXRoRGF0YSA9IGZ1bmN0aW9uKGF1dGhEYXRhKSB7XG4gIGxldCByZXN1bHRzO1xuICByZXR1cm4gdGhpcy5maW5kVXNlcnNXaXRoQXV0aERhdGEoYXV0aERhdGEpLnRoZW4oKHIpID0+IHtcbiAgICByZXN1bHRzID0gdGhpcy5maWx0ZXJlZE9iamVjdHNCeUFDTChyKTtcbiAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBNb3JlIHRoYW4gMSB1c2VyIHdpdGggdGhlIHBhc3NlZCBpZCdzXG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuQUNDT1VOVF9BTFJFQURZX0xJTktFRCxcbiAgICAgICAgJ3RoaXMgYXV0aCBpcyBhbHJlYWR5IHVzZWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3JhZ2VbJ2F1dGhQcm92aWRlciddID0gT2JqZWN0LmtleXMoYXV0aERhdGEpLmpvaW4oJywnKTtcblxuICAgIGlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHVzZXJSZXN1bHQgPSByZXN1bHRzWzBdO1xuICAgICAgY29uc3QgbXV0YXRlZEF1dGhEYXRhID0ge307XG4gICAgICBPYmplY3Qua2V5cyhhdXRoRGF0YSkuZm9yRWFjaCgocHJvdmlkZXIpID0+IHtcbiAgICAgICAgY29uc3QgcHJvdmlkZXJEYXRhID0gYXV0aERhdGFbcHJvdmlkZXJdO1xuICAgICAgICBjb25zdCB1c2VyQXV0aERhdGEgPSB1c2VyUmVzdWx0LmF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICAgICAgaWYgKCFfLmlzRXF1YWwocHJvdmlkZXJEYXRhLCB1c2VyQXV0aERhdGEpKSB7XG4gICAgICAgICAgbXV0YXRlZEF1dGhEYXRhW3Byb3ZpZGVyXSA9IHByb3ZpZGVyRGF0YTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBoYXNNdXRhdGVkQXV0aERhdGEgPSBPYmplY3Qua2V5cyhtdXRhdGVkQXV0aERhdGEpLmxlbmd0aCAhPT0gMDtcbiAgICAgIGxldCB1c2VySWQ7XG4gICAgICBpZiAodGhpcy5xdWVyeSAmJiB0aGlzLnF1ZXJ5Lm9iamVjdElkKSB7XG4gICAgICAgIHVzZXJJZCA9IHRoaXMucXVlcnkub2JqZWN0SWQ7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYXV0aCAmJiB0aGlzLmF1dGgudXNlciAmJiB0aGlzLmF1dGgudXNlci5pZCkge1xuICAgICAgICB1c2VySWQgPSB0aGlzLmF1dGgudXNlci5pZDtcbiAgICAgIH1cbiAgICAgIGlmICghdXNlcklkIHx8IHVzZXJJZCA9PT0gdXNlclJlc3VsdC5vYmplY3RJZCkgeyAvLyBubyB1c2VyIG1ha2luZyB0aGUgY2FsbFxuICAgICAgICAvLyBPUiB0aGUgdXNlciBtYWtpbmcgdGhlIGNhbGwgaXMgdGhlIHJpZ2h0IG9uZVxuICAgICAgICAvLyBMb2dpbiB3aXRoIGF1dGggZGF0YVxuICAgICAgICBkZWxldGUgcmVzdWx0c1swXS5wYXNzd29yZDtcblxuICAgICAgICAvLyBuZWVkIHRvIHNldCB0aGUgb2JqZWN0SWQgZmlyc3Qgb3RoZXJ3aXNlIGxvY2F0aW9uIGhhcyB0cmFpbGluZyB1bmRlZmluZWRcbiAgICAgICAgdGhpcy5kYXRhLm9iamVjdElkID0gdXNlclJlc3VsdC5vYmplY3RJZDtcblxuICAgICAgICBpZiAoIXRoaXMucXVlcnkgfHwgIXRoaXMucXVlcnkub2JqZWN0SWQpIHsgLy8gdGhpcyBhIGxvZ2luIGNhbGwsIG5vIHVzZXJJZCBwYXNzZWRcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlID0ge1xuICAgICAgICAgICAgcmVzcG9uc2U6IHVzZXJSZXN1bHQsXG4gICAgICAgICAgICBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbigpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgY2hhbmdlIHRoZSBhdXRoIGRhdGEsIGp1c3Qga2VlcCBnb2luZ1xuICAgICAgICBpZiAoIWhhc011dGF0ZWRBdXRoRGF0YSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBoYXZlIGF1dGhEYXRhIHRoYXQgaXMgdXBkYXRlZCBvbiBsb2dpblxuICAgICAgICAvLyB0aGF0IGNhbiBoYXBwZW4gd2hlbiB0b2tlbiBhcmUgcmVmcmVzaGVkLFxuICAgICAgICAvLyBXZSBzaG91bGQgdXBkYXRlIHRoZSB0b2tlbiBhbmQgbGV0IHRoZSB1c2VyIGluXG4gICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGNoZWNrIHRoZSBtdXRhdGVkIGtleXNcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQXV0aERhdGFWYWxpZGF0aW9uKG11dGF0ZWRBdXRoRGF0YSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgLy8gSUYgd2UgaGF2ZSBhIHJlc3BvbnNlLCB3ZSdsbCBza2lwIHRoZSBkYXRhYmFzZSBvcGVyYXRpb24gLyBiZWZvcmVTYXZlIC8gYWZ0ZXJTYXZlIGV0Yy4uLlxuICAgICAgICAgIC8vIHdlIG5lZWQgdG8gc2V0IGl0IHVwIHRoZXJlLlxuICAgICAgICAgIC8vIFdlIGFyZSBzdXBwb3NlZCB0byBoYXZlIGEgcmVzcG9uc2Ugb25seSBvbiBMT0dJTiB3aXRoIGF1dGhEYXRhLCBzbyB3ZSBza2lwIHRob3NlXG4gICAgICAgICAgLy8gSWYgd2UncmUgbm90IGxvZ2dpbmcgaW4sIGJ1dCBqdXN0IHVwZGF0aW5nIHRoZSBjdXJyZW50IHVzZXIsIHdlIGNhbiBzYWZlbHkgc2tpcCB0aGF0IHBhcnRcbiAgICAgICAgICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gQXNzaWduIHRoZSBuZXcgYXV0aERhdGEgaW4gdGhlIHJlc3BvbnNlXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhtdXRhdGVkQXV0aERhdGEpLmZvckVhY2goKHByb3ZpZGVyKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucmVzcG9uc2UucmVzcG9uc2UuYXV0aERhdGFbcHJvdmlkZXJdID0gbXV0YXRlZEF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gUnVuIHRoZSBEQiB1cGRhdGUgZGlyZWN0bHksIGFzICdtYXN0ZXInXG4gICAgICAgICAgICAvLyBKdXN0IHVwZGF0ZSB0aGUgYXV0aERhdGEgcGFydFxuICAgICAgICAgICAgLy8gVGhlbiB3ZSdyZSBnb29kIGZvciB0aGUgdXNlciwgZWFybHkgZXhpdCBvZiBzb3J0c1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLnVwZGF0ZSh0aGlzLmNsYXNzTmFtZSwge29iamVjdElkOiB0aGlzLmRhdGEub2JqZWN0SWR9LCB7YXV0aERhdGE6IG11dGF0ZWRBdXRoRGF0YX0sIHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh1c2VySWQpIHtcbiAgICAgICAgLy8gVHJ5aW5nIHRvIHVwZGF0ZSBhdXRoIGRhdGEgYnV0IHVzZXJzXG4gICAgICAgIC8vIGFyZSBkaWZmZXJlbnRcbiAgICAgICAgaWYgKHVzZXJSZXN1bHQub2JqZWN0SWQgIT09IHVzZXJJZCkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5BQ0NPVU5UX0FMUkVBRFlfTElOS0VELFxuICAgICAgICAgICAgJ3RoaXMgYXV0aCBpcyBhbHJlYWR5IHVzZWQnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBhdXRoIGRhdGEgd2FzIG11dGF0ZWQsIGp1c3Qga2VlcCBnb2luZ1xuICAgICAgICBpZiAoIWhhc011dGF0ZWRBdXRoRGF0YSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5oYW5kbGVBdXRoRGF0YVZhbGlkYXRpb24oYXV0aERhdGEpO1xuICB9KTtcbn1cblxuXG4vLyBUaGUgbm9uLXRoaXJkLXBhcnR5IHBhcnRzIG9mIFVzZXIgdHJhbnNmb3JtYXRpb25cblJlc3RXcml0ZS5wcm90b3R5cGUudHJhbnNmb3JtVXNlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIGlmICh0aGlzLmNsYXNzTmFtZSAhPT0gJ19Vc2VyJykge1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgaWYgKCF0aGlzLmF1dGguaXNNYXN0ZXIgJiYgXCJlbWFpbFZlcmlmaWVkXCIgaW4gdGhpcy5kYXRhKSB7XG4gICAgY29uc3QgZXJyb3IgPSBgQ2xpZW50cyBhcmVuJ3QgYWxsb3dlZCB0byBtYW51YWxseSB1cGRhdGUgZW1haWwgdmVyaWZpY2F0aW9uLmBcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTiwgZXJyb3IpO1xuICB9XG5cbiAgLy8gRG8gbm90IGNsZWFudXAgc2Vzc2lvbiBpZiBvYmplY3RJZCBpcyBub3Qgc2V0XG4gIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMub2JqZWN0SWQoKSkge1xuICAgIC8vIElmIHdlJ3JlIHVwZGF0aW5nIGEgX1VzZXIgb2JqZWN0LCB3ZSBuZWVkIHRvIGNsZWFyIG91dCB0aGUgY2FjaGUgZm9yIHRoYXQgdXNlci4gRmluZCBhbGwgdGhlaXJcbiAgICAvLyBzZXNzaW9uIHRva2VucywgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIGNhY2hlLlxuICAgIHByb21pc2UgPSBuZXcgUmVzdFF1ZXJ5KHRoaXMuY29uZmlnLCBBdXRoLm1hc3Rlcih0aGlzLmNvbmZpZyksICdfU2Vzc2lvbicsIHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgX190eXBlOiBcIlBvaW50ZXJcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIl9Vc2VyXCIsXG4gICAgICAgIG9iamVjdElkOiB0aGlzLm9iamVjdElkKCksXG4gICAgICB9XG4gICAgfSkuZXhlY3V0ZSgpXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgcmVzdWx0cy5yZXN1bHRzLmZvckVhY2goc2Vzc2lvbiA9PiB0aGlzLmNvbmZpZy5jYWNoZUNvbnRyb2xsZXIudXNlci5kZWwoc2Vzc2lvbi5zZXNzaW9uVG9rZW4pKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgLy8gVHJhbnNmb3JtIHRoZSBwYXNzd29yZFxuICAgIGlmICh0aGlzLmRhdGEucGFzc3dvcmQgPT09IHVuZGVmaW5lZCkgeyAvLyBpZ25vcmUgb25seSBpZiB1bmRlZmluZWQuIHNob3VsZCBwcm9jZWVkIGlmIGVtcHR5ICgnJylcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWVyeSkge1xuICAgICAgdGhpcy5zdG9yYWdlWydjbGVhclNlc3Npb25zJ10gPSB0cnVlO1xuICAgICAgLy8gR2VuZXJhdGUgYSBuZXcgc2Vzc2lvbiBvbmx5IGlmIHRoZSB1c2VyIHJlcXVlc3RlZFxuICAgICAgaWYgKCF0aGlzLmF1dGguaXNNYXN0ZXIpIHtcbiAgICAgICAgdGhpcy5zdG9yYWdlWydnZW5lcmF0ZU5ld1Nlc3Npb24nXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlUGFzc3dvcmRQb2xpY3koKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBwYXNzd29yZENyeXB0by5oYXNoKHRoaXMuZGF0YS5wYXNzd29yZCkudGhlbigoaGFzaGVkUGFzc3dvcmQpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhLl9oYXNoZWRfcGFzc3dvcmQgPSBoYXNoZWRQYXNzd29yZDtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGF0YS5wYXNzd29yZDtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZVVzZXJOYW1lKCk7XG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZUVtYWlsKCk7XG4gIH0pO1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5fdmFsaWRhdGVVc2VyTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hlY2sgZm9yIHVzZXJuYW1lIHVuaXF1ZW5lc3NcbiAgaWYgKCF0aGlzLmRhdGEudXNlcm5hbWUpIHtcbiAgICBpZiAoIXRoaXMucXVlcnkpIHtcbiAgICAgIHRoaXMuZGF0YS51c2VybmFtZSA9IGNyeXB0b1V0aWxzLnJhbmRvbVN0cmluZygyNSk7XG4gICAgICB0aGlzLnJlc3BvbnNlU2hvdWxkSGF2ZVVzZXJuYW1lID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG4gIC8vIFdlIG5lZWQgdG8gYSBmaW5kIHRvIGNoZWNrIGZvciBkdXBsaWNhdGUgdXNlcm5hbWUgaW4gY2FzZSB0aGV5IGFyZSBtaXNzaW5nIHRoZSB1bmlxdWUgaW5kZXggb24gdXNlcm5hbWVzXG4gIC8vIFRPRE86IENoZWNrIGlmIHRoZXJlIGlzIGEgdW5pcXVlIGluZGV4LCBhbmQgaWYgc28sIHNraXAgdGhpcyBxdWVyeS5cbiAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgdGhpcy5jbGFzc05hbWUsXG4gICAge3VzZXJuYW1lOiB0aGlzLmRhdGEudXNlcm5hbWUsIG9iamVjdElkOiB7JyRuZSc6IHRoaXMub2JqZWN0SWQoKX19LFxuICAgIHtsaW1pdDogMX1cbiAgKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgIGlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5VU0VSTkFNRV9UQUtFTiwgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdXNlcm5hbWUuJyk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfSk7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLl92YWxpZGF0ZUVtYWlsID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5kYXRhLmVtYWlsIHx8IHRoaXMuZGF0YS5lbWFpbC5fX29wID09PSAnRGVsZXRlJykge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICAvLyBWYWxpZGF0ZSBiYXNpYyBlbWFpbCBhZGRyZXNzIGZvcm1hdFxuICBpZiAoIXRoaXMuZGF0YS5lbWFpbC5tYXRjaCgvXi4rQC4rJC8pKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0VNQUlMX0FERFJFU1MsICdFbWFpbCBhZGRyZXNzIGZvcm1hdCBpcyBpbnZhbGlkLicpKTtcbiAgfVxuICAvLyBTYW1lIHByb2JsZW0gZm9yIGVtYWlsIGFzIGFib3ZlIGZvciB1c2VybmFtZVxuICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UuZmluZChcbiAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICB7ZW1haWw6IHRoaXMuZGF0YS5lbWFpbCwgb2JqZWN0SWQ6IHsnJG5lJzogdGhpcy5vYmplY3RJZCgpfX0sXG4gICAge2xpbWl0OiAxfVxuICApLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkVNQUlMX1RBS0VOLCAnQWNjb3VudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBlbWFpbCBhZGRyZXNzLicpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhdGhpcy5kYXRhLmF1dGhEYXRhIHx8XG4gICAgICAhT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5sZW5ndGggfHxcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuZGF0YS5hdXRoRGF0YSkubGVuZ3RoID09PSAxICYmIE9iamVjdC5rZXlzKHRoaXMuZGF0YS5hdXRoRGF0YSlbMF0gPT09ICdhbm9ueW1vdXMnXG4gICAgKSB7XG4gICAgICAvLyBXZSB1cGRhdGVkIHRoZSBlbWFpbCwgc2VuZCBhIG5ldyB2YWxpZGF0aW9uXG4gICAgICB0aGlzLnN0b3JhZ2VbJ3NlbmRWZXJpZmljYXRpb25FbWFpbCddID0gdHJ1ZTtcbiAgICAgIHRoaXMuY29uZmlnLnVzZXJDb250cm9sbGVyLnNldEVtYWlsVmVyaWZ5VG9rZW4odGhpcy5kYXRhKTtcbiAgICB9XG4gIH0pO1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5fdmFsaWRhdGVQYXNzd29yZFBvbGljeSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5KVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlUGFzc3dvcmRSZXF1aXJlbWVudHMoKS50aGVuKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVQYXNzd29yZEhpc3RvcnkoKTtcbiAgfSk7XG59O1xuXG5cblJlc3RXcml0ZS5wcm90b3R5cGUuX3ZhbGlkYXRlUGFzc3dvcmRSZXF1aXJlbWVudHMgPSBmdW5jdGlvbigpIHtcbiAgLy8gY2hlY2sgaWYgdGhlIHBhc3N3b3JkIGNvbmZvcm1zIHRvIHRoZSBkZWZpbmVkIHBhc3N3b3JkIHBvbGljeSBpZiBjb25maWd1cmVkXG4gIGNvbnN0IHBvbGljeUVycm9yID0gJ1Bhc3N3b3JkIGRvZXMgbm90IG1lZXQgdGhlIFBhc3N3b3JkIFBvbGljeSByZXF1aXJlbWVudHMuJztcblxuICAvLyBjaGVjayB3aGV0aGVyIHRoZSBwYXNzd29yZCBtZWV0cyB0aGUgcGFzc3dvcmQgc3RyZW5ndGggcmVxdWlyZW1lbnRzXG4gIGlmICh0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5wYXR0ZXJuVmFsaWRhdG9yICYmICF0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5wYXR0ZXJuVmFsaWRhdG9yKHRoaXMuZGF0YS5wYXNzd29yZCkgfHxcbiAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS52YWxpZGF0b3JDYWxsYmFjayAmJiAhdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kudmFsaWRhdG9yQ2FsbGJhY2sodGhpcy5kYXRhLnBhc3N3b3JkKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVkFMSURBVElPTl9FUlJPUiwgcG9saWN5RXJyb3IpKTtcbiAgfVxuXG4gIC8vIGNoZWNrIHdoZXRoZXIgcGFzc3dvcmQgY29udGFpbiB1c2VybmFtZVxuICBpZiAodGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kuZG9Ob3RBbGxvd1VzZXJuYW1lID09PSB0cnVlKSB7XG4gICAgaWYgKHRoaXMuZGF0YS51c2VybmFtZSkgeyAvLyB1c2VybmFtZSBpcyBub3QgcGFzc2VkIGR1cmluZyBwYXNzd29yZCByZXNldFxuICAgICAgaWYgKHRoaXMuZGF0YS5wYXNzd29yZC5pbmRleE9mKHRoaXMuZGF0YS51c2VybmFtZSkgPj0gMClcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLCBwb2xpY3lFcnJvcikpO1xuICAgIH0gZWxzZSB7IC8vIHJldHJpZXZlIHRoZSBVc2VyIG9iamVjdCB1c2luZyBvYmplY3RJZCBkdXJpbmcgcGFzc3dvcmQgcmVzZXRcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS5maW5kKCdfVXNlcicsIHtvYmplY3RJZDogdGhpcy5vYmplY3RJZCgpfSlcbiAgICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuZGF0YS5wYXNzd29yZC5pbmRleE9mKHJlc3VsdHNbMF0udXNlcm5hbWUpID49IDApXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLlZBTElEQVRJT05fRVJST1IsIHBvbGljeUVycm9yKSk7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5fdmFsaWRhdGVQYXNzd29yZEhpc3RvcnkgPSBmdW5jdGlvbigpIHtcbiAgLy8gY2hlY2sgd2hldGhlciBwYXNzd29yZCBpcyByZXBlYXRpbmcgZnJvbSBzcGVjaWZpZWQgaGlzdG9yeVxuICBpZiAodGhpcy5xdWVyeSAmJiB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3RvcnkpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UuZmluZCgnX1VzZXInLCB7b2JqZWN0SWQ6IHRoaXMub2JqZWN0SWQoKX0sIHtrZXlzOiBbXCJfcGFzc3dvcmRfaGlzdG9yeVwiLCBcIl9oYXNoZWRfcGFzc3dvcmRcIl19KVxuICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVzZXIgPSByZXN1bHRzWzBdO1xuICAgICAgICBsZXQgb2xkUGFzc3dvcmRzID0gW107XG4gICAgICAgIGlmICh1c2VyLl9wYXNzd29yZF9oaXN0b3J5KVxuICAgICAgICAgIG9sZFBhc3N3b3JkcyA9IF8udGFrZSh1c2VyLl9wYXNzd29yZF9oaXN0b3J5LCB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3RvcnkgLSAxKTtcbiAgICAgICAgb2xkUGFzc3dvcmRzLnB1c2godXNlci5wYXNzd29yZCk7XG4gICAgICAgIGNvbnN0IG5ld1Bhc3N3b3JkID0gdGhpcy5kYXRhLnBhc3N3b3JkO1xuICAgICAgICAvLyBjb21wYXJlIHRoZSBuZXcgcGFzc3dvcmQgaGFzaCB3aXRoIGFsbCBvbGQgcGFzc3dvcmQgaGFzaGVzXG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gb2xkUGFzc3dvcmRzLm1hcChmdW5jdGlvbiAoaGFzaCkge1xuICAgICAgICAgIHJldHVybiBwYXNzd29yZENyeXB0by5jb21wYXJlKG5ld1Bhc3N3b3JkLCBoYXNoKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIC8vIHJlamVjdCBpZiB0aGVyZSBpcyBhIG1hdGNoXG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIlJFUEVBVF9QQVNTV09SRFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gd2FpdCBmb3IgYWxsIGNvbXBhcmlzb25zIHRvIGNvbXBsZXRlXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGlmIChlcnIgPT09IFwiUkVQRUFUX1BBU1NXT1JEXCIpIC8vIGEgbWF0Y2ggd2FzIGZvdW5kXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLlZBTElEQVRJT05fRVJST1IsIGBOZXcgcGFzc3dvcmQgc2hvdWxkIG5vdCBiZSB0aGUgc2FtZSBhcyBsYXN0ICR7dGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRIaXN0b3J5fSBwYXNzd29yZHMuYCkpO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmNyZWF0ZVNlc3Npb25Ub2tlbklmTmVlZGVkID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLmNsYXNzTmFtZSAhPT0gJ19Vc2VyJykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodGhpcy5xdWVyeSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXRoaXMuc3RvcmFnZVsnYXV0aFByb3ZpZGVyJ10gLy8gc2lnbnVwIGNhbGwsIHdpdGhcbiAgICAgICYmIHRoaXMuY29uZmlnLnByZXZlbnRMb2dpbldpdGhVbnZlcmlmaWVkRW1haWwgLy8gbm8gbG9naW4gd2l0aG91dCB2ZXJpZmljYXRpb25cbiAgICAgICYmIHRoaXMuY29uZmlnLnZlcmlmeVVzZXJFbWFpbHMpIHsgLy8gdmVyaWZpY2F0aW9uIGlzIG9uXG4gICAgcmV0dXJuOyAvLyBkbyBub3QgY3JlYXRlIHRoZSBzZXNzaW9uIHRva2VuIGluIHRoYXQgY2FzZSFcbiAgfVxuICByZXR1cm4gdGhpcy5jcmVhdGVTZXNzaW9uVG9rZW4oKTtcbn1cblxuUmVzdFdyaXRlLnByb3RvdHlwZS5jcmVhdGVTZXNzaW9uVG9rZW4gPSBmdW5jdGlvbigpIHtcbiAgLy8gY2xvdWQgaW5zdGFsbGF0aW9uSWQgZnJvbSBDbG91ZCBDb2RlLFxuICAvLyBuZXZlciBjcmVhdGUgc2Vzc2lvbiB0b2tlbnMgZnJvbSB0aGVyZS5cbiAgaWYgKHRoaXMuYXV0aC5pbnN0YWxsYXRpb25JZCAmJiB0aGlzLmF1dGguaW5zdGFsbGF0aW9uSWQgPT09ICdjbG91ZCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgc2Vzc2lvbkRhdGEsXG4gICAgY3JlYXRlU2Vzc2lvbixcbiAgfSA9IEF1dGguY3JlYXRlU2Vzc2lvbih0aGlzLmNvbmZpZywge1xuICAgIHVzZXJJZDogdGhpcy5vYmplY3RJZCgpLFxuICAgIGNyZWF0ZWRXaXRoOiB7XG4gICAgICAnYWN0aW9uJzogdGhpcy5zdG9yYWdlWydhdXRoUHJvdmlkZXInXSA/ICdsb2dpbicgOiAnc2lnbnVwJyxcbiAgICAgICdhdXRoUHJvdmlkZXInOiB0aGlzLnN0b3JhZ2VbJ2F1dGhQcm92aWRlciddIHx8ICdwYXNzd29yZCdcbiAgICB9LFxuICAgIGluc3RhbGxhdGlvbklkOiB0aGlzLmF1dGguaW5zdGFsbGF0aW9uSWQsXG4gIH0pO1xuXG4gIGlmICh0aGlzLnJlc3BvbnNlICYmIHRoaXMucmVzcG9uc2UucmVzcG9uc2UpIHtcbiAgICB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlLnNlc3Npb25Ub2tlbiA9IHNlc3Npb25EYXRhLnNlc3Npb25Ub2tlbjtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVTZXNzaW9uKCk7XG59XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuZGVzdHJveUR1cGxpY2F0ZWRTZXNzaW9ucyA9IGZ1bmN0aW9uKCkge1xuICAvLyBPbmx5IGZvciBfU2Vzc2lvbiwgYW5kIGF0IGNyZWF0aW9uIHRpbWVcbiAgaWYgKHRoaXMuY2xhc3NOYW1lICE9ICdfU2Vzc2lvbicgfHwgdGhpcy5xdWVyeSkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBEZXN0cm95IHRoZSBzZXNzaW9ucyBpbiAnQmFja2dyb3VuZCdcbiAgY29uc3Qge1xuICAgIHVzZXIsXG4gICAgaW5zdGFsbGF0aW9uSWQsXG4gICAgc2Vzc2lvblRva2VuLFxuICB9ID0gdGhpcy5kYXRhO1xuICBpZiAoIXVzZXIgfHwgIWluc3RhbGxhdGlvbklkKSAge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXVzZXIub2JqZWN0SWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGVzdHJveSgnX1Nlc3Npb24nLCB7XG4gICAgdXNlcixcbiAgICBpbnN0YWxsYXRpb25JZCxcbiAgICBzZXNzaW9uVG9rZW46IHsgJyRuZSc6IHNlc3Npb25Ub2tlbiB9LFxuICB9KTtcbn1cblxuLy8gSGFuZGxlcyBhbnkgZm9sbG93dXAgbG9naWNcblJlc3RXcml0ZS5wcm90b3R5cGUuaGFuZGxlRm9sbG93dXAgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuc3RvcmFnZSAmJiB0aGlzLnN0b3JhZ2VbJ2NsZWFyU2Vzc2lvbnMnXSAmJiB0aGlzLmNvbmZpZy5yZXZva2VTZXNzaW9uT25QYXNzd29yZFJlc2V0KSB7XG4gICAgdmFyIHNlc3Npb25RdWVyeSA9IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgIGNsYXNzTmFtZTogJ19Vc2VyJyxcbiAgICAgICAgb2JqZWN0SWQ6IHRoaXMub2JqZWN0SWQoKVxuICAgICAgfVxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuc3RvcmFnZVsnY2xlYXJTZXNzaW9ucyddO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZXN0cm95KCdfU2Vzc2lvbicsIHNlc3Npb25RdWVyeSlcbiAgICAgIC50aGVuKHRoaXMuaGFuZGxlRm9sbG93dXAuYmluZCh0aGlzKSk7XG4gIH1cblxuICBpZiAodGhpcy5zdG9yYWdlICYmIHRoaXMuc3RvcmFnZVsnZ2VuZXJhdGVOZXdTZXNzaW9uJ10pIHtcbiAgICBkZWxldGUgdGhpcy5zdG9yYWdlWydnZW5lcmF0ZU5ld1Nlc3Npb24nXTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTZXNzaW9uVG9rZW4oKVxuICAgICAgLnRoZW4odGhpcy5oYW5kbGVGb2xsb3d1cC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGlmICh0aGlzLnN0b3JhZ2UgJiYgdGhpcy5zdG9yYWdlWydzZW5kVmVyaWZpY2F0aW9uRW1haWwnXSkge1xuICAgIGRlbGV0ZSB0aGlzLnN0b3JhZ2VbJ3NlbmRWZXJpZmljYXRpb25FbWFpbCddO1xuICAgIC8vIEZpcmUgYW5kIGZvcmdldCFcbiAgICB0aGlzLmNvbmZpZy51c2VyQ29udHJvbGxlci5zZW5kVmVyaWZpY2F0aW9uRW1haWwodGhpcy5kYXRhKTtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVGb2xsb3d1cC5iaW5kKHRoaXMpO1xuICB9XG59O1xuXG4vLyBIYW5kbGVzIHRoZSBfU2Vzc2lvbiBjbGFzcyBzcGVjaWFsbmVzcy5cbi8vIERvZXMgbm90aGluZyBpZiB0aGlzIGlzbid0IGFuIF9TZXNzaW9uIG9iamVjdC5cblJlc3RXcml0ZS5wcm90b3R5cGUuaGFuZGxlU2Vzc2lvbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5yZXNwb25zZSB8fCB0aGlzLmNsYXNzTmFtZSAhPT0gJ19TZXNzaW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghdGhpcy5hdXRoLnVzZXIgJiYgIXRoaXMuYXV0aC5pc01hc3Rlcikge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1NFU1NJT05fVE9LRU4sXG4gICAgICAnU2Vzc2lvbiB0b2tlbiByZXF1aXJlZC4nKTtcbiAgfVxuXG4gIC8vIFRPRE86IFZlcmlmeSBwcm9wZXIgZXJyb3IgdG8gdGhyb3dcbiAgaWYgKHRoaXMuZGF0YS5BQ0wpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSwgJ0Nhbm5vdCBzZXQgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdBQ0wgb24gYSBTZXNzaW9uLicpO1xuICB9XG5cbiAgaWYgKHRoaXMucXVlcnkpIHtcbiAgICBpZiAodGhpcy5kYXRhLnVzZXIgJiYgIXRoaXMuYXV0aC5pc01hc3RlciAmJiB0aGlzLmRhdGEudXNlci5vYmplY3RJZCAhPSB0aGlzLmF1dGgudXNlci5pZCkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLmluc3RhbGxhdGlvbklkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEuc2Vzc2lvblRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0aGlzLnF1ZXJ5ICYmICF0aGlzLmF1dGguaXNNYXN0ZXIpIHtcbiAgICBjb25zdCBhZGRpdGlvbmFsU2Vzc2lvbkRhdGEgPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5kYXRhKSB7XG4gICAgICBpZiAoa2V5ID09PSAnb2JqZWN0SWQnIHx8IGtleSA9PT0gJ3VzZXInKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYWRkaXRpb25hbFNlc3Npb25EYXRhW2tleV0gPSB0aGlzLmRhdGFba2V5XTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHNlc3Npb25EYXRhLCBjcmVhdGVTZXNzaW9uIH0gPSBBdXRoLmNyZWF0ZVNlc3Npb24odGhpcy5jb25maWcsIHtcbiAgICAgIHVzZXJJZDogdGhpcy5hdXRoLnVzZXIuaWQsXG4gICAgICBjcmVhdGVkV2l0aDoge1xuICAgICAgICBhY3Rpb246ICdjcmVhdGUnLFxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxTZXNzaW9uRGF0YVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNyZWF0ZVNlc3Npb24oKS50aGVuKChyZXN1bHRzKSA9PiB7XG4gICAgICBpZiAoIXJlc3VsdHMucmVzcG9uc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgICAgICAgICAnRXJyb3IgY3JlYXRpbmcgc2Vzc2lvbi4nKTtcbiAgICAgIH1cbiAgICAgIHNlc3Npb25EYXRhWydvYmplY3RJZCddID0gcmVzdWx0cy5yZXNwb25zZVsnb2JqZWN0SWQnXTtcbiAgICAgIHRoaXMucmVzcG9uc2UgPSB7XG4gICAgICAgIHN0YXR1czogMjAxLFxuICAgICAgICBsb2NhdGlvbjogcmVzdWx0cy5sb2NhdGlvbixcbiAgICAgICAgcmVzcG9uc2U6IHNlc3Npb25EYXRhXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59O1xuXG4vLyBIYW5kbGVzIHRoZSBfSW5zdGFsbGF0aW9uIGNsYXNzIHNwZWNpYWxuZXNzLlxuLy8gRG9lcyBub3RoaW5nIGlmIHRoaXMgaXNuJ3QgYW4gaW5zdGFsbGF0aW9uIG9iamVjdC5cbi8vIElmIGFuIGluc3RhbGxhdGlvbiBpcyBmb3VuZCwgdGhpcyBjYW4gbXV0YXRlIHRoaXMucXVlcnkgYW5kIHR1cm4gYSBjcmVhdGVcbi8vIGludG8gYW4gdXBkYXRlLlxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHdoZW4gd2UncmUgZG9uZSBpZiBpdCBjYW4ndCBmaW5pc2ggdGhpcyB0aWNrLlxuUmVzdFdyaXRlLnByb3RvdHlwZS5oYW5kbGVJbnN0YWxsYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMucmVzcG9uc2UgfHwgdGhpcy5jbGFzc05hbWUgIT09ICdfSW5zdGFsbGF0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghdGhpcy5xdWVyeSAmJiAhdGhpcy5kYXRhLmRldmljZVRva2VuICYmICF0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQgJiYgIXRoaXMuYXV0aC5pbnN0YWxsYXRpb25JZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxMzUsXG4gICAgICAnYXQgbGVhc3Qgb25lIElEIGZpZWxkIChkZXZpY2VUb2tlbiwgaW5zdGFsbGF0aW9uSWQpICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnbXVzdCBiZSBzcGVjaWZpZWQgaW4gdGhpcyBvcGVyYXRpb24nKTtcbiAgfVxuXG4gIC8vIElmIHRoZSBkZXZpY2UgdG9rZW4gaXMgNjQgY2hhcmFjdGVycyBsb25nLCB3ZSBhc3N1bWUgaXQgaXMgZm9yIGlPU1xuICAvLyBhbmQgbG93ZXJjYXNlIGl0LlxuICBpZiAodGhpcy5kYXRhLmRldmljZVRva2VuICYmIHRoaXMuZGF0YS5kZXZpY2VUb2tlbi5sZW5ndGggPT0gNjQpIHtcbiAgICB0aGlzLmRhdGEuZGV2aWNlVG9rZW4gPSB0aGlzLmRhdGEuZGV2aWNlVG9rZW4udG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8vIFdlIGxvd2VyY2FzZSB0aGUgaW5zdGFsbGF0aW9uSWQgaWYgcHJlc2VudFxuICBpZiAodGhpcy5kYXRhLmluc3RhbGxhdGlvbklkKSB7XG4gICAgdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkID0gdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBsZXQgaW5zdGFsbGF0aW9uSWQgPSB0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQ7XG5cbiAgLy8gSWYgZGF0YS5pbnN0YWxsYXRpb25JZCBpcyBub3Qgc2V0IGFuZCB3ZSdyZSBub3QgbWFzdGVyLCB3ZSBjYW4gbG9va3VwIGluIGF1dGhcbiAgaWYgKCFpbnN0YWxsYXRpb25JZCAmJiAhdGhpcy5hdXRoLmlzTWFzdGVyKSB7XG4gICAgaW5zdGFsbGF0aW9uSWQgPSB0aGlzLmF1dGguaW5zdGFsbGF0aW9uSWQ7XG4gIH1cblxuICBpZiAoaW5zdGFsbGF0aW9uSWQpIHtcbiAgICBpbnN0YWxsYXRpb25JZCA9IGluc3RhbGxhdGlvbklkLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICAvLyBVcGRhdGluZyBfSW5zdGFsbGF0aW9uIGJ1dCBub3QgdXBkYXRpbmcgYW55dGhpbmcgY3JpdGljYWxcbiAgaWYgKHRoaXMucXVlcnkgJiYgIXRoaXMuZGF0YS5kZXZpY2VUb2tlblxuICAgICAgICAgICAgICAgICAgJiYgIWluc3RhbGxhdGlvbklkICYmICF0aGlzLmRhdGEuZGV2aWNlVHlwZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgdmFyIGlkTWF0Y2g7IC8vIFdpbGwgYmUgYSBtYXRjaCBvbiBlaXRoZXIgb2JqZWN0SWQgb3IgaW5zdGFsbGF0aW9uSWRcbiAgdmFyIG9iamVjdElkTWF0Y2g7XG4gIHZhciBpbnN0YWxsYXRpb25JZE1hdGNoO1xuICB2YXIgZGV2aWNlVG9rZW5NYXRjaGVzID0gW107XG5cbiAgLy8gSW5zdGVhZCBvZiBpc3N1aW5nIDMgcmVhZHMsIGxldCdzIGRvIGl0IHdpdGggb25lIE9SLlxuICBjb25zdCBvclF1ZXJpZXMgPSBbXTtcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgIG9yUXVlcmllcy5wdXNoKHtcbiAgICAgIG9iamVjdElkOiB0aGlzLnF1ZXJ5Lm9iamVjdElkXG4gICAgfSk7XG4gIH1cbiAgaWYgKGluc3RhbGxhdGlvbklkKSB7XG4gICAgb3JRdWVyaWVzLnB1c2goe1xuICAgICAgJ2luc3RhbGxhdGlvbklkJzogaW5zdGFsbGF0aW9uSWRcbiAgICB9KTtcbiAgfVxuICBpZiAodGhpcy5kYXRhLmRldmljZVRva2VuKSB7XG4gICAgb3JRdWVyaWVzLnB1c2goeydkZXZpY2VUb2tlbic6IHRoaXMuZGF0YS5kZXZpY2VUb2tlbn0pO1xuICB9XG5cbiAgaWYgKG9yUXVlcmllcy5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb21pc2UgPSBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS5maW5kKCdfSW5zdGFsbGF0aW9uJywge1xuICAgICAgJyRvcic6IG9yUXVlcmllc1xuICAgIH0sIHt9KTtcbiAgfSkudGhlbigocmVzdWx0cykgPT4ge1xuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAodGhpcy5xdWVyeSAmJiB0aGlzLnF1ZXJ5Lm9iamVjdElkICYmIHJlc3VsdC5vYmplY3RJZCA9PSB0aGlzLnF1ZXJ5Lm9iamVjdElkKSB7XG4gICAgICAgIG9iamVjdElkTWF0Y2ggPSByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0Lmluc3RhbGxhdGlvbklkID09IGluc3RhbGxhdGlvbklkKSB7XG4gICAgICAgIGluc3RhbGxhdGlvbklkTWF0Y2ggPSByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0LmRldmljZVRva2VuID09IHRoaXMuZGF0YS5kZXZpY2VUb2tlbikge1xuICAgICAgICBkZXZpY2VUb2tlbk1hdGNoZXMucHVzaChyZXN1bHQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU2FuaXR5IGNoZWNrcyB3aGVuIHJ1bm5pbmcgYSBxdWVyeVxuICAgIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMucXVlcnkub2JqZWN0SWQpIHtcbiAgICAgIGlmICghb2JqZWN0SWRNYXRjaCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgICAgICAnT2JqZWN0IG5vdCBmb3VuZCBmb3IgdXBkYXRlLicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCAmJiBvYmplY3RJZE1hdGNoLmluc3RhbGxhdGlvbklkICYmXG4gICAgICAgICAgdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkICE9PSBvYmplY3RJZE1hdGNoLmluc3RhbGxhdGlvbklkKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxMzYsXG4gICAgICAgICAgJ2luc3RhbGxhdGlvbklkIG1heSBub3QgYmUgY2hhbmdlZCBpbiB0aGlzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3BlcmF0aW9uJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kYXRhLmRldmljZVRva2VuICYmIG9iamVjdElkTWF0Y2guZGV2aWNlVG9rZW4gJiZcbiAgICAgICAgICB0aGlzLmRhdGEuZGV2aWNlVG9rZW4gIT09IG9iamVjdElkTWF0Y2guZGV2aWNlVG9rZW4gJiZcbiAgICAgICAgICAhdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkICYmICFvYmplY3RJZE1hdGNoLmluc3RhbGxhdGlvbklkKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxMzYsXG4gICAgICAgICAgJ2RldmljZVRva2VuIG1heSBub3QgYmUgY2hhbmdlZCBpbiB0aGlzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3BlcmF0aW9uJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kYXRhLmRldmljZVR5cGUgJiYgdGhpcy5kYXRhLmRldmljZVR5cGUgJiZcbiAgICAgICAgICB0aGlzLmRhdGEuZGV2aWNlVHlwZSAhPT0gb2JqZWN0SWRNYXRjaC5kZXZpY2VUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxMzYsXG4gICAgICAgICAgJ2RldmljZVR5cGUgbWF5IG5vdCBiZSBjaGFuZ2VkIGluIHRoaXMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcGVyYXRpb24nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWVyeSAmJiB0aGlzLnF1ZXJ5Lm9iamVjdElkICYmIG9iamVjdElkTWF0Y2gpIHtcbiAgICAgIGlkTWF0Y2ggPSBvYmplY3RJZE1hdGNoO1xuICAgIH1cblxuICAgIGlmIChpbnN0YWxsYXRpb25JZCAmJiBpbnN0YWxsYXRpb25JZE1hdGNoKSB7XG4gICAgICBpZE1hdGNoID0gaW5zdGFsbGF0aW9uSWRNYXRjaDtcbiAgICB9XG4gICAgLy8gbmVlZCB0byBzcGVjaWZ5IGRldmljZVR5cGUgb25seSBpZiBpdCdzIG5ld1xuICAgIGlmICghdGhpcy5xdWVyeSAmJiAhdGhpcy5kYXRhLmRldmljZVR5cGUgJiYgIWlkTWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxMzUsXG4gICAgICAgICdkZXZpY2VUeXBlIG11c3QgYmUgc3BlY2lmaWVkIGluIHRoaXMgb3BlcmF0aW9uJyk7XG4gICAgfVxuXG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIGlmICghaWRNYXRjaCkge1xuICAgICAgaWYgKCFkZXZpY2VUb2tlbk1hdGNoZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoZGV2aWNlVG9rZW5NYXRjaGVzLmxlbmd0aCA9PSAxICYmXG4gICAgICAgICghZGV2aWNlVG9rZW5NYXRjaGVzWzBdWydpbnN0YWxsYXRpb25JZCddIHx8ICFpbnN0YWxsYXRpb25JZClcbiAgICAgICkge1xuICAgICAgICAvLyBTaW5nbGUgbWF0Y2ggb24gZGV2aWNlIHRva2VuIGJ1dCBub25lIG9uIGluc3RhbGxhdGlvbklkLCBhbmQgZWl0aGVyXG4gICAgICAgIC8vIHRoZSBwYXNzZWQgb2JqZWN0IG9yIHRoZSBtYXRjaCBpcyBtaXNzaW5nIGFuIGluc3RhbGxhdGlvbklkLCBzbyB3ZVxuICAgICAgICAvLyBjYW4ganVzdCByZXR1cm4gdGhlIG1hdGNoLlxuICAgICAgICByZXR1cm4gZGV2aWNlVG9rZW5NYXRjaGVzWzBdWydvYmplY3RJZCddO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxMzIsXG4gICAgICAgICAgJ011c3Qgc3BlY2lmeSBpbnN0YWxsYXRpb25JZCB3aGVuIGRldmljZVRva2VuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hdGNoZXMgbXVsdGlwbGUgSW5zdGFsbGF0aW9uIG9iamVjdHMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE11bHRpcGxlIGRldmljZSB0b2tlbiBtYXRjaGVzIGFuZCB3ZSBzcGVjaWZpZWQgYW4gaW5zdGFsbGF0aW9uIElELFxuICAgICAgICAvLyBvciBhIHNpbmdsZSBtYXRjaCB3aGVyZSBib3RoIHRoZSBwYXNzZWQgYW5kIG1hdGNoaW5nIG9iamVjdHMgaGF2ZVxuICAgICAgICAvLyBhbiBpbnN0YWxsYXRpb24gSUQuIFRyeSBjbGVhbmluZyBvdXQgb2xkIGluc3RhbGxhdGlvbnMgdGhhdCBtYXRjaFxuICAgICAgICAvLyB0aGUgZGV2aWNlVG9rZW4sIGFuZCByZXR1cm4gbmlsIHRvIHNpZ25hbCB0aGF0IGEgbmV3IG9iamVjdCBzaG91bGRcbiAgICAgICAgLy8gYmUgY3JlYXRlZC5cbiAgICAgICAgdmFyIGRlbFF1ZXJ5ID0ge1xuICAgICAgICAgICdkZXZpY2VUb2tlbic6IHRoaXMuZGF0YS5kZXZpY2VUb2tlbixcbiAgICAgICAgICAnaW5zdGFsbGF0aW9uSWQnOiB7XG4gICAgICAgICAgICAnJG5lJzogaW5zdGFsbGF0aW9uSWRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEuYXBwSWRlbnRpZmllcikge1xuICAgICAgICAgIGRlbFF1ZXJ5WydhcHBJZGVudGlmaWVyJ10gPSB0aGlzLmRhdGEuYXBwSWRlbnRpZmllcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZXN0cm95KCdfSW5zdGFsbGF0aW9uJywgZGVsUXVlcnkpXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT0gUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCkge1xuICAgICAgICAgICAgICAvLyBubyBkZWxldGlvbnMgd2VyZSBtYWRlLiBDYW4gYmUgaWdub3JlZC5cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmV0aHJvdyB0aGUgZXJyb3JcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGV2aWNlVG9rZW5NYXRjaGVzLmxlbmd0aCA9PSAxICYmXG4gICAgICAgICFkZXZpY2VUb2tlbk1hdGNoZXNbMF1bJ2luc3RhbGxhdGlvbklkJ10pIHtcbiAgICAgICAgLy8gRXhhY3RseSBvbmUgZGV2aWNlIHRva2VuIG1hdGNoIGFuZCBpdCBkb2Vzbid0IGhhdmUgYW4gaW5zdGFsbGF0aW9uXG4gICAgICAgIC8vIElELiBUaGlzIGlzIHRoZSBvbmUgY2FzZSB3aGVyZSB3ZSB3YW50IHRvIG1lcmdlIHdpdGggdGhlIGV4aXN0aW5nXG4gICAgICAgIC8vIG9iamVjdC5cbiAgICAgICAgY29uc3QgZGVsUXVlcnkgPSB7b2JqZWN0SWQ6IGlkTWF0Y2gub2JqZWN0SWR9O1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UuZGVzdHJveSgnX0luc3RhbGxhdGlvbicsIGRlbFF1ZXJ5KVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkZXZpY2VUb2tlbk1hdGNoZXNbMF1bJ29iamVjdElkJ107XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIuY29kZSA9PSBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5EKSB7XG4gICAgICAgICAgICAgIC8vIG5vIGRlbGV0aW9ucyB3ZXJlIG1hZGUuIENhbiBiZSBpZ25vcmVkXG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJldGhyb3cgdGhlIGVycm9yXG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5kYXRhLmRldmljZVRva2VuICYmXG4gICAgICAgICAgaWRNYXRjaC5kZXZpY2VUb2tlbiAhPSB0aGlzLmRhdGEuZGV2aWNlVG9rZW4pIHtcbiAgICAgICAgICAvLyBXZSdyZSBzZXR0aW5nIHRoZSBkZXZpY2UgdG9rZW4gb24gYW4gZXhpc3RpbmcgaW5zdGFsbGF0aW9uLCBzb1xuICAgICAgICAgIC8vIHdlIHNob3VsZCB0cnkgY2xlYW5pbmcgb3V0IG9sZCBpbnN0YWxsYXRpb25zIHRoYXQgbWF0Y2ggdGhpc1xuICAgICAgICAgIC8vIGRldmljZSB0b2tlbi5cbiAgICAgICAgICBjb25zdCBkZWxRdWVyeSA9IHtcbiAgICAgICAgICAgICdkZXZpY2VUb2tlbic6IHRoaXMuZGF0YS5kZXZpY2VUb2tlbixcbiAgICAgICAgICB9O1xuICAgICAgICAgIC8vIFdlIGhhdmUgYSB1bmlxdWUgaW5zdGFsbCBJZCwgdXNlIHRoYXQgdG8gcHJlc2VydmVcbiAgICAgICAgICAvLyB0aGUgaW50ZXJlc3RpbmcgaW5zdGFsbGF0aW9uXG4gICAgICAgICAgaWYgKHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCkge1xuICAgICAgICAgICAgZGVsUXVlcnlbJ2luc3RhbGxhdGlvbklkJ10gPSB7XG4gICAgICAgICAgICAgICckbmUnOiB0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGlkTWF0Y2gub2JqZWN0SWQgJiYgdGhpcy5kYXRhLm9iamVjdElkXG4gICAgICAgICAgICAgICAgICAgICYmIGlkTWF0Y2gub2JqZWN0SWQgPT0gdGhpcy5kYXRhLm9iamVjdElkKSB7XG4gICAgICAgICAgICAvLyB3ZSBwYXNzZWQgYW4gb2JqZWN0SWQsIHByZXNlcnZlIHRoYXQgaW5zdGFsYXRpb25cbiAgICAgICAgICAgIGRlbFF1ZXJ5WydvYmplY3RJZCddID0ge1xuICAgICAgICAgICAgICAnJG5lJzogaWRNYXRjaC5vYmplY3RJZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBXaGF0IHRvIGRvIGhlcmU/IGNhbid0IHJlYWxseSBjbGVhbiB1cCBldmVyeXRoaW5nLi4uXG4gICAgICAgICAgICByZXR1cm4gaWRNYXRjaC5vYmplY3RJZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuZGF0YS5hcHBJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBkZWxRdWVyeVsnYXBwSWRlbnRpZmllciddID0gdGhpcy5kYXRhLmFwcElkZW50aWZpZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlc3Ryb3koJ19JbnN0YWxsYXRpb24nLCBkZWxRdWVyeSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT0gUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCkge1xuICAgICAgICAgICAgICAgIC8vIG5vIGRlbGV0aW9ucyB3ZXJlIG1hZGUuIENhbiBiZSBpZ25vcmVkLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyByZXRocm93IHRoZSBlcnJvclxuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbiBub24tbWVyZ2Ugc2NlbmFyaW9zLCBqdXN0IHJldHVybiB0aGUgaW5zdGFsbGF0aW9uIG1hdGNoIGlkXG4gICAgICAgIHJldHVybiBpZE1hdGNoLm9iamVjdElkO1xuICAgICAgfVxuICAgIH1cbiAgfSkudGhlbigob2JqSWQpID0+IHtcbiAgICBpZiAob2JqSWQpIHtcbiAgICAgIHRoaXMucXVlcnkgPSB7b2JqZWN0SWQ6IG9iaklkfTtcbiAgICAgIGRlbGV0ZSB0aGlzLmRhdGEub2JqZWN0SWQ7XG4gICAgICBkZWxldGUgdGhpcy5kYXRhLmNyZWF0ZWRBdDtcbiAgICB9XG4gICAgLy8gVE9ETzogVmFsaWRhdGUgb3BzIChhZGQvcmVtb3ZlIG9uIGNoYW5uZWxzLCAkaW5jIG9uIGJhZGdlLCBldGMuKVxuICB9KTtcbiAgcmV0dXJuIHByb21pc2U7XG59O1xuXG4vLyBJZiB3ZSBzaG9ydC1jaXJjdXRlZCB0aGUgb2JqZWN0IHJlc3BvbnNlIC0gdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBleHBhbmQgYWxsIHRoZSBmaWxlcyxcbi8vIHNpbmNlIHRoaXMgbWlnaHQgbm90IGhhdmUgYSBxdWVyeSwgbWVhbmluZyBpdCB3b24ndCByZXR1cm4gdGhlIGZ1bGwgcmVzdWx0IGJhY2suXG4vLyBUT0RPOiAobmx1dHNlbmtvKSBUaGlzIHNob3VsZCBkaWUgd2hlbiB3ZSBtb3ZlIHRvIHBlci1jbGFzcyBiYXNlZCBjb250cm9sbGVycyBvbiBfU2Vzc2lvbi9fVXNlclxuUmVzdFdyaXRlLnByb3RvdHlwZS5leHBhbmRGaWxlc0ZvckV4aXN0aW5nT2JqZWN0cyA9IGZ1bmN0aW9uKCkge1xuICAvLyBDaGVjayB3aGV0aGVyIHdlIGhhdmUgYSBzaG9ydC1jaXJjdWl0ZWQgcmVzcG9uc2UgLSBvbmx5IHRoZW4gcnVuIGV4cGFuc2lvbi5cbiAgaWYgKHRoaXMucmVzcG9uc2UgJiYgdGhpcy5yZXNwb25zZS5yZXNwb25zZSkge1xuICAgIHRoaXMuY29uZmlnLmZpbGVzQ29udHJvbGxlci5leHBhbmRGaWxlc0luT2JqZWN0KHRoaXMuY29uZmlnLCB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlKTtcbiAgfVxufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5ydW5EYXRhYmFzZU9wZXJhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0aGlzLmNsYXNzTmFtZSA9PT0gJ19Sb2xlJykge1xuICAgIHRoaXMuY29uZmlnLmNhY2hlQ29udHJvbGxlci5yb2xlLmNsZWFyKCk7XG4gIH1cblxuICBpZiAodGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicgJiZcbiAgICAgIHRoaXMucXVlcnkgJiZcbiAgICAgIHRoaXMuYXV0aC5pc1VuYXV0aGVudGljYXRlZCgpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLlNFU1NJT05fTUlTU0lORywgYENhbm5vdCBtb2RpZnkgdXNlciAke3RoaXMucXVlcnkub2JqZWN0SWR9LmApO1xuICB9XG5cbiAgaWYgKHRoaXMuY2xhc3NOYW1lID09PSAnX1Byb2R1Y3QnICYmIHRoaXMuZGF0YS5kb3dubG9hZCkge1xuICAgIHRoaXMuZGF0YS5kb3dubG9hZE5hbWUgPSB0aGlzLmRhdGEuZG93bmxvYWQubmFtZTtcbiAgfVxuXG4gIC8vIFRPRE86IEFkZCBiZXR0ZXIgZGV0ZWN0aW9uIGZvciBBQ0wsIGVuc3VyaW5nIGEgdXNlciBjYW4ndCBiZSBsb2NrZWQgZnJvbVxuICAvLyAgICAgICB0aGVpciBvd24gdXNlciByZWNvcmQuXG4gIGlmICh0aGlzLmRhdGEuQUNMICYmIHRoaXMuZGF0YS5BQ0xbJyp1bnJlc29sdmVkJ10pIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9BQ0wsICdJbnZhbGlkIEFDTC4nKTtcbiAgfVxuXG4gIGlmICh0aGlzLnF1ZXJ5KSB7XG4gICAgLy8gRm9yY2UgdGhlIHVzZXIgdG8gbm90IGxvY2tvdXRcbiAgICAvLyBNYXRjaGVkIHdpdGggcGFyc2UuY29tXG4gICAgaWYgKHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInICYmIHRoaXMuZGF0YS5BQ0wgJiYgdGhpcy5hdXRoLmlzTWFzdGVyICE9PSB0cnVlKSB7XG4gICAgICB0aGlzLmRhdGEuQUNMW3RoaXMucXVlcnkub2JqZWN0SWRdID0geyByZWFkOiB0cnVlLCB3cml0ZTogdHJ1ZSB9O1xuICAgIH1cbiAgICAvLyB1cGRhdGUgcGFzc3dvcmQgdGltZXN0YW1wIGlmIHVzZXIgcGFzc3dvcmQgaXMgYmVpbmcgY2hhbmdlZFxuICAgIGlmICh0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJyAmJiB0aGlzLmRhdGEuX2hhc2hlZF9wYXNzd29yZCAmJiB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeSAmJiB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEFnZSkge1xuICAgICAgdGhpcy5kYXRhLl9wYXNzd29yZF9jaGFuZ2VkX2F0ID0gUGFyc2UuX2VuY29kZShuZXcgRGF0ZSgpKTtcbiAgICB9XG4gICAgLy8gSWdub3JlIGNyZWF0ZWRBdCB3aGVuIHVwZGF0ZVxuICAgIGRlbGV0ZSB0aGlzLmRhdGEuY3JlYXRlZEF0O1xuXG4gICAgbGV0IGRlZmVyID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgLy8gaWYgcGFzc3dvcmQgaGlzdG9yeSBpcyBlbmFibGVkIHRoZW4gc2F2ZSB0aGUgY3VycmVudCBwYXNzd29yZCB0byBoaXN0b3J5XG4gICAgaWYgKHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInICYmIHRoaXMuZGF0YS5faGFzaGVkX3Bhc3N3b3JkICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeSkge1xuICAgICAgZGVmZXIgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5maW5kKCdfVXNlcicsIHtvYmplY3RJZDogdGhpcy5vYmplY3RJZCgpfSwge2tleXM6IFtcIl9wYXNzd29yZF9oaXN0b3J5XCIsIFwiX2hhc2hlZF9wYXNzd29yZFwiXX0pLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVzZXIgPSByZXN1bHRzWzBdO1xuICAgICAgICBsZXQgb2xkUGFzc3dvcmRzID0gW107XG4gICAgICAgIGlmICh1c2VyLl9wYXNzd29yZF9oaXN0b3J5KSB7XG4gICAgICAgICAgb2xkUGFzc3dvcmRzID0gXy50YWtlKHVzZXIuX3Bhc3N3b3JkX2hpc3RvcnksIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9uLTEgcGFzc3dvcmRzIGdvIGludG8gaGlzdG9yeSBpbmNsdWRpbmcgbGFzdCBwYXNzd29yZFxuICAgICAgICB3aGlsZSAob2xkUGFzc3dvcmRzLmxlbmd0aCA+IHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeSAtIDIpIHtcbiAgICAgICAgICBvbGRQYXNzd29yZHMuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICBvbGRQYXNzd29yZHMucHVzaCh1c2VyLnBhc3N3b3JkKTtcbiAgICAgICAgdGhpcy5kYXRhLl9wYXNzd29yZF9oaXN0b3J5ID0gb2xkUGFzc3dvcmRzO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmVyLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gUnVuIGFuIHVwZGF0ZVxuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLnVwZGF0ZSh0aGlzLmNsYXNzTmFtZSwgdGhpcy5xdWVyeSwgdGhpcy5kYXRhLCB0aGlzLnJ1bk9wdGlvbnMpXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICByZXNwb25zZS51cGRhdGVkQXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICAgICAgICB0aGlzLl91cGRhdGVSZXNwb25zZVdpdGhEYXRhKHJlc3BvbnNlLCB0aGlzLmRhdGEpO1xuICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSB7IHJlc3BvbnNlIH07XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIFNldCB0aGUgZGVmYXVsdCBBQ0wgYW5kIHBhc3N3b3JkIHRpbWVzdGFtcCBmb3IgdGhlIG5ldyBfVXNlclxuICAgIGlmICh0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgICAgdmFyIEFDTCA9IHRoaXMuZGF0YS5BQ0w7XG4gICAgICAvLyBkZWZhdWx0IHB1YmxpYyByL3cgQUNMXG4gICAgICBpZiAoIUFDTCkge1xuICAgICAgICBBQ0wgPSB7fTtcbiAgICAgICAgQUNMWycqJ10gPSB7IHJlYWQ6IHRydWUsIHdyaXRlOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgLy8gbWFrZSBzdXJlIHRoZSB1c2VyIGlzIG5vdCBsb2NrZWQgZG93blxuICAgICAgQUNMW3RoaXMuZGF0YS5vYmplY3RJZF0gPSB7IHJlYWQ6IHRydWUsIHdyaXRlOiB0cnVlIH07XG4gICAgICB0aGlzLmRhdGEuQUNMID0gQUNMO1xuICAgICAgLy8gcGFzc3dvcmQgdGltZXN0YW1wIHRvIGJlIHVzZWQgd2hlbiBwYXNzd29yZCBleHBpcnkgcG9saWN5IGlzIGVuZm9yY2VkXG4gICAgICBpZiAodGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kgJiYgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRBZ2UpIHtcbiAgICAgICAgdGhpcy5kYXRhLl9wYXNzd29yZF9jaGFuZ2VkX2F0ID0gUGFyc2UuX2VuY29kZShuZXcgRGF0ZSgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSdW4gYSBjcmVhdGVcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UuY3JlYXRlKHRoaXMuY2xhc3NOYW1lLCB0aGlzLmRhdGEsIHRoaXMucnVuT3B0aW9ucylcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNsYXNzTmFtZSAhPT0gJ19Vc2VyJyB8fCBlcnJvci5jb2RlICE9PSBQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFF1aWNrIGNoZWNrLCBpZiB3ZSB3ZXJlIGFibGUgdG8gaW5mZXIgdGhlIGR1cGxpY2F0ZWQgZmllbGQgbmFtZVxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IudXNlckluZm8gJiYgZXJyb3IudXNlckluZm8uZHVwbGljYXRlZF9maWVsZCA9PT0gJ3VzZXJuYW1lJykge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5VU0VSTkFNRV9UQUtFTiwgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdXNlcm5hbWUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IudXNlckluZm8gJiYgZXJyb3IudXNlckluZm8uZHVwbGljYXRlZF9maWVsZCA9PT0gJ2VtYWlsJykge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5FTUFJTF9UQUtFTiwgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgZW1haWwgYWRkcmVzcy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoaXMgd2FzIGEgZmFpbGVkIHVzZXIgY3JlYXRpb24gZHVlIHRvIHVzZXJuYW1lIG9yIGVtYWlsIGFscmVhZHkgdGFrZW4sIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gY2hlY2sgd2hldGhlciBpdCB3YXMgdXNlcm5hbWUgb3IgZW1haWwgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgZXJyb3IuXG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIHRoZSBvcmlnaW5hbCBtZXRob2RcbiAgICAgICAgLy8gVE9ETzogU2VlIGlmIHdlIGNhbiBsYXRlciBkbyB0aGlzIHdpdGhvdXQgYWRkaXRpb25hbCBxdWVyaWVzIGJ5IHVzaW5nIG5hbWVkIGluZGV4ZXMuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS5maW5kKFxuICAgICAgICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgICAgIHsgdXNlcm5hbWU6IHRoaXMuZGF0YS51c2VybmFtZSwgb2JqZWN0SWQ6IHsnJG5lJzogdGhpcy5vYmplY3RJZCgpfSB9LFxuICAgICAgICAgIHsgbGltaXQ6IDEgfVxuICAgICAgICApXG4gICAgICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5VU0VSTkFNRV9UQUtFTiwgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdXNlcm5hbWUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UuZmluZChcbiAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUsXG4gICAgICAgICAgICAgIHsgZW1haWw6IHRoaXMuZGF0YS5lbWFpbCwgb2JqZWN0SWQ6IHsnJG5lJzogdGhpcy5vYmplY3RJZCgpfSB9LFxuICAgICAgICAgICAgICB7IGxpbWl0OiAxIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkVNQUlMX1RBS0VOLCAnQWNjb3VudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBlbWFpbCBhZGRyZXNzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkRVUExJQ0FURV9WQUxVRSwgJ0EgZHVwbGljYXRlIHZhbHVlIGZvciBhIGZpZWxkIHdpdGggdW5pcXVlIHZhbHVlcyB3YXMgcHJvdmlkZWQnKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgIHJlc3BvbnNlLm9iamVjdElkID0gdGhpcy5kYXRhLm9iamVjdElkO1xuICAgICAgICByZXNwb25zZS5jcmVhdGVkQXQgPSB0aGlzLmRhdGEuY3JlYXRlZEF0O1xuXG4gICAgICAgIGlmICh0aGlzLnJlc3BvbnNlU2hvdWxkSGF2ZVVzZXJuYW1lKSB7XG4gICAgICAgICAgcmVzcG9uc2UudXNlcm5hbWUgPSB0aGlzLmRhdGEudXNlcm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXBkYXRlUmVzcG9uc2VXaXRoRGF0YShyZXNwb25zZSwgdGhpcy5kYXRhKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHtcbiAgICAgICAgICBzdGF0dXM6IDIwMSxcbiAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbigpXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgfVxufTtcblxuLy8gUmV0dXJucyBub3RoaW5nIC0gZG9lc24ndCB3YWl0IGZvciB0aGUgdHJpZ2dlci5cblJlc3RXcml0ZS5wcm90b3R5cGUucnVuQWZ0ZXJUcmlnZ2VyID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5yZXNwb25zZSB8fCAhdGhpcy5yZXNwb25zZS5yZXNwb25zZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEF2b2lkIGRvaW5nIGFueSBzZXR1cCBmb3IgdHJpZ2dlcnMgaWYgdGhlcmUgaXMgbm8gJ2FmdGVyU2F2ZScgdHJpZ2dlciBmb3IgdGhpcyBjbGFzcy5cbiAgY29uc3QgaGFzQWZ0ZXJTYXZlSG9vayA9IHRyaWdnZXJzLnRyaWdnZXJFeGlzdHModGhpcy5jbGFzc05hbWUsIHRyaWdnZXJzLlR5cGVzLmFmdGVyU2F2ZSwgdGhpcy5jb25maWcuYXBwbGljYXRpb25JZCk7XG4gIGNvbnN0IGhhc0xpdmVRdWVyeSA9IHRoaXMuY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIuaGFzTGl2ZVF1ZXJ5KHRoaXMuY2xhc3NOYW1lKTtcbiAgaWYgKCFoYXNBZnRlclNhdmVIb29rICYmICFoYXNMaXZlUXVlcnkpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICB2YXIgZXh0cmFEYXRhID0ge2NsYXNzTmFtZTogdGhpcy5jbGFzc05hbWV9O1xuICBpZiAodGhpcy5xdWVyeSAmJiB0aGlzLnF1ZXJ5Lm9iamVjdElkKSB7XG4gICAgZXh0cmFEYXRhLm9iamVjdElkID0gdGhpcy5xdWVyeS5vYmplY3RJZDtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSBvcmlnaW5hbCBvYmplY3QsIHdlIG9ubHkgZG8gdGhpcyBmb3IgYSB1cGRhdGUgd3JpdGUuXG4gIGxldCBvcmlnaW5hbE9iamVjdDtcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgIG9yaWdpbmFsT2JqZWN0ID0gdHJpZ2dlcnMuaW5mbGF0ZShleHRyYURhdGEsIHRoaXMub3JpZ2luYWxEYXRhKTtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSBpbmZsYXRlZCBvYmplY3QsIGRpZmZlcmVudCBmcm9tIGJlZm9yZVNhdmUsIG9yaWdpbmFsRGF0YSBpcyBub3QgZW1wdHlcbiAgLy8gc2luY2UgZGV2ZWxvcGVycyBjYW4gY2hhbmdlIGRhdGEgaW4gdGhlIGJlZm9yZVNhdmUuXG4gIGNvbnN0IHVwZGF0ZWRPYmplY3QgPSB0aGlzLmJ1aWxkVXBkYXRlZE9iamVjdChleHRyYURhdGEpO1xuICB1cGRhdGVkT2JqZWN0Ll9oYW5kbGVTYXZlUmVzcG9uc2UodGhpcy5yZXNwb25zZS5yZXNwb25zZSwgdGhpcy5yZXNwb25zZS5zdGF0dXMgfHwgMjAwKTtcblxuICAvLyBOb3RpZml5IExpdmVRdWVyeVNlcnZlciBpZiBwb3NzaWJsZVxuICB0aGlzLmNvbmZpZy5saXZlUXVlcnlDb250cm9sbGVyLm9uQWZ0ZXJTYXZlKHVwZGF0ZWRPYmplY3QuY2xhc3NOYW1lLCB1cGRhdGVkT2JqZWN0LCBvcmlnaW5hbE9iamVjdCk7XG5cbiAgLy8gUnVuIGFmdGVyU2F2ZSB0cmlnZ2VyXG4gIHJldHVybiB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIodHJpZ2dlcnMuVHlwZXMuYWZ0ZXJTYXZlLCB0aGlzLmF1dGgsIHVwZGF0ZWRPYmplY3QsIG9yaWdpbmFsT2JqZWN0LCB0aGlzLmNvbmZpZylcbiAgICAuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICBsb2dnZXIud2FybignYWZ0ZXJTYXZlIGNhdWdodCBhbiBlcnJvcicsIGVycik7XG4gICAgfSlcbn07XG5cbi8vIEEgaGVscGVyIHRvIGZpZ3VyZSBvdXQgd2hhdCBsb2NhdGlvbiB0aGlzIG9wZXJhdGlvbiBoYXBwZW5zIGF0LlxuUmVzdFdyaXRlLnByb3RvdHlwZS5sb2NhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbWlkZGxlID0gKHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInID8gJy91c2Vycy8nIDpcbiAgICAnL2NsYXNzZXMvJyArIHRoaXMuY2xhc3NOYW1lICsgJy8nKTtcbiAgcmV0dXJuIHRoaXMuY29uZmlnLm1vdW50ICsgbWlkZGxlICsgdGhpcy5kYXRhLm9iamVjdElkO1xufTtcblxuLy8gQSBoZWxwZXIgdG8gZ2V0IHRoZSBvYmplY3QgaWQgZm9yIHRoaXMgb3BlcmF0aW9uLlxuLy8gQmVjYXVzZSBpdCBjb3VsZCBiZSBlaXRoZXIgb24gdGhlIHF1ZXJ5IG9yIG9uIHRoZSBkYXRhXG5SZXN0V3JpdGUucHJvdG90eXBlLm9iamVjdElkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmRhdGEub2JqZWN0SWQgfHwgdGhpcy5xdWVyeS5vYmplY3RJZDtcbn07XG5cbi8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBkYXRhIGFuZCBkZWxldGUgYmFkIGtleXMgKF9hdXRoX2RhdGEsIF9oYXNoZWRfcGFzc3dvcmQuLi4pXG5SZXN0V3JpdGUucHJvdG90eXBlLnNhbml0aXplZERhdGEgPSBmdW5jdGlvbigpIHtcbiAgY29uc3QgZGF0YSA9IE9iamVjdC5rZXlzKHRoaXMuZGF0YSkucmVkdWNlKChkYXRhLCBrZXkpID0+IHtcbiAgICAvLyBSZWdleHAgY29tZXMgZnJvbSBQYXJzZS5PYmplY3QucHJvdG90eXBlLnZhbGlkYXRlXG4gICAgaWYgKCEoL15bQS1aYS16XVswLTlBLVphLXpfXSokLykudGVzdChrZXkpKSB7XG4gICAgICBkZWxldGUgZGF0YVtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfSwgZGVlcGNvcHkodGhpcy5kYXRhKSk7XG4gIHJldHVybiBQYXJzZS5fZGVjb2RlKHVuZGVmaW5lZCwgZGF0YSk7XG59XG5cbi8vIFJldHVybnMgYW4gdXBkYXRlZCBjb3B5IG9mIHRoZSBvYmplY3RcblJlc3RXcml0ZS5wcm90b3R5cGUuYnVpbGRVcGRhdGVkT2JqZWN0ID0gZnVuY3Rpb24gKGV4dHJhRGF0YSkge1xuICBjb25zdCB1cGRhdGVkT2JqZWN0ID0gdHJpZ2dlcnMuaW5mbGF0ZShleHRyYURhdGEsIHRoaXMub3JpZ2luYWxEYXRhKTtcbiAgT2JqZWN0LmtleXModGhpcy5kYXRhKS5yZWR1Y2UoZnVuY3Rpb24gKGRhdGEsIGtleSkge1xuICAgIGlmIChrZXkuaW5kZXhPZihcIi5cIikgPiAwKSB7XG4gICAgICAvLyBzdWJkb2N1bWVudCBrZXkgd2l0aCBkb3Qgbm90YXRpb24gKCd4LnknOnYgPT4gJ3gnOnsneSc6dn0pXG4gICAgICBjb25zdCBzcGxpdHRlZEtleSA9IGtleS5zcGxpdChcIi5cIik7XG4gICAgICBjb25zdCBwYXJlbnRQcm9wID0gc3BsaXR0ZWRLZXlbMF07XG4gICAgICBsZXQgcGFyZW50VmFsID0gdXBkYXRlZE9iamVjdC5nZXQocGFyZW50UHJvcCk7XG4gICAgICBpZih0eXBlb2YgcGFyZW50VmFsICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBwYXJlbnRWYWwgPSB7fTtcbiAgICAgIH1cbiAgICAgIHBhcmVudFZhbFtzcGxpdHRlZEtleVsxXV0gPSBkYXRhW2tleV07XG4gICAgICB1cGRhdGVkT2JqZWN0LnNldChwYXJlbnRQcm9wLCBwYXJlbnRWYWwpO1xuICAgICAgZGVsZXRlIGRhdGFba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0sIGRlZXBjb3B5KHRoaXMuZGF0YSkpO1xuXG4gIHVwZGF0ZWRPYmplY3Quc2V0KHRoaXMuc2FuaXRpemVkRGF0YSgpKTtcbiAgcmV0dXJuIHVwZGF0ZWRPYmplY3Q7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmNsZWFuVXNlckF1dGhEYXRhID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnJlc3BvbnNlICYmIHRoaXMucmVzcG9uc2UucmVzcG9uc2UgJiYgdGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicpIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5yZXNwb25zZS5yZXNwb25zZTtcbiAgICBpZiAodXNlci5hdXRoRGF0YSkge1xuICAgICAgT2JqZWN0LmtleXModXNlci5hdXRoRGF0YSkuZm9yRWFjaCgocHJvdmlkZXIpID0+IHtcbiAgICAgICAgaWYgKHVzZXIuYXV0aERhdGFbcHJvdmlkZXJdID09PSBudWxsKSB7XG4gICAgICAgICAgZGVsZXRlIHVzZXIuYXV0aERhdGFbcHJvdmlkZXJdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh1c2VyLmF1dGhEYXRhKS5sZW5ndGggPT0gMCkge1xuICAgICAgICBkZWxldGUgdXNlci5hdXRoRGF0YTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuX3VwZGF0ZVJlc3BvbnNlV2l0aERhdGEgPSBmdW5jdGlvbihyZXNwb25zZSwgZGF0YSkge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyKSkge1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuICBjb25zdCBjbGllbnRTdXBwb3J0c0RlbGV0ZSA9IENsaWVudFNESy5zdXBwb3J0c0ZvcndhcmREZWxldGUodGhpcy5jbGllbnRTREspO1xuICB0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlci5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XG4gICAgY29uc3QgZGF0YVZhbHVlID0gZGF0YVtmaWVsZE5hbWVdO1xuXG4gICAgaWYoIXJlc3BvbnNlLmhhc093blByb3BlcnR5KGZpZWxkTmFtZSkpIHtcbiAgICAgIHJlc3BvbnNlW2ZpZWxkTmFtZV0gPSBkYXRhVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gU3RyaXBzIG9wZXJhdGlvbnMgZnJvbSByZXNwb25zZXNcbiAgICBpZiAocmVzcG9uc2VbZmllbGROYW1lXSAmJiByZXNwb25zZVtmaWVsZE5hbWVdLl9fb3ApIHtcbiAgICAgIGRlbGV0ZSByZXNwb25zZVtmaWVsZE5hbWVdO1xuICAgICAgaWYgKGNsaWVudFN1cHBvcnRzRGVsZXRlICYmIGRhdGFWYWx1ZS5fX29wID09ICdEZWxldGUnKSB7XG4gICAgICAgIHJlc3BvbnNlW2ZpZWxkTmFtZV0gPSBkYXRhVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBSZXN0V3JpdGU7XG5tb2R1bGUuZXhwb3J0cyA9IFJlc3RXcml0ZTtcbiJdfQ==
1549
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUmVzdFF1ZXJ5IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbG9kYXNoIiwiX2xvZ2dlciIsIl9TY2hlbWFDb250cm9sbGVyIiwiX0Vycm9yIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiU2NoZW1hQ29udHJvbGxlciIsImRlZXBjb3B5IiwiQXV0aCIsIlV0aWxzIiwiY3J5cHRvVXRpbHMiLCJwYXNzd29yZENyeXB0byIsIlBhcnNlIiwidHJpZ2dlcnMiLCJDbGllbnRTREsiLCJ1dGlsIiwiUmVzdFdyaXRlIiwiY29uZmlnIiwiYXV0aCIsImNsYXNzTmFtZSIsInF1ZXJ5IiwiZGF0YSIsIm9yaWdpbmFsRGF0YSIsImNsaWVudFNESyIsImNvbnRleHQiLCJhY3Rpb24iLCJpc1JlYWRPbmx5IiwiY3JlYXRlU2FuaXRpemVkRXJyb3IiLCJFcnJvciIsIk9QRVJBVElPTl9GT1JCSURERU4iLCJzdG9yYWdlIiwicnVuT3B0aW9ucyIsImFsbG93Q3VzdG9tT2JqZWN0SWQiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJvYmplY3RJZCIsIk1JU1NJTkdfT0JKRUNUX0lEIiwiSU5WQUxJRF9LRVlfTkFNRSIsImlkIiwicmVzcG9uc2UiLCJ1cGRhdGVkQXQiLCJfZW5jb2RlIiwiRGF0ZSIsImlzbyIsInZhbGlkU2NoZW1hQ29udHJvbGxlciIsInBlbmRpbmdPcHMiLCJvcGVyYXRpb25zIiwiaWRlbnRpZmllciIsImV4ZWN1dGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJnZXRVc2VyQW5kUm9sZUFDTCIsInZhbGlkYXRlQ2xpZW50Q2xhc3NDcmVhdGlvbiIsImhhbmRsZUluc3RhbGxhdGlvbiIsImhhbmRsZVNlc3Npb24iLCJ2YWxpZGF0ZUF1dGhEYXRhIiwiY2hlY2tSZXN0cmljdGVkRmllbGRzIiwicnVuQmVmb3JlU2F2ZVRyaWdnZXIiLCJlbnN1cmVVbmlxdWVBdXRoRGF0YUlkIiwiZGVsZXRlRW1haWxSZXNldFRva2VuSWZOZWVkZWQiLCJ2YWxpZGF0ZVNjaGVtYSIsInNjaGVtYUNvbnRyb2xsZXIiLCJzZXRSZXF1aXJlZEZpZWxkc0lmTmVlZGVkIiwidHJhbnNmb3JtVXNlciIsImV4cGFuZEZpbGVzRm9yRXhpc3RpbmdPYmplY3RzIiwiZGVzdHJveUR1cGxpY2F0ZWRTZXNzaW9ucyIsInJ1bkRhdGFiYXNlT3BlcmF0aW9uIiwiY3JlYXRlU2Vzc2lvblRva2VuSWZOZWVkZWQiLCJoYW5kbGVGb2xsb3d1cCIsInJ1bkFmdGVyU2F2ZVRyaWdnZXIiLCJjbGVhblVzZXJBdXRoRGF0YSIsImF1dGhEYXRhUmVzcG9uc2UiLCJyZWplY3RTaWdudXAiLCJwcmV2ZW50U2lnbnVwV2l0aFVudmVyaWZpZWRFbWFpbCIsIkVNQUlMX05PVF9GT1VORCIsImlzTWFzdGVyIiwiaXNNYWludGVuYW5jZSIsImFjbCIsInVzZXIiLCJnZXRVc2VyUm9sZXMiLCJyb2xlcyIsImNvbmNhdCIsImFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiIsInN5c3RlbUNsYXNzZXMiLCJpbmRleE9mIiwiZGF0YWJhc2UiLCJsb2FkU2NoZW1hIiwiaGFzQ2xhc3MiLCJ2YWxpZGF0ZU9iamVjdCIsIm1hbnkiLCJ0cmlnZ2VyRXhpc3RzIiwiVHlwZXMiLCJiZWZvcmVTYXZlIiwiYXBwbGljYXRpb25JZCIsIm9yaWdpbmFsT2JqZWN0IiwidXBkYXRlZE9iamVjdCIsImJ1aWxkUGFyc2VPYmplY3RzIiwiX2dldFN0YXRlSWRlbnRpZmllciIsInN0YXRlQ29udHJvbGxlciIsIkNvcmVNYW5hZ2VyIiwiZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyIiwicGVuZGluZyIsImdldFBlbmRpbmdPcHMiLCJkYXRhYmFzZVByb21pc2UiLCJ1cGRhdGUiLCJjcmVhdGUiLCJyZXN1bHQiLCJsZW5ndGgiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwibWF5YmVSdW5UcmlnZ2VyIiwib2JqZWN0IiwiZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlciIsIl8iLCJyZWR1Y2UiLCJ2YWx1ZSIsImtleSIsImlzRXF1YWwiLCJwdXNoIiwiY2hlY2tQcm9oaWJpdGVkS2V5d29yZHMiLCJlcnJvciIsInJ1bkJlZm9yZUxvZ2luVHJpZ2dlciIsInVzZXJEYXRhIiwiYmVmb3JlTG9naW4iLCJleHRyYURhdGEiLCJmaWxlc0NvbnRyb2xsZXIiLCJleHBhbmRGaWxlc0luT2JqZWN0IiwiaW5mbGF0ZSIsImdldEFsbENsYXNzZXMiLCJhbGxDbGFzc2VzIiwic2NoZW1hIiwiZmluZCIsIm9uZUNsYXNzIiwic2V0UmVxdWlyZWRGaWVsZElmTmVlZGVkIiwiZmllbGROYW1lIiwic2V0RGVmYXVsdCIsInVuZGVmaW5lZCIsIl9fb3AiLCJmaWVsZHMiLCJkZWZhdWx0VmFsdWUiLCJyZXF1aXJlZCIsIlZBTElEQVRJT05fRVJST1IiLCJjbGFzc0xldmVsUGVybWlzc2lvbnMiLCJBQ0wiLCJKU09OIiwic3RyaW5naWZ5IiwicmVhZCIsIndyaXRlIiwiY3VycmVudFVzZXIiLCJjcmVhdGVkQXQiLCJfX3R5cGUiLCJuZXdPYmplY3RJZCIsIm9iamVjdElkU2l6ZSIsImtleXMiLCJmb3JFYWNoIiwiYXV0aERhdGEiLCJoYXNVc2VybmFtZUFuZFBhc3N3b3JkIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImlzRW1wdHkiLCJVU0VSTkFNRV9NSVNTSU5HIiwiUEFTU1dPUkRfTUlTU0lORyIsIlVOU1VQUE9SVEVEX1NFUlZJQ0UiLCJwcm92aWRlcnMiLCJjYW5IYW5kbGVBdXRoRGF0YSIsInNvbWUiLCJwcm92aWRlciIsInByb3ZpZGVyQXV0aERhdGEiLCJnZXRVc2VySWQiLCJoYW5kbGVBdXRoRGF0YSIsImZpbHRlcmVkT2JqZWN0c0J5QUNMIiwib2JqZWN0cyIsImZpbHRlciIsImhhc0F1dGhEYXRhSWQiLCJyIiwiZmluZFVzZXJzV2l0aEF1dGhEYXRhIiwicmVzdWx0cyIsIkFDQ09VTlRfQUxSRUFEWV9MSU5LRUQiLCJ1c2VySWQiLCJ1c2VyUmVzdWx0IiwiZm91bmRVc2VySXNOb3RDdXJyZW50VXNlciIsImhhbmRsZUF1dGhEYXRhVmFsaWRhdGlvbiIsInZhbGlkYXRlZEF1dGhEYXRhIiwiYXV0aFByb3ZpZGVyIiwiam9pbiIsImhhc011dGF0ZWRBdXRoRGF0YSIsIm11dGF0ZWRBdXRoRGF0YSIsImlzQ3VycmVudFVzZXJMb2dnZWRPck1hc3RlciIsImlzTG9naW4iLCJsb2NhdGlvbiIsImNoZWNrSWZVc2VySGFzUHJvdmlkZWRDb25maWd1cmVkUHJvdmlkZXJzRm9yTG9naW4iLCJhbGxvd0V4cGlyZWRBdXRoRGF0YVRva2VuIiwicmVzIiwicHJvbWlzZSIsIlJlc3RRdWVyeSIsIm1ldGhvZCIsIk1ldGhvZCIsIm1hc3RlciIsInJ1bkJlZm9yZUZpbmQiLCJyZXN0V2hlcmUiLCJzZXNzaW9uIiwiY2FjaGVDb250cm9sbGVyIiwiZGVsIiwic2Vzc2lvblRva2VuIiwiX3ZhbGlkYXRlUGFzc3dvcmRQb2xpY3kiLCJoYXNoIiwiaGFzaGVkUGFzc3dvcmQiLCJfaGFzaGVkX3Bhc3N3b3JkIiwiX3ZhbGlkYXRlVXNlck5hbWUiLCJfdmFsaWRhdGVFbWFpbCIsInJhbmRvbVN0cmluZyIsInJlc3BvbnNlU2hvdWxkSGF2ZVVzZXJuYW1lIiwiJG5lIiwibGltaXQiLCJjYXNlSW5zZW5zaXRpdmUiLCJVU0VSTkFNRV9UQUtFTiIsImVtYWlsIiwibWF0Y2giLCJyZWplY3QiLCJJTlZBTElEX0VNQUlMX0FERFJFU1MiLCJFTUFJTF9UQUtFTiIsInJlcXVlc3QiLCJvcmlnaW5hbCIsImlwIiwiaW5zdGFsbGF0aW9uSWQiLCJ1c2VyQ29udHJvbGxlciIsInNldEVtYWlsVmVyaWZ5VG9rZW4iLCJwYXNzd29yZFBvbGljeSIsIl92YWxpZGF0ZVBhc3N3b3JkUmVxdWlyZW1lbnRzIiwiX3ZhbGlkYXRlUGFzc3dvcmRIaXN0b3J5IiwicG9saWN5RXJyb3IiLCJ2YWxpZGF0aW9uRXJyb3IiLCJjb250YWluc1VzZXJuYW1lRXJyb3IiLCJwYXR0ZXJuVmFsaWRhdG9yIiwidmFsaWRhdG9yQ2FsbGJhY2siLCJkb05vdEFsbG93VXNlcm5hbWUiLCJtYXhQYXNzd29yZEhpc3RvcnkiLCJtYWludGVuYW5jZSIsIm9sZFBhc3N3b3JkcyIsIl9wYXNzd29yZF9oaXN0b3J5IiwidGFrZSIsIm5ld1Bhc3N3b3JkIiwicHJvbWlzZXMiLCJtYXAiLCJjb21wYXJlIiwiYWxsIiwiY2F0Y2giLCJlcnIiLCJ2ZXJpZnlVc2VyRW1haWxzIiwicHJldmVudExvZ2luV2l0aFVudmVyaWZpZWRFbWFpbCIsImNyZWF0ZVNlc3Npb25Ub2tlbiIsInNlc3Npb25EYXRhIiwiY3JlYXRlU2Vzc2lvbiIsImNyZWF0ZWRXaXRoIiwiYWRkaXRpb25hbFNlc3Npb25EYXRhIiwidG9rZW4iLCJuZXdUb2tlbiIsImV4cGlyZXNBdCIsImdlbmVyYXRlU2Vzc2lvbkV4cGlyZXNBdCIsImFzc2lnbiIsImFkZE9wcyIsIl9wZXJpc2hhYmxlX3Rva2VuIiwiX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdCIsImRlc3Ryb3kiLCJyZXZva2VTZXNzaW9uT25QYXNzd29yZFJlc2V0Iiwic2Vzc2lvblF1ZXJ5IiwiYmluZCIsInNlbmRWZXJpZmljYXRpb25FbWFpbCIsIklOVkFMSURfU0VTU0lPTl9UT0tFTiIsIiRhbmQiLCJJTlRFUk5BTF9TRVJWRVJfRVJST1IiLCJzdGF0dXMiLCJkZXZpY2VUb2tlbiIsInRvTG93ZXJDYXNlIiwiZGV2aWNlVHlwZSIsImlkTWF0Y2giLCJvYmplY3RJZE1hdGNoIiwiaW5zdGFsbGF0aW9uSWRNYXRjaCIsImRldmljZVRva2VuTWF0Y2hlcyIsIm9yUXVlcmllcyIsIiRvciIsImRlbFF1ZXJ5IiwiYXBwSWRlbnRpZmllciIsImNvZGUiLCJvYmpJZCIsInJvbGUiLCJjbGVhciIsImxpdmVRdWVyeUNvbnRyb2xsZXIiLCJjbGVhckNhY2hlZFJvbGVzIiwiaXNVbmF1dGhlbnRpY2F0ZWQiLCJTRVNTSU9OX01JU1NJTkciLCJkb3dubG9hZCIsImRvd25sb2FkTmFtZSIsIm5hbWUiLCJJTlZBTElEX0FDTCIsIm1heFBhc3N3b3JkQWdlIiwiX3Bhc3N3b3JkX2NoYW5nZWRfYXQiLCJkZWZlciIsIk1hdGgiLCJtYXgiLCJzaGlmdCIsIl91cGRhdGVSZXNwb25zZVdpdGhEYXRhIiwiZW5mb3JjZVByaXZhdGVVc2VycyIsIkRVUExJQ0FURV9WQUxVRSIsInVzZXJJbmZvIiwiZHVwbGljYXRlZF9maWVsZCIsImhhc0FmdGVyU2F2ZUhvb2siLCJhZnRlclNhdmUiLCJoYXNMaXZlUXVlcnkiLCJfaGFuZGxlU2F2ZVJlc3BvbnNlIiwicGVybXMiLCJnZXRDbGFzc0xldmVsUGVybWlzc2lvbnMiLCJvbkFmdGVyU2F2ZSIsImpzb25SZXR1cm5lZCIsIl90b0Z1bGxKU09OIiwidG9KU09OIiwibG9nZ2VyIiwid2FybiIsIm1pZGRsZSIsIm1vdW50Iiwic2VydmVyVVJMIiwic2FuaXRpemVkRGF0YSIsInRlc3QiLCJfZGVjb2RlIiwiZnJvbUpTT04iLCJyZWFkT25seUF0dHJpYnV0ZXMiLCJjb25zdHJ1Y3RvciIsImlzUm9sZUFmdGVyU2F2ZSIsImluY2x1ZGVzIiwiYXR0cmlidXRlIiwic2V0Iiwic3BsaXR0ZWRLZXkiLCJzcGxpdCIsInBhcmVudFByb3AiLCJwYXJlbnRWYWwiLCJnZXQiLCJzYW5pdGl6ZWQiLCJza2lwS2V5cyIsInJlcXVpcmVkQ29sdW1ucyIsImlzRGVlcFN0cmljdEVxdWFsIiwiY2xpZW50U3VwcG9ydHNEZWxldGUiLCJzdXBwb3J0c0ZvcndhcmREZWxldGUiLCJkYXRhVmFsdWUiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJtb2R1bGUiXSwic291cmNlcyI6WyIuLi9zcmMvUmVzdFdyaXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEEgUmVzdFdyaXRlIGVuY2Fwc3VsYXRlcyBldmVyeXRoaW5nIHdlIG5lZWQgdG8gcnVuIGFuIG9wZXJhdGlvblxuLy8gdGhhdCB3cml0ZXMgdG8gdGhlIGRhdGFiYXNlLlxuLy8gVGhpcyBjb3VsZCBiZSBlaXRoZXIgYSBcImNyZWF0ZVwiIG9yIGFuIFwidXBkYXRlXCIuXG5cbnZhciBTY2hlbWFDb250cm9sbGVyID0gcmVxdWlyZSgnLi9Db250cm9sbGVycy9TY2hlbWFDb250cm9sbGVyJyk7XG52YXIgZGVlcGNvcHkgPSByZXF1aXJlKCdkZWVwY29weScpO1xuXG5jb25zdCBBdXRoID0gcmVxdWlyZSgnLi9BdXRoJyk7XG5jb25zdCBVdGlscyA9IHJlcXVpcmUoJy4vVXRpbHMnKTtcbnZhciBjcnlwdG9VdGlscyA9IHJlcXVpcmUoJy4vY3J5cHRvVXRpbHMnKTtcbnZhciBwYXNzd29yZENyeXB0byA9IHJlcXVpcmUoJy4vcGFzc3dvcmQnKTtcbnZhciBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKTtcbnZhciB0cmlnZ2VycyA9IHJlcXVpcmUoJy4vdHJpZ2dlcnMnKTtcbnZhciBDbGllbnRTREsgPSByZXF1aXJlKCcuL0NsaWVudFNESycpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmltcG9ydCBSZXN0UXVlcnkgZnJvbSAnLi9SZXN0UXVlcnknO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgcmVxdWlyZWRDb2x1bW5zIH0gZnJvbSAnLi9Db250cm9sbGVycy9TY2hlbWFDb250cm9sbGVyJztcbmltcG9ydCB7IGNyZWF0ZVNhbml0aXplZEVycm9yIH0gZnJvbSAnLi9FcnJvcic7XG5cbi8vIHF1ZXJ5IGFuZCBkYXRhIGFyZSBib3RoIHByb3ZpZGVkIGluIFJFU1QgQVBJIGZvcm1hdC4gU28gZGF0YVxuLy8gdHlwZXMgYXJlIGVuY29kZWQgYnkgcGxhaW4gb2xkIG9iamVjdHMuXG4vLyBJZiBxdWVyeSBpcyBudWxsLCB0aGlzIGlzIGEgXCJjcmVhdGVcIiBhbmQgdGhlIGRhdGEgaW4gZGF0YSBzaG91bGQgYmVcbi8vIGNyZWF0ZWQuXG4vLyBPdGhlcndpc2UgdGhpcyBpcyBhbiBcInVwZGF0ZVwiIC0gdGhlIG9iamVjdCBtYXRjaGluZyB0aGUgcXVlcnlcbi8vIHNob3VsZCBnZXQgdXBkYXRlZCB3aXRoIGRhdGEuXG4vLyBSZXN0V3JpdGUgd2lsbCBoYW5kbGUgb2JqZWN0SWQsIGNyZWF0ZWRBdCwgYW5kIHVwZGF0ZWRBdCBmb3Jcbi8vIGV2ZXJ5dGhpbmcuIEl0IGFsc28ga25vd3MgdG8gdXNlIHRyaWdnZXJzIGFuZCBzcGVjaWFsIG1vZGlmaWNhdGlvbnNcbi8vIGZvciB0aGUgX1VzZXIgY2xhc3MuXG5mdW5jdGlvbiBSZXN0V3JpdGUoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIHF1ZXJ5LCBkYXRhLCBvcmlnaW5hbERhdGEsIGNsaWVudFNESywgY29udGV4dCwgYWN0aW9uKSB7XG4gIGlmIChhdXRoLmlzUmVhZE9ubHkpIHtcbiAgICB0aHJvdyBjcmVhdGVTYW5pdGl6ZWRFcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sXG4gICAgICAnQ2Fubm90IHBlcmZvcm0gYSB3cml0ZSBvcGVyYXRpb24gd2hlbiB1c2luZyByZWFkT25seU1hc3RlcktleScsXG4gICAgICBjb25maWdcbiAgICApO1xuICB9XG4gIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB0aGlzLmF1dGggPSBhdXRoO1xuICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgdGhpcy5jbGllbnRTREsgPSBjbGllbnRTREs7XG4gIHRoaXMuc3RvcmFnZSA9IHt9O1xuICB0aGlzLnJ1bk9wdGlvbnMgPSB7fTtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dCB8fCB7fTtcblxuICBpZiAoYWN0aW9uKSB7XG4gICAgdGhpcy5ydW5PcHRpb25zLmFjdGlvbiA9IGFjdGlvbjtcbiAgfVxuXG4gIGlmICghcXVlcnkpIHtcbiAgICBpZiAodGhpcy5jb25maWcuYWxsb3dDdXN0b21PYmplY3RJZCkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCAnb2JqZWN0SWQnKSAmJiAhZGF0YS5vYmplY3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuTUlTU0lOR19PQkpFQ1RfSUQsXG4gICAgICAgICAgJ29iamVjdElkIG11c3Qgbm90IGJlIGVtcHR5LCBudWxsIG9yIHVuZGVmaW5lZCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRhdGEub2JqZWN0SWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsICdvYmplY3RJZCBpcyBhbiBpbnZhbGlkIGZpZWxkIG5hbWUuJyk7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5pZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSwgJ2lkIGlzIGFuIGludmFsaWQgZmllbGQgbmFtZS4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBXaGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUsIHRoaXMucmVzcG9uc2UgbWF5IGhhdmUgc2V2ZXJhbFxuICAvLyBmaWVsZHMuXG4gIC8vIHJlc3BvbnNlOiB0aGUgYWN0dWFsIGRhdGEgdG8gYmUgcmV0dXJuZWRcbiAgLy8gc3RhdHVzOiB0aGUgaHR0cCBzdGF0dXMgY29kZS4gaWYgbm90IHByZXNlbnQsIHRyZWF0ZWQgbGlrZSBhIDIwMFxuICAvLyBsb2NhdGlvbjogdGhlIGxvY2F0aW9uIGhlYWRlci4gaWYgbm90IHByZXNlbnQsIG5vIGxvY2F0aW9uIGhlYWRlclxuICB0aGlzLnJlc3BvbnNlID0gbnVsbDtcblxuICAvLyBQcm9jZXNzaW5nIHRoaXMgb3BlcmF0aW9uIG1heSBtdXRhdGUgb3VyIGRhdGEsIHNvIHdlIG9wZXJhdGUgb24gYVxuICAvLyBjb3B5XG4gIHRoaXMucXVlcnkgPSBkZWVwY29weShxdWVyeSk7XG4gIHRoaXMuZGF0YSA9IGRlZXBjb3B5KGRhdGEpO1xuICAvLyBXZSBuZXZlciBjaGFuZ2Ugb3JpZ2luYWxEYXRhLCBzbyB3ZSBkbyBub3QgbmVlZCBhIGRlZXAgY29weVxuICB0aGlzLm9yaWdpbmFsRGF0YSA9IG9yaWdpbmFsRGF0YTtcblxuICAvLyBUaGUgdGltZXN0YW1wIHdlJ2xsIHVzZSBmb3IgdGhpcyB3aG9sZSBvcGVyYXRpb25cbiAgdGhpcy51cGRhdGVkQXQgPSBQYXJzZS5fZW5jb2RlKG5ldyBEYXRlKCkpLmlzbztcblxuICAvLyBTaGFyZWQgU2NoZW1hQ29udHJvbGxlciB0byBiZSByZXVzZWQgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgbG9hZFNjaGVtYSgpIGNhbGxzIHBlciByZXF1ZXN0XG4gIC8vIE9uY2Ugc2V0IHRoZSBzY2hlbWFEYXRhIHNob3VsZCBiZSBpbW11dGFibGVcbiAgdGhpcy52YWxpZFNjaGVtYUNvbnRyb2xsZXIgPSBudWxsO1xuICB0aGlzLnBlbmRpbmdPcHMgPSB7XG4gICAgb3BlcmF0aW9uczogbnVsbCxcbiAgICBpZGVudGlmaWVyOiBudWxsLFxuICB9O1xufVxuXG4vLyBBIGNvbnZlbmllbnQgbWV0aG9kIHRvIHBlcmZvcm0gYWxsIHRoZSBzdGVwcyBvZiBwcm9jZXNzaW5nIHRoZVxuLy8gd3JpdGUsIGluIG9yZGVyLlxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIGEge3Jlc3BvbnNlLCBzdGF0dXMsIGxvY2F0aW9ufSBvYmplY3QuXG4vLyBzdGF0dXMgYW5kIGxvY2F0aW9uIGFyZSBvcHRpb25hbC5cblJlc3RXcml0ZS5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VXNlckFuZFJvbGVBQ0woKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQ2xpZW50Q2xhc3NDcmVhdGlvbigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW5zdGFsbGF0aW9uKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVTZXNzaW9uKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUF1dGhEYXRhKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jaGVja1Jlc3RyaWN0ZWRGaWVsZHMoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJ1bkJlZm9yZVNhdmVUcmlnZ2VyKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5lbnN1cmVVbmlxdWVBdXRoRGF0YUlkKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kZWxldGVFbWFpbFJlc2V0VG9rZW5JZk5lZWRlZCgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTY2hlbWEoKTtcbiAgICB9KVxuICAgIC50aGVuKHNjaGVtYUNvbnRyb2xsZXIgPT4ge1xuICAgICAgdGhpcy52YWxpZFNjaGVtYUNvbnRyb2xsZXIgPSBzY2hlbWFDb250cm9sbGVyO1xuICAgICAgcmV0dXJuIHRoaXMuc2V0UmVxdWlyZWRGaWVsZHNJZk5lZWRlZCgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtVXNlcigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZXhwYW5kRmlsZXNGb3JFeGlzdGluZ09iamVjdHMoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRlc3Ryb3lEdXBsaWNhdGVkU2Vzc2lvbnMoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJ1bkRhdGFiYXNlT3BlcmF0aW9uKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVTZXNzaW9uVG9rZW5JZk5lZWRlZCgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRm9sbG93dXAoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJ1bkFmdGVyU2F2ZVRyaWdnZXIoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNsZWFuVXNlckF1dGhEYXRhKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICAvLyBBcHBlbmQgdGhlIGF1dGhEYXRhUmVzcG9uc2UgaWYgZXhpc3RzXG4gICAgICBpZiAodGhpcy5hdXRoRGF0YVJlc3BvbnNlKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc3BvbnNlICYmIHRoaXMucmVzcG9uc2UucmVzcG9uc2UpIHtcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlLmF1dGhEYXRhUmVzcG9uc2UgPSB0aGlzLmF1dGhEYXRhUmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0b3JhZ2UucmVqZWN0U2lnbnVwICYmIHRoaXMuY29uZmlnLnByZXZlbnRTaWdudXBXaXRoVW52ZXJpZmllZEVtYWlsKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5FTUFJTF9OT1RfRk9VTkQsICdVc2VyIGVtYWlsIGlzIG5vdCB2ZXJpZmllZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlO1xuICAgIH0pO1xufTtcblxuLy8gVXNlcyB0aGUgQXV0aCBvYmplY3QgdG8gZ2V0IHRoZSBsaXN0IG9mIHJvbGVzLCBhZGRzIHRoZSB1c2VyIGlkXG5SZXN0V3JpdGUucHJvdG90eXBlLmdldFVzZXJBbmRSb2xlQUNMID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hdXRoLmlzTWFzdGVyIHx8IHRoaXMuYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgdGhpcy5ydW5PcHRpb25zLmFjbCA9IFsnKiddO1xuXG4gIGlmICh0aGlzLmF1dGgudXNlcikge1xuICAgIHJldHVybiB0aGlzLmF1dGguZ2V0VXNlclJvbGVzKCkudGhlbihyb2xlcyA9PiB7XG4gICAgICB0aGlzLnJ1bk9wdGlvbnMuYWNsID0gdGhpcy5ydW5PcHRpb25zLmFjbC5jb25jYXQocm9sZXMsIFt0aGlzLmF1dGgudXNlci5pZF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufTtcblxuLy8gVmFsaWRhdGVzIHRoaXMgb3BlcmF0aW9uIGFnYWluc3QgdGhlIGFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiBjb25maWcuXG5SZXN0V3JpdGUucHJvdG90eXBlLnZhbGlkYXRlQ2xpZW50Q2xhc3NDcmVhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKFxuICAgIHRoaXMuY29uZmlnLmFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiA9PT0gZmFsc2UgJiZcbiAgICAhdGhpcy5hdXRoLmlzTWFzdGVyICYmXG4gICAgIXRoaXMuYXV0aC5pc01haW50ZW5hbmNlICYmXG4gICAgU2NoZW1hQ29udHJvbGxlci5zeXN0ZW1DbGFzc2VzLmluZGV4T2YodGhpcy5jbGFzc05hbWUpID09PSAtMVxuICApIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgIC5sb2FkU2NoZW1hKClcbiAgICAgIC50aGVuKHNjaGVtYUNvbnRyb2xsZXIgPT4gc2NoZW1hQ29udHJvbGxlci5oYXNDbGFzcyh0aGlzLmNsYXNzTmFtZSkpXG4gICAgICAudGhlbihoYXNDbGFzcyA9PiB7XG4gICAgICAgIGlmIChoYXNDbGFzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgICAgICAgICdUaGlzIHVzZXIgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXNzIG5vbi1leGlzdGVudCBjbGFzczogJyArIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgICAgICAgdGhpcy5jb25maWdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbn07XG5cbi8vIFZhbGlkYXRlcyB0aGlzIG9wZXJhdGlvbiBhZ2FpbnN0IHRoZSBzY2hlbWEuXG5SZXN0V3JpdGUucHJvdG90eXBlLnZhbGlkYXRlU2NoZW1hID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UudmFsaWRhdGVPYmplY3QoXG4gICAgdGhpcy5jbGFzc05hbWUsXG4gICAgdGhpcy5kYXRhLFxuICAgIHRoaXMucXVlcnksXG4gICAgdGhpcy5ydW5PcHRpb25zLFxuICAgIHRoaXMuYXV0aC5pc01haW50ZW5hbmNlXG4gICk7XG59O1xuXG4vLyBSdW5zIGFueSBiZWZvcmVTYXZlIHRyaWdnZXJzIGFnYWluc3QgdGhpcyBvcGVyYXRpb24uXG4vLyBBbnkgY2hhbmdlIGxlYWRzIHRvIG91ciBkYXRhIGJlaW5nIG11dGF0ZWQuXG5SZXN0V3JpdGUucHJvdG90eXBlLnJ1bkJlZm9yZVNhdmVUcmlnZ2VyID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZXNwb25zZSB8fCB0aGlzLnJ1bk9wdGlvbnMubWFueSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEF2b2lkIGRvaW5nIGFueSBzZXR1cCBmb3IgdHJpZ2dlcnMgaWYgdGhlcmUgaXMgbm8gJ2JlZm9yZVNhdmUnIHRyaWdnZXIgZm9yIHRoaXMgY2xhc3MuXG4gIGlmIChcbiAgICAhdHJpZ2dlcnMudHJpZ2dlckV4aXN0cyh0aGlzLmNsYXNzTmFtZSwgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlU2F2ZSwgdGhpcy5jb25maWcuYXBwbGljYXRpb25JZClcbiAgKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgY29uc3QgeyBvcmlnaW5hbE9iamVjdCwgdXBkYXRlZE9iamVjdCB9ID0gdGhpcy5idWlsZFBhcnNlT2JqZWN0cygpO1xuICBjb25zdCBpZGVudGlmaWVyID0gdXBkYXRlZE9iamVjdC5fZ2V0U3RhdGVJZGVudGlmaWVyKCk7XG4gIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IFBhcnNlLkNvcmVNYW5hZ2VyLmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICBjb25zdCBbcGVuZGluZ10gPSBzdGF0ZUNvbnRyb2xsZXIuZ2V0UGVuZGluZ09wcyhpZGVudGlmaWVyKTtcbiAgdGhpcy5wZW5kaW5nT3BzID0ge1xuICAgIG9wZXJhdGlvbnM6IHsgLi4ucGVuZGluZyB9LFxuICAgIGlkZW50aWZpZXIsXG4gIH07XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gQmVmb3JlIGNhbGxpbmcgdGhlIHRyaWdnZXIsIHZhbGlkYXRlIHRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHNhdmUgb3BlcmF0aW9uXG4gICAgICBsZXQgZGF0YWJhc2VQcm9taXNlID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnF1ZXJ5KSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIGZvciB1cGRhdGluZ1xuICAgICAgICBkYXRhYmFzZVByb21pc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS51cGRhdGUoXG4gICAgICAgICAgdGhpcy5jbGFzc05hbWUsXG4gICAgICAgICAgdGhpcy5xdWVyeSxcbiAgICAgICAgICB0aGlzLmRhdGEsXG4gICAgICAgICAgdGhpcy5ydW5PcHRpb25zLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgZm9yIGNyZWF0aW5nXG4gICAgICAgIGRhdGFiYXNlUHJvbWlzZSA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmNyZWF0ZShcbiAgICAgICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgICAgICB0aGlzLmRhdGEsXG4gICAgICAgICAgdGhpcy5ydW5PcHRpb25zLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgbm8gcGVybWlzc2lvbiBmb3IgdGhlIG9wZXJhdGlvbiwgaXQgdGhyb3dzIGFuIGVycm9yXG4gICAgICByZXR1cm4gZGF0YWJhc2VQcm9taXNlLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0Lmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kLicpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIoXG4gICAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZVNhdmUsXG4gICAgICAgIHRoaXMuYXV0aCxcbiAgICAgICAgdXBkYXRlZE9iamVjdCxcbiAgICAgICAgb3JpZ2luYWxPYmplY3QsXG4gICAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgICB0aGlzLmNvbnRleHRcbiAgICAgICk7XG4gICAgfSlcbiAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uub2JqZWN0KSB7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyID0gXy5yZWR1Y2UoXG4gICAgICAgICAgcmVzcG9uc2Uub2JqZWN0LFxuICAgICAgICAgIChyZXN1bHQsIHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghXy5pc0VxdWFsKHRoaXMuZGF0YVtrZXldLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbXVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmRhdGEgPSByZXNwb25zZS5vYmplY3Q7XG4gICAgICAgIC8vIFdlIHNob3VsZCBkZWxldGUgdGhlIG9iamVjdElkIGZvciBhbiB1cGRhdGUgd3JpdGVcbiAgICAgICAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmRhdGEub2JqZWN0SWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIFV0aWxzLmNoZWNrUHJvaGliaXRlZEtleXdvcmRzKHRoaXMuY29uZmlnLCB0aGlzLmRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUucnVuQmVmb3JlTG9naW5UcmlnZ2VyID0gYXN5bmMgZnVuY3Rpb24gKHVzZXJEYXRhKSB7XG4gIC8vIEF2b2lkIGRvaW5nIGFueSBzZXR1cCBmb3IgdHJpZ2dlcnMgaWYgdGhlcmUgaXMgbm8gJ2JlZm9yZUxvZ2luJyB0cmlnZ2VyXG4gIGlmIChcbiAgICAhdHJpZ2dlcnMudHJpZ2dlckV4aXN0cyh0aGlzLmNsYXNzTmFtZSwgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlTG9naW4sIHRoaXMuY29uZmlnLmFwcGxpY2F0aW9uSWQpXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIENsb3VkIGNvZGUgZ2V0cyBhIGJpdCBvZiBleHRyYSBkYXRhIGZvciBpdHMgb2JqZWN0c1xuICBjb25zdCBleHRyYURhdGEgPSB7IGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUgfTtcblxuICAvLyBFeHBhbmQgZmlsZSBvYmplY3RzXG4gIGF3YWl0IHRoaXMuY29uZmlnLmZpbGVzQ29udHJvbGxlci5leHBhbmRGaWxlc0luT2JqZWN0KHRoaXMuY29uZmlnLCB1c2VyRGF0YSk7XG5cbiAgY29uc3QgdXNlciA9IHRyaWdnZXJzLmluZmxhdGUoZXh0cmFEYXRhLCB1c2VyRGF0YSk7XG5cbiAgLy8gbm8gbmVlZCB0byByZXR1cm4gYSByZXNwb25zZVxuICBhd2FpdCB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIoXG4gICAgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlTG9naW4sXG4gICAgdGhpcy5hdXRoLFxuICAgIHVzZXIsXG4gICAgbnVsbCxcbiAgICB0aGlzLmNvbmZpZyxcbiAgICB0aGlzLmNvbnRleHRcbiAgKTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuc2V0UmVxdWlyZWRGaWVsZHNJZk5lZWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlci5nZXRBbGxDbGFzc2VzKCkudGhlbihhbGxDbGFzc2VzID0+IHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGFsbENsYXNzZXMuZmluZChvbmVDbGFzcyA9PiBvbmVDbGFzcy5jbGFzc05hbWUgPT09IHRoaXMuY2xhc3NOYW1lKTtcbiAgICAgIGNvbnN0IHNldFJlcXVpcmVkRmllbGRJZk5lZWRlZCA9IChmaWVsZE5hbWUsIHNldERlZmF1bHQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZE5hbWVdID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICB0aGlzLmRhdGFbZmllbGROYW1lXSA9PT0gbnVsbCB8fFxuICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZE5hbWVdID09PSAnJyB8fFxuICAgICAgICAgICh0eXBlb2YgdGhpcy5kYXRhW2ZpZWxkTmFtZV0gPT09ICdvYmplY3QnICYmIHRoaXMuZGF0YVtmaWVsZE5hbWVdLl9fb3AgPT09ICdEZWxldGUnKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzZXREZWZhdWx0ICYmXG4gICAgICAgICAgICBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiZcbiAgICAgICAgICAgIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS5kZWZhdWx0VmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKHRoaXMuZGF0YVtmaWVsZE5hbWVdID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRhdGFbZmllbGROYW1lXSA9PT0gJ29iamVjdCcgJiYgdGhpcy5kYXRhW2ZpZWxkTmFtZV0uX19vcCA9PT0gJ0RlbGV0ZScpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5kYXRhW2ZpZWxkTmFtZV0gPSBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0uZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlLmZpZWxkc0NoYW5nZWRCeVRyaWdnZXIgPSB0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlciB8fCBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlci5pbmRleE9mKGZpZWxkTmFtZSkgPCAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyLnB1c2goZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYS5maWVsZHNbZmllbGROYW1lXSAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0ucmVxdWlyZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLCBgJHtmaWVsZE5hbWV9IGlzIHJlcXVpcmVkYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBhZGQgZGVmYXVsdCBBQ0xcbiAgICAgIGlmIChcbiAgICAgICAgc2NoZW1hPy5jbGFzc0xldmVsUGVybWlzc2lvbnM/LkFDTCAmJlxuICAgICAgICAhdGhpcy5kYXRhLkFDTCAmJlxuICAgICAgICBKU09OLnN0cmluZ2lmeShzY2hlbWEuY2xhc3NMZXZlbFBlcm1pc3Npb25zLkFDTCkgIT09XG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyAnKic6IHsgcmVhZDogdHJ1ZSwgd3JpdGU6IHRydWUgfSB9KVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGFjbCA9IGRlZXBjb3B5KHNjaGVtYS5jbGFzc0xldmVsUGVybWlzc2lvbnMuQUNMKTtcbiAgICAgICAgaWYgKGFjbC5jdXJyZW50VXNlcikge1xuICAgICAgICAgIGlmICh0aGlzLmF1dGgudXNlcj8uaWQpIHtcbiAgICAgICAgICAgIGFjbFt0aGlzLmF1dGgudXNlcj8uaWRdID0gZGVlcGNvcHkoYWNsLmN1cnJlbnRVc2VyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIGFjbC5jdXJyZW50VXNlcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGEuQUNMID0gYWNsO1xuICAgICAgICB0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlciA9IHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyIHx8IFtdO1xuICAgICAgICB0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlci5wdXNoKCdBQ0wnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGRlZmF1bHQgZmllbGRzXG4gICAgICBpZiAoIXRoaXMucXVlcnkpIHtcbiAgICAgICAgLy8gYWxsb3cgY3VzdG9taXppbmcgY3JlYXRlZEF0IGFuZCB1cGRhdGVkQXQgd2hlbiB1c2luZyBtYWludGVuYW5jZSBrZXlcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYXV0aC5pc01haW50ZW5hbmNlICYmXG4gICAgICAgICAgdGhpcy5kYXRhLmNyZWF0ZWRBdCAmJlxuICAgICAgICAgIHRoaXMuZGF0YS5jcmVhdGVkQXQuX190eXBlID09PSAnRGF0ZSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLmNyZWF0ZWRBdCA9IHRoaXMuZGF0YS5jcmVhdGVkQXQuaXNvO1xuXG4gICAgICAgICAgaWYgKHRoaXMuZGF0YS51cGRhdGVkQXQgJiYgdGhpcy5kYXRhLnVwZGF0ZWRBdC5fX3R5cGUgPT09ICdEYXRlJykge1xuICAgICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID0gbmV3IERhdGUodGhpcy5kYXRhLmNyZWF0ZWRBdCk7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkQXQgPSBuZXcgRGF0ZSh0aGlzLmRhdGEudXBkYXRlZEF0Lmlzbyk7XG5cbiAgICAgICAgICAgIGlmICh1cGRhdGVkQXQgPCBjcmVhdGVkQXQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICAgIFBhcnNlLkVycm9yLlZBTElEQVRJT05fRVJST1IsXG4gICAgICAgICAgICAgICAgJ3VwZGF0ZWRBdCBjYW5ub3Qgb2NjdXIgYmVmb3JlIGNyZWF0ZWRBdCdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5kYXRhLnVwZGF0ZWRBdCA9IHRoaXMuZGF0YS51cGRhdGVkQXQuaXNvO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpZiBubyB1cGRhdGVkQXQgaXMgcHJvdmlkZWQsIHNldCBpdCB0byBjcmVhdGVkQXQgdG8gbWF0Y2ggZGVmYXVsdCBiZWhhdmlvclxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhLnVwZGF0ZWRBdCA9IHRoaXMuZGF0YS5jcmVhdGVkQXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGF0YS51cGRhdGVkQXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICAgICAgICB0aGlzLmRhdGEuY3JlYXRlZEF0ID0gdGhpcy51cGRhdGVkQXQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IGFzc2lnbiBuZXcgb2JqZWN0SWQgaWYgd2UgYXJlIGNyZWF0aW5nIG5ldyBvYmplY3RcbiAgICAgICAgaWYgKCF0aGlzLmRhdGEub2JqZWN0SWQpIHtcbiAgICAgICAgICB0aGlzLmRhdGEub2JqZWN0SWQgPSBjcnlwdG9VdGlscy5uZXdPYmplY3RJZCh0aGlzLmNvbmZpZy5vYmplY3RJZFNpemUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhzY2hlbWEuZmllbGRzKS5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XG4gICAgICAgICAgICBzZXRSZXF1aXJlZEZpZWxkSWZOZWVkZWQoZmllbGROYW1lLCB0cnVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzY2hlbWEpIHtcbiAgICAgICAgdGhpcy5kYXRhLnVwZGF0ZWRBdCA9IHRoaXMudXBkYXRlZEF0O1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgICAgICAgIHNldFJlcXVpcmVkRmllbGRJZk5lZWRlZChmaWVsZE5hbWUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufTtcblxuLy8gVHJhbnNmb3JtcyBhdXRoIGRhdGEgZm9yIGEgdXNlciBvYmplY3QuXG4vLyBEb2VzIG5vdGhpbmcgaWYgdGhpcyBpc24ndCBhIHVzZXIgb2JqZWN0LlxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHdoZW4gd2UncmUgZG9uZSBpZiBpdCBjYW4ndCBmaW5pc2ggdGhpcyB0aWNrLlxuUmVzdFdyaXRlLnByb3RvdHlwZS52YWxpZGF0ZUF1dGhEYXRhID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jbGFzc05hbWUgIT09ICdfVXNlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZGF0YS5hdXRoRGF0YTtcbiAgY29uc3QgaGFzVXNlcm5hbWVBbmRQYXNzd29yZCA9XG4gICAgdHlwZW9mIHRoaXMuZGF0YS51c2VybmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHRoaXMuZGF0YS5wYXNzd29yZCA9PT0gJ3N0cmluZyc7XG5cbiAgaWYgKCF0aGlzLnF1ZXJ5ICYmICFhdXRoRGF0YSkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLnVzZXJuYW1lICE9PSAnc3RyaW5nJyB8fCBfLmlzRW1wdHkodGhpcy5kYXRhLnVzZXJuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLlVTRVJOQU1FX01JU1NJTkcsICdiYWQgb3IgbWlzc2luZyB1c2VybmFtZScpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMuZGF0YS5wYXNzd29yZCAhPT0gJ3N0cmluZycgfHwgXy5pc0VtcHR5KHRoaXMuZGF0YS5wYXNzd29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5QQVNTV09SRF9NSVNTSU5HLCAncGFzc3dvcmQgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgKGF1dGhEYXRhICYmICFPYmplY3Qua2V5cyhhdXRoRGF0YSkubGVuZ3RoKSB8fFxuICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5kYXRhLCAnYXV0aERhdGEnKVxuICApIHtcbiAgICAvLyBOb3RoaW5nIHRvIHZhbGlkYXRlIGhlcmVcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuZGF0YSwgJ2F1dGhEYXRhJykgJiYgIXRoaXMuZGF0YS5hdXRoRGF0YSkge1xuICAgIC8vIEhhbmRsZSBzYXZpbmcgYXV0aERhdGEgdG8gbnVsbFxuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLlVOU1VQUE9SVEVEX1NFUlZJQ0UsXG4gICAgICAnVGhpcyBhdXRoZW50aWNhdGlvbiBtZXRob2QgaXMgdW5zdXBwb3J0ZWQuJ1xuICAgICk7XG4gIH1cblxuICB2YXIgcHJvdmlkZXJzID0gT2JqZWN0LmtleXMoYXV0aERhdGEpO1xuICBpZiAocHJvdmlkZXJzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjYW5IYW5kbGVBdXRoRGF0YSA9IHByb3ZpZGVycy5zb21lKHByb3ZpZGVyID0+IHtcbiAgICAgIGNvbnN0IHByb3ZpZGVyQXV0aERhdGEgPSBhdXRoRGF0YVtwcm92aWRlcl0gfHwge307XG4gICAgICByZXR1cm4gISFPYmplY3Qua2V5cyhwcm92aWRlckF1dGhEYXRhKS5sZW5ndGg7XG4gICAgfSk7XG4gICAgaWYgKGNhbkhhbmRsZUF1dGhEYXRhIHx8IGhhc1VzZXJuYW1lQW5kUGFzc3dvcmQgfHwgdGhpcy5hdXRoLmlzTWFzdGVyIHx8IHRoaXMuZ2V0VXNlcklkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUF1dGhEYXRhKGF1dGhEYXRhKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgIFBhcnNlLkVycm9yLlVOU1VQUE9SVEVEX1NFUlZJQ0UsXG4gICAgJ1RoaXMgYXV0aGVudGljYXRpb24gbWV0aG9kIGlzIHVuc3VwcG9ydGVkLidcbiAgKTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuZmlsdGVyZWRPYmplY3RzQnlBQ0wgPSBmdW5jdGlvbiAob2JqZWN0cykge1xuICBpZiAodGhpcy5hdXRoLmlzTWFzdGVyIHx8IHRoaXMuYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgcmV0dXJuIG9iamVjdHM7XG4gIH1cbiAgcmV0dXJuIG9iamVjdHMuZmlsdGVyKG9iamVjdCA9PiB7XG4gICAgaWYgKCFvYmplY3QuQUNMKSB7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gbGVnYWN5IHVzZXJzIHRoYXQgaGF2ZSBubyBBQ0wgZmllbGQgb24gdGhlbVxuICAgIH1cbiAgICAvLyBSZWd1bGFyIHVzZXJzIHRoYXQgaGF2ZSBiZWVuIGxvY2tlZCBvdXQuXG4gICAgcmV0dXJuIG9iamVjdC5BQ0wgJiYgT2JqZWN0LmtleXMob2JqZWN0LkFDTCkubGVuZ3RoID4gMDtcbiAgfSk7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmdldFVzZXJJZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCAmJiB0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5Lm9iamVjdElkO1xuICB9IGVsc2UgaWYgKHRoaXMuYXV0aCAmJiB0aGlzLmF1dGgudXNlciAmJiB0aGlzLmF1dGgudXNlci5pZCkge1xuICAgIHJldHVybiB0aGlzLmF1dGgudXNlci5pZDtcbiAgfVxufTtcblxuLy8gRGV2ZWxvcGVycyBhcmUgYWxsb3dlZCB0byBjaGFuZ2UgYXV0aERhdGEgdmlhIGJlZm9yZSBzYXZlIHRyaWdnZXJcbi8vIHdlIG5lZWQgYWZ0ZXIgYmVmb3JlIHNhdmUgdG8gZW5zdXJlIHRoYXQgdGhlIGRldmVsb3BlclxuLy8gaXMgbm90IGN1cnJlbnRseSBkdXBsaWNhdGluZyBhdXRoIGRhdGEgSURcblJlc3RXcml0ZS5wcm90b3R5cGUuZW5zdXJlVW5pcXVlQXV0aERhdGFJZCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2xhc3NOYW1lICE9PSAnX1VzZXInIHx8ICF0aGlzLmRhdGEuYXV0aERhdGEpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoYXNBdXRoRGF0YUlkID0gT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5zb21lKFxuICAgIGtleSA9PiB0aGlzLmRhdGEuYXV0aERhdGFba2V5XSAmJiB0aGlzLmRhdGEuYXV0aERhdGFba2V5XS5pZFxuICApO1xuXG4gIGlmICghaGFzQXV0aERhdGFJZCkgeyByZXR1cm47IH1cblxuICBjb25zdCByID0gYXdhaXQgQXV0aC5maW5kVXNlcnNXaXRoQXV0aERhdGEodGhpcy5jb25maWcsIHRoaXMuZGF0YS5hdXRoRGF0YSk7XG4gIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmZpbHRlcmVkT2JqZWN0c0J5QUNMKHIpO1xuICBpZiAocmVzdWx0cy5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkFDQ09VTlRfQUxSRUFEWV9MSU5LRUQsICd0aGlzIGF1dGggaXMgYWxyZWFkeSB1c2VkJyk7XG4gIH1cbiAgLy8gdXNlIGRhdGEub2JqZWN0SWQgaW4gY2FzZSBvZiBsb2dpbiB0aW1lIGFuZCBmb3VuZCB1c2VyIGR1cmluZyBoYW5kbGUgdmFsaWRhdGVBdXRoRGF0YVxuICBjb25zdCB1c2VySWQgPSB0aGlzLmdldFVzZXJJZCgpIHx8IHRoaXMuZGF0YS5vYmplY3RJZDtcbiAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAxICYmIHVzZXJJZCAhPT0gcmVzdWx0c1swXS5vYmplY3RJZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5BQ0NPVU5UX0FMUkVBRFlfTElOS0VELCAndGhpcyBhdXRoIGlzIGFscmVhZHkgdXNlZCcpO1xuICB9XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmhhbmRsZUF1dGhEYXRhID0gYXN5bmMgZnVuY3Rpb24gKGF1dGhEYXRhKSB7XG4gIGNvbnN0IHIgPSBhd2FpdCBBdXRoLmZpbmRVc2Vyc1dpdGhBdXRoRGF0YSh0aGlzLmNvbmZpZywgYXV0aERhdGEsIHRydWUpO1xuICBjb25zdCByZXN1bHRzID0gdGhpcy5maWx0ZXJlZE9iamVjdHNCeUFDTChyKTtcblxuICBjb25zdCB1c2VySWQgPSB0aGlzLmdldFVzZXJJZCgpO1xuICBjb25zdCB1c2VyUmVzdWx0ID0gcmVzdWx0c1swXTtcbiAgY29uc3QgZm91bmRVc2VySXNOb3RDdXJyZW50VXNlciA9IHVzZXJJZCAmJiB1c2VyUmVzdWx0ICYmIHVzZXJJZCAhPT0gdXNlclJlc3VsdC5vYmplY3RJZDtcblxuICBpZiAocmVzdWx0cy5sZW5ndGggPiAxIHx8IGZvdW5kVXNlcklzTm90Q3VycmVudFVzZXIpIHtcbiAgICAvLyBUbyBhdm9pZCBodHRwczovL2dpdGh1Yi5jb20vcGFyc2UtY29tbXVuaXR5L3BhcnNlLXNlcnZlci9zZWN1cml0eS9hZHZpc29yaWVzL0dIU0EtOHczai1nOTgzLThqaDVcbiAgICAvLyBMZXQncyBydW4gc29tZSB2YWxpZGF0aW9uIGJlZm9yZSB0aHJvd2luZ1xuICAgIGF3YWl0IEF1dGguaGFuZGxlQXV0aERhdGFWYWxpZGF0aW9uKGF1dGhEYXRhLCB0aGlzLCB1c2VyUmVzdWx0KTtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuQUNDT1VOVF9BTFJFQURZX0xJTktFRCwgJ3RoaXMgYXV0aCBpcyBhbHJlYWR5IHVzZWQnKTtcbiAgfVxuXG4gIC8vIE5vIHVzZXIgZm91bmQgd2l0aCBwcm92aWRlZCBhdXRoRGF0YSB3ZSBuZWVkIHRvIHZhbGlkYXRlXG4gIGlmICghcmVzdWx0cy5sZW5ndGgpIHtcbiAgICBjb25zdCB7IGF1dGhEYXRhOiB2YWxpZGF0ZWRBdXRoRGF0YSwgYXV0aERhdGFSZXNwb25zZSB9ID0gYXdhaXQgQXV0aC5oYW5kbGVBdXRoRGF0YVZhbGlkYXRpb24oXG4gICAgICBhdXRoRGF0YSxcbiAgICAgIHRoaXNcbiAgICApO1xuICAgIHRoaXMuYXV0aERhdGFSZXNwb25zZSA9IGF1dGhEYXRhUmVzcG9uc2U7XG4gICAgLy8gUmVwbGFjZSBjdXJyZW50IGF1dGhEYXRhIGJ5IHRoZSBuZXcgdmFsaWRhdGVkIG9uZVxuICAgIHRoaXMuZGF0YS5hdXRoRGF0YSA9IHZhbGlkYXRlZEF1dGhEYXRhO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFVzZXIgZm91bmQgd2l0aCBwcm92aWRlZCBhdXRoRGF0YVxuICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDEpIHtcbiAgICB0aGlzLnN0b3JhZ2UuYXV0aFByb3ZpZGVyID0gT2JqZWN0LmtleXMoYXV0aERhdGEpLmpvaW4oJywnKTtcblxuICAgIGNvbnN0IHsgaGFzTXV0YXRlZEF1dGhEYXRhLCBtdXRhdGVkQXV0aERhdGEgfSA9IEF1dGguaGFzTXV0YXRlZEF1dGhEYXRhKFxuICAgICAgYXV0aERhdGEsXG4gICAgICB1c2VyUmVzdWx0LmF1dGhEYXRhXG4gICAgKTtcblxuICAgIGNvbnN0IGlzQ3VycmVudFVzZXJMb2dnZWRPck1hc3RlciA9XG4gICAgICAodGhpcy5hdXRoICYmIHRoaXMuYXV0aC51c2VyICYmIHRoaXMuYXV0aC51c2VyLmlkID09PSB1c2VyUmVzdWx0Lm9iamVjdElkKSB8fFxuICAgICAgdGhpcy5hdXRoLmlzTWFzdGVyO1xuXG4gICAgY29uc3QgaXNMb2dpbiA9ICF1c2VySWQ7XG5cbiAgICBpZiAoaXNMb2dpbiB8fCBpc0N1cnJlbnRVc2VyTG9nZ2VkT3JNYXN0ZXIpIHtcbiAgICAgIC8vIG5vIHVzZXIgbWFraW5nIHRoZSBjYWxsXG4gICAgICAvLyBPUiB0aGUgdXNlciBtYWtpbmcgdGhlIGNhbGwgaXMgdGhlIHJpZ2h0IG9uZVxuICAgICAgLy8gTG9naW4gd2l0aCBhdXRoIGRhdGFcbiAgICAgIGRlbGV0ZSByZXN1bHRzWzBdLnBhc3N3b3JkO1xuXG4gICAgICAvLyBuZWVkIHRvIHNldCB0aGUgb2JqZWN0SWQgZmlyc3Qgb3RoZXJ3aXNlIGxvY2F0aW9uIGhhcyB0cmFpbGluZyB1bmRlZmluZWRcbiAgICAgIHRoaXMuZGF0YS5vYmplY3RJZCA9IHVzZXJSZXN1bHQub2JqZWN0SWQ7XG5cbiAgICAgIGlmICghdGhpcy5xdWVyeSB8fCAhdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0ge1xuICAgICAgICAgIHJlc3BvbnNlOiB1c2VyUmVzdWx0LFxuICAgICAgICAgIGxvY2F0aW9uOiB0aGlzLmxvY2F0aW9uKCksXG4gICAgICAgIH07XG4gICAgICAgIC8vIFJ1biBiZWZvcmVMb2dpbiBob29rIGJlZm9yZSBzdG9yaW5nIGFueSB1cGRhdGVzXG4gICAgICAgIC8vIHRvIGF1dGhEYXRhIG9uIHRoZSBkYjsgY2hhbmdlcyB0byB1c2VyUmVzdWx0XG4gICAgICAgIC8vIHdpbGwgYmUgaWdub3JlZC5cbiAgICAgICAgYXdhaXQgdGhpcy5ydW5CZWZvcmVMb2dpblRyaWdnZXIoZGVlcGNvcHkodXNlclJlc3VsdCkpO1xuXG4gICAgICAgIC8vIElmIHdlIGFyZSBpbiBsb2dpbiBvcGVyYXRpb24gdmlhIGF1dGhEYXRhXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gYmUgc3VyZSB0aGF0IHRoZSB1c2VyIGhhcyBwcm92aWRlZFxuICAgICAgICAvLyByZXF1aXJlZCBhdXRoRGF0YVxuICAgICAgICBBdXRoLmNoZWNrSWZVc2VySGFzUHJvdmlkZWRDb25maWd1cmVkUHJvdmlkZXJzRm9yTG9naW4oXG4gICAgICAgICAgeyBjb25maWc6IHRoaXMuY29uZmlnLCBhdXRoOiB0aGlzLmF1dGggfSxcbiAgICAgICAgICBhdXRoRGF0YSxcbiAgICAgICAgICB1c2VyUmVzdWx0LmF1dGhEYXRhLFxuICAgICAgICAgIHRoaXMuY29uZmlnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXZlbnQgdmFsaWRhdGluZyBpZiBubyBtdXRhdGVkIGRhdGEgZGV0ZWN0ZWQgb24gdXBkYXRlXG4gICAgICBpZiAoIWhhc011dGF0ZWRBdXRoRGF0YSAmJiBpc0N1cnJlbnRVc2VyTG9nZ2VkT3JNYXN0ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3JjZSB0byB2YWxpZGF0ZSBhbGwgcHJvdmlkZWQgYXV0aERhdGEgb24gbG9naW5cbiAgICAgIC8vIG9uIHVwZGF0ZSBvbmx5IHZhbGlkYXRlIG11dGF0ZWQgb25lc1xuICAgICAgaWYgKGhhc011dGF0ZWRBdXRoRGF0YSB8fCAhdGhpcy5jb25maWcuYWxsb3dFeHBpcmVkQXV0aERhdGFUb2tlbikge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBBdXRoLmhhbmRsZUF1dGhEYXRhVmFsaWRhdGlvbihcbiAgICAgICAgICBpc0xvZ2luID8gYXV0aERhdGEgOiBtdXRhdGVkQXV0aERhdGEsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB1c2VyUmVzdWx0XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZGF0YS5hdXRoRGF0YSA9IHJlcy5hdXRoRGF0YTtcbiAgICAgICAgdGhpcy5hdXRoRGF0YVJlc3BvbnNlID0gcmVzLmF1dGhEYXRhUmVzcG9uc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIElGIHdlIGFyZSBpbiBsb2dpbiB3ZSdsbCBza2lwIHRoZSBkYXRhYmFzZSBvcGVyYXRpb24gLyBiZWZvcmVTYXZlIC8gYWZ0ZXJTYXZlIGV0Yy4uLlxuICAgICAgLy8gd2UgbmVlZCB0byBzZXQgaXQgdXAgdGhlcmUuXG4gICAgICAvLyBXZSBhcmUgc3VwcG9zZWQgdG8gaGF2ZSBhIHJlc3BvbnNlIG9ubHkgb24gTE9HSU4gd2l0aCBhdXRoRGF0YSwgc28gd2Ugc2tpcCB0aG9zZVxuICAgICAgLy8gSWYgd2UncmUgbm90IGxvZ2dpbmcgaW4sIGJ1dCBqdXN0IHVwZGF0aW5nIHRoZSBjdXJyZW50IHVzZXIsIHdlIGNhbiBzYWZlbHkgc2tpcCB0aGF0IHBhcnRcbiAgICAgIGlmICh0aGlzLnJlc3BvbnNlKSB7XG4gICAgICAgIC8vIEFzc2lnbiB0aGUgbmV3IGF1dGhEYXRhIGluIHRoZSByZXNwb25zZVxuICAgICAgICBPYmplY3Qua2V5cyhtdXRhdGVkQXV0aERhdGEpLmZvckVhY2gocHJvdmlkZXIgPT4ge1xuICAgICAgICAgIHRoaXMucmVzcG9uc2UucmVzcG9uc2UuYXV0aERhdGFbcHJvdmlkZXJdID0gbXV0YXRlZEF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUnVuIHRoZSBEQiB1cGRhdGUgZGlyZWN0bHksIGFzICdtYXN0ZXInIG9ubHkgaWYgYXV0aERhdGEgY29udGFpbnMgc29tZSBrZXlzXG4gICAgICAgIC8vIGF1dGhEYXRhIGNvdWxkIG5vdCBjb250YWlucyBrZXlzIGFmdGVyIHZhbGlkYXRpb24gaWYgdGhlIGF1dGhBZGFwdGVyXG4gICAgICAgIC8vIHVzZXMgdGhlIGBkb05vdFNhdmVgIG9wdGlvbi4gSnVzdCB1cGRhdGUgdGhlIGF1dGhEYXRhIHBhcnRcbiAgICAgICAgLy8gVGhlbiB3ZSdyZSBnb29kIGZvciB0aGUgdXNlciwgZWFybHkgZXhpdCBvZiBzb3J0c1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5sZW5ndGgpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZy5kYXRhYmFzZS51cGRhdGUoXG4gICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIHsgb2JqZWN0SWQ6IHRoaXMuZGF0YS5vYmplY3RJZCB9LFxuICAgICAgICAgICAgeyBhdXRoRGF0YTogdGhpcy5kYXRhLmF1dGhEYXRhIH0sXG4gICAgICAgICAgICB7fVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuY2hlY2tSZXN0cmljdGVkRmllbGRzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jbGFzc05hbWUgIT09ICdfVXNlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXRoaXMuYXV0aC5pc01haW50ZW5hbmNlICYmICF0aGlzLmF1dGguaXNNYXN0ZXIgJiYgJ2VtYWlsVmVyaWZpZWQnIGluIHRoaXMuZGF0YSkge1xuICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgIFwiQ2xpZW50cyBhcmVuJ3QgYWxsb3dlZCB0byBtYW51YWxseSB1cGRhdGUgZW1haWwgdmVyaWZpY2F0aW9uLlwiLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59O1xuXG4vLyBUaGUgbm9uLXRoaXJkLXBhcnR5IHBhcnRzIG9mIFVzZXIgdHJhbnNmb3JtYXRpb25cblJlc3RXcml0ZS5wcm90b3R5cGUudHJhbnNmb3JtVXNlciA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgaWYgKHRoaXMuY2xhc3NOYW1lICE9PSAnX1VzZXInKSB7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICAvLyBEbyBub3QgY2xlYW51cCBzZXNzaW9uIGlmIG9iamVjdElkIGlzIG5vdCBzZXRcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5vYmplY3RJZCgpKSB7XG4gICAgLy8gSWYgd2UncmUgdXBkYXRpbmcgYSBfVXNlciBvYmplY3QsIHdlIG5lZWQgdG8gY2xlYXIgb3V0IHRoZSBjYWNoZSBmb3IgdGhhdCB1c2VyLiBGaW5kIGFsbCB0aGVpclxuICAgIC8vIHNlc3Npb24gdG9rZW5zLCBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgY2FjaGUuXG4gICAgY29uc3QgcXVlcnkgPSBhd2FpdCBSZXN0UXVlcnkoe1xuICAgICAgbWV0aG9kOiBSZXN0UXVlcnkuTWV0aG9kLmZpbmQsXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgYXV0aDogQXV0aC5tYXN0ZXIodGhpcy5jb25maWcpLFxuICAgICAgY2xhc3NOYW1lOiAnX1Nlc3Npb24nLFxuICAgICAgcnVuQmVmb3JlRmluZDogZmFsc2UsXG4gICAgICByZXN0V2hlcmU6IHtcbiAgICAgICAgdXNlcjoge1xuICAgICAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ19Vc2VyJyxcbiAgICAgICAgICBvYmplY3RJZDogdGhpcy5vYmplY3RJZCgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBwcm9taXNlID0gcXVlcnkuZXhlY3V0ZSgpLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICByZXN1bHRzLnJlc3VsdHMuZm9yRWFjaChzZXNzaW9uID0+XG4gICAgICAgIHRoaXMuY29uZmlnLmNhY2hlQ29udHJvbGxlci51c2VyLmRlbChzZXNzaW9uLnNlc3Npb25Ub2tlbilcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHJvbWlzZVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIC8vIFRyYW5zZm9ybSB0aGUgcGFzc3dvcmRcbiAgICAgIGlmICh0aGlzLmRhdGEucGFzc3dvcmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBpZ25vcmUgb25seSBpZiB1bmRlZmluZWQuIHNob3VsZCBwcm9jZWVkIGlmIGVtcHR5ICgnJylcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdWVyeSkge1xuICAgICAgICB0aGlzLnN0b3JhZ2VbJ2NsZWFyU2Vzc2lvbnMnXSA9IHRydWU7XG4gICAgICAgIC8vIEdlbmVyYXRlIGEgbmV3IHNlc3Npb24gb25seSBpZiB0aGUgdXNlciByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKCF0aGlzLmF1dGguaXNNYXN0ZXIgJiYgIXRoaXMuYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgICAgICAgdGhpcy5zdG9yYWdlWydnZW5lcmF0ZU5ld1Nlc3Npb24nXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlUGFzc3dvcmRQb2xpY3koKS50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHBhc3N3b3JkQ3J5cHRvLmhhc2godGhpcy5kYXRhLnBhc3N3b3JkKS50aGVuKGhhc2hlZFBhc3N3b3JkID0+IHtcbiAgICAgICAgICB0aGlzLmRhdGEuX2hhc2hlZF9wYXNzd29yZCA9IGhhc2hlZFBhc3N3b3JkO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmRhdGEucGFzc3dvcmQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVVc2VyTmFtZSgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlRW1haWwoKTtcbiAgICB9KTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuX3ZhbGlkYXRlVXNlck5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIENoZWNrIGZvciB1c2VybmFtZSB1bmlxdWVuZXNzXG4gIGlmICghdGhpcy5kYXRhLnVzZXJuYW1lKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXJ5KSB7XG4gICAgICB0aGlzLmRhdGEudXNlcm5hbWUgPSBjcnlwdG9VdGlscy5yYW5kb21TdHJpbmcoMjUpO1xuICAgICAgdGhpcy5yZXNwb25zZVNob3VsZEhhdmVVc2VybmFtZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICAvKlxuICAgIFVzZXJuYW1lcyBzaG91bGQgYmUgdW5pcXVlIHdoZW4gY29tcGFyZWQgY2FzZSBpbnNlbnNpdGl2ZWx5XG5cbiAgICBVc2VycyBzaG91bGQgYmUgYWJsZSB0byBtYWtlIGNhc2Ugc2Vuc2l0aXZlIHVzZXJuYW1lcyBhbmRcbiAgICBsb2dpbiB1c2luZyB0aGUgY2FzZSB0aGV5IGVudGVyZWQuICBJLmUuICdTbm9vcHknIHNob3VsZCBwcmVjbHVkZVxuICAgICdzbm9vcHknIGFzIGEgdmFsaWQgdXNlcm5hbWUuXG4gICovXG4gIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgIC5maW5kKFxuICAgICAgdGhpcy5jbGFzc05hbWUsXG4gICAgICB7XG4gICAgICAgIHVzZXJuYW1lOiB0aGlzLmRhdGEudXNlcm5hbWUsXG4gICAgICAgIG9iamVjdElkOiB7ICRuZTogdGhpcy5vYmplY3RJZCgpIH0sXG4gICAgICB9LFxuICAgICAgeyBsaW1pdDogMSwgY2FzZUluc2Vuc2l0aXZlOiB0cnVlIH0sXG4gICAgICB7fSxcbiAgICAgIHRoaXMudmFsaWRTY2hlbWFDb250cm9sbGVyXG4gICAgKVxuICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuVVNFUk5BTUVfVEFLRU4sXG4gICAgICAgICAgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdXNlcm5hbWUuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xufTtcblxuLypcbiAgQXMgd2l0aCB1c2VybmFtZXMsIFBhcnNlIHNob3VsZCBub3QgYWxsb3cgY2FzZSBpbnNlbnNpdGl2ZSBjb2xsaXNpb25zIG9mIGVtYWlsLlxuICB1bmxpa2Ugd2l0aCB1c2VybmFtZXMgKHdoaWNoIGNhbiBoYXZlIGNhc2UgaW5zZW5zaXRpdmUgY29sbGlzaW9ucyBpbiB0aGUgY2FzZSBvZlxuICBhdXRoIGFkYXB0ZXJzKSwgZW1haWxzIHNob3VsZCBuZXZlciBoYXZlIGEgY2FzZSBpbnNlbnNpdGl2ZSBjb2xsaXNpb24uXG5cbiAgVGhpcyBiZWhhdmlvciBjYW4gYmUgZW5mb3JjZWQgdGhyb3VnaCBhIHByb3Blcmx5IGNvbmZpZ3VyZWQgaW5kZXggc2VlOlxuICBodHRwczovL2RvY3MubW9uZ29kYi5jb20vbWFudWFsL2NvcmUvaW5kZXgtY2FzZS1pbnNlbnNpdGl2ZS8jY3JlYXRlLWEtY2FzZS1pbnNlbnNpdGl2ZS1pbmRleFxuICB3aGljaCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbnN0ZWFkIG9mIHRoaXMgY29kZSBiYXNlZCB2YWxpZGF0aW9uLlxuXG4gIEdpdmVuIHRoYXQgdGhpcyBsb29rdXAgc2hvdWxkIGJlIGEgcmVsYXRpdmVseSBsb3cgdXNlIGNhc2UgYW5kIHRoYXQgdGhlIGNhc2Ugc2Vuc2l0aXZlXG4gIHVuaXF1ZSBpbmRleCB3aWxsIGJlIHVzZWQgYnkgdGhlIGRiIGZvciB0aGUgcXVlcnksIHRoaXMgaXMgYW4gYWRlcXVhdGUgc29sdXRpb24uXG4qL1xuUmVzdFdyaXRlLnByb3RvdHlwZS5fdmFsaWRhdGVFbWFpbCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmRhdGEuZW1haWwgfHwgdGhpcy5kYXRhLmVtYWlsLl9fb3AgPT09ICdEZWxldGUnKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG4gIC8vIFZhbGlkYXRlIGJhc2ljIGVtYWlsIGFkZHJlc3MgZm9ybWF0XG4gIGlmICghdGhpcy5kYXRhLmVtYWlsLm1hdGNoKC9eLitALiskLykpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9FTUFJTF9BRERSRVNTLCAnRW1haWwgYWRkcmVzcyBmb3JtYXQgaXMgaW52YWxpZC4nKVxuICAgICk7XG4gIH1cbiAgLy8gQ2FzZSBpbnNlbnNpdGl2ZSBtYXRjaCwgc2VlIG5vdGUgYWJvdmUgZnVuY3Rpb24uXG4gIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgIC5maW5kKFxuICAgICAgdGhpcy5jbGFzc05hbWUsXG4gICAgICB7XG4gICAgICAgIGVtYWlsOiB0aGlzLmRhdGEuZW1haWwsXG4gICAgICAgIG9iamVjdElkOiB7ICRuZTogdGhpcy5vYmplY3RJZCgpIH0sXG4gICAgICB9LFxuICAgICAgeyBsaW1pdDogMSwgY2FzZUluc2Vuc2l0aXZlOiB0cnVlIH0sXG4gICAgICB7fSxcbiAgICAgIHRoaXMudmFsaWRTY2hlbWFDb250cm9sbGVyXG4gICAgKVxuICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuRU1BSUxfVEFLRU4sXG4gICAgICAgICAgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgZW1haWwgYWRkcmVzcy4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLmRhdGEuYXV0aERhdGEgfHxcbiAgICAgICAgIU9iamVjdC5rZXlzKHRoaXMuZGF0YS5hdXRoRGF0YSkubGVuZ3RoIHx8XG4gICAgICAgIChPYmplY3Qua2V5cyh0aGlzLmRhdGEuYXV0aERhdGEpLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZGF0YS5hdXRoRGF0YSlbMF0gPT09ICdhbm9ueW1vdXMnKVxuICAgICAgKSB7XG4gICAgICAgIC8vIFdlIHVwZGF0ZWQgdGhlIGVtYWlsLCBzZW5kIGEgbmV3IHZhbGlkYXRpb25cbiAgICAgICAgY29uc3QgeyBvcmlnaW5hbE9iamVjdCwgdXBkYXRlZE9iamVjdCB9ID0gdGhpcy5idWlsZFBhcnNlT2JqZWN0cygpO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICAgIG9yaWdpbmFsOiBvcmlnaW5hbE9iamVjdCxcbiAgICAgICAgICBvYmplY3Q6IHVwZGF0ZWRPYmplY3QsXG4gICAgICAgICAgbWFzdGVyOiB0aGlzLmF1dGguaXNNYXN0ZXIsXG4gICAgICAgICAgaXA6IHRoaXMuY29uZmlnLmlwLFxuICAgICAgICAgIGluc3RhbGxhdGlvbklkOiB0aGlzLmF1dGguaW5zdGFsbGF0aW9uSWQsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy51c2VyQ29udHJvbGxlci5zZXRFbWFpbFZlcmlmeVRva2VuKHRoaXMuZGF0YSwgcmVxdWVzdCwgdGhpcy5zdG9yYWdlKTtcbiAgICAgIH1cbiAgICB9KTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuX3ZhbGlkYXRlUGFzc3dvcmRQb2xpY3kgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOyB9XG4gIHJldHVybiB0aGlzLl92YWxpZGF0ZVBhc3N3b3JkUmVxdWlyZW1lbnRzKCkudGhlbigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlUGFzc3dvcmRIaXN0b3J5KCk7XG4gIH0pO1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5fdmFsaWRhdGVQYXNzd29yZFJlcXVpcmVtZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gY2hlY2sgaWYgdGhlIHBhc3N3b3JkIGNvbmZvcm1zIHRvIHRoZSBkZWZpbmVkIHBhc3N3b3JkIHBvbGljeSBpZiBjb25maWd1cmVkXG4gIC8vIElmIHdlIHNwZWNpZmllZCBhIGN1c3RvbSBlcnJvciBpbiBvdXIgY29uZmlndXJhdGlvbiB1c2UgaXQuXG4gIC8vIEV4YW1wbGU6IFwiUGFzc3dvcmRzIG11c3QgaW5jbHVkZSBhIENhcGl0YWwgTGV0dGVyLCBMb3dlcmNhc2UgTGV0dGVyLCBhbmQgYSBudW1iZXIuXCJcbiAgLy9cbiAgLy8gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBvbiB0aGUgZ2VuZXJpYyBcInBhc3N3b3JkIHJlc2V0XCIgcGFnZSxcbiAgLy8gYXMgaXQgYWxsb3dzIHRoZSBwcm9ncmFtbWVyIHRvIGNvbW11bmljYXRlIHNwZWNpZmljIHJlcXVpcmVtZW50cyBpbnN0ZWFkIG9mOlxuICAvLyBhLiBtYWtpbmcgdGhlIHVzZXIgZ3Vlc3Mgd2hhdHMgd3JvbmdcbiAgLy8gYi4gbWFraW5nIGEgY3VzdG9tIHBhc3N3b3JkIHJlc2V0IHBhZ2UgdGhhdCBzaG93cyB0aGUgcmVxdWlyZW1lbnRzXG4gIGNvbnN0IHBvbGljeUVycm9yID0gdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kudmFsaWRhdGlvbkVycm9yXG4gICAgPyB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS52YWxpZGF0aW9uRXJyb3JcbiAgICA6ICdQYXNzd29yZCBkb2VzIG5vdCBtZWV0IHRoZSBQYXNzd29yZCBQb2xpY3kgcmVxdWlyZW1lbnRzLic7XG4gIGNvbnN0IGNvbnRhaW5zVXNlcm5hbWVFcnJvciA9ICdQYXNzd29yZCBjYW5ub3QgY29udGFpbiB5b3VyIHVzZXJuYW1lLic7XG5cbiAgLy8gY2hlY2sgd2hldGhlciB0aGUgcGFzc3dvcmQgbWVldHMgdGhlIHBhc3N3b3JkIHN0cmVuZ3RoIHJlcXVpcmVtZW50c1xuICBpZiAoXG4gICAgKHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnBhdHRlcm5WYWxpZGF0b3IgJiZcbiAgICAgICF0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5wYXR0ZXJuVmFsaWRhdG9yKHRoaXMuZGF0YS5wYXNzd29yZCkpIHx8XG4gICAgKHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnZhbGlkYXRvckNhbGxiYWNrICYmXG4gICAgICAhdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kudmFsaWRhdG9yQ2FsbGJhY2sodGhpcy5kYXRhLnBhc3N3b3JkKSlcbiAgKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLCBwb2xpY3lFcnJvcikpO1xuICB9XG5cbiAgLy8gY2hlY2sgd2hldGhlciBwYXNzd29yZCBjb250YWluIHVzZXJuYW1lXG4gIGlmICh0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5kb05vdEFsbG93VXNlcm5hbWUgPT09IHRydWUpIHtcbiAgICBpZiAodGhpcy5kYXRhLnVzZXJuYW1lKSB7XG4gICAgICAvLyB1c2VybmFtZSBpcyBub3QgcGFzc2VkIGR1cmluZyBwYXNzd29yZCByZXNldFxuICAgICAgaWYgKHRoaXMuZGF0YS5wYXNzd29yZC5pbmRleE9mKHRoaXMuZGF0YS51c2VybmFtZSkgPj0gMClcbiAgICAgIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLCBjb250YWluc1VzZXJuYW1lRXJyb3IpKTsgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZXRyaWV2ZSB0aGUgVXNlciBvYmplY3QgdXNpbmcgb2JqZWN0SWQgZHVyaW5nIHBhc3N3b3JkIHJlc2V0XG4gICAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UuZmluZCgnX1VzZXInLCB7IG9iamVjdElkOiB0aGlzLm9iamVjdElkKCkgfSkudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICB0aHJvdyB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0YS5wYXNzd29yZC5pbmRleE9mKHJlc3VsdHNbMF0udXNlcm5hbWUpID49IDApXG4gICAgICAgIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICAgIG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLCBjb250YWluc1VzZXJuYW1lRXJyb3IpXG4gICAgICAgICk7IH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuX3ZhbGlkYXRlUGFzc3dvcmRIaXN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAvLyBjaGVjayB3aGV0aGVyIHBhc3N3b3JkIGlzIHJlcGVhdGluZyBmcm9tIHNwZWNpZmllZCBoaXN0b3J5XG4gIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeSkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmZpbmQoXG4gICAgICAgICdfVXNlcicsXG4gICAgICAgIHsgb2JqZWN0SWQ6IHRoaXMub2JqZWN0SWQoKSB9LFxuICAgICAgICB7IGtleXM6IFsnX3Bhc3N3b3JkX2hpc3RvcnknLCAnX2hhc2hlZF9wYXNzd29yZCddIH0sXG4gICAgICAgIEF1dGgubWFpbnRlbmFuY2UodGhpcy5jb25maWcpXG4gICAgICApXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICB0aHJvdyB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlciA9IHJlc3VsdHNbMF07XG4gICAgICAgIGxldCBvbGRQYXNzd29yZHMgPSBbXTtcbiAgICAgICAgaWYgKHVzZXIuX3Bhc3N3b3JkX2hpc3RvcnkpXG4gICAgICAgIHsgb2xkUGFzc3dvcmRzID0gXy50YWtlKFxuICAgICAgICAgIHVzZXIuX3Bhc3N3b3JkX2hpc3RvcnksXG4gICAgICAgICAgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRIaXN0b3J5IC0gMVxuICAgICAgICApOyB9XG4gICAgICAgIG9sZFBhc3N3b3Jkcy5wdXNoKHVzZXIucGFzc3dvcmQpO1xuICAgICAgICBjb25zdCBuZXdQYXNzd29yZCA9IHRoaXMuZGF0YS5wYXNzd29yZDtcbiAgICAgICAgLy8gY29tcGFyZSB0aGUgbmV3IHBhc3N3b3JkIGhhc2ggd2l0aCBhbGwgb2xkIHBhc3N3b3JkIGhhc2hlc1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IG9sZFBhc3N3b3Jkcy5tYXAoZnVuY3Rpb24gKGhhc2gpIHtcbiAgICAgICAgICByZXR1cm4gcGFzc3dvcmRDcnlwdG8uY29tcGFyZShuZXdQYXNzd29yZCwgaGFzaCkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgIC8vIHJlamVjdCBpZiB0aGVyZSBpcyBhIG1hdGNoXG4gICAgICAgICAgICB7IHJldHVybiBQcm9taXNlLnJlamVjdCgnUkVQRUFUX1BBU1NXT1JEJyk7IH1cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHdhaXQgZm9yIGFsbCBjb21wYXJpc29ucyB0byBjb21wbGV0ZVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyID09PSAnUkVQRUFUX1BBU1NXT1JEJylcbiAgICAgICAgICAgIC8vIGEgbWF0Y2ggd2FzIGZvdW5kXG4gICAgICAgICAgICB7IHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgICAgICAgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICAgIFBhcnNlLkVycm9yLlZBTElEQVRJT05fRVJST1IsXG4gICAgICAgICAgICAgICAgYE5ldyBwYXNzd29yZCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIGFzIGxhc3QgJHt0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3Rvcnl9IHBhc3N3b3Jkcy5gXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7IH1cbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuY3JlYXRlU2Vzc2lvblRva2VuSWZOZWVkZWQgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmNsYXNzTmFtZSAhPT0gJ19Vc2VyJykge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBEb24ndCBnZW5lcmF0ZSBzZXNzaW9uIGZvciB1cGRhdGluZyB1c2VyICh0aGlzLnF1ZXJ5IGlzIHNldCkgdW5sZXNzIGF1dGhEYXRhIGV4aXN0c1xuICBpZiAodGhpcy5xdWVyeSAmJiAhdGhpcy5kYXRhLmF1dGhEYXRhKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIERvbid0IGdlbmVyYXRlIG5ldyBzZXNzaW9uVG9rZW4gaWYgbGlua2luZyB2aWEgc2Vzc2lvblRva2VuXG4gIGlmICh0aGlzLmF1dGgudXNlciAmJiB0aGlzLmRhdGEuYXV0aERhdGEpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gSWYgc2lnbi11cCBjYWxsXG4gIGlmICghdGhpcy5zdG9yYWdlLmF1dGhQcm92aWRlcikge1xuICAgIC8vIENyZWF0ZSByZXF1ZXN0IG9iamVjdCBmb3IgdmVyaWZpY2F0aW9uIGZ1bmN0aW9uc1xuICAgIGNvbnN0IHsgb3JpZ2luYWxPYmplY3QsIHVwZGF0ZWRPYmplY3QgfSA9IHRoaXMuYnVpbGRQYXJzZU9iamVjdHMoKTtcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgb3JpZ2luYWw6IG9yaWdpbmFsT2JqZWN0LFxuICAgICAgb2JqZWN0OiB1cGRhdGVkT2JqZWN0LFxuICAgICAgbWFzdGVyOiB0aGlzLmF1dGguaXNNYXN0ZXIsXG4gICAgICBpcDogdGhpcy5jb25maWcuaXAsXG4gICAgICBpbnN0YWxsYXRpb25JZDogdGhpcy5hdXRoLmluc3RhbGxhdGlvbklkLFxuICAgIH07XG4gICAgLy8gR2V0IHZlcmlmaWNhdGlvbiBjb25kaXRpb25zIHdoaWNoIGNhbiBiZSBib29sZWFucyBvciBmdW5jdGlvbnM7IHRoZSBwdXJwb3NlIG9mIHRoaXMgYXN5bmMvYXdhaXRcbiAgICAvLyBzdHJ1Y3R1cmUgaXMgdG8gYXZvaWQgdW5uZWNlc3NhcmlseSBleGVjdXRpbmcgc3Vic2VxdWVudCBmdW5jdGlvbnMgaWYgcHJldmlvdXMgb25lcyBmYWlsIGluIHRoZVxuICAgIC8vIGNvbmRpdGlvbmFsIHN0YXRlbWVudCBiZWxvdywgYXMgYSBkZXZlbG9wZXIgbWF5IGRlY2lkZSB0byBleGVjdXRlIGV4cGVuc2l2ZSBvcGVyYXRpb25zIGluIHRoZW1cbiAgICBjb25zdCB2ZXJpZnlVc2VyRW1haWxzID0gYXN5bmMgKCkgPT4gdGhpcy5jb25maWcudmVyaWZ5VXNlckVtYWlscyA9PT0gdHJ1ZSB8fCAodHlwZW9mIHRoaXMuY29uZmlnLnZlcmlmeVVzZXJFbWFpbHMgPT09ICdmdW5jdGlvbicgJiYgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29uZmlnLnZlcmlmeVVzZXJFbWFpbHMocmVxdWVzdCkpID09PSB0cnVlKTtcbiAgICBjb25zdCBwcmV2ZW50TG9naW5XaXRoVW52ZXJpZmllZEVtYWlsID0gYXN5bmMgKCkgPT4gdGhpcy5jb25maWcucHJldmVudExvZ2luV2l0aFVudmVyaWZpZWRFbWFpbCA9PT0gdHJ1ZSB8fCAodHlwZW9mIHRoaXMuY29uZmlnLnByZXZlbnRMb2dpbldpdGhVbnZlcmlmaWVkRW1haWwgPT09ICdmdW5jdGlvbicgJiYgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29uZmlnLnByZXZlbnRMb2dpbldpdGhVbnZlcmlmaWVkRW1haWwocmVxdWVzdCkpID09PSB0cnVlKTtcbiAgICAvLyBJZiB2ZXJpZmljYXRpb24gaXMgcmVxdWlyZWRcbiAgICBpZiAoYXdhaXQgdmVyaWZ5VXNlckVtYWlscygpICYmIGF3YWl0IHByZXZlbnRMb2dpbldpdGhVbnZlcmlmaWVkRW1haWwoKSkge1xuICAgICAgdGhpcy5zdG9yYWdlLnJlamVjdFNpZ251cCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzLmNyZWF0ZVNlc3Npb25Ub2tlbigpO1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5jcmVhdGVTZXNzaW9uVG9rZW4gPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIC8vIGNsb3VkIGluc3RhbGxhdGlvbklkIGZyb20gQ2xvdWQgQ29kZSxcbiAgLy8gbmV2ZXIgY3JlYXRlIHNlc3Npb24gdG9rZW5zIGZyb20gdGhlcmUuXG4gIGlmICh0aGlzLmF1dGguaW5zdGFsbGF0aW9uSWQgJiYgdGhpcy5hdXRoLmluc3RhbGxhdGlvbklkID09PSAnY2xvdWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgPT0gbnVsbCAmJiB0aGlzLmRhdGEuYXV0aERhdGEpIHtcbiAgICB0aGlzLnN0b3JhZ2UuYXV0aFByb3ZpZGVyID0gT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5qb2luKCcsJyk7XG4gIH1cblxuICBjb25zdCB7IHNlc3Npb25EYXRhLCBjcmVhdGVTZXNzaW9uIH0gPSBSZXN0V3JpdGUuY3JlYXRlU2Vzc2lvbih0aGlzLmNvbmZpZywge1xuICAgIHVzZXJJZDogdGhpcy5vYmplY3RJZCgpLFxuICAgIGNyZWF0ZWRXaXRoOiB7XG4gICAgICBhY3Rpb246IHRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgPyAnbG9naW4nIDogJ3NpZ251cCcsXG4gICAgICBhdXRoUHJvdmlkZXI6IHRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgfHwgJ3Bhc3N3b3JkJyxcbiAgICB9LFxuICAgIGluc3RhbGxhdGlvbklkOiB0aGlzLmF1dGguaW5zdGFsbGF0aW9uSWQsXG4gIH0pO1xuXG4gIGlmICh0aGlzLnJlc3BvbnNlICYmIHRoaXMucmVzcG9uc2UucmVzcG9uc2UpIHtcbiAgICB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlLnNlc3Npb25Ub2tlbiA9IHNlc3Npb25EYXRhLnNlc3Npb25Ub2tlbjtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVTZXNzaW9uKCk7XG59O1xuXG5SZXN0V3JpdGUuY3JlYXRlU2Vzc2lvbiA9IGZ1bmN0aW9uIChcbiAgY29uZmlnLFxuICB7IHVzZXJJZCwgY3JlYXRlZFdpdGgsIGluc3RhbGxhdGlvbklkLCBhZGRpdGlvbmFsU2Vzc2lvbkRhdGEgfVxuKSB7XG4gIGNvbnN0IHRva2VuID0gJ3I6JyArIGNyeXB0b1V0aWxzLm5ld1Rva2VuKCk7XG4gIGNvbnN0IGV4cGlyZXNBdCA9IGNvbmZpZy5nZW5lcmF0ZVNlc3Npb25FeHBpcmVzQXQoKTtcbiAgY29uc3Qgc2Vzc2lvbkRhdGEgPSB7XG4gICAgc2Vzc2lvblRva2VuOiB0b2tlbixcbiAgICB1c2VyOiB7XG4gICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgIGNsYXNzTmFtZTogJ19Vc2VyJyxcbiAgICAgIG9iamVjdElkOiB1c2VySWQsXG4gICAgfSxcbiAgICBjcmVhdGVkV2l0aCxcbiAgICBleHBpcmVzQXQ6IFBhcnNlLl9lbmNvZGUoZXhwaXJlc0F0KSxcbiAgfTtcblxuICBpZiAoaW5zdGFsbGF0aW9uSWQpIHtcbiAgICBzZXNzaW9uRGF0YS5pbnN0YWxsYXRpb25JZCA9IGluc3RhbGxhdGlvbklkO1xuICB9XG5cbiAgT2JqZWN0LmFzc2lnbihzZXNzaW9uRGF0YSwgYWRkaXRpb25hbFNlc3Npb25EYXRhKTtcblxuICByZXR1cm4ge1xuICAgIHNlc3Npb25EYXRhLFxuICAgIGNyZWF0ZVNlc3Npb246ICgpID0+XG4gICAgICBuZXcgUmVzdFdyaXRlKGNvbmZpZywgQXV0aC5tYXN0ZXIoY29uZmlnKSwgJ19TZXNzaW9uJywgbnVsbCwgc2Vzc2lvbkRhdGEpLmV4ZWN1dGUoKSxcbiAgfTtcbn07XG5cbi8vIERlbGV0ZSBlbWFpbCByZXNldCB0b2tlbnMgaWYgdXNlciBpcyBjaGFuZ2luZyBwYXNzd29yZCBvciBlbWFpbC5cblJlc3RXcml0ZS5wcm90b3R5cGUuZGVsZXRlRW1haWxSZXNldFRva2VuSWZOZWVkZWQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmNsYXNzTmFtZSAhPT0gJ19Vc2VyJyB8fCB0aGlzLnF1ZXJ5ID09PSBudWxsKSB7XG4gICAgLy8gbnVsbCBxdWVyeSBtZWFucyBjcmVhdGVcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoJ3Bhc3N3b3JkJyBpbiB0aGlzLmRhdGEgfHwgJ2VtYWlsJyBpbiB0aGlzLmRhdGEpIHtcbiAgICBjb25zdCBhZGRPcHMgPSB7XG4gICAgICBfcGVyaXNoYWJsZV90b2tlbjogeyBfX29wOiAnRGVsZXRlJyB9LFxuICAgICAgX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdDogeyBfX29wOiAnRGVsZXRlJyB9LFxuICAgIH07XG4gICAgdGhpcy5kYXRhID0gT2JqZWN0LmFzc2lnbih0aGlzLmRhdGEsIGFkZE9wcyk7XG4gIH1cbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuZGVzdHJveUR1cGxpY2F0ZWRTZXNzaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gT25seSBmb3IgX1Nlc3Npb24sIGFuZCBhdCBjcmVhdGlvbiB0aW1lXG4gIGlmICh0aGlzLmNsYXNzTmFtZSAhPSAnX1Nlc3Npb24nIHx8IHRoaXMucXVlcnkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gRGVzdHJveSB0aGUgc2Vzc2lvbnMgaW4gJ0JhY2tncm91bmQnXG4gIGNvbnN0IHsgdXNlciwgaW5zdGFsbGF0aW9uSWQsIHNlc3Npb25Ub2tlbiB9ID0gdGhpcy5kYXRhO1xuICBpZiAoIXVzZXIgfHwgIWluc3RhbGxhdGlvbklkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghdXNlci5vYmplY3RJZCkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZXN0cm95KFxuICAgICdfU2Vzc2lvbicsXG4gICAge1xuICAgICAgdXNlcixcbiAgICAgIGluc3RhbGxhdGlvbklkLFxuICAgICAgc2Vzc2lvblRva2VuOiB7ICRuZTogc2Vzc2lvblRva2VuIH0sXG4gICAgfSxcbiAgICB7fSxcbiAgICB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlclxuICApO1xufTtcblxuLy8gSGFuZGxlcyBhbnkgZm9sbG93dXAgbG9naWNcblJlc3RXcml0ZS5wcm90b3R5cGUuaGFuZGxlRm9sbG93dXAgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnN0b3JhZ2UgJiYgdGhpcy5zdG9yYWdlWydjbGVhclNlc3Npb25zJ10gJiYgdGhpcy5jb25maWcucmV2b2tlU2Vzc2lvbk9uUGFzc3dvcmRSZXNldCkge1xuICAgIHZhciBzZXNzaW9uUXVlcnkgPSB7XG4gICAgICB1c2VyOiB7XG4gICAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgICBjbGFzc05hbWU6ICdfVXNlcicsXG4gICAgICAgIG9iamVjdElkOiB0aGlzLm9iamVjdElkKCksXG4gICAgICB9LFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuc3RvcmFnZVsnY2xlYXJTZXNzaW9ucyddO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmRlc3Ryb3koJ19TZXNzaW9uJywgc2Vzc2lvblF1ZXJ5KVxuICAgICAgLnRoZW4odGhpcy5oYW5kbGVGb2xsb3d1cC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGlmICh0aGlzLnN0b3JhZ2UgJiYgdGhpcy5zdG9yYWdlWydnZW5lcmF0ZU5ld1Nlc3Npb24nXSkge1xuICAgIGRlbGV0ZSB0aGlzLnN0b3JhZ2VbJ2dlbmVyYXRlTmV3U2Vzc2lvbiddO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVNlc3Npb25Ub2tlbigpLnRoZW4odGhpcy5oYW5kbGVGb2xsb3d1cC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGlmICh0aGlzLnN0b3JhZ2UgJiYgdGhpcy5zdG9yYWdlWydzZW5kVmVyaWZpY2F0aW9uRW1haWwnXSkge1xuICAgIGRlbGV0ZSB0aGlzLnN0b3JhZ2VbJ3NlbmRWZXJpZmljYXRpb25FbWFpbCddO1xuICAgIC8vIEZpcmUgYW5kIGZvcmdldCFcbiAgICB0aGlzLmNvbmZpZy51c2VyQ29udHJvbGxlci5zZW5kVmVyaWZpY2F0aW9uRW1haWwodGhpcy5kYXRhLCB7IGF1dGg6IHRoaXMuYXV0aCB9KTtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVGb2xsb3d1cC5iaW5kKHRoaXMpO1xuICB9XG59O1xuXG4vLyBIYW5kbGVzIHRoZSBfU2Vzc2lvbiBjbGFzcyBzcGVjaWFsbmVzcy5cbi8vIERvZXMgbm90aGluZyBpZiB0aGlzIGlzbid0IGFuIF9TZXNzaW9uIG9iamVjdC5cblJlc3RXcml0ZS5wcm90b3R5cGUuaGFuZGxlU2Vzc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMucmVzcG9uc2UgfHwgdGhpcy5jbGFzc05hbWUgIT09ICdfU2Vzc2lvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXRoaXMuYXV0aC51c2VyICYmICF0aGlzLmF1dGguaXNNYXN0ZXIgJiYgIXRoaXMuYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfU0VTU0lPTl9UT0tFTiwgJ1Nlc3Npb24gdG9rZW4gcmVxdWlyZWQuJyk7XG4gIH1cblxuICAvLyBUT0RPOiBWZXJpZnkgcHJvcGVyIGVycm9yIHRvIHRocm93XG4gIGlmICh0aGlzLmRhdGEuQUNMKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsICdDYW5ub3Qgc2V0ICcgKyAnQUNMIG9uIGEgU2Vzc2lvbi4nKTtcbiAgfVxuXG4gIGlmICh0aGlzLnF1ZXJ5KSB7XG4gICAgaWYgKHRoaXMuZGF0YS51c2VyICYmICF0aGlzLmF1dGguaXNNYXN0ZXIgJiYgdGhpcy5kYXRhLnVzZXIub2JqZWN0SWQgIT0gdGhpcy5hdXRoLnVzZXIuaWQpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0tFWV9OQU1FKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLnNlc3Npb25Ub2tlbikge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXV0aC5pc01hc3Rlcikge1xuICAgICAgdGhpcy5xdWVyeSA9IHtcbiAgICAgICAgJGFuZDogW1xuICAgICAgICAgIHRoaXMucXVlcnksXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnX1VzZXInLFxuICAgICAgICAgICAgICBvYmplY3RJZDogdGhpcy5hdXRoLnVzZXIuaWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmICghdGhpcy5xdWVyeSAmJiAhdGhpcy5hdXRoLmlzTWFzdGVyICYmICF0aGlzLmF1dGguaXNNYWludGVuYW5jZSkge1xuICAgIGNvbnN0IGFkZGl0aW9uYWxTZXNzaW9uRGF0YSA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgIGlmIChrZXkgPT09ICdvYmplY3RJZCcgfHwga2V5ID09PSAndXNlcicpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhZGRpdGlvbmFsU2Vzc2lvbkRhdGFba2V5XSA9IHRoaXMuZGF0YVtrZXldO1xuICAgIH1cblxuICAgIGNvbnN0IHsgc2Vzc2lvbkRhdGEsIGNyZWF0ZVNlc3Npb24gfSA9IFJlc3RXcml0ZS5jcmVhdGVTZXNzaW9uKHRoaXMuY29uZmlnLCB7XG4gICAgICB1c2VySWQ6IHRoaXMuYXV0aC51c2VyLmlkLFxuICAgICAgY3JlYXRlZFdpdGg6IHtcbiAgICAgICAgYWN0aW9uOiAnY3JlYXRlJyxcbiAgICAgIH0sXG4gICAgICBhZGRpdGlvbmFsU2Vzc2lvbkRhdGEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3JlYXRlU2Vzc2lvbigpLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICBpZiAoIXJlc3VsdHMucmVzcG9uc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVEVSTkFMX1NFUlZFUl9FUlJPUiwgJ0Vycm9yIGNyZWF0aW5nIHNlc3Npb24uJyk7XG4gICAgICB9XG4gICAgICBzZXNzaW9uRGF0YVsnb2JqZWN0SWQnXSA9IHJlc3VsdHMucmVzcG9uc2VbJ29iamVjdElkJ107XG4gICAgICB0aGlzLnJlc3BvbnNlID0ge1xuICAgICAgICBzdGF0dXM6IDIwMSxcbiAgICAgICAgbG9jYXRpb246IHJlc3VsdHMubG9jYXRpb24sXG4gICAgICAgIHJlc3BvbnNlOiBzZXNzaW9uRGF0YSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn07XG5cbi8vIEhhbmRsZXMgdGhlIF9JbnN0YWxsYXRpb24gY2xhc3Mgc3BlY2lhbG5lc3MuXG4vLyBEb2VzIG5vdGhpbmcgaWYgdGhpcyBpc24ndCBhbiBpbnN0YWxsYXRpb24gb2JqZWN0LlxuLy8gSWYgYW4gaW5zdGFsbGF0aW9uIGlzIGZvdW5kLCB0aGlzIGNhbiBtdXRhdGUgdGhpcy5xdWVyeSBhbmQgdHVybiBhIGNyZWF0ZVxuLy8gaW50byBhbiB1cGRhdGUuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3Igd2hlbiB3ZSdyZSBkb25lIGlmIGl0IGNhbid0IGZpbmlzaCB0aGlzIHRpY2suXG5SZXN0V3JpdGUucHJvdG90eXBlLmhhbmRsZUluc3RhbGxhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMucmVzcG9uc2UgfHwgdGhpcy5jbGFzc05hbWUgIT09ICdfSW5zdGFsbGF0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChcbiAgICAhdGhpcy5xdWVyeSAmJlxuICAgICF0aGlzLmRhdGEuZGV2aWNlVG9rZW4gJiZcbiAgICAhdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkICYmXG4gICAgIXRoaXMuYXV0aC5pbnN0YWxsYXRpb25JZFxuICApIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAxMzUsXG4gICAgICAnYXQgbGVhc3Qgb25lIElEIGZpZWxkIChkZXZpY2VUb2tlbiwgaW5zdGFsbGF0aW9uSWQpICcgKyAnbXVzdCBiZSBzcGVjaWZpZWQgaW4gdGhpcyBvcGVyYXRpb24nXG4gICAgKTtcbiAgfVxuXG4gIC8vIElmIHRoZSBkZXZpY2UgdG9rZW4gaXMgNjQgY2hhcmFjdGVycyBsb25nLCB3ZSBhc3N1bWUgaXQgaXMgZm9yIGlPU1xuICAvLyBhbmQgbG93ZXJjYXNlIGl0LlxuICBpZiAodGhpcy5kYXRhLmRldmljZVRva2VuICYmIHRoaXMuZGF0YS5kZXZpY2VUb2tlbi5sZW5ndGggPT0gNjQpIHtcbiAgICB0aGlzLmRhdGEuZGV2aWNlVG9rZW4gPSB0aGlzLmRhdGEuZGV2aWNlVG9rZW4udG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8vIFdlIGxvd2VyY2FzZSB0aGUgaW5zdGFsbGF0aW9uSWQgaWYgcHJlc2VudFxuICBpZiAodGhpcy5kYXRhLmluc3RhbGxhdGlvbklkKSB7XG4gICAgdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkID0gdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBsZXQgaW5zdGFsbGF0aW9uSWQgPSB0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQ7XG5cbiAgLy8gSWYgZGF0YS5pbnN0YWxsYXRpb25JZCBpcyBub3Qgc2V0IGFuZCB3ZSdyZSBub3QgbWFzdGVyLCB3ZSBjYW4gbG9va3VwIGluIGF1dGhcbiAgaWYgKCFpbnN0YWxsYXRpb25JZCAmJiAhdGhpcy5hdXRoLmlzTWFzdGVyICYmICF0aGlzLmF1dGguaXNNYWludGVuYW5jZSkge1xuICAgIGluc3RhbGxhdGlvbklkID0gdGhpcy5hdXRoLmluc3RhbGxhdGlvbklkO1xuICB9XG5cbiAgaWYgKGluc3RhbGxhdGlvbklkKSB7XG4gICAgaW5zdGFsbGF0aW9uSWQgPSBpbnN0YWxsYXRpb25JZC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLy8gVXBkYXRpbmcgX0luc3RhbGxhdGlvbiBidXQgbm90IHVwZGF0aW5nIGFueXRoaW5nIGNyaXRpY2FsXG4gIGlmICh0aGlzLnF1ZXJ5ICYmICF0aGlzLmRhdGEuZGV2aWNlVG9rZW4gJiYgIWluc3RhbGxhdGlvbklkICYmICF0aGlzLmRhdGEuZGV2aWNlVHlwZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgdmFyIGlkTWF0Y2g7IC8vIFdpbGwgYmUgYSBtYXRjaCBvbiBlaXRoZXIgb2JqZWN0SWQgb3IgaW5zdGFsbGF0aW9uSWRcbiAgdmFyIG9iamVjdElkTWF0Y2g7XG4gIHZhciBpbnN0YWxsYXRpb25JZE1hdGNoO1xuICB2YXIgZGV2aWNlVG9rZW5NYXRjaGVzID0gW107XG5cbiAgLy8gSW5zdGVhZCBvZiBpc3N1aW5nIDMgcmVhZHMsIGxldCdzIGRvIGl0IHdpdGggb25lIE9SLlxuICBjb25zdCBvclF1ZXJpZXMgPSBbXTtcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgIG9yUXVlcmllcy5wdXNoKHtcbiAgICAgIG9iamVjdElkOiB0aGlzLnF1ZXJ5Lm9iamVjdElkLFxuICAgIH0pO1xuICB9XG4gIGlmIChpbnN0YWxsYXRpb25JZCkge1xuICAgIG9yUXVlcmllcy5wdXNoKHtcbiAgICAgIGluc3RhbGxhdGlvbklkOiBpbnN0YWxsYXRpb25JZCxcbiAgICB9KTtcbiAgfVxuICBpZiAodGhpcy5kYXRhLmRldmljZVRva2VuKSB7XG4gICAgb3JRdWVyaWVzLnB1c2goeyBkZXZpY2VUb2tlbjogdGhpcy5kYXRhLmRldmljZVRva2VuIH0pO1xuICB9XG5cbiAgaWYgKG9yUXVlcmllcy5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb21pc2UgPSBwcm9taXNlXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICdfSW5zdGFsbGF0aW9uJyxcbiAgICAgICAge1xuICAgICAgICAgICRvcjogb3JRdWVyaWVzLFxuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKTtcbiAgICB9KVxuICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgcmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMucXVlcnkub2JqZWN0SWQgJiYgcmVzdWx0Lm9iamVjdElkID09IHRoaXMucXVlcnkub2JqZWN0SWQpIHtcbiAgICAgICAgICBvYmplY3RJZE1hdGNoID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuaW5zdGFsbGF0aW9uSWQgPT0gaW5zdGFsbGF0aW9uSWQpIHtcbiAgICAgICAgICBpbnN0YWxsYXRpb25JZE1hdGNoID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuZGV2aWNlVG9rZW4gPT0gdGhpcy5kYXRhLmRldmljZVRva2VuKSB7XG4gICAgICAgICAgZGV2aWNlVG9rZW5NYXRjaGVzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNhbml0eSBjaGVja3Mgd2hlbiBydW5uaW5nIGEgcXVlcnlcbiAgICAgIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMucXVlcnkub2JqZWN0SWQpIHtcbiAgICAgICAgaWYgKCFvYmplY3RJZE1hdGNoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kIGZvciB1cGRhdGUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCAmJlxuICAgICAgICAgIG9iamVjdElkTWF0Y2guaW5zdGFsbGF0aW9uSWQgJiZcbiAgICAgICAgICB0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQgIT09IG9iamVjdElkTWF0Y2guaW5zdGFsbGF0aW9uSWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKDEzNiwgJ2luc3RhbGxhdGlvbklkIG1heSBub3QgYmUgY2hhbmdlZCBpbiB0aGlzICcgKyAnb3BlcmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YS5kZXZpY2VUb2tlbiAmJlxuICAgICAgICAgIG9iamVjdElkTWF0Y2guZGV2aWNlVG9rZW4gJiZcbiAgICAgICAgICB0aGlzLmRhdGEuZGV2aWNlVG9rZW4gIT09IG9iamVjdElkTWF0Y2guZGV2aWNlVG9rZW4gJiZcbiAgICAgICAgICAhdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkICYmXG4gICAgICAgICAgIW9iamVjdElkTWF0Y2guaW5zdGFsbGF0aW9uSWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKDEzNiwgJ2RldmljZVRva2VuIG1heSBub3QgYmUgY2hhbmdlZCBpbiB0aGlzICcgKyAnb3BlcmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YS5kZXZpY2VUeXBlICYmXG4gICAgICAgICAgdGhpcy5kYXRhLmRldmljZVR5cGUgJiZcbiAgICAgICAgICB0aGlzLmRhdGEuZGV2aWNlVHlwZSAhPT0gb2JqZWN0SWRNYXRjaC5kZXZpY2VUeXBlXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxMzYsICdkZXZpY2VUeXBlIG1heSBub3QgYmUgY2hhbmdlZCBpbiB0aGlzICcgKyAnb3BlcmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCAmJiBvYmplY3RJZE1hdGNoKSB7XG4gICAgICAgIGlkTWF0Y2ggPSBvYmplY3RJZE1hdGNoO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5zdGFsbGF0aW9uSWQgJiYgaW5zdGFsbGF0aW9uSWRNYXRjaCkge1xuICAgICAgICBpZE1hdGNoID0gaW5zdGFsbGF0aW9uSWRNYXRjaDtcbiAgICAgIH1cbiAgICAgIC8vIG5lZWQgdG8gc3BlY2lmeSBkZXZpY2VUeXBlIG9ubHkgaWYgaXQncyBuZXdcbiAgICAgIGlmICghdGhpcy5xdWVyeSAmJiAhdGhpcy5kYXRhLmRldmljZVR5cGUgJiYgIWlkTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKDEzNSwgJ2RldmljZVR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgaW4gdGhpcyBvcGVyYXRpb24nKTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIGlmICghaWRNYXRjaCkge1xuICAgICAgICBpZiAoIWRldmljZVRva2VuTWF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZGV2aWNlVG9rZW5NYXRjaGVzLmxlbmd0aCA9PSAxICYmXG4gICAgICAgICAgKCFkZXZpY2VUb2tlbk1hdGNoZXNbMF1bJ2luc3RhbGxhdGlvbklkJ10gfHwgIWluc3RhbGxhdGlvbklkKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBTaW5nbGUgbWF0Y2ggb24gZGV2aWNlIHRva2VuIGJ1dCBub25lIG9uIGluc3RhbGxhdGlvbklkLCBhbmQgZWl0aGVyXG4gICAgICAgICAgLy8gdGhlIHBhc3NlZCBvYmplY3Qgb3IgdGhlIG1hdGNoIGlzIG1pc3NpbmcgYW4gaW5zdGFsbGF0aW9uSWQsIHNvIHdlXG4gICAgICAgICAgLy8gY2FuIGp1c3QgcmV0dXJuIHRoZSBtYXRjaC5cbiAgICAgICAgICByZXR1cm4gZGV2aWNlVG9rZW5NYXRjaGVzWzBdWydvYmplY3RJZCddO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAxMzIsXG4gICAgICAgICAgICAnTXVzdCBzcGVjaWZ5IGluc3RhbGxhdGlvbklkIHdoZW4gZGV2aWNlVG9rZW4gJyArXG4gICAgICAgICAgICAgICdtYXRjaGVzIG11bHRpcGxlIEluc3RhbGxhdGlvbiBvYmplY3RzJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTXVsdGlwbGUgZGV2aWNlIHRva2VuIG1hdGNoZXMgYW5kIHdlIHNwZWNpZmllZCBhbiBpbnN0YWxsYXRpb24gSUQsXG4gICAgICAgICAgLy8gb3IgYSBzaW5nbGUgbWF0Y2ggd2hlcmUgYm90aCB0aGUgcGFzc2VkIGFuZCBtYXRjaGluZyBvYmplY3RzIGhhdmVcbiAgICAgICAgICAvLyBhbiBpbnN0YWxsYXRpb24gSUQuIFRyeSBjbGVhbmluZyBvdXQgb2xkIGluc3RhbGxhdGlvbnMgdGhhdCBtYXRjaFxuICAgICAgICAgIC8vIHRoZSBkZXZpY2VUb2tlbiwgYW5kIHJldHVybiBuaWwgdG8gc2lnbmFsIHRoYXQgYSBuZXcgb2JqZWN0IHNob3VsZFxuICAgICAgICAgIC8vIGJlIGNyZWF0ZWQuXG4gICAgICAgICAgdmFyIGRlbFF1ZXJ5ID0ge1xuICAgICAgICAgICAgZGV2aWNlVG9rZW46IHRoaXMuZGF0YS5kZXZpY2VUb2tlbixcbiAgICAgICAgICAgIGluc3RhbGxhdGlvbklkOiB7XG4gICAgICAgICAgICAgICRuZTogaW5zdGFsbGF0aW9uSWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHRoaXMuZGF0YS5hcHBJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBkZWxRdWVyeVsnYXBwSWRlbnRpZmllciddID0gdGhpcy5kYXRhLmFwcElkZW50aWZpZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlc3Ryb3koJ19JbnN0YWxsYXRpb24nLCBkZWxRdWVyeSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIuY29kZSA9PSBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5EKSB7XG4gICAgICAgICAgICAgIC8vIG5vIGRlbGV0aW9ucyB3ZXJlIG1hZGUuIENhbiBiZSBpZ25vcmVkLlxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXRocm93IHRoZSBlcnJvclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRldmljZVRva2VuTWF0Y2hlcy5sZW5ndGggPT0gMSAmJiAhZGV2aWNlVG9rZW5NYXRjaGVzWzBdWydpbnN0YWxsYXRpb25JZCddKSB7XG4gICAgICAgICAgLy8gRXhhY3RseSBvbmUgZGV2aWNlIHRva2VuIG1hdGNoIGFuZCBpdCBkb2Vzbid0IGhhdmUgYW4gaW5zdGFsbGF0aW9uXG4gICAgICAgICAgLy8gSUQuIFRoaXMgaXMgdGhlIG9uZSBjYXNlIHdoZXJlIHdlIHdhbnQgdG8gbWVyZ2Ugd2l0aCB0aGUgZXhpc3RpbmdcbiAgICAgICAgICAvLyBvYmplY3QuXG4gICAgICAgICAgY29uc3QgZGVsUXVlcnkgPSB7IG9iamVjdElkOiBpZE1hdGNoLm9iamVjdElkIH07XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgICAgICAgICAuZGVzdHJveSgnX0luc3RhbGxhdGlvbicsIGRlbFF1ZXJ5KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlVG9rZW5NYXRjaGVzWzBdWydvYmplY3RJZCddO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT0gUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCkge1xuICAgICAgICAgICAgICAgIC8vIG5vIGRlbGV0aW9ucyB3ZXJlIG1hZGUuIENhbiBiZSBpZ25vcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIHJldGhyb3cgdGhlIGVycm9yXG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmRhdGEuZGV2aWNlVG9rZW4gJiYgaWRNYXRjaC5kZXZpY2VUb2tlbiAhPSB0aGlzLmRhdGEuZGV2aWNlVG9rZW4pIHtcbiAgICAgICAgICAgIC8vIFdlJ3JlIHNldHRpbmcgdGhlIGRldmljZSB0b2tlbiBvbiBhbiBleGlzdGluZyBpbnN0YWxsYXRpb24sIHNvXG4gICAgICAgICAgICAvLyB3ZSBzaG91bGQgdHJ5IGNsZWFuaW5nIG91dCBvbGQgaW5zdGFsbGF0aW9ucyB0aGF0IG1hdGNoIHRoaXNcbiAgICAgICAgICAgIC8vIGRldmljZSB0b2tlbi5cbiAgICAgICAgICAgIGNvbnN0IGRlbFF1ZXJ5ID0ge1xuICAgICAgICAgICAgICBkZXZpY2VUb2tlbjogdGhpcy5kYXRhLmRldmljZVRva2VuLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgYSB1bmlxdWUgaW5zdGFsbCBJZCwgdXNlIHRoYXQgdG8gcHJlc2VydmVcbiAgICAgICAgICAgIC8vIHRoZSBpbnRlcmVzdGluZyBpbnN0YWxsYXRpb25cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQpIHtcbiAgICAgICAgICAgICAgZGVsUXVlcnlbJ2luc3RhbGxhdGlvbklkJ10gPSB7XG4gICAgICAgICAgICAgICAgJG5lOiB0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBpZE1hdGNoLm9iamVjdElkICYmXG4gICAgICAgICAgICAgIHRoaXMuZGF0YS5vYmplY3RJZCAmJlxuICAgICAgICAgICAgICBpZE1hdGNoLm9iamVjdElkID09IHRoaXMuZGF0YS5vYmplY3RJZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIHdlIHBhc3NlZCBhbiBvYmplY3RJZCwgcHJlc2VydmUgdGhhdCBpbnN0YWxhdGlvblxuICAgICAgICAgICAgICBkZWxRdWVyeVsnb2JqZWN0SWQnXSA9IHtcbiAgICAgICAgICAgICAgICAkbmU6IGlkTWF0Y2gub2JqZWN0SWQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBXaGF0IHRvIGRvIGhlcmU/IGNhbid0IHJlYWxseSBjbGVhbiB1cCBldmVyeXRoaW5nLi4uXG4gICAgICAgICAgICAgIHJldHVybiBpZE1hdGNoLm9iamVjdElkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5hcHBJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgIGRlbFF1ZXJ5WydhcHBJZGVudGlmaWVyJ10gPSB0aGlzLmRhdGEuYXBwSWRlbnRpZmllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlc3Ryb3koJ19JbnN0YWxsYXRpb24nLCBkZWxRdWVyeSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVyci5jb2RlID09IFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQpIHtcbiAgICAgICAgICAgICAgICAvLyBubyBkZWxldGlvbnMgd2VyZSBtYWRlLiBDYW4gYmUgaWdub3JlZC5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gcmV0aHJvdyB0aGUgZXJyb3JcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEluIG5vbi1tZXJnZSBzY2VuYXJpb3MsIGp1c3QgcmV0dXJuIHRoZSBpbnN0YWxsYXRpb24gbWF0Y2ggaWRcbiAgICAgICAgICByZXR1cm4gaWRNYXRjaC5vYmplY3RJZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgLnRoZW4ob2JqSWQgPT4ge1xuICAgICAgaWYgKG9iaklkKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSB7IG9iamVjdElkOiBvYmpJZCB9O1xuICAgICAgICBkZWxldGUgdGhpcy5kYXRhLm9iamVjdElkO1xuICAgICAgICBkZWxldGUgdGhpcy5kYXRhLmNyZWF0ZWRBdDtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IFZhbGlkYXRlIG9wcyAoYWRkL3JlbW92ZSBvbiBjaGFubmVscywgJGluYyBvbiBiYWRnZSwgZXRjLilcbiAgICB9KTtcbiAgcmV0dXJuIHByb21pc2U7XG59O1xuXG4vLyBJZiB3ZSBzaG9ydC1jaXJjdWl0ZWQgdGhlIG9iamVjdCByZXNwb25zZSAtIHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgZXhwYW5kIGFsbCB0aGUgZmlsZXMsXG4vLyBzaW5jZSB0aGlzIG1pZ2h0IG5vdCBoYXZlIGEgcXVlcnksIG1lYW5pbmcgaXQgd29uJ3QgcmV0dXJuIHRoZSBmdWxsIHJlc3VsdCBiYWNrLlxuLy8gVE9ETzogKG5sdXRzZW5rbykgVGhpcyBzaG91bGQgZGllIHdoZW4gd2UgbW92ZSB0byBwZXItY2xhc3MgYmFzZWQgY29udHJvbGxlcnMgb24gX1Nlc3Npb24vX1VzZXJcblJlc3RXcml0ZS5wcm90b3R5cGUuZXhwYW5kRmlsZXNGb3JFeGlzdGluZ09iamVjdHMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIC8vIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIHNob3J0LWNpcmN1aXRlZCByZXNwb25zZSAtIG9ubHkgdGhlbiBydW4gZXhwYW5zaW9uLlxuICBpZiAodGhpcy5yZXNwb25zZSAmJiB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlKSB7XG4gICAgYXdhaXQgdGhpcy5jb25maWcuZmlsZXNDb250cm9sbGVyLmV4cGFuZEZpbGVzSW5PYmplY3QodGhpcy5jb25maWcsIHRoaXMucmVzcG9uc2UucmVzcG9uc2UpO1xuICB9XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLnJ1bkRhdGFiYXNlT3BlcmF0aW9uID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0aGlzLmNsYXNzTmFtZSA9PT0gJ19Sb2xlJykge1xuICAgIHRoaXMuY29uZmlnLmNhY2hlQ29udHJvbGxlci5yb2xlLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIpIHtcbiAgICAgIHRoaXMuY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIuY2xlYXJDYWNoZWRSb2xlcyh0aGlzLmF1dGgudXNlcik7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInICYmIHRoaXMucXVlcnkgJiYgdGhpcy5hdXRoLmlzVW5hdXRoZW50aWNhdGVkKCkpIHtcbiAgICB0aHJvdyBjcmVhdGVTYW5pdGl6ZWRFcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLlNFU1NJT05fTUlTU0lORyxcbiAgICAgIGBDYW5ub3QgbW9kaWZ5IHVzZXIgJHt0aGlzLnF1ZXJ5Lm9iamVjdElkfS5gLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG5cbiAgaWYgKHRoaXMuY2xhc3NOYW1lID09PSAnX1Byb2R1Y3QnICYmIHRoaXMuZGF0YS5kb3dubG9hZCkge1xuICAgIHRoaXMuZGF0YS5kb3dubG9hZE5hbWUgPSB0aGlzLmRhdGEuZG93bmxvYWQubmFtZTtcbiAgfVxuXG4gIC8vIFRPRE86IEFkZCBiZXR0ZXIgZGV0ZWN0aW9uIGZvciBBQ0wsIGVuc3VyaW5nIGEgdXNlciBjYW4ndCBiZSBsb2NrZWQgZnJvbVxuICAvLyAgICAgICB0aGVpciBvd24gdXNlciByZWNvcmQuXG4gIGlmICh0aGlzLmRhdGEuQUNMICYmIHRoaXMuZGF0YS5BQ0xbJyp1bnJlc29sdmVkJ10pIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9BQ0wsICdJbnZhbGlkIEFDTC4nKTtcbiAgfVxuXG4gIGlmICh0aGlzLnF1ZXJ5KSB7XG4gICAgLy8gRm9yY2UgdGhlIHVzZXIgdG8gbm90IGxvY2tvdXRcbiAgICAvLyBNYXRjaGVkIHdpdGggcGFyc2UuY29tXG4gICAgaWYgKFxuICAgICAgdGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicgJiZcbiAgICAgIHRoaXMuZGF0YS5BQ0wgJiZcbiAgICAgIHRoaXMuYXV0aC5pc01hc3RlciAhPT0gdHJ1ZSAmJlxuICAgICAgdGhpcy5hdXRoLmlzTWFpbnRlbmFuY2UgIT09IHRydWVcbiAgICApIHtcbiAgICAgIHRoaXMuZGF0YS5BQ0xbdGhpcy5xdWVyeS5vYmplY3RJZF0gPSB7IHJlYWQ6IHRydWUsIHdyaXRlOiB0cnVlIH07XG4gICAgfVxuICAgIC8vIHVwZGF0ZSBwYXNzd29yZCB0aW1lc3RhbXAgaWYgdXNlciBwYXNzd29yZCBpcyBiZWluZyBjaGFuZ2VkXG4gICAgaWYgKFxuICAgICAgdGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicgJiZcbiAgICAgIHRoaXMuZGF0YS5faGFzaGVkX3Bhc3N3b3JkICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeSAmJlxuICAgICAgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRBZ2VcbiAgICApIHtcbiAgICAgIHRoaXMuZGF0YS5fcGFzc3dvcmRfY2hhbmdlZF9hdCA9IFBhcnNlLl9lbmNvZGUobmV3IERhdGUoKSk7XG4gICAgfVxuICAgIC8vIElnbm9yZSBjcmVhdGVkQXQgd2hlbiB1cGRhdGVcbiAgICBkZWxldGUgdGhpcy5kYXRhLmNyZWF0ZWRBdDtcblxuICAgIGxldCBkZWZlciA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIC8vIGlmIHBhc3N3b3JkIGhpc3RvcnkgaXMgZW5hYmxlZCB0aGVuIHNhdmUgdGhlIGN1cnJlbnQgcGFzc3dvcmQgdG8gaGlzdG9yeVxuICAgIGlmIChcbiAgICAgIHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInICYmXG4gICAgICB0aGlzLmRhdGEuX2hhc2hlZF9wYXNzd29yZCAmJlxuICAgICAgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kgJiZcbiAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeVxuICAgICkge1xuICAgICAgZGVmZXIgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgICAuZmluZChcbiAgICAgICAgICAnX1VzZXInLFxuICAgICAgICAgIHsgb2JqZWN0SWQ6IHRoaXMub2JqZWN0SWQoKSB9LFxuICAgICAgICAgIHsga2V5czogWydfcGFzc3dvcmRfaGlzdG9yeScsICdfaGFzaGVkX3Bhc3N3b3JkJ10gfSxcbiAgICAgICAgICBBdXRoLm1haW50ZW5hbmNlKHRoaXMuY29uZmlnKVxuICAgICAgICApXG4gICAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgICB0aHJvdyB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHVzZXIgPSByZXN1bHRzWzBdO1xuICAgICAgICAgIGxldCBvbGRQYXNzd29yZHMgPSBbXTtcbiAgICAgICAgICBpZiAodXNlci5fcGFzc3dvcmRfaGlzdG9yeSkge1xuICAgICAgICAgICAgb2xkUGFzc3dvcmRzID0gXy50YWtlKFxuICAgICAgICAgICAgICB1c2VyLl9wYXNzd29yZF9oaXN0b3J5LFxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3RvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vbi0xIHBhc3N3b3JkcyBnbyBpbnRvIGhpc3RvcnkgaW5jbHVkaW5nIGxhc3QgcGFzc3dvcmRcbiAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICBvbGRQYXNzd29yZHMubGVuZ3RoID4gTWF0aC5tYXgoMCwgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRIaXN0b3J5IC0gMilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG9sZFBhc3N3b3Jkcy5zaGlmdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvbGRQYXNzd29yZHMucHVzaCh1c2VyLnBhc3N3b3JkKTtcbiAgICAgICAgICB0aGlzLmRhdGEuX3Bhc3N3b3JkX2hpc3RvcnkgPSBvbGRQYXNzd29yZHM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZlci50aGVuKCgpID0+IHtcbiAgICAgIC8vIFJ1biBhbiB1cGRhdGVcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgICAudXBkYXRlKFxuICAgICAgICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgICAgIHRoaXMucXVlcnksXG4gICAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICAgIHRoaXMucnVuT3B0aW9ucyxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlclxuICAgICAgICApXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICByZXNwb25zZS51cGRhdGVkQXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICAgICAgICB0aGlzLl91cGRhdGVSZXNwb25zZVdpdGhEYXRhKHJlc3BvbnNlLCB0aGlzLmRhdGEpO1xuICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSB7IHJlc3BvbnNlIH07XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIFNldCB0aGUgZGVmYXVsdCBBQ0wgYW5kIHBhc3N3b3JkIHRpbWVzdGFtcCBmb3IgdGhlIG5ldyBfVXNlclxuICAgIGlmICh0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgICAgdmFyIEFDTCA9IHRoaXMuZGF0YS5BQ0w7XG4gICAgICAvLyBkZWZhdWx0IHB1YmxpYyByL3cgQUNMXG4gICAgICBpZiAoIUFDTCkge1xuICAgICAgICBBQ0wgPSB7fTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5lbmZvcmNlUHJpdmF0ZVVzZXJzKSB7XG4gICAgICAgICAgQUNMWycqJ10gPSB7IHJlYWQ6IHRydWUsIHdyaXRlOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBtYWtlIHN1cmUgdGhlIHVzZXIgaXMgbm90IGxvY2tlZCBkb3duXG4gICAgICBBQ0xbdGhpcy5kYXRhLm9iamVjdElkXSA9IHsgcmVhZDogdHJ1ZSwgd3JpdGU6IHRydWUgfTtcbiAgICAgIHRoaXMuZGF0YS5BQ0wgPSBBQ0w7XG4gICAgICAvLyBwYXNzd29yZCB0aW1lc3RhbXAgdG8gYmUgdXNlZCB3aGVuIHBhc3N3b3JkIGV4cGlyeSBwb2xpY3kgaXMgZW5mb3JjZWRcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeSAmJiB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEFnZSkge1xuICAgICAgICB0aGlzLmRhdGEuX3Bhc3N3b3JkX2NoYW5nZWRfYXQgPSBQYXJzZS5fZW5jb2RlKG5ldyBEYXRlKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJ1biBhIGNyZWF0ZVxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmNyZWF0ZSh0aGlzLmNsYXNzTmFtZSwgdGhpcy5kYXRhLCB0aGlzLnJ1bk9wdGlvbnMsIGZhbHNlLCB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlcilcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNsYXNzTmFtZSAhPT0gJ19Vc2VyJyB8fCBlcnJvci5jb2RlICE9PSBQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFF1aWNrIGNoZWNrLCBpZiB3ZSB3ZXJlIGFibGUgdG8gaW5mZXIgdGhlIGR1cGxpY2F0ZWQgZmllbGQgbmFtZVxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IudXNlckluZm8gJiYgZXJyb3IudXNlckluZm8uZHVwbGljYXRlZF9maWVsZCA9PT0gJ3VzZXJuYW1lJykge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgIFBhcnNlLkVycm9yLlVTRVJOQU1FX1RBS0VOLFxuICAgICAgICAgICAgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdXNlcm5hbWUuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IudXNlckluZm8gJiYgZXJyb3IudXNlckluZm8uZHVwbGljYXRlZF9maWVsZCA9PT0gJ2VtYWlsJykge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgIFBhcnNlLkVycm9yLkVNQUlMX1RBS0VOLFxuICAgICAgICAgICAgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgZW1haWwgYWRkcmVzcy4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoaXMgd2FzIGEgZmFpbGVkIHVzZXIgY3JlYXRpb24gZHVlIHRvIHVzZXJuYW1lIG9yIGVtYWlsIGFscmVhZHkgdGFrZW4sIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gY2hlY2sgd2hldGhlciBpdCB3YXMgdXNlcm5hbWUgb3IgZW1haWwgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgZXJyb3IuXG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIHRoZSBvcmlnaW5hbCBtZXRob2RcbiAgICAgICAgLy8gVE9ETzogU2VlIGlmIHdlIGNhbiBsYXRlciBkbyB0aGlzIHdpdGhvdXQgYWRkaXRpb25hbCBxdWVyaWVzIGJ5IHVzaW5nIG5hbWVkIGluZGV4ZXMuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgICAgIC5maW5kKFxuICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLmRhdGEudXNlcm5hbWUsXG4gICAgICAgICAgICAgIG9iamVjdElkOiB7ICRuZTogdGhpcy5vYmplY3RJZCgpIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBsaW1pdDogMSB9XG4gICAgICAgICAgKVxuICAgICAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuVVNFUk5BTUVfVEFLRU4sXG4gICAgICAgICAgICAgICAgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdXNlcm5hbWUuJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgICAgICAgICB7IGVtYWlsOiB0aGlzLmRhdGEuZW1haWwsIG9iamVjdElkOiB7ICRuZTogdGhpcy5vYmplY3RJZCgpIH0gfSxcbiAgICAgICAgICAgICAgeyBsaW1pdDogMSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgICBQYXJzZS5FcnJvci5FTUFJTF9UQUtFTixcbiAgICAgICAgICAgICAgICAnQWNjb3VudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBlbWFpbCBhZGRyZXNzLidcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuRFVQTElDQVRFX1ZBTFVFLFxuICAgICAgICAgICAgICAnQSBkdXBsaWNhdGUgdmFsdWUgZm9yIGEgZmllbGQgd2l0aCB1bmlxdWUgdmFsdWVzIHdhcyBwcm92aWRlZCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICByZXNwb25zZS5vYmplY3RJZCA9IHRoaXMuZGF0YS5vYmplY3RJZDtcbiAgICAgICAgcmVzcG9uc2UuY3JlYXRlZEF0ID0gdGhpcy5kYXRhLmNyZWF0ZWRBdDtcblxuICAgICAgICBpZiAodGhpcy5yZXNwb25zZVNob3VsZEhhdmVVc2VybmFtZSkge1xuICAgICAgICAgIHJlc3BvbnNlLnVzZXJuYW1lID0gdGhpcy5kYXRhLnVzZXJuYW1lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZVJlc3BvbnNlV2l0aERhdGEocmVzcG9uc2UsIHRoaXMuZGF0YSk7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSB7XG4gICAgICAgICAgc3RhdHVzOiAyMDEsXG4gICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgbG9jYXRpb246IHRoaXMubG9jYXRpb24oKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG59O1xuXG4vLyBSZXR1cm5zIG5vdGhpbmcgLSBkb2Vzbid0IHdhaXQgZm9yIHRoZSB0cmlnZ2VyLlxuUmVzdFdyaXRlLnByb3RvdHlwZS5ydW5BZnRlclNhdmVUcmlnZ2VyID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMucmVzcG9uc2UgfHwgIXRoaXMucmVzcG9uc2UucmVzcG9uc2UgfHwgdGhpcy5ydW5PcHRpb25zLm1hbnkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBBdm9pZCBkb2luZyBhbnkgc2V0dXAgZm9yIHRyaWdnZXJzIGlmIHRoZXJlIGlzIG5vICdhZnRlclNhdmUnIHRyaWdnZXIgZm9yIHRoaXMgY2xhc3MuXG4gIGNvbnN0IGhhc0FmdGVyU2F2ZUhvb2sgPSB0cmlnZ2Vycy50cmlnZ2VyRXhpc3RzKFxuICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgIHRyaWdnZXJzLlR5cGVzLmFmdGVyU2F2ZSxcbiAgICB0aGlzLmNvbmZpZy5hcHBsaWNhdGlvbklkXG4gICk7XG4gIGNvbnN0IGhhc0xpdmVRdWVyeSA9IHRoaXMuY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIuaGFzTGl2ZVF1ZXJ5KHRoaXMuY2xhc3NOYW1lKTtcbiAgaWYgKCFoYXNBZnRlclNhdmVIb29rICYmICFoYXNMaXZlUXVlcnkpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBjb25zdCB7IG9yaWdpbmFsT2JqZWN0LCB1cGRhdGVkT2JqZWN0IH0gPSB0aGlzLmJ1aWxkUGFyc2VPYmplY3RzKCk7XG4gIHVwZGF0ZWRPYmplY3QuX2hhbmRsZVNhdmVSZXNwb25zZSh0aGlzLnJlc3BvbnNlLnJlc3BvbnNlLCB0aGlzLnJlc3BvbnNlLnN0YXR1cyB8fCAyMDApO1xuXG4gIGlmIChoYXNMaXZlUXVlcnkpIHtcbiAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5sb2FkU2NoZW1hKCkudGhlbihzY2hlbWFDb250cm9sbGVyID0+IHtcbiAgICAgIC8vIE5vdGlmeSBMaXZlUXVlcnlTZXJ2ZXIgaWYgcG9zc2libGVcbiAgICAgIGNvbnN0IHBlcm1zID0gc2NoZW1hQ29udHJvbGxlci5nZXRDbGFzc0xldmVsUGVybWlzc2lvbnModXBkYXRlZE9iamVjdC5jbGFzc05hbWUpO1xuICAgICAgdGhpcy5jb25maWcubGl2ZVF1ZXJ5Q29udHJvbGxlci5vbkFmdGVyU2F2ZShcbiAgICAgICAgdXBkYXRlZE9iamVjdC5jbGFzc05hbWUsXG4gICAgICAgIHVwZGF0ZWRPYmplY3QsXG4gICAgICAgIG9yaWdpbmFsT2JqZWN0LFxuICAgICAgICBwZXJtc1xuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICBpZiAoIWhhc0FmdGVyU2F2ZUhvb2spIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgLy8gUnVuIGFmdGVyU2F2ZSB0cmlnZ2VyXG4gIHJldHVybiB0cmlnZ2Vyc1xuICAgIC5tYXliZVJ1blRyaWdnZXIoXG4gICAgICB0cmlnZ2Vycy5UeXBlcy5hZnRlclNhdmUsXG4gICAgICB0aGlzLmF1dGgsXG4gICAgICB1cGRhdGVkT2JqZWN0LFxuICAgICAgb3JpZ2luYWxPYmplY3QsXG4gICAgICB0aGlzLmNvbmZpZyxcbiAgICAgIHRoaXMuY29udGV4dFxuICAgIClcbiAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgY29uc3QganNvblJldHVybmVkID0gcmVzdWx0ICYmICFyZXN1bHQuX3RvRnVsbEpTT047XG4gICAgICBpZiAoanNvblJldHVybmVkKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ09wcy5vcGVyYXRpb25zID0ge307XG4gICAgICAgIHRoaXMucmVzcG9uc2UucmVzcG9uc2UgPSByZXN1bHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlID0gdGhpcy5fdXBkYXRlUmVzcG9uc2VXaXRoRGF0YShcbiAgICAgICAgICAocmVzdWx0IHx8IHVwZGF0ZWRPYmplY3QpLnRvSlNPTigpLFxuICAgICAgICAgIHRoaXMuZGF0YVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdhZnRlclNhdmUgY2F1Z2h0IGFuIGVycm9yJywgZXJyKTtcbiAgICB9KTtcbn07XG5cbi8vIEEgaGVscGVyIHRvIGZpZ3VyZSBvdXQgd2hhdCBsb2NhdGlvbiB0aGlzIG9wZXJhdGlvbiBoYXBwZW5zIGF0LlxuUmVzdFdyaXRlLnByb3RvdHlwZS5sb2NhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG1pZGRsZSA9IHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInID8gJy91c2Vycy8nIDogJy9jbGFzc2VzLycgKyB0aGlzLmNsYXNzTmFtZSArICcvJztcbiAgY29uc3QgbW91bnQgPSB0aGlzLmNvbmZpZy5tb3VudCB8fCB0aGlzLmNvbmZpZy5zZXJ2ZXJVUkw7XG4gIHJldHVybiBtb3VudCArIG1pZGRsZSArIHRoaXMuZGF0YS5vYmplY3RJZDtcbn07XG5cbi8vIEEgaGVscGVyIHRvIGdldCB0aGUgb2JqZWN0IGlkIGZvciB0aGlzIG9wZXJhdGlvbi5cbi8vIEJlY2F1c2UgaXQgY291bGQgYmUgZWl0aGVyIG9uIHRoZSBxdWVyeSBvciBvbiB0aGUgZGF0YVxuUmVzdFdyaXRlLnByb3RvdHlwZS5vYmplY3RJZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZGF0YS5vYmplY3RJZCB8fCB0aGlzLnF1ZXJ5Lm9iamVjdElkO1xufTtcblxuLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIGRhdGEgYW5kIGRlbGV0ZSBiYWQga2V5cyAoX2F1dGhfZGF0YSwgX2hhc2hlZF9wYXNzd29yZC4uLilcblJlc3RXcml0ZS5wcm90b3R5cGUuc2FuaXRpemVkRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZGF0YSA9IE9iamVjdC5rZXlzKHRoaXMuZGF0YSkucmVkdWNlKChkYXRhLCBrZXkpID0+IHtcbiAgICAvLyBSZWdleHAgY29tZXMgZnJvbSBQYXJzZS5PYmplY3QucHJvdG90eXBlLnZhbGlkYXRlXG4gICAgaWYgKCEvXltBLVphLXpdWzAtOUEtWmEtel9dKiQvLnRlc3Qoa2V5KSkge1xuICAgICAgZGVsZXRlIGRhdGFba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0sIGRlZXBjb3B5KHRoaXMuZGF0YSkpO1xuICByZXR1cm4gUGFyc2UuX2RlY29kZSh1bmRlZmluZWQsIGRhdGEpO1xufTtcblxuLy8gUmV0dXJucyBhbiB1cGRhdGVkIGNvcHkgb2YgdGhlIG9iamVjdFxuUmVzdFdyaXRlLnByb3RvdHlwZS5idWlsZFBhcnNlT2JqZWN0cyA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZXh0cmFEYXRhID0geyBjbGFzc05hbWU6IHRoaXMuY2xhc3NOYW1lLCBvYmplY3RJZDogdGhpcy5xdWVyeT8ub2JqZWN0SWQgfTtcbiAgbGV0IG9yaWdpbmFsT2JqZWN0O1xuICBpZiAodGhpcy5xdWVyeSAmJiB0aGlzLnF1ZXJ5Lm9iamVjdElkKSB7XG4gICAgb3JpZ2luYWxPYmplY3QgPSB0cmlnZ2Vycy5pbmZsYXRlKGV4dHJhRGF0YSwgdGhpcy5vcmlnaW5hbERhdGEpO1xuICB9XG5cbiAgY29uc3QgY2xhc3NOYW1lID0gUGFyc2UuT2JqZWN0LmZyb21KU09OKGV4dHJhRGF0YSk7XG4gIGNvbnN0IHJlYWRPbmx5QXR0cmlidXRlcyA9IGNsYXNzTmFtZS5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXNcbiAgICA/IGNsYXNzTmFtZS5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXMoKVxuICAgIDogW107XG5cbiAgLy8gRm9yIF9Sb2xlIGNsYXNzLCAnbmFtZScgY2Fubm90IGJlIHNldCBhZnRlciB0aGUgcm9sZSBoYXMgYW4gb2JqZWN0SWQuXG4gIC8vIEluIGFmdGVyU2F2ZSBjb250ZXh0LCBfaGFuZGxlU2F2ZVJlc3BvbnNlIGhhcyBhbHJlYWR5IHNldCB0aGUgb2JqZWN0SWQsXG4gIC8vIHNvIHdlIHRyZWF0ICduYW1lJyBhcyByZWFkLW9ubHkgdG8gYXZvaWQgUGFyc2UgU0RLIHZhbGlkYXRpb24gZXJyb3JzLlxuICBjb25zdCBpc1JvbGVBZnRlclNhdmUgPSB0aGlzLmNsYXNzTmFtZSA9PT0gJ19Sb2xlJyAmJiB0aGlzLnJlc3BvbnNlICYmICF0aGlzLnF1ZXJ5O1xuICBpZiAoaXNSb2xlQWZ0ZXJTYXZlICYmIHRoaXMuZGF0YS5uYW1lICYmICFyZWFkT25seUF0dHJpYnV0ZXMuaW5jbHVkZXMoJ25hbWUnKSkge1xuICAgIHJlYWRPbmx5QXR0cmlidXRlcy5wdXNoKCduYW1lJyk7XG4gIH1cbiAgaWYgKCF0aGlzLm9yaWdpbmFsRGF0YSkge1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIHJlYWRPbmx5QXR0cmlidXRlcykge1xuICAgICAgZXh0cmFEYXRhW2F0dHJpYnV0ZV0gPSB0aGlzLmRhdGFbYXR0cmlidXRlXTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdXBkYXRlZE9iamVjdCA9IHRyaWdnZXJzLmluZmxhdGUoZXh0cmFEYXRhLCB0aGlzLm9yaWdpbmFsRGF0YSk7XG4gIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkucmVkdWNlKGZ1bmN0aW9uIChkYXRhLCBrZXkpIHtcbiAgICBpZiAoa2V5LmluZGV4T2YoJy4nKSA+IDApIHtcbiAgICAgIGlmICh0eXBlb2YgZGF0YVtrZXldLl9fb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICghcmVhZE9ubHlBdHRyaWJ1dGVzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICB1cGRhdGVkT2JqZWN0LnNldChrZXksIGRhdGFba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHN1YmRvY3VtZW50IGtleSB3aXRoIGRvdCBub3RhdGlvbiB7ICd4LnknOiB2IH0gPT4geyAneCc6IHsgJ3knIDogdiB9IH0pXG4gICAgICAgIGNvbnN0IHNwbGl0dGVkS2V5ID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IHBhcmVudFByb3AgPSBzcGxpdHRlZEtleVswXTtcbiAgICAgICAgbGV0IHBhcmVudFZhbCA9IHVwZGF0ZWRPYmplY3QuZ2V0KHBhcmVudFByb3ApO1xuICAgICAgICBpZiAodHlwZW9mIHBhcmVudFZhbCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBwYXJlbnRWYWwgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRWYWxbc3BsaXR0ZWRLZXlbMV1dID0gZGF0YVtrZXldO1xuICAgICAgICB1cGRhdGVkT2JqZWN0LnNldChwYXJlbnRQcm9wLCBwYXJlbnRWYWwpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGRhdGFba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0sIGRlZXBjb3B5KHRoaXMuZGF0YSkpO1xuXG4gIGNvbnN0IHNhbml0aXplZCA9IHRoaXMuc2FuaXRpemVkRGF0YSgpO1xuICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiByZWFkT25seUF0dHJpYnV0ZXMpIHtcbiAgICBkZWxldGUgc2FuaXRpemVkW2F0dHJpYnV0ZV07XG4gIH1cbiAgdXBkYXRlZE9iamVjdC5zZXQoc2FuaXRpemVkKTtcbiAgcmV0dXJuIHsgdXBkYXRlZE9iamVjdCwgb3JpZ2luYWxPYmplY3QgfTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuY2xlYW5Vc2VyQXV0aERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnJlc3BvbnNlICYmIHRoaXMucmVzcG9uc2UucmVzcG9uc2UgJiYgdGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicpIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5yZXNwb25zZS5yZXNwb25zZTtcbiAgICBpZiAodXNlci5hdXRoRGF0YSkge1xuICAgICAgT2JqZWN0LmtleXModXNlci5hdXRoRGF0YSkuZm9yRWFjaChwcm92aWRlciA9PiB7XG4gICAgICAgIGlmICh1c2VyLmF1dGhEYXRhW3Byb3ZpZGVyXSA9PT0gbnVsbCkge1xuICAgICAgICAgIGRlbGV0ZSB1c2VyLmF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoT2JqZWN0LmtleXModXNlci5hdXRoRGF0YSkubGVuZ3RoID09IDApIHtcbiAgICAgICAgZGVsZXRlIHVzZXIuYXV0aERhdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLl91cGRhdGVSZXNwb25zZVdpdGhEYXRhID0gZnVuY3Rpb24gKHJlc3BvbnNlLCBkYXRhKSB7XG4gIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IFBhcnNlLkNvcmVNYW5hZ2VyLmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICBjb25zdCBbcGVuZGluZ10gPSBzdGF0ZUNvbnRyb2xsZXIuZ2V0UGVuZGluZ09wcyh0aGlzLnBlbmRpbmdPcHMuaWRlbnRpZmllcik7XG4gIGZvciAoY29uc3Qga2V5IGluIHRoaXMucGVuZGluZ09wcy5vcGVyYXRpb25zKSB7XG4gICAgaWYgKCFwZW5kaW5nW2tleV0pIHtcbiAgICAgIGRhdGFba2V5XSA9IHRoaXMub3JpZ2luYWxEYXRhID8gdGhpcy5vcmlnaW5hbERhdGFba2V5XSA6IHsgX19vcDogJ0RlbGV0ZScgfTtcbiAgICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyLnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2tpcEtleXMgPSBbLi4uKHJlcXVpcmVkQ29sdW1ucy5yZWFkW3RoaXMuY2xhc3NOYW1lXSB8fCBbXSldO1xuICBpZiAoIXRoaXMucXVlcnkpIHtcbiAgICBza2lwS2V5cy5wdXNoKCdvYmplY3RJZCcsICdjcmVhdGVkQXQnKTtcbiAgfSBlbHNlIHtcbiAgICBza2lwS2V5cy5wdXNoKCd1cGRhdGVkQXQnKTtcbiAgICBkZWxldGUgcmVzcG9uc2Uub2JqZWN0SWQ7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gcmVzcG9uc2UpIHtcbiAgICBpZiAoc2tpcEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcmVzcG9uc2Vba2V5XTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PSBudWxsIHx8XG4gICAgICAodmFsdWUuX190eXBlICYmIHZhbHVlLl9fdHlwZSA9PT0gJ1BvaW50ZXInKSB8fFxuICAgICAgdXRpbC5pc0RlZXBTdHJpY3RFcXVhbChkYXRhW2tleV0sIHZhbHVlKSB8fFxuICAgICAgdXRpbC5pc0RlZXBTdHJpY3RFcXVhbCgodGhpcy5vcmlnaW5hbERhdGEgfHwge30pW2tleV0sIHZhbHVlKVxuICAgICkge1xuICAgICAgZGVsZXRlIHJlc3BvbnNlW2tleV07XG4gICAgfVxuICB9XG4gIGlmIChfLmlzRW1wdHkodGhpcy5zdG9yYWdlLmZpZWxkc0NoYW5nZWRCeVRyaWdnZXIpKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG4gIGNvbnN0IGNsaWVudFN1cHBvcnRzRGVsZXRlID0gQ2xpZW50U0RLLnN1cHBvcnRzRm9yd2FyZERlbGV0ZSh0aGlzLmNsaWVudFNESyk7XG4gIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyLmZvckVhY2goZmllbGROYW1lID0+IHtcbiAgICBjb25zdCBkYXRhVmFsdWUgPSBkYXRhW2ZpZWxkTmFtZV07XG5cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXNwb25zZSwgZmllbGROYW1lKSkge1xuICAgICAgcmVzcG9uc2VbZmllbGROYW1lXSA9IGRhdGFWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBTdHJpcHMgb3BlcmF0aW9ucyBmcm9tIHJlc3BvbnNlc1xuICAgIGlmIChyZXNwb25zZVtmaWVsZE5hbWVdICYmIHJlc3BvbnNlW2ZpZWxkTmFtZV0uX19vcCkge1xuICAgICAgZGVsZXRlIHJlc3BvbnNlW2ZpZWxkTmFtZV07XG4gICAgICBpZiAoY2xpZW50U3VwcG9ydHNEZWxldGUgJiYgZGF0YVZhbHVlLl9fb3AgPT0gJ0RlbGV0ZScpIHtcbiAgICAgICAgcmVzcG9uc2VbZmllbGROYW1lXSA9IGRhdGFWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzcG9uc2U7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSZXN0V3JpdGU7XG5tb2R1bGUuZXhwb3J0cyA9IFJlc3RXcml0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