velocious 1.0.506 → 1.0.508
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/configuration.js +2 -0
- package/build/database/migration/index.js +67 -0
- package/build/database/record/auditing.js +659 -120
- package/build/database/record/index.js +2 -1
- package/build/database/record/instance-relationships/has-many.js +6 -0
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +3 -1
- package/build/src/database/migration/index.d.ts +30 -0
- package/build/src/database/migration/index.d.ts.map +1 -1
- package/build/src/database/migration/index.js +58 -1
- package/build/src/database/record/auditing.d.ts +97 -40
- package/build/src/database/record/auditing.d.ts.map +1 -1
- package/build/src/database/record/auditing.js +561 -118
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +3 -2
- package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/has-many.js +5 -1
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +19 -6
- package/build/testing/test-runner.js +18 -5
- package/package.json +1 -1
- package/src/configuration.js +2 -0
- package/src/database/migration/index.js +67 -0
- package/src/database/record/auditing.js +659 -120
- package/src/database/record/index.js +2 -1
- package/src/database/record/instance-relationships/has-many.js +6 -0
- package/src/testing/test-runner.js +18 -5
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the dedicated audit table name for a model table.
|
|
3
|
+
* @param {string} modelTableName - Model table name (e.g. "projects").
|
|
4
|
+
* @returns {string} Dedicated audit table name (e.g. "project_audits").
|
|
5
|
+
*/
|
|
6
|
+
export function dedicatedAuditTableName(modelTableName: string): string;
|
|
1
7
|
export default class VelociousDatabaseMigration {
|
|
2
8
|
/**
|
|
3
9
|
* Runs on databases.
|
|
@@ -286,6 +292,30 @@ export default class VelociousDatabaseMigration {
|
|
|
286
292
|
* @returns {Promise<boolean>} - Resolves with Whether table exists.
|
|
287
293
|
*/
|
|
288
294
|
tableExists(tableName: string): Promise<boolean>;
|
|
295
|
+
/**
|
|
296
|
+
* Helper: creates the shared audit tables (`audit_actions`,
|
|
297
|
+
* `audit_auditable_types`, `audits`). Call from `up()` in a migration.
|
|
298
|
+
* @param {{id?: {type?: string}}} [options] - ID column options.
|
|
299
|
+
* @returns {Promise<void>}
|
|
300
|
+
*/
|
|
301
|
+
createSharedAuditTables(options?: {
|
|
302
|
+
id?: {
|
|
303
|
+
type?: string;
|
|
304
|
+
};
|
|
305
|
+
}): Promise<void>;
|
|
306
|
+
/**
|
|
307
|
+
* Helper: creates a dedicated audit table for a model (e.g.
|
|
308
|
+
* `project_audits` for the `projects` table). Call from `up()`
|
|
309
|
+
* in a migration.
|
|
310
|
+
* @param {string} modelTableName - Model table name (e.g. "projects").
|
|
311
|
+
* @param {{id?: {type?: string}}} [options] - ID column options.
|
|
312
|
+
* @returns {Promise<string>} The created audit table name.
|
|
313
|
+
*/
|
|
314
|
+
createDedicatedAuditTable(modelTableName: string, options?: {
|
|
315
|
+
id?: {
|
|
316
|
+
type?: string;
|
|
317
|
+
};
|
|
318
|
+
}): Promise<string>;
|
|
289
319
|
}
|
|
290
320
|
/**
|
|
291
321
|
* AddColumnArgsType type.
|
|
@@ -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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"}
|
|
@@ -522,5 +522,62 @@ export default class VelociousDatabaseMigration {
|
|
|
522
522
|
const exists = await this.getDriver().tableExists(tableName);
|
|
523
523
|
return exists;
|
|
524
524
|
}
|
|
525
|
+
/**
|
|
526
|
+
* Helper: creates the shared audit tables (`audit_actions`,
|
|
527
|
+
* `audit_auditable_types`, `audits`). Call from `up()` in a migration.
|
|
528
|
+
* @param {{id?: {type?: string}}} [options] - ID column options.
|
|
529
|
+
* @returns {Promise<void>}
|
|
530
|
+
*/
|
|
531
|
+
async createSharedAuditTables(options = {}) {
|
|
532
|
+
const id = options.id || {};
|
|
533
|
+
await this.createTable("audit_actions", { id }, (table) => {
|
|
534
|
+
table.string("action", { index: { unique: true }, null: false });
|
|
535
|
+
table.timestamps();
|
|
536
|
+
});
|
|
537
|
+
await this.createTable("audit_auditable_types", { id }, (table) => {
|
|
538
|
+
table.string("name", { index: { unique: true }, null: false });
|
|
539
|
+
table.timestamps();
|
|
540
|
+
});
|
|
541
|
+
await this.createTable("audits", { id }, (table) => {
|
|
542
|
+
table.references("audit_action", { foreignKey: true, null: false });
|
|
543
|
+
table.references("audit_auditable_type", { foreignKey: true, null: false });
|
|
544
|
+
table.references("auditable", { null: false, polymorphic: true });
|
|
545
|
+
table.json("audited_changes");
|
|
546
|
+
table.json("params");
|
|
547
|
+
table.timestamps();
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* Helper: creates a dedicated audit table for a model (e.g.
|
|
552
|
+
* `project_audits` for the `projects` table). Call from `up()`
|
|
553
|
+
* in a migration.
|
|
554
|
+
* @param {string} modelTableName - Model table name (e.g. "projects").
|
|
555
|
+
* @param {{id?: {type?: string}}} [options] - ID column options.
|
|
556
|
+
* @returns {Promise<string>} The created audit table name.
|
|
557
|
+
*/
|
|
558
|
+
async createDedicatedAuditTable(modelTableName, options = {}) {
|
|
559
|
+
const auditTable = dedicatedAuditTableName(modelTableName);
|
|
560
|
+
const id = options.id || {};
|
|
561
|
+
await this.createTable(auditTable, { id }, (table) => {
|
|
562
|
+
const refKey = inflection.singularize(modelTableName);
|
|
563
|
+
table.references(refKey, { foreignKey: true, null: false });
|
|
564
|
+
table.references("audit_action", { foreignKey: true, null: false });
|
|
565
|
+
table.json("audited_changes");
|
|
566
|
+
table.json("params");
|
|
567
|
+
table.timestamps();
|
|
568
|
+
});
|
|
569
|
+
return auditTable;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* Returns the dedicated audit table name for a model table.
|
|
574
|
+
* @param {string} modelTableName - Model table name (e.g. "projects").
|
|
575
|
+
* @returns {string} Dedicated audit table name (e.g. "project_audits").
|
|
576
|
+
*/
|
|
577
|
+
export function dedicatedAuditTableName(modelTableName) {
|
|
578
|
+
if (modelTableName.endsWith("s")) {
|
|
579
|
+
return `${modelTableName.slice(0, -1)}_audits`;
|
|
580
|
+
}
|
|
581
|
+
return `${modelTableName}_audits`;
|
|
525
582
|
}
|
|
526
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvbWlncmF0aW9uL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7Ozs7Ozs7Ozs7R0FXRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7O0dBR0c7QUFDSDs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUMzRSxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLGFBQWEsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUMxRCxPQUFPLGVBQWUsTUFBTSwrQkFBK0IsQ0FBQTtBQUMzRCxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM5QyxNQUFNLG1CQUFvQixTQUFRLEtBQUs7Q0FBRztBQUUxQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsQ0FBQTtBQUU1QixNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUI7UUFDcEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG1CQUFtQixDQUFBO0lBQ2pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFBO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLGtCQUFrQixHQUFHLFNBQVMsRUFBRSxFQUFFLEVBQUM7UUFDN0QsSUFBSSxDQUFDLGtCQUFrQjtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQTtRQUN4RSxJQUFJLENBQUMsRUFBRTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUE7UUFFekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7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QUUsYUFBYSxFQUFFLElBQUk7UUFDL0MsTUFBTSxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxRQUFRLEVBQUMsR0FBRyxJQUFJLENBQUE7UUFDcEUsTUFBTSxVQUFVLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUE7UUFFL0QsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZCLE1BQU0sVUFBVSxHQUFHLElBQUksSUFBSSxTQUFTLENBQUE7UUFDcEMsTUFBTSxVQUFVLEdBQUcsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtRQUV4RSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDbkUsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7UUFFOUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLGFBQWE7UUFDNUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUE7UUFFL0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVE7UUFDcEQsTUFBTSxLQUFLLEdBQUcsTUFB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OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUU1RCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEFkZENvbHVtbkFyZ3NUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBZGRDb2x1bW5BcmdzVHlwZVxuICogQHByb3BlcnR5IHs/fSBbZGVmYXVsdF0gLSBEZWZhdWx0IHZhbHVlIGZvciB0aGUgY29sdW1uLlxuICogQHByb3BlcnR5IHtvYmplY3R9IFtmb3JlaWduS2V5XSAtIEZvcmVpZ24ga2V5IGRlZmluaXRpb24gZm9yIHRoZSBjb2x1bW4uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCB7dW5pcXVlOiBib29sZWFufX0gW2luZGV4XSAtIFdoZXRoZXIgdG8gYWRkIGFuIGluZGV4IChvcHRpb25hbGx5IHVuaXF1ZSkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2xpbWl0XSAtIEFsaWFzIGZvciBtYXhMZW5ndGggKHZhcmNoYXIgbGVuZ3RoIGxpbWl0KSBvbiBzdHJpbmctbGlrZSBjb2x1bW5zLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhMZW5ndGhdIC0gTWF4aW11bSBsZW5ndGggZm9yIHN0cmluZy1saWtlIGNvbHVtbnMgKGUuZy4gdmFyY2hhciBsZW5ndGgpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbnVsbF0gLSBXaGV0aGVyIHRoZSBjb2x1bW4gYWxsb3dzIG51bGwgdmFsdWVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcHJpbWFyeUtleV0gLSBXaGV0aGVyIHRoZSBjb2x1bW4gaXMgYSBwcmltYXJ5IGtleS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VuaXF1ZV0gLSBXaGV0aGVyIHRoZSBjb2x1bW4gZW5mb3JjZXMgdW5pcXVlbmVzcy5cbiAqL1xuLyoqXG4gKiBDcmVhdGVUYWJsZUlkQXJnc1R5cGUgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IENyZWF0ZVRhYmxlSWRBcmdzVHlwZVxuICogQHByb3BlcnR5IHs/fSBbZGVmYXVsdF0gLSBEZWZhdWx0IHZhbHVlIGZvciB0aGUgSUQgY29sdW1uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0eXBlXSAtIENvbHVtbiB0eXBlIGZvciB0aGUgSUQgY29sdW1uLlxuICovXG4vKipcbiAqIENyZWF0ZVRhYmxlQXJnc1R5cGUgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IENyZWF0ZVRhYmxlQXJnc1R5cGVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lmTm90RXhpc3RzXSAtIFNraXAgY3JlYXRpb24gaWYgdGhlIHRhYmxlIGFscmVhZHkgZXhpc3RzLlxuICogQHByb3BlcnR5IHtDcmVhdGVUYWJsZUlkQXJnc1R5cGUgfCBmYWxzZX0gW2lkXSAtIElEIGNvbHVtbiBvcHRpb25zIG9yIGZhbHNlIHRvIHNraXAgSUQuXG4gKi9cbi8qKlxuICogQ3JlYXRlVGFibGVDYWxsYmFja1R5cGUgdHlwZS5cbiAqIEB0eXBlZGVmIHsodGFibGU6IFRhYmxlRGF0YSkgPT4gdm9pZH0gQ3JlYXRlVGFibGVDYWxsYmFja1R5cGVcbiAqL1xuLyoqXG4gKiBMZWdhY3lMb2NhbERhdGVUaW1lc01pZ3JhdGlvbkFyZ3NUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMZWdhY3lMb2NhbERhdGVUaW1lc01pZ3JhdGlvbkFyZ3NUeXBlXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gW2NvbHVtbnNCeVRhYmxlXSAtIEV4cGxpY2l0IGRhdGV0aW1lIGNvbHVtbnMga2V5ZWQgYnkgdGFibGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbGVnYWN5TG9jYWxPZmZzZXRNaW51dGVzXSAtIFVUQy1taW51cy1sb2NhbCBvZmZzZXQgaW4gbWludXRlcyBmb3IgbGVnYWN5IHJvd3MuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbdGFibGVzXSAtIFRhYmxlcyB0byBtaWdyYXRlLiBEZWZhdWx0cyB0byBhbGwgbm9uLWludGVybmFsIHRhYmxlcy5cbiAqL1xuXG5pbXBvcnQgeyBjb252ZXJ0TGVnYWN5RGF0ZVZhbHVlVG9VdGNTdG9yYWdlIH0gZnJvbSBcIi4uL2RhdGV0aW1lLXN0b3JhZ2UuanNcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcbmltcG9ydCBDcmVhdGVJbmRleEJhc2UgZnJvbSBcIi4uL3F1ZXJ5L2NyZWF0ZS1pbmRleC1iYXNlLmpzXCJcbmltcG9ydCBUYWJsZURhdGEgZnJvbSBcIi4uL3RhYmxlLWRhdGEvaW5kZXguanNcIlxuY2xhc3MgTm90SW1wbGVtZW50ZWRFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbmV4cG9ydCB7Tm90SW1wbGVtZW50ZWRFcnJvcn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VNaWdyYXRpb24ge1xuICAvKipcbiAgICogUnVucyBvbiBkYXRhYmFzZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGRhdGFiYXNlSWRlbnRpZmllcnMgLSBEYXRhYmFzZSBpZGVudGlmaWVycy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc3RhdGljIG9uRGF0YWJhc2VzKGRhdGFiYXNlSWRlbnRpZmllcnMpIHtcbiAgICB0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXJzID0gZGF0YWJhc2VJZGVudGlmaWVyc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGRhdGFiYXNlIGlkZW50aWZpZXJzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW10gfCB1bmRlZmluZWR9IC0gVGhlIGRhdGFiYXNlIGlkZW50aWZpZXJzLlxuICAgKi9cbiAgc3RhdGljIGdldERhdGFiYXNlSWRlbnRpZmllcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZGF0YWJhc2VJZGVudGlmaWVyIC0gRGF0YWJhc2UgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gYXJncy5kYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgZGF0YWJhc2VJZGVudGlmaWVyID0gXCJkZWZhdWx0XCIsIGRifSkge1xuICAgIGlmICghZGF0YWJhc2VJZGVudGlmaWVyKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBkYXRhYmFzZSBpZGVudGlmaWVyIGdpdmVuXCIpXG4gICAgaWYgKCFkYikgdGhyb3cgbmV3IEVycm9yKFwiTm8gJ2RiJyBnaXZlblwiKVxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllciA9IGRhdGFiYXNlSWRlbnRpZmllclxuICAgIHRoaXMuX2RiID0gZGJcbiAgfVxuXG4gIF9nZXREYXRhYmFzZUlkZW50aWZpZXIoKSB7XG4gICAgaWYgKCF0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXIpIHRocm93IG5ldyBFcnJvcihcIk5vIGRhdGFiYXNlIGlkZW50aWZpZXIgc2V0XCIpXG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YWJhc2VJZGVudGlmaWVyXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgZHJpdmVyLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IC0gVGhlIGRyaXZlci5cbiAgICovXG4gIGdldERyaXZlcigpIHsgcmV0dXJuIHRoaXMuX2RiIH1cbiAgY29ubmVjdGlvbigpIHsgcmV0dXJuIHRoaXMuZ2V0RHJpdmVyKCkgfVxuXG4gIGFzeW5jIGNoYW5nZSgpIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIidjaGFuZ2UnIG5vdCBpbXBsZW1lbnRlZFwiKVxuICB9XG5cbiAgYXN5bmMgdXAoKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCInY2hhbmdlJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIGFzeW5jIGRvd24oKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCInY2hhbmdlJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4ZWN1dGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBTUUwgc3RyaW5nLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuUXVlcnlSZXN1bHRUeXBlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBleGVjdXRlLlxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShzcWwpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0aW9uKCkucXVlcnkoc3FsKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGNvbHVtbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5UeXBlIC0gQ29sdW1uIHR5cGUuXG4gICAqIEBwYXJhbSB7QWRkQ29sdW1uQXJnc1R5cGV9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYWRkQ29sdW1uKHRhYmxlTmFtZSwgY29sdW1uTmFtZSwgY29sdW1uVHlwZSwgYXJncykge1xuICAgIGlmICghY29sdW1uVHlwZSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29sdW1uIHR5cGUgZ2l2ZW5cIilcblxuICAgIGNvbnN0IHRhYmxlQ29sdW1uQXJncyA9IE9iamVjdC5hc3NpZ24oe2lzTmV3Q29sdW1uOiB0cnVlLCB0eXBlOiBjb2x1bW5UeXBlfSwgYXJncylcbiAgICBjb25zdCB0YWJsZURhdGEgPSBuZXcgVGFibGVEYXRhKHRhYmxlTmFtZSlcblxuICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oY29sdW1uTmFtZSwgdGFibGVDb2x1bW5BcmdzKVxuXG4gICAgY29uc3Qgc3FscyA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuYWx0ZXJUYWJsZVNRTHModGFibGVEYXRhKVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5xdWVyeShzcWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIGNvbHVtbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyByZW1vdmVDb2x1bW4odGFibGVOYW1lLCBjb2x1bW5OYW1lKSB7XG4gICAgY29uc3QgdGFibGVDb2x1bW5BcmdzID0gT2JqZWN0LmFzc2lnbih7ZHJvcENvbHVtbjogdHJ1ZX0pXG4gICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFRhYmxlRGF0YSh0YWJsZU5hbWUpXG5cbiAgICB0YWJsZURhdGEuYWRkQ29sdW1uKGNvbHVtbk5hbWUsIHRhYmxlQ29sdW1uQXJncylcblxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmFsdGVyVGFibGVTUUxzKHRhYmxlRGF0YSlcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRJbmRleEFyZ3NUeXBlIHR5cGUuXG4gICAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZEluZGV4QXJnc1R5cGVcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbaWZOb3RFeGlzdHNdIC0gU2tpcCBjcmVhdGlvbiBpZiB0aGUgaW5kZXggYWxyZWFkeSBleGlzdHMuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBFeHBsaWNpdCBpbmRleCBuYW1lIHRvIHVzZS5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbdW5pcXVlXSAtIFdoZXRoZXIgdGhlIGluZGV4IHNob3VsZCBiZSB1bmlxdWUuXG4gICAqL1xuICAvKipcbiAgICogUnVucyBhZGQgaW5kZXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IGltcG9ydChcIi4uL3RhYmxlLWRhdGEvdGFibGUtY29sdW1uLmpzXCIpLmRlZmF1bHQ+fSBjb2x1bW5zIC0gQ29sdW1uIG5hbWUgb3IgYXJyYXkgb2YgY29sdW1uIG5hbWVzLlxuICAgKiBAcGFyYW0ge0FkZEluZGV4QXJnc1R5cGV9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYWRkSW5kZXgodGFibGVOYW1lLCBjb2x1bW5zLCBhcmdzKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENvbHVtbnMgPSB0eXBlb2YgY29sdW1ucyA9PT0gXCJzdHJpbmdcIiA/IFtjb2x1bW5zXSA6IGNvbHVtbnNcbiAgICBjb25zdCBjcmVhdGVJbmRleEFyZ3MgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBjb2x1bW5zOiBub3JtYWxpemVkQ29sdW1ucyxcbiAgICAgICAgdGFibGVOYW1lXG4gICAgICB9LFxuICAgICAgYXJnc1xuICAgIClcbiAgICBjb25zdCBzcWxzID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5jcmVhdGVJbmRleFNRTHMoY3JlYXRlSW5kZXhBcmdzKVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5xdWVyeShzcWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZUluZGV4QXJnc1R5cGUgdHlwZS5cbiAgICogQHR5cGVkZWYge29iamVjdH0gUmVtb3ZlSW5kZXhBcmdzVHlwZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gRXhwbGljaXQgaW5kZXggbmFtZSB0byByZW1vdmUuXG4gICAqL1xuICAvKipcbiAgICogUnVucyByZW1vdmUgaW5kZXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IGltcG9ydChcIi4uL3RhYmxlLWRhdGEvdGFibGUtY29sdW1uLmpzXCIpLmRlZmF1bHQ+fSBuYW1lT3JDb2x1bW5zIC0gSW5kZXggbmFtZSBvciBjb2x1bW5zIHdob3NlIGRlZmF1bHQgYWRkSW5kZXggbmFtZSBzaG91bGQgYmUgcmVtb3ZlZC5cbiAgICogQHBhcmFtIHtSZW1vdmVJbmRleEFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJlbW92ZUluZGV4KHRhYmxlTmFtZSwgbmFtZU9yQ29sdW1ucywgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge25hbWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCByZW1vdmVJbmRleE5hbWUgPSBuYW1lIHx8IHRoaXMuX3JlbW92ZUluZGV4TmFtZSh0YWJsZU5hbWUsIG5hbWVPckNvbHVtbnMpXG4gICAgY29uc3Qgc3FscyA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucmVtb3ZlSW5kZXhTUUxzKHtuYW1lOiByZW1vdmVJbmRleE5hbWUsIHRhYmxlTmFtZX0pXG5cbiAgICBmb3IgKGNvbnN0IHNxbCBvZiBzcWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLnF1ZXJ5KHNxbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZW1vdmUgaW5kZXggbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgaW1wb3J0KFwiLi4vdGFibGUtZGF0YS90YWJsZS1jb2x1bW4uanNcIikuZGVmYXVsdD59IG5hbWVPckNvbHVtbnMgLSBJbmRleCBuYW1lIG9yIGNvbHVtbnMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGluZGV4IG5hbWUuXG4gICAqL1xuICBfcmVtb3ZlSW5kZXhOYW1lKHRhYmxlTmFtZSwgbmFtZU9yQ29sdW1ucykge1xuICAgIGlmICh0eXBlb2YgbmFtZU9yQ29sdW1ucyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG5hbWVPckNvbHVtbnNcblxuICAgIGNvbnN0IGNyZWF0ZUluZGV4ID0gbmV3IENyZWF0ZUluZGV4QmFzZSh7XG4gICAgICBjb2x1bW5zOiBuYW1lT3JDb2x1bW5zLFxuICAgICAgZHJpdmVyOiB0aGlzLmdldERyaXZlcigpLFxuICAgICAgdGFibGVOYW1lXG4gICAgfSlcblxuICAgIHJldHVybiBjcmVhdGVJbmRleC5nZW5lcmF0ZUluZGV4TmFtZSgpXG4gIH1cblxuICAvKipcbiAgICogQWRkRm9yZWlnbktleUFyZ3NUeXBlIHR5cGUuXG4gICAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZEZvcmVpZ25LZXlBcmdzVHlwZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbHVtbk5hbWVdIC0gT3ZlcnJpZGUgdGhlIGRlcml2ZWQgRksgY29sdW1uIG5hbWUgKGRlZmF1bHQ6IGAke3JlZmVyZW5jZV91bmRlcnNjb3JlZH1faWRgKS5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIE92ZXJyaWRlIHRoZSBkZXJpdmVkIGNvbnN0cmFpbnQgbmFtZSAoZGVmYXVsdDogYGZrXyR7dGFibGVOYW1lfV8ke3JlZmVyZW5jZU5hbWV9YCkuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVmZXJlbmNlZENvbHVtbk5hbWVdIC0gT3ZlcnJpZGUgdGhlIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgKGRlZmF1bHQ6IGBpZGApLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3JlZmVyZW5jZWRUYWJsZU5hbWVdIC0gT3ZlcnJpZGUgdGhlIGRlcml2ZWQgcmVmZXJlbmNlZCB0YWJsZSAoZGVmYXVsdDogcGx1cmFsaXplZCBgcmVmZXJlbmNlTmFtZWApLlxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGZvcmVpZ24ga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgdGhlIEZLIGxpdmVzIG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmZXJlbmNlTmFtZSAtIFNpbmd1bGFyIHJlZmVyZW5jZSBuYW1lLiBEZWZhdWx0cyBkZXJpdmVcbiAgICogICB0aGUgRksgY29sdW1uIGFzIGAke3JlZmVyZW5jZX1faWRgLCB0aGUgcmVmZXJlbmNlZCB0YWJsZSBieSBwbHVyYWxpemluZ1xuICAgKiAgIHRoZSByZWZlcmVuY2UsIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBhcyBgaWRgLCBhbmQgdGhlIGNvbnN0cmFpbnQgbmFtZVxuICAgKiAgIGFzIGBma18ke3RhYmxlTmFtZX1fJHtyZWZlcmVuY2VOYW1lfWAuIE92ZXJyaWRlIGFueSBvZiB0aG9zZSB2aWEgYGFyZ3NgXG4gICAqICAgd2hlbiB0aGUgc2NoZW1hIGRvZXNuJ3QgZm9sbG93IHRoZSBjb252ZW50aW9uLlxuICAgKiBAcGFyYW0ge0FkZEZvcmVpZ25LZXlBcmdzVHlwZX0gW2FyZ3NdIC0gT3B0aW9uYWwgb3ZlcnJpZGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYWRkRm9yZWlnbktleSh0YWJsZU5hbWUsIHJlZmVyZW5jZU5hbWUsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtjb2x1bW5OYW1lLCBuYW1lLCByZWZlcmVuY2VkQ29sdW1uTmFtZSwgcmVmZXJlbmNlZFRhYmxlTmFtZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGNvbnN0IHJlZmVyZW5jZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKHJlZmVyZW5jZU5hbWUpXG4gICAgY29uc3QgcmVzb2x2ZWRSZWZlcmVuY2VkVGFibGVOYW1lID0gcmVmZXJlbmNlZFRhYmxlTmFtZSB8fCBpbmZsZWN0aW9uLnBsdXJhbGl6ZShyZWZlcmVuY2VOYW1lVW5kZXJzY29yZSlcbiAgICBjb25zdCByZXNvbHZlZENvbHVtbk5hbWUgPSBjb2x1bW5OYW1lIHx8IGAke3JlZmVyZW5jZU5hbWVVbmRlcnNjb3JlfV9pZGBcbiAgICBjb25zdCByZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gcmVmZXJlbmNlZENvbHVtbk5hbWUgfHwgXCJpZFwiXG4gICAgY29uc3QgcmVzb2x2ZWROYW1lID0gbmFtZSB8fCBgZmtfJHt0YWJsZU5hbWV9XyR7cmVmZXJlbmNlTmFtZX1gXG5cbiAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLmFkZEZvcmVpZ25LZXkoXG4gICAgICB0YWJsZU5hbWUsXG4gICAgICByZXNvbHZlZENvbHVtbk5hbWUsXG4gICAgICByZXNvbHZlZFJlZmVyZW5jZWRUYWJsZU5hbWUsXG4gICAgICByZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lLFxuICAgICAge1xuICAgICAgICBpc05ld0ZvcmVpZ25LZXk6IHRydWUsXG4gICAgICAgIG5hbWU6IHJlc29sdmVkTmFtZVxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmZXJlbmNlTmFtZSAtIFJlZmVyZW5jZSBuYW1lLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmZvcmVpZ25LZXldIC0gV2hldGhlciBmb3JlaWduIGtleS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5udWxsXSAtIFdoZXRoZXIgbnVsbGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy50eXBlXSAtIFR5cGUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy51bmlxdWVdIC0gV2hldGhlciB1bmlxdWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBhZGRSZWZlcmVuY2UodGFibGVOYW1lLCByZWZlcmVuY2VOYW1lLCBhcmdzKSB7XG4gICAgY29uc3Qge2ZvcmVpZ25LZXksIG51bGw6IG51bGxhYmxlLCB0eXBlLCB1bmlxdWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gYCR7aW5mbGVjdGlvbi51bmRlcnNjb3JlKHJlZmVyZW5jZU5hbWUpfV9pZGBcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCBjb2x1bW5UeXBlID0gdHlwZSB8fCBcImludGVnZXJcIlxuICAgIGNvbnN0IGNvbHVtbkFyZ3MgPSBudWxsYWJsZSAhPT0gdW5kZWZpbmVkID8ge251bGw6IG51bGxhYmxlfSA6IHVuZGVmaW5lZFxuXG4gICAgYXdhaXQgdGhpcy5hZGRDb2x1bW4odGFibGVOYW1lLCBjb2x1bW5OYW1lLCBjb2x1bW5UeXBlLCBjb2x1bW5BcmdzKVxuICAgIGF3YWl0IHRoaXMuYWRkSW5kZXgodGFibGVOYW1lLCBbY29sdW1uTmFtZV0sIHt1bmlxdWU6IHVuaXF1ZX0pXG5cbiAgICBpZiAoZm9yZWlnbktleSkge1xuICAgICAgYXdhaXQgdGhpcy5hZGRGb3JlaWduS2V5KHRhYmxlTmFtZSwgcmVmZXJlbmNlTmFtZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZW1vdmUgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZmVyZW5jZU5hbWUgLSBSZWZlcmVuY2UgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJlbW92ZVJlZmVyZW5jZSh0YWJsZU5hbWUsIHJlZmVyZW5jZU5hbWUpIHtcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gYCR7aW5mbGVjdGlvbi51bmRlcnNjb3JlKHJlZmVyZW5jZU5hbWUpfV9pZGBcblxuICAgIHRoaXMucmVtb3ZlQ29sdW1uKHRhYmxlTmFtZSwgY29sdW1uTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNoYW5nZSBjb2x1bW4gbnVsbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gbnVsbGFibGUgLSBXaGV0aGVyIG51bGxhYmxlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY2hhbmdlQ29sdW1uTnVsbCh0YWJsZU5hbWUsIGNvbHVtbk5hbWUsIG51bGxhYmxlKSB7XG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmdldFRhYmxlQnlOYW1lKHRhYmxlTmFtZSlcblxuICAgIGlmICghdGFibGUpIHRocm93IG5ldyBFcnJvcihgVGFibGUgJHt0YWJsZU5hbWV9IGRvZXMgbm90IGV4aXN0YClcblxuICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHRhYmxlLmdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lKVxuXG4gICAgaWYgKCFjb2x1bW4pIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICR7Y29sdW1uTmFtZX0gZG9lcyBub3QgZXhpc3QgaW4gdGFibGUgJHt0YWJsZU5hbWV9YClcblxuICAgIGF3YWl0IGNvbHVtbi5jaGFuZ2VOdWxsYWJsZShudWxsYWJsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBNaWdyYXRlcyBsZWdhY3kgdGltZXpvbmUtbGVzcyBsb2NhbCBkYXRldGltZSByb3dzIGludG8gVVRDIGRhdGV0aW1lIHN0b3JhZ2UuXG4gICAqIE5ldyBTUUxpdGUgVVRDIHJvd3MgaW5jbHVkZSBhIHRpbWV6b25lIHN1ZmZpeCBhbmQgYXJlIHNraXBwZWQuXG4gICAqIEBwYXJhbSB7TGVnYWN5TG9jYWxEYXRlVGltZXNNaWdyYXRpb25BcmdzVHlwZX0gW2FyZ3NdIC0gTWlncmF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBtaWdyYXRlTGVnYWN5TG9jYWxEYXRlVGltZXNUb1V0Y1N0b3JhZ2UoYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge2NvbHVtbnNCeVRhYmxlLCBsZWdhY3lMb2NhbE9mZnNldE1pbnV0ZXMsIHRhYmxlcywgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGNvbnN0IHRhYmxlTmFtZXMgPSBhd2FpdCB0aGlzLl9sZWdhY3lMb2NhbERhdGVUaW1lc1RhYmxlTmFtZXModGFibGVzKVxuXG4gICAgZm9yIChjb25zdCB0YWJsZU5hbWUgb2YgdGFibGVOYW1lcykge1xuICAgICAgYXdhaXQgdGhpcy5fbWlncmF0ZUxlZ2FjeUxvY2FsRGF0ZVRpbWVzVGFibGUoe1xuICAgICAgICBjb2x1bW5zQnlUYWJsZSxcbiAgICAgICAgbGVnYWN5TG9jYWxPZmZzZXRNaW51dGVzLFxuICAgICAgICB0YWJsZU5hbWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRhYmxlIG5hbWVzIGZvciBhIGxlZ2FjeSBsb2NhbCBkYXRldGltZSBtaWdyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCB1bmRlZmluZWR9IHRhYmxlcyAtIEV4cGxpY2l0IHRhYmxlIG5hbWVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gVGFibGUgbmFtZXMuXG4gICAqL1xuICBhc3luYyBfbGVnYWN5TG9jYWxEYXRlVGltZXNUYWJsZU5hbWVzKHRhYmxlcykge1xuICAgIGlmICh0YWJsZXMpIHJldHVybiB0YWJsZXNcblxuICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5nZXRUYWJsZXMoKSlcbiAgICAgIC5tYXAoKHRhYmxlKSA9PiB0YWJsZS5nZXROYW1lKCkpXG4gICAgICAuZmlsdGVyKCh0YWJsZU5hbWUpID0+IHRhYmxlTmFtZSAhPSBcInNjaGVtYV9taWdyYXRpb25zXCIgJiYgIXRhYmxlTmFtZS5zdGFydHNXaXRoKFwic3FsaXRlX1wiKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBNaWdyYXRlcyBvbmUgdGFibGUncyBsZWdhY3kgbG9jYWwgZGF0ZXRpbWUgdmFsdWVzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkfSBhcmdzLmNvbHVtbnNCeVRhYmxlIC0gRXhwbGljaXQgY29sdW1ucyBrZXllZCBieSB0YWJsZS5cbiAgICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWR9IGFyZ3MubGVnYWN5TG9jYWxPZmZzZXRNaW51dGVzIC0gVVRDLW1pbnVzLWxvY2FsIG9mZnNldCBpbiBtaW51dGVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy50YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX21pZ3JhdGVMZWdhY3lMb2NhbERhdGVUaW1lc1RhYmxlKHtjb2x1bW5zQnlUYWJsZSwgbGVnYWN5TG9jYWxPZmZzZXRNaW51dGVzLCB0YWJsZU5hbWV9KSB7XG4gICAgY29uc3QgZHJpdmVyID0gdGhpcy5nZXREcml2ZXIoKVxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgZHJpdmVyLmdldFRhYmxlQnlOYW1lT3JGYWlsKHRhYmxlTmFtZSlcbiAgICBjb25zdCBjb2x1bW5zID0gYXdhaXQgdGhpcy5fbGVnYWN5TG9jYWxEYXRlVGltZXNDb2x1bW5zKHtjb2x1bW5zQnlUYWJsZSwgdGFibGV9KVxuXG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHByaW1hcnlLZXlDb2x1bW4gPSBhd2FpdCB0aGlzLl9sZWdhY3lMb2NhbERhdGVUaW1lc1ByaW1hcnlLZXkodGFibGUpXG4gICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gW3ByaW1hcnlLZXlDb2x1bW4sIC4uLmNvbHVtbnNdXG4gICAgY29uc3Qgc2VsZWN0U3FsID0gc2VsZWN0ZWRDb2x1bW5zXG4gICAgICAubWFwKChjb2x1bW5OYW1lKSA9PiBkcml2ZXIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSkpXG4gICAgICAuam9pbihcIiwgXCIpXG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IGRyaXZlci5xdWVyeShgU0VMRUNUICR7c2VsZWN0U3FsfSBGUk9NICR7ZHJpdmVyLnF1b3RlVGFibGUodGFibGVOYW1lKX1gKVxuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgZm9yIChjb25zdCBjb2x1bW5OYW1lIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByb3dbY29sdW1uTmFtZV1cbiAgICAgICAgY29uc3QgY29udmVydGVkVmFsdWUgPSBjb252ZXJ0TGVnYWN5RGF0ZVZhbHVlVG9VdGNTdG9yYWdlKHZhbHVlLCB7XG4gICAgICAgICAgZGF0YWJhc2VUeXBlOiBkcml2ZXIuZ2V0VHlwZSgpLFxuICAgICAgICAgIGxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlc1xuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChjb252ZXJ0ZWRWYWx1ZSA9PT0gdmFsdWUpIGNvbnRpbnVlXG5cbiAgICAgICAgYXdhaXQgZHJpdmVyLnF1ZXJ5KGBcbiAgICAgICAgICBVUERBVEUgJHtkcml2ZXIucXVvdGVUYWJsZSh0YWJsZU5hbWUpfVxuICAgICAgICAgIFNFVCAke2RyaXZlci5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKX0gPSAke2RyaXZlci5xdW90ZShjb252ZXJ0ZWRWYWx1ZSl9XG4gICAgICAgICAgV0hFUkUgJHtkcml2ZXIucXVvdGVDb2x1bW4ocHJpbWFyeUtleUNvbHVtbil9ID0gJHtkcml2ZXIucXVvdGUocm93W3ByaW1hcnlLZXlDb2x1bW5dKX1cbiAgICAgICAgYClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgZGF0ZS1saWtlIGNvbHVtbnMgZm9yIG9uZSB0YWJsZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IHVuZGVmaW5lZH0gYXJncy5jb2x1bW5zQnlUYWJsZSAtIEV4cGxpY2l0IGNvbHVtbnMga2V5ZWQgYnkgdGFibGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLXRhYmxlLmpzXCIpLmRlZmF1bHR9IGFyZ3MudGFibGUgLSBUYWJsZSBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIERhdGUtbGlrZSBjb2x1bW4gbmFtZXMuXG4gICAqL1xuICBhc3luYyBfbGVnYWN5TG9jYWxEYXRlVGltZXNDb2x1bW5zKHtjb2x1bW5zQnlUYWJsZSwgdGFibGV9KSB7XG4gICAgY29uc3QgZXhwbGljaXRDb2x1bW5zID0gY29sdW1uc0J5VGFibGU/Llt0YWJsZS5nZXROYW1lKCldXG5cbiAgICBpZiAoZXhwbGljaXRDb2x1bW5zKSByZXR1cm4gZXhwbGljaXRDb2x1bW5zXG5cbiAgICByZXR1cm4gKGF3YWl0IHRhYmxlLmdldENvbHVtbnMoKSlcbiAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gdGhpcy5fbGVnYWN5TG9jYWxEYXRlVGltZXNDb2x1bW5Jc0RhdGVMaWtlKGNvbHVtbikpXG4gICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5nZXROYW1lKCkpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBjb2x1bW4gc2hvdWxkIGJlIGluY2x1ZGVkIGJ5IGRlZmF1bHQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLWNvbHVtbi5qc1wiKS5kZWZhdWx0fSBjb2x1bW4gLSBDb2x1bW4gbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyBkYXRlLWxpa2UuXG4gICAqL1xuICBfbGVnYWN5TG9jYWxEYXRlVGltZXNDb2x1bW5Jc0RhdGVMaWtlKGNvbHVtbikge1xuICAgIGNvbnN0IGNvbHVtblR5cGUgPSBjb2x1bW4uZ2V0VHlwZSgpLnRvTG93ZXJDYXNlKClcblxuICAgIHJldHVybiBjb2x1bW5UeXBlLmluY2x1ZGVzKFwiZGF0ZVwiKSB8fCBjb2x1bW5UeXBlLmluY2x1ZGVzKFwidGltZXN0YW1wXCIpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHNpbmdsZSBwcmltYXJ5IGtleSBjb2x1bW4gZm9yIHJvdyB1cGRhdGVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0fSB0YWJsZSAtIFRhYmxlIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIFByaW1hcnkga2V5IGNvbHVtbiBuYW1lLlxuICAgKi9cbiAgYXN5bmMgX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzUHJpbWFyeUtleSh0YWJsZSkge1xuICAgIGNvbnN0IHByaW1hcnlLZXlDb2x1bW5zID0gKGF3YWl0IHRhYmxlLmdldENvbHVtbnMoKSkuZmlsdGVyKChjb2x1bW4pID0+IGNvbHVtbi5nZXRQcmltYXJ5S2V5KCkpXG5cbiAgICBpZiAocHJpbWFyeUtleUNvbHVtbnMubGVuZ3RoICE9IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSBvbmUgcHJpbWFyeSBrZXkgb24gJHt0YWJsZS5nZXROYW1lKCl9IGJ1dCBmb3VuZCAke3ByaW1hcnlLZXlDb2x1bW5zLmxlbmd0aH1gKVxuICAgIH1cblxuICAgIHJldHVybiBwcmltYXJ5S2V5Q29sdW1uc1swXS5nZXROYW1lKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbHVtbiBleGlzdHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBSZXNvbHZlcyB3aXRoIFdoZXRoZXIgY29sdW1uIGV4aXN0cy5cbiAgICovXG4gIGFzeW5jIGNvbHVtbkV4aXN0cyh0YWJsZU5hbWUsIGNvbHVtbk5hbWUpIHtcbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZ2V0VGFibGVCeU5hbWUodGFibGVOYW1lKVxuXG4gICAgaWYgKHRhYmxlKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCB0YWJsZS5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSlcblxuICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBCb29sZWFuKGZhbHNlKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgdGhlIGRhdGFiYXNlIHNjaGVtYSBmb3IgYSBnYXAtbGVzcyBwb3NpdGlvbmFsIGxpc3QuIEFkZHMgdGhlXG4gICAqIHBvc2l0aW9uIGNvbHVtbiAoSU5UIE5PVCBOVUxMKSBpZiBhYnNlbnQgYW5kIGNyZWF0ZXMgYSBVTklRVUUgaW5kZXggb25cbiAgICogKHNjb3BlLCBwb3NpdGlvbikuIFRoaXMgaXMgdGhlIHNjaGVtYS1zaWRlIGNvdW50ZXJwYXJ0IG9mXG4gICAqIGBNb2RlbC5hY3RzQXNMaXN0KClgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBvc2l0aW9uQ29sdW1uIC0gQ29sdW1uIG5hbWUgZm9yIHRoZSBwb3NpdGlvbiAoZS5nLiBcInJvd19udW1iZXJcIikuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuc2NvcGUgLSBDb2x1bW4gbmFtZSBmb3IgdGhlIHNjb3BlIChlLmcuIFwiYm9hcmRfY29sdW1uX2lkXCIpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGFkZEFjdHNBc0xpc3QodGFibGVOYW1lLCBwb3NpdGlvbkNvbHVtbiwge3Njb3BlfSkge1xuICAgIGlmICghKGF3YWl0IHRoaXMuY29sdW1uRXhpc3RzKHRhYmxlTmFtZSwgcG9zaXRpb25Db2x1bW4pKSkge1xuICAgICAgYXdhaXQgdGhpcy5hZGRDb2x1bW4odGFibGVOYW1lLCBwb3NpdGlvbkNvbHVtbiwgXCJpbnRlZ2VyXCIsIHtudWxsOiBmYWxzZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuY2hhbmdlQ29sdW1uTnVsbCh0YWJsZU5hbWUsIHBvc2l0aW9uQ29sdW1uLCBmYWxzZSlcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFkZEluZGV4KHRhYmxlTmFtZSwgW3Njb3BlLCBwb3NpdGlvbkNvbHVtbl0sIHt1bmlxdWU6IHRydWV9KVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0YWJsZSB3aXRoIGRlZmF1bHQgb3B0aW9ucy5cbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge0NyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0YWJsZSB3aXRoIGV4cGxpY2l0IG9wdGlvbnMuXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtDcmVhdGVUYWJsZUFyZ3NUeXBlfSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGFibGVDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICAvKipcbiAgICogUnVucyBjcmVhdGUgdGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge0NyZWF0ZVRhYmxlQXJnc1R5cGUgfCBDcmVhdGVUYWJsZUNhbGxiYWNrVHlwZX0gYXJnMSAtIEFyZzEuXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGFibGVDYWxsYmFja1R5cGUgfCB1bmRlZmluZWR9IFthcmcyXSAtIEFyZzIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjcmVhdGVUYWJsZSh0YWJsZU5hbWUsIGFyZzEsIGFyZzIpIHtcbiAgICBsZXQgYXJnc1xuICAgIGxldCBjYWxsYmFja1xuXG4gICAgaWYgKHR5cGVvZiBhcmcxID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYXJncyA9IHt9XG4gICAgICBjYWxsYmFjayA9IGFyZzFcbiAgICB9IGVsc2Uge1xuICAgICAgYXJncyA9IGFyZzFcbiAgICAgIGNhbGxiYWNrID0gYXJnMlxuICAgIH1cblxuICAgIGNvbnN0IHtpZCA9IHt9LCBpZk5vdEV4aXN0cyA9IGZhbHNlLCAuLi5yZXN0QXJnc30gPSBhcmdzXG4gICAgY29uc3QgZHJpdmVyID0gdGhpcy5nZXREcml2ZXIoKVxuICAgIGNvbnN0IGRlZmF1bHRQcmltYXJ5S2V5VHlwZSA9IGRyaXZlci5wcmltYXJ5S2V5VHlwZSgpXG4gICAgbGV0IGlkRGVmYXVsdCwgaWRUeXBlLCByZXN0QXJnc0lkXG5cbiAgICBpZiAoaWQgIT09IGZhbHNlKSB7XG4gICAgICAoe2RlZmF1bHQ6IGlkRGVmYXVsdCwgdHlwZTogaWRUeXBlLCAuLi5yZXN0QXJnc0lkfSA9IGlkKVxuXG4gICAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzSWQpXG4gICAgfVxuXG4gICAgaWYgKCFpZFR5cGUpIHtcbiAgICAgIGlkVHlwZSA9IGRlZmF1bHRQcmltYXJ5S2V5VHlwZVxuICAgIH1cbiAgICBjb25zdCBkcml2ZXJTdXBwb3J0c0RlZmF1bHRVVUlEID0gZHJpdmVyLnN1cHBvcnRzRGVmYXVsdFByaW1hcnlLZXlVVUlEPy4oKVxuICAgIGNvbnN0IGxvd2VySWRUeXBlID0gaWRUeXBlPy50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgaXNVVUlEUHJpbWFyeUtleSA9IGxvd2VySWRUeXBlID09IFwidXVpZFwiXG4gICAgY29uc3QgbnVtZXJpY0F1dG9JbmNyZW1lbnRUeXBlcyA9IFtcImludFwiLCBcImludGVnZXJcIiwgXCJiaWdpbnRcIiwgXCJzbWFsbGludFwiLCBcInRpbnlpbnRcIl1cbiAgICBsZXQgaWRBdXRvSW5jcmVtZW50ID0gbnVtZXJpY0F1dG9JbmNyZW1lbnRUeXBlcy5pbmNsdWRlcyhsb3dlcklkVHlwZSB8fCBcIlwiKVxuXG4gICAgaWYgKGlzVVVJRFByaW1hcnlLZXkpIHtcbiAgICAgIGlkQXV0b0luY3JlbWVudCA9IGZhbHNlXG5cbiAgICAgIGlmIChkcml2ZXJTdXBwb3J0c0RlZmF1bHRVVUlEKSB7XG4gICAgICAgIGlmIChpZERlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlkRGVmYXVsdCA9ICgpID0+IFwiVVVJRCgpXCJcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpZERlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMZXQgYXBwbGljYXRpb24gY29kZSBhc3NpZ24gVVVJRHMgKHNlZSBEYXRhYmFzZVJlY29yZC5pbnNlcnQpIHdoZW4gdGhlIGRyaXZlciBjYW4ndCBkbyBpdC5cbiAgICAgICAgaWREZWZhdWx0ID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgICAvLyBJZiBkcml2ZXIgZG9lc24ndCBzdXBwb3J0IFVVSUQoKSBidXQgdGhlIGNhbGxlciBleHBsaWNpdGx5IHNldCBhIGRlZmF1bHQsIHJlc3BlY3QgaXQuXG4gICAgfVxuXG4gICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFRhYmxlRGF0YSh0YWJsZU5hbWUsIHtpZk5vdEV4aXN0cywgcHJpbWFyeUtleVR5cGU6IGRlZmF1bHRQcmltYXJ5S2V5VHlwZX0pXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgaWYgKCEoaWRUeXBlIGluIHRhYmxlRGF0YSkpIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcHJpbWFyeSBrZXkgdHlwZTogJHtpZFR5cGV9YClcblxuICAgIGlmIChpZCAhPT0gZmFsc2UpIHtcbiAgICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oXCJpZFwiLCB7YXV0b0luY3JlbWVudDogaWRBdXRvSW5jcmVtZW50LCBkZWZhdWx0OiBpZERlZmF1bHQsIG51bGw6IGZhbHNlLCBwcmltYXJ5S2V5OiB0cnVlLCB0eXBlOiBpZFR5cGV9KVxuICAgIH1cblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sodGFibGVEYXRhKVxuICAgIH1cblxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCBkcml2ZXIuY3JlYXRlVGFibGVTcWwodGFibGVEYXRhKVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgYXdhaXQgdGhpcy5fZGIucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRyb3AgdGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZHJvcFRhYmxlKHRhYmxlTmFtZSkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZHJvcFRhYmxlKHRhYmxlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbmFtZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2xkQ29sdW1uTmFtZSAtIFByZXZpb3VzIGNvbHVtbiBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3Q29sdW1uTmFtZSAtIE5ldyBjb2x1bW4gbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJlbmFtZUNvbHVtbih0YWJsZU5hbWUsIG9sZENvbHVtbk5hbWUsIG5ld0NvbHVtbk5hbWUpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLnJlbmFtZUNvbHVtbih0YWJsZU5hbWUsIG9sZENvbHVtbk5hbWUsIG5ld0NvbHVtbk5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0YWJsZSBleGlzdHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBSZXNvbHZlcyB3aXRoIFdoZXRoZXIgdGFibGUgZXhpc3RzLlxuICAgKi9cbiAgYXN5bmMgdGFibGVFeGlzdHModGFibGVOYW1lKSB7XG4gICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS50YWJsZUV4aXN0cyh0YWJsZU5hbWUpXG5cbiAgICByZXR1cm4gZXhpc3RzXG4gIH1cbn1cbiJdfQ==
|
|
583
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvbWlncmF0aW9uL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7Ozs7Ozs7Ozs7R0FXRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7O0dBR0c7QUFDSDs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUMzRSxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLGFBQWEsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUMxRCxPQUFPLGVBQWUsTUFBTSwrQkFBK0IsQ0FBQTtBQUMzRCxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM5QyxNQUFNLG1CQUFvQixTQUFRLEtBQUs7Q0FBRztBQUUxQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsQ0FBQTtBQUU1QixNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUI7UUFDcEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG1CQUFtQixDQUFBO0lBQ2pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFBO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLGtCQUFrQixHQUFHLFNBQVMsRUFBRSxFQUFFLEVBQUM7UUFDN0QsSUFBSSxDQUFDLGtCQUFrQjtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQTtRQUN4RSxJQUFJLENBQUMsRUFBRTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUE7UUFFekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7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QUUsYUFBYSxFQUFFLElBQUk7UUFDL0MsTUFBTSxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxRQUFRLEVBQUMsR0FBRyxJQUFJLENBQUE7UUFDcEUsTUFBTSxVQUFVLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUE7UUFFL0QsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZCLE1BQU0sVUFBVSxHQUFHLElBQUksSUFBSSxTQUFTLENBQUE7UUFDcEMsTUFBTSxVQUFVLEdBQUcsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtRQUV4RSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDbkUsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7UUFFOUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLGFBQWE7UUFDNUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUE7UUFFL0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVE7UUFDcEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRTlELElBQUksQ0FBQyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLFNBQVMsaUJBQWlCLENBQUMsQ0FBQTtRQUVoRSxNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUE7UUFFdEQsSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsVUFBVSw0QkFBNEIsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUV6RixNQUFNLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLElBQUksR0FBRyxFQUFFO1FBQ3JELE1BQU0sRUFBQyxjQUFjLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsSUFBSSxDQUFBO1FBRTVFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUVyRSxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxDQUFDLGlDQUFpQyxDQUFDO2dCQUMzQyxjQUFjO2dCQUNkLHdCQUF3QjtnQkFDeEIsU0FBUzthQUNWLENBQUMsQ0FBQTtRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxNQUFNO1FBQzFDLElBQUksTUFBTTtZQUFFLE9BQU8sTUFBTSxDQUFBO1FBRXpCLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzthQUN4QyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUMvQixNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsSUFBSSxtQkFBbUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtJQUNoRyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxFQUFDLGNBQWMsRUFBRSx3QkFBd0IsRUFBRSxTQUFTLEVBQUM7UUFDM0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQy9CLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQzFELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUFDLEVBQUMsY0FBYyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7UUFFaEYsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFNO1FBRWhDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDMUUsTUFBTSxlQUFlLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFBO1FBQ3RELE1BQU0sU0FBUyxHQUFHLGVBQWU7YUFDOUIsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNiLE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLFNBQVMsU0FBUyxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUUzRixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLEtBQUssTUFBTSxVQUFVLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtnQkFDN0IsTUFBTSxjQUFjLEdBQUcsa0NBQWtDLENBQUMsS0FBSyxFQUFFO29CQUMvRCxZQUFZLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRTtvQkFDOUIsd0JBQXdCO2lCQUN6QixDQUFDLENBQUE7Z0JBRUYsSUFBSSxjQUFjLEtBQUssS0FBSztvQkFBRSxTQUFRO2dCQUV0QyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUM7bUJBQ1IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7Z0JBQy9CLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7a0JBQzlELE1BQU0sQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ3RGLENBQUMsQ0FBQTtZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxFQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUM7UUFDeEQsTUFBTSxlQUFlLEdBQUcsY0FBYyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFFekQsSUFBSSxlQUFlO1lBQUUsT0FBTyxlQUFlLENBQUE7UUFFM0MsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQzlCLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3RFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFDdEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxxQ0FBcUMsQ0FBQyxNQUFNO1FBQzFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUVqRCxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUN4RSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxLQUFLO1FBQ3pDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUE7UUFFL0YsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxjQUFjLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDakgsQ0FBQztRQUVELE9BQU8saUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDdkMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsVUFBVTtRQUN0QyxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFOUQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sTUFBTSxHQUFHLE1BQU0sS0FBSyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUV0RCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLE9BQU8sSUFBSSxDQUFBO1lBQ2IsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN2QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLGNBQWMsRUFBRSxFQUFDLEtBQUssRUFBQztRQUNwRCxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxRCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtRQUMzRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDL0QsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtJQUN6RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0g7Ozs7Ozs7T0FPRztJQUNIOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJO1FBQ3JDLElBQUksSUFBSSxDQUFBO1FBQ1IsSUFBSSxRQUFRLENBQUE7UUFFWixJQUFJLE9BQU8sSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzlCLElBQUksR0FBRyxFQUFFLENBQUE7WUFDVCxRQUFRLEdBQUcsSUFBSSxDQUFBO1FBQ2pCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxHQUFHLElBQUksQ0FBQTtZQUNYLFFBQVEsR0FBRyxJQUFJLENBQUE7UUFDakIsQ0FBQztRQUVELE1BQU0sRUFBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsR0FBRyxLQUFLLEVBQUUsR0FBRyxRQUFRLEVBQUMsR0FBRyxJQUFJLENBQUE7UUFDeEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQy9CLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFBO1FBQ3JELElBQUksU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUE7UUFFakMsSUFBSSxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDakIsQ0FBQyxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLFVBQVUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO1lBRXhELGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUMzQixDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxHQUFHLHFCQUFxQixDQUFBO1FBQ2hDLENBQUM7UUFDRCxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyw2QkFBNkIsRUFBRSxFQUFFLENBQUE7UUFDMUUsTUFBTSxXQUFXLEdBQUcsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFBO1FBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxJQUFJLE1BQU0sQ0FBQTtRQUM5QyxNQUFNLHlCQUF5QixHQUFHLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQ3JGLElBQUksZUFBZSxHQUFHLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUE7UUFFM0UsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLGVBQWUsR0FBRyxLQUFLLENBQUE7WUFFdkIsSUFBSSx5QkFBeUIsRUFBRSxDQUFDO2dCQUM5QixJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDNUIsU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQTtnQkFDNUIsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ25DLDZGQUE2RjtnQkFDN0YsU0FBUyxHQUFHLFNBQVMsQ0FBQTtZQUN2QixDQUFDO1lBQ0Qsd0ZBQXdGO1FBQzFGLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsRUFBQyxXQUFXLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFDLENBQUMsQ0FBQTtRQUVoRyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkIsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFFdEYsSUFBSSxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDakIsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1FBQzlILENBQUM7UUFFRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3JCLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFbkQsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUztRQUN2QixNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxhQUFhO1FBQ3hELE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQzlFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUU1RCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEdBQUcsRUFBRTtRQUN4QyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQTtRQUUzQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLEVBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0RCxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtZQUM1RCxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDcEIsQ0FBQyxDQUFDLENBQUE7UUFFRixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLEVBQUUsRUFBQyxFQUFFLEVBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzlELEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1lBQzFELEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUNwQixDQUFDLENBQUMsQ0FBQTtRQUVGLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsRUFBQyxFQUFFLEVBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQy9DLEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtZQUNqRSxLQUFLLENBQUMsVUFBVSxDQUFDLHNCQUFzQixFQUFFLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtZQUN6RSxLQUFLLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7WUFDL0QsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1lBQzdCLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDcEIsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ3BCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMseUJBQXlCLENBQUMsY0FBYyxFQUFFLE9BQU8sR0FBRyxFQUFFO1FBQzFELE1BQU0sVUFBVSxHQUFHLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQzFELE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFBO1FBRTNCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBQyxFQUFFLEVBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2pELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUE7WUFFckQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1lBQ3pELEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtZQUNqRSxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7WUFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNwQixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDcEIsQ0FBQyxDQUFDLENBQUE7UUFFRixPQUFPLFVBQVUsQ0FBQTtJQUNuQixDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLGNBQWM7SUFDcEQsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNoRCxDQUFDO0lBRUQsT0FBTyxHQUFHLGNBQWMsU0FBUyxDQUFBO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBBZGRDb2x1bW5BcmdzVHlwZSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gQWRkQ29sdW1uQXJnc1R5cGVcbiAqIEBwcm9wZXJ0eSB7P30gW2RlZmF1bHRdIC0gRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGNvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbZm9yZWlnbktleV0gLSBGb3JlaWduIGtleSBkZWZpbml0aW9uIGZvciB0aGUgY29sdW1uLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwge3VuaXF1ZTogYm9vbGVhbn19IFtpbmRleF0gLSBXaGV0aGVyIHRvIGFkZCBhbiBpbmRleCAob3B0aW9uYWxseSB1bmlxdWUpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtsaW1pdF0gLSBBbGlhcyBmb3IgbWF4TGVuZ3RoICh2YXJjaGFyIGxlbmd0aCBsaW1pdCkgb24gc3RyaW5nLWxpa2UgY29sdW1ucy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4TGVuZ3RoXSAtIE1heGltdW0gbGVuZ3RoIGZvciBzdHJpbmctbGlrZSBjb2x1bW5zIChlLmcuIHZhcmNoYXIgbGVuZ3RoKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW251bGxdIC0gV2hldGhlciB0aGUgY29sdW1uIGFsbG93cyBudWxsIHZhbHVlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3ByaW1hcnlLZXldIC0gV2hldGhlciB0aGUgY29sdW1uIGlzIGEgcHJpbWFyeSBrZXkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1bmlxdWVdIC0gV2hldGhlciB0aGUgY29sdW1uIGVuZm9yY2VzIHVuaXF1ZW5lc3MuXG4gKi9cbi8qKlxuICogQ3JlYXRlVGFibGVJZEFyZ3NUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDcmVhdGVUYWJsZUlkQXJnc1R5cGVcbiAqIEBwcm9wZXJ0eSB7P30gW2RlZmF1bHRdIC0gRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIElEIGNvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdHlwZV0gLSBDb2x1bW4gdHlwZSBmb3IgdGhlIElEIGNvbHVtbi5cbiAqL1xuLyoqXG4gKiBDcmVhdGVUYWJsZUFyZ3NUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDcmVhdGVUYWJsZUFyZ3NUeXBlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZk5vdEV4aXN0c10gLSBTa2lwIGNyZWF0aW9uIGlmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cy5cbiAqIEBwcm9wZXJ0eSB7Q3JlYXRlVGFibGVJZEFyZ3NUeXBlIHwgZmFsc2V9IFtpZF0gLSBJRCBjb2x1bW4gb3B0aW9ucyBvciBmYWxzZSB0byBza2lwIElELlxuICovXG4vKipcbiAqIENyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7KHRhYmxlOiBUYWJsZURhdGEpID0+IHZvaWR9IENyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlXG4gKi9cbi8qKlxuICogTGVnYWN5TG9jYWxEYXRlVGltZXNNaWdyYXRpb25BcmdzVHlwZSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gTGVnYWN5TG9jYWxEYXRlVGltZXNNaWdyYXRpb25BcmdzVHlwZVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IFtjb2x1bW5zQnlUYWJsZV0gLSBFeHBsaWNpdCBkYXRldGltZSBjb2x1bW5zIGtleWVkIGJ5IHRhYmxlIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2xlZ2FjeUxvY2FsT2Zmc2V0TWludXRlc10gLSBVVEMtbWludXMtbG9jYWwgb2Zmc2V0IGluIG1pbnV0ZXMgZm9yIGxlZ2FjeSByb3dzLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3RhYmxlc10gLSBUYWJsZXMgdG8gbWlncmF0ZS4gRGVmYXVsdHMgdG8gYWxsIG5vbi1pbnRlcm5hbCB0YWJsZXMuXG4gKi9cblxuaW1wb3J0IHsgY29udmVydExlZ2FjeURhdGVWYWx1ZVRvVXRjU3RvcmFnZSB9IGZyb20gXCIuLi9kYXRldGltZS1zdG9yYWdlLmpzXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uLy4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQgQ3JlYXRlSW5kZXhCYXNlIGZyb20gXCIuLi9xdWVyeS9jcmVhdGUtaW5kZXgtYmFzZS5qc1wiXG5pbXBvcnQgVGFibGVEYXRhIGZyb20gXCIuLi90YWJsZS1kYXRhL2luZGV4LmpzXCJcbmNsYXNzIE5vdEltcGxlbWVudGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG5leHBvcnQge05vdEltcGxlbWVudGVkRXJyb3J9XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlTWlncmF0aW9uIHtcbiAgLyoqXG4gICAqIFJ1bnMgb24gZGF0YWJhc2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBkYXRhYmFzZUlkZW50aWZpZXJzIC0gRGF0YWJhc2UgaWRlbnRpZmllcnMuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBvbkRhdGFiYXNlcyhkYXRhYmFzZUlkZW50aWZpZXJzKSB7XG4gICAgdGhpcy5fZGF0YWJhc2VJZGVudGlmaWVycyA9IGRhdGFiYXNlSWRlbnRpZmllcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBkYXRhYmFzZSBpZGVudGlmaWVycy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSAtIFRoZSBkYXRhYmFzZSBpZGVudGlmaWVycy5cbiAgICovXG4gIHN0YXRpYyBnZXREYXRhYmFzZUlkZW50aWZpZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXJzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmRhdGFiYXNlSWRlbnRpZmllciAtIERhdGFiYXNlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MuZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGRhdGFiYXNlSWRlbnRpZmllciA9IFwiZGVmYXVsdFwiLCBkYn0pIHtcbiAgICBpZiAoIWRhdGFiYXNlSWRlbnRpZmllcikgdGhyb3cgbmV3IEVycm9yKFwiTm8gZGF0YWJhc2UgaWRlbnRpZmllciBnaXZlblwiKVxuICAgIGlmICghZGIpIHRocm93IG5ldyBFcnJvcihcIk5vICdkYicgZ2l2ZW5cIilcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXIgPSBkYXRhYmFzZUlkZW50aWZpZXJcbiAgICB0aGlzLl9kYiA9IGRiXG4gIH1cblxuICBfZ2V0RGF0YWJhc2VJZGVudGlmaWVyKCkge1xuICAgIGlmICghdGhpcy5fZGF0YWJhc2VJZGVudGlmaWVyKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBkYXRhYmFzZSBpZGVudGlmaWVyIHNldFwiKVxuXG4gICAgcmV0dXJuIHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllclxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGRyaXZlci5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSAtIFRoZSBkcml2ZXIuXG4gICAqL1xuICBnZXREcml2ZXIoKSB7IHJldHVybiB0aGlzLl9kYiB9XG4gIGNvbm5lY3Rpb24oKSB7IHJldHVybiB0aGlzLmdldERyaXZlcigpIH1cblxuICBhc3luYyBjaGFuZ2UoKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCInY2hhbmdlJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIGFzeW5jIHVwKCkge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiJ2NoYW5nZScgbm90IGltcGxlbWVudGVkXCIpXG4gIH1cblxuICBhc3luYyBkb3duKCkge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiJ2NoYW5nZScgbm90IGltcGxlbWVudGVkXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBleGVjdXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gU1FMIHN0cmluZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLlF1ZXJ5UmVzdWx0VHlwZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgZXhlY3V0ZS5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoc3FsKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdGlvbigpLnF1ZXJ5KHNxbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uVHlwZSAtIENvbHVtbiB0eXBlLlxuICAgKiBAcGFyYW0ge0FkZENvbHVtbkFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGFkZENvbHVtbih0YWJsZU5hbWUsIGNvbHVtbk5hbWUsIGNvbHVtblR5cGUsIGFyZ3MpIHtcbiAgICBpZiAoIWNvbHVtblR5cGUpIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbHVtbiB0eXBlIGdpdmVuXCIpXG5cbiAgICBjb25zdCB0YWJsZUNvbHVtbkFyZ3MgPSBPYmplY3QuYXNzaWduKHtpc05ld0NvbHVtbjogdHJ1ZSwgdHlwZTogY29sdW1uVHlwZX0sIGFyZ3MpXG4gICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFRhYmxlRGF0YSh0YWJsZU5hbWUpXG5cbiAgICB0YWJsZURhdGEuYWRkQ29sdW1uKGNvbHVtbk5hbWUsIHRhYmxlQ29sdW1uQXJncylcblxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmFsdGVyVGFibGVTUUxzKHRhYmxlRGF0YSlcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbW92ZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQ29sdW1uKHRhYmxlTmFtZSwgY29sdW1uTmFtZSkge1xuICAgIGNvbnN0IHRhYmxlQ29sdW1uQXJncyA9IE9iamVjdC5hc3NpZ24oe2Ryb3BDb2x1bW46IHRydWV9KVxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IG5ldyBUYWJsZURhdGEodGFibGVOYW1lKVxuXG4gICAgdGFibGVEYXRhLmFkZENvbHVtbihjb2x1bW5OYW1lLCB0YWJsZUNvbHVtbkFyZ3MpXG5cbiAgICBjb25zdCBzcWxzID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5hbHRlclRhYmxlU1FMcyh0YWJsZURhdGEpXG5cbiAgICBmb3IgKGNvbnN0IHNxbCBvZiBzcWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLnF1ZXJ5KHNxbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkSW5kZXhBcmdzVHlwZSB0eXBlLlxuICAgKiBAdHlwZWRlZiB7b2JqZWN0fSBBZGRJbmRleEFyZ3NUeXBlXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lmTm90RXhpc3RzXSAtIFNraXAgY3JlYXRpb24gaWYgdGhlIGluZGV4IGFscmVhZHkgZXhpc3RzLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gRXhwbGljaXQgaW5kZXggbmFtZSB0byB1c2UuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VuaXF1ZV0gLSBXaGV0aGVyIHRoZSBpbmRleCBzaG91bGQgYmUgdW5pcXVlLlxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGluZGV4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBpbXBvcnQoXCIuLi90YWJsZS1kYXRhL3RhYmxlLWNvbHVtbi5qc1wiKS5kZWZhdWx0Pn0gY29sdW1ucyAtIENvbHVtbiBuYW1lIG9yIGFycmF5IG9mIGNvbHVtbiBuYW1lcy5cbiAgICogQHBhcmFtIHtBZGRJbmRleEFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGFkZEluZGV4KHRhYmxlTmFtZSwgY29sdW1ucywgYXJncykge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb2x1bW5zID0gdHlwZW9mIGNvbHVtbnMgPT09IFwic3RyaW5nXCIgPyBbY29sdW1uc10gOiBjb2x1bW5zXG4gICAgY29uc3QgY3JlYXRlSW5kZXhBcmdzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHtcbiAgICAgICAgY29sdW1uczogbm9ybWFsaXplZENvbHVtbnMsXG4gICAgICAgIHRhYmxlTmFtZVxuICAgICAgfSxcbiAgICAgIGFyZ3NcbiAgICApXG4gICAgY29uc3Qgc3FscyA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuY3JlYXRlSW5kZXhTUUxzKGNyZWF0ZUluZGV4QXJncylcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVJbmRleEFyZ3NUeXBlIHR5cGUuXG4gICAqIEB0eXBlZGVmIHtvYmplY3R9IFJlbW92ZUluZGV4QXJnc1R5cGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIEV4cGxpY2l0IGluZGV4IG5hbWUgdG8gcmVtb3ZlLlxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIGluZGV4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBpbXBvcnQoXCIuLi90YWJsZS1kYXRhL3RhYmxlLWNvbHVtbi5qc1wiKS5kZWZhdWx0Pn0gbmFtZU9yQ29sdW1ucyAtIEluZGV4IG5hbWUgb3IgY29sdW1ucyB3aG9zZSBkZWZhdWx0IGFkZEluZGV4IG5hbWUgc2hvdWxkIGJlIHJlbW92ZWQuXG4gICAqIEBwYXJhbSB7UmVtb3ZlSW5kZXhBcmdzVHlwZX0gW2FyZ3NdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyByZW1vdmVJbmRleCh0YWJsZU5hbWUsIG5hbWVPckNvbHVtbnMsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtuYW1lLCAuLi5yZXN0QXJnc30gPSBhcmdzXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgY29uc3QgcmVtb3ZlSW5kZXhOYW1lID0gbmFtZSB8fCB0aGlzLl9yZW1vdmVJbmRleE5hbWUodGFibGVOYW1lLCBuYW1lT3JDb2x1bW5zKVxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLnJlbW92ZUluZGV4U1FMcyh7bmFtZTogcmVtb3ZlSW5kZXhOYW1lLCB0YWJsZU5hbWV9KVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5xdWVyeShzcWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIGluZGV4IG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IGltcG9ydChcIi4uL3RhYmxlLWRhdGEvdGFibGUtY29sdW1uLmpzXCIpLmRlZmF1bHQ+fSBuYW1lT3JDb2x1bW5zIC0gSW5kZXggbmFtZSBvciBjb2x1bW5zLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBpbmRleCBuYW1lLlxuICAgKi9cbiAgX3JlbW92ZUluZGV4TmFtZSh0YWJsZU5hbWUsIG5hbWVPckNvbHVtbnMpIHtcbiAgICBpZiAodHlwZW9mIG5hbWVPckNvbHVtbnMgPT09IFwic3RyaW5nXCIpIHJldHVybiBuYW1lT3JDb2x1bW5zXG5cbiAgICBjb25zdCBjcmVhdGVJbmRleCA9IG5ldyBDcmVhdGVJbmRleEJhc2Uoe1xuICAgICAgY29sdW1uczogbmFtZU9yQ29sdW1ucyxcbiAgICAgIGRyaXZlcjogdGhpcy5nZXREcml2ZXIoKSxcbiAgICAgIHRhYmxlTmFtZVxuICAgIH0pXG5cbiAgICByZXR1cm4gY3JlYXRlSW5kZXguZ2VuZXJhdGVJbmRleE5hbWUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZEZvcmVpZ25LZXlBcmdzVHlwZSB0eXBlLlxuICAgKiBAdHlwZWRlZiB7b2JqZWN0fSBBZGRGb3JlaWduS2V5QXJnc1R5cGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2x1bW5OYW1lXSAtIE92ZXJyaWRlIHRoZSBkZXJpdmVkIEZLIGNvbHVtbiBuYW1lIChkZWZhdWx0OiBgJHtyZWZlcmVuY2VfdW5kZXJzY29yZWR9X2lkYCkuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBPdmVycmlkZSB0aGUgZGVyaXZlZCBjb25zdHJhaW50IG5hbWUgKGRlZmF1bHQ6IGBma18ke3RhYmxlTmFtZX1fJHtyZWZlcmVuY2VOYW1lfWApLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3JlZmVyZW5jZWRDb2x1bW5OYW1lXSAtIE92ZXJyaWRlIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIChkZWZhdWx0OiBgaWRgKS5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtyZWZlcmVuY2VkVGFibGVOYW1lXSAtIE92ZXJyaWRlIHRoZSBkZXJpdmVkIHJlZmVyZW5jZWQgdGFibGUgKGRlZmF1bHQ6IHBsdXJhbGl6ZWQgYHJlZmVyZW5jZU5hbWVgKS5cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBmb3JlaWduIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIHRoZSBGSyBsaXZlcyBvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZmVyZW5jZU5hbWUgLSBTaW5ndWxhciByZWZlcmVuY2UgbmFtZS4gRGVmYXVsdHMgZGVyaXZlXG4gICAqICAgdGhlIEZLIGNvbHVtbiBhcyBgJHtyZWZlcmVuY2V9X2lkYCwgdGhlIHJlZmVyZW5jZWQgdGFibGUgYnkgcGx1cmFsaXppbmdcbiAgICogICB0aGUgcmVmZXJlbmNlLCB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gYXMgYGlkYCwgYW5kIHRoZSBjb25zdHJhaW50IG5hbWVcbiAgICogICBhcyBgZmtfJHt0YWJsZU5hbWV9XyR7cmVmZXJlbmNlTmFtZX1gLiBPdmVycmlkZSBhbnkgb2YgdGhvc2UgdmlhIGBhcmdzYFxuICAgKiAgIHdoZW4gdGhlIHNjaGVtYSBkb2Vzbid0IGZvbGxvdyB0aGUgY29udmVudGlvbi5cbiAgICogQHBhcmFtIHtBZGRGb3JlaWduS2V5QXJnc1R5cGV9IFthcmdzXSAtIE9wdGlvbmFsIG92ZXJyaWRlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGFkZEZvcmVpZ25LZXkodGFibGVOYW1lLCByZWZlcmVuY2VOYW1lLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7Y29sdW1uTmFtZSwgbmFtZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUsIHJlZmVyZW5jZWRUYWJsZU5hbWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCByZWZlcmVuY2VOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShyZWZlcmVuY2VOYW1lKVxuICAgIGNvbnN0IHJlc29sdmVkUmVmZXJlbmNlZFRhYmxlTmFtZSA9IHJlZmVyZW5jZWRUYWJsZU5hbWUgfHwgaW5mbGVjdGlvbi5wbHVyYWxpemUocmVmZXJlbmNlTmFtZVVuZGVyc2NvcmUpXG4gICAgY29uc3QgcmVzb2x2ZWRDb2x1bW5OYW1lID0gY29sdW1uTmFtZSB8fCBgJHtyZWZlcmVuY2VOYW1lVW5kZXJzY29yZX1faWRgXG4gICAgY29uc3QgcmVzb2x2ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHJlZmVyZW5jZWRDb2x1bW5OYW1lIHx8IFwiaWRcIlxuICAgIGNvbnN0IHJlc29sdmVkTmFtZSA9IG5hbWUgfHwgYGZrXyR7dGFibGVOYW1lfV8ke3JlZmVyZW5jZU5hbWV9YFxuXG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5hZGRGb3JlaWduS2V5KFxuICAgICAgdGFibGVOYW1lLFxuICAgICAgcmVzb2x2ZWRDb2x1bW5OYW1lLFxuICAgICAgcmVzb2x2ZWRSZWZlcmVuY2VkVGFibGVOYW1lLFxuICAgICAgcmVzb2x2ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSxcbiAgICAgIHtcbiAgICAgICAgaXNOZXdGb3JlaWduS2V5OiB0cnVlLFxuICAgICAgICBuYW1lOiByZXNvbHZlZE5hbWVcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZGQgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZmVyZW5jZU5hbWUgLSBSZWZlcmVuY2UgbmFtZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5mb3JlaWduS2V5XSAtIFdoZXRoZXIgZm9yZWlnbiBrZXkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MubnVsbF0gLSBXaGV0aGVyIG51bGxhYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudHlwZV0gLSBUeXBlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MudW5pcXVlXSAtIFdoZXRoZXIgdW5pcXVlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYWRkUmVmZXJlbmNlKHRhYmxlTmFtZSwgcmVmZXJlbmNlTmFtZSwgYXJncykge1xuICAgIGNvbnN0IHtmb3JlaWduS2V5LCBudWxsOiBudWxsYWJsZSwgdHlwZSwgdW5pcXVlLCAuLi5yZXN0QXJnc30gPSBhcmdzXG4gICAgY29uc3QgY29sdW1uTmFtZSA9IGAke2luZmxlY3Rpb24udW5kZXJzY29yZShyZWZlcmVuY2VOYW1lKX1faWRgXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgY29uc3QgY29sdW1uVHlwZSA9IHR5cGUgfHwgXCJpbnRlZ2VyXCJcbiAgICBjb25zdCBjb2x1bW5BcmdzID0gbnVsbGFibGUgIT09IHVuZGVmaW5lZCA/IHtudWxsOiBudWxsYWJsZX0gOiB1bmRlZmluZWRcblxuICAgIGF3YWl0IHRoaXMuYWRkQ29sdW1uKHRhYmxlTmFtZSwgY29sdW1uTmFtZSwgY29sdW1uVHlwZSwgY29sdW1uQXJncylcbiAgICBhd2FpdCB0aGlzLmFkZEluZGV4KHRhYmxlTmFtZSwgW2NvbHVtbk5hbWVdLCB7dW5pcXVlOiB1bmlxdWV9KVxuXG4gICAgaWYgKGZvcmVpZ25LZXkpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRkRm9yZWlnbktleSh0YWJsZU5hbWUsIHJlZmVyZW5jZU5hbWUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2VOYW1lIC0gUmVmZXJlbmNlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyByZW1vdmVSZWZlcmVuY2UodGFibGVOYW1lLCByZWZlcmVuY2VOYW1lKSB7XG4gICAgY29uc3QgY29sdW1uTmFtZSA9IGAke2luZmxlY3Rpb24udW5kZXJzY29yZShyZWZlcmVuY2VOYW1lKX1faWRgXG5cbiAgICB0aGlzLnJlbW92ZUNvbHVtbih0YWJsZU5hbWUsIGNvbHVtbk5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjaGFuZ2UgY29sdW1uIG51bGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG51bGxhYmxlIC0gV2hldGhlciBudWxsYWJsZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGNoYW5nZUNvbHVtbk51bGwodGFibGVOYW1lLCBjb2x1bW5OYW1lLCBudWxsYWJsZSkge1xuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5nZXRUYWJsZUJ5TmFtZSh0YWJsZU5hbWUpXG5cbiAgICBpZiAoIXRhYmxlKSB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlICR7dGFibGVOYW1lfSBkb2VzIG5vdCBleGlzdGApXG5cbiAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCB0YWJsZS5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSlcblxuICAgIGlmICghY29sdW1uKSB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAke2NvbHVtbk5hbWV9IGRvZXMgbm90IGV4aXN0IGluIHRhYmxlICR7dGFibGVOYW1lfWApXG5cbiAgICBhd2FpdCBjb2x1bW4uY2hhbmdlTnVsbGFibGUobnVsbGFibGUpXG4gIH1cblxuICAvKipcbiAgICogTWlncmF0ZXMgbGVnYWN5IHRpbWV6b25lLWxlc3MgbG9jYWwgZGF0ZXRpbWUgcm93cyBpbnRvIFVUQyBkYXRldGltZSBzdG9yYWdlLlxuICAgKiBOZXcgU1FMaXRlIFVUQyByb3dzIGluY2x1ZGUgYSB0aW1lem9uZSBzdWZmaXggYW5kIGFyZSBza2lwcGVkLlxuICAgKiBAcGFyYW0ge0xlZ2FjeUxvY2FsRGF0ZVRpbWVzTWlncmF0aW9uQXJnc1R5cGV9IFthcmdzXSAtIE1pZ3JhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgbWlncmF0ZUxlZ2FjeUxvY2FsRGF0ZVRpbWVzVG9VdGNTdG9yYWdlKGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtjb2x1bW5zQnlUYWJsZSwgbGVnYWN5TG9jYWxPZmZzZXRNaW51dGVzLCB0YWJsZXMsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCB0YWJsZU5hbWVzID0gYXdhaXQgdGhpcy5fbGVnYWN5TG9jYWxEYXRlVGltZXNUYWJsZU5hbWVzKHRhYmxlcylcblxuICAgIGZvciAoY29uc3QgdGFibGVOYW1lIG9mIHRhYmxlTmFtZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuX21pZ3JhdGVMZWdhY3lMb2NhbERhdGVUaW1lc1RhYmxlKHtcbiAgICAgICAgY29sdW1uc0J5VGFibGUsXG4gICAgICAgIGxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlcyxcbiAgICAgICAgdGFibGVOYW1lXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0YWJsZSBuYW1lcyBmb3IgYSBsZWdhY3kgbG9jYWwgZGF0ZXRpbWUgbWlncmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSB0YWJsZXMgLSBFeHBsaWNpdCB0YWJsZSBuYW1lcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFRhYmxlIG5hbWVzLlxuICAgKi9cbiAgYXN5bmMgX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzVGFibGVOYW1lcyh0YWJsZXMpIHtcbiAgICBpZiAodGFibGVzKSByZXR1cm4gdGFibGVzXG5cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZ2V0VGFibGVzKCkpXG4gICAgICAubWFwKCh0YWJsZSkgPT4gdGFibGUuZ2V0TmFtZSgpKVxuICAgICAgLmZpbHRlcigodGFibGVOYW1lKSA9PiB0YWJsZU5hbWUgIT0gXCJzY2hlbWFfbWlncmF0aW9uc1wiICYmICF0YWJsZU5hbWUuc3RhcnRzV2l0aChcInNxbGl0ZV9cIikpXG4gIH1cblxuICAvKipcbiAgICogTWlncmF0ZXMgb25lIHRhYmxlJ3MgbGVnYWN5IGxvY2FsIGRhdGV0aW1lIHZhbHVlcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IHVuZGVmaW5lZH0gYXJncy5jb2x1bW5zQnlUYWJsZSAtIEV4cGxpY2l0IGNvbHVtbnMga2V5ZWQgYnkgdGFibGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBhcmdzLmxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlcyAtIFVUQy1taW51cy1sb2NhbCBvZmZzZXQgaW4gbWludXRlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9taWdyYXRlTGVnYWN5TG9jYWxEYXRlVGltZXNUYWJsZSh7Y29sdW1uc0J5VGFibGUsIGxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlcywgdGFibGVOYW1lfSkge1xuICAgIGNvbnN0IGRyaXZlciA9IHRoaXMuZ2V0RHJpdmVyKClcbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGRyaXZlci5nZXRUYWJsZUJ5TmFtZU9yRmFpbCh0YWJsZU5hbWUpXG4gICAgY29uc3QgY29sdW1ucyA9IGF3YWl0IHRoaXMuX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1ucyh7Y29sdW1uc0J5VGFibGUsIHRhYmxlfSlcblxuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBwcmltYXJ5S2V5Q29sdW1uID0gYXdhaXQgdGhpcy5fbGVnYWN5TG9jYWxEYXRlVGltZXNQcmltYXJ5S2V5KHRhYmxlKVxuICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IFtwcmltYXJ5S2V5Q29sdW1uLCAuLi5jb2x1bW5zXVxuICAgIGNvbnN0IHNlbGVjdFNxbCA9IHNlbGVjdGVkQ29sdW1uc1xuICAgICAgLm1hcCgoY29sdW1uTmFtZSkgPT4gZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpKVxuICAgICAgLmpvaW4oXCIsIFwiKVxuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBkcml2ZXIucXVlcnkoYFNFTEVDVCAke3NlbGVjdFNxbH0gRlJPTSAke2RyaXZlci5xdW90ZVRhYmxlKHRhYmxlTmFtZSl9YClcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uTmFtZSBvZiBjb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93W2NvbHVtbk5hbWVdXG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZFZhbHVlID0gY29udmVydExlZ2FjeURhdGVWYWx1ZVRvVXRjU3RvcmFnZSh2YWx1ZSwge1xuICAgICAgICAgIGRhdGFiYXNlVHlwZTogZHJpdmVyLmdldFR5cGUoKSxcbiAgICAgICAgICBsZWdhY3lMb2NhbE9mZnNldE1pbnV0ZXNcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoY29udmVydGVkVmFsdWUgPT09IHZhbHVlKSBjb250aW51ZVxuXG4gICAgICAgIGF3YWl0IGRyaXZlci5xdWVyeShgXG4gICAgICAgICAgVVBEQVRFICR7ZHJpdmVyLnF1b3RlVGFibGUodGFibGVOYW1lKX1cbiAgICAgICAgICBTRVQgJHtkcml2ZXIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSl9ID0gJHtkcml2ZXIucXVvdGUoY29udmVydGVkVmFsdWUpfVxuICAgICAgICAgIFdIRVJFICR7ZHJpdmVyLnF1b3RlQ29sdW1uKHByaW1hcnlLZXlDb2x1bW4pfSA9ICR7ZHJpdmVyLnF1b3RlKHJvd1twcmltYXJ5S2V5Q29sdW1uXSl9XG4gICAgICAgIGApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGRhdGUtbGlrZSBjb2x1bW5zIGZvciBvbmUgdGFibGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCB1bmRlZmluZWR9IGFyZ3MuY29sdW1uc0J5VGFibGUgLSBFeHBsaWNpdCBjb2x1bW5zIGtleWVkIGJ5IHRhYmxlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnRhYmxlIC0gVGFibGUgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBEYXRlLWxpa2UgY29sdW1uIG5hbWVzLlxuICAgKi9cbiAgYXN5bmMgX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1ucyh7Y29sdW1uc0J5VGFibGUsIHRhYmxlfSkge1xuICAgIGNvbnN0IGV4cGxpY2l0Q29sdW1ucyA9IGNvbHVtbnNCeVRhYmxlPy5bdGFibGUuZ2V0TmFtZSgpXVxuXG4gICAgaWYgKGV4cGxpY2l0Q29sdW1ucykgcmV0dXJuIGV4cGxpY2l0Q29sdW1uc1xuXG4gICAgcmV0dXJuIChhd2FpdCB0YWJsZS5nZXRDb2x1bW5zKCkpXG4gICAgICAuZmlsdGVyKChjb2x1bW4pID0+IHRoaXMuX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1uSXNEYXRlTGlrZShjb2x1bW4pKVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uZ2V0TmFtZSgpKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgY29sdW1uIHNob3VsZCBiZSBpbmNsdWRlZCBieSBkZWZhdWx0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gY29sdW1uIC0gQ29sdW1uIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjb2x1bW4gaXMgZGF0ZS1saWtlLlxuICAgKi9cbiAgX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1uSXNEYXRlTGlrZShjb2x1bW4pIHtcbiAgICBjb25zdCBjb2x1bW5UeXBlID0gY29sdW1uLmdldFR5cGUoKS50b0xvd2VyQ2FzZSgpXG5cbiAgICByZXR1cm4gY29sdW1uVHlwZS5pbmNsdWRlcyhcImRhdGVcIikgfHwgY29sdW1uVHlwZS5pbmNsdWRlcyhcInRpbWVzdGFtcFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzaW5nbGUgcHJpbWFyeSBrZXkgY29sdW1uIGZvciByb3cgdXBkYXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdH0gdGFibGUgLSBUYWJsZSBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBQcmltYXJ5IGtleSBjb2x1bW4gbmFtZS5cbiAgICovXG4gIGFzeW5jIF9sZWdhY3lMb2NhbERhdGVUaW1lc1ByaW1hcnlLZXkodGFibGUpIHtcbiAgICBjb25zdCBwcmltYXJ5S2V5Q29sdW1ucyA9IChhd2FpdCB0YWJsZS5nZXRDb2x1bW5zKCkpLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uZ2V0UHJpbWFyeUtleSgpKVxuXG4gICAgaWYgKHByaW1hcnlLZXlDb2x1bW5zLmxlbmd0aCAhPSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgb25lIHByaW1hcnkga2V5IG9uICR7dGFibGUuZ2V0TmFtZSgpfSBidXQgZm91bmQgJHtwcmltYXJ5S2V5Q29sdW1ucy5sZW5ndGh9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcHJpbWFyeUtleUNvbHVtbnNbMF0uZ2V0TmFtZSgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjb2x1bW4gZXhpc3RzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtbk5hbWUgLSBDb2x1bW4gbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gUmVzb2x2ZXMgd2l0aCBXaGV0aGVyIGNvbHVtbiBleGlzdHMuXG4gICAqL1xuICBhc3luYyBjb2x1bW5FeGlzdHModGFibGVOYW1lLCBjb2x1bW5OYW1lKSB7XG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmdldFRhYmxlQnlOYW1lKHRhYmxlTmFtZSlcblxuICAgIGlmICh0YWJsZSkge1xuICAgICAgY29uc3QgY29sdW1uID0gYXdhaXQgdGFibGUuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWUpXG5cbiAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQm9vbGVhbihmYWxzZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIHRoZSBkYXRhYmFzZSBzY2hlbWEgZm9yIGEgZ2FwLWxlc3MgcG9zaXRpb25hbCBsaXN0LiBBZGRzIHRoZVxuICAgKiBwb3NpdGlvbiBjb2x1bW4gKElOVCBOT1QgTlVMTCkgaWYgYWJzZW50IGFuZCBjcmVhdGVzIGEgVU5JUVVFIGluZGV4IG9uXG4gICAqIChzY29wZSwgcG9zaXRpb24pLiBUaGlzIGlzIHRoZSBzY2hlbWEtc2lkZSBjb3VudGVycGFydCBvZlxuICAgKiBgTW9kZWwuYWN0c0FzTGlzdCgpYC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwb3NpdGlvbkNvbHVtbiAtIENvbHVtbiBuYW1lIGZvciB0aGUgcG9zaXRpb24gKGUuZy4gXCJyb3dfbnVtYmVyXCIpLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnNjb3BlIC0gQ29sdW1uIG5hbWUgZm9yIHRoZSBzY29wZSAoZS5nLiBcImJvYXJkX2NvbHVtbl9pZFwiKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBhZGRBY3RzQXNMaXN0KHRhYmxlTmFtZSwgcG9zaXRpb25Db2x1bW4sIHtzY29wZX0pIHtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmNvbHVtbkV4aXN0cyh0YWJsZU5hbWUsIHBvc2l0aW9uQ29sdW1uKSkpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRkQ29sdW1uKHRhYmxlTmFtZSwgcG9zaXRpb25Db2x1bW4sIFwiaW50ZWdlclwiLCB7bnVsbDogZmFsc2V9KVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmNoYW5nZUNvbHVtbk51bGwodGFibGVOYW1lLCBwb3NpdGlvbkNvbHVtbiwgZmFsc2UpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hZGRJbmRleCh0YWJsZU5hbWUsIFtzY29wZSwgcG9zaXRpb25Db2x1bW5dLCB7dW5pcXVlOiB0cnVlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdGFibGUgd2l0aCBkZWZhdWx0IG9wdGlvbnMuXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtDcmVhdGVUYWJsZUNhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdGFibGUgd2l0aCBleHBsaWNpdCBvcHRpb25zLlxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGFibGVBcmdzVHlwZX0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge0NyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgY3JlYXRlIHRhYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtDcmVhdGVUYWJsZUFyZ3NUeXBlIHwgQ3JlYXRlVGFibGVDYWxsYmFja1R5cGV9IGFyZzEgLSBBcmcxLlxuICAgKiBAcGFyYW0ge0NyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlIHwgdW5kZWZpbmVkfSBbYXJnMl0gLSBBcmcyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlVGFibGUodGFibGVOYW1lLCBhcmcxLCBhcmcyKSB7XG4gICAgbGV0IGFyZ3NcbiAgICBsZXQgY2FsbGJhY2tcblxuICAgIGlmICh0eXBlb2YgYXJnMSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGFyZ3MgPSB7fVxuICAgICAgY2FsbGJhY2sgPSBhcmcxXG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MgPSBhcmcxXG4gICAgICBjYWxsYmFjayA9IGFyZzJcbiAgICB9XG5cbiAgICBjb25zdCB7aWQgPSB7fSwgaWZOb3RFeGlzdHMgPSBmYWxzZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIGNvbnN0IGRyaXZlciA9IHRoaXMuZ2V0RHJpdmVyKClcbiAgICBjb25zdCBkZWZhdWx0UHJpbWFyeUtleVR5cGUgPSBkcml2ZXIucHJpbWFyeUtleVR5cGUoKVxuICAgIGxldCBpZERlZmF1bHQsIGlkVHlwZSwgcmVzdEFyZ3NJZFxuXG4gICAgaWYgKGlkICE9PSBmYWxzZSkge1xuICAgICAgKHtkZWZhdWx0OiBpZERlZmF1bHQsIHR5cGU6IGlkVHlwZSwgLi4ucmVzdEFyZ3NJZH0gPSBpZClcblxuICAgICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJnc0lkKVxuICAgIH1cblxuICAgIGlmICghaWRUeXBlKSB7XG4gICAgICBpZFR5cGUgPSBkZWZhdWx0UHJpbWFyeUtleVR5cGVcbiAgICB9XG4gICAgY29uc3QgZHJpdmVyU3VwcG9ydHNEZWZhdWx0VVVJRCA9IGRyaXZlci5zdXBwb3J0c0RlZmF1bHRQcmltYXJ5S2V5VVVJRD8uKClcbiAgICBjb25zdCBsb3dlcklkVHlwZSA9IGlkVHlwZT8udG9Mb3dlckNhc2UoKVxuICAgIGNvbnN0IGlzVVVJRFByaW1hcnlLZXkgPSBsb3dlcklkVHlwZSA9PSBcInV1aWRcIlxuICAgIGNvbnN0IG51bWVyaWNBdXRvSW5jcmVtZW50VHlwZXMgPSBbXCJpbnRcIiwgXCJpbnRlZ2VyXCIsIFwiYmlnaW50XCIsIFwic21hbGxpbnRcIiwgXCJ0aW55aW50XCJdXG4gICAgbGV0IGlkQXV0b0luY3JlbWVudCA9IG51bWVyaWNBdXRvSW5jcmVtZW50VHlwZXMuaW5jbHVkZXMobG93ZXJJZFR5cGUgfHwgXCJcIilcblxuICAgIGlmIChpc1VVSURQcmltYXJ5S2V5KSB7XG4gICAgICBpZEF1dG9JbmNyZW1lbnQgPSBmYWxzZVxuXG4gICAgICBpZiAoZHJpdmVyU3VwcG9ydHNEZWZhdWx0VVVJRCkge1xuICAgICAgICBpZiAoaWREZWZhdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZERlZmF1bHQgPSAoKSA9PiBcIlVVSUQoKVwiXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaWREZWZhdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTGV0IGFwcGxpY2F0aW9uIGNvZGUgYXNzaWduIFVVSURzIChzZWUgRGF0YWJhc2VSZWNvcmQuaW5zZXJ0KSB3aGVuIHRoZSBkcml2ZXIgY2FuJ3QgZG8gaXQuXG4gICAgICAgIGlkRGVmYXVsdCA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgICAgLy8gSWYgZHJpdmVyIGRvZXNuJ3Qgc3VwcG9ydCBVVUlEKCkgYnV0IHRoZSBjYWxsZXIgZXhwbGljaXRseSBzZXQgYSBkZWZhdWx0LCByZXNwZWN0IGl0LlxuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IG5ldyBUYWJsZURhdGEodGFibGVOYW1lLCB7aWZOb3RFeGlzdHMsIHByaW1hcnlLZXlUeXBlOiBkZWZhdWx0UHJpbWFyeUtleVR5cGV9KVxuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGlmICghKGlkVHlwZSBpbiB0YWJsZURhdGEpKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHByaW1hcnkga2V5IHR5cGU6ICR7aWRUeXBlfWApXG5cbiAgICBpZiAoaWQgIT09IGZhbHNlKSB7XG4gICAgICB0YWJsZURhdGEuYWRkQ29sdW1uKFwiaWRcIiwge2F1dG9JbmNyZW1lbnQ6IGlkQXV0b0luY3JlbWVudCwgZGVmYXVsdDogaWREZWZhdWx0LCBudWxsOiBmYWxzZSwgcHJpbWFyeUtleTogdHJ1ZSwgdHlwZTogaWRUeXBlfSlcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKHRhYmxlRGF0YSlcbiAgICB9XG5cbiAgICBjb25zdCBzcWxzID0gYXdhaXQgZHJpdmVyLmNyZWF0ZVRhYmxlU3FsKHRhYmxlRGF0YSlcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2RiLnF1ZXJ5KHNxbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBkcm9wIHRhYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGRyb3BUYWJsZSh0YWJsZU5hbWUpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLmRyb3BUYWJsZSh0YWJsZU5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZW5hbWUgY29sdW1uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9sZENvbHVtbk5hbWUgLSBQcmV2aW91cyBjb2x1bW4gbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5ld0NvbHVtbk5hbWUgLSBOZXcgY29sdW1uIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyByZW5hbWVDb2x1bW4odGFibGVOYW1lLCBvbGRDb2x1bW5OYW1lLCBuZXdDb2x1bW5OYW1lKSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5yZW5hbWVDb2x1bW4odGFibGVOYW1lLCBvbGRDb2x1bW5OYW1lLCBuZXdDb2x1bW5OYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGFibGUgZXhpc3RzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gUmVzb2x2ZXMgd2l0aCBXaGV0aGVyIHRhYmxlIGV4aXN0cy5cbiAgICovXG4gIGFzeW5jIHRhYmxlRXhpc3RzKHRhYmxlTmFtZSkge1xuICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkudGFibGVFeGlzdHModGFibGVOYW1lKVxuXG4gICAgcmV0dXJuIGV4aXN0c1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlcjogY3JlYXRlcyB0aGUgc2hhcmVkIGF1ZGl0IHRhYmxlcyAoYGF1ZGl0X2FjdGlvbnNgLFxuICAgKiBgYXVkaXRfYXVkaXRhYmxlX3R5cGVzYCwgYGF1ZGl0c2ApLiBDYWxsIGZyb20gYHVwKClgIGluIGEgbWlncmF0aW9uLlxuICAgKiBAcGFyYW0ge3tpZD86IHt0eXBlPzogc3RyaW5nfX19IFtvcHRpb25zXSAtIElEIGNvbHVtbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNoYXJlZEF1ZGl0VGFibGVzKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGlkID0gb3B0aW9ucy5pZCB8fCB7fVxuXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVUYWJsZShcImF1ZGl0X2FjdGlvbnNcIiwge2lkfSwgKHRhYmxlKSA9PiB7XG4gICAgICB0YWJsZS5zdHJpbmcoXCJhY3Rpb25cIiwge2luZGV4OiB7dW5pcXVlOiB0cnVlfSwgbnVsbDogZmFsc2V9KVxuICAgICAgdGFibGUudGltZXN0YW1wcygpXG4gICAgfSlcblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlVGFibGUoXCJhdWRpdF9hdWRpdGFibGVfdHlwZXNcIiwge2lkfSwgKHRhYmxlKSA9PiB7XG4gICAgICB0YWJsZS5zdHJpbmcoXCJuYW1lXCIsIHtpbmRleDoge3VuaXF1ZTogdHJ1ZX0sIG51bGw6IGZhbHNlfSlcbiAgICAgIHRhYmxlLnRpbWVzdGFtcHMoKVxuICAgIH0pXG5cbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKFwiYXVkaXRzXCIsIHtpZH0sICh0YWJsZSkgPT4ge1xuICAgICAgdGFibGUucmVmZXJlbmNlcyhcImF1ZGl0X2FjdGlvblwiLCB7Zm9yZWlnbktleTogdHJ1ZSwgbnVsbDogZmFsc2V9KVxuICAgICAgdGFibGUucmVmZXJlbmNlcyhcImF1ZGl0X2F1ZGl0YWJsZV90eXBlXCIsIHtmb3JlaWduS2V5OiB0cnVlLCBudWxsOiBmYWxzZX0pXG4gICAgICB0YWJsZS5yZWZlcmVuY2VzKFwiYXVkaXRhYmxlXCIsIHtudWxsOiBmYWxzZSwgcG9seW1vcnBoaWM6IHRydWV9KVxuICAgICAgdGFibGUuanNvbihcImF1ZGl0ZWRfY2hhbmdlc1wiKVxuICAgICAgdGFibGUuanNvbihcInBhcmFtc1wiKVxuICAgICAgdGFibGUudGltZXN0YW1wcygpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXI6IGNyZWF0ZXMgYSBkZWRpY2F0ZWQgYXVkaXQgdGFibGUgZm9yIGEgbW9kZWwgKGUuZy5cbiAgICogYHByb2plY3RfYXVkaXRzYCBmb3IgdGhlIGBwcm9qZWN0c2AgdGFibGUpLiBDYWxsIGZyb20gYHVwKClgXG4gICAqIGluIGEgbWlncmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxUYWJsZU5hbWUgLSBNb2RlbCB0YWJsZSBuYW1lIChlLmcuIFwicHJvamVjdHNcIikuXG4gICAqIEBwYXJhbSB7e2lkPzoge3R5cGU/OiBzdHJpbmd9fX0gW29wdGlvbnNdIC0gSUQgY29sdW1uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFRoZSBjcmVhdGVkIGF1ZGl0IHRhYmxlIG5hbWUuXG4gICAqL1xuICBhc3luYyBjcmVhdGVEZWRpY2F0ZWRBdWRpdFRhYmxlKG1vZGVsVGFibGVOYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBhdWRpdFRhYmxlID0gZGVkaWNhdGVkQXVkaXRUYWJsZU5hbWUobW9kZWxUYWJsZU5hbWUpXG4gICAgY29uc3QgaWQgPSBvcHRpb25zLmlkIHx8IHt9XG5cbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKGF1ZGl0VGFibGUsIHtpZH0sICh0YWJsZSkgPT4ge1xuICAgICAgY29uc3QgcmVmS2V5ID0gaW5mbGVjdGlvbi5zaW5ndWxhcml6ZShtb2RlbFRhYmxlTmFtZSlcblxuICAgICAgdGFibGUucmVmZXJlbmNlcyhyZWZLZXksIHtmb3JlaWduS2V5OiB0cnVlLCBudWxsOiBmYWxzZX0pXG4gICAgICB0YWJsZS5yZWZlcmVuY2VzKFwiYXVkaXRfYWN0aW9uXCIsIHtmb3JlaWduS2V5OiB0cnVlLCBudWxsOiBmYWxzZX0pXG4gICAgICB0YWJsZS5qc29uKFwiYXVkaXRlZF9jaGFuZ2VzXCIpXG4gICAgICB0YWJsZS5qc29uKFwicGFyYW1zXCIpXG4gICAgICB0YWJsZS50aW1lc3RhbXBzKClcbiAgICB9KVxuXG4gICAgcmV0dXJuIGF1ZGl0VGFibGVcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGRlZGljYXRlZCBhdWRpdCB0YWJsZSBuYW1lIGZvciBhIG1vZGVsIHRhYmxlLlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsVGFibGVOYW1lIC0gTW9kZWwgdGFibGUgbmFtZSAoZS5nLiBcInByb2plY3RzXCIpLlxuICogQHJldHVybnMge3N0cmluZ30gRGVkaWNhdGVkIGF1ZGl0IHRhYmxlIG5hbWUgKGUuZy4gXCJwcm9qZWN0X2F1ZGl0c1wiKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZGljYXRlZEF1ZGl0VGFibGVOYW1lKG1vZGVsVGFibGVOYW1lKSB7XG4gIGlmIChtb2RlbFRhYmxlTmFtZS5lbmRzV2l0aChcInNcIikpIHtcbiAgICByZXR1cm4gYCR7bW9kZWxUYWJsZU5hbWUuc2xpY2UoMCwgLTEpfV9hdWRpdHNgXG4gIH1cblxuICByZXR1cm4gYCR7bW9kZWxUYWJsZU5hbWV9X2F1ZGl0c2Bcbn1cbiJdfQ==
|
|
@@ -42,7 +42,7 @@ export type CreateAuditArgs = {
|
|
|
42
42
|
/**
|
|
43
43
|
* - Explicit changes to persist.
|
|
44
44
|
*/
|
|
45
|
-
auditedChanges?:
|
|
45
|
+
auditedChanges?: AuditChanges | null | undefined;
|
|
46
46
|
/**
|
|
47
47
|
* - Optional metadata to store with the audit.
|
|
48
48
|
*/
|
|
@@ -54,18 +54,67 @@ export type CreateAuditArgs = {
|
|
|
54
54
|
export type AuditedModelClass = typeof import("./index.js").default & {
|
|
55
55
|
_auditCallbacks?: Record<string, AuditCallback[]>;
|
|
56
56
|
_auditLifecycleCallbacksRegistered?: boolean;
|
|
57
|
+
_auditTableResolved?: boolean;
|
|
58
|
+
_auditTableData?: AuditTableData;
|
|
57
59
|
};
|
|
58
60
|
/**
|
|
59
|
-
*
|
|
60
|
-
|
|
61
|
+
* AuditTableData type.
|
|
62
|
+
*/
|
|
63
|
+
export type AuditTableData = {
|
|
64
|
+
/**
|
|
65
|
+
* - Whether a dedicated audit table exists.
|
|
66
|
+
*/
|
|
67
|
+
dedicated: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* - Name of the audit table.
|
|
70
|
+
*/
|
|
71
|
+
tableName: string;
|
|
72
|
+
/**
|
|
73
|
+
* - Column name that references the audited model.
|
|
74
|
+
*/
|
|
75
|
+
foreignKey: string;
|
|
76
|
+
/**
|
|
77
|
+
* - The audit model class to use.
|
|
78
|
+
*/
|
|
79
|
+
auditClass: typeof import("./index.js").default;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Global audit event bus matching ActiveRecordAuditable::Events.
|
|
83
|
+
*/
|
|
84
|
+
export type AuditEventsType = {
|
|
85
|
+
/**
|
|
86
|
+
* - Fire all callbacks for a model type + action.
|
|
87
|
+
*/
|
|
88
|
+
call: (type: string, action: string, args: AuditEventPayload) => void;
|
|
89
|
+
/**
|
|
90
|
+
* - Register a callback for a model type + action. Returns an unsubscribe function.
|
|
91
|
+
*/
|
|
92
|
+
connect: (type: string, action: string, callback: (args: AuditEventPayload) => void) => () => void;
|
|
93
|
+
/**
|
|
94
|
+
* - Clear all registered callbacks.
|
|
95
|
+
*/
|
|
96
|
+
reset: () => void;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Global audit event bus matching ActiveRecordAuditable::Events.
|
|
100
|
+
* @typedef {object} AuditEventsType
|
|
101
|
+
* @property {(type: string, action: string, args: AuditEventPayload) => void} call - Fire all callbacks for a model type + action.
|
|
102
|
+
* @property {(type: string, action: string, callback: (args: AuditEventPayload) => void) => () => void} connect - Register a callback for a model type + action. Returns an unsubscribe function.
|
|
103
|
+
* @property {() => void} reset - Clear all registered callbacks.
|
|
104
|
+
*/
|
|
105
|
+
/** @type {AuditEventsType} */
|
|
106
|
+
export const AuditEvents: AuditEventsType;
|
|
107
|
+
/**
|
|
108
|
+
* Captures create changes before persistence clears the change set.
|
|
109
|
+
* @param {import("./index.js").default & {_pendingCreateAuditChanges?: AuditChanges}} record - Record whose pending changes should be captured.
|
|
61
110
|
* @returns {void}
|
|
62
111
|
*/
|
|
63
112
|
export function captureCreateAuditChanges(record: import("./index.js").default & {
|
|
64
113
|
_pendingCreateAuditChanges?: AuditChanges;
|
|
65
114
|
}): void;
|
|
66
115
|
/**
|
|
67
|
-
* Captures update changes
|
|
68
|
-
* @param {import("./index.js").default & {_pendingUpdateAuditChanges?: AuditChanges}} record - Record
|
|
116
|
+
* Captures update changes before persistence clears the change set.
|
|
117
|
+
* @param {import("./index.js").default & {_pendingUpdateAuditChanges?: AuditChanges}} record - Record whose pending changes should be captured.
|
|
69
118
|
* @returns {void}
|
|
70
119
|
*/
|
|
71
120
|
export function captureUpdateAuditChanges(record: import("./index.js").default & {
|
|
@@ -74,12 +123,12 @@ export function captureUpdateAuditChanges(record: import("./index.js").default &
|
|
|
74
123
|
/**
|
|
75
124
|
* Creates an audit row for a record.
|
|
76
125
|
* @param {import("./index.js").default} record - Record to audit.
|
|
77
|
-
* @param {CreateAuditArgs} args - Audit row options.
|
|
126
|
+
* @param {CreateAuditArgs} args - Audit row options (action, auditedChanges, params).
|
|
78
127
|
* @returns {Promise<number | string>} Created audit row id.
|
|
79
128
|
*/
|
|
80
129
|
export function createAudit(record: import("./index.js").default, args: CreateAuditArgs): Promise<number | string>;
|
|
81
130
|
/**
|
|
82
|
-
*
|
|
131
|
+
* Writes the create audit row for a model instance.
|
|
83
132
|
* @param {import("./index.js").default & {_pendingCreateAuditChanges?: AuditChanges}} record - Record to audit.
|
|
84
133
|
* @returns {Promise<void>}
|
|
85
134
|
*/
|
|
@@ -87,13 +136,13 @@ export function createCreateAudit(record: import("./index.js").default & {
|
|
|
87
136
|
_pendingCreateAuditChanges?: AuditChanges;
|
|
88
137
|
}): Promise<void>;
|
|
89
138
|
/**
|
|
90
|
-
*
|
|
139
|
+
* Writes the destroy audit row for a model instance.
|
|
91
140
|
* @param {import("./index.js").default} record - Record to audit.
|
|
92
141
|
* @returns {Promise<void>}
|
|
93
142
|
*/
|
|
94
143
|
export function createDestroyAudit(record: import("./index.js").default): Promise<void>;
|
|
95
144
|
/**
|
|
96
|
-
*
|
|
145
|
+
* Writes the update audit row for a model instance.
|
|
97
146
|
* @param {import("./index.js").default & {_pendingUpdateAuditChanges?: AuditChanges}} record - Record to audit.
|
|
98
147
|
* @returns {Promise<void>}
|
|
99
148
|
*/
|
|
@@ -101,52 +150,60 @@ export function createUpdateAudit(record: import("./index.js").default & {
|
|
|
101
150
|
_pendingUpdateAuditChanges?: AuditChanges;
|
|
102
151
|
}): Promise<void>;
|
|
103
152
|
/**
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
* @param {string}
|
|
107
|
-
* @
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
153
|
+
* Creates the shared audit tables migration up/down callbacks for use inside
|
|
154
|
+
* a Migration class. The `table` parameter is a Migration instance.
|
|
155
|
+
* @param {{id?: {type: string}}} [options] - ID column options.
|
|
156
|
+
* @returns {{down: (table: import("../migration/index.js").default) => Promise<void>, up: (table: import("../migration/index.js").default) => Promise<void>}}
|
|
157
|
+
*/
|
|
158
|
+
export function createSharedAuditTablesMigration(options?: {
|
|
159
|
+
id?: {
|
|
160
|
+
type: string;
|
|
161
|
+
};
|
|
162
|
+
}): {
|
|
163
|
+
down: (table: import("../migration/index.js").default) => Promise<void>;
|
|
164
|
+
up: (table: import("../migration/index.js").default) => Promise<void>;
|
|
165
|
+
};
|
|
115
166
|
/**
|
|
116
|
-
*
|
|
117
|
-
* @
|
|
118
|
-
* @
|
|
119
|
-
* @property {number | string} auditId - Created audit row id.
|
|
120
|
-
* @property {AuditChanges | null} auditedChanges - Changes captured for the audit.
|
|
121
|
-
* @property {Record<string, ?> | null} params - Optional caller-supplied audit params.
|
|
122
|
-
* @property {import("./index.js").default} record - Audited record.
|
|
167
|
+
* Returns the dedicated audit table name for a given model table name.
|
|
168
|
+
* @param {string} modelTableName - Model table name (e.g. "projects").
|
|
169
|
+
* @returns {string} Dedicated audit table name (e.g. "project_audits").
|
|
123
170
|
*/
|
|
171
|
+
export function dedicatedAuditTableNameForTable(modelTableName: string): string;
|
|
124
172
|
/**
|
|
125
|
-
*
|
|
126
|
-
* @
|
|
173
|
+
* Resolves audit metadata after application and package model classes are registered.
|
|
174
|
+
* @param {import("../../configuration.js").default} configuration - Configuration whose models should be finalized.
|
|
175
|
+
* @returns {Promise<void>}
|
|
127
176
|
*/
|
|
177
|
+
export function initializeAuditedModelRelationships(configuration: import("../../configuration.js").default): Promise<void>;
|
|
128
178
|
/**
|
|
129
|
-
*
|
|
130
|
-
* @
|
|
131
|
-
* @
|
|
132
|
-
* @
|
|
133
|
-
* @property {Record<string, ?> | null} [params] - Optional metadata to store with the audit.
|
|
179
|
+
* Initializes audit metadata for audited model classes.
|
|
180
|
+
* @param {typeof import("./index.js").default} modelClass - Model class to initialize.
|
|
181
|
+
* @param {{resolveTableData?: boolean}} [args] - Initialization options.
|
|
182
|
+
* @returns {Promise<void>}
|
|
134
183
|
*/
|
|
184
|
+
export function initializeAuditing(modelClass: typeof import("./index.js").default, args?: {
|
|
185
|
+
resolveTableData?: boolean;
|
|
186
|
+
}): Promise<void>;
|
|
135
187
|
/**
|
|
136
|
-
*
|
|
137
|
-
* @
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
* }
|
|
188
|
+
* Registers a per-model callback fired after an audit row is created.
|
|
189
|
+
* @param {AuditedModelClass} modelClass - Model class to observe.
|
|
190
|
+
* @param {string} action - Audit action name (e.g. "create").
|
|
191
|
+
* @param {AuditCallback} callback - Callback invoked after matching audit rows are created.
|
|
192
|
+
* @returns {() => void} Unsubscribe function.
|
|
141
193
|
*/
|
|
194
|
+
export function registerAuditCallback(modelClass: AuditedModelClass, action: string, callback: AuditCallback): () => void;
|
|
142
195
|
/**
|
|
143
|
-
*
|
|
196
|
+
* Registers lifecycle callbacks for automatic create/update/destroy auditing.
|
|
197
|
+
* Table detection and relationship registration happen lazily on first usage.
|
|
198
|
+
* Called synchronously from Model.audited() at module-load time.
|
|
144
199
|
* @param {AuditedModelClass} modelClass - Model class to audit.
|
|
145
200
|
* @returns {void}
|
|
146
201
|
*/
|
|
147
202
|
export function registerAuditing(modelClass: AuditedModelClass): void;
|
|
148
203
|
/**
|
|
149
204
|
* Returns records without an audit row for the given action.
|
|
205
|
+
* Uses shared-table defaults when table data is not yet resolved;
|
|
206
|
+
* switches to the dedicated table path once resolved.
|
|
150
207
|
* @template {AuditedModelClass} MC
|
|
151
208
|
* @param {MC} modelClass - Model class to scope.
|
|
152
209
|
* @param {string} action - Audit action to exclude.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auditing.d.ts","sourceRoot":"","sources":["../../../../src/database/record/auditing.js"],"names":[],"mappings":";;;2BAMa,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;;;;;YAMhB,MAAM;;;;aACN,MAAM,GAAG,MAAM;;;;oBACf,YAAY,GAAG,IAAI;;;;YACnB,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GAAG,IAAI;;;;YACxB,OAAO,YAAY,EAAE,OAAO;;;;;4BAK7B,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;;;;;;;;YAMnD,MAAM;;;;;;;;;;;;;gCAOP,cAAc,YAAY,EAAE,OAAO,GAAG;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAClD,kCAAkC,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"auditing.d.ts","sourceRoot":"","sources":["../../../../src/database/record/auditing.js"],"names":[],"mappings":"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"}
|