velocious 1.0.458 → 1.0.460
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/current.js +3 -3
- package/build/database/migration/index.js +2 -0
- package/build/database/record/index.js +1 -1
- package/build/frontend-models/websocket-channel.js +113 -61
- package/build/src/current.d.ts +6 -6
- package/build/src/current.d.ts.map +1 -1
- package/build/src/current.js +4 -4
- package/build/src/database/migration/index.d.ts +8 -0
- package/build/src/database/migration/index.d.ts.map +1 -1
- package/build/src/database/migration/index.js +3 -1
- package/build/src/database/record/index.d.ts +2 -2
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +2 -2
- package/build/src/frontend-models/websocket-channel.d.ts +15 -0
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +110 -63
- package/build/src/testing/test-runner.d.ts +5 -0
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +2 -1
- package/build/testing/test-runner.js +1 -0
- package/package.json +1 -1
- package/src/current.js +3 -3
- package/src/database/migration/index.js +2 -0
- package/src/database/record/index.js +1 -1
- package/src/frontend-models/websocket-channel.js +113 -61
- package/src/testing/test-runner.js +1 -0
package/build/current.js
CHANGED
|
@@ -47,7 +47,7 @@ export default class Current {
|
|
|
47
47
|
|
|
48
48
|
/**
|
|
49
49
|
* Runs tenant.
|
|
50
|
-
* @returns {
|
|
50
|
+
* @returns {Record<string, unknown> | undefined} - Current tenant.
|
|
51
51
|
*/
|
|
52
52
|
static tenant() {
|
|
53
53
|
try {
|
|
@@ -61,7 +61,7 @@ export default class Current {
|
|
|
61
61
|
|
|
62
62
|
/**
|
|
63
63
|
* Runs set tenant.
|
|
64
|
-
* @param {
|
|
64
|
+
* @param {Record<string, unknown>} tenant - Tenant.
|
|
65
65
|
* @returns {void} - No return value.
|
|
66
66
|
*/
|
|
67
67
|
static setTenant(tenant) {
|
|
@@ -70,7 +70,7 @@ export default class Current {
|
|
|
70
70
|
|
|
71
71
|
/**
|
|
72
72
|
* Runs with tenant.
|
|
73
|
-
* @param {
|
|
73
|
+
* @param {Record<string, unknown>} tenant - Tenant.
|
|
74
74
|
* @param {() => Promise<?>} callback - Callback.
|
|
75
75
|
* @returns {Promise<?>} - Callback result.
|
|
76
76
|
*/
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* @property {?} [default] - Default value for the column.
|
|
7
7
|
* @property {object} [foreignKey] - Foreign key definition for the column.
|
|
8
8
|
* @property {boolean | {unique: boolean}} [index] - Whether to add an index (optionally unique).
|
|
9
|
+
* @property {number} [limit] - Alias for maxLength (varchar length limit) on string-like columns.
|
|
10
|
+
* @property {number} [maxLength] - Maximum length for string-like columns (e.g. varchar length).
|
|
9
11
|
* @property {boolean} [null] - Whether the column allows null values.
|
|
10
12
|
* @property {boolean} [primaryKey] - Whether the column is a primary key.
|
|
11
13
|
* @property {boolean} [unique] - Whether the column enforces uniqueness.
|
|
@@ -1678,7 +1678,7 @@ class VelociousDatabaseRecord {
|
|
|
1678
1678
|
|
|
1679
1679
|
/**
|
|
1680
1680
|
* Declares a tenant-aware database identifier resolver for this model class.
|
|
1681
|
-
* @param {string | ((args: {modelClass: typeof VelociousDatabaseRecord, tenant:
|
|
1681
|
+
* @param {string | ((args: {modelClass: typeof VelociousDatabaseRecord, tenant: Record<string, unknown>}) => string | undefined)} databaseIdentifierOrResolver - Static identifier or resolver.
|
|
1682
1682
|
* @returns {void} - No return value.
|
|
1683
1683
|
*/
|
|
1684
1684
|
static switchesTenantDatabase(databaseIdentifierOrResolver) {
|
|
@@ -6,6 +6,10 @@ import {serializeFrontendModelTransportValue} from "./transport-serialization.js
|
|
|
6
6
|
|
|
7
7
|
const EVENT_FILTER_KEYS = new Set(["joins", "key", "searches", "where"])
|
|
8
8
|
|
|
9
|
+
// Mirrors FRONTEND_MODELS_CHANNEL_NAME in ./websocket-publishers.js, duplicated here
|
|
10
|
+
// to avoid the configuration → logger → websocket-publishers import cycle.
|
|
11
|
+
const FRONTEND_MODELS_CHANNEL_NAME = "frontend-models"
|
|
12
|
+
|
|
9
13
|
/**
|
|
10
14
|
* Defines this typedef.
|
|
11
15
|
* @typedef {{action?: string, id?: string | number, matchedEventFilterKeys?: string[], record?: import("./query.js").FrontendModelTransportValue, [key: string]: import("./query.js").FrontendModelTransportValue | string[] | undefined}} FrontendModelLifecycleBroadcastBody
|
|
@@ -360,6 +364,48 @@ export default class FrontendModelWebsocketChannel extends VelociousWebsocketCha
|
|
|
360
364
|
return controller
|
|
361
365
|
}
|
|
362
366
|
|
|
367
|
+
/**
|
|
368
|
+
* Resolves the subscriber's tenant for the broadcast record and runs `callback` inside that tenant
|
|
369
|
+
* context. Broadcast delivery runs in whatever ambient tenant context the publisher left behind. For
|
|
370
|
+
* multi-tenant records that ambient tenant may have been resolved without the subscriber's request
|
|
371
|
+
* (e.g. a relay endpoint or background job mutating the row), so it lacks the subscriber's per-record
|
|
372
|
+
* access flags and the per-event authorization query wrongly finds nothing. Re-resolving the tenant
|
|
373
|
+
* from the event record id plus the subscriber's request makes the authorization queries run against
|
|
374
|
+
* the subscriber's own tenant/ability scope. When no tenant resolves (non-multitenant configs), the
|
|
375
|
+
* callback runs directly so the ambient context is preserved.
|
|
376
|
+
* @template T
|
|
377
|
+
* @param {string | number} id - Event record id.
|
|
378
|
+
* @param {() => Promise<T>} callback - Authorized-query callback.
|
|
379
|
+
* @returns {Promise<T>} - Callback result.
|
|
380
|
+
*/
|
|
381
|
+
async _withEventTenant(id, callback) {
|
|
382
|
+
const configuration = this.session.configuration
|
|
383
|
+
|
|
384
|
+
if (!configuration || typeof configuration.resolveTenant !== "function") {
|
|
385
|
+
return await callback()
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// Mirror the subscribe-time tenant resolution (`WebsocketSession._resolveTenant`):
|
|
389
|
+
// pass `subscription: {channel, params}` so resolvers that derive scope from the
|
|
390
|
+
// subscription behave the same for broadcasts as they did at `channel-subscribe`.
|
|
391
|
+
// The synthetic request forwards the subscriber's params (e.g. authenticationToken),
|
|
392
|
+
// matching this channel's ability resolution above.
|
|
393
|
+
const tenant = await configuration.resolveTenant({
|
|
394
|
+
params: {...this.params, id, model: this._modelName()},
|
|
395
|
+
request: /** @type {import("../http-server/client/request.js").default} */ (this._syntheticRequest()),
|
|
396
|
+
response: new Response({configuration}),
|
|
397
|
+
subscription: {channel: FRONTEND_MODELS_CHANNEL_NAME, params: this.params}
|
|
398
|
+
})
|
|
399
|
+
|
|
400
|
+
// Always enter `runWithTenant`, even when no tenant resolved. Broadcast fan-out
|
|
401
|
+
// runs in the publisher's ambient tenant context; falling back to `callback()`
|
|
402
|
+
// there would authorize a cross-tenant record against the publisher's tenant and
|
|
403
|
+
// could leak it to a subscriber whose own resolver could not resolve it.
|
|
404
|
+
return await configuration.runWithTenant(tenant, async () => {
|
|
405
|
+
return await configuration.ensureConnections({name: "Frontend model websocket event tenant"}, callback)
|
|
406
|
+
})
|
|
407
|
+
}
|
|
408
|
+
|
|
363
409
|
/**
|
|
364
410
|
* Whether the broadcast record is within the subscriber's authenticated ability scope. Used to gate
|
|
365
411
|
* unfiltered/unprojected create/update delivery so a scoped token never receives a record it cannot read.
|
|
@@ -368,15 +414,17 @@ export default class FrontendModelWebsocketChannel extends VelociousWebsocketCha
|
|
|
368
414
|
* @returns {Promise<boolean>} True when the record is readable by this subscription.
|
|
369
415
|
*/
|
|
370
416
|
async _eventIsAccessible(id, FrontendModelController) {
|
|
371
|
-
|
|
417
|
+
return await this._withEventTenant(id, async () => {
|
|
418
|
+
const controller = this._frontendModelController(FrontendModelController)
|
|
372
419
|
|
|
373
|
-
|
|
420
|
+
await controller.ensureFrontendModelClassInitialized()
|
|
374
421
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
422
|
+
const ModelClass = controller.frontendModelClass()
|
|
423
|
+
const primaryKey = ModelClass.primaryKey()
|
|
424
|
+
const query = controller.frontendModelAuthorizedQuery("find").where({[ModelClass.tableName()]: {[primaryKey]: id}})
|
|
378
425
|
|
|
379
|
-
|
|
426
|
+
return Boolean(await query.first())
|
|
427
|
+
})
|
|
380
428
|
}
|
|
381
429
|
|
|
382
430
|
/**
|
|
@@ -413,30 +461,32 @@ export default class FrontendModelWebsocketChannel extends VelociousWebsocketCha
|
|
|
413
461
|
* @returns {Promise<boolean>} Whether the record matches the filter.
|
|
414
462
|
*/
|
|
415
463
|
async _eventMatchesFilter({FrontendModelController, eventFilter, id}) {
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
464
|
+
return await this._withEventTenant(id, async () => {
|
|
465
|
+
const controller = this._frontendModelController(FrontendModelController, {
|
|
466
|
+
joins: eventFilter.joins,
|
|
467
|
+
searches: eventFilter.searches,
|
|
468
|
+
where: eventFilter.where
|
|
469
|
+
})
|
|
421
470
|
|
|
422
|
-
|
|
471
|
+
await controller.ensureFrontendModelClassInitialized()
|
|
423
472
|
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
473
|
+
const ModelClass = controller.frontendModelClass()
|
|
474
|
+
const primaryKey = ModelClass.primaryKey()
|
|
475
|
+
const where = controller.frontendModelWhere()
|
|
476
|
+
const joins = controller.frontendModelJoins()
|
|
477
|
+
// Start from the subscriber's authorized scope so a filter can only ever match records the
|
|
478
|
+
// subscription's ability permits to read.
|
|
479
|
+
let query = controller.frontendModelAuthorizedQuery("find").where({[ModelClass.tableName()]: {[primaryKey]: id}})
|
|
431
480
|
|
|
432
|
-
|
|
433
|
-
|
|
481
|
+
if (where) controller.applyFrontendModelWhere({query, where})
|
|
482
|
+
if (joins) controller.applyFrontendModelJoins({joins, query})
|
|
434
483
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
484
|
+
for (const search of controller.frontendModelSearches()) {
|
|
485
|
+
controller.applyFrontendModelSearch({query, search})
|
|
486
|
+
}
|
|
438
487
|
|
|
439
|
-
|
|
488
|
+
return Boolean(await query.first())
|
|
489
|
+
})
|
|
440
490
|
}
|
|
441
491
|
|
|
442
492
|
/**
|
|
@@ -446,51 +496,53 @@ export default class FrontendModelWebsocketChannel extends VelociousWebsocketCha
|
|
|
446
496
|
* @returns {Promise<Record<string, import("./query.js").FrontendModelTransportValue> | null>} - Serialized projected record.
|
|
447
497
|
*/
|
|
448
498
|
async _projectedRecordForEventId(id, FrontendModelController) {
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
499
|
+
return await this._withEventTenant(id, async () => {
|
|
500
|
+
const controller = this._frontendModelController(FrontendModelController)
|
|
501
|
+
|
|
502
|
+
await controller.ensureFrontendModelClassInitialized()
|
|
503
|
+
|
|
504
|
+
const ModelClass = controller.frontendModelClass()
|
|
505
|
+
const primaryKey = ModelClass.primaryKey()
|
|
506
|
+
// Reload through the subscriber's authorized scope so projected records are only ever sent for
|
|
507
|
+
// rows the subscription's ability permits to read.
|
|
508
|
+
let query = controller.frontendModelAuthorizedQuery("find").where({[ModelClass.tableName()]: {[primaryKey]: id}})
|
|
509
|
+
const preload = controller.frontendModelPreload()
|
|
510
|
+
|
|
511
|
+
if (preload) query = query.preload(preload)
|
|
512
|
+
|
|
513
|
+
for (const entry of controller.frontendModelWithCount()) {
|
|
514
|
+
/**
|
|
515
|
+
* Spec.
|
|
516
|
+
* @type {Record<string, boolean | {relationship?: string, where?: Record<string, import("./query.js").FrontendModelTransportValue>}>} */
|
|
517
|
+
const spec = {}
|
|
518
|
+
|
|
519
|
+
spec[entry.attributeName] = {
|
|
520
|
+
relationship: entry.relationshipName,
|
|
521
|
+
where: entry.where ? /**
|
|
522
|
+
* Narrows the runtime value to the documented type.
|
|
523
|
+
* @type {Record<string, import("./query.js").FrontendModelTransportValue>} */ (entry.where) : undefined
|
|
524
|
+
}
|
|
525
|
+
query.withCount(spec)
|
|
473
526
|
}
|
|
474
|
-
query.withCount(spec)
|
|
475
|
-
}
|
|
476
527
|
|
|
477
|
-
|
|
528
|
+
const queryData = controller.frontendModelQueryData()
|
|
478
529
|
|
|
479
|
-
|
|
530
|
+
if (queryData !== null) query.queryData(queryData)
|
|
480
531
|
|
|
481
|
-
|
|
532
|
+
query = controller.applyFrontendModelTranslatedAttributePreloads({query})
|
|
482
533
|
|
|
483
|
-
|
|
534
|
+
const model = await query.first()
|
|
484
535
|
|
|
485
|
-
|
|
536
|
+
if (!model) return null
|
|
486
537
|
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
538
|
+
if (this.params.abilities !== undefined) {
|
|
539
|
+
await controller.frontendModelComputeAbilities([model])
|
|
540
|
+
}
|
|
490
541
|
|
|
491
|
-
|
|
542
|
+
controller._frontendModelAbilityOverride = undefined
|
|
492
543
|
|
|
493
|
-
|
|
544
|
+
return await controller.frontendModelResourceInstance().serialize(model, "find")
|
|
545
|
+
})
|
|
494
546
|
}
|
|
495
547
|
|
|
496
548
|
/**
|
package/build/src/current.d.ts
CHANGED
|
@@ -24,21 +24,21 @@ export default class Current {
|
|
|
24
24
|
static withAbility(ability: import("./authorization/ability.js").default | undefined, callback: () => Promise<unknown>): Promise<unknown>;
|
|
25
25
|
/**
|
|
26
26
|
* Runs tenant.
|
|
27
|
-
* @returns {
|
|
27
|
+
* @returns {Record<string, unknown> | undefined} - Current tenant.
|
|
28
28
|
*/
|
|
29
|
-
static tenant(): unknown;
|
|
29
|
+
static tenant(): Record<string, unknown> | undefined;
|
|
30
30
|
/**
|
|
31
31
|
* Runs set tenant.
|
|
32
|
-
* @param {
|
|
32
|
+
* @param {Record<string, unknown>} tenant - Tenant.
|
|
33
33
|
* @returns {void} - No return value.
|
|
34
34
|
*/
|
|
35
|
-
static setTenant(tenant: unknown): void;
|
|
35
|
+
static setTenant(tenant: Record<string, unknown>): void;
|
|
36
36
|
/**
|
|
37
37
|
* Runs with tenant.
|
|
38
|
-
* @param {
|
|
38
|
+
* @param {Record<string, unknown>} tenant - Tenant.
|
|
39
39
|
* @param {() => Promise<?>} callback - Callback.
|
|
40
40
|
* @returns {Promise<?>} - Callback result.
|
|
41
41
|
*/
|
|
42
|
-
static withTenant(tenant:
|
|
42
|
+
static withTenant(tenant: Record<string, unknown>, callback: () => Promise<unknown>): Promise<unknown>;
|
|
43
43
|
}
|
|
44
44
|
//# sourceMappingURL=current.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"current.d.ts","sourceRoot":"","sources":["../../src/current.js"],"names":[],"mappings":"AAKA;IACE;;;OAGG;IACH,wBAFa,OAAO,oBAAoB,EAAE,OAAO,CAIhD;IAED;;;OAGG;IACH,kBAFa,OAAO,4BAA4B,EAAE,OAAO,GAAG,SAAS,CAUpE;IAED;;;;OAIG;IACH,2BAHW,OAAO,4BAA4B,EAAE,OAAO,GAAG,SAAS,GACtD,IAAI,CAIhB;IAED;;;;;OAKG;IACH,4BAJW,OAAO,4BAA4B,EAAE,OAAO,GAAG,SAAS,YACxD,MAAM,OAAO,CAAC,OAAC,CAAC,GACd,OAAO,CAAC,OAAC,CAAC,CAItB;IAED;;;OAGG;IACH,iBAFa,
|
|
1
|
+
{"version":3,"file":"current.d.ts","sourceRoot":"","sources":["../../src/current.js"],"names":[],"mappings":"AAKA;IACE;;;OAGG;IACH,wBAFa,OAAO,oBAAoB,EAAE,OAAO,CAIhD;IAED;;;OAGG;IACH,kBAFa,OAAO,4BAA4B,EAAE,OAAO,GAAG,SAAS,CAUpE;IAED;;;;OAIG;IACH,2BAHW,OAAO,4BAA4B,EAAE,OAAO,GAAG,SAAS,GACtD,IAAI,CAIhB;IAED;;;;;OAKG;IACH,4BAJW,OAAO,4BAA4B,EAAE,OAAO,GAAG,SAAS,YACxD,MAAM,OAAO,CAAC,OAAC,CAAC,GACd,OAAO,CAAC,OAAC,CAAC,CAItB;IAED;;;OAGG;IACH,iBAFa,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAU/C;IAED;;;;OAIG;IACH,yBAHW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrB,IAAI,CAIhB;IAED;;;;;OAKG;IACH,0BAJW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YACvB,MAAM,OAAO,CAAC,OAAC,CAAC,GACd,OAAO,CAAC,OAAC,CAAC,CAItB;CACF"}
|
package/build/src/current.js
CHANGED
|
@@ -42,7 +42,7 @@ export default class Current {
|
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
44
44
|
* Runs tenant.
|
|
45
|
-
* @returns {
|
|
45
|
+
* @returns {Record<string, unknown> | undefined} - Current tenant.
|
|
46
46
|
*/
|
|
47
47
|
static tenant() {
|
|
48
48
|
try {
|
|
@@ -56,7 +56,7 @@ export default class Current {
|
|
|
56
56
|
}
|
|
57
57
|
/**
|
|
58
58
|
* Runs set tenant.
|
|
59
|
-
* @param {
|
|
59
|
+
* @param {Record<string, unknown>} tenant - Tenant.
|
|
60
60
|
* @returns {void} - No return value.
|
|
61
61
|
*/
|
|
62
62
|
static setTenant(tenant) {
|
|
@@ -64,7 +64,7 @@ export default class Current {
|
|
|
64
64
|
}
|
|
65
65
|
/**
|
|
66
66
|
* Runs with tenant.
|
|
67
|
-
* @param {
|
|
67
|
+
* @param {Record<string, unknown>} tenant - Tenant.
|
|
68
68
|
* @param {() => Promise<?>} callback - Callback.
|
|
69
69
|
* @returns {Promise<?>} - Callback result.
|
|
70
70
|
*/
|
|
@@ -72,4 +72,4 @@ export default class Current {
|
|
|
72
72
|
return await this.configuration().runWithTenant(tenant, callback);
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jdXJyZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGFBQWEsTUFBTSxvQkFBb0IsQ0FBQTtBQUM5QyxPQUFPLEVBQUMsK0JBQStCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUVsRSxNQUFNLENBQUMsT0FBTyxPQUFPLE9BQU87SUFDMUI7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLGFBQWE7UUFDbEIsT0FBTyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxPQUFPO1FBQ1osSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUNqRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksS0FBSyxZQUFZLCtCQUErQjtnQkFBRSxPQUFNO1lBRTVELE1BQU0sS0FBSyxDQUFBO1FBQ2IsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3pFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxRQUFRO1FBQ3hDLE9BQU8sTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNyRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLE1BQU07UUFDWCxJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQ2hELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVksK0JBQStCO2dCQUFFLE9BQU07WUFFNUQsTUFBTSxLQUFLLENBQUE7UUFDYixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU07UUFDckIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdkUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVE7UUFDdEMsT0FBTyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ25FLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9jb25maWd1cmF0aW9uLmpzXCJcbmltcG9ydCB7Q3VycmVudENvbmZpZ3VyYXRpb25Ob3RTZXRFcnJvcn0gZnJvbSBcIi4vY29uZmlndXJhdGlvbi5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN1cnJlbnQge1xuICAvKipcbiAgICogUnVucyBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IC0gQ3VycmVudCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIGNvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIENvbmZpZ3VyYXRpb24uY3VycmVudCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhYmlsaXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9hdXRob3JpemF0aW9uL2FiaWxpdHkuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBDdXJyZW50IGFiaWxpdHkuXG4gICAqL1xuICBzdGF0aWMgYWJpbGl0eSgpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbigpLmdldEN1cnJlbnRBYmlsaXR5KClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ3VycmVudENvbmZpZ3VyYXRpb25Ob3RTZXRFcnJvcikgcmV0dXJuXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IGFiaWxpdHkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9hdXRob3JpemF0aW9uL2FiaWxpdHkuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYWJpbGl0eSAtIEFiaWxpdHkuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBzZXRBYmlsaXR5KGFiaWxpdHkpIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24oKS5nZXRFbnZpcm9ubWVudEhhbmRsZXIoKS5zZXRDdXJyZW50QWJpbGl0eShhYmlsaXR5KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd2l0aCBhYmlsaXR5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFiaWxpdHkgLSBBYmlsaXR5LlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8Pz59IGNhbGxiYWNrIC0gQ2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPD8+
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jdXJyZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGFBQWEsTUFBTSxvQkFBb0IsQ0FBQTtBQUM5QyxPQUFPLEVBQUMsK0JBQStCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUVsRSxNQUFNLENBQUMsT0FBTyxPQUFPLE9BQU87SUFDMUI7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLGFBQWE7UUFDbEIsT0FBTyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxPQUFPO1FBQ1osSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUNqRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksS0FBSyxZQUFZLCtCQUErQjtnQkFBRSxPQUFNO1lBRTVELE1BQU0sS0FBSyxDQUFBO1FBQ2IsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3pFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxRQUFRO1FBQ3hDLE9BQU8sTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNyRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLE1BQU07UUFDWCxJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQ2hELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVksK0JBQStCO2dCQUFFLE9BQU07WUFFNUQsTUFBTSxLQUFLLENBQUE7UUFDYixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU07UUFDckIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdkUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVE7UUFDdEMsT0FBTyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ25FLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9jb25maWd1cmF0aW9uLmpzXCJcbmltcG9ydCB7Q3VycmVudENvbmZpZ3VyYXRpb25Ob3RTZXRFcnJvcn0gZnJvbSBcIi4vY29uZmlndXJhdGlvbi5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN1cnJlbnQge1xuICAvKipcbiAgICogUnVucyBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IC0gQ3VycmVudCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIGNvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIENvbmZpZ3VyYXRpb24uY3VycmVudCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhYmlsaXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9hdXRob3JpemF0aW9uL2FiaWxpdHkuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBDdXJyZW50IGFiaWxpdHkuXG4gICAqL1xuICBzdGF0aWMgYWJpbGl0eSgpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbigpLmdldEN1cnJlbnRBYmlsaXR5KClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ3VycmVudENvbmZpZ3VyYXRpb25Ob3RTZXRFcnJvcikgcmV0dXJuXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IGFiaWxpdHkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9hdXRob3JpemF0aW9uL2FiaWxpdHkuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYWJpbGl0eSAtIEFiaWxpdHkuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBzZXRBYmlsaXR5KGFiaWxpdHkpIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24oKS5nZXRFbnZpcm9ubWVudEhhbmRsZXIoKS5zZXRDdXJyZW50QWJpbGl0eShhYmlsaXR5KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd2l0aCBhYmlsaXR5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFiaWxpdHkgLSBBYmlsaXR5LlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8Pz59IGNhbGxiYWNrIC0gQ2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPD8+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyB3aXRoQWJpbGl0eShhYmlsaXR5LCBjYWxsYmFjaykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24oKS5ydW5XaXRoQWJpbGl0eShhYmlsaXR5LCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRlbmFudC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkfSAtIEN1cnJlbnQgdGVuYW50LlxuICAgKi9cbiAgc3RhdGljIHRlbmFudCgpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbigpLmdldEN1cnJlbnRUZW5hbnQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDdXJyZW50Q29uZmlndXJhdGlvbk5vdFNldEVycm9yKSByZXR1cm5cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgdGVuYW50LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSB0ZW5hbnQgLSBUZW5hbnQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBzZXRUZW5hbnQodGVuYW50KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uKCkuZ2V0RW52aXJvbm1lbnRIYW5kbGVyKCkuc2V0Q3VycmVudFRlbmFudCh0ZW5hbnQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aXRoIHRlbmFudC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gdGVuYW50IC0gVGVuYW50LlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8Pz59IGNhbGxiYWNrIC0gQ2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPD8+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyB3aXRoVGVuYW50KHRlbmFudCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uKCkucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGNhbGxiYWNrKVxuICB9XG59XG4iXX0=
|
|
@@ -280,6 +280,14 @@ export type AddColumnArgsType = {
|
|
|
280
280
|
index?: boolean | {
|
|
281
281
|
unique: boolean;
|
|
282
282
|
} | undefined;
|
|
283
|
+
/**
|
|
284
|
+
* - Alias for maxLength (varchar length limit) on string-like columns.
|
|
285
|
+
*/
|
|
286
|
+
limit?: number | undefined;
|
|
287
|
+
/**
|
|
288
|
+
* - Maximum length for string-like columns (e.g. varchar length).
|
|
289
|
+
*/
|
|
290
|
+
maxLength?: number | undefined;
|
|
283
291
|
/**
|
|
284
292
|
* - Whether the column allows null values.
|
|
285
293
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/database/migration/index.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/database/migration/index.js"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* @property {?} [default] - Default value for the column.
|
|
6
6
|
* @property {object} [foreignKey] - Foreign key definition for the column.
|
|
7
7
|
* @property {boolean | {unique: boolean}} [index] - Whether to add an index (optionally unique).
|
|
8
|
+
* @property {number} [limit] - Alias for maxLength (varchar length limit) on string-like columns.
|
|
9
|
+
* @property {number} [maxLength] - Maximum length for string-like columns (e.g. varchar length).
|
|
8
10
|
* @property {boolean} [null] - Whether the column allows null values.
|
|
9
11
|
* @property {boolean} [primaryKey] - Whether the column is a primary key.
|
|
10
12
|
* @property {boolean} [unique] - Whether the column enforces uniqueness.
|
|
@@ -483,4 +485,4 @@ export default class VelociousDatabaseMigration {
|
|
|
483
485
|
return exists;
|
|
484
486
|
}
|
|
485
487
|
}
|
|
486
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvbWlncmF0aW9uL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7Ozs7Ozs7O0dBU0c7QUFDSDs7Ozs7R0FLRztBQUNIOzs7OztHQUtHO0FBQ0g7OztHQUdHO0FBQ0g7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDM0UsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxhQUFhLE1BQU0sZ0NBQWdDLENBQUE7QUFDMUQsT0FBTyxTQUFTLE1BQU0sd0JBQXdCLENBQUE7QUFDOUMsTUFBTSxtQkFBb0IsU0FBUSxLQUFLO0NBQUc7QUFFMUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLENBQUE7QUFFNUIsTUFBTSxDQUFDLE9BQU8sT0FBTywwQkFBMEI7SUFDN0M7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxXQUFXLENBQUMsbUJBQW1CO1FBQ3BDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxtQkFBbUIsQ0FBQTtJQUNqRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLHNCQUFzQjtRQUMzQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQTtJQUNsQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxrQkFBa0IsR0FBRyxTQUFTLEVBQUUsRUFBRSxFQUFDO1FBQzdELElBQUksQ0FBQyxrQkFBa0I7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUE7UUFDeEUsSUFBSSxDQUFDLEVBQUU7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBRXpDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxrQkFBa0Is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LEVBQUUsYUFBYSxFQUFFLGFBQWE7UUFDeEQsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUE7SUFDOUUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVM7UUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRTVELE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQWRkQ29sdW1uQXJnc1R5cGUgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZENvbHVtbkFyZ3NUeXBlXG4gKiBAcHJvcGVydHkgez99IFtkZWZhdWx0XSAtIERlZmF1bHQgdmFsdWUgZm9yIHRoZSBjb2x1bW4uXG4gKiBAcHJvcGVydHkge29iamVjdH0gW2ZvcmVpZ25LZXldIC0gRm9yZWlnbiBrZXkgZGVmaW5pdGlvbiBmb3IgdGhlIGNvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IHt1bmlxdWU6IGJvb2xlYW59fSBbaW5kZXhdIC0gV2hldGhlciB0byBhZGQgYW4gaW5kZXggKG9wdGlvbmFsbHkgdW5pcXVlKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW251bGxdIC0gV2hldGhlciB0aGUgY29sdW1uIGFsbG93cyBudWxsIHZhbHVlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3ByaW1hcnlLZXldIC0gV2hldGhlciB0aGUgY29sdW1uIGlzIGEgcHJpbWFyeSBrZXkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1bmlxdWVdIC0gV2hldGhlciB0aGUgY29sdW1uIGVuZm9yY2VzIHVuaXF1ZW5lc3MuXG4gKi9cbi8qKlxuICogQ3JlYXRlVGFibGVJZEFyZ3NUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDcmVhdGVUYWJsZUlkQXJnc1R5cGVcbiAqIEBwcm9wZXJ0eSB7P30gW2RlZmF1bHRdIC0gRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIElEIGNvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdHlwZV0gLSBDb2x1bW4gdHlwZSBmb3IgdGhlIElEIGNvbHVtbi5cbiAqL1xuLyoqXG4gKiBDcmVhdGVUYWJsZUFyZ3NUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDcmVhdGVUYWJsZUFyZ3NUeXBlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZk5vdEV4aXN0c10gLSBTa2lwIGNyZWF0aW9uIGlmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cy5cbiAqIEBwcm9wZXJ0eSB7Q3JlYXRlVGFibGVJZEFyZ3NUeXBlIHwgZmFsc2V9IFtpZF0gLSBJRCBjb2x1bW4gb3B0aW9ucyBvciBmYWxzZSB0byBza2lwIElELlxuICovXG4vKipcbiAqIENyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7KHRhYmxlOiBUYWJsZURhdGEpID0+IHZvaWR9IENyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlXG4gKi9cbi8qKlxuICogTGVnYWN5TG9jYWxEYXRlVGltZXNNaWdyYXRpb25BcmdzVHlwZSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gTGVnYWN5TG9jYWxEYXRlVGltZXNNaWdyYXRpb25BcmdzVHlwZVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IFtjb2x1bW5zQnlUYWJsZV0gLSBFeHBsaWNpdCBkYXRldGltZSBjb2x1bW5zIGtleWVkIGJ5IHRhYmxlIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2xlZ2FjeUxvY2FsT2Zmc2V0TWludXRlc10gLSBVVEMtbWludXMtbG9jYWwgb2Zmc2V0IGluIG1pbnV0ZXMgZm9yIGxlZ2FjeSByb3dzLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3RhYmxlc10gLSBUYWJsZXMgdG8gbWlncmF0ZS4gRGVmYXVsdHMgdG8gYWxsIG5vbi1pbnRlcm5hbCB0YWJsZXMuXG4gKi9cblxuaW1wb3J0IHsgY29udmVydExlZ2FjeURhdGVWYWx1ZVRvVXRjU3RvcmFnZSB9IGZyb20gXCIuLi9kYXRldGltZS1zdG9yYWdlLmpzXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uLy4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQgVGFibGVEYXRhIGZyb20gXCIuLi90YWJsZS1kYXRhL2luZGV4LmpzXCJcbmNsYXNzIE5vdEltcGxlbWVudGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG5leHBvcnQge05vdEltcGxlbWVudGVkRXJyb3J9XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlTWlncmF0aW9uIHtcbiAgLyoqXG4gICAqIFJ1bnMgb24gZGF0YWJhc2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBkYXRhYmFzZUlkZW50aWZpZXJzIC0gRGF0YWJhc2UgaWRlbnRpZmllcnMuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBvbkRhdGFiYXNlcyhkYXRhYmFzZUlkZW50aWZpZXJzKSB7XG4gICAgdGhpcy5fZGF0YWJhc2VJZGVudGlmaWVycyA9IGRhdGFiYXNlSWRlbnRpZmllcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBkYXRhYmFzZSBpZGVudGlmaWVycy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSAtIFRoZSBkYXRhYmFzZSBpZGVudGlmaWVycy5cbiAgICovXG4gIHN0YXRpYyBnZXREYXRhYmFzZUlkZW50aWZpZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXJzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmRhdGFiYXNlSWRlbnRpZmllciAtIERhdGFiYXNlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MuZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGRhdGFiYXNlSWRlbnRpZmllciA9IFwiZGVmYXVsdFwiLCBkYn0pIHtcbiAgICBpZiAoIWRhdGFiYXNlSWRlbnRpZmllcikgdGhyb3cgbmV3IEVycm9yKFwiTm8gZGF0YWJhc2UgaWRlbnRpZmllciBnaXZlblwiKVxuICAgIGlmICghZGIpIHRocm93IG5ldyBFcnJvcihcIk5vICdkYicgZ2l2ZW5cIilcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXIgPSBkYXRhYmFzZUlkZW50aWZpZXJcbiAgICB0aGlzLl9kYiA9IGRiXG4gIH1cblxuICBfZ2V0RGF0YWJhc2VJZGVudGlmaWVyKCkge1xuICAgIGlmICghdGhpcy5fZGF0YWJhc2VJZGVudGlmaWVyKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBkYXRhYmFzZSBpZGVudGlmaWVyIHNldFwiKVxuXG4gICAgcmV0dXJuIHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllclxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGRyaXZlci5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSAtIFRoZSBkcml2ZXIuXG4gICAqL1xuICBnZXREcml2ZXIoKSB7IHJldHVybiB0aGlzLl9kYiB9XG4gIGNvbm5lY3Rpb24oKSB7IHJldHVybiB0aGlzLmdldERyaXZlcigpIH1cblxuICBhc3luYyBjaGFuZ2UoKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCInY2hhbmdlJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIGFzeW5jIHVwKCkge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiJ2NoYW5nZScgbm90IGltcGxlbWVudGVkXCIpXG4gIH1cblxuICBhc3luYyBkb3duKCkge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiJ2NoYW5nZScgbm90IGltcGxlbWVudGVkXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBleGVjdXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gU1FMIHN0cmluZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLlF1ZXJ5UmVzdWx0VHlwZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgZXhlY3V0ZS5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoc3FsKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdGlvbigpLnF1ZXJ5KHNxbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uVHlwZSAtIENvbHVtbiB0eXBlLlxuICAgKiBAcGFyYW0ge0FkZENvbHVtbkFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGFkZENvbHVtbih0YWJsZU5hbWUsIGNvbHVtbk5hbWUsIGNvbHVtblR5cGUsIGFyZ3MpIHtcbiAgICBpZiAoIWNvbHVtblR5cGUpIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbHVtbiB0eXBlIGdpdmVuXCIpXG5cbiAgICBjb25zdCB0YWJsZUNvbHVtbkFyZ3MgPSBPYmplY3QuYXNzaWduKHtpc05ld0NvbHVtbjogdHJ1ZSwgdHlwZTogY29sdW1uVHlwZX0sIGFyZ3MpXG4gICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFRhYmxlRGF0YSh0YWJsZU5hbWUpXG5cbiAgICB0YWJsZURhdGEuYWRkQ29sdW1uKGNvbHVtbk5hbWUsIHRhYmxlQ29sdW1uQXJncylcblxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmFsdGVyVGFibGVTUUxzKHRhYmxlRGF0YSlcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbW92ZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQ29sdW1uKHRhYmxlTmFtZSwgY29sdW1uTmFtZSkge1xuICAgIGNvbnN0IHRhYmxlQ29sdW1uQXJncyA9IE9iamVjdC5hc3NpZ24oe2Ryb3BDb2x1bW46IHRydWV9KVxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IG5ldyBUYWJsZURhdGEodGFibGVOYW1lKVxuXG4gICAgdGFibGVEYXRhLmFkZENvbHVtbihjb2x1bW5OYW1lLCB0YWJsZUNvbHVtbkFyZ3MpXG5cbiAgICBjb25zdCBzcWxzID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5hbHRlclRhYmxlU1FMcyh0YWJsZURhdGEpXG5cbiAgICBmb3IgKGNvbnN0IHNxbCBvZiBzcWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLnF1ZXJ5KHNxbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkSW5kZXhBcmdzVHlwZSB0eXBlLlxuICAgKiBAdHlwZWRlZiB7b2JqZWN0fSBBZGRJbmRleEFyZ3NUeXBlXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lmTm90RXhpc3RzXSAtIFNraXAgY3JlYXRpb24gaWYgdGhlIGluZGV4IGFscmVhZHkgZXhpc3RzLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gRXhwbGljaXQgaW5kZXggbmFtZSB0byB1c2UuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VuaXF1ZV0gLSBXaGV0aGVyIHRoZSBpbmRleCBzaG91bGQgYmUgdW5pcXVlLlxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGluZGV4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBpbXBvcnQoXCIuLi90YWJsZS1kYXRhL3RhYmxlLWNvbHVtbi5qc1wiKS5kZWZhdWx0Pn0gY29sdW1ucyAtIENvbHVtbiBuYW1lIG9yIGFycmF5IG9mIGNvbHVtbiBuYW1lcy5cbiAgICogQHBhcmFtIHtBZGRJbmRleEFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGFkZEluZGV4KHRhYmxlTmFtZSwgY29sdW1ucywgYXJncykge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb2x1bW5zID0gdHlwZW9mIGNvbHVtbnMgPT09IFwic3RyaW5nXCIgPyBbY29sdW1uc10gOiBjb2x1bW5zXG4gICAgY29uc3QgY3JlYXRlSW5kZXhBcmdzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHtcbiAgICAgICAgY29sdW1uczogbm9ybWFsaXplZENvbHVtbnMsXG4gICAgICAgIHRhYmxlTmFtZVxuICAgICAgfSxcbiAgICAgIGFyZ3NcbiAgICApXG4gICAgY29uc3Qgc3FscyA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuY3JlYXRlSW5kZXhTUUxzKGNyZWF0ZUluZGV4QXJncylcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRGb3JlaWduS2V5QXJnc1R5cGUgdHlwZS5cbiAgICogQHR5cGVkZWYge29iamVjdH0gQWRkRm9yZWlnbktleUFyZ3NUeXBlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29sdW1uTmFtZV0gLSBPdmVycmlkZSB0aGUgZGVyaXZlZCBGSyBjb2x1bW4gbmFtZSAoZGVmYXVsdDogYCR7cmVmZXJlbmNlX3VuZGVyc2NvcmVkfV9pZGApLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gT3ZlcnJpZGUgdGhlIGRlcml2ZWQgY29uc3RyYWludCBuYW1lIChkZWZhdWx0OiBgZmtfJHt0YWJsZU5hbWV9XyR7cmVmZXJlbmNlTmFtZX1gKS5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtyZWZlcmVuY2VkQ29sdW1uTmFtZV0gLSBPdmVycmlkZSB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSAoZGVmYXVsdDogYGlkYCkuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVmZXJlbmNlZFRhYmxlTmFtZV0gLSBPdmVycmlkZSB0aGUgZGVyaXZlZCByZWZlcmVuY2VkIHRhYmxlIChkZWZhdWx0OiBwbHVyYWxpemVkIGByZWZlcmVuY2VOYW1lYCkuXG4gICAqL1xuICAvKipcbiAgICogUnVucyBhZGQgZm9yZWlnbiBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSB0aGUgRksgbGl2ZXMgb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2VOYW1lIC0gU2luZ3VsYXIgcmVmZXJlbmNlIG5hbWUuIERlZmF1bHRzIGRlcml2ZVxuICAgKiAgIHRoZSBGSyBjb2x1bW4gYXMgYCR7cmVmZXJlbmNlfV9pZGAsIHRoZSByZWZlcmVuY2VkIHRhYmxlIGJ5IHBsdXJhbGl6aW5nXG4gICAqICAgdGhlIHJlZmVyZW5jZSwgdGhlIHJlZmVyZW5jZWQgY29sdW1uIGFzIGBpZGAsIGFuZCB0aGUgY29uc3RyYWludCBuYW1lXG4gICAqICAgYXMgYGZrXyR7dGFibGVOYW1lfV8ke3JlZmVyZW5jZU5hbWV9YC4gT3ZlcnJpZGUgYW55IG9mIHRob3NlIHZpYSBgYXJnc2BcbiAgICogICB3aGVuIHRoZSBzY2hlbWEgZG9lc24ndCBmb2xsb3cgdGhlIGNvbnZlbnRpb24uXG4gICAqIEBwYXJhbSB7QWRkRm9yZWlnbktleUFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25hbCBvdmVycmlkZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBhZGRGb3JlaWduS2V5KHRhYmxlTmFtZSwgcmVmZXJlbmNlTmFtZSwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge2NvbHVtbk5hbWUsIG5hbWUsIHJlZmVyZW5jZWRDb2x1bW5OYW1lLCByZWZlcmVuY2VkVGFibGVOYW1lLCAuLi5yZXN0QXJnc30gPSBhcmdzXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgY29uc3QgcmVmZXJlbmNlTmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUocmVmZXJlbmNlTmFtZSlcbiAgICBjb25zdCByZXNvbHZlZFJlZmVyZW5jZWRUYWJsZU5hbWUgPSByZWZlcmVuY2VkVGFibGVOYW1lIHx8IGluZmxlY3Rpb24ucGx1cmFsaXplKHJlZmVyZW5jZU5hbWVVbmRlcnNjb3JlKVxuICAgIGNvbnN0IHJlc29sdmVkQ29sdW1uTmFtZSA9IGNvbHVtbk5hbWUgfHwgYCR7cmVmZXJlbmNlTmFtZVVuZGVyc2NvcmV9X2lkYFxuICAgIGNvbnN0IHJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSByZWZlcmVuY2VkQ29sdW1uTmFtZSB8fCBcImlkXCJcbiAgICBjb25zdCByZXNvbHZlZE5hbWUgPSBuYW1lIHx8IGBma18ke3RhYmxlTmFtZX1fJHtyZWZlcmVuY2VOYW1lfWBcblxuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuYWRkRm9yZWlnbktleShcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHJlc29sdmVkQ29sdW1uTmFtZSxcbiAgICAgIHJlc29sdmVkUmVmZXJlbmNlZFRhYmxlTmFtZSxcbiAgICAgIHJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWUsXG4gICAgICB7XG4gICAgICAgIGlzTmV3Rm9yZWlnbktleTogdHJ1ZSxcbiAgICAgICAgbmFtZTogcmVzb2x2ZWROYW1lXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2VOYW1lIC0gUmVmZXJlbmNlIG5hbWUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZm9yZWlnbktleV0gLSBXaGV0aGVyIGZvcmVpZ24ga2V5LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLm51bGxdIC0gV2hldGhlciBudWxsYWJsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnR5cGVdIC0gVHlwZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnVuaXF1ZV0gLSBXaGV0aGVyIHVuaXF1ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGFkZFJlZmVyZW5jZSh0YWJsZU5hbWUsIHJlZmVyZW5jZU5hbWUsIGFyZ3MpIHtcbiAgICBjb25zdCB7Zm9yZWlnbktleSwgbnVsbDogbnVsbGFibGUsIHR5cGUsIHVuaXF1ZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBgJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUocmVmZXJlbmNlTmFtZSl9X2lkYFxuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGNvbnN0IGNvbHVtblR5cGUgPSB0eXBlIHx8IFwiaW50ZWdlclwiXG4gICAgY29uc3QgY29sdW1uQXJncyA9IG51bGxhYmxlICE9PSB1bmRlZmluZWQgPyB7bnVsbDogbnVsbGFibGV9IDogdW5kZWZpbmVkXG5cbiAgICBhd2FpdCB0aGlzLmFkZENvbHVtbih0YWJsZU5hbWUsIGNvbHVtbk5hbWUsIGNvbHVtblR5cGUsIGNvbHVtbkFyZ3MpXG4gICAgYXdhaXQgdGhpcy5hZGRJbmRleCh0YWJsZU5hbWUsIFtjb2x1bW5OYW1lXSwge3VuaXF1ZTogdW5pcXVlfSlcblxuICAgIGlmIChmb3JlaWduS2V5KSB7XG4gICAgICBhd2FpdCB0aGlzLmFkZEZvcmVpZ25LZXkodGFibGVOYW1lLCByZWZlcmVuY2VOYW1lKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbW92ZSByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmZXJlbmNlTmFtZSAtIFJlZmVyZW5jZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlUmVmZXJlbmNlKHRhYmxlTmFtZSwgcmVmZXJlbmNlTmFtZSkge1xuICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBgJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUocmVmZXJlbmNlTmFtZSl9X2lkYFxuXG4gICAgdGhpcy5yZW1vdmVDb2x1bW4odGFibGVOYW1lLCBjb2x1bW5OYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2hhbmdlIGNvbHVtbiBudWxsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtbk5hbWUgLSBDb2x1bW4gbmFtZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBudWxsYWJsZSAtIFdoZXRoZXIgbnVsbGFibGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjaGFuZ2VDb2x1bW5OdWxsKHRhYmxlTmFtZSwgY29sdW1uTmFtZSwgbnVsbGFibGUpIHtcbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZ2V0VGFibGVCeU5hbWUodGFibGVOYW1lKVxuXG4gICAgaWYgKCF0YWJsZSkgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gZG9lcyBub3QgZXhpc3RgKVxuXG4gICAgY29uc3QgY29sdW1uID0gYXdhaXQgdGFibGUuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWUpXG5cbiAgICBpZiAoIWNvbHVtbikgdGhyb3cgbmV3IEVycm9yKGBDb2x1bW4gJHtjb2x1bW5OYW1lfSBkb2VzIG5vdCBleGlzdCBpbiB0YWJsZSAke3RhYmxlTmFtZX1gKVxuXG4gICAgYXdhaXQgY29sdW1uLmNoYW5nZU51bGxhYmxlKG51bGxhYmxlKVxuICB9XG5cbiAgLyoqXG4gICAqIE1pZ3JhdGVzIGxlZ2FjeSB0aW1lem9uZS1sZXNzIGxvY2FsIGRhdGV0aW1lIHJvd3MgaW50byBVVEMgZGF0ZXRpbWUgc3RvcmFnZS5cbiAgICogTmV3IFNRTGl0ZSBVVEMgcm93cyBpbmNsdWRlIGEgdGltZXpvbmUgc3VmZml4IGFuZCBhcmUgc2tpcHBlZC5cbiAgICogQHBhcmFtIHtMZWdhY3lMb2NhbERhdGVUaW1lc01pZ3JhdGlvbkFyZ3NUeXBlfSBbYXJnc10gLSBNaWdyYXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIG1pZ3JhdGVMZWdhY3lMb2NhbERhdGVUaW1lc1RvVXRjU3RvcmFnZShhcmdzID0ge30pIHtcbiAgICBjb25zdCB7Y29sdW1uc0J5VGFibGUsIGxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlcywgdGFibGVzLCAuLi5yZXN0QXJnc30gPSBhcmdzXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgY29uc3QgdGFibGVOYW1lcyA9IGF3YWl0IHRoaXMuX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzVGFibGVOYW1lcyh0YWJsZXMpXG5cbiAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU5hbWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLl9taWdyYXRlTGVnYWN5TG9jYWxEYXRlVGltZXNUYWJsZSh7XG4gICAgICAgIGNvbHVtbnNCeVRhYmxlLFxuICAgICAgICBsZWdhY3lMb2NhbE9mZnNldE1pbnV0ZXMsXG4gICAgICAgIHRhYmxlTmFtZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGFibGUgbmFtZXMgZm9yIGEgbGVnYWN5IGxvY2FsIGRhdGV0aW1lIG1pZ3JhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IHVuZGVmaW5lZH0gdGFibGVzIC0gRXhwbGljaXQgdGFibGUgbmFtZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBUYWJsZSBuYW1lcy5cbiAgICovXG4gIGFzeW5jIF9sZWdhY3lMb2NhbERhdGVUaW1lc1RhYmxlTmFtZXModGFibGVzKSB7XG4gICAgaWYgKHRhYmxlcykgcmV0dXJuIHRhYmxlc1xuXG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldERyaXZlcigpLmdldFRhYmxlcygpKVxuICAgICAgLm1hcCgodGFibGUpID0+IHRhYmxlLmdldE5hbWUoKSlcbiAgICAgIC5maWx0ZXIoKHRhYmxlTmFtZSkgPT4gdGFibGVOYW1lICE9IFwic2NoZW1hX21pZ3JhdGlvbnNcIiAmJiAhdGFibGVOYW1lLnN0YXJ0c1dpdGgoXCJzcWxpdGVfXCIpKVxuICB9XG5cbiAgLyoqXG4gICAqIE1pZ3JhdGVzIG9uZSB0YWJsZSdzIGxlZ2FjeSBsb2NhbCBkYXRldGltZSB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCB1bmRlZmluZWR9IGFyZ3MuY29sdW1uc0J5VGFibGUgLSBFeHBsaWNpdCBjb2x1bW5zIGtleWVkIGJ5IHRhYmxlLlxuICAgKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZH0gYXJncy5sZWdhY3lMb2NhbE9mZnNldE1pbnV0ZXMgLSBVVEMtbWludXMtbG9jYWwgb2Zmc2V0IGluIG1pbnV0ZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfbWlncmF0ZUxlZ2FjeUxvY2FsRGF0ZVRpbWVzVGFibGUoe2NvbHVtbnNCeVRhYmxlLCBsZWdhY3lMb2NhbE9mZnNldE1pbnV0ZXMsIHRhYmxlTmFtZX0pIHtcbiAgICBjb25zdCBkcml2ZXIgPSB0aGlzLmdldERyaXZlcigpXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBkcml2ZXIuZ2V0VGFibGVCeU5hbWVPckZhaWwodGFibGVOYW1lKVxuICAgIGNvbnN0IGNvbHVtbnMgPSBhd2FpdCB0aGlzLl9sZWdhY3lMb2NhbERhdGVUaW1lc0NvbHVtbnMoe2NvbHVtbnNCeVRhYmxlLCB0YWJsZX0pXG5cbiAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgY29uc3QgcHJpbWFyeUtleUNvbHVtbiA9IGF3YWl0IHRoaXMuX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzUHJpbWFyeUtleSh0YWJsZSlcbiAgICBjb25zdCBzZWxlY3RlZENvbHVtbnMgPSBbcHJpbWFyeUtleUNvbHVtbiwgLi4uY29sdW1uc11cbiAgICBjb25zdCBzZWxlY3RTcWwgPSBzZWxlY3RlZENvbHVtbnNcbiAgICAgIC5tYXAoKGNvbHVtbk5hbWUpID0+IGRyaXZlci5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKSlcbiAgICAgIC5qb2luKFwiLCBcIilcbiAgICBjb25zdCByb3dzID0gYXdhaXQgZHJpdmVyLnF1ZXJ5KGBTRUxFQ1QgJHtzZWxlY3RTcWx9IEZST00gJHtkcml2ZXIucXVvdGVUYWJsZSh0YWJsZU5hbWUpfWApXG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbk5hbWUgb2YgY29sdW1ucykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvd1tjb2x1bW5OYW1lXVxuICAgICAgICBjb25zdCBjb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRMZWdhY3lEYXRlVmFsdWVUb1V0Y1N0b3JhZ2UodmFsdWUsIHtcbiAgICAgICAgICBkYXRhYmFzZVR5cGU6IGRyaXZlci5nZXRUeXBlKCksXG4gICAgICAgICAgbGVnYWN5TG9jYWxPZmZzZXRNaW51dGVzXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGNvbnZlcnRlZFZhbHVlID09PSB2YWx1ZSkgY29udGludWVcblxuICAgICAgICBhd2FpdCBkcml2ZXIucXVlcnkoYFxuICAgICAgICAgIFVQREFURSAke2RyaXZlci5xdW90ZVRhYmxlKHRhYmxlTmFtZSl9XG4gICAgICAgICAgU0VUICR7ZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpfSA9ICR7ZHJpdmVyLnF1b3RlKGNvbnZlcnRlZFZhbHVlKX1cbiAgICAgICAgICBXSEVSRSAke2RyaXZlci5xdW90ZUNvbHVtbihwcmltYXJ5S2V5Q29sdW1uKX0gPSAke2RyaXZlci5xdW90ZShyb3dbcHJpbWFyeUtleUNvbHVtbl0pfVxuICAgICAgICBgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBkYXRlLWxpa2UgY29sdW1ucyBmb3Igb25lIHRhYmxlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkfSBhcmdzLmNvbHVtbnNCeVRhYmxlIC0gRXhwbGljaXQgY29sdW1ucyBrZXllZCBieSB0YWJsZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdH0gYXJncy50YWJsZSAtIFRhYmxlIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gRGF0ZS1saWtlIGNvbHVtbiBuYW1lcy5cbiAgICovXG4gIGFzeW5jIF9sZWdhY3lMb2NhbERhdGVUaW1lc0NvbHVtbnMoe2NvbHVtbnNCeVRhYmxlLCB0YWJsZX0pIHtcbiAgICBjb25zdCBleHBsaWNpdENvbHVtbnMgPSBjb2x1bW5zQnlUYWJsZT8uW3RhYmxlLmdldE5hbWUoKV1cblxuICAgIGlmIChleHBsaWNpdENvbHVtbnMpIHJldHVybiBleHBsaWNpdENvbHVtbnNcblxuICAgIHJldHVybiAoYXdhaXQgdGFibGUuZ2V0Q29sdW1ucygpKVxuICAgICAgLmZpbHRlcigoY29sdW1uKSA9PiB0aGlzLl9sZWdhY3lMb2NhbERhdGVUaW1lc0NvbHVtbklzRGF0ZUxpa2UoY29sdW1uKSlcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmdldE5hbWUoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIGNvbHVtbiBzaG91bGQgYmUgaW5jbHVkZWQgYnkgZGVmYXVsdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1uLmpzXCIpLmRlZmF1bHR9IGNvbHVtbiAtIENvbHVtbiBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgY29sdW1uIGlzIGRhdGUtbGlrZS5cbiAgICovXG4gIF9sZWdhY3lMb2NhbERhdGVUaW1lc0NvbHVtbklzRGF0ZUxpa2UoY29sdW1uKSB7XG4gICAgY29uc3QgY29sdW1uVHlwZSA9IGNvbHVtbi5nZXRUeXBlKCkudG9Mb3dlckNhc2UoKVxuXG4gICAgcmV0dXJuIGNvbHVtblR5cGUuaW5jbHVkZXMoXCJkYXRlXCIpIHx8IGNvbHVtblR5cGUuaW5jbHVkZXMoXCJ0aW1lc3RhbXBcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgc2luZ2xlIHByaW1hcnkga2V5IGNvbHVtbiBmb3Igcm93IHVwZGF0ZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLXRhYmxlLmpzXCIpLmRlZmF1bHR9IHRhYmxlIC0gVGFibGUgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gUHJpbWFyeSBrZXkgY29sdW1uIG5hbWUuXG4gICAqL1xuICBhc3luYyBfbGVnYWN5TG9jYWxEYXRlVGltZXNQcmltYXJ5S2V5KHRhYmxlKSB7XG4gICAgY29uc3QgcHJpbWFyeUtleUNvbHVtbnMgPSAoYXdhaXQgdGFibGUuZ2V0Q29sdW1ucygpKS5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLmdldFByaW1hcnlLZXkoKSlcblxuICAgIGlmIChwcmltYXJ5S2V5Q29sdW1ucy5sZW5ndGggIT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IG9uZSBwcmltYXJ5IGtleSBvbiAke3RhYmxlLmdldE5hbWUoKX0gYnV0IGZvdW5kICR7cHJpbWFyeUtleUNvbHVtbnMubGVuZ3RofWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHByaW1hcnlLZXlDb2x1bW5zWzBdLmdldE5hbWUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY29sdW1uIGV4aXN0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFJlc29sdmVzIHdpdGggV2hldGhlciBjb2x1bW4gZXhpc3RzLlxuICAgKi9cbiAgYXN5bmMgY29sdW1uRXhpc3RzKHRhYmxlTmFtZSwgY29sdW1uTmFtZSkge1xuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5nZXRUYWJsZUJ5TmFtZSh0YWJsZU5hbWUpXG5cbiAgICBpZiAodGFibGUpIHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHRhYmxlLmdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lKVxuXG4gICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEJvb2xlYW4oZmFsc2UpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgZGF0YWJhc2Ugc2NoZW1hIGZvciBhIGdhcC1sZXNzIHBvc2l0aW9uYWwgbGlzdC4gQWRkcyB0aGVcbiAgICogcG9zaXRpb24gY29sdW1uIChJTlQgTk9UIE5VTEwpIGlmIGFic2VudCBhbmQgY3JlYXRlcyBhIFVOSVFVRSBpbmRleCBvblxuICAgKiAoc2NvcGUsIHBvc2l0aW9uKS4gVGhpcyBpcyB0aGUgc2NoZW1hLXNpZGUgY291bnRlcnBhcnQgb2ZcbiAgICogYE1vZGVsLmFjdHNBc0xpc3QoKWAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcG9zaXRpb25Db2x1bW4gLSBDb2x1bW4gbmFtZSBmb3IgdGhlIHBvc2l0aW9uIChlLmcuIFwicm93X251bWJlclwiKS5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5zY29wZSAtIENvbHVtbiBuYW1lIGZvciB0aGUgc2NvcGUgKGUuZy4gXCJib2FyZF9jb2x1bW5faWRcIikuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgYWRkQWN0c0FzTGlzdCh0YWJsZU5hbWUsIHBvc2l0aW9uQ29sdW1uLCB7c2NvcGV9KSB7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5jb2x1bW5FeGlzdHModGFibGVOYW1lLCBwb3NpdGlvbkNvbHVtbikpKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkZENvbHVtbih0YWJsZU5hbWUsIHBvc2l0aW9uQ29sdW1uLCBcImludGVnZXJcIiwge251bGw6IGZhbHNlfSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5jaGFuZ2VDb2x1bW5OdWxsKHRhYmxlTmFtZSwgcG9zaXRpb25Db2x1bW4sIGZhbHNlKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuYWRkSW5kZXgodGFibGVOYW1lLCBbc2NvcGUsIHBvc2l0aW9uQ29sdW1uXSwge3VuaXF1ZTogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggZGVmYXVsdCBvcHRpb25zLlxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGFibGVDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggZXhwbGljaXQgb3B0aW9ucy5cbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge0NyZWF0ZVRhYmxlQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtDcmVhdGVUYWJsZUNhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIGNyZWF0ZSB0YWJsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGFibGVBcmdzVHlwZSB8IENyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlfSBhcmcxIC0gQXJnMS5cbiAgICogQHBhcmFtIHtDcmVhdGVUYWJsZUNhbGxiYWNrVHlwZSB8IHVuZGVmaW5lZH0gW2FyZzJdIC0gQXJnMi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVRhYmxlKHRhYmxlTmFtZSwgYXJnMSwgYXJnMikge1xuICAgIGxldCBhcmdzXG4gICAgbGV0IGNhbGxiYWNrXG5cbiAgICBpZiAodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhcmdzID0ge31cbiAgICAgIGNhbGxiYWNrID0gYXJnMVxuICAgIH0gZWxzZSB7XG4gICAgICBhcmdzID0gYXJnMVxuICAgICAgY2FsbGJhY2sgPSBhcmcyXG4gICAgfVxuXG4gICAgY29uc3Qge2lkID0ge30sIGlmTm90RXhpc3RzID0gZmFsc2UsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICBjb25zdCBkcml2ZXIgPSB0aGlzLmdldERyaXZlcigpXG4gICAgY29uc3QgZGVmYXVsdFByaW1hcnlLZXlUeXBlID0gZHJpdmVyLnByaW1hcnlLZXlUeXBlKClcbiAgICBsZXQgaWREZWZhdWx0LCBpZFR5cGUsIHJlc3RBcmdzSWRcblxuICAgIGlmIChpZCAhPT0gZmFsc2UpIHtcbiAgICAgICh7ZGVmYXVsdDogaWREZWZhdWx0LCB0eXBlOiBpZFR5cGUsIC4uLnJlc3RBcmdzSWR9ID0gaWQpXG5cbiAgICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3NJZClcbiAgICB9XG5cbiAgICBpZiAoIWlkVHlwZSkge1xuICAgICAgaWRUeXBlID0gZGVmYXVsdFByaW1hcnlLZXlUeXBlXG4gICAgfVxuICAgIGNvbnN0IGRyaXZlclN1cHBvcnRzRGVmYXVsdFVVSUQgPSBkcml2ZXIuc3VwcG9ydHNEZWZhdWx0UHJpbWFyeUtleVVVSUQ/LigpXG4gICAgY29uc3QgbG93ZXJJZFR5cGUgPSBpZFR5cGU/LnRvTG93ZXJDYXNlKClcbiAgICBjb25zdCBpc1VVSURQcmltYXJ5S2V5ID0gbG93ZXJJZFR5cGUgPT0gXCJ1dWlkXCJcbiAgICBjb25zdCBudW1lcmljQXV0b0luY3JlbWVudFR5cGVzID0gW1wiaW50XCIsIFwiaW50ZWdlclwiLCBcImJpZ2ludFwiLCBcInNtYWxsaW50XCIsIFwidGlueWludFwiXVxuICAgIGxldCBpZEF1dG9JbmNyZW1lbnQgPSBudW1lcmljQXV0b0luY3JlbWVudFR5cGVzLmluY2x1ZGVzKGxvd2VySWRUeXBlIHx8IFwiXCIpXG5cbiAgICBpZiAoaXNVVUlEUHJpbWFyeUtleSkge1xuICAgICAgaWRBdXRvSW5jcmVtZW50ID0gZmFsc2VcblxuICAgICAgaWYgKGRyaXZlclN1cHBvcnRzRGVmYXVsdFVVSUQpIHtcbiAgICAgICAgaWYgKGlkRGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWREZWZhdWx0ID0gKCkgPT4gXCJVVUlEKClcIlxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlkRGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIExldCBhcHBsaWNhdGlvbiBjb2RlIGFzc2lnbiBVVUlEcyAoc2VlIERhdGFiYXNlUmVjb3JkLmluc2VydCkgd2hlbiB0aGUgZHJpdmVyIGNhbid0IGRvIGl0LlxuICAgICAgICBpZERlZmF1bHQgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICAgIC8vIElmIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQgVVVJRCgpIGJ1dCB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgc2V0IGEgZGVmYXVsdCwgcmVzcGVjdCBpdC5cbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZURhdGEgPSBuZXcgVGFibGVEYXRhKHRhYmxlTmFtZSwge2lmTm90RXhpc3RzLCBwcmltYXJ5S2V5VHlwZTogZGVmYXVsdFByaW1hcnlLZXlUeXBlfSlcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBpZiAoIShpZFR5cGUgaW4gdGFibGVEYXRhKSkgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBwcmltYXJ5IGtleSB0eXBlOiAke2lkVHlwZX1gKVxuXG4gICAgaWYgKGlkICE9PSBmYWxzZSkge1xuICAgICAgdGFibGVEYXRhLmFkZENvbHVtbihcImlkXCIsIHthdXRvSW5jcmVtZW50OiBpZEF1dG9JbmNyZW1lbnQsIGRlZmF1bHQ6IGlkRGVmYXVsdCwgbnVsbDogZmFsc2UsIHByaW1hcnlLZXk6IHRydWUsIHR5cGU6IGlkVHlwZX0pXG4gICAgfVxuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayh0YWJsZURhdGEpXG4gICAgfVxuXG4gICAgY29uc3Qgc3FscyA9IGF3YWl0IGRyaXZlci5jcmVhdGVUYWJsZVNxbCh0YWJsZURhdGEpXG5cbiAgICBmb3IgKGNvbnN0IHNxbCBvZiBzcWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLl9kYi5xdWVyeShzcWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZHJvcCB0YWJsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBkcm9wVGFibGUodGFibGVOYW1lKSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5kcm9wVGFibGUodGFibGVOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVuYW1lIGNvbHVtbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvbGRDb2x1bW5OYW1lIC0gUHJldmlvdXMgY29sdW1uIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdDb2x1bW5OYW1lIC0gTmV3IGNvbHVtbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVuYW1lQ29sdW1uKHRhYmxlTmFtZSwgb2xkQ29sdW1uTmFtZSwgbmV3Q29sdW1uTmFtZSkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucmVuYW1lQ29sdW1uKHRhYmxlTmFtZSwgb2xkQ29sdW1uTmFtZSwgbmV3Q29sdW1uTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRhYmxlIGV4aXN0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFJlc29sdmVzIHdpdGggV2hldGhlciB0YWJsZSBleGlzdHMuXG4gICAqL1xuICBhc3luYyB0YWJsZUV4aXN0cyh0YWJsZU5hbWUpIHtcbiAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLnRhYmxlRXhpc3RzKHRhYmxlTmFtZSlcblxuICAgIHJldHVybiBleGlzdHNcbiAgfVxufVxuIl19
|
|
488
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvbWlncmF0aW9uL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7Ozs7Ozs7Ozs7R0FXRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7O0dBR0c7QUFDSDs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUMzRSxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLGFBQWEsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUMxRCxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM5QyxNQUFNLG1CQUFvQixTQUFRLEtBQUs7Q0FBRztBQUUxQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsQ0FBQTtBQUU1QixNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUI7UUFDcEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG1CQUFtQixDQUFBO0lBQ2pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFBO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLGtCQUFrQixHQUFHLFNBQVMsRUFBRSxFQUFFLEVBQUM7UUFDN0QsSUFBSSxDQUFDLGtCQUFrQjtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQTtRQUN4RSxJQUFJLENBQUMsRUFBRTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUE7UUFFekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGtCQUFr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QVMsRUFBRSxhQUFhLEVBQUUsYUFBYTtRQUN4RCxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUM5RSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUztRQUN6QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFNUQsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBBZGRDb2x1bW5BcmdzVHlwZSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gQWRkQ29sdW1uQXJnc1R5cGVcbiAqIEBwcm9wZXJ0eSB7P30gW2RlZmF1bHRdIC0gRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGNvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbZm9yZWlnbktleV0gLSBGb3JlaWduIGtleSBkZWZpbml0aW9uIGZvciB0aGUgY29sdW1uLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwge3VuaXF1ZTogYm9vbGVhbn19IFtpbmRleF0gLSBXaGV0aGVyIHRvIGFkZCBhbiBpbmRleCAob3B0aW9uYWxseSB1bmlxdWUpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtsaW1pdF0gLSBBbGlhcyBmb3IgbWF4TGVuZ3RoICh2YXJjaGFyIGxlbmd0aCBsaW1pdCkgb24gc3RyaW5nLWxpa2UgY29sdW1ucy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4TGVuZ3RoXSAtIE1heGltdW0gbGVuZ3RoIGZvciBzdHJpbmctbGlrZSBjb2x1bW5zIChlLmcuIHZhcmNoYXIgbGVuZ3RoKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW251bGxdIC0gV2hldGhlciB0aGUgY29sdW1uIGFsbG93cyBudWxsIHZhbHVlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3ByaW1hcnlLZXldIC0gV2hldGhlciB0aGUgY29sdW1uIGlzIGEgcHJpbWFyeSBrZXkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1bmlxdWVdIC0gV2hldGhlciB0aGUgY29sdW1uIGVuZm9yY2VzIHVuaXF1ZW5lc3MuXG4gKi9cbi8qKlxuICogQ3JlYXRlVGFibGVJZEFyZ3NUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDcmVhdGVUYWJsZUlkQXJnc1R5cGVcbiAqIEBwcm9wZXJ0eSB7P30gW2RlZmF1bHRdIC0gRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIElEIGNvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdHlwZV0gLSBDb2x1bW4gdHlwZSBmb3IgdGhlIElEIGNvbHVtbi5cbiAqL1xuLyoqXG4gKiBDcmVhdGVUYWJsZUFyZ3NUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDcmVhdGVUYWJsZUFyZ3NUeXBlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZk5vdEV4aXN0c10gLSBTa2lwIGNyZWF0aW9uIGlmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cy5cbiAqIEBwcm9wZXJ0eSB7Q3JlYXRlVGFibGVJZEFyZ3NUeXBlIHwgZmFsc2V9IFtpZF0gLSBJRCBjb2x1bW4gb3B0aW9ucyBvciBmYWxzZSB0byBza2lwIElELlxuICovXG4vKipcbiAqIENyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7KHRhYmxlOiBUYWJsZURhdGEpID0+IHZvaWR9IENyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlXG4gKi9cbi8qKlxuICogTGVnYWN5TG9jYWxEYXRlVGltZXNNaWdyYXRpb25BcmdzVHlwZSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gTGVnYWN5TG9jYWxEYXRlVGltZXNNaWdyYXRpb25BcmdzVHlwZVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IFtjb2x1bW5zQnlUYWJsZV0gLSBFeHBsaWNpdCBkYXRldGltZSBjb2x1bW5zIGtleWVkIGJ5IHRhYmxlIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2xlZ2FjeUxvY2FsT2Zmc2V0TWludXRlc10gLSBVVEMtbWludXMtbG9jYWwgb2Zmc2V0IGluIG1pbnV0ZXMgZm9yIGxlZ2FjeSByb3dzLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3RhYmxlc10gLSBUYWJsZXMgdG8gbWlncmF0ZS4gRGVmYXVsdHMgdG8gYWxsIG5vbi1pbnRlcm5hbCB0YWJsZXMuXG4gKi9cblxuaW1wb3J0IHsgY29udmVydExlZ2FjeURhdGVWYWx1ZVRvVXRjU3RvcmFnZSB9IGZyb20gXCIuLi9kYXRldGltZS1zdG9yYWdlLmpzXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uLy4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQgVGFibGVEYXRhIGZyb20gXCIuLi90YWJsZS1kYXRhL2luZGV4LmpzXCJcbmNsYXNzIE5vdEltcGxlbWVudGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG5leHBvcnQge05vdEltcGxlbWVudGVkRXJyb3J9XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlTWlncmF0aW9uIHtcbiAgLyoqXG4gICAqIFJ1bnMgb24gZGF0YWJhc2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBkYXRhYmFzZUlkZW50aWZpZXJzIC0gRGF0YWJhc2UgaWRlbnRpZmllcnMuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBvbkRhdGFiYXNlcyhkYXRhYmFzZUlkZW50aWZpZXJzKSB7XG4gICAgdGhpcy5fZGF0YWJhc2VJZGVudGlmaWVycyA9IGRhdGFiYXNlSWRlbnRpZmllcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBkYXRhYmFzZSBpZGVudGlmaWVycy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSAtIFRoZSBkYXRhYmFzZSBpZGVudGlmaWVycy5cbiAgICovXG4gIHN0YXRpYyBnZXREYXRhYmFzZUlkZW50aWZpZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXJzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmRhdGFiYXNlSWRlbnRpZmllciAtIERhdGFiYXNlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MuZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGRhdGFiYXNlSWRlbnRpZmllciA9IFwiZGVmYXVsdFwiLCBkYn0pIHtcbiAgICBpZiAoIWRhdGFiYXNlSWRlbnRpZmllcikgdGhyb3cgbmV3IEVycm9yKFwiTm8gZGF0YWJhc2UgaWRlbnRpZmllciBnaXZlblwiKVxuICAgIGlmICghZGIpIHRocm93IG5ldyBFcnJvcihcIk5vICdkYicgZ2l2ZW5cIilcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXIgPSBkYXRhYmFzZUlkZW50aWZpZXJcbiAgICB0aGlzLl9kYiA9IGRiXG4gIH1cblxuICBfZ2V0RGF0YWJhc2VJZGVudGlmaWVyKCkge1xuICAgIGlmICghdGhpcy5fZGF0YWJhc2VJZGVudGlmaWVyKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBkYXRhYmFzZSBpZGVudGlmaWVyIHNldFwiKVxuXG4gICAgcmV0dXJuIHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllclxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGRyaXZlci5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSAtIFRoZSBkcml2ZXIuXG4gICAqL1xuICBnZXREcml2ZXIoKSB7IHJldHVybiB0aGlzLl9kYiB9XG4gIGNvbm5lY3Rpb24oKSB7IHJldHVybiB0aGlzLmdldERyaXZlcigpIH1cblxuICBhc3luYyBjaGFuZ2UoKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCInY2hhbmdlJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIGFzeW5jIHVwKCkge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiJ2NoYW5nZScgbm90IGltcGxlbWVudGVkXCIpXG4gIH1cblxuICBhc3luYyBkb3duKCkge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiJ2NoYW5nZScgbm90IGltcGxlbWVudGVkXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBleGVjdXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gU1FMIHN0cmluZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLlF1ZXJ5UmVzdWx0VHlwZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgZXhlY3V0ZS5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoc3FsKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdGlvbigpLnF1ZXJ5KHNxbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uVHlwZSAtIENvbHVtbiB0eXBlLlxuICAgKiBAcGFyYW0ge0FkZENvbHVtbkFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGFkZENvbHVtbih0YWJsZU5hbWUsIGNvbHVtbk5hbWUsIGNvbHVtblR5cGUsIGFyZ3MpIHtcbiAgICBpZiAoIWNvbHVtblR5cGUpIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbHVtbiB0eXBlIGdpdmVuXCIpXG5cbiAgICBjb25zdCB0YWJsZUNvbHVtbkFyZ3MgPSBPYmplY3QuYXNzaWduKHtpc05ld0NvbHVtbjogdHJ1ZSwgdHlwZTogY29sdW1uVHlwZX0sIGFyZ3MpXG4gICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFRhYmxlRGF0YSh0YWJsZU5hbWUpXG5cbiAgICB0YWJsZURhdGEuYWRkQ29sdW1uKGNvbHVtbk5hbWUsIHRhYmxlQ29sdW1uQXJncylcblxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmFsdGVyVGFibGVTUUxzKHRhYmxlRGF0YSlcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbW92ZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQ29sdW1uKHRhYmxlTmFtZSwgY29sdW1uTmFtZSkge1xuICAgIGNvbnN0IHRhYmxlQ29sdW1uQXJncyA9IE9iamVjdC5hc3NpZ24oe2Ryb3BDb2x1bW46IHRydWV9KVxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IG5ldyBUYWJsZURhdGEodGFibGVOYW1lKVxuXG4gICAgdGFibGVEYXRhLmFkZENvbHVtbihjb2x1bW5OYW1lLCB0YWJsZUNvbHVtbkFyZ3MpXG5cbiAgICBjb25zdCBzcWxzID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5hbHRlclRhYmxlU1FMcyh0YWJsZURhdGEpXG5cbiAgICBmb3IgKGNvbnN0IHNxbCBvZiBzcWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLnF1ZXJ5KHNxbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkSW5kZXhBcmdzVHlwZSB0eXBlLlxuICAgKiBAdHlwZWRlZiB7b2JqZWN0fSBBZGRJbmRleEFyZ3NUeXBlXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lmTm90RXhpc3RzXSAtIFNraXAgY3JlYXRpb24gaWYgdGhlIGluZGV4IGFscmVhZHkgZXhpc3RzLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gRXhwbGljaXQgaW5kZXggbmFtZSB0byB1c2UuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VuaXF1ZV0gLSBXaGV0aGVyIHRoZSBpbmRleCBzaG91bGQgYmUgdW5pcXVlLlxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGluZGV4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBpbXBvcnQoXCIuLi90YWJsZS1kYXRhL3RhYmxlLWNvbHVtbi5qc1wiKS5kZWZhdWx0Pn0gY29sdW1ucyAtIENvbHVtbiBuYW1lIG9yIGFycmF5IG9mIGNvbHVtbiBuYW1lcy5cbiAgICogQHBhcmFtIHtBZGRJbmRleEFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGFkZEluZGV4KHRhYmxlTmFtZSwgY29sdW1ucywgYXJncykge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb2x1bW5zID0gdHlwZW9mIGNvbHVtbnMgPT09IFwic3RyaW5nXCIgPyBbY29sdW1uc10gOiBjb2x1bW5zXG4gICAgY29uc3QgY3JlYXRlSW5kZXhBcmdzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHtcbiAgICAgICAgY29sdW1uczogbm9ybWFsaXplZENvbHVtbnMsXG4gICAgICAgIHRhYmxlTmFtZVxuICAgICAgfSxcbiAgICAgIGFyZ3NcbiAgICApXG4gICAgY29uc3Qgc3FscyA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuY3JlYXRlSW5kZXhTUUxzKGNyZWF0ZUluZGV4QXJncylcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRGb3JlaWduS2V5QXJnc1R5cGUgdHlwZS5cbiAgICogQHR5cGVkZWYge29iamVjdH0gQWRkRm9yZWlnbktleUFyZ3NUeXBlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29sdW1uTmFtZV0gLSBPdmVycmlkZSB0aGUgZGVyaXZlZCBGSyBjb2x1bW4gbmFtZSAoZGVmYXVsdDogYCR7cmVmZXJlbmNlX3VuZGVyc2NvcmVkfV9pZGApLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gT3ZlcnJpZGUgdGhlIGRlcml2ZWQgY29uc3RyYWludCBuYW1lIChkZWZhdWx0OiBgZmtfJHt0YWJsZU5hbWV9XyR7cmVmZXJlbmNlTmFtZX1gKS5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtyZWZlcmVuY2VkQ29sdW1uTmFtZV0gLSBPdmVycmlkZSB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSAoZGVmYXVsdDogYGlkYCkuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVmZXJlbmNlZFRhYmxlTmFtZV0gLSBPdmVycmlkZSB0aGUgZGVyaXZlZCByZWZlcmVuY2VkIHRhYmxlIChkZWZhdWx0OiBwbHVyYWxpemVkIGByZWZlcmVuY2VOYW1lYCkuXG4gICAqL1xuICAvKipcbiAgICogUnVucyBhZGQgZm9yZWlnbiBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSB0aGUgRksgbGl2ZXMgb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2VOYW1lIC0gU2luZ3VsYXIgcmVmZXJlbmNlIG5hbWUuIERlZmF1bHRzIGRlcml2ZVxuICAgKiAgIHRoZSBGSyBjb2x1bW4gYXMgYCR7cmVmZXJlbmNlfV9pZGAsIHRoZSByZWZlcmVuY2VkIHRhYmxlIGJ5IHBsdXJhbGl6aW5nXG4gICAqICAgdGhlIHJlZmVyZW5jZSwgdGhlIHJlZmVyZW5jZWQgY29sdW1uIGFzIGBpZGAsIGFuZCB0aGUgY29uc3RyYWludCBuYW1lXG4gICAqICAgYXMgYGZrXyR7dGFibGVOYW1lfV8ke3JlZmVyZW5jZU5hbWV9YC4gT3ZlcnJpZGUgYW55IG9mIHRob3NlIHZpYSBgYXJnc2BcbiAgICogICB3aGVuIHRoZSBzY2hlbWEgZG9lc24ndCBmb2xsb3cgdGhlIGNvbnZlbnRpb24uXG4gICAqIEBwYXJhbSB7QWRkRm9yZWlnbktleUFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25hbCBvdmVycmlkZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBhZGRGb3JlaWduS2V5KHRhYmxlTmFtZSwgcmVmZXJlbmNlTmFtZSwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge2NvbHVtbk5hbWUsIG5hbWUsIHJlZmVyZW5jZWRDb2x1bW5OYW1lLCByZWZlcmVuY2VkVGFibGVOYW1lLCAuLi5yZXN0QXJnc30gPSBhcmdzXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgY29uc3QgcmVmZXJlbmNlTmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUocmVmZXJlbmNlTmFtZSlcbiAgICBjb25zdCByZXNvbHZlZFJlZmVyZW5jZWRUYWJsZU5hbWUgPSByZWZlcmVuY2VkVGFibGVOYW1lIHx8IGluZmxlY3Rpb24ucGx1cmFsaXplKHJlZmVyZW5jZU5hbWVVbmRlcnNjb3JlKVxuICAgIGNvbnN0IHJlc29sdmVkQ29sdW1uTmFtZSA9IGNvbHVtbk5hbWUgfHwgYCR7cmVmZXJlbmNlTmFtZVVuZGVyc2NvcmV9X2lkYFxuICAgIGNvbnN0IHJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSByZWZlcmVuY2VkQ29sdW1uTmFtZSB8fCBcImlkXCJcbiAgICBjb25zdCByZXNvbHZlZE5hbWUgPSBuYW1lIHx8IGBma18ke3RhYmxlTmFtZX1fJHtyZWZlcmVuY2VOYW1lfWBcblxuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuYWRkRm9yZWlnbktleShcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHJlc29sdmVkQ29sdW1uTmFtZSxcbiAgICAgIHJlc29sdmVkUmVmZXJlbmNlZFRhYmxlTmFtZSxcbiAgICAgIHJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWUsXG4gICAgICB7XG4gICAgICAgIGlzTmV3Rm9yZWlnbktleTogdHJ1ZSxcbiAgICAgICAgbmFtZTogcmVzb2x2ZWROYW1lXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2VOYW1lIC0gUmVmZXJlbmNlIG5hbWUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZm9yZWlnbktleV0gLSBXaGV0aGVyIGZvcmVpZ24ga2V5LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLm51bGxdIC0gV2hldGhlciBudWxsYWJsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnR5cGVdIC0gVHlwZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnVuaXF1ZV0gLSBXaGV0aGVyIHVuaXF1ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGFkZFJlZmVyZW5jZSh0YWJsZU5hbWUsIHJlZmVyZW5jZU5hbWUsIGFyZ3MpIHtcbiAgICBjb25zdCB7Zm9yZWlnbktleSwgbnVsbDogbnVsbGFibGUsIHR5cGUsIHVuaXF1ZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBgJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUocmVmZXJlbmNlTmFtZSl9X2lkYFxuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGNvbnN0IGNvbHVtblR5cGUgPSB0eXBlIHx8IFwiaW50ZWdlclwiXG4gICAgY29uc3QgY29sdW1uQXJncyA9IG51bGxhYmxlICE9PSB1bmRlZmluZWQgPyB7bnVsbDogbnVsbGFibGV9IDogdW5kZWZpbmVkXG5cbiAgICBhd2FpdCB0aGlzLmFkZENvbHVtbih0YWJsZU5hbWUsIGNvbHVtbk5hbWUsIGNvbHVtblR5cGUsIGNvbHVtbkFyZ3MpXG4gICAgYXdhaXQgdGhpcy5hZGRJbmRleCh0YWJsZU5hbWUsIFtjb2x1bW5OYW1lXSwge3VuaXF1ZTogdW5pcXVlfSlcblxuICAgIGlmIChmb3JlaWduS2V5KSB7XG4gICAgICBhd2FpdCB0aGlzLmFkZEZvcmVpZ25LZXkodGFibGVOYW1lLCByZWZlcmVuY2VOYW1lKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbW92ZSByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmZXJlbmNlTmFtZSAtIFJlZmVyZW5jZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlUmVmZXJlbmNlKHRhYmxlTmFtZSwgcmVmZXJlbmNlTmFtZSkge1xuICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBgJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUocmVmZXJlbmNlTmFtZSl9X2lkYFxuXG4gICAgdGhpcy5yZW1vdmVDb2x1bW4odGFibGVOYW1lLCBjb2x1bW5OYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2hhbmdlIGNvbHVtbiBudWxsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtbk5hbWUgLSBDb2x1bW4gbmFtZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBudWxsYWJsZSAtIFdoZXRoZXIgbnVsbGFibGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjaGFuZ2VDb2x1bW5OdWxsKHRhYmxlTmFtZSwgY29sdW1uTmFtZSwgbnVsbGFibGUpIHtcbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZ2V0VGFibGVCeU5hbWUodGFibGVOYW1lKVxuXG4gICAgaWYgKCF0YWJsZSkgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gZG9lcyBub3QgZXhpc3RgKVxuXG4gICAgY29uc3QgY29sdW1uID0gYXdhaXQgdGFibGUuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWUpXG5cbiAgICBpZiAoIWNvbHVtbikgdGhyb3cgbmV3IEVycm9yKGBDb2x1bW4gJHtjb2x1bW5OYW1lfSBkb2VzIG5vdCBleGlzdCBpbiB0YWJsZSAke3RhYmxlTmFtZX1gKVxuXG4gICAgYXdhaXQgY29sdW1uLmNoYW5nZU51bGxhYmxlKG51bGxhYmxlKVxuICB9XG5cbiAgLyoqXG4gICAqIE1pZ3JhdGVzIGxlZ2FjeSB0aW1lem9uZS1sZXNzIGxvY2FsIGRhdGV0aW1lIHJvd3MgaW50byBVVEMgZGF0ZXRpbWUgc3RvcmFnZS5cbiAgICogTmV3IFNRTGl0ZSBVVEMgcm93cyBpbmNsdWRlIGEgdGltZXpvbmUgc3VmZml4IGFuZCBhcmUgc2tpcHBlZC5cbiAgICogQHBhcmFtIHtMZWdhY3lMb2NhbERhdGVUaW1lc01pZ3JhdGlvbkFyZ3NUeXBlfSBbYXJnc10gLSBNaWdyYXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIG1pZ3JhdGVMZWdhY3lMb2NhbERhdGVUaW1lc1RvVXRjU3RvcmFnZShhcmdzID0ge30pIHtcbiAgICBjb25zdCB7Y29sdW1uc0J5VGFibGUsIGxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlcywgdGFibGVzLCAuLi5yZXN0QXJnc30gPSBhcmdzXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgY29uc3QgdGFibGVOYW1lcyA9IGF3YWl0IHRoaXMuX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzVGFibGVOYW1lcyh0YWJsZXMpXG5cbiAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU5hbWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLl9taWdyYXRlTGVnYWN5TG9jYWxEYXRlVGltZXNUYWJsZSh7XG4gICAgICAgIGNvbHVtbnNCeVRhYmxlLFxuICAgICAgICBsZWdhY3lMb2NhbE9mZnNldE1pbnV0ZXMsXG4gICAgICAgIHRhYmxlTmFtZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGFibGUgbmFtZXMgZm9yIGEgbGVnYWN5IGxvY2FsIGRhdGV0aW1lIG1pZ3JhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IHVuZGVmaW5lZH0gdGFibGVzIC0gRXhwbGljaXQgdGFibGUgbmFtZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBUYWJsZSBuYW1lcy5cbiAgICovXG4gIGFzeW5jIF9sZWdhY3lMb2NhbERhdGVUaW1lc1RhYmxlTmFtZXModGFibGVzKSB7XG4gICAgaWYgKHRhYmxlcykgcmV0dXJuIHRhYmxlc1xuXG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldERyaXZlcigpLmdldFRhYmxlcygpKVxuICAgICAgLm1hcCgodGFibGUpID0+IHRhYmxlLmdldE5hbWUoKSlcbiAgICAgIC5maWx0ZXIoKHRhYmxlTmFtZSkgPT4gdGFibGVOYW1lICE9IFwic2NoZW1hX21pZ3JhdGlvbnNcIiAmJiAhdGFibGVOYW1lLnN0YXJ0c1dpdGgoXCJzcWxpdGVfXCIpKVxuICB9XG5cbiAgLyoqXG4gICAqIE1pZ3JhdGVzIG9uZSB0YWJsZSdzIGxlZ2FjeSBsb2NhbCBkYXRldGltZSB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCB1bmRlZmluZWR9IGFyZ3MuY29sdW1uc0J5VGFibGUgLSBFeHBsaWNpdCBjb2x1bW5zIGtleWVkIGJ5IHRhYmxlLlxuICAgKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZH0gYXJncy5sZWdhY3lMb2NhbE9mZnNldE1pbnV0ZXMgLSBVVEMtbWludXMtbG9jYWwgb2Zmc2V0IGluIG1pbnV0ZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfbWlncmF0ZUxlZ2FjeUxvY2FsRGF0ZVRpbWVzVGFibGUoe2NvbHVtbnNCeVRhYmxlLCBsZWdhY3lMb2NhbE9mZnNldE1pbnV0ZXMsIHRhYmxlTmFtZX0pIHtcbiAgICBjb25zdCBkcml2ZXIgPSB0aGlzLmdldERyaXZlcigpXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBkcml2ZXIuZ2V0VGFibGVCeU5hbWVPckZhaWwodGFibGVOYW1lKVxuICAgIGNvbnN0IGNvbHVtbnMgPSBhd2FpdCB0aGlzLl9sZWdhY3lMb2NhbERhdGVUaW1lc0NvbHVtbnMoe2NvbHVtbnNCeVRhYmxlLCB0YWJsZX0pXG5cbiAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgY29uc3QgcHJpbWFyeUtleUNvbHVtbiA9IGF3YWl0IHRoaXMuX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzUHJpbWFyeUtleSh0YWJsZSlcbiAgICBjb25zdCBzZWxlY3RlZENvbHVtbnMgPSBbcHJpbWFyeUtleUNvbHVtbiwgLi4uY29sdW1uc11cbiAgICBjb25zdCBzZWxlY3RTcWwgPSBzZWxlY3RlZENvbHVtbnNcbiAgICAgIC5tYXAoKGNvbHVtbk5hbWUpID0+IGRyaXZlci5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKSlcbiAgICAgIC5qb2luKFwiLCBcIilcbiAgICBjb25zdCByb3dzID0gYXdhaXQgZHJpdmVyLnF1ZXJ5KGBTRUxFQ1QgJHtzZWxlY3RTcWx9IEZST00gJHtkcml2ZXIucXVvdGVUYWJsZSh0YWJsZU5hbWUpfWApXG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbk5hbWUgb2YgY29sdW1ucykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvd1tjb2x1bW5OYW1lXVxuICAgICAgICBjb25zdCBjb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRMZWdhY3lEYXRlVmFsdWVUb1V0Y1N0b3JhZ2UodmFsdWUsIHtcbiAgICAgICAgICBkYXRhYmFzZVR5cGU6IGRyaXZlci5nZXRUeXBlKCksXG4gICAgICAgICAgbGVnYWN5TG9jYWxPZmZzZXRNaW51dGVzXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGNvbnZlcnRlZFZhbHVlID09PSB2YWx1ZSkgY29udGludWVcblxuICAgICAgICBhd2FpdCBkcml2ZXIucXVlcnkoYFxuICAgICAgICAgIFVQREFURSAke2RyaXZlci5xdW90ZVRhYmxlKHRhYmxlTmFtZSl9XG4gICAgICAgICAgU0VUICR7ZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpfSA9ICR7ZHJpdmVyLnF1b3RlKGNvbnZlcnRlZFZhbHVlKX1cbiAgICAgICAgICBXSEVSRSAke2RyaXZlci5xdW90ZUNvbHVtbihwcmltYXJ5S2V5Q29sdW1uKX0gPSAke2RyaXZlci5xdW90ZShyb3dbcHJpbWFyeUtleUNvbHVtbl0pfVxuICAgICAgICBgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBkYXRlLWxpa2UgY29sdW1ucyBmb3Igb25lIHRhYmxlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkfSBhcmdzLmNvbHVtbnNCeVRhYmxlIC0gRXhwbGljaXQgY29sdW1ucyBrZXllZCBieSB0YWJsZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdH0gYXJncy50YWJsZSAtIFRhYmxlIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gRGF0ZS1saWtlIGNvbHVtbiBuYW1lcy5cbiAgICovXG4gIGFzeW5jIF9sZWdhY3lMb2NhbERhdGVUaW1lc0NvbHVtbnMoe2NvbHVtbnNCeVRhYmxlLCB0YWJsZX0pIHtcbiAgICBjb25zdCBleHBsaWNpdENvbHVtbnMgPSBjb2x1bW5zQnlUYWJsZT8uW3RhYmxlLmdldE5hbWUoKV1cblxuICAgIGlmIChleHBsaWNpdENvbHVtbnMpIHJldHVybiBleHBsaWNpdENvbHVtbnNcblxuICAgIHJldHVybiAoYXdhaXQgdGFibGUuZ2V0Q29sdW1ucygpKVxuICAgICAgLmZpbHRlcigoY29sdW1uKSA9PiB0aGlzLl9sZWdhY3lMb2NhbERhdGVUaW1lc0NvbHVtbklzRGF0ZUxpa2UoY29sdW1uKSlcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmdldE5hbWUoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIGNvbHVtbiBzaG91bGQgYmUgaW5jbHVkZWQgYnkgZGVmYXVsdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1uLmpzXCIpLmRlZmF1bHR9IGNvbHVtbiAtIENvbHVtbiBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgY29sdW1uIGlzIGRhdGUtbGlrZS5cbiAgICovXG4gIF9sZWdhY3lMb2NhbERhdGVUaW1lc0NvbHVtbklzRGF0ZUxpa2UoY29sdW1uKSB7XG4gICAgY29uc3QgY29sdW1uVHlwZSA9IGNvbHVtbi5nZXRUeXBlKCkudG9Mb3dlckNhc2UoKVxuXG4gICAgcmV0dXJuIGNvbHVtblR5cGUuaW5jbHVkZXMoXCJkYXRlXCIpIHx8IGNvbHVtblR5cGUuaW5jbHVkZXMoXCJ0aW1lc3RhbXBcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgc2luZ2xlIHByaW1hcnkga2V5IGNvbHVtbiBmb3Igcm93IHVwZGF0ZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLXRhYmxlLmpzXCIpLmRlZmF1bHR9IHRhYmxlIC0gVGFibGUgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gUHJpbWFyeSBrZXkgY29sdW1uIG5hbWUuXG4gICAqL1xuICBhc3luYyBfbGVnYWN5TG9jYWxEYXRlVGltZXNQcmltYXJ5S2V5KHRhYmxlKSB7XG4gICAgY29uc3QgcHJpbWFyeUtleUNvbHVtbnMgPSAoYXdhaXQgdGFibGUuZ2V0Q29sdW1ucygpKS5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLmdldFByaW1hcnlLZXkoKSlcblxuICAgIGlmIChwcmltYXJ5S2V5Q29sdW1ucy5sZW5ndGggIT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IG9uZSBwcmltYXJ5IGtleSBvbiAke3RhYmxlLmdldE5hbWUoKX0gYnV0IGZvdW5kICR7cHJpbWFyeUtleUNvbHVtbnMubGVuZ3RofWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHByaW1hcnlLZXlDb2x1bW5zWzBdLmdldE5hbWUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY29sdW1uIGV4aXN0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFJlc29sdmVzIHdpdGggV2hldGhlciBjb2x1bW4gZXhpc3RzLlxuICAgKi9cbiAgYXN5bmMgY29sdW1uRXhpc3RzKHRhYmxlTmFtZSwgY29sdW1uTmFtZSkge1xuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5nZXRUYWJsZUJ5TmFtZSh0YWJsZU5hbWUpXG5cbiAgICBpZiAodGFibGUpIHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHRhYmxlLmdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lKVxuXG4gICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEJvb2xlYW4oZmFsc2UpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgZGF0YWJhc2Ugc2NoZW1hIGZvciBhIGdhcC1sZXNzIHBvc2l0aW9uYWwgbGlzdC4gQWRkcyB0aGVcbiAgICogcG9zaXRpb24gY29sdW1uIChJTlQgTk9UIE5VTEwpIGlmIGFic2VudCBhbmQgY3JlYXRlcyBhIFVOSVFVRSBpbmRleCBvblxuICAgKiAoc2NvcGUsIHBvc2l0aW9uKS4gVGhpcyBpcyB0aGUgc2NoZW1hLXNpZGUgY291bnRlcnBhcnQgb2ZcbiAgICogYE1vZGVsLmFjdHNBc0xpc3QoKWAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcG9zaXRpb25Db2x1bW4gLSBDb2x1bW4gbmFtZSBmb3IgdGhlIHBvc2l0aW9uIChlLmcuIFwicm93X251bWJlclwiKS5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5zY29wZSAtIENvbHVtbiBuYW1lIGZvciB0aGUgc2NvcGUgKGUuZy4gXCJib2FyZF9jb2x1bW5faWRcIikuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgYWRkQWN0c0FzTGlzdCh0YWJsZU5hbWUsIHBvc2l0aW9uQ29sdW1uLCB7c2NvcGV9KSB7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5jb2x1bW5FeGlzdHModGFibGVOYW1lLCBwb3NpdGlvbkNvbHVtbikpKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkZENvbHVtbih0YWJsZU5hbWUsIHBvc2l0aW9uQ29sdW1uLCBcImludGVnZXJcIiwge251bGw6IGZhbHNlfSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5jaGFuZ2VDb2x1bW5OdWxsKHRhYmxlTmFtZSwgcG9zaXRpb25Db2x1bW4sIGZhbHNlKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuYWRkSW5kZXgodGFibGVOYW1lLCBbc2NvcGUsIHBvc2l0aW9uQ29sdW1uXSwge3VuaXF1ZTogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggZGVmYXVsdCBvcHRpb25zLlxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGFibGVDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggZXhwbGljaXQgb3B0aW9ucy5cbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge0NyZWF0ZVRhYmxlQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtDcmVhdGVUYWJsZUNhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIGNyZWF0ZSB0YWJsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGFibGVBcmdzVHlwZSB8IENyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlfSBhcmcxIC0gQXJnMS5cbiAgICogQHBhcmFtIHtDcmVhdGVUYWJsZUNhbGxiYWNrVHlwZSB8IHVuZGVmaW5lZH0gW2FyZzJdIC0gQXJnMi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVRhYmxlKHRhYmxlTmFtZSwgYXJnMSwgYXJnMikge1xuICAgIGxldCBhcmdzXG4gICAgbGV0IGNhbGxiYWNrXG5cbiAgICBpZiAodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhcmdzID0ge31cbiAgICAgIGNhbGxiYWNrID0gYXJnMVxuICAgIH0gZWxzZSB7XG4gICAgICBhcmdzID0gYXJnMVxuICAgICAgY2FsbGJhY2sgPSBhcmcyXG4gICAgfVxuXG4gICAgY29uc3Qge2lkID0ge30sIGlmTm90RXhpc3RzID0gZmFsc2UsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICBjb25zdCBkcml2ZXIgPSB0aGlzLmdldERyaXZlcigpXG4gICAgY29uc3QgZGVmYXVsdFByaW1hcnlLZXlUeXBlID0gZHJpdmVyLnByaW1hcnlLZXlUeXBlKClcbiAgICBsZXQgaWREZWZhdWx0LCBpZFR5cGUsIHJlc3RBcmdzSWRcblxuICAgIGlmIChpZCAhPT0gZmFsc2UpIHtcbiAgICAgICh7ZGVmYXVsdDogaWREZWZhdWx0LCB0eXBlOiBpZFR5cGUsIC4uLnJlc3RBcmdzSWR9ID0gaWQpXG5cbiAgICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3NJZClcbiAgICB9XG5cbiAgICBpZiAoIWlkVHlwZSkge1xuICAgICAgaWRUeXBlID0gZGVmYXVsdFByaW1hcnlLZXlUeXBlXG4gICAgfVxuICAgIGNvbnN0IGRyaXZlclN1cHBvcnRzRGVmYXVsdFVVSUQgPSBkcml2ZXIuc3VwcG9ydHNEZWZhdWx0UHJpbWFyeUtleVVVSUQ/LigpXG4gICAgY29uc3QgbG93ZXJJZFR5cGUgPSBpZFR5cGU/LnRvTG93ZXJDYXNlKClcbiAgICBjb25zdCBpc1VVSURQcmltYXJ5S2V5ID0gbG93ZXJJZFR5cGUgPT0gXCJ1dWlkXCJcbiAgICBjb25zdCBudW1lcmljQXV0b0luY3JlbWVudFR5cGVzID0gW1wiaW50XCIsIFwiaW50ZWdlclwiLCBcImJpZ2ludFwiLCBcInNtYWxsaW50XCIsIFwidGlueWludFwiXVxuICAgIGxldCBpZEF1dG9JbmNyZW1lbnQgPSBudW1lcmljQXV0b0luY3JlbWVudFR5cGVzLmluY2x1ZGVzKGxvd2VySWRUeXBlIHx8IFwiXCIpXG5cbiAgICBpZiAoaXNVVUlEUHJpbWFyeUtleSkge1xuICAgICAgaWRBdXRvSW5jcmVtZW50ID0gZmFsc2VcblxuICAgICAgaWYgKGRyaXZlclN1cHBvcnRzRGVmYXVsdFVVSUQpIHtcbiAgICAgICAgaWYgKGlkRGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWREZWZhdWx0ID0gKCkgPT4gXCJVVUlEKClcIlxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlkRGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIExldCBhcHBsaWNhdGlvbiBjb2RlIGFzc2lnbiBVVUlEcyAoc2VlIERhdGFiYXNlUmVjb3JkLmluc2VydCkgd2hlbiB0aGUgZHJpdmVyIGNhbid0IGRvIGl0LlxuICAgICAgICBpZERlZmF1bHQgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICAgIC8vIElmIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQgVVVJRCgpIGJ1dCB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgc2V0IGEgZGVmYXVsdCwgcmVzcGVjdCBpdC5cbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZURhdGEgPSBuZXcgVGFibGVEYXRhKHRhYmxlTmFtZSwge2lmTm90RXhpc3RzLCBwcmltYXJ5S2V5VHlwZTogZGVmYXVsdFByaW1hcnlLZXlUeXBlfSlcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBpZiAoIShpZFR5cGUgaW4gdGFibGVEYXRhKSkgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBwcmltYXJ5IGtleSB0eXBlOiAke2lkVHlwZX1gKVxuXG4gICAgaWYgKGlkICE9PSBmYWxzZSkge1xuICAgICAgdGFibGVEYXRhLmFkZENvbHVtbihcImlkXCIsIHthdXRvSW5jcmVtZW50OiBpZEF1dG9JbmNyZW1lbnQsIGRlZmF1bHQ6IGlkRGVmYXVsdCwgbnVsbDogZmFsc2UsIHByaW1hcnlLZXk6IHRydWUsIHR5cGU6IGlkVHlwZX0pXG4gICAgfVxuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayh0YWJsZURhdGEpXG4gICAgfVxuXG4gICAgY29uc3Qgc3FscyA9IGF3YWl0IGRyaXZlci5jcmVhdGVUYWJsZVNxbCh0YWJsZURhdGEpXG5cbiAgICBmb3IgKGNvbnN0IHNxbCBvZiBzcWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLl9kYi5xdWVyeShzcWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZHJvcCB0YWJsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBkcm9wVGFibGUodGFibGVOYW1lKSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5kcm9wVGFibGUodGFibGVOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVuYW1lIGNvbHVtbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvbGRDb2x1bW5OYW1lIC0gUHJldmlvdXMgY29sdW1uIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdDb2x1bW5OYW1lIC0gTmV3IGNvbHVtbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVuYW1lQ29sdW1uKHRhYmxlTmFtZSwgb2xkQ29sdW1uTmFtZSwgbmV3Q29sdW1uTmFtZSkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucmVuYW1lQ29sdW1uKHRhYmxlTmFtZSwgb2xkQ29sdW1uTmFtZSwgbmV3Q29sdW1uTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRhYmxlIGV4aXN0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFJlc29sdmVzIHdpdGggV2hldGhlciB0YWJsZSBleGlzdHMuXG4gICAqL1xuICBhc3luYyB0YWJsZUV4aXN0cyh0YWJsZU5hbWUpIHtcbiAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLnRhYmxlRXhpc3RzKHRhYmxlTmFtZSlcblxuICAgIHJldHVybiBleGlzdHNcbiAgfVxufVxuIl19
|
|
@@ -618,12 +618,12 @@ declare class VelociousDatabaseRecord<WriteAttributes extends Record<string, unk
|
|
|
618
618
|
static setDatabaseIdentifier(databaseIdentifier: string): void;
|
|
619
619
|
/**
|
|
620
620
|
* Declares a tenant-aware database identifier resolver for this model class.
|
|
621
|
-
* @param {string | ((args: {modelClass: typeof VelociousDatabaseRecord, tenant:
|
|
621
|
+
* @param {string | ((args: {modelClass: typeof VelociousDatabaseRecord, tenant: Record<string, unknown>}) => string | undefined)} databaseIdentifierOrResolver - Static identifier or resolver.
|
|
622
622
|
* @returns {void} - No return value.
|
|
623
623
|
*/
|
|
624
624
|
static switchesTenantDatabase(databaseIdentifierOrResolver: string | ((args: {
|
|
625
625
|
modelClass: typeof VelociousDatabaseRecord;
|
|
626
|
-
tenant: unknown
|
|
626
|
+
tenant: Record<string, unknown>;
|
|
627
627
|
}) => string | undefined)): void;
|
|
628
628
|
/**
|
|
629
629
|
* Runs get tenant database identifier.
|