velocious 1.0.501 → 1.0.503

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 (46) hide show
  1. package/build/application.js +2 -0
  2. package/build/src/application.d.ts.map +1 -1
  3. package/build/src/application.js +3 -1
  4. package/build/src/sync/sync-change-fanout.d.ts +71 -0
  5. package/build/src/sync/sync-change-fanout.d.ts.map +1 -0
  6. package/build/src/sync/sync-change-fanout.js +54 -0
  7. package/build/src/sync/sync-client-types.d.ts +6 -2
  8. package/build/src/sync/sync-client-types.d.ts.map +1 -1
  9. package/build/src/sync/sync-client-types.js +1 -1
  10. package/build/src/sync/sync-client.d.ts +71 -4
  11. package/build/src/sync/sync-client.d.ts.map +1 -1
  12. package/build/src/sync/sync-client.js +126 -18
  13. package/build/src/sync/sync-envelope-replay-service.d.ts +15 -4
  14. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  15. package/build/src/sync/sync-envelope-replay-service.js +60 -42
  16. package/build/src/sync/sync-publish-suppression.d.ts +31 -0
  17. package/build/src/sync/sync-publish-suppression.d.ts.map +1 -0
  18. package/build/src/sync/sync-publish-suppression.js +54 -0
  19. package/build/src/sync/sync-publisher-types.d.ts +146 -0
  20. package/build/src/sync/sync-publisher-types.d.ts.map +1 -0
  21. package/build/src/sync/sync-publisher-types.js +3 -0
  22. package/build/src/sync/sync-publisher.d.ts +137 -0
  23. package/build/src/sync/sync-publisher.d.ts.map +1 -0
  24. package/build/src/sync/sync-publisher.js +305 -0
  25. package/build/src/testing/test-runner.d.ts +8 -0
  26. package/build/src/testing/test-runner.d.ts.map +1 -1
  27. package/build/src/testing/test-runner.js +64 -2
  28. package/build/sync/sync-change-fanout.js +58 -0
  29. package/build/sync/sync-client-types.js +3 -2
  30. package/build/sync/sync-client.js +136 -18
  31. package/build/sync/sync-envelope-replay-service.js +60 -41
  32. package/build/sync/sync-publish-suppression.js +59 -0
  33. package/build/sync/sync-publisher-types.js +64 -0
  34. package/build/sync/sync-publisher.js +351 -0
  35. package/build/testing/test-runner.js +69 -1
  36. package/build/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +1 -1
  38. package/src/application.js +2 -0
  39. package/src/sync/sync-change-fanout.js +58 -0
  40. package/src/sync/sync-client-types.js +3 -2
  41. package/src/sync/sync-client.js +136 -18
  42. package/src/sync/sync-envelope-replay-service.js +60 -41
  43. package/src/sync/sync-publish-suppression.js +59 -0
  44. package/src/sync/sync-publisher-types.js +64 -0
  45. package/src/sync/sync-publisher.js +351 -0
  46. package/src/testing/test-runner.js +69 -1
@@ -1,6 +1,7 @@
1
1
  // @ts-check
2
2
  import Configuration from "../configuration.js";
3
3
  import { isBooleanColumnType } from "../database/column-types.js";
4
+ import Logger from "../logger.js";
4
5
  import restArgsError from "../utils/rest-args-error.js";
5
6
  import { serializedScopeFromQuery } from "./query-scope.js";
6
7
  import SyncApiClient from "./sync-api-client.js";
@@ -10,6 +11,13 @@ import { currentSyncClient, setCurrentSyncClient } from "./sync-client-registry.
10
11
  let clientCounter = 0;
11
12
  /** @type {{create: "afterCreate", update: "afterUpdate", destroy: "afterDestroy"}} */
12
13
  const TRACKED_CALLBACK_NAMES = { create: "afterCreate", destroy: "afterDestroy", update: "afterUpdate" };
14
+ /**
15
+ * Operations tracked by default for models declaring `static sync` without a
16
+ * `track` key: local creates and updates queue automatically. Destroys are not
17
+ * tracked by default because a local destroy is often cache eviction rather
18
+ * than a server delete; opt in with `track: true` or an operations list.
19
+ * @type {Array<"create" | "update" | "destroy">} */
20
+ const DEFAULT_TRACKED_OPERATIONS = ["create", "update"];
13
21
  /** Attribute names treated as client-local sync bookkeeping when deriving localOnlyAttributes. */
14
22
  const LOCAL_BOOKKEEPING_ATTRIBUTE_NAMES = ["createdAt", "updatedAt", "lastSyncChangeAt"];
15
23
  /** @type {WeakMap<Configuration, SyncClient>} */
@@ -88,12 +96,17 @@ export default class SyncClient {
88
96
  this._trackedCallbacks = [];
89
97
  /** @type {WeakSet<object>} */
90
98
  this._remoteApplyRecords = new WeakSet();
99
+ this._withoutTrackingDepth = 0;
100
+ /** @type {Logger | {error: (...messages: Array<?>) => Promise<void>} | null} */
101
+ this._logger = null;
91
102
  this._started = false;
92
103
  }
93
104
  /**
94
- * Registers automatic mutation tracking for every resource with `track` enabled:
95
- * local model creates/updates/destroys queue pending sync rows and schedule an
96
- * immediate replay attempt, without app-side queue calls.
105
+ * Registers automatic mutation tracking for every declared resource (on by
106
+ * default: local creates and updates queue pending sync rows once their
107
+ * transaction commits and schedule an immediate replay attempt, without
108
+ * app-side queue calls). `track: false` resources are skipped; `track: true`
109
+ * adds destroys; an operations list narrows the tracked operations.
97
110
  * @returns {Promise<void>}
98
111
  */
99
112
  async start() {
@@ -123,13 +136,18 @@ export default class SyncClient {
123
136
  }
124
137
  /**
125
138
  * Resolves and validates the tracked operations for a resource config.
139
+ * Tracking is on by default: models declaring `static sync` without a `track`
140
+ * key queue local creates and updates automatically; `track: false` opts a
141
+ * model out (for models written by non-user flows).
126
142
  * @param {{resourceConfig: import("./sync-client-types.js").SyncClientResourceConfig, resourceType: string}} args - Resource config and name.
127
143
  * @returns {Array<"create" | "update" | "destroy">} Tracked operations.
128
144
  */
129
145
  trackedOperations({ resourceConfig, resourceType }) {
130
146
  const track = resourceConfig.track;
131
- if (track === undefined || track === false)
147
+ if (track === false)
132
148
  return [];
149
+ if (track === undefined)
150
+ return DEFAULT_TRACKED_OPERATIONS;
133
151
  if (track === true)
134
152
  return ["create", "update", "destroy"];
135
153
  if (!track || typeof track !== "object" || !Array.isArray(track.operations) || track.operations.length === 0) {
@@ -143,25 +161,70 @@ export default class SyncClient {
143
161
  return track.operations;
144
162
  }
145
163
  /**
146
- * Builds the lifecycle callback queueing one tracked mutation.
164
+ * Builds the lifecycle callback queueing one tracked mutation. The queued
165
+ * payload and sync type are snapshotted at mutation-callback time, so
166
+ * afterSave hooks assigning unsaved attributes (or any later drift on the
167
+ * record) cannot change what gets queued vs what was committed. Queueing is
168
+ * deferred through the model connection's afterCommit hook so it only runs
169
+ * once the mutation's transaction has committed (immediately when no
170
+ * transaction is open) - queued syncs never reference rolled-back rows.
171
+ * Post-commit queue failures are reported without rethrowing into the
172
+ * driver's afterCommit chain (see reportAfterCommitError).
147
173
  * @param {{operation: "create" | "update" | "destroy", resourceConfig: import("./sync-client-types.js").SyncClientResourceConfig}} args - Operation and resource config.
148
174
  * @returns {(record: ?) => Promise<void>} Lifecycle callback.
149
175
  */
150
176
  trackedMutationCallback({ operation, resourceConfig }) {
151
177
  return async (record) => {
152
- if (this.isRemoteApply(record))
178
+ if (this.isTrackingSuppressed(record))
153
179
  return;
154
- await SyncApiClient.queueLocalSync({
180
+ const data = SyncApiClient.queuedSyncData({
155
181
  booleanAttributes: resourceConfig.booleanAttributes || [],
156
182
  data: resourceConfig.trackedData ? resourceConfig.trackedData({ operation, record }) : undefined,
157
183
  localOnlyAttributes: resourceConfig.localOnlyAttributes || [],
158
- resource: record,
159
- syncModel: this.config.syncModel,
160
- syncType: this.defaultSyncType({ operation, record, resourceConfig })
184
+ resource: record
185
+ });
186
+ const syncType = this.defaultSyncType({ operation, record, resourceConfig });
187
+ await resourceConfig.modelClass.connection().afterCommit(async () => {
188
+ try {
189
+ await SyncApiClient.queueLocalSync({
190
+ data,
191
+ resource: record,
192
+ syncModel: this.config.syncModel,
193
+ syncType
194
+ });
195
+ }
196
+ catch (error) {
197
+ await this.reportAfterCommitError(/** @type {Error} */ (error));
198
+ return;
199
+ }
200
+ this.scheduleReplay();
161
201
  });
162
- this.scheduleReplay();
163
202
  };
164
203
  }
204
+ /**
205
+ * Reports a post-commit tracked-queueing failure. The transaction has already
206
+ * committed when afterCommit callbacks run, so rethrowing here would poison
207
+ * the driver's awaited afterCommit chain (breaking unrelated callbacks) -
208
+ * instead the failure goes to the configured sync.client.onError hook, or is
209
+ * logged loudly through the client's logger when none is configured.
210
+ * @param {Error} error - Post-commit queueing failure.
211
+ * @returns {Promise<void>}
212
+ */
213
+ async reportAfterCommitError(error) {
214
+ if (this.config.onError) {
215
+ this.config.onError(error);
216
+ return;
217
+ }
218
+ await this.logger().error("SyncClient failed to queue a tracked mutation after commit", error);
219
+ }
220
+ /**
221
+ * Returns the lazily built client logger.
222
+ * @returns {Logger | {error: (...messages: Array<?>) => Promise<void>}} Client logger.
223
+ */
224
+ logger() {
225
+ this._logger ||= new Logger("SyncClient", { configuration: this.config.configuration });
226
+ return this._logger;
227
+ }
165
228
  /**
166
229
  * Whether a record is currently being written by pull-apply (echo suppression).
167
230
  * @param {?} record - Local model record.
@@ -170,6 +233,50 @@ export default class SyncClient {
170
233
  isRemoteApply(record) {
171
234
  return this._remoteApplyRecords.has(record);
172
235
  }
236
+ /**
237
+ * Whether tracked mutation queueing is currently suppressed for a record:
238
+ * either the record was marked as a remote apply (`markRemoteApply`, used by
239
+ * pull and realtime applies) or a `withoutTracking` callback is running on
240
+ * this client.
241
+ * @param {?} record - Local model record.
242
+ * @returns {boolean} Whether tracked queueing is suppressed for the record.
243
+ */
244
+ isTrackingSuppressed(record) {
245
+ return this._withoutTrackingDepth > 0 || this.isRemoteApply(record);
246
+ }
247
+ /**
248
+ * Runs a callback with tracked mutation queueing suppressed on this client -
249
+ * for code applying server-originated data outside the derived pull/realtime
250
+ * appliers (legacy pull paths, importers, sign-in backfills), so their writes
251
+ * are not echoed back to the server as device changes. Suppression covers the
252
+ * whole async duration of the callback (nested calls stack) and is
253
+ * client-wide while it runs: mutations from concurrently running tasks are
254
+ * also suppressed for that window, so prefer `markRemoteApply(record)` when
255
+ * writes from other flows can interleave.
256
+ * @template T
257
+ * @param {() => Promise<T> | T} callback - Work whose model writes should not queue tracked syncs.
258
+ * @returns {Promise<T>} The callback result.
259
+ */
260
+ async withoutTracking(callback) {
261
+ this._withoutTrackingDepth++;
262
+ try {
263
+ return await callback();
264
+ }
265
+ finally {
266
+ this._withoutTrackingDepth--;
267
+ }
268
+ }
269
+ /**
270
+ * Marks one record as being written from server-originated data so tracked
271
+ * mutation queueing skips it (record-precise suppression). The derived pull
272
+ * and realtime appliers use this internally around every applied write.
273
+ * @param {?} record - Local model record about to be written.
274
+ * @returns {() => void} Release callback re-enabling tracking for the record.
275
+ */
276
+ markRemoteApply(record) {
277
+ this._remoteApplyRecords.add(record);
278
+ return () => this._remoteApplyRecords.delete(record);
279
+ }
173
280
  /**
174
281
  * Registers this client as the app's current sync client.
175
282
  * @returns {void}
@@ -275,10 +382,7 @@ export default class SyncClient {
275
382
  */
276
383
  remoteApplySync({ source = "pulled change" } = {}) {
277
384
  const pullResourceConfigs = this.pullResourceConfigs();
278
- const applier = SyncApiClient.resourceApplier(pullResourceConfigs, (record) => {
279
- this._remoteApplyRecords.add(record);
280
- return () => this._remoteApplyRecords.delete(record);
281
- });
385
+ const applier = SyncApiClient.resourceApplier(pullResourceConfigs, (record) => this.markRemoteApply(record));
282
386
  return async (sync) => {
283
387
  const resourceType = sync.resourceType();
284
388
  if (!resourceType || !pullResourceConfigs[resourceType]) {
@@ -475,10 +579,14 @@ function resourceConfigFromSyncDeclaration({ declaration, modelClass, resourceTy
475
579
  if (!normalizedDeclaration || typeof normalizedDeclaration !== "object" || Array.isArray(normalizedDeclaration)) {
476
580
  throw new Error(`${resourceType} static sync must be true or a sync declaration object, got: ${String(declaration)}`);
477
581
  }
478
- const { afterApply, attributes, booleanAttributes, findRecord, findRecordForDelete, localOnlyAttributes, realtime, syncType, track, trackedData, ...restDeclaration } = normalizedDeclaration;
582
+ const { afterApply, attributes, booleanAttributes, findRecord, findRecordForDelete, localOnlyAttributes, publish, realtime, syncType, track, trackedData, ...restDeclaration } = normalizedDeclaration;
479
583
  const unknownKeys = Object.keys(restDeclaration);
584
+ // `publish` is the server-side half of the shared `static sync` declaration
585
+ // (consumed by SyncPublisher on the backend) - the client derives nothing
586
+ // from it, but models declared once for both sides must stay valid here.
587
+ void publish;
480
588
  if (unknownKeys.length > 0) {
481
- throw new Error(`${resourceType} static sync received unknown keys: ${unknownKeys.join(", ")} (supported: afterApply, attributes, booleanAttributes, findRecord, findRecordForDelete, localOnlyAttributes, realtime, syncType, track, trackedData)`);
589
+ throw new Error(`${resourceType} static sync received unknown keys: ${unknownKeys.join(", ")} (supported: afterApply, attributes, booleanAttributes, findRecord, findRecordForDelete, localOnlyAttributes, publish, realtime, syncType, track, trackedData)`);
482
590
  }
483
591
  if (syncType !== undefined && typeof syncType !== "function" && syncType !== "upsert") {
484
592
  throw new Error(`${resourceType} static sync syncType must be a function or the string "upsert", got: ${String(syncType)}`);
@@ -591,4 +699,4 @@ export function syncClient(configuration = Configuration.current()) {
591
699
  export async function sync(query) {
592
700
  return await SyncClient.current().sync(query);
593
701
  }
594
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLWNsaWVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDL0QsT0FBTyxhQUFhLE1BQU0sNkJBQTZCLENBQUE7QUFFdkQsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDekQsT0FBTyxhQUFhLE1BQU0sc0JBQXNCLENBQUE7QUFDaEQsT0FBTyxrQkFBa0IsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRCxPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQTtBQUVqRixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUE7QUFFckIsc0ZBQXNGO0FBQ3RGLE1BQU0sc0JBQXNCLEdBQUcsRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBQyxDQUFBO0FBRXRHLGtHQUFrRztBQUNsRyxNQUFNLGlDQUFpQyxHQUFHLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0FBRXhGLGlEQUFpRDtBQUNqRCxNQUFNLDBCQUEwQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFaEQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLFVBQVU7SUFDN0I7Ozs7Ozs7Ozs7T0FVRztJQUNILFlBQVksT0FBTyxHQUFHLEVBQUU7UUFDdEIsTUFBTSxFQUFDLGFBQWEsR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxX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QU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUNyQixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLEtBQUs7SUFDOUIsT0FBTyxNQUFNLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tIFwiLi4vY29uZmlndXJhdGlvbi5qc1wiXG5pbXBvcnQge2lzQm9vbGVhbkNvbHVtblR5cGV9IGZyb20gXCIuLi9kYXRhYmFzZS9jb2x1bW4tdHlwZXMuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbmltcG9ydCB7c2VyaWFsaXplZFNjb3BlRnJvbVF1ZXJ5fSBmcm9tIFwiLi9xdWVyeS1zY29wZS5qc1wiXG5pbXBvcnQgU3luY0FwaUNsaWVudCBmcm9tIFwiLi9zeW5jLWFwaS1jbGllbnQuanNcIlxuaW1wb3J0IFN5bmNSZWFsdGltZUJyaWRnZSBmcm9tIFwiLi9zeW5jLXJlYWx0aW1lLWJyaWRnZS5qc1wiXG5pbXBvcnQgU3luY1Njb3BlU3RvcmUgZnJvbSBcIi4vc3luYy1zY29wZS1zdG9yZS5qc1wiXG5pbXBvcnQge2N1cnJlbnRTeW5jQ2xpZW50LCBzZXRDdXJyZW50U3luY0NsaWVudH0gZnJvbSBcIi4vc3luYy1jbGllbnQtcmVnaXN0cnkuanNcIlxuXG5sZXQgY2xpZW50Q291bnRlciA9IDBcblxuLyoqIEB0eXBlIHt7Y3JlYXRlOiBcImFmdGVyQ3JlYXRlXCIsIHVwZGF0ZTogXCJhZnRlclVwZGF0ZVwiLCBkZXN0cm95OiBcImFmdGVyRGVzdHJveVwifX0gKi9cbmNvbnN0IFRSQUNLRURfQ0FMTEJBQ0tfTkFNRVMgPSB7Y3JlYXRlOiBcImFmdGVyQ3JlYXRlXCIsIGRlc3Ryb3k6IFwiYWZ0ZXJEZXN0cm95XCIsIHVwZGF0ZTogXCJhZnRlclVwZGF0ZVwifVxuXG4vKiogQXR0cmlidXRlIG5hbWVzIHRyZWF0ZWQgYXMgY2xpZW50LWxvY2FsIHN5bmMgYm9va2tlZXBpbmcgd2hlbiBkZXJpdmluZyBsb2NhbE9ubHlBdHRyaWJ1dGVzLiAqL1xuY29uc3QgTE9DQUxfQk9PS0tFRVBJTkdfQVRUUklCVVRFX05BTUVTID0gW1wiY3JlYXRlZEF0XCIsIFwidXBkYXRlZEF0XCIsIFwibGFzdFN5bmNDaGFuZ2VBdFwiXVxuXG4vKiogQHR5cGUge1dlYWtNYXA8Q29uZmlndXJhdGlvbiwgU3luY0NsaWVudD59ICovXG5jb25zdCBzeW5jQ2xpZW50c0J5Q29uZmlndXJhdGlvbiA9IG5ldyBXZWFrTWFwKClcblxuLyoqXG4gKiBEZWNsYXJhdGl2ZSBjbGllbnQtc2lkZSBzeW5jIGRyaXZlci5cbiAqXG4gKiBFdmVyeXRoaW5nIGlzIGRlcml2ZWQgZnJvbSB0aGUgYXBwJ3MgVmVsb2Npb3VzIGNvbmZpZ3VyYXRpb246IG1vZGVscyBkZWNsYXJlXG4gKiBgc3RhdGljIHN5bmNgLCB0cmFuc3BvcnQvYXV0aC9jb25uZWN0aXZpdHkgY29tZSBmcm9tIHRoZSBgc3luYy5jbGllbnRgXG4gKiBjb25maWd1cmF0aW9uIGJsb2NrLCBhbmQgVmVsb2Npb3VzIG93bnMgc2NvcGUgcGVyc2lzdGVuY2UsIHBlci1zY29wZSBjdXJzb3JzLFxuICogcHVsbCBwYWdpbmcvYXBwbHksIGxvY2FsIHF1ZXVlaW5nLCBhbmQgb25saW5lLWdhdGVkIHJlcGxheS4gRGVjbGFyZSBzeW5jXG4gKiBpbnRlcmVzdCBmcm9tIHF1ZXJpZXM6XG4gKlxuICogICAgIGF3YWl0IHN5bmNDbGllbnQoKS5zdGFydCgpXG4gKiAgICAgYXdhaXQgc3luY0NsaWVudCgpLnN5bmMoRXZlbnQud2hlcmUoe3BhcnRuZXJJZH0pKVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeW5jQ2xpZW50IHtcbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgc3luYyBjbGllbnQgYnkgZGVyaXZpbmcgZXZlcnl0aGluZyBmcm9tIHRoZSBhcHAncyBWZWxvY2lvdXNcbiAgICogY29uZmlndXJhdGlvbjogZXZlcnkgcmVnaXN0ZXJlZCBtb2RlbCBkZWNsYXJpbmcgYHN0YXRpYyBzeW5jYCBiZWNvbWVzIGFcbiAgICogcmVzb3VyY2Ugd2l0aCBib29sZWFuQXR0cmlidXRlcyBkZXJpdmVkIGZyb20gY29sdW1uIHR5cGVzIGFuZFxuICAgKiBsb2NhbE9ubHlBdHRyaWJ1dGVzIGRlcml2ZWQgZnJvbSB0aGUgcHJpbWFyeSBrZXksIGNyZWF0ZWRBdC91cGRhdGVkQXQsIGFuZFxuICAgKiBzeW5jIGJvb2trZWVwaW5nIGNvbHVtbnM7IHRoZSBwZW5kaW5nLXN5bmMgbW9kZWwgaXMgdGhlIHJlZ2lzdGVyZWQgXCJTeW5jXCJcbiAgICogbW9kZWw7IHRyYW5zcG9ydCwgYXV0aCwgY29ubmVjdGl2aXR5LCBhbmQgZXJyb3IgcmVwb3J0aW5nIGNvbWUgZnJvbSB0aGVcbiAgICogYHN5bmMuY2xpZW50YCBjb25maWd1cmF0aW9uIGJsb2NrLCB3aXRoIHRoZSBmcmFtZXdvcmsgb3duaW5nIHRoZVxuICAgKiBgJHttb3VudFBhdGh9L2NoYW5nZXNgIGFuZCBgJHttb3VudFBhdGh9L3JlcGxheWAgUE9TVGVycy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRPcHRpb25zfSBbb3B0aW9uc10gLSBPcHRpb25hbCBvdmVycmlkZXMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7Y29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24uY3VycmVudCgpLCBsZWdhY3lDdXJzb3IsIHNjb3BlU3RvcmUsIHN5bmNNb2RlbCwgLi4ucmVzdE9wdGlvbnN9ID0gb3B0aW9uc1xuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0T3B0aW9ucylcblxuICAgIGNvbnN0IGNsaWVudENvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uLmdldFN5bmNDb25maWd1cmF0aW9uKCkuY2xpZW50XG5cbiAgICBpZiAoIWNsaWVudENvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNDbGllbnQgcmVxdWlyZXMgYSBzeW5jLmNsaWVudCBjb25maWd1cmF0aW9uIGJsb2NrOiBuZXcgQ29uZmlndXJhdGlvbih7c3luYzoge2NsaWVudDoge2F1dGhlbnRpY2F0aW9uVG9rZW4sIHRyYW5zcG9ydH19fSlcIilcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbENsYXNzZXMgPSBjb25maWd1cmF0aW9uLmdldE1vZGVsQ2xhc3NlcygpXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZz59ICovXG4gICAgY29uc3QgcmVzb3VyY2VzID0ge31cblxuICAgIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiBPYmplY3QudmFsdWVzKG1vZGVsQ2xhc3NlcykpIHtcbiAgICAgIGlmICghbW9kZWxDbGFzcy5zeW5jKSBjb250aW51ZVxuXG4gICAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXG5cbiAgICAgIHJlc291cmNlc1tyZXNvdXJjZVR5cGVdID0gcmVzb3VyY2VDb25maWdGcm9tU3luY0RlY2xhcmF0aW9uKHtkZWNsYXJhdGlvbjogbW9kZWxDbGFzcy5zeW5jLCBtb2RlbENsYXNzLCByZXNvdXJjZVR5cGV9KVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhyZXNvdXJjZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0NsaWVudCBmb3VuZCBubyByZWdpc3RlcmVkIG1vZGVscyBkZWNsYXJpbmcgc3RhdGljIHN5bmMgLSBkZWNsYXJlIGBzdGF0aWMgc3luYyA9IHRydWVgIChvciBhIHN5bmMgZGVjbGFyYXRpb24gb2JqZWN0KSBvbiB0aGUgbW9kZWxzIHRoYXQgc2hvdWxkIHN5bmNcIilcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZFN5bmNNb2RlbCA9IHN5bmNNb2RlbCB8fCBtb2RlbENsYXNzZXMuU3luY1xuXG4gICAgaWYgKCFyZXNvbHZlZFN5bmNNb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0NsaWVudCByZXF1aXJlcyBhIHJlZ2lzdGVyZWQgXFxcIlN5bmNcXFwiIG1vZGVsIGZvciBwZW5kaW5nIGxvY2FsIHN5bmMgcm93cyAob3IgcGFzcyBvcHRpb25zLnN5bmNNb2RlbClcIilcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudENvbmZpZ30gKi9cbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW46IGNsaWVudENvbmZpZ3VyYXRpb24uYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICAgIGJhdGNoU2l6ZTogY2xpZW50Q29uZmlndXJhdGlvbi5iYXRjaFNpemUsXG4gICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgaXNPbmxpbmU6IGNsaWVudENvbmZpZ3VyYXRpb24uaXNPbmxpbmUsXG4gICAgICBsZWdhY3lDdXJzb3IsXG4gICAgICBvbkVycm9yOiBjbGllbnRDb25maWd1cmF0aW9uLm9uRXJyb3IsXG4gICAgICBwb3N0Q2hhbmdlczogdHJhbnNwb3J0UG9zdGVyKHtwYXRoOiBgJHtjbGllbnRDb25maWd1cmF0aW9uLm1vdW50UGF0aH0vY2hhbmdlc2AsIHRyYW5zcG9ydDogY2xpZW50Q29uZmlndXJhdGlvbi50cmFuc3BvcnR9KSxcbiAgICAgIHBvc3RSZXBsYXk6IHRyYW5zcG9ydFBvc3Rlcih7cGF0aDogYCR7Y2xpZW50Q29uZmlndXJhdGlvbi5tb3VudFBhdGh9L3JlcGxheWAsIHRyYW5zcG9ydDogY2xpZW50Q29uZmlndXJhdGlvbi50cmFuc3BvcnR9KSxcbiAgICAgIHJlYWx0aW1lOiBjbGllbnRDb25maWd1cmF0aW9uLnJlYWx0aW1lLFxuICAgICAgcmVzb3VyY2VzLFxuICAgICAgc3luY01vZGVsOiByZXNvbHZlZFN5bmNNb2RlbFxuICAgIH1cbiAgICB0aGlzLl9jbGllbnROdW1iZXIgPSArK2NsaWVudENvdW50ZXJcbiAgICAvKiogQHR5cGUge1N5bmNSZWFsdGltZUJyaWRnZSB8IG51bGx9ICovXG4gICAgdGhpcy5fcmVhbHRpbWVCcmlkZ2UgPSBudWxsXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtc2NvcGUtc3RvcmUuanNcIikuZGVmYXVsdCB8IG51bGx9ICovXG4gICAgdGhpcy5fc2NvcGVTdG9yZSA9IHNjb3BlU3RvcmUgfHwgbnVsbFxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5fc2NoZWR1bGVkUmVwbGF5ID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnPiB8IG51bGx9ICovXG4gICAgdGhpcy5fcHVsbFJlc291cmNlQ29uZmlncyA9IG51bGxcbiAgICAvKiogQHR5cGUge0FycmF5PHtjYWxsYmFjazogKHJlY29yZDogPykgPT4gUHJvbWlzZTx2b2lkPiwgY2FsbGJhY2tOYW1lOiBcImFmdGVyQ3JlYXRlXCIgfCBcImFmdGVyVXBkYXRlXCIgfCBcImFmdGVyRGVzdHJveVwiLCBtb2RlbENsYXNzOiA/fT59ICovXG4gICAgdGhpcy5fdHJhY2tlZENhbGxiYWNrcyA9IFtdXG4gICAgLyoqIEB0eXBlIHtXZWFrU2V0PG9iamVjdD59ICovXG4gICAgdGhpcy5fcmVtb3RlQXBwbHlSZWNvcmRzID0gbmV3IFdlYWtTZXQoKVxuICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhdXRvbWF0aWMgbXV0YXRpb24gdHJhY2tpbmcgZm9yIGV2ZXJ5IHJlc291cmNlIHdpdGggYHRyYWNrYCBlbmFibGVkOlxuICAgKiBsb2NhbCBtb2RlbCBjcmVhdGVzL3VwZGF0ZXMvZGVzdHJveXMgcXVldWUgcGVuZGluZyBzeW5jIHJvd3MgYW5kIHNjaGVkdWxlIGFuXG4gICAqIGltbWVkaWF0ZSByZXBsYXkgYXR0ZW1wdCwgd2l0aG91dCBhcHAtc2lkZSBxdWV1ZSBjYWxscy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5fc3RhcnRlZCkgcmV0dXJuXG5cbiAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZVxuXG4gICAgZm9yIChjb25zdCBbcmVzb3VyY2VUeXBlLCByZXNvdXJjZUNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb25maWcucmVzb3VyY2VzKSkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IHRoaXMudHJhY2tlZE9wZXJhdGlvbnMoe3Jlc291cmNlQ29uZmlnLCByZXNvdXJjZVR5cGV9KVxuXG4gICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrTmFtZSA9IFRSQUNLRURfQ0FMTEJBQ0tfTkFNRVNbb3BlcmF0aW9uXVxuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMudHJhY2tlZE11dGF0aW9uQ2FsbGJhY2soe29wZXJhdGlvbiwgcmVzb3VyY2VDb25maWd9KVxuXG4gICAgICAgIHJlc291cmNlQ29uZmlnLm1vZGVsQ2xhc3NbY2FsbGJhY2tOYW1lXShjYWxsYmFjaylcbiAgICAgICAgdGhpcy5fdHJhY2tlZENhbGxiYWNrcy5wdXNoKHtjYWxsYmFjaywgY2FsbGJhY2tOYW1lLCBtb2RlbENsYXNzOiByZXNvdXJjZUNvbmZpZy5tb2RlbENsYXNzfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYWxsIHRyYWNraW5nIGNhbGxiYWNrcyAodGVzdHMsIHNpZ24tb3V0LCBob3QgcmVsb2FkKS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdG9wKCkge1xuICAgIGZvciAoY29uc3Qge2NhbGxiYWNrLCBjYWxsYmFja05hbWUsIG1vZGVsQ2xhc3N9IG9mIHRoaXMuX3RyYWNrZWRDYWxsYmFja3MpIHtcbiAgICAgIG1vZGVsQ2xhc3MudW5yZWdpc3RlckxpZmVjeWNsZUNhbGxiYWNrKGNhbGxiYWNrTmFtZSwgY2FsbGJhY2spXG4gICAgfVxuXG4gICAgdGhpcy5fdHJhY2tlZENhbGxiYWNrcyA9IFtdXG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW5kIHZhbGlkYXRlcyB0aGUgdHJhY2tlZCBvcGVyYXRpb25zIGZvciBhIHJlc291cmNlIGNvbmZpZy5cbiAgICogQHBhcmFtIHt7cmVzb3VyY2VDb25maWc6IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnLCByZXNvdXJjZVR5cGU6IHN0cmluZ319IGFyZ3MgLSBSZXNvdXJjZSBjb25maWcgYW5kIG5hbWUuXG4gICAqIEByZXR1cm5zIHtBcnJheTxcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiPn0gVHJhY2tlZCBvcGVyYXRpb25zLlxuICAgKi9cbiAgdHJhY2tlZE9wZXJhdGlvbnMoe3Jlc291cmNlQ29uZmlnLCByZXNvdXJjZVR5cGV9KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZUNvbmZpZy50cmFja1xuXG4gICAgaWYgKHRyYWNrID09PSB1bmRlZmluZWQgfHwgdHJhY2sgPT09IGZhbHNlKSByZXR1cm4gW11cbiAgICBpZiAodHJhY2sgPT09IHRydWUpIHJldHVybiBbXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIiwgXCJkZXN0cm95XCJdXG5cbiAgICBpZiAoIXRyYWNrIHx8IHR5cGVvZiB0cmFjayAhPT0gXCJvYmplY3RcIiB8fCAhQXJyYXkuaXNBcnJheSh0cmFjay5vcGVyYXRpb25zKSB8fCB0cmFjay5vcGVyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jQ2xpZW50IHJlc291cmNlICR7cmVzb3VyY2VUeXBlfSB0cmFjayBtdXN0IGJlIHRydWUgb3Ige29wZXJhdGlvbnM6IFsuLi5dfWApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgdHJhY2sub3BlcmF0aW9ucykge1xuICAgICAgaWYgKCEob3BlcmF0aW9uIGluIFRSQUNLRURfQ0FMTEJBQ0tfTkFNRVMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3luY0NsaWVudCByZXNvdXJjZSAke3Jlc291cmNlVHlwZX0gdHJhY2sub3BlcmF0aW9ucyBtdXN0IGJlIGNyZWF0ZS91cGRhdGUvZGVzdHJveSwgZ290OiAke1N0cmluZyhvcGVyYXRpb24pfWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYWNrLm9wZXJhdGlvbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGxpZmVjeWNsZSBjYWxsYmFjayBxdWV1ZWluZyBvbmUgdHJhY2tlZCBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHt7b3BlcmF0aW9uOiBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiLCByZXNvdXJjZUNvbmZpZzogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWd9fSBhcmdzIC0gT3BlcmF0aW9uIGFuZCByZXNvdXJjZSBjb25maWcuXG4gICAqIEByZXR1cm5zIHsocmVjb3JkOiA/KSA9PiBQcm9taXNlPHZvaWQ+fSBMaWZlY3ljbGUgY2FsbGJhY2suXG4gICAqL1xuICB0cmFja2VkTXV0YXRpb25DYWxsYmFjayh7b3BlcmF0aW9uLCByZXNvdXJjZUNvbmZpZ30pIHtcbiAgICByZXR1cm4gYXN5bmMgKHJlY29yZCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNSZW1vdGVBcHBseShyZWNvcmQpKSByZXR1cm5cblxuICAgICAgYXdhaXQgU3luY0FwaUNsaWVudC5xdWV1ZUxvY2FsU3luYyh7XG4gICAgICAgIGJvb2xlYW5BdHRyaWJ1dGVzOiByZXNvdXJjZUNvbmZpZy5ib29sZWFuQXR0cmlidXRlcyB8fCBbXSxcbiAgICAgICAgZGF0YTogcmVzb3VyY2VDb25maWcudHJhY2tlZERhdGEgPyByZXNvdXJjZUNvbmZpZy50cmFja2VkRGF0YSh7b3BlcmF0aW9uLCByZWNvcmR9KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgbG9jYWxPbmx5QXR0cmlidXRlczogcmVzb3VyY2VDb25maWcubG9jYWxPbmx5QXR0cmlidXRlcyB8fCBbXSxcbiAgICAgICAgcmVzb3VyY2U6IHJlY29yZCxcbiAgICAgICAgc3luY01vZGVsOiB0aGlzLmNvbmZpZy5zeW5jTW9kZWwsXG4gICAgICAgIHN5bmNUeXBlOiB0aGlzLmRlZmF1bHRTeW5jVHlwZSh7b3BlcmF0aW9uLCByZWNvcmQsIHJlc291cmNlQ29uZmlnfSlcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMuc2NoZWR1bGVSZXBsYXkoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgcmVjb3JkIGlzIGN1cnJlbnRseSBiZWluZyB3cml0dGVuIGJ5IHB1bGwtYXBwbHkgKGVjaG8gc3VwcHJlc3Npb24pLlxuICAgKiBAcGFyYW0gez99IHJlY29yZCAtIExvY2FsIG1vZGVsIHJlY29yZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlY29yZCB3cml0ZSBvcmlnaW5hdGVzIGZyb20gYSByZW1vdGUgY2hhbmdlLlxuICAgKi9cbiAgaXNSZW1vdGVBcHBseShyZWNvcmQpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVtb3RlQXBwbHlSZWNvcmRzLmhhcyhyZWNvcmQpXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoaXMgY2xpZW50IGFzIHRoZSBhcHAncyBjdXJyZW50IHN5bmMgY2xpZW50LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldEN1cnJlbnQoKSB7XG4gICAgc2V0Q3VycmVudFN5bmNDbGllbnQodGhpcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcHAncyBjdXJyZW50IHN5bmMgY2xpZW50LlxuICAgKiBAcmV0dXJucyB7U3luY0NsaWVudH0gQ3VycmVudCBzeW5jIGNsaWVudC5cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1N5bmNDbGllbnR9ICovIChjdXJyZW50U3luY0NsaWVudCgpKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHN5bmMgY2xpZW50IGRlcml2ZWQgZnJvbSB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi4gQWxpYXMgZm9yXG4gICAqIGBuZXcgU3luY0NsaWVudCh7Y29uZmlndXJhdGlvbiwgLi4ub3B0aW9uc30pYC5cbiAgICogQHBhcmFtIHtDb25maWd1cmF0aW9ufSBbY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uIG93bmluZyB0aGUgcmVnaXN0ZXJlZCBtb2RlbHMgYW5kIHRoZSBzeW5jLmNsaWVudCBibG9jay4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtPbWl0PGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudE9wdGlvbnMsIFwiY29uZmlndXJhdGlvblwiPn0gW29wdGlvbnNdIC0gT3B0aW9uYWwgb3ZlcnJpZGVzLlxuICAgKiBAcmV0dXJucyB7U3luY0NsaWVudH0gU3luYyBjbGllbnQgZGVyaXZlZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIGZyb21Db25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uLmN1cnJlbnQoKSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBTeW5jQ2xpZW50KHsuLi5vcHRpb25zLCBjb25maWd1cmF0aW9ufSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNsYXJlcyAob3IgcmUtYWN0aXZhdGVzKSBhIHN5bmMgc2NvcGUgZnJvbSBhIG1vZGVsIHF1ZXJ5IGFuZCBwdWxscyBpdCB3aGVuIG9ubGluZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PD8+fSBxdWVyeSAtIFF1ZXJ5IGRlY2xhcmluZyB0aGUgc3luYyBzY29wZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8e3Njb3BlOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlNlcmlhbGl6ZWRTeW5jU2NvcGUsIHB1bGxlZDogaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZXNSZXN1bHQgfCBudWxsfT59IERlY2xhcmVkIHNjb3BlIGFuZCBwdWxsIHJlc3VsdCAobnVsbCB3aGlsZSBvZmZsaW5lKS5cbiAgICovXG4gIGFzeW5jIHN5bmMocXVlcnkpIHtcbiAgICBjb25zdCBzY29wZSA9IHNlcmlhbGl6ZWRTY29wZUZyb21RdWVyeShxdWVyeSlcbiAgICBjb25zdCBzY29wZVN0b3JlID0gdGhpcy5zY29wZVN0b3JlKClcbiAgICBjb25zdCBzY29wZVJvdyA9IGF3YWl0IHNjb3BlU3RvcmUuZmluZE9yQ3JlYXRlU2NvcGUoc2NvcGUpXG5cbiAgICBpZiAoIXNjb3BlUm93LmN1cnNvclBheWxvYWQgJiYgdGhpcy5jb25maWcubGVnYWN5Q3Vyc29yKSB7XG4gICAgICBjb25zdCBsZWdhY3lDdXJzb3JQYXlsb2FkID0gYXdhaXQgdGhpcy5jb25maWcubGVnYWN5Q3Vyc29yKHtzY29wZX0pXG4gICAgICBjb25zdCBsZWdhY3lDdXJzb3IgPSBTeW5jQXBpQ2xpZW50LnN5bmNDdXJzb3JGcm9tUGF5bG9hZChsZWdhY3lDdXJzb3JQYXlsb2FkKVxuXG4gICAgICBpZiAobGVnYWN5Q3Vyc29yKSBhd2FpdCBzY29wZVN0b3JlLnNhdmVDdXJzb3Ioc2NvcGVSb3csIGxlZ2FjeUN1cnNvcilcbiAgICB9XG5cbiAgICByZXR1cm4ge3B1bGxlZDogYXdhaXQgdGhpcy5wdWxsKCksIHNjb3BlfVxuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGVzIHRoZSBzeW5jIHNjb3BlIGRlY2xhcmVkIGJ5IGEgbW9kZWwgcXVlcnkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDw/Pn0gcXVlcnkgLSBRdWVyeSB3aG9zZSBzY29wZSBzaG91bGQgc3RvcCBzeW5jaW5nLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHVuc3luYyhxdWVyeSkge1xuICAgIGF3YWl0IHRoaXMuc2NvcGVTdG9yZSgpLmRlYWN0aXZhdGUoc2VyaWFsaXplZFNjb3BlRnJvbVF1ZXJ5KHF1ZXJ5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWxscyBjaGFuZ2VzIGZvciBldmVyeSBhY3RpdmUgc2NvcGUgd2l0aCBwZXItc2NvcGUgY3Vyc29ycyAoc2luZ2xlLWZsaWdodGVkLCBvbmxpbmUtZ2F0ZWQpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3VsdCB8IG51bGw+fSBDb21iaW5lZCBwdWxsIHJlc3VsdCwgb3IgbnVsbCB3aGlsZSBvZmZsaW5lLlxuICAgKi9cbiAgYXN5bmMgcHVsbCgpIHtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmlzT25saW5lKCkpKSByZXR1cm4gbnVsbFxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3VsdCB8IG51bGx9ICovXG4gICAgbGV0IGNvbWJpbmVkUmVzdWx0ID0gbnVsbFxuXG4gICAgYXdhaXQgU3luY0FwaUNsaWVudC5zaW5nbGVGbGlnaHQoYHZlbG9jaW91cy1zeW5jLWNsaWVudC1wdWxsLSR7dGhpcy5fY2xpZW50TnVtYmVyfWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uVG9rZW4gPSBhd2FpdCB0aGlzLmNvbmZpZy5hdXRoZW50aWNhdGlvblRva2VuKClcbiAgICAgIGNvbnN0IHNjb3BlU3RvcmUgPSB0aGlzLnNjb3BlU3RvcmUoKVxuICAgICAgY29uc3QgYXBwbHlTeW5jID0gdGhpcy5yZW1vdGVBcHBseVN5bmMoKVxuICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBjaGFuZ2VkOiBmYWxzZSxcbiAgICAgICAgcGFnZXM6IDAsXG4gICAgICAgIHJlc291cmNlQ2hhbmdlZDogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBib29sZWFuPn0gKi8gKHt9KSxcbiAgICAgICAgcmVzb3VyY2VDb3VudHM6IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gKi8gKHt9KSxcbiAgICAgICAgc3luY2VkQ291bnQ6IDBcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBzY29wZVJvdyBvZiBhd2FpdCBzY29wZVN0b3JlLmFjdGl2ZVNjb3BlcygpKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlUmVzdWx0ID0gYXdhaXQgU3luY0FwaUNsaWVudC5wdWxsQ2hhbmdlcyh7XG4gICAgICAgICAgYXBwbHlTeW5jLFxuICAgICAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICAgICAgYmF0Y2hTaXplOiB0aGlzLmNvbmZpZy5iYXRjaFNpemUsXG4gICAgICAgICAgbG9hZEN1cnNvcjogYXN5bmMgKCkgPT4gYXdhaXQgc2NvcGVTdG9yZS5sb2FkQ3Vyc29yKHNjb3BlUm93KSxcbiAgICAgICAgICBwb3N0Q2hhbmdlczogYXN5bmMgKHBheWxvYWQpID0+IGF3YWl0IHRoaXMuY29uZmlnLnBvc3RDaGFuZ2VzKHtcbiAgICAgICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgICAgICBzY29wZToge2NvbmRpdGlvbnM6IHNjb3BlUm93LmNvbmRpdGlvbnMsIHJlc291cmNlVHlwZTogc2NvcGVSb3cucmVzb3VyY2VUeXBlfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHNhdmVDdXJzb3I6IGFzeW5jIChjdXJzb3IpID0+IGF3YWl0IHNjb3BlU3RvcmUuc2F2ZUN1cnNvcihzY29wZVJvdywgY3Vyc29yKVxuICAgICAgICB9KVxuXG4gICAgICAgIHJlc3VsdC5jaGFuZ2VkIHx8PSBzY29wZVJlc3VsdC5jaGFuZ2VkXG4gICAgICAgIHJlc3VsdC5wYWdlcyArPSBzY29wZVJlc3VsdC5wYWdlc1xuICAgICAgICByZXN1bHQuc3luY2VkQ291bnQgKz0gc2NvcGVSZXN1bHQuc3luY2VkQ291bnRcblxuICAgICAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZVR5cGUsIGNvdW50XSBvZiBPYmplY3QuZW50cmllcyhzY29wZVJlc3VsdC5yZXNvdXJjZUNvdW50cykpIHtcbiAgICAgICAgICByZXN1bHQucmVzb3VyY2VDb3VudHNbcmVzb3VyY2VUeXBlXSA9IChyZXN1bHQucmVzb3VyY2VDb3VudHNbcmVzb3VyY2VUeXBlXSB8fCAwKSArIGNvdW50XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBbcmVzb3VyY2VUeXBlLCBjaGFuZ2VkXSBvZiBPYmplY3QuZW50cmllcyhzY29wZVJlc3VsdC5yZXNvdXJjZUNoYW5nZWQpKSB7XG4gICAgICAgICAgcmVzdWx0LnJlc291cmNlQ2hhbmdlZFtyZXNvdXJjZVR5cGVdIHx8PSBjaGFuZ2VkXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29tYmluZWRSZXN1bHQgPSByZXN1bHRcbiAgICB9KVxuXG4gICAgcmV0dXJuIGNvbWJpbmVkUmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZXJpdmVkIHJlbW90ZS1jaGFuZ2UgYXBwbGllciBzaGFyZWQgYnkgcHVsbHMgYW5kIHJlYWx0aW1lIHB1c2hlczpcbiAgICogYXBwbGllcyB0aHJvdWdoIHRoZSBkZWNsYXJlZCByZXNvdXJjZSBjb25maWdzLCByZWdpc3RlcnMgZWFjaCB3cml0dGVuIHJlY29yZFxuICAgKiBmb3IgZWNobyBzdXBwcmVzc2lvbiAodHJhY2tlZCByZXNvdXJjZXMgZG8gbm90IHJlLXF1ZXVlIGFwcGxpZWQgY2hhbmdlcyksIGFuZFxuICAgKiBmYWlscyBsb3VkbHkgaW5zdGVhZCBvZiBzaWxlbnRseSBza2lwcGluZyB1bmNvbmZpZ3VyZWQgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0ge3tzb3VyY2U/OiBzdHJpbmd9fSBbYXJnc10gLSBFcnJvciBjb250ZXh0IGRlc2NyaWJpbmcgd2hlcmUgdGhlIGNoYW5nZSBjYW1lIGZyb20uXG4gICAqIEByZXR1cm5zIHsoc3luYzogaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZUVudmVsb3BlKSA9PiBQcm9taXNlPGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VBcHBseVJlc3VsdD59IExvdWQgcmVtb3RlLWNoYW5nZSBhcHBsaWVyLlxuICAgKi9cbiAgcmVtb3RlQXBwbHlTeW5jKHtzb3VyY2UgPSBcInB1bGxlZCBjaGFuZ2VcIn0gPSB7fSkge1xuICAgIGNvbnN0IHB1bGxSZXNvdXJjZUNvbmZpZ3MgPSB0aGlzLnB1bGxSZXNvdXJjZUNvbmZpZ3MoKVxuICAgIGNvbnN0IGFwcGxpZXIgPSBTeW5jQXBpQ2xpZW50LnJlc291cmNlQXBwbGllcihwdWxsUmVzb3VyY2VDb25maWdzLCAocmVjb3JkKSA9PiB7XG4gICAgICB0aGlzLl9yZW1vdGVBcHBseVJlY29yZHMuYWRkKHJlY29yZClcblxuICAgICAgcmV0dXJuICgpID0+IHRoaXMuX3JlbW90ZUFwcGx5UmVjb3Jkcy5kZWxldGUocmVjb3JkKVxuICAgIH0pXG5cbiAgICByZXR1cm4gYXN5bmMgKHN5bmMpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHN5bmMucmVzb3VyY2VUeXBlKClcblxuICAgICAgaWYgKCFyZXNvdXJjZVR5cGUgfHwgIXB1bGxSZXNvdXJjZUNvbmZpZ3NbcmVzb3VyY2VUeXBlXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN5bmMgcmVzb3VyY2Ugd2l0aCBwdWxsIGF0dHJpYnV0ZXMgY29uZmlndXJlZCBmb3IgJHtzb3VyY2V9OiAke1N0cmluZyhyZXNvdXJjZVR5cGUpfWApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBsaWVyKHN5bmMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdGhlIGRlcml2ZWQgcmVhbHRpbWUgY2hhbm5lbHMgc28gcHVzaGVkIHdlYnNvY2tldCBjaGFuZ2VzIGFwcGx5XG4gICAqIHRocm91Z2ggdGhlIHNhbWUgZGVyaXZlZCBhcHBsaWVyIGFzIHB1bGxzIChpZGVtcG90ZW50LCBzaW5nbGUtZmxpZ2h0ZWQpLlxuICAgKiBAcGFyYW0gez99IFtjb250ZXh0XSAtIEFwcCBjb250ZXh0IHBhc3NlZCB0byB0aGUgYHN5bmMuY2xpZW50LnJlYWx0aW1lLmNoYW5uZWxzYCBjYWxsYmFjayAocnVudGltZSB2YWx1ZXMgbGlrZSBldmVudElkKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdWJzY3JpYmVSZWFsdGltZShjb250ZXh0KSB7XG4gICAgYXdhaXQgdGhpcy5yZWFsdGltZUJyaWRnZSgpLnN1YnNjcmliZShjb250ZXh0KVxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlcyB0aGUgcmVhbHRpbWUgY2hhbm5lbHMgYW5kIGRpc2Nvbm5lY3RzIHRoZSB3ZWJzb2NrZXQgY2xpZW50IChpZGVtcG90ZW50KS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1bnN1YnNjcmliZVJlYWx0aW1lKCkge1xuICAgIGF3YWl0IHRoaXMucmVhbHRpbWVCcmlkZ2UoKS51bnN1YnNjcmliZSgpXG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0cyB0aGUgcmVhbHRpbWUgc3Vic2NyaXB0aW9uIHN0YXRlIGFuZCBwZXItY2hhbm5lbCByZWFkaW5lc3MuXG4gICAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPFN5bmNSZWFsdGltZUJyaWRnZVtcInN0YXR1c1wiXT59IFJlYWx0aW1lIHN0YXR1cy5cbiAgICovXG4gIHJlYWx0aW1lU3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnJlYWx0aW1lQnJpZGdlKCkuc3RhdHVzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBd2FpdHMgYWxsIHBlbmRpbmcgcmVhbHRpbWUgbWVzc2FnZSBhcHBsaWVzIGFuZCBhbnkgc2NoZWR1bGVkXG4gICAqIHB1bGwtb24tcmVjb25uZWN0ICh1c2VmdWwgaW4gdGVzdHMgYW5kIHNodXRkb3duIGZsb3dzKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yUmVhbHRpbWVBcHBsaWVkKCkge1xuICAgIGF3YWl0IHRoaXMucmVhbHRpbWVCcmlkZ2UoKS53YWl0Rm9yQXBwbGllZCgpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGF6aWx5IGJ1aWx0IHJlYWx0aW1lIGJyaWRnZS5cbiAgICogQHJldHVybnMge1N5bmNSZWFsdGltZUJyaWRnZX0gUmVhbHRpbWUgYnJpZGdlLlxuICAgKi9cbiAgcmVhbHRpbWVCcmlkZ2UoKSB7XG4gICAgdGhpcy5fcmVhbHRpbWVCcmlkZ2UgfHw9IG5ldyBTeW5jUmVhbHRpbWVCcmlkZ2Uoe3N5bmNDbGllbnQ6IHRoaXN9KVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlYWx0aW1lQnJpZGdlXG4gIH1cblxuICAvKipcbiAgICogUXVldWVzIGEgbG9jYWwgbW9kZWwgY2hhbmdlIGFzIGEgcGVuZGluZyBzeW5jIHJvdyBhbmQgc2NoZWR1bGVzIGFuIGltbWVkaWF0ZVxuICAgKiByZXBsYXkgYXR0ZW1wdCAoa2VwdCBwZW5kaW5nIHdoaWxlIG9mZmxpbmUgb3Igd2hlbiB0aGUgYmFja2VuZCByZWplY3RzIGl0KS5cbiAgICogQHBhcmFtIHt7cmVzb3VyY2U6ID8sIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCA/Piwgc3luY1R5cGU/OiBzdHJpbmd9fSBhcmdzIC0gUXVldWUgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IFBlbmRpbmcgbG9jYWwgc3luYyByb3cuXG4gICAqL1xuICBhc3luYyBxdWV1ZSh7ZGF0YSwgcmVzb3VyY2UsIHN5bmNUeXBlfSkge1xuICAgIGNvbnN0IHJlc291cmNlQ29uZmlnID0gdGhpcy5yZXNvdXJjZUNvbmZpZ0ZvcihyZXNvdXJjZSlcbiAgICBjb25zdCBzeW5jUm93ID0gYXdhaXQgU3luY0FwaUNsaWVudC5xdWV1ZUxvY2FsU3luYyh7XG4gICAgICBib29sZWFuQXR0cmlidXRlczogcmVzb3VyY2VDb25maWcuYm9vbGVhbkF0dHJpYnV0ZXMgfHwgW10sXG4gICAgICBkYXRhLFxuICAgICAgbG9jYWxPbmx5QXR0cmlidXRlczogcmVzb3VyY2VDb25maWcubG9jYWxPbmx5QXR0cmlidXRlcyB8fCBbXSxcbiAgICAgIHJlc291cmNlLFxuICAgICAgc3luY01vZGVsOiB0aGlzLmNvbmZpZy5zeW5jTW9kZWwsXG4gICAgICBzeW5jVHlwZTogc3luY1R5cGUgPz8gdGhpcy5kZWZhdWx0U3luY1R5cGUoe29wZXJhdGlvbjogXCJ1cGRhdGVcIiwgcmVjb3JkOiByZXNvdXJjZSwgcmVzb3VyY2VDb25maWd9KVxuICAgIH0pXG5cbiAgICB0aGlzLnNjaGVkdWxlUmVwbGF5KClcblxuICAgIHJldHVybiBzeW5jUm93XG4gIH1cblxuICAvKipcbiAgICogRHJhaW5zIHBlbmRpbmcgbG9jYWwgc3luYyByb3dzIHRvIHRoZSBiYWNrZW5kIChzaW5nbGUtZmxpZ2h0ZWQsIG9ubGluZS1nYXRlZCkuXG4gICAqIFJvd3MgYXJlIG9ubHkgbWFya2VkIHN1Y2Nlc3NmdWwgYWZ0ZXIgdGhlIGJhY2tlbmQgYWNrbm93bGVkZ2VzIHRoZW0uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVwbGF5UGVuZGluZygpIHtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmlzT25saW5lKCkpKSByZXR1cm5cblxuICAgIGF3YWl0IFN5bmNBcGlDbGllbnQuc2luZ2xlRmxpZ2h0KGB2ZWxvY2lvdXMtc3luYy1jbGllbnQtcmVwbGF5LSR7dGhpcy5fY2xpZW50TnVtYmVyfWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IFN5bmNBcGlDbGllbnQucmVwbGF5TG9jYWxTeW5jcyh7XG4gICAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW46IGF3YWl0IHRoaXMuY29uZmlnLmF1dGhlbnRpY2F0aW9uVG9rZW4oKSxcbiAgICAgICAgYmF0Y2hTaXplOiB0aGlzLmNvbmZpZy5iYXRjaFNpemUsXG4gICAgICAgIHBvc3RSZXBsYXk6IHRoaXMuY29uZmlnLnBvc3RSZXBsYXksXG4gICAgICAgIHN5bmNNb2RlbDogdGhpcy5jb25maWcuc3luY01vZGVsXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2NoZWR1bGVzIGEgYmFja2dyb3VuZCByZXBsYXkgYXR0ZW1wdCB3aXRob3V0IGJsb2NraW5nIHRoZSBjYWxsZXIuXG4gICAqIEZhaWx1cmVzIGdvIHRvIGNvbmZpZy5vbkVycm9yIChvciByZXRocm93IHdoZW4gbm9uZSBpcyBjb25maWd1cmVkKS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzY2hlZHVsZVJlcGxheSgpIHtcbiAgICB0aGlzLl9zY2hlZHVsZWRSZXBsYXkgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXBsYXlQZW5kaW5nKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMucmVwb3J0RXJyb3IoLyoqIEB0eXBlIHtFcnJvcn0gKi8gKGVycm9yKSlcbiAgICAgIH1cbiAgICB9KSgpXG4gIH1cblxuICAvKipcbiAgICogQXdhaXRzIHRoZSBsYXN0IHNjaGVkdWxlZCBiYWNrZ3JvdW5kIHJlcGxheSAodXNlZnVsIGluIHRlc3RzIGFuZCBzaHV0ZG93biBmbG93cykuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclNjaGVkdWxlZFJlcGxheSgpIHtcbiAgICBpZiAodGhpcy5fc2NoZWR1bGVkUmVwbGF5KSBhd2FpdCB0aGlzLl9zY2hlZHVsZWRSZXBsYXlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIGEgYmFja2dyb3VuZCBzeW5jIGZhaWx1cmUuXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gQmFja2dyb3VuZCBmYWlsdXJlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlcG9ydEVycm9yKGVycm9yKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uRXJyb3IpIHtcbiAgICAgIHRoaXMuY29uZmlnLm9uRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGNvbm5lY3Rpdml0eSB0aHJvdWdoIHRoZSBjb25maWd1cmVkIGdhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRoZSBiYWNrZW5kIGlzIGNvbnNpZGVyZWQgcmVhY2hhYmxlLlxuICAgKi9cbiAgYXN5bmMgaXNPbmxpbmUoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5pc09ubGluZSkgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiAoYXdhaXQgdGhpcy5jb25maWcuaXNPbmxpbmUoKSkgIT09IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2NvcGUgc3RvcmUgYmFja2luZyBkZWNsYXJlZCBzY29wZXMgYW5kIGN1cnNvcnMuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtc2NvcGUtc3RvcmUuanNcIikuZGVmYXVsdH0gU2NvcGUgc3RvcmUuXG4gICAqL1xuICBzY29wZVN0b3JlKCkge1xuICAgIHRoaXMuX3Njb3BlU3RvcmUgfHw9IG5ldyBTeW5jU2NvcGVTdG9yZSh7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWcuY29uZmlndXJhdGlvbn0pXG5cbiAgICByZXR1cm4gdGhpcy5fc2NvcGVTdG9yZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBkZWNsYXJlZCByZXNvdXJjZSBjb25maWcgZm9yIGEgbG9jYWwgcmVjb3JkLlxuICAgKiBAcGFyYW0gez99IHJlc291cmNlIC0gTG9jYWwgbW9kZWwgcmVjb3JkLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWd9IERlY2xhcmVkIHJlc291cmNlIGNvbmZpZy5cbiAgICovXG4gIHJlc291cmNlQ29uZmlnRm9yKHJlc291cmNlKSB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IHJlc291cmNlPy5jb25zdHJ1Y3RvclxuXG4gICAgaWYgKHR5cGVvZiBtb2RlbENsYXNzPy5nZXRNb2RlbE5hbWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIHJlc291cmNlcyBtdXN0IGJlIG1vZGVsIHJlY29yZHMgd2l0aCBhIHN0YXRpYyBnZXRNb2RlbE5hbWUoKSwgZ290OiAke1N0cmluZyhyZXNvdXJjZSl9YClcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXG4gICAgY29uc3QgcmVzb3VyY2VDb25maWcgPSB0aGlzLmNvbmZpZy5yZXNvdXJjZXNbcmVzb3VyY2VUeXBlXVxuXG4gICAgaWYgKCFyZXNvdXJjZUNvbmZpZykgdGhyb3cgbmV3IEVycm9yKGBObyBzeW5jIHJlc291cmNlIGNvbmZpZ3VyZWQgZm9yOiAke3Jlc291cmNlVHlwZX1gKVxuXG4gICAgcmV0dXJuIHJlc291cmNlQ29uZmlnXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHN5bmMgdHlwZSBmb3IgYSBtdXRhdGlvbiB0aHJvdWdoIHRoZSByZXNvdXJjZSBjb25maWcuIFRoZVxuICAgKiBcInVwc2VydFwiIGZsYWcgcXVldWVzIGNyZWF0ZXMgYW5kIHVwZGF0ZXMgYXMgXCJ1cGRhdGVcIiByb3dzICh0aGUgc2VydmVyXG4gICAqIHVwc2VydHMgYnkgcmVzb3VyY2UgaWQpIGFuZCBkZXN0cm95cyBhcyBcImRlbGV0ZVwiIHJvd3MuXG4gICAqIEBwYXJhbSB7e29wZXJhdGlvbjogXCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIiwgcmVjb3JkOiA/LCByZXNvdXJjZUNvbmZpZzogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWd9fSBhcmdzIC0gTXV0YXRpb24gYXJncy5cbiAgICogQHJldHVybnMge3N0cmluZ30gU3luYyB0eXBlLlxuICAgKi9cbiAgZGVmYXVsdFN5bmNUeXBlKHtvcGVyYXRpb24sIHJlY29yZCwgcmVzb3VyY2VDb25maWd9KSB7XG4gICAgaWYgKHR5cGVvZiByZXNvdXJjZUNvbmZpZy5zeW5jVHlwZSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gcmVzb3VyY2VDb25maWcuc3luY1R5cGUoe29wZXJhdGlvbiwgcmVjb3JkfSlcbiAgICBpZiAob3BlcmF0aW9uID09PSBcImRlc3Ryb3lcIikgcmV0dXJuIFwiZGVsZXRlXCJcbiAgICBpZiAocmVzb3VyY2VDb25maWcuc3luY1R5cGUgPT09IFwidXBzZXJ0XCIpIHJldHVybiBcInVwZGF0ZVwiXG5cbiAgICByZXR1cm4gb3BlcmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlcyB0aGUgcHVsbC1hcHBseSByZXNvdXJjZSBjb25maWdzIGZyb20gdGhlIGRlY2xhcmVkIHJlc291cmNlcy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNSZXNvdXJjZUNvbmZpZz59IFB1bGwtYXBwbHkgcmVzb3VyY2UgY29uZmlncy5cbiAgICovXG4gIHB1bGxSZXNvdXJjZUNvbmZpZ3MoKSB7XG4gICAgdGhpcy5fcHVsbFJlc291cmNlQ29uZmlncyB8fD0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWc+fSAqLyAoT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5jb25maWcucmVzb3VyY2VzKVxuICAgICAgICAuZmlsdGVyKChbLCByZXNvdXJjZV0pID0+IEJvb2xlYW4ocmVzb3VyY2UuYXR0cmlidXRlcykpXG4gICAgICAgIC5tYXAoKFtyZXNvdXJjZVR5cGUsIHJlc291cmNlXSkgPT4gW3Jlc291cmNlVHlwZSwge1xuICAgICAgICAgIGFmdGVyQXBwbHk6IHJlc291cmNlLmFmdGVyQXBwbHksXG4gICAgICAgICAgYXR0cmlidXRlczogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWdbXCJhdHRyaWJ1dGVzXCJdfSAqLyAocmVzb3VyY2UuYXR0cmlidXRlcyksXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBmaW5kUmVjb3JkOiByZXNvdXJjZS5maW5kUmVjb3JkLFxuICAgICAgICAgIGZpbmRSZWNvcmRGb3JEZWxldGU6IHJlc291cmNlLmZpbmRSZWNvcmRGb3JEZWxldGUsXG4gICAgICAgICAgbW9kZWxDbGFzczogcmVzb3VyY2UubW9kZWxDbGFzc1xuICAgICAgICB9XSlcbiAgICApKVxuXG4gICAgcmV0dXJuIHRoaXMuX3B1bGxSZXNvdXJjZUNvbmZpZ3NcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBvbmUgcmVzb3VyY2UgY29uZmlnIGZyb20gYSBtb2RlbCdzIGBzdGF0aWMgc3luY2AgZGVjbGFyYXRpb24gcGx1cyBpdHNcbiAqIGRlcml2ZWQgY29sdW1uIG1ldGFkYXRhLlxuICogQHBhcmFtIHt7ZGVjbGFyYXRpb246IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuTW9kZWxTeW5jRGVjbGFyYXRpb24sIG1vZGVsQ2xhc3M6ID8sIHJlc291cmNlVHlwZTogc3RyaW5nfX0gYXJncyAtIERlY2xhcmF0aW9uIGFyZ3MuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWd9IERlcml2ZWQgcmVzb3VyY2UgY29uZmlnLlxuICovXG5mdW5jdGlvbiByZXNvdXJjZUNvbmZpZ0Zyb21TeW5jRGVjbGFyYXRpb24oe2RlY2xhcmF0aW9uLCBtb2RlbENsYXNzLCByZXNvdXJjZVR5cGV9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWREZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uID09PSB0cnVlID8ge30gOiBkZWNsYXJhdGlvblxuXG4gIGlmICghbm9ybWFsaXplZERlY2xhcmF0aW9uIHx8IHR5cGVvZiBub3JtYWxpemVkRGVjbGFyYXRpb24gIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShub3JtYWxpemVkRGVjbGFyYXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlVHlwZX0gc3RhdGljIHN5bmMgbXVzdCBiZSB0cnVlIG9yIGEgc3luYyBkZWNsYXJhdGlvbiBvYmplY3QsIGdvdDogJHtTdHJpbmcoZGVjbGFyYXRpb24pfWApXG4gIH1cblxuICBjb25zdCB7YWZ0ZXJBcHBseSwgYXR0cmlidXRlcywgYm9vbGVhbkF0dHJpYnV0ZXMsIGZpbmRSZWNvcmQsIGZpbmRSZWNvcmRGb3JEZWxldGUsIGxvY2FsT25seUF0dHJpYnV0ZXMsIHJlYWx0aW1lLCBzeW5jVHlwZSwgdHJhY2ssIHRyYWNrZWREYXRhLCAuLi5yZXN0RGVjbGFyYXRpb259ID0gbm9ybWFsaXplZERlY2xhcmF0aW9uXG4gIGNvbnN0IHVua25vd25LZXlzID0gT2JqZWN0LmtleXMocmVzdERlY2xhcmF0aW9uKVxuXG4gIGlmICh1bmtub3duS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlVHlwZX0gc3RhdGljIHN5bmMgcmVjZWl2ZWQgdW5rbm93biBrZXlzOiAke3Vua25vd25LZXlzLmpvaW4oXCIsIFwiKX0gKHN1cHBvcnRlZDogYWZ0ZXJBcHBseSwgYXR0cmlidXRlcywgYm9vbGVhbkF0dHJpYnV0ZXMsIGZpbmRSZWNvcmQsIGZpbmRSZWNvcmRGb3JEZWxldGUsIGxvY2FsT25seUF0dHJpYnV0ZXMsIHJlYWx0aW1lLCBzeW5jVHlwZSwgdHJhY2ssIHRyYWNrZWREYXRhKWApXG4gIH1cbiAgaWYgKHN5bmNUeXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN5bmNUeXBlICE9PSBcImZ1bmN0aW9uXCIgJiYgc3luY1R5cGUgIT09IFwidXBzZXJ0XCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2VUeXBlfSBzdGF0aWMgc3luYyBzeW5jVHlwZSBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgdGhlIHN0cmluZyBcInVwc2VydFwiLCBnb3Q6ICR7U3RyaW5nKHN5bmNUeXBlKX1gKVxuICB9XG5cbiAgY29uc3QgZGVyaXZlZCA9IGRlcml2ZWRTeW5jQXR0cmlidXRlcyh7bW9kZWxDbGFzcywgcmVzb3VyY2VUeXBlfSlcblxuICByZXR1cm4ge1xuICAgIGFmdGVyQXBwbHksXG4gICAgYXR0cmlidXRlcyxcbiAgICBib29sZWFuQXR0cmlidXRlczogbWVyZ2VkQXR0cmlidXRlTmFtZXMoZGVyaXZlZC5ib29sZWFuQXR0cmlidXRlcywgYm9vbGVhbkF0dHJpYnV0ZXMpLFxuICAgIGZpbmRSZWNvcmQsXG4gICAgZmluZFJlY29yZEZvckRlbGV0ZSxcbiAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzOiBtZXJnZWRBdHRyaWJ1dGVOYW1lcyhkZXJpdmVkLmxvY2FsT25seUF0dHJpYnV0ZXMsIGxvY2FsT25seUF0dHJpYnV0ZXMpLFxuICAgIG1vZGVsQ2xhc3MsXG4gICAgcmVhbHRpbWUsXG4gICAgc3luY1R5cGUsXG4gICAgdHJhY2s6IG5vcm1hbGl6ZWRUcmFjayh0cmFjayksXG4gICAgdHJhY2tlZERhdGFcbiAgfVxufVxuXG4vKipcbiAqIERlcml2ZXMgYm9vbGVhbiBhbmQgbG9jYWwtb25seSBhdHRyaWJ1dGUgbmFtZXMgZnJvbSBhIG1vZGVsJ3MgY29sdW1uIG1ldGFkYXRhOlxuICogYm9vbGVhbnMgZnJvbSBib29sZWFuIGNvbHVtbiB0eXBlczsgbG9jYWwtb25seSBmcm9tIHRoZSBwcmltYXJ5IGtleSxcbiAqIGNyZWF0ZWRBdC91cGRhdGVkQXQsIGFuZCBzeW5jIGJvb2trZWVwaW5nIGNvbHVtbnMuXG4gKiBAcGFyYW0ge3ttb2RlbENsYXNzOiA/LCByZXNvdXJjZVR5cGU6IHN0cmluZ319IGFyZ3MgLSBEZXJpdmF0aW9uIGFyZ3MuXG4gKiBAcmV0dXJucyB7e2Jvb2xlYW5BdHRyaWJ1dGVzOiBzdHJpbmdbXSwgbG9jYWxPbmx5QXR0cmlidXRlczogc3RyaW5nW119fSBEZXJpdmVkIGF0dHJpYnV0ZSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gZGVyaXZlZFN5bmNBdHRyaWJ1dGVzKHttb2RlbENsYXNzLCByZXNvdXJjZVR5cGV9KSB7XG4gIGlmIChcbiAgICB0eXBlb2YgbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lcyAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MuZ2V0Q29sdW1uVHlwZUJ5TmFtZSAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MucHJpbWFyeUtleSAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MuaGFzUHJpbWFyeUtleSAhPT0gXCJmdW5jdGlvblwiXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZVR5cGV9IHN0YXRpYyBzeW5jIHJlcXVpcmVzIGEgVmVsb2Npb3VzIG1vZGVsIGNsYXNzIHdpdGggY29sdW1uIG1ldGFkYXRhIChnZXRDb2x1bW5OYW1lcywgZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCwgZ2V0Q29sdW1uVHlwZUJ5TmFtZSwgcHJpbWFyeUtleSwgaGFzUHJpbWFyeUtleSlgKVxuICB9XG5cbiAgY29uc3QgY29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZSA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCgpXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IGJvb2xlYW5BdHRyaWJ1dGVzID0gW11cbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgbG9jYWxPbmx5QXR0cmlidXRlcyA9IFtdXG5cbiAgaWYgKG1vZGVsQ2xhc3MuaGFzUHJpbWFyeUtleSgpKSB7XG4gICAgY29uc3QgcHJpbWFyeUtleUNvbHVtbiA9IG1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG5cbiAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzLnB1c2goY29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZVtwcmltYXJ5S2V5Q29sdW1uXSB8fCBwcmltYXJ5S2V5Q29sdW1uKVxuICB9XG5cbiAgZm9yIChjb25zdCBjb2x1bW5OYW1lIG9mIG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZXMoKSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBjb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lW2NvbHVtbk5hbWVdIHx8IGNvbHVtbk5hbWVcbiAgICBjb25zdCBjb2x1bW5UeXBlID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5UeXBlQnlOYW1lKGNvbHVtbk5hbWUpXG5cbiAgICBpZiAoTE9DQUxfQk9PS0tFRVBJTkdfQVRUUklCVVRFX05BTUVTLmluY2x1ZGVzKGF0dHJpYnV0ZU5hbWUpICYmICFsb2NhbE9ubHlBdHRyaWJ1dGVzLmluY2x1ZGVzKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlTmFtZSlcbiAgICB9XG4gICAgaWYgKGNvbHVtblR5cGUgJiYgaXNCb29sZWFuQ29sdW1uVHlwZShjb2x1bW5UeXBlKSkge1xuICAgICAgYm9vbGVhbkF0dHJpYnV0ZXMucHVzaChhdHRyaWJ1dGVOYW1lKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7Ym9vbGVhbkF0dHJpYnV0ZXMsIGxvY2FsT25seUF0dHJpYnV0ZXN9XG59XG5cbi8qKlxuICogTWVyZ2VzIGRlcml2ZWQgYXR0cmlidXRlIG5hbWVzIHdpdGggZGVjbGFyZWQgZXh0cmFzIGludG8gYSBzb3J0ZWQsIGR1cGxpY2F0ZS1mcmVlIGxpc3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBkZXJpdmVkIC0gRGVyaXZlZCBhdHRyaWJ1dGUgbmFtZXMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSBkZWNsYXJlZCAtIERlY2xhcmVkIGV4dHJhIGF0dHJpYnV0ZSBuYW1lcy5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gTWVyZ2VkIGF0dHJpYnV0ZSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VkQXR0cmlidXRlTmFtZXMoZGVyaXZlZCwgZGVjbGFyZWQpIHtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5kZXJpdmVkLCAuLi4oZGVjbGFyZWQgfHwgW10pXSldLnNvcnQoKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBkZWNsYXJhdGlvbidzIHRyYWNrIHZhbHVlOiBhbiBvcGVyYXRpb25zIGFycmF5IGlzIHNob3J0aGFuZCBmb3JcbiAqIHRoZSB7b3BlcmF0aW9uc30gZm9ybS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5Nb2RlbFN5bmNEZWNsYXJhdGlvbkNvbmZpZ1tcInRyYWNrXCJdfSB0cmFjayAtIERlY2xhcmVkIHRyYWNrIHZhbHVlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnW1widHJhY2tcIl19IE5vcm1hbGl6ZWQgdHJhY2sgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRUcmFjayh0cmFjaykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh0cmFjaykpIHJldHVybiB7b3BlcmF0aW9uczogdHJhY2t9XG5cbiAgcmV0dXJuIHRyYWNrXG59XG5cbi8qKlxuICogQnVpbGRzIGEgZnJhbWV3b3JrLW93bmVkIHN5bmMgZW5kcG9pbnQgUE9TVGVyIG92ZXIgdGhlIGNvbmZpZ3VyZWQgdHJhbnNwb3J0LlxuICogQHBhcmFtIHt7cGF0aDogc3RyaW5nLCB0cmFuc3BvcnQ6IGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuVmVsb2Npb3VzU3luY0NsaWVudFRyYW5zcG9ydH19IGFyZ3MgLSBQb3N0ZXIgYXJncy5cbiAqIEByZXR1cm5zIHsocGF5bG9hZDogUmVjb3JkPHN0cmluZywgPz4pID0+IFByb21pc2U8Pz59IFN5bmMgZW5kcG9pbnQgUE9TVGVyLlxuICovXG5mdW5jdGlvbiB0cmFuc3BvcnRQb3N0ZXIoe3BhdGgsIHRyYW5zcG9ydH0pIHtcbiAgcmV0dXJuIGFzeW5jIChwYXlsb2FkKSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0cmFuc3BvcnQucG9zdChwYXRoLCBwYXlsb2FkKVxuXG4gICAgaWYgKCFyZXNwb25zZSB8fCB0eXBlb2YgcmVzcG9uc2UuanNvbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHN5bmMuY2xpZW50IHRyYW5zcG9ydC5wb3N0IG11c3QgcmVzb2x2ZSB0byBhIHJlc3BvbnNlIHdpdGggYSBqc29uKCkgbWV0aG9kIGZvciAke3BhdGh9IChsaWtlIHRoZSBmcm9udGVuZC1tb2RlbCB3ZWJzb2NrZXQgY2xpZW50KWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICB9XG59XG5cbi8qKlxuICogTGF6aWx5IGJ1aWxkcyAoYW5kIG1lbW9pemVzIHBlciBjb25maWd1cmF0aW9uKSB0aGUgc3luYyBjbGllbnQgZGVyaXZlZCBmcm9tIHRoZVxuICogYXBwJ3MgVmVsb2Npb3VzIGNvbmZpZ3VyYXRpb24gYW5kIHJlZ2lzdGVycyBpdCBhcyB0aGUgY3VycmVudCBzeW5jIGNsaWVudC5cbiAqIEBwYXJhbSB7Q29uZmlndXJhdGlvbn0gW2NvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBvd25pbmcgdGhlIHJlZ2lzdGVyZWQgbW9kZWxzIGFuZCB0aGUgc3luYy5jbGllbnQgYmxvY2suIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyB7U3luY0NsaWVudH0gTWVtb2l6ZWQgc3luYyBjbGllbnQgZm9yIHRoZSBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3luY0NsaWVudChjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbi5jdXJyZW50KCkpIHtcbiAgbGV0IGNsaWVudCA9IHN5bmNDbGllbnRzQnlDb25maWd1cmF0aW9uLmdldChjb25maWd1cmF0aW9uKVxuXG4gIGlmICghY2xpZW50KSB7XG4gICAgY2xpZW50ID0gU3luY0NsaWVudC5mcm9tQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKVxuICAgIHN5bmNDbGllbnRzQnlDb25maWd1cmF0aW9uLnNldChjb25maWd1cmF0aW9uLCBjbGllbnQpXG4gICAgY2xpZW50LnNldEN1cnJlbnQoKVxuICB9XG5cbiAgcmV0dXJuIGNsaWVudFxufVxuXG4vKipcbiAqIERlY2xhcmVzIGEgc3luYyBzY29wZSBvbiB0aGUgY3VycmVudCBzeW5jIGNsaWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDw/Pn0gcXVlcnkgLSBRdWVyeSBkZWNsYXJpbmcgdGhlIHN5bmMgc2NvcGUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7c2NvcGU6IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU2VyaWFsaXplZFN5bmNTY29wZSwgcHVsbGVkOiBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3VsdCB8IG51bGx9Pn0gRGVjbGFyZWQgc2NvcGUgYW5kIHB1bGwgcmVzdWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3luYyhxdWVyeSkge1xuICByZXR1cm4gYXdhaXQgU3luY0NsaWVudC5jdXJyZW50KCkuc3luYyhxdWVyeSlcbn1cbiJdfQ==
702
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLWNsaWVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDL0QsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBRXZELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBQ3pELE9BQU8sYUFBYSxNQUFNLHNCQUFzQixDQUFBO0FBQ2hELE9BQU8sa0JBQWtCLE1BQU0sMkJBQTJCLENBQUE7QUFDMUQsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFDbEQsT0FBTyxFQUFDLGlCQUFpQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFFakYsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFBO0FBRXJCLHNGQUFzRjtBQUN0RixNQUFNLHNCQUFzQixHQUFHLEVBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUMsQ0FBQTtBQUV0Rzs7Ozs7b0RBS29EO0FBQ3BELE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFFdkQsa0dBQWtHO0FBQ2xHLE1BQU0saUNBQWlDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUE7QUFFeEYsaURBQWlEO0FBQ2pELE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUVoRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sVUFBVTtJQUM3Qjs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFBWSxP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LE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3ZCLE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFFcEQsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxrRkFBa0YsSUFBSSw2Q0FBNkMsQ0FBQyxDQUFBO1FBQ3RKLENBQUM7UUFFRCxPQUFPLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzlCLENBQUMsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUU7SUFDaEUsSUFBSSxNQUFNLEdBQUcsMEJBQTBCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBRTFELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sR0FBRyxVQUFVLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDcEQsMEJBQTBCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUNyRCxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDckIsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLElBQUksQ0FBQyxLQUFLO0lBQzlCLE9BQU8sTUFBTSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSBcIi4uL2NvbmZpZ3VyYXRpb24uanNcIlxuaW1wb3J0IHtpc0Jvb2xlYW5Db2x1bW5UeXBlfSBmcm9tIFwiLi4vZGF0YWJhc2UvY29sdW1uLXR5cGVzLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuaW1wb3J0IHtzZXJpYWxpemVkU2NvcGVGcm9tUXVlcnl9IGZyb20gXCIuL3F1ZXJ5LXNjb3BlLmpzXCJcbmltcG9ydCBTeW5jQXBpQ2xpZW50IGZyb20gXCIuL3N5bmMtYXBpLWNsaWVudC5qc1wiXG5pbXBvcnQgU3luY1JlYWx0aW1lQnJpZGdlIGZyb20gXCIuL3N5bmMtcmVhbHRpbWUtYnJpZGdlLmpzXCJcbmltcG9ydCBTeW5jU2NvcGVTdG9yZSBmcm9tIFwiLi9zeW5jLXNjb3BlLXN0b3JlLmpzXCJcbmltcG9ydCB7Y3VycmVudFN5bmNDbGllbnQsIHNldEN1cnJlbnRTeW5jQ2xpZW50fSBmcm9tIFwiLi9zeW5jLWNsaWVudC1yZWdpc3RyeS5qc1wiXG5cbmxldCBjbGllbnRDb3VudGVyID0gMFxuXG4vKiogQHR5cGUge3tjcmVhdGU6IFwiYWZ0ZXJDcmVhdGVcIiwgdXBkYXRlOiBcImFmdGVyVXBkYXRlXCIsIGRlc3Ryb3k6IFwiYWZ0ZXJEZXN0cm95XCJ9fSAqL1xuY29uc3QgVFJBQ0tFRF9DQUxMQkFDS19OQU1FUyA9IHtjcmVhdGU6IFwiYWZ0ZXJDcmVhdGVcIiwgZGVzdHJveTogXCJhZnRlckRlc3Ryb3lcIiwgdXBkYXRlOiBcImFmdGVyVXBkYXRlXCJ9XG5cbi8qKlxuICogT3BlcmF0aW9ucyB0cmFja2VkIGJ5IGRlZmF1bHQgZm9yIG1vZGVscyBkZWNsYXJpbmcgYHN0YXRpYyBzeW5jYCB3aXRob3V0IGFcbiAqIGB0cmFja2Aga2V5OiBsb2NhbCBjcmVhdGVzIGFuZCB1cGRhdGVzIHF1ZXVlIGF1dG9tYXRpY2FsbHkuIERlc3Ryb3lzIGFyZSBub3RcbiAqIHRyYWNrZWQgYnkgZGVmYXVsdCBiZWNhdXNlIGEgbG9jYWwgZGVzdHJveSBpcyBvZnRlbiBjYWNoZSBldmljdGlvbiByYXRoZXJcbiAqIHRoYW4gYSBzZXJ2ZXIgZGVsZXRlOyBvcHQgaW4gd2l0aCBgdHJhY2s6IHRydWVgIG9yIGFuIG9wZXJhdGlvbnMgbGlzdC5cbiAqIEB0eXBlIHtBcnJheTxcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiPn0gKi9cbmNvbnN0IERFRkFVTFRfVFJBQ0tFRF9PUEVSQVRJT05TID0gW1wiY3JlYXRlXCIsIFwidXBkYXRlXCJdXG5cbi8qKiBBdHRyaWJ1dGUgbmFtZXMgdHJlYXRlZCBhcyBjbGllbnQtbG9jYWwgc3luYyBib29ra2VlcGluZyB3aGVuIGRlcml2aW5nIGxvY2FsT25seUF0dHJpYnV0ZXMuICovXG5jb25zdCBMT0NBTF9CT09LS0VFUElOR19BVFRSSUJVVEVfTkFNRVMgPSBbXCJjcmVhdGVkQXRcIiwgXCJ1cGRhdGVkQXRcIiwgXCJsYXN0U3luY0NoYW5nZUF0XCJdXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxDb25maWd1cmF0aW9uLCBTeW5jQ2xpZW50Pn0gKi9cbmNvbnN0IHN5bmNDbGllbnRzQnlDb25maWd1cmF0aW9uID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIERlY2xhcmF0aXZlIGNsaWVudC1zaWRlIHN5bmMgZHJpdmVyLlxuICpcbiAqIEV2ZXJ5dGhpbmcgaXMgZGVyaXZlZCBmcm9tIHRoZSBhcHAncyBWZWxvY2lvdXMgY29uZmlndXJhdGlvbjogbW9kZWxzIGRlY2xhcmVcbiAqIGBzdGF0aWMgc3luY2AsIHRyYW5zcG9ydC9hdXRoL2Nvbm5lY3Rpdml0eSBjb21lIGZyb20gdGhlIGBzeW5jLmNsaWVudGBcbiAqIGNvbmZpZ3VyYXRpb24gYmxvY2ssIGFuZCBWZWxvY2lvdXMgb3ducyBzY29wZSBwZXJzaXN0ZW5jZSwgcGVyLXNjb3BlIGN1cnNvcnMsXG4gKiBwdWxsIHBhZ2luZy9hcHBseSwgbG9jYWwgcXVldWVpbmcsIGFuZCBvbmxpbmUtZ2F0ZWQgcmVwbGF5LiBEZWNsYXJlIHN5bmNcbiAqIGludGVyZXN0IGZyb20gcXVlcmllczpcbiAqXG4gKiAgICAgYXdhaXQgc3luY0NsaWVudCgpLnN0YXJ0KClcbiAqICAgICBhd2FpdCBzeW5jQ2xpZW50KCkuc3luYyhFdmVudC53aGVyZSh7cGFydG5lcklkfSkpXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bmNDbGllbnQge1xuICAvKipcbiAgICogQnVpbGRzIHRoZSBzeW5jIGNsaWVudCBieSBkZXJpdmluZyBldmVyeXRoaW5nIGZyb20gdGhlIGFwcCdzIFZlbG9jaW91c1xuICAgKiBjb25maWd1cmF0aW9uOiBldmVyeSByZWdpc3RlcmVkIG1vZGVsIGRlY2xhcmluZyBgc3RhdGljIHN5bmNgIGJlY29tZXMgYVxuICAgKiByZXNvdXJjZSB3aXRoIGJvb2xlYW5BdHRyaWJ1dGVzIGRlcml2ZWQgZnJvbSBjb2x1bW4gdHlwZXMgYW5kXG4gICAqIGxvY2FsT25seUF0dHJpYnV0ZXMgZGVyaXZlZCBmcm9tIHRoZSBwcmltYXJ5IGtleSwgY3JlYXRlZEF0L3VwZGF0ZWRBdCwgYW5kXG4gICAqIHN5bmMgYm9va2tlZXBpbmcgY29sdW1uczsgdGhlIHBlbmRpbmctc3luYyBtb2RlbCBpcyB0aGUgcmVnaXN0ZXJlZCBcIlN5bmNcIlxuICAgKiBtb2RlbDsgdHJhbnNwb3J0LCBhdXRoLCBjb25uZWN0aXZpdHksIGFuZCBlcnJvciByZXBvcnRpbmcgY29tZSBmcm9tIHRoZVxuICAgKiBgc3luYy5jbGllbnRgIGNvbmZpZ3VyYXRpb24gYmxvY2ssIHdpdGggdGhlIGZyYW1ld29yayBvd25pbmcgdGhlXG4gICAqIGAke21vdW50UGF0aH0vY2hhbmdlc2AgYW5kIGAke21vdW50UGF0aH0vcmVwbGF5YCBQT1NUZXJzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudE9wdGlvbnN9IFtvcHRpb25zXSAtIE9wdGlvbmFsIG92ZXJyaWRlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHtjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbi5jdXJyZW50KCksIGxlZ2FjeUN1cnNvciwgc2NvcGVTdG9yZSwgc3luY01vZGVsLCAuLi5yZXN0T3B0aW9uc30gPSBvcHRpb25zXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RPcHRpb25zKVxuXG4gICAgY29uc3QgY2xpZW50Q29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0U3luY0NvbmZpZ3VyYXRpb24oKS5jbGllbnRcblxuICAgIGlmICghY2xpZW50Q29uZmlndXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0NsaWVudCByZXF1aXJlcyBhIHN5bmMuY2xpZW50IGNvbmZpZ3VyYXRpb24gYmxvY2s6IG5ldyBDb25maWd1cmF0aW9uKHtzeW5jOiB7Y2xpZW50OiB7YXV0aGVudGljYXRpb25Ub2tlbiwgdHJhbnNwb3J0fX19KVwiKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsQ2xhc3NlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzc2VzKClcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnPn0gKi9cbiAgICBjb25zdCByZXNvdXJjZXMgPSB7fVxuXG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIE9iamVjdC52YWx1ZXMobW9kZWxDbGFzc2VzKSkge1xuICAgICAgaWYgKCFtb2RlbENsYXNzLnN5bmMpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcblxuICAgICAgcmVzb3VyY2VzW3Jlc291cmNlVHlwZV0gPSByZXNvdXJjZUNvbmZpZ0Zyb21TeW5jRGVjbGFyYXRpb24oe2RlY2xhcmF0aW9uOiBtb2RlbENsYXNzLnN5bmMsIG1vZGVsQ2xhc3MsIHJlc291cmNlVHlwZX0pXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc291cmNlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jQ2xpZW50IGZvdW5kIG5vIHJlZ2lzdGVyZWQgbW9kZWxzIGRlY2xhcmluZyBzdGF0aWMgc3luYyAtIGRlY2xhcmUgYHN0YXRpYyBzeW5jID0gdHJ1ZWAgKG9yIGEgc3luYyBkZWNsYXJhdGlvbiBvYmplY3QpIG9uIHRoZSBtb2RlbHMgdGhhdCBzaG91bGQgc3luY1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkU3luY01vZGVsID0gc3luY01vZGVsIHx8IG1vZGVsQ2xhc3Nlcy5TeW5jXG5cbiAgICBpZiAoIXJlc29sdmVkU3luY01vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jQ2xpZW50IHJlcXVpcmVzIGEgcmVnaXN0ZXJlZCBcXFwiU3luY1xcXCIgbW9kZWwgZm9yIHBlbmRpbmcgbG9jYWwgc3luYyByb3dzIChvciBwYXNzIG9wdGlvbnMuc3luY01vZGVsKVwiKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50Q29uZmlnfSAqL1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgYXV0aGVudGljYXRpb25Ub2tlbjogY2xpZW50Q29uZmlndXJhdGlvbi5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgYmF0Y2hTaXplOiBjbGllbnRDb25maWd1cmF0aW9uLmJhdGNoU2l6ZSxcbiAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgICBpc09ubGluZTogY2xpZW50Q29uZmlndXJhdGlvbi5pc09ubGluZSxcbiAgICAgIGxlZ2FjeUN1cnNvcixcbiAgICAgIG9uRXJyb3I6IGNsaWVudENvbmZpZ3VyYXRpb24ub25FcnJvcixcbiAgICAgIHBvc3RDaGFuZ2VzOiB0cmFuc3BvcnRQb3N0ZXIoe3BhdGg6IGAke2NsaWVudENvbmZpZ3VyYXRpb24ubW91bnRQYXRofS9jaGFuZ2VzYCwgdHJhbnNwb3J0OiBjbGllbnRDb25maWd1cmF0aW9uLnRyYW5zcG9ydH0pLFxuICAgICAgcG9zdFJlcGxheTogdHJhbnNwb3J0UG9zdGVyKHtwYXRoOiBgJHtjbGllbnRDb25maWd1cmF0aW9uLm1vdW50UGF0aH0vcmVwbGF5YCwgdHJhbnNwb3J0OiBjbGllbnRDb25maWd1cmF0aW9uLnRyYW5zcG9ydH0pLFxuICAgICAgcmVhbHRpbWU6IGNsaWVudENvbmZpZ3VyYXRpb24ucmVhbHRpbWUsXG4gICAgICByZXNvdXJjZXMsXG4gICAgICBzeW5jTW9kZWw6IHJlc29sdmVkU3luY01vZGVsXG4gICAgfVxuICAgIHRoaXMuX2NsaWVudE51bWJlciA9ICsrY2xpZW50Q291bnRlclxuICAgIC8qKiBAdHlwZSB7U3luY1JlYWx0aW1lQnJpZGdlIHwgbnVsbH0gKi9cbiAgICB0aGlzLl9yZWFsdGltZUJyaWRnZSA9IG51bGxcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vc3luYy1zY29wZS1zdG9yZS5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9zY29wZVN0b3JlID0gc2NvcGVTdG9yZSB8fCBudWxsXG4gICAgLyoqIEB0eXBlIHtQcm9taXNlPHZvaWQ+IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9zY2hlZHVsZWRSZXBsYXkgPSBudWxsXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWc+IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9wdWxsUmVzb3VyY2VDb25maWdzID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7QXJyYXk8e2NhbGxiYWNrOiAocmVjb3JkOiA/KSA9PiBQcm9taXNlPHZvaWQ+LCBjYWxsYmFja05hbWU6IFwiYWZ0ZXJDcmVhdGVcIiB8IFwiYWZ0ZXJVcGRhdGVcIiB8IFwiYWZ0ZXJEZXN0cm95XCIsIG1vZGVsQ2xhc3M6ID99Pn0gKi9cbiAgICB0aGlzLl90cmFja2VkQ2FsbGJhY2tzID0gW11cbiAgICAvKiogQHR5cGUge1dlYWtTZXQ8b2JqZWN0Pn0gKi9cbiAgICB0aGlzLl9yZW1vdGVBcHBseVJlY29yZHMgPSBuZXcgV2Vha1NldCgpXG4gICAgdGhpcy5fd2l0aG91dFRyYWNraW5nRGVwdGggPSAwXG4gICAgLyoqIEB0eXBlIHtMb2dnZXIgfCB7ZXJyb3I6ICguLi5tZXNzYWdlczogQXJyYXk8Pz4pID0+IFByb21pc2U8dm9pZD59IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9sb2dnZXIgPSBudWxsXG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGF1dG9tYXRpYyBtdXRhdGlvbiB0cmFja2luZyBmb3IgZXZlcnkgZGVjbGFyZWQgcmVzb3VyY2UgKG9uIGJ5XG4gICAqIGRlZmF1bHQ6IGxvY2FsIGNyZWF0ZXMgYW5kIHVwZGF0ZXMgcXVldWUgcGVuZGluZyBzeW5jIHJvd3Mgb25jZSB0aGVpclxuICAgKiB0cmFuc2FjdGlvbiBjb21taXRzIGFuZCBzY2hlZHVsZSBhbiBpbW1lZGlhdGUgcmVwbGF5IGF0dGVtcHQsIHdpdGhvdXRcbiAgICogYXBwLXNpZGUgcXVldWUgY2FsbHMpLiBgdHJhY2s6IGZhbHNlYCByZXNvdXJjZXMgYXJlIHNraXBwZWQ7IGB0cmFjazogdHJ1ZWBcbiAgICogYWRkcyBkZXN0cm95czsgYW4gb3BlcmF0aW9ucyBsaXN0IG5hcnJvd3MgdGhlIHRyYWNrZWQgb3BlcmF0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5fc3RhcnRlZCkgcmV0dXJuXG5cbiAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZVxuXG4gICAgZm9yIChjb25zdCBbcmVzb3VyY2VUeXBlLCByZXNvdXJjZUNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb25maWcucmVzb3VyY2VzKSkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IHRoaXMudHJhY2tlZE9wZXJhdGlvbnMoe3Jlc291cmNlQ29uZmlnLCByZXNvdXJjZVR5cGV9KVxuXG4gICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrTmFtZSA9IFRSQUNLRURfQ0FMTEJBQ0tfTkFNRVNbb3BlcmF0aW9uXVxuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMudHJhY2tlZE11dGF0aW9uQ2FsbGJhY2soe29wZXJhdGlvbiwgcmVzb3VyY2VDb25maWd9KVxuXG4gICAgICAgIHJlc291cmNlQ29uZmlnLm1vZGVsQ2xhc3NbY2FsbGJhY2tOYW1lXShjYWxsYmFjaylcbiAgICAgICAgdGhpcy5fdHJhY2tlZENhbGxiYWNrcy5wdXNoKHtjYWxsYmFjaywgY2FsbGJhY2tOYW1lLCBtb2RlbENsYXNzOiByZXNvdXJjZUNvbmZpZy5tb2RlbENsYXNzfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYWxsIHRyYWNraW5nIGNhbGxiYWNrcyAodGVzdHMsIHNpZ24tb3V0LCBob3QgcmVsb2FkKS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdG9wKCkge1xuICAgIGZvciAoY29uc3Qge2NhbGxiYWNrLCBjYWxsYmFja05hbWUsIG1vZGVsQ2xhc3N9IG9mIHRoaXMuX3RyYWNrZWRDYWxsYmFja3MpIHtcbiAgICAgIG1vZGVsQ2xhc3MudW5yZWdpc3RlckxpZmVjeWNsZUNhbGxiYWNrKGNhbGxiYWNrTmFtZSwgY2FsbGJhY2spXG4gICAgfVxuXG4gICAgdGhpcy5fdHJhY2tlZENhbGxiYWNrcyA9IFtdXG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW5kIHZhbGlkYXRlcyB0aGUgdHJhY2tlZCBvcGVyYXRpb25zIGZvciBhIHJlc291cmNlIGNvbmZpZy5cbiAgICogVHJhY2tpbmcgaXMgb24gYnkgZGVmYXVsdDogbW9kZWxzIGRlY2xhcmluZyBgc3RhdGljIHN5bmNgIHdpdGhvdXQgYSBgdHJhY2tgXG4gICAqIGtleSBxdWV1ZSBsb2NhbCBjcmVhdGVzIGFuZCB1cGRhdGVzIGF1dG9tYXRpY2FsbHk7IGB0cmFjazogZmFsc2VgIG9wdHMgYVxuICAgKiBtb2RlbCBvdXQgKGZvciBtb2RlbHMgd3JpdHRlbiBieSBub24tdXNlciBmbG93cykuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlQ29uZmlnOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZywgcmVzb3VyY2VUeXBlOiBzdHJpbmd9fSBhcmdzIC0gUmVzb3VyY2UgY29uZmlnIGFuZCBuYW1lLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8XCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIj59IFRyYWNrZWQgb3BlcmF0aW9ucy5cbiAgICovXG4gIHRyYWNrZWRPcGVyYXRpb25zKHtyZXNvdXJjZUNvbmZpZywgcmVzb3VyY2VUeXBlfSkge1xuICAgIGNvbnN0IHRyYWNrID0gcmVzb3VyY2VDb25maWcudHJhY2tcblxuICAgIGlmICh0cmFjayA9PT0gZmFsc2UpIHJldHVybiBbXVxuICAgIGlmICh0cmFjayA9PT0gdW5kZWZpbmVkKSByZXR1cm4gREVGQVVMVF9UUkFDS0VEX09QRVJBVElPTlNcbiAgICBpZiAodHJhY2sgPT09IHRydWUpIHJldHVybiBbXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIiwgXCJkZXN0cm95XCJdXG5cbiAgICBpZiAoIXRyYWNrIHx8IHR5cGVvZiB0cmFjayAhPT0gXCJvYmplY3RcIiB8fCAhQXJyYXkuaXNBcnJheSh0cmFjay5vcGVyYXRpb25zKSB8fCB0cmFjay5vcGVyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jQ2xpZW50IHJlc291cmNlICR7cmVzb3VyY2VUeXBlfSB0cmFjayBtdXN0IGJlIHRydWUgb3Ige29wZXJhdGlvbnM6IFsuLi5dfWApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgdHJhY2sub3BlcmF0aW9ucykge1xuICAgICAgaWYgKCEob3BlcmF0aW9uIGluIFRSQUNLRURfQ0FMTEJBQ0tfTkFNRVMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3luY0NsaWVudCByZXNvdXJjZSAke3Jlc291cmNlVHlwZX0gdHJhY2sub3BlcmF0aW9ucyBtdXN0IGJlIGNyZWF0ZS91cGRhdGUvZGVzdHJveSwgZ290OiAke1N0cmluZyhvcGVyYXRpb24pfWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYWNrLm9wZXJhdGlvbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGxpZmVjeWNsZSBjYWxsYmFjayBxdWV1ZWluZyBvbmUgdHJhY2tlZCBtdXRhdGlvbi4gVGhlIHF1ZXVlZFxuICAgKiBwYXlsb2FkIGFuZCBzeW5jIHR5cGUgYXJlIHNuYXBzaG90dGVkIGF0IG11dGF0aW9uLWNhbGxiYWNrIHRpbWUsIHNvXG4gICAqIGFmdGVyU2F2ZSBob29rcyBhc3NpZ25pbmcgdW5zYXZlZCBhdHRyaWJ1dGVzIChvciBhbnkgbGF0ZXIgZHJpZnQgb24gdGhlXG4gICAqIHJlY29yZCkgY2Fubm90IGNoYW5nZSB3aGF0IGdldHMgcXVldWVkIHZzIHdoYXQgd2FzIGNvbW1pdHRlZC4gUXVldWVpbmcgaXNcbiAgICogZGVmZXJyZWQgdGhyb3VnaCB0aGUgbW9kZWwgY29ubmVjdGlvbidzIGFmdGVyQ29tbWl0IGhvb2sgc28gaXQgb25seSBydW5zXG4gICAqIG9uY2UgdGhlIG11dGF0aW9uJ3MgdHJhbnNhY3Rpb24gaGFzIGNvbW1pdHRlZCAoaW1tZWRpYXRlbHkgd2hlbiBub1xuICAgKiB0cmFuc2FjdGlvbiBpcyBvcGVuKSAtIHF1ZXVlZCBzeW5jcyBuZXZlciByZWZlcmVuY2Ugcm9sbGVkLWJhY2sgcm93cy5cbiAgICogUG9zdC1jb21taXQgcXVldWUgZmFpbHVyZXMgYXJlIHJlcG9ydGVkIHdpdGhvdXQgcmV0aHJvd2luZyBpbnRvIHRoZVxuICAgKiBkcml2ZXIncyBhZnRlckNvbW1pdCBjaGFpbiAoc2VlIHJlcG9ydEFmdGVyQ29tbWl0RXJyb3IpLlxuICAgKiBAcGFyYW0ge3tvcGVyYXRpb246IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIHJlc291cmNlQ29uZmlnOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ319IGFyZ3MgLSBPcGVyYXRpb24gYW5kIHJlc291cmNlIGNvbmZpZy5cbiAgICogQHJldHVybnMgeyhyZWNvcmQ6ID8pID0+IFByb21pc2U8dm9pZD59IExpZmVjeWNsZSBjYWxsYmFjay5cbiAgICovXG4gIHRyYWNrZWRNdXRhdGlvbkNhbGxiYWNrKHtvcGVyYXRpb24sIHJlc291cmNlQ29uZmlnfSkge1xuICAgIHJldHVybiBhc3luYyAocmVjb3JkKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc1RyYWNraW5nU3VwcHJlc3NlZChyZWNvcmQpKSByZXR1cm5cblxuICAgICAgY29uc3QgZGF0YSA9IFN5bmNBcGlDbGllbnQucXVldWVkU3luY0RhdGEoe1xuICAgICAgICBib29sZWFuQXR0cmlidXRlczogcmVzb3VyY2VDb25maWcuYm9vbGVhbkF0dHJpYnV0ZXMgfHwgW10sXG4gICAgICAgIGRhdGE6IHJlc291cmNlQ29uZmlnLnRyYWNrZWREYXRhID8gcmVzb3VyY2VDb25maWcudHJhY2tlZERhdGEoe29wZXJhdGlvbiwgcmVjb3JkfSkgOiB1bmRlZmluZWQsXG4gICAgICAgIGxvY2FsT25seUF0dHJpYnV0ZXM6IHJlc291cmNlQ29uZmlnLmxvY2FsT25seUF0dHJpYnV0ZXMgfHwgW10sXG4gICAgICAgIHJlc291cmNlOiByZWNvcmRcbiAgICAgIH0pXG4gICAgICBjb25zdCBzeW5jVHlwZSA9IHRoaXMuZGVmYXVsdFN5bmNUeXBlKHtvcGVyYXRpb24sIHJlY29yZCwgcmVzb3VyY2VDb25maWd9KVxuXG4gICAgICBhd2FpdCByZXNvdXJjZUNvbmZpZy5tb2RlbENsYXNzLmNvbm5lY3Rpb24oKS5hZnRlckNvbW1pdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgU3luY0FwaUNsaWVudC5xdWV1ZUxvY2FsU3luYyh7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcmVzb3VyY2U6IHJlY29yZCxcbiAgICAgICAgICAgIHN5bmNNb2RlbDogdGhpcy5jb25maWcuc3luY01vZGVsLFxuICAgICAgICAgICAgc3luY1R5cGVcbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0QWZ0ZXJDb21taXRFcnJvcigvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpKVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjaGVkdWxlUmVwbGF5KClcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgYSBwb3N0LWNvbW1pdCB0cmFja2VkLXF1ZXVlaW5nIGZhaWx1cmUuIFRoZSB0cmFuc2FjdGlvbiBoYXMgYWxyZWFkeVxuICAgKiBjb21taXR0ZWQgd2hlbiBhZnRlckNvbW1pdCBjYWxsYmFja3MgcnVuLCBzbyByZXRocm93aW5nIGhlcmUgd291bGQgcG9pc29uXG4gICAqIHRoZSBkcml2ZXIncyBhd2FpdGVkIGFmdGVyQ29tbWl0IGNoYWluIChicmVha2luZyB1bnJlbGF0ZWQgY2FsbGJhY2tzKSAtXG4gICAqIGluc3RlYWQgdGhlIGZhaWx1cmUgZ29lcyB0byB0aGUgY29uZmlndXJlZCBzeW5jLmNsaWVudC5vbkVycm9yIGhvb2ssIG9yIGlzXG4gICAqIGxvZ2dlZCBsb3VkbHkgdGhyb3VnaCB0aGUgY2xpZW50J3MgbG9nZ2VyIHdoZW4gbm9uZSBpcyBjb25maWd1cmVkLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIFBvc3QtY29tbWl0IHF1ZXVlaW5nIGZhaWx1cmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVwb3J0QWZ0ZXJDb21taXRFcnJvcihlcnJvcikge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkVycm9yKSB7XG4gICAgICB0aGlzLmNvbmZpZy5vbkVycm9yKGVycm9yKVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmxvZ2dlcigpLmVycm9yKFwiU3luY0NsaWVudCBmYWlsZWQgdG8gcXVldWUgYSB0cmFja2VkIG11dGF0aW9uIGFmdGVyIGNvbW1pdFwiLCBlcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsYXppbHkgYnVpbHQgY2xpZW50IGxvZ2dlci5cbiAgICogQHJldHVybnMge0xvZ2dlciB8IHtlcnJvcjogKC4uLm1lc3NhZ2VzOiBBcnJheTw/PikgPT4gUHJvbWlzZTx2b2lkPn19IENsaWVudCBsb2dnZXIuXG4gICAqL1xuICBsb2dnZXIoKSB7XG4gICAgdGhpcy5fbG9nZ2VyIHx8PSBuZXcgTG9nZ2VyKFwiU3luY0NsaWVudFwiLCB7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWcuY29uZmlndXJhdGlvbn0pXG5cbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIHJlY29yZCBpcyBjdXJyZW50bHkgYmVpbmcgd3JpdHRlbiBieSBwdWxsLWFwcGx5IChlY2hvIHN1cHByZXNzaW9uKS5cbiAgICogQHBhcmFtIHs/fSByZWNvcmQgLSBMb2NhbCBtb2RlbCByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByZWNvcmQgd3JpdGUgb3JpZ2luYXRlcyBmcm9tIGEgcmVtb3RlIGNoYW5nZS5cbiAgICovXG4gIGlzUmVtb3RlQXBwbHkocmVjb3JkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW90ZUFwcGx5UmVjb3Jkcy5oYXMocmVjb3JkKVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdHJhY2tlZCBtdXRhdGlvbiBxdWV1ZWluZyBpcyBjdXJyZW50bHkgc3VwcHJlc3NlZCBmb3IgYSByZWNvcmQ6XG4gICAqIGVpdGhlciB0aGUgcmVjb3JkIHdhcyBtYXJrZWQgYXMgYSByZW1vdGUgYXBwbHkgKGBtYXJrUmVtb3RlQXBwbHlgLCB1c2VkIGJ5XG4gICAqIHB1bGwgYW5kIHJlYWx0aW1lIGFwcGxpZXMpIG9yIGEgYHdpdGhvdXRUcmFja2luZ2AgY2FsbGJhY2sgaXMgcnVubmluZyBvblxuICAgKiB0aGlzIGNsaWVudC5cbiAgICogQHBhcmFtIHs/fSByZWNvcmQgLSBMb2NhbCBtb2RlbCByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRyYWNrZWQgcXVldWVpbmcgaXMgc3VwcHJlc3NlZCBmb3IgdGhlIHJlY29yZC5cbiAgICovXG4gIGlzVHJhY2tpbmdTdXBwcmVzc2VkKHJlY29yZCkge1xuICAgIHJldHVybiB0aGlzLl93aXRob3V0VHJhY2tpbmdEZXB0aCA+IDAgfHwgdGhpcy5pc1JlbW90ZUFwcGx5KHJlY29yZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgY2FsbGJhY2sgd2l0aCB0cmFja2VkIG11dGF0aW9uIHF1ZXVlaW5nIHN1cHByZXNzZWQgb24gdGhpcyBjbGllbnQgLVxuICAgKiBmb3IgY29kZSBhcHBseWluZyBzZXJ2ZXItb3JpZ2luYXRlZCBkYXRhIG91dHNpZGUgdGhlIGRlcml2ZWQgcHVsbC9yZWFsdGltZVxuICAgKiBhcHBsaWVycyAobGVnYWN5IHB1bGwgcGF0aHMsIGltcG9ydGVycywgc2lnbi1pbiBiYWNrZmlsbHMpLCBzbyB0aGVpciB3cml0ZXNcbiAgICogYXJlIG5vdCBlY2hvZWQgYmFjayB0byB0aGUgc2VydmVyIGFzIGRldmljZSBjaGFuZ2VzLiBTdXBwcmVzc2lvbiBjb3ZlcnMgdGhlXG4gICAqIHdob2xlIGFzeW5jIGR1cmF0aW9uIG9mIHRoZSBjYWxsYmFjayAobmVzdGVkIGNhbGxzIHN0YWNrKSBhbmQgaXNcbiAgICogY2xpZW50LXdpZGUgd2hpbGUgaXQgcnVuczogbXV0YXRpb25zIGZyb20gY29uY3VycmVudGx5IHJ1bm5pbmcgdGFza3MgYXJlXG4gICAqIGFsc28gc3VwcHJlc3NlZCBmb3IgdGhhdCB3aW5kb3csIHNvIHByZWZlciBgbWFya1JlbW90ZUFwcGx5KHJlY29yZClgIHdoZW5cbiAgICogd3JpdGVzIGZyb20gb3RoZXIgZmxvd3MgY2FuIGludGVybGVhdmUuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPiB8IFR9IGNhbGxiYWNrIC0gV29yayB3aG9zZSBtb2RlbCB3cml0ZXMgc2hvdWxkIG5vdCBxdWV1ZSB0cmFja2VkIHN5bmNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gVGhlIGNhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhvdXRUcmFja2luZyhjYWxsYmFjaykge1xuICAgIHRoaXMuX3dpdGhvdXRUcmFja2luZ0RlcHRoKytcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl93aXRob3V0VHJhY2tpbmdEZXB0aC0tXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIG9uZSByZWNvcmQgYXMgYmVpbmcgd3JpdHRlbiBmcm9tIHNlcnZlci1vcmlnaW5hdGVkIGRhdGEgc28gdHJhY2tlZFxuICAgKiBtdXRhdGlvbiBxdWV1ZWluZyBza2lwcyBpdCAocmVjb3JkLXByZWNpc2Ugc3VwcHJlc3Npb24pLiBUaGUgZGVyaXZlZCBwdWxsXG4gICAqIGFuZCByZWFsdGltZSBhcHBsaWVycyB1c2UgdGhpcyBpbnRlcm5hbGx5IGFyb3VuZCBldmVyeSBhcHBsaWVkIHdyaXRlLlxuICAgKiBAcGFyYW0gez99IHJlY29yZCAtIExvY2FsIG1vZGVsIHJlY29yZCBhYm91dCB0byBiZSB3cml0dGVuLlxuICAgKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gUmVsZWFzZSBjYWxsYmFjayByZS1lbmFibGluZyB0cmFja2luZyBmb3IgdGhlIHJlY29yZC5cbiAgICovXG4gIG1hcmtSZW1vdGVBcHBseShyZWNvcmQpIHtcbiAgICB0aGlzLl9yZW1vdGVBcHBseVJlY29yZHMuYWRkKHJlY29yZClcblxuICAgIHJldHVybiAoKSA9PiB0aGlzLl9yZW1vdGVBcHBseVJlY29yZHMuZGVsZXRlKHJlY29yZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhpcyBjbGllbnQgYXMgdGhlIGFwcCdzIGN1cnJlbnQgc3luYyBjbGllbnQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0Q3VycmVudCgpIHtcbiAgICBzZXRDdXJyZW50U3luY0NsaWVudCh0aGlzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFwcCdzIGN1cnJlbnQgc3luYyBjbGllbnQuXG4gICAqIEByZXR1cm5zIHtTeW5jQ2xpZW50fSBDdXJyZW50IHN5bmMgY2xpZW50LlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7U3luY0NsaWVudH0gKi8gKGN1cnJlbnRTeW5jQ2xpZW50KCkpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc3luYyBjbGllbnQgZGVyaXZlZCBmcm9tIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLiBBbGlhcyBmb3JcbiAgICogYG5ldyBTeW5jQ2xpZW50KHtjb25maWd1cmF0aW9uLCAuLi5vcHRpb25zfSlgLlxuICAgKiBAcGFyYW0ge0NvbmZpZ3VyYXRpb259IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gb3duaW5nIHRoZSByZWdpc3RlcmVkIG1vZGVscyBhbmQgdGhlIHN5bmMuY2xpZW50IGJsb2NrLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge09taXQ8aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50T3B0aW9ucywgXCJjb25maWd1cmF0aW9uXCI+fSBbb3B0aW9uc10gLSBPcHRpb25hbCBvdmVycmlkZXMuXG4gICAqIEByZXR1cm5zIHtTeW5jQ2xpZW50fSBTeW5jIGNsaWVudCBkZXJpdmVkIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgZnJvbUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24uY3VycmVudCgpLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFN5bmNDbGllbnQoey4uLm9wdGlvbnMsIGNvbmZpZ3VyYXRpb259KVxuICB9XG5cbiAgLyoqXG4gICAqIERlY2xhcmVzIChvciByZS1hY3RpdmF0ZXMpIGEgc3luYyBzY29wZSBmcm9tIGEgbW9kZWwgcXVlcnkgYW5kIHB1bGxzIGl0IHdoZW4gb25saW5lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8Pz59IHF1ZXJ5IC0gUXVlcnkgZGVjbGFyaW5nIHRoZSBzeW5jIHNjb3BlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7c2NvcGU6IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU2VyaWFsaXplZFN5bmNTY29wZSwgcHVsbGVkOiBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3VsdCB8IG51bGx9Pn0gRGVjbGFyZWQgc2NvcGUgYW5kIHB1bGwgcmVzdWx0IChudWxsIHdoaWxlIG9mZmxpbmUpLlxuICAgKi9cbiAgYXN5bmMgc3luYyhxdWVyeSkge1xuICAgIGNvbnN0IHNjb3BlID0gc2VyaWFsaXplZFNjb3BlRnJvbVF1ZXJ5KHF1ZXJ5KVxuICAgIGNvbnN0IHNjb3BlU3RvcmUgPSB0aGlzLnNjb3BlU3RvcmUoKVxuICAgIGNvbnN0IHNjb3BlUm93ID0gYXdhaXQgc2NvcGVTdG9yZS5maW5kT3JDcmVhdGVTY29wZShzY29wZSlcblxuICAgIGlmICghc2NvcGVSb3cuY3Vyc29yUGF5bG9hZCAmJiB0aGlzLmNvbmZpZy5sZWdhY3lDdXJzb3IpIHtcbiAgICAgIGNvbnN0IGxlZ2FjeUN1cnNvclBheWxvYWQgPSBhd2FpdCB0aGlzLmNvbmZpZy5sZWdhY3lDdXJzb3Ioe3Njb3BlfSlcbiAgICAgIGNvbnN0IGxlZ2FjeUN1cnNvciA9IFN5bmNBcGlDbGllbnQuc3luY0N1cnNvckZyb21QYXlsb2FkKGxlZ2FjeUN1cnNvclBheWxvYWQpXG5cbiAgICAgIGlmIChsZWdhY3lDdXJzb3IpIGF3YWl0IHNjb3BlU3RvcmUuc2F2ZUN1cnNvcihzY29wZVJvdywgbGVnYWN5Q3Vyc29yKVxuICAgIH1cblxuICAgIHJldHVybiB7cHVsbGVkOiBhd2FpdCB0aGlzLnB1bGwoKSwgc2NvcGV9XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZXMgdGhlIHN5bmMgc2NvcGUgZGVjbGFyZWQgYnkgYSBtb2RlbCBxdWVyeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PD8+fSBxdWVyeSAtIFF1ZXJ5IHdob3NlIHNjb3BlIHNob3VsZCBzdG9wIHN5bmNpbmcuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdW5zeW5jKHF1ZXJ5KSB7XG4gICAgYXdhaXQgdGhpcy5zY29wZVN0b3JlKCkuZGVhY3RpdmF0ZShzZXJpYWxpemVkU2NvcGVGcm9tUXVlcnkocXVlcnkpKVxuICB9XG5cbiAgLyoqXG4gICAqIFB1bGxzIGNoYW5nZXMgZm9yIGV2ZXJ5IGFjdGl2ZSBzY29wZSB3aXRoIHBlci1zY29wZSBjdXJzb3JzIChzaW5nbGUtZmxpZ2h0ZWQsIG9ubGluZS1nYXRlZCkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0IHwgbnVsbD59IENvbWJpbmVkIHB1bGwgcmVzdWx0LCBvciBudWxsIHdoaWxlIG9mZmxpbmUuXG4gICAqL1xuICBhc3luYyBwdWxsKCkge1xuICAgIGlmICghKGF3YWl0IHRoaXMuaXNPbmxpbmUoKSkpIHJldHVybiBudWxsXG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0IHwgbnVsbH0gKi9cbiAgICBsZXQgY29tYmluZWRSZXN1bHQgPSBudWxsXG5cbiAgICBhd2FpdCBTeW5jQXBpQ2xpZW50LnNpbmdsZUZsaWdodChgdmVsb2Npb3VzLXN5bmMtY2xpZW50LXB1bGwtJHt0aGlzLl9jbGllbnROdW1iZXJ9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYXV0aGVudGljYXRpb25Ub2tlbiA9IGF3YWl0IHRoaXMuY29uZmlnLmF1dGhlbnRpY2F0aW9uVG9rZW4oKVxuICAgICAgY29uc3Qgc2NvcGVTdG9yZSA9IHRoaXMuc2NvcGVTdG9yZSgpXG4gICAgICBjb25zdCBhcHBseVN5bmMgPSB0aGlzLnJlbW90ZUFwcGx5U3luYygpXG4gICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIGNoYW5nZWQ6IGZhbHNlLFxuICAgICAgICBwYWdlczogMCxcbiAgICAgICAgcmVzb3VyY2VDaGFuZ2VkOiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGJvb2xlYW4+fSAqLyAoe30pLFxuICAgICAgICByZXNvdXJjZUNvdW50czogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSAqLyAoe30pLFxuICAgICAgICBzeW5jZWRDb3VudDogMFxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHNjb3BlUm93IG9mIGF3YWl0IHNjb3BlU3RvcmUuYWN0aXZlU2NvcGVzKCkpIHtcbiAgICAgICAgY29uc3Qgc2NvcGVSZXN1bHQgPSBhd2FpdCBTeW5jQXBpQ2xpZW50LnB1bGxDaGFuZ2VzKHtcbiAgICAgICAgICBhcHBseVN5bmMsXG4gICAgICAgICAgYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICAgICAgICBiYXRjaFNpemU6IHRoaXMuY29uZmlnLmJhdGNoU2l6ZSxcbiAgICAgICAgICBsb2FkQ3Vyc29yOiBhc3luYyAoKSA9PiBhd2FpdCBzY29wZVN0b3JlLmxvYWRDdXJzb3Ioc2NvcGVSb3cpLFxuICAgICAgICAgIHBvc3RDaGFuZ2VzOiBhc3luYyAocGF5bG9hZCkgPT4gYXdhaXQgdGhpcy5jb25maWcucG9zdENoYW5nZXMoe1xuICAgICAgICAgICAgLi4ucGF5bG9hZCxcbiAgICAgICAgICAgIHNjb3BlOiB7Y29uZGl0aW9uczogc2NvcGVSb3cuY29uZGl0aW9ucywgcmVzb3VyY2VUeXBlOiBzY29wZVJvdy5yZXNvdXJjZVR5cGV9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgc2F2ZUN1cnNvcjogYXN5bmMgKGN1cnNvcikgPT4gYXdhaXQgc2NvcGVTdG9yZS5zYXZlQ3Vyc29yKHNjb3BlUm93LCBjdXJzb3IpXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmVzdWx0LmNoYW5nZWQgfHw9IHNjb3BlUmVzdWx0LmNoYW5nZWRcbiAgICAgICAgcmVzdWx0LnBhZ2VzICs9IHNjb3BlUmVzdWx0LnBhZ2VzXG4gICAgICAgIHJlc3VsdC5zeW5jZWRDb3VudCArPSBzY29wZVJlc3VsdC5zeW5jZWRDb3VudFxuXG4gICAgICAgIGZvciAoY29uc3QgW3Jlc291cmNlVHlwZSwgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjb3BlUmVzdWx0LnJlc291cmNlQ291bnRzKSkge1xuICAgICAgICAgIHJlc3VsdC5yZXNvdXJjZUNvdW50c1tyZXNvdXJjZVR5cGVdID0gKHJlc3VsdC5yZXNvdXJjZUNvdW50c1tyZXNvdXJjZVR5cGVdIHx8IDApICsgY291bnRcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZVR5cGUsIGNoYW5nZWRdIG9mIE9iamVjdC5lbnRyaWVzKHNjb3BlUmVzdWx0LnJlc291cmNlQ2hhbmdlZCkpIHtcbiAgICAgICAgICByZXN1bHQucmVzb3VyY2VDaGFuZ2VkW3Jlc291cmNlVHlwZV0gfHw9IGNoYW5nZWRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb21iaW5lZFJlc3VsdCA9IHJlc3VsdFxuICAgIH0pXG5cbiAgICByZXR1cm4gY29tYmluZWRSZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlcml2ZWQgcmVtb3RlLWNoYW5nZSBhcHBsaWVyIHNoYXJlZCBieSBwdWxscyBhbmQgcmVhbHRpbWUgcHVzaGVzOlxuICAgKiBhcHBsaWVzIHRocm91Z2ggdGhlIGRlY2xhcmVkIHJlc291cmNlIGNvbmZpZ3MsIHJlZ2lzdGVycyBlYWNoIHdyaXR0ZW4gcmVjb3JkXG4gICAqIGZvciBlY2hvIHN1cHByZXNzaW9uICh0cmFja2VkIHJlc291cmNlcyBkbyBub3QgcmUtcXVldWUgYXBwbGllZCBjaGFuZ2VzKSwgYW5kXG4gICAqIGZhaWxzIGxvdWRseSBpbnN0ZWFkIG9mIHNpbGVudGx5IHNraXBwaW5nIHVuY29uZmlndXJlZCByZXNvdXJjZXMuXG4gICAqIEBwYXJhbSB7e3NvdXJjZT86IHN0cmluZ319IFthcmdzXSAtIEVycm9yIGNvbnRleHQgZGVzY3JpYmluZyB3aGVyZSB0aGUgY2hhbmdlIGNhbWUgZnJvbS5cbiAgICogQHJldHVybnMgeyhzeW5jOiBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlRW52ZWxvcGUpID0+IFByb21pc2U8aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZUFwcGx5UmVzdWx0Pn0gTG91ZCByZW1vdGUtY2hhbmdlIGFwcGxpZXIuXG4gICAqL1xuICByZW1vdGVBcHBseVN5bmMoe3NvdXJjZSA9IFwicHVsbGVkIGNoYW5nZVwifSA9IHt9KSB7XG4gICAgY29uc3QgcHVsbFJlc291cmNlQ29uZmlncyA9IHRoaXMucHVsbFJlc291cmNlQ29uZmlncygpXG4gICAgY29uc3QgYXBwbGllciA9IFN5bmNBcGlDbGllbnQucmVzb3VyY2VBcHBsaWVyKHB1bGxSZXNvdXJjZUNvbmZpZ3MsIChyZWNvcmQpID0+IHRoaXMubWFya1JlbW90ZUFwcGx5KHJlY29yZCkpXG5cbiAgICByZXR1cm4gYXN5bmMgKHN5bmMpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHN5bmMucmVzb3VyY2VUeXBlKClcblxuICAgICAgaWYgKCFyZXNvdXJjZVR5cGUgfHwgIXB1bGxSZXNvdXJjZUNvbmZpZ3NbcmVzb3VyY2VUeXBlXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN5bmMgcmVzb3VyY2Ugd2l0aCBwdWxsIGF0dHJpYnV0ZXMgY29uZmlndXJlZCBmb3IgJHtzb3VyY2V9OiAke1N0cmluZyhyZXNvdXJjZVR5cGUpfWApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBsaWVyKHN5bmMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdGhlIGRlcml2ZWQgcmVhbHRpbWUgY2hhbm5lbHMgc28gcHVzaGVkIHdlYnNvY2tldCBjaGFuZ2VzIGFwcGx5XG4gICAqIHRocm91Z2ggdGhlIHNhbWUgZGVyaXZlZCBhcHBsaWVyIGFzIHB1bGxzIChpZGVtcG90ZW50LCBzaW5nbGUtZmxpZ2h0ZWQpLlxuICAgKiBAcGFyYW0gez99IFtjb250ZXh0XSAtIEFwcCBjb250ZXh0IHBhc3NlZCB0byB0aGUgYHN5bmMuY2xpZW50LnJlYWx0aW1lLmNoYW5uZWxzYCBjYWxsYmFjayAocnVudGltZSB2YWx1ZXMgbGlrZSBldmVudElkKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdWJzY3JpYmVSZWFsdGltZShjb250ZXh0KSB7XG4gICAgYXdhaXQgdGhpcy5yZWFsdGltZUJyaWRnZSgpLnN1YnNjcmliZShjb250ZXh0KVxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlcyB0aGUgcmVhbHRpbWUgY2hhbm5lbHMgYW5kIGRpc2Nvbm5lY3RzIHRoZSB3ZWJzb2NrZXQgY2xpZW50IChpZGVtcG90ZW50KS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1bnN1YnNjcmliZVJlYWx0aW1lKCkge1xuICAgIGF3YWl0IHRoaXMucmVhbHRpbWVCcmlkZ2UoKS51bnN1YnNjcmliZSgpXG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0cyB0aGUgcmVhbHRpbWUgc3Vic2NyaXB0aW9uIHN0YXRlIGFuZCBwZXItY2hhbm5lbCByZWFkaW5lc3MuXG4gICAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPFN5bmNSZWFsdGltZUJyaWRnZVtcInN0YXR1c1wiXT59IFJlYWx0aW1lIHN0YXR1cy5cbiAgICovXG4gIHJlYWx0aW1lU3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnJlYWx0aW1lQnJpZGdlKCkuc3RhdHVzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBd2FpdHMgYWxsIHBlbmRpbmcgcmVhbHRpbWUgbWVzc2FnZSBhcHBsaWVzIGFuZCBhbnkgc2NoZWR1bGVkXG4gICAqIHB1bGwtb24tcmVjb25uZWN0ICh1c2VmdWwgaW4gdGVzdHMgYW5kIHNodXRkb3duIGZsb3dzKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yUmVhbHRpbWVBcHBsaWVkKCkge1xuICAgIGF3YWl0IHRoaXMucmVhbHRpbWVCcmlkZ2UoKS53YWl0Rm9yQXBwbGllZCgpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGF6aWx5IGJ1aWx0IHJlYWx0aW1lIGJyaWRnZS5cbiAgICogQHJldHVybnMge1N5bmNSZWFsdGltZUJyaWRnZX0gUmVhbHRpbWUgYnJpZGdlLlxuICAgKi9cbiAgcmVhbHRpbWVCcmlkZ2UoKSB7XG4gICAgdGhpcy5fcmVhbHRpbWVCcmlkZ2UgfHw9IG5ldyBTeW5jUmVhbHRpbWVCcmlkZ2Uoe3N5bmNDbGllbnQ6IHRoaXN9KVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlYWx0aW1lQnJpZGdlXG4gIH1cblxuICAvKipcbiAgICogUXVldWVzIGEgbG9jYWwgbW9kZWwgY2hhbmdlIGFzIGEgcGVuZGluZyBzeW5jIHJvdyBhbmQgc2NoZWR1bGVzIGFuIGltbWVkaWF0ZVxuICAgKiByZXBsYXkgYXR0ZW1wdCAoa2VwdCBwZW5kaW5nIHdoaWxlIG9mZmxpbmUgb3Igd2hlbiB0aGUgYmFja2VuZCByZWplY3RzIGl0KS5cbiAgICogQHBhcmFtIHt7cmVzb3VyY2U6ID8sIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCA/Piwgc3luY1R5cGU/OiBzdHJpbmd9fSBhcmdzIC0gUXVldWUgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IFBlbmRpbmcgbG9jYWwgc3luYyByb3cuXG4gICAqL1xuICBhc3luYyBxdWV1ZSh7ZGF0YSwgcmVzb3VyY2UsIHN5bmNUeXBlfSkge1xuICAgIGNvbnN0IHJlc291cmNlQ29uZmlnID0gdGhpcy5yZXNvdXJjZUNvbmZpZ0ZvcihyZXNvdXJjZSlcbiAgICBjb25zdCBzeW5jUm93ID0gYXdhaXQgU3luY0FwaUNsaWVudC5xdWV1ZUxvY2FsU3luYyh7XG4gICAgICBib29sZWFuQXR0cmlidXRlczogcmVzb3VyY2VDb25maWcuYm9vbGVhbkF0dHJpYnV0ZXMgfHwgW10sXG4gICAgICBkYXRhLFxuICAgICAgbG9jYWxPbmx5QXR0cmlidXRlczogcmVzb3VyY2VDb25maWcubG9jYWxPbmx5QXR0cmlidXRlcyB8fCBbXSxcbiAgICAgIHJlc291cmNlLFxuICAgICAgc3luY01vZGVsOiB0aGlzLmNvbmZpZy5zeW5jTW9kZWwsXG4gICAgICBzeW5jVHlwZTogc3luY1R5cGUgPz8gdGhpcy5kZWZhdWx0U3luY1R5cGUoe29wZXJhdGlvbjogXCJ1cGRhdGVcIiwgcmVjb3JkOiByZXNvdXJjZSwgcmVzb3VyY2VDb25maWd9KVxuICAgIH0pXG5cbiAgICB0aGlzLnNjaGVkdWxlUmVwbGF5KClcblxuICAgIHJldHVybiBzeW5jUm93XG4gIH1cblxuICAvKipcbiAgICogRHJhaW5zIHBlbmRpbmcgbG9jYWwgc3luYyByb3dzIHRvIHRoZSBiYWNrZW5kIChzaW5nbGUtZmxpZ2h0ZWQsIG9ubGluZS1nYXRlZCkuXG4gICAqIFJvd3MgYXJlIG9ubHkgbWFya2VkIHN1Y2Nlc3NmdWwgYWZ0ZXIgdGhlIGJhY2tlbmQgYWNrbm93bGVkZ2VzIHRoZW0uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVwbGF5UGVuZGluZygpIHtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmlzT25saW5lKCkpKSByZXR1cm5cblxuICAgIGF3YWl0IFN5bmNBcGlDbGllbnQuc2luZ2xlRmxpZ2h0KGB2ZWxvY2lvdXMtc3luYy1jbGllbnQtcmVwbGF5LSR7dGhpcy5fY2xpZW50TnVtYmVyfWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IFN5bmNBcGlDbGllbnQucmVwbGF5TG9jYWxTeW5jcyh7XG4gICAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW46IGF3YWl0IHRoaXMuY29uZmlnLmF1dGhlbnRpY2F0aW9uVG9rZW4oKSxcbiAgICAgICAgYmF0Y2hTaXplOiB0aGlzLmNvbmZpZy5iYXRjaFNpemUsXG4gICAgICAgIHBvc3RSZXBsYXk6IHRoaXMuY29uZmlnLnBvc3RSZXBsYXksXG4gICAgICAgIHN5bmNNb2RlbDogdGhpcy5jb25maWcuc3luY01vZGVsXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2NoZWR1bGVzIGEgYmFja2dyb3VuZCByZXBsYXkgYXR0ZW1wdCB3aXRob3V0IGJsb2NraW5nIHRoZSBjYWxsZXIuXG4gICAqIEZhaWx1cmVzIGdvIHRvIGNvbmZpZy5vbkVycm9yIChvciByZXRocm93IHdoZW4gbm9uZSBpcyBjb25maWd1cmVkKS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzY2hlZHVsZVJlcGxheSgpIHtcbiAgICB0aGlzLl9zY2hlZHVsZWRSZXBsYXkgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXBsYXlQZW5kaW5nKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMucmVwb3J0RXJyb3IoLyoqIEB0eXBlIHtFcnJvcn0gKi8gKGVycm9yKSlcbiAgICAgIH1cbiAgICB9KSgpXG4gIH1cblxuICAvKipcbiAgICogQXdhaXRzIHRoZSBsYXN0IHNjaGVkdWxlZCBiYWNrZ3JvdW5kIHJlcGxheSAodXNlZnVsIGluIHRlc3RzIGFuZCBzaHV0ZG93biBmbG93cykuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclNjaGVkdWxlZFJlcGxheSgpIHtcbiAgICBpZiAodGhpcy5fc2NoZWR1bGVkUmVwbGF5KSBhd2FpdCB0aGlzLl9zY2hlZHVsZWRSZXBsYXlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIGEgYmFja2dyb3VuZCBzeW5jIGZhaWx1cmUuXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gQmFja2dyb3VuZCBmYWlsdXJlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlcG9ydEVycm9yKGVycm9yKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uRXJyb3IpIHtcbiAgICAgIHRoaXMuY29uZmlnLm9uRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGNvbm5lY3Rpdml0eSB0aHJvdWdoIHRoZSBjb25maWd1cmVkIGdhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRoZSBiYWNrZW5kIGlzIGNvbnNpZGVyZWQgcmVhY2hhYmxlLlxuICAgKi9cbiAgYXN5bmMgaXNPbmxpbmUoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5pc09ubGluZSkgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiAoYXdhaXQgdGhpcy5jb25maWcuaXNPbmxpbmUoKSkgIT09IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2NvcGUgc3RvcmUgYmFja2luZyBkZWNsYXJlZCBzY29wZXMgYW5kIGN1cnNvcnMuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtc2NvcGUtc3RvcmUuanNcIikuZGVmYXVsdH0gU2NvcGUgc3RvcmUuXG4gICAqL1xuICBzY29wZVN0b3JlKCkge1xuICAgIHRoaXMuX3Njb3BlU3RvcmUgfHw9IG5ldyBTeW5jU2NvcGVTdG9yZSh7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWcuY29uZmlndXJhdGlvbn0pXG5cbiAgICByZXR1cm4gdGhpcy5fc2NvcGVTdG9yZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBkZWNsYXJlZCByZXNvdXJjZSBjb25maWcgZm9yIGEgbG9jYWwgcmVjb3JkLlxuICAgKiBAcGFyYW0gez99IHJlc291cmNlIC0gTG9jYWwgbW9kZWwgcmVjb3JkLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWd9IERlY2xhcmVkIHJlc291cmNlIGNvbmZpZy5cbiAgICovXG4gIHJlc291cmNlQ29uZmlnRm9yKHJlc291cmNlKSB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IHJlc291cmNlPy5jb25zdHJ1Y3RvclxuXG4gICAgaWYgKHR5cGVvZiBtb2RlbENsYXNzPy5nZXRNb2RlbE5hbWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIHJlc291cmNlcyBtdXN0IGJlIG1vZGVsIHJlY29yZHMgd2l0aCBhIHN0YXRpYyBnZXRNb2RlbE5hbWUoKSwgZ290OiAke1N0cmluZyhyZXNvdXJjZSl9YClcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXG4gICAgY29uc3QgcmVzb3VyY2VDb25maWcgPSB0aGlzLmNvbmZpZy5yZXNvdXJjZXNbcmVzb3VyY2VUeXBlXVxuXG4gICAgaWYgKCFyZXNvdXJjZUNvbmZpZykgdGhyb3cgbmV3IEVycm9yKGBObyBzeW5jIHJlc291cmNlIGNvbmZpZ3VyZWQgZm9yOiAke3Jlc291cmNlVHlwZX1gKVxuXG4gICAgcmV0dXJuIHJlc291cmNlQ29uZmlnXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHN5bmMgdHlwZSBmb3IgYSBtdXRhdGlvbiB0aHJvdWdoIHRoZSByZXNvdXJjZSBjb25maWcuIFRoZVxuICAgKiBcInVwc2VydFwiIGZsYWcgcXVldWVzIGNyZWF0ZXMgYW5kIHVwZGF0ZXMgYXMgXCJ1cGRhdGVcIiByb3dzICh0aGUgc2VydmVyXG4gICAqIHVwc2VydHMgYnkgcmVzb3VyY2UgaWQpIGFuZCBkZXN0cm95cyBhcyBcImRlbGV0ZVwiIHJvd3MuXG4gICAqIEBwYXJhbSB7e29wZXJhdGlvbjogXCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIiwgcmVjb3JkOiA/LCByZXNvdXJjZUNvbmZpZzogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWd9fSBhcmdzIC0gTXV0YXRpb24gYXJncy5cbiAgICogQHJldHVybnMge3N0cmluZ30gU3luYyB0eXBlLlxuICAgKi9cbiAgZGVmYXVsdFN5bmNUeXBlKHtvcGVyYXRpb24sIHJlY29yZCwgcmVzb3VyY2VDb25maWd9KSB7XG4gICAgaWYgKHR5cGVvZiByZXNvdXJjZUNvbmZpZy5zeW5jVHlwZSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gcmVzb3VyY2VDb25maWcuc3luY1R5cGUoe29wZXJhdGlvbiwgcmVjb3JkfSlcbiAgICBpZiAob3BlcmF0aW9uID09PSBcImRlc3Ryb3lcIikgcmV0dXJuIFwiZGVsZXRlXCJcbiAgICBpZiAocmVzb3VyY2VDb25maWcuc3luY1R5cGUgPT09IFwidXBzZXJ0XCIpIHJldHVybiBcInVwZGF0ZVwiXG5cbiAgICByZXR1cm4gb3BlcmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlcyB0aGUgcHVsbC1hcHBseSByZXNvdXJjZSBjb25maWdzIGZyb20gdGhlIGRlY2xhcmVkIHJlc291cmNlcy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNSZXNvdXJjZUNvbmZpZz59IFB1bGwtYXBwbHkgcmVzb3VyY2UgY29uZmlncy5cbiAgICovXG4gIHB1bGxSZXNvdXJjZUNvbmZpZ3MoKSB7XG4gICAgdGhpcy5fcHVsbFJlc291cmNlQ29uZmlncyB8fD0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWc+fSAqLyAoT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5jb25maWcucmVzb3VyY2VzKVxuICAgICAgICAuZmlsdGVyKChbLCByZXNvdXJjZV0pID0+IEJvb2xlYW4ocmVzb3VyY2UuYXR0cmlidXRlcykpXG4gICAgICAgIC5tYXAoKFtyZXNvdXJjZVR5cGUsIHJlc291cmNlXSkgPT4gW3Jlc291cmNlVHlwZSwge1xuICAgICAgICAgIGFmdGVyQXBwbHk6IHJlc291cmNlLmFmdGVyQXBwbHksXG4gICAgICAgICAgYXR0cmlidXRlczogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWdbXCJhdHRyaWJ1dGVzXCJdfSAqLyAocmVzb3VyY2UuYXR0cmlidXRlcyksXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBmaW5kUmVjb3JkOiByZXNvdXJjZS5maW5kUmVjb3JkLFxuICAgICAgICAgIGZpbmRSZWNvcmRGb3JEZWxldGU6IHJlc291cmNlLmZpbmRSZWNvcmRGb3JEZWxldGUsXG4gICAgICAgICAgbW9kZWxDbGFzczogcmVzb3VyY2UubW9kZWxDbGFzc1xuICAgICAgICB9XSlcbiAgICApKVxuXG4gICAgcmV0dXJuIHRoaXMuX3B1bGxSZXNvdXJjZUNvbmZpZ3NcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBvbmUgcmVzb3VyY2UgY29uZmlnIGZyb20gYSBtb2RlbCdzIGBzdGF0aWMgc3luY2AgZGVjbGFyYXRpb24gcGx1cyBpdHNcbiAqIGRlcml2ZWQgY29sdW1uIG1ldGFkYXRhLlxuICogQHBhcmFtIHt7ZGVjbGFyYXRpb246IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuTW9kZWxTeW5jRGVjbGFyYXRpb24sIG1vZGVsQ2xhc3M6ID8sIHJlc291cmNlVHlwZTogc3RyaW5nfX0gYXJncyAtIERlY2xhcmF0aW9uIGFyZ3MuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWd9IERlcml2ZWQgcmVzb3VyY2UgY29uZmlnLlxuICovXG5mdW5jdGlvbiByZXNvdXJjZUNvbmZpZ0Zyb21TeW5jRGVjbGFyYXRpb24oe2RlY2xhcmF0aW9uLCBtb2RlbENsYXNzLCByZXNvdXJjZVR5cGV9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWREZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uID09PSB0cnVlID8ge30gOiBkZWNsYXJhdGlvblxuXG4gIGlmICghbm9ybWFsaXplZERlY2xhcmF0aW9uIHx8IHR5cGVvZiBub3JtYWxpemVkRGVjbGFyYXRpb24gIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShub3JtYWxpemVkRGVjbGFyYXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlVHlwZX0gc3RhdGljIHN5bmMgbXVzdCBiZSB0cnVlIG9yIGEgc3luYyBkZWNsYXJhdGlvbiBvYmplY3QsIGdvdDogJHtTdHJpbmcoZGVjbGFyYXRpb24pfWApXG4gIH1cblxuICBjb25zdCB7YWZ0ZXJBcHBseSwgYXR0cmlidXRlcywgYm9vbGVhbkF0dHJpYnV0ZXMsIGZpbmRSZWNvcmQsIGZpbmRSZWNvcmRGb3JEZWxldGUsIGxvY2FsT25seUF0dHJpYnV0ZXMsIHB1Ymxpc2gsIHJlYWx0aW1lLCBzeW5jVHlwZSwgdHJhY2ssIHRyYWNrZWREYXRhLCAuLi5yZXN0RGVjbGFyYXRpb259ID0gbm9ybWFsaXplZERlY2xhcmF0aW9uXG4gIGNvbnN0IHVua25vd25LZXlzID0gT2JqZWN0LmtleXMocmVzdERlY2xhcmF0aW9uKVxuXG4gIC8vIGBwdWJsaXNoYCBpcyB0aGUgc2VydmVyLXNpZGUgaGFsZiBvZiB0aGUgc2hhcmVkIGBzdGF0aWMgc3luY2AgZGVjbGFyYXRpb25cbiAgLy8gKGNvbnN1bWVkIGJ5IFN5bmNQdWJsaXNoZXIgb24gdGhlIGJhY2tlbmQpIC0gdGhlIGNsaWVudCBkZXJpdmVzIG5vdGhpbmdcbiAgLy8gZnJvbSBpdCwgYnV0IG1vZGVscyBkZWNsYXJlZCBvbmNlIGZvciBib3RoIHNpZGVzIG11c3Qgc3RheSB2YWxpZCBoZXJlLlxuICB2b2lkIHB1Ymxpc2hcblxuICBpZiAodW5rbm93bktleXMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZVR5cGV9IHN0YXRpYyBzeW5jIHJlY2VpdmVkIHVua25vd24ga2V5czogJHt1bmtub3duS2V5cy5qb2luKFwiLCBcIil9IChzdXBwb3J0ZWQ6IGFmdGVyQXBwbHksIGF0dHJpYnV0ZXMsIGJvb2xlYW5BdHRyaWJ1dGVzLCBmaW5kUmVjb3JkLCBmaW5kUmVjb3JkRm9yRGVsZXRlLCBsb2NhbE9ubHlBdHRyaWJ1dGVzLCBwdWJsaXNoLCByZWFsdGltZSwgc3luY1R5cGUsIHRyYWNrLCB0cmFja2VkRGF0YSlgKVxuICB9XG4gIGlmIChzeW5jVHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzeW5jVHlwZSAhPT0gXCJmdW5jdGlvblwiICYmIHN5bmNUeXBlICE9PSBcInVwc2VydFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlVHlwZX0gc3RhdGljIHN5bmMgc3luY1R5cGUgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIHRoZSBzdHJpbmcgXCJ1cHNlcnRcIiwgZ290OiAke1N0cmluZyhzeW5jVHlwZSl9YClcbiAgfVxuXG4gIGNvbnN0IGRlcml2ZWQgPSBkZXJpdmVkU3luY0F0dHJpYnV0ZXMoe21vZGVsQ2xhc3MsIHJlc291cmNlVHlwZX0pXG5cbiAgcmV0dXJuIHtcbiAgICBhZnRlckFwcGx5LFxuICAgIGF0dHJpYnV0ZXMsXG4gICAgYm9vbGVhbkF0dHJpYnV0ZXM6IG1lcmdlZEF0dHJpYnV0ZU5hbWVzKGRlcml2ZWQuYm9vbGVhbkF0dHJpYnV0ZXMsIGJvb2xlYW5BdHRyaWJ1dGVzKSxcbiAgICBmaW5kUmVjb3JkLFxuICAgIGZpbmRSZWNvcmRGb3JEZWxldGUsXG4gICAgbG9jYWxPbmx5QXR0cmlidXRlczogbWVyZ2VkQXR0cmlidXRlTmFtZXMoZGVyaXZlZC5sb2NhbE9ubHlBdHRyaWJ1dGVzLCBsb2NhbE9ubHlBdHRyaWJ1dGVzKSxcbiAgICBtb2RlbENsYXNzLFxuICAgIHJlYWx0aW1lLFxuICAgIHN5bmNUeXBlLFxuICAgIHRyYWNrOiBub3JtYWxpemVkVHJhY2sodHJhY2spLFxuICAgIHRyYWNrZWREYXRhXG4gIH1cbn1cblxuLyoqXG4gKiBEZXJpdmVzIGJvb2xlYW4gYW5kIGxvY2FsLW9ubHkgYXR0cmlidXRlIG5hbWVzIGZyb20gYSBtb2RlbCdzIGNvbHVtbiBtZXRhZGF0YTpcbiAqIGJvb2xlYW5zIGZyb20gYm9vbGVhbiBjb2x1bW4gdHlwZXM7IGxvY2FsLW9ubHkgZnJvbSB0aGUgcHJpbWFyeSBrZXksXG4gKiBjcmVhdGVkQXQvdXBkYXRlZEF0LCBhbmQgc3luYyBib29ra2VlcGluZyBjb2x1bW5zLlxuICogQHBhcmFtIHt7bW9kZWxDbGFzczogPywgcmVzb3VyY2VUeXBlOiBzdHJpbmd9fSBhcmdzIC0gRGVyaXZhdGlvbiBhcmdzLlxuICogQHJldHVybnMge3tib29sZWFuQXR0cmlidXRlczogc3RyaW5nW10sIGxvY2FsT25seUF0dHJpYnV0ZXM6IHN0cmluZ1tdfX0gRGVyaXZlZCBhdHRyaWJ1dGUgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGRlcml2ZWRTeW5jQXR0cmlidXRlcyh7bW9kZWxDbGFzcywgcmVzb3VyY2VUeXBlfSkge1xuICBpZiAoXG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZXMgIT09IFwiZnVuY3Rpb25cIiB8fFxuICAgIHR5cGVvZiBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVNYXAgIT09IFwiZnVuY3Rpb25cIiB8fFxuICAgIHR5cGVvZiBtb2RlbENsYXNzLmdldENvbHVtblR5cGVCeU5hbWUgIT09IFwiZnVuY3Rpb25cIiB8fFxuICAgIHR5cGVvZiBtb2RlbENsYXNzLnByaW1hcnlLZXkgIT09IFwiZnVuY3Rpb25cIiB8fFxuICAgIHR5cGVvZiBtb2RlbENsYXNzLmhhc1ByaW1hcnlLZXkgIT09IFwiZnVuY3Rpb25cIlxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2VUeXBlfSBzdGF0aWMgc3luYyByZXF1aXJlcyBhIFZlbG9jaW91cyBtb2RlbCBjbGFzcyB3aXRoIGNvbHVtbiBtZXRhZGF0YSAoZ2V0Q29sdW1uTmFtZXMsIGdldENvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVNYXAsIGdldENvbHVtblR5cGVCeU5hbWUsIHByaW1hcnlLZXksIGhhc1ByaW1hcnlLZXkpYClcbiAgfVxuXG4gIGNvbnN0IGNvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWUgPSBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVNYXAoKVxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBib29sZWFuQXR0cmlidXRlcyA9IFtdXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IGxvY2FsT25seUF0dHJpYnV0ZXMgPSBbXVxuXG4gIGlmIChtb2RlbENsYXNzLmhhc1ByaW1hcnlLZXkoKSkge1xuICAgIGNvbnN0IHByaW1hcnlLZXlDb2x1bW4gPSBtb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuXG4gICAgbG9jYWxPbmx5QXR0cmlidXRlcy5wdXNoKGNvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVbcHJpbWFyeUtleUNvbHVtbl0gfHwgcHJpbWFyeUtleUNvbHVtbilcbiAgfVxuXG4gIGZvciAoY29uc3QgY29sdW1uTmFtZSBvZiBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVzKCkpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gY29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZVtjb2x1bW5OYW1lXSB8fCBjb2x1bW5OYW1lXG4gICAgY29uc3QgY29sdW1uVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uVHlwZUJ5TmFtZShjb2x1bW5OYW1lKVxuXG4gICAgaWYgKExPQ0FMX0JPT0tLRUVQSU5HX0FUVFJJQlVURV9OQU1FUy5pbmNsdWRlcyhhdHRyaWJ1dGVOYW1lKSAmJiAhbG9jYWxPbmx5QXR0cmlidXRlcy5pbmNsdWRlcyhhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgbG9jYWxPbmx5QXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZU5hbWUpXG4gICAgfVxuICAgIGlmIChjb2x1bW5UeXBlICYmIGlzQm9vbGVhbkNvbHVtblR5cGUoY29sdW1uVHlwZSkpIHtcbiAgICAgIGJvb2xlYW5BdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlTmFtZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge2Jvb2xlYW5BdHRyaWJ1dGVzLCBsb2NhbE9ubHlBdHRyaWJ1dGVzfVxufVxuXG4vKipcbiAqIE1lcmdlcyBkZXJpdmVkIGF0dHJpYnV0ZSBuYW1lcyB3aXRoIGRlY2xhcmVkIGV4dHJhcyBpbnRvIGEgc29ydGVkLCBkdXBsaWNhdGUtZnJlZSBsaXN0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gZGVyaXZlZCAtIERlcml2ZWQgYXR0cmlidXRlIG5hbWVzLlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IHVuZGVmaW5lZH0gZGVjbGFyZWQgLSBEZWNsYXJlZCBleHRyYSBhdHRyaWJ1dGUgbmFtZXMuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IE1lcmdlZCBhdHRyaWJ1dGUgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlZEF0dHJpYnV0ZU5hbWVzKGRlcml2ZWQsIGRlY2xhcmVkKSB7XG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uZGVyaXZlZCwgLi4uKGRlY2xhcmVkIHx8IFtdKV0pXS5zb3J0KClcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgZGVjbGFyYXRpb24ncyB0cmFjayB2YWx1ZTogYW4gb3BlcmF0aW9ucyBhcnJheSBpcyBzaG9ydGhhbmQgZm9yXG4gKiB0aGUge29wZXJhdGlvbnN9IGZvcm0uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuTW9kZWxTeW5jRGVjbGFyYXRpb25Db25maWdbXCJ0cmFja1wiXX0gdHJhY2sgLSBEZWNsYXJlZCB0cmFjayB2YWx1ZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ1tcInRyYWNrXCJdfSBOb3JtYWxpemVkIHRyYWNrIHZhbHVlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVkVHJhY2sodHJhY2spIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHJhY2spKSByZXR1cm4ge29wZXJhdGlvbnM6IHRyYWNrfVxuXG4gIHJldHVybiB0cmFja1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGZyYW1ld29yay1vd25lZCBzeW5jIGVuZHBvaW50IFBPU1RlciBvdmVyIHRoZSBjb25maWd1cmVkIHRyYW5zcG9ydC5cbiAqIEBwYXJhbSB7e3BhdGg6IHN0cmluZywgdHJhbnNwb3J0OiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlZlbG9jaW91c1N5bmNDbGllbnRUcmFuc3BvcnR9fSBhcmdzIC0gUG9zdGVyIGFyZ3MuXG4gKiBAcmV0dXJucyB7KHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsID8+KSA9PiBQcm9taXNlPD8+fSBTeW5jIGVuZHBvaW50IFBPU1Rlci5cbiAqL1xuZnVuY3Rpb24gdHJhbnNwb3J0UG9zdGVyKHtwYXRoLCB0cmFuc3BvcnR9KSB7XG4gIHJldHVybiBhc3luYyAocGF5bG9hZCkgPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdHJhbnNwb3J0LnBvc3QocGF0aCwgcGF5bG9hZClcblxuICAgIGlmICghcmVzcG9uc2UgfHwgdHlwZW9mIHJlc3BvbnNlLmpzb24gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzeW5jLmNsaWVudCB0cmFuc3BvcnQucG9zdCBtdXN0IHJlc29sdmUgdG8gYSByZXNwb25zZSB3aXRoIGEganNvbigpIG1ldGhvZCBmb3IgJHtwYXRofSAobGlrZSB0aGUgZnJvbnRlbmQtbW9kZWwgd2Vic29ja2V0IGNsaWVudClgKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgfVxufVxuXG4vKipcbiAqIExhemlseSBidWlsZHMgKGFuZCBtZW1vaXplcyBwZXIgY29uZmlndXJhdGlvbikgdGhlIHN5bmMgY2xpZW50IGRlcml2ZWQgZnJvbSB0aGVcbiAqIGFwcCdzIFZlbG9jaW91cyBjb25maWd1cmF0aW9uIGFuZCByZWdpc3RlcnMgaXQgYXMgdGhlIGN1cnJlbnQgc3luYyBjbGllbnQuXG4gKiBAcGFyYW0ge0NvbmZpZ3VyYXRpb259IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gb3duaW5nIHRoZSByZWdpc3RlcmVkIG1vZGVscyBhbmQgdGhlIHN5bmMuY2xpZW50IGJsb2NrLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMge1N5bmNDbGllbnR9IE1lbW9pemVkIHN5bmMgY2xpZW50IGZvciB0aGUgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN5bmNDbGllbnQoY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24uY3VycmVudCgpKSB7XG4gIGxldCBjbGllbnQgPSBzeW5jQ2xpZW50c0J5Q29uZmlndXJhdGlvbi5nZXQoY29uZmlndXJhdGlvbilcblxuICBpZiAoIWNsaWVudCkge1xuICAgIGNsaWVudCA9IFN5bmNDbGllbnQuZnJvbUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbilcbiAgICBzeW5jQ2xpZW50c0J5Q29uZmlndXJhdGlvbi5zZXQoY29uZmlndXJhdGlvbiwgY2xpZW50KVxuICAgIGNsaWVudC5zZXRDdXJyZW50KClcbiAgfVxuXG4gIHJldHVybiBjbGllbnRcbn1cblxuLyoqXG4gKiBEZWNsYXJlcyBhIHN5bmMgc2NvcGUgb24gdGhlIGN1cnJlbnQgc3luYyBjbGllbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8Pz59IHF1ZXJ5IC0gUXVlcnkgZGVjbGFyaW5nIHRoZSBzeW5jIHNjb3BlLlxuICogQHJldHVybnMge1Byb21pc2U8e3Njb3BlOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlNlcmlhbGl6ZWRTeW5jU2NvcGUsIHB1bGxlZDogaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZXNSZXN1bHQgfCBudWxsfT59IERlY2xhcmVkIHNjb3BlIGFuZCBwdWxsIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN5bmMocXVlcnkpIHtcbiAgcmV0dXJuIGF3YWl0IFN5bmNDbGllbnQuY3VycmVudCgpLnN5bmMocXVlcnkpXG59XG4iXX0=
@@ -318,7 +318,11 @@ export default class SyncEnvelopeReplayService {
318
318
  mutation: import("./sync-envelope-replay-service.js").SyncReplayMutation;
319
319
  }): Promise<Record<string, unknown>>;
320
320
  /**
321
- * Applies a routed delete mutation.
321
+ * Applies a routed delete mutation. The record is marked as a server apply
322
+ * for the duration of the replay-owned destroy - an active SyncPublisher
323
+ * never publishes the replayed delete a second time (the replay owns its
324
+ * own persist and broadcasts), while later server-side writes to the same
325
+ * instance publish normally again.
322
326
  * @param {object} args - Options.
323
327
  * @param {import("./sync-envelope-replay-service.js").SyncReplayMutation} args.mutation - Normalized replay mutation.
324
328
  * @param {import("../frontend-model-resource/base-resource.js").default} args.resource - Routed resource instance.
@@ -333,8 +337,12 @@ export default class SyncEnvelopeReplayService {
333
337
  * assigned and saved onto the found record (the record layer owns value
334
338
  * casting and validation), and missing records are created with the
335
339
  * client-generated primary key plus a save-then-check membership check.
336
- * Model validation failures become client-safe per-sync failures carrying
337
- * the translated validation message.
340
+ * Written records are marked as server applies for the duration of the
341
+ * replay-owned write - an active SyncPublisher never publishes the replayed
342
+ * mutation a second time (the replay owns its own persist and broadcasts),
343
+ * while later server-side writes to the same instance publish normally
344
+ * again. Model validation failures become client-safe per-sync failures
345
+ * carrying the translated validation message.
338
346
  * @param {object} args - Options.
339
347
  * @param {Record<string, ?>} args.context - Replay context.
340
348
  * @param {import("./sync-envelope-replay-service.js").SyncReplayMutation} args.mutation - Normalized replay mutation.
@@ -363,7 +371,10 @@ export default class SyncEnvelopeReplayService {
363
371
  resource: import("../frontend-model-resource/base-resource.js").default;
364
372
  }): Record<string, unknown>;
365
373
  /**
366
- * Creates the routed record with the client-generated primary key, then
374
+ * Creates the routed record with the client-generated primary key (marked
375
+ * as a server apply for the duration of the create - including the
376
+ * membership-check compensation destroy - so an active SyncPublisher never
377
+ * publishes the replayed create a second time), then
367
378
  * verifies create-scope membership when an ability is configured: records
368
379
  * outside the ability's create scope are destroyed again and fail the sync
369
380
  * with the resource-declared reason. A record that already exists outside
@@ -1 +1 @@
1
- {"version":3,"file":"sync-envelope-replay-service.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-envelope-replay-service.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-envelope-replay-service.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-envelope-replay-service.js"],"names":[],"mappings":"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"}