@pipeline-builder/pipeline-data 4.3.2 → 4.3.4
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/lib/api/crud-service.d.ts +7 -0
- package/lib/api/crud-service.js +14 -3
- package/lib/api/ecosystem-privacy.d.ts +25 -0
- package/lib/api/ecosystem-privacy.js +58 -0
- package/lib/api/pipeline-step-resolution.d.ts +111 -0
- package/lib/api/pipeline-step-resolution.js +163 -0
- package/lib/api/plugin-consumption-policy.d.ts +8 -2
- package/lib/api/plugin-consumption-policy.js +20 -3
- package/lib/api/plugin-resolution.d.ts +26 -9
- package/lib/api/plugin-resolution.js +51 -33
- package/lib/api/public-directory.js +1 -1
- package/lib/api/reporting/analytics-queries.d.ts +6 -4
- package/lib/api/reporting/analytics-queries.js +15 -14
- package/lib/api/reporting/deploy-rollup.d.ts +2 -0
- package/lib/api/reporting/deploy-rollup.js +5 -1
- package/lib/api/reporting/failure-classifier.d.ts +2 -6
- package/lib/api/reporting/failure-classifier.js +22 -1
- package/lib/api/reporting/ingest.js +73 -16
- package/lib/api/reporting/plugin-exposure.d.ts +261 -15
- package/lib/api/reporting/plugin-exposure.js +423 -38
- package/lib/api/reporting/stakeholder/compose.d.ts +1 -1
- package/lib/api/reporting/stakeholder/compose.js +30 -1
- package/lib/api/reporting/stakeholder/store.d.ts +16 -2
- package/lib/api/reporting/stakeholder/store.js +17 -6
- package/lib/api/reporting/types.d.ts +80 -1
- package/lib/api/reporting/types.js +1 -1
- package/lib/api/reporting-service.d.ts +11 -4
- package/lib/api/reporting-service.js +106 -43
- package/lib/api/soft-delete-sweep.d.ts +8 -18
- package/lib/api/soft-delete-sweep.js +35 -5
- package/lib/api/support-cases.d.ts +380 -0
- package/lib/api/support-cases.js +671 -0
- package/lib/api/version-references.d.ts +80 -0
- package/lib/api/version-references.js +135 -0
- package/lib/core/query-filters.d.ts +3 -3
- package/lib/core/query-filters.js +1 -1
- package/lib/database/drizzle-schema.d.ts +4858 -2759
- package/lib/database/drizzle-schema.js +13 -3
- package/lib/database/index.d.ts +1 -1
- package/lib/database/index.js +2 -2
- package/lib/database/schema/ecosystem.d.ts +53 -0
- package/lib/database/schema/ecosystem.js +14 -3
- package/lib/database/schema/pipeline.d.ts +38 -0
- package/lib/database/schema/pipeline.js +20 -2
- package/lib/database/schema/plugin.d.ts +265 -0
- package/lib/database/schema/plugin.js +34 -3
- package/lib/database/schema/reporting-analytics.d.ts +786 -4
- package/lib/database/schema/reporting-analytics.js +111 -5
- package/lib/database/schema/support.d.ts +1093 -0
- package/lib/database/schema/support.js +323 -0
- package/lib/database/tenancy.d.ts +7 -5
- package/lib/database/tenancy.js +1 -1
- package/lib/index.d.ts +7 -3
- package/lib/index.js +11 -3
- package/lib/testing/exports.json +57 -0
- package/package.json +4 -3
|
@@ -29,7 +29,6 @@ import { and, asc, desc, eq, inArray, isNull, lte, sql } from 'drizzle-orm';
|
|
|
29
29
|
import { schema } from '../../../database/drizzle-schema.js';
|
|
30
30
|
import { runWithTenantContext, withTenantTx } from '../../../database/tenancy.js';
|
|
31
31
|
import { softDeleteRetentionMs } from '../../crud-service.js';
|
|
32
|
-
/** How long a freshly minted share link lives when the caller names no window. */
|
|
33
32
|
export const DEFAULT_SHARE_LINK_TTL_DAYS = 30;
|
|
34
33
|
/** The longest a share link may live. Beyond this it is a permanent URL. */
|
|
35
34
|
export const MAX_SHARE_LINK_TTL_DAYS = 180;
|
|
@@ -136,7 +135,7 @@ export class StakeholderReportStore {
|
|
|
136
135
|
}
|
|
137
136
|
/**
|
|
138
137
|
* Pause every definition a user owns, with the reason recorded. Called when the
|
|
139
|
-
* owner is deactivated or loses `reports:
|
|
138
|
+
* owner is deactivated or loses `reports:write` — a report must stop when the
|
|
140
139
|
* person accountable for it can no longer see the data behind it.
|
|
141
140
|
*
|
|
142
141
|
* Returns the paused definitions so the caller can notify an org admin: a
|
|
@@ -554,13 +553,25 @@ export class StakeholderReportStore {
|
|
|
554
553
|
*/
|
|
555
554
|
async unsubscribeByToken(token, now = new Date()) {
|
|
556
555
|
if (token.length < 16)
|
|
557
|
-
return false;
|
|
556
|
+
return { matched: false };
|
|
558
557
|
return runWithTenantContext({ isSuperAdmin: true }, async () => {
|
|
559
558
|
const rows = await withTenantTx((tx) => tx.update(schema.reportRecipient)
|
|
560
559
|
.set({ unsubscribedAt: sql `COALESCE(${schema.reportRecipient.unsubscribedAt}, ${now})` })
|
|
561
560
|
.where(eq(schema.reportRecipient.unsubscribeToken, token))
|
|
562
|
-
.returning({
|
|
563
|
-
|
|
561
|
+
.returning({
|
|
562
|
+
id: schema.reportRecipient.id,
|
|
563
|
+
orgId: schema.reportRecipient.orgId,
|
|
564
|
+
email: schema.reportRecipient.email,
|
|
565
|
+
unsubscribedAt: schema.reportRecipient.unsubscribedAt,
|
|
566
|
+
}));
|
|
567
|
+
const row = rows[0];
|
|
568
|
+
if (!row)
|
|
569
|
+
return { matched: false };
|
|
570
|
+
// COALESCE kept an earlier instant ⇒ this click changed nothing. Only the
|
|
571
|
+
// FIRST unsubscribe is a state change worth recording, which is also what
|
|
572
|
+
// keeps an externally-triggered route from writing unbounded audit rows.
|
|
573
|
+
const newly = row.unsubscribedAt !== null && new Date(row.unsubscribedAt).getTime() === now.getTime();
|
|
574
|
+
return { matched: true, recipient: { id: row.id, orgId: row.orgId, email: row.email }, newlyUnsubscribed: newly };
|
|
564
575
|
});
|
|
565
576
|
}
|
|
566
577
|
/** Record a delivery bounce. At {@link MAX_BOUNCES} the address is skipped. */
|
|
@@ -978,4 +989,4 @@ export class StakeholderReportStore {
|
|
|
978
989
|
}
|
|
979
990
|
}
|
|
980
991
|
export const stakeholderReportStore = new StakeholderReportStore();
|
|
981
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL3JlcG9ydGluZy9zdGFrZWhvbGRlci9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQVk3RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFOUQsa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUM5Qyw0RUFBNEU7QUFDNUUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBQzNDLHFGQUFxRjtBQUNyRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzNEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBRTdCLHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQWE7SUFDckMsT0FBTyxVQUFVLENBQUMsUUFB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LEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFBlcnNpc3RlbmNlIGZvciBzdGFrZWhvbGRlciByZXBvcnRzOiBkZWZpbml0aW9ucywgcnVucywgc2hhcmUgbGlua3MgYW5kXG4gKiByZWNpcGllbnRzLlxuICpcbiAqIEhhbmQtcm9sbGVkIHJhdGhlciB0aGFuIGZvdXIgYENydWRTZXJ2aWNlYCBzdWJjbGFzc2VzIGJlY2F1c2Ugbm9uZSBvZiB0aGVzZSBpc1xuICogYSBnZW5lcmljIGxpc3RhYmxlIGVudGl0eSB3aXRoIGFuIGBpc0RlZmF1bHRgIHNsb3QgYW5kIHByb2plY3Qtc2NvcGVkIGFjY2Vzc1xuICogY29udHJvbC4gV2hhdCB0aGV5IG5lZWQgaW5zdGVhZCBpcyBhIHNtYWxsIG51bWJlciBvZiBleGFjdCBvcGVyYXRpb25zIHdpdGhcbiAqIGludmFyaWFudHMgdGhlIGdlbmVyaWMgYmFzZSBjYW5ub3QgZXhwcmVzczpcbiAqXG4gKiAgLSBBIFJVTiBJUyBBUFBFTkQtT05MWSBvbmNlIHB1Ymxpc2hlZC4gUmVnZW5lcmF0aW5nIGEgcGVyaW9kIGluc2VydHMgdmVyc2lvblxuICogICAgTisxIGFuZCBwb2ludHMgdGhlIG9sZCByb3cgYXQgaXQgKGBzdXBlcnNlZGVkQnlgKTsgbm90aGluZyBvdmVyd3JpdGVzIGFcbiAqICAgIHNuYXBzaG90IGEgbWFuYWdlciBoYXMgYWxyZWFkeSByZWFkLlxuICogIC0gQSBTSEFSRSBMSU5LIElTIFJFU09MVkVEIFdJVEhPVVQgQSBURU5BTlQuIFRoZSByZWFkZXIgaGFzIG5vIGFjY291bnQsIHNvIHRoZVxuICogICAgbG9va3VwIGJ5IHRva2VuIGhhc2ggaXMgdGhlIG9uZSByZWFkIGhlcmUgdGhhdCBkZWxpYmVyYXRlbHkgcnVucyBhcyBzeXNhZG1pblxuICogICAg4oCUIHNlZSB7QGxpbmsgcmVzb2x2ZVNoYXJlTGlua30gZm9yIHdoeSB0aGF0IGlzIHRoZSBuYXJyb3dlc3Qgc2FmZSBzaGFwZS5cbiAqICAtIEEgUkVDSVBJRU5UIElTIFVQU0VSVEVELCBORVZFUiBSRS1DUkVBVEVELiBSZS1hZGRpbmcgYW4gYWRkcmVzcyBtdXN0IGtlZXAgaXRzXG4gKiAgICB2ZXJpZmljYXRpb24gYW5kIHVuc3Vic2NyaWJlIHN0YXRlLCBvciBhbiB1bnN1YnNjcmliZSBjb3VsZCBiZSB1bmRvbmUgYnlcbiAqICAgIGRlbGV0aW5nIGFuZCByZS1hZGRpbmcgdGhlIHJvdy5cbiAqXG4gKiBFdmVyeXRoaW5nIGVsc2UgcnVucyBpbnNpZGUgdGhlIGNhbGxlcidzIGFtYmllbnQgdGVuYW50IGNvbnRleHQgKGVzdGFibGlzaGVkIGJ5XG4gKiBgd2l0aFRlbmFudENvbnRleHQoKWAgYXQgdGhlIHJlcXVlc3QgYm91bmRhcnkpLCBzbyBSTFMgaXMgdGhlIHRlbmFuY3kgZ2F0ZSBhbmRcbiAqIGFuIGBvcmdJZGAgYXJndW1lbnQgaXMgYSByZWR1bmRhbnQgc2Vjb25kIGNoZWNrIHJhdGhlciB0aGFuIHRoZSBvbmx5IG9uZS5cbiAqL1xuXG5pbXBvcnQgeyByYW5kb21VVUlELCBjcmVhdGVIYXNoLCByYW5kb21CeXRlcyB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IE5vdEZvdW5kRXJyb3IsIENvbmZsaWN0RXJyb3IsIEVycm9yQ29kZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGFuZCwgYXNjLCBkZXNjLCBlcSwgaW5BcnJheSwgaXNOdWxsLCBsdGUsIHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4uLy4uLy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgUmVwb3J0Q2FkZW5jZSxcbiAgUmVwb3J0RGVmaW5pdGlvbixcbiAgUmVwb3J0UGF1c2VSZWFzb24sXG4gIFJlcG9ydFJlY2lwaWVudCxcbiAgUmVwb3J0UnVuLFxuICBSZXBvcnRSdW5TdGF0dXMsXG4gIFJlcG9ydFNjb3BlLFxuICBSZXBvcnRTaGFyZUxpbmssXG4gIFJlcG9ydFRlbXBsYXRlLFxufSBmcm9tICcuLi8uLi8uLi9kYXRhYmFzZS9zY2hlbWEvcmVwb3J0aW5nLXN0YWtlaG9sZGVyLmpzJztcbmltcG9ydCB7IHJ1bldpdGhUZW5hbnRDb250ZXh0LCB3aXRoVGVuYW50VHggfSBmcm9tICcuLi8uLi8uLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcbmltcG9ydCB7IHNvZnREZWxldGVSZXRlbnRpb25NcyB9IGZyb20gJy4uLy4uL2NydWQtc2VydmljZS5qcyc7XG5cbi8qKiBIb3cgbG9uZyBhIGZyZXNobHkgbWludGVkIHNoYXJlIGxpbmsgbGl2ZXMgd2hlbiB0aGUgY2FsbGVyIG5hbWVzIG5vIHdpbmRvdy4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NIQVJFX0xJTktfVFRMX0RBWVMgPSAzMDtcbi8qKiBUaGUgbG9uZ2VzdCBhIHNoYXJlIGxpbmsgbWF5IGxpdmUuIEJleW9uZCB0aGlzIGl0IGlzIGEgcGVybWFuZW50IFVSTC4gKi9cbmV4cG9ydCBjb25zdCBNQVhfU0hBUkVfTElOS19UVExfREFZUyA9IDE4MDtcbi8qKiBBIHJlY2lwaWVudCdzIHZlcmlmaWNhdGlvbiBsaW5rLiBTaG9ydDogaXQgaXMgY2xpY2tlZCB3aXRoaW4gbWludXRlcyBvciBuZXZlci4gKi9cbmV4cG9ydCBjb25zdCBWRVJJRklDQVRJT05fVFRMX01TID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG4vKipcbiAqIEJvdW5jZXMgYmVmb3JlIGFuIGFkZHJlc3MgaXMgdHJlYXRlZCBhcyB1bmRlbGl2ZXJhYmxlIGFuZCBza2lwcGVkLiBUaHJlZSwgbm90XG4gKiBvbmU6IGEgc2luZ2xlIGJvdW5jZSBpcyBvZnRlbiBhbiBvdXQtb2Ytb2ZmaWNlIGF1dG9yZXNwb25kZXIgb3IgYSBmdWxsIG1haWxib3gsXG4gKiBhbmQgZHJvcHBpbmcgYSBtYW5hZ2VyIG9mZiB0aGUgbGlzdCBmb3Igb25lIG9mIHRob3NlIGlzIGEgc2lsZW50IGZhaWx1cmUuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQk9VTkNFUyA9IDM7XG5cbi8qKiBTSEEtMjU2IGhleCBvZiBhIHRva2VuLiBUaGUgb25seSBmb3JtIGFueSB0b2tlbiBpcyBldmVyIHN0b3JlZCBpbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoVG9rZW4odG9rZW46IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUodG9rZW4sICd1dGY4JykuZGlnZXN0KCdoZXgnKTtcbn1cblxuLyoqIEEgZnJlc2ggVVJMLXNhZmUgdG9rZW4sIGFuZCBpdHMgaGFzaC4gVGhlIHJhdyB2YWx1ZSBpcyByZXR1cm5lZCBleGFjdGx5IG9uY2UuICovXG5leHBvcnQgZnVuY3Rpb24gbWludFRva2VuKCk6IHsgdG9rZW46IHN0cmluZzsgdG9rZW5IYXNoOiBzdHJpbmcgfSB7XG4gIGNvbnN0IHRva2VuID0gcmFuZG9tQnl0ZXMoMzIpLnRvU3RyaW5nKCdiYXNlNjR1cmwnKTtcbiAgcmV0dXJuIHsgdG9rZW4sIHRva2VuSGFzaDogaGFzaFRva2VuKHRva2VuKSB9O1xufVxuXG4vKiogV2hhdCBjcmVhdGluZyBhIGRlZmluaXRpb24gbmVlZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZURlZmluaXRpb25JbnB1dCB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdGVtcGxhdGU6IFJlcG9ydFRlbXBsYXRlO1xuICBzZWN0aW9uczogc3RyaW5nW107XG4gIGNhZGVuY2U6IFJlcG9ydENhZGVuY2U7XG4gIHRpbWV6b25lOiBzdHJpbmc7XG4gIHdlZWtTdGFydDogJ21vbmRheScgfCAnc3VuZGF5JztcbiAgc2NvcGU6IFJlcG9ydFNjb3BlO1xuICByZWNpcGllbnRzOiBzdHJpbmdbXTtcbiAgYXV0b1NlbmQ6IGJvb2xlYW47XG4gIG93bmVySWQ6IHN0cmluZztcbiAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIG5leHRSdW5BdD86IERhdGUgfCBudWxsO1xufVxuXG4vKiogVGhlIG11dGFibGUgaGFsZiBvZiBhIGRlZmluaXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZURlZmluaXRpb25JbnB1dCB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHRlbXBsYXRlPzogUmVwb3J0VGVtcGxhdGU7XG4gIHNlY3Rpb25zPzogc3RyaW5nW107XG4gIGNhZGVuY2U/OiBSZXBvcnRDYWRlbmNlO1xuICB0aW1lem9uZT86IHN0cmluZztcbiAgd2Vla1N0YXJ0PzogJ21vbmRheScgfCAnc3VuZGF5JztcbiAgc2NvcGU/OiBSZXBvcnRTY29wZTtcbiAgcmVjaXBpZW50cz86IHN0cmluZ1tdO1xuICBhdXRvU2VuZD86IGJvb2xlYW47XG4gIGlzQWN0aXZlPzogYm9vbGVhbjtcbiAgcGF1c2VkUmVhc29uPzogUmVwb3J0UGF1c2VSZWFzb24gfCBudWxsO1xuICBuZXh0UnVuQXQ/OiBEYXRlIHwgbnVsbDtcbn1cblxuLyoqIEEgc2hhcmUgbGluayBwbHVzIHRoZSBvbmUtdGltZSB0b2tlbiwgcmV0dXJuZWQgb25seSBmcm9tIHRoZSBtaW50IGNhbGwuICovXG5leHBvcnQgaW50ZXJmYWNlIE1pbnRlZFNoYXJlTGluayB7XG4gIGxpbms6IFJlcG9ydFNoYXJlTGluaztcbiAgLyoqIFNob3duIG9uY2UuIE5ldmVyIHN0b3JlZCwgbmV2ZXIgbG9nZ2VkLCBuZXZlciBpbiBhIHJlc3BvbnNlIGFnYWluLiAqL1xuICB0b2tlbjogc3RyaW5nO1xufVxuXG4vKiogV2hhdCB0aGUgcHVibGljIHJvdXRlIG5lZWRzOiB0aGUgbGluaywgaXRzIHJ1biwgYW5kIHRoZSBvd25pbmcgb3JnLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFNoYXJlTGluayB7XG4gIGxpbms6IFJlcG9ydFNoYXJlTGluaztcbiAgcnVuOiBSZXBvcnRSdW47XG59XG5cbi8qKiBUaGUgYHB1cmdlX2FmdGVyYCBzdGFtcCBhIHNvZnQtZGVsZXRlIGNhcnJpZXMsIG9yIGB7fWAgd2hlbiBwdXJnaW5nIGlzIG9mZi4gKi9cbmZ1bmN0aW9uIHB1cmdlU3RhbXAobm93OiBEYXRlKTogeyBwdXJnZUFmdGVyPzogRGF0ZSB9IHtcbiAgY29uc3QgbXMgPSBzb2Z0RGVsZXRlUmV0ZW50aW9uTXMoKTtcbiAgcmV0dXJuIG1zID4gMCA/IHsgcHVyZ2VBZnRlcjogbmV3IERhdGUobm93LmdldFRpbWUoKSArIG1zKSB9IDoge307XG59XG5cbmV4cG9ydCBjbGFzcyBTdGFrZWhvbGRlclJlcG9ydFN0b3JlIHtcbiAgLy8g4pSA4pSAIERlZmluaXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGNyZWF0ZURlZmluaXRpb24oaW5wdXQ6IENyZWF0ZURlZmluaXRpb25JbnB1dCk6IFByb21pc2U8UmVwb3J0RGVmaW5pdGlvbj4ge1xuICAgIGNvbnN0IGlkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pLnZhbHVlcyh7XG4gICAgICBpZCxcbiAgICAgIG9yZ0lkOiBpbnB1dC5vcmdJZCxcbiAgICAgIG93bmVySWQ6IGlucHV0Lm93bmVySWQsXG4gICAgICBuYW1lOiBpbnB1dC5uYW1lLFxuICAgICAgdGVtcGxhdGU6IGlucHV0LnRlbXBsYXRlLFxuICAgICAgc2VjdGlvbnM6IGlucHV0LnNlY3Rpb25zLFxuICAgICAgY2FkZW5jZTogaW5wdXQuY2FkZW5jZSxcbiAgICAgIHRpbWV6b25lOiBpbnB1dC50aW1lem9uZSxcbiAgICAgIHdlZWtTdGFydDogaW5wdXQud2Vla1N0YXJ0LFxuICAgICAgc2NvcGU6IGlucHV0LnNjb3BlLFxuICAgICAgcmVjaXBpZW50czogaW5wdXQucmVjaXBpZW50cyxcbiAgICAgIGF1dG9TZW5kOiBpbnB1dC5hdXRvU2VuZCxcbiAgICAgIG5leHRSdW5BdDogaW5wdXQubmV4dFJ1bkF0ID8/IG51bGwsXG4gICAgICBjcmVhdGVkQnk6IGlucHV0LmNyZWF0ZWRCeSxcbiAgICB9KS5yZXR1cm5pbmcoKSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIFJlcG9ydERlZmluaXRpb25bXSlbMF07XG4gIH1cblxuICBhc3luYyBsaXN0RGVmaW5pdGlvbnMob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8UmVwb3J0RGVmaW5pdGlvbltdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm9yZ0lkLCBvcmdJZCksIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpKSlcbiAgICAgIC5vcmRlckJ5KGFzYyhzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5uYW1lKSkpO1xuICAgIHJldHVybiByb3dzIGFzIFJlcG9ydERlZmluaXRpb25bXTtcbiAgfVxuXG4gIGFzeW5jIGdldERlZmluaXRpb24ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZyk6IFByb21pc2U8UmVwb3J0RGVmaW5pdGlvbiB8IG51bGw+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbilcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkLCBpZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgKSlcbiAgICAgIC5saW1pdCgxKSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIFJlcG9ydERlZmluaXRpb25bXSlbMF0gPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBUaHJvd3Mge0BsaW5rIE5vdEZvdW5kRXJyb3J9IHJhdGhlciB0aGFuIHJldHVybmluZyBudWxsLCBmb3Igcm91dGUgYm9kaWVzLiAqL1xuICBhc3luYyByZXF1aXJlRGVmaW5pdGlvbihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uPiB7XG4gICAgY29uc3QgZm91bmQgPSBhd2FpdCB0aGlzLmdldERlZmluaXRpb24ob3JnSWQsIGlkKTtcbiAgICBpZiAoIWZvdW5kKSB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignUmVwb3J0IGRlZmluaXRpb24gbm90IGZvdW5kJyk7XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRGVmaW5pdGlvbihcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcGF0Y2g6IFVwZGF0ZURlZmluaXRpb25JbnB1dCxcbiAgICB1cGRhdGVkQnk6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uPiB7XG4gICAgY29uc3Qgc2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgdXBkYXRlZEJ5LCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXRjaCkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBzZXRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKS5zZXQoc2V0KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZygpKTtcbiAgICBjb25zdCB1cGRhdGVkID0gKHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdKVswXTtcbiAgICBpZiAoIXVwZGF0ZWQpIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdSZXBvcnQgZGVmaW5pdGlvbiBub3QgZm91bmQnKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kIGEgZGVmaW5pdGlvbiB0byBhIG5ldyBvd25lci4gVGhlIG93bmVyIGlzIHdobyBhIHNjaGVkdWxlZCBydW4gaXNcbiAgICogYXV0aG9yaXplZCBBUywgc28gdGhpcyBpcyBhIHByaXZpbGVnZSBtb3ZlLCBub3QgYSBtZXRhZGF0YSBlZGl0IOKAlCB0aGUgcm91dGVcbiAgICogY2hlY2tzIHRoZSBuZXcgb3duZXIgaXMgYSBsaXZlIG1lbWJlciBvZiB0aGUgb3JnIGJlZm9yZSBjYWxsaW5nLlxuICAgKi9cbiAgYXN5bmMgdHJhbnNmZXJPd25lcihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nLCBuZXdPd25lcklkOiBzdHJpbmcsIGFjdG9ySWQ6IHN0cmluZyk6IFByb21pc2U8UmVwb3J0RGVmaW5pdGlvbj4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAuc2V0KHtcbiAgICAgICAgb3duZXJJZDogbmV3T3duZXJJZCxcbiAgICAgICAgdXBkYXRlZEJ5OiBhY3RvcklkLFxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIC8vIEEgZGVmaW5pdGlvbiBwYXVzZWQgYmVjYXVzZSBpdHMgcHJldmlvdXMgb3duZXIgbG9zdCBhY2Nlc3MgaXMgbGl2ZSBhZ2FpblxuICAgICAgICAvLyB1bmRlciBhbiBvd25lciB3aG8gaGFzIGl0LiBUaGUgc2NoZWR1bGVyIHJlLWNoZWNrcyBldmVyeSBydW4gYW55d2F5LCBzb1xuICAgICAgICAvLyB0aGUgd29yc3QgY2FzZSBpcyBvbmUgbW9yZSBwYXVzZWQgcnVuLCBuZXZlciBhIHN0YW5kaW5nIGdyYW50LlxuICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgcGF1c2VkUmVhc29uOiBudWxsLFxuICAgICAgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkLCBpZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IChyb3dzIGFzIFJlcG9ydERlZmluaXRpb25bXSlbMF07XG4gICAgaWYgKCF1cGRhdGVkKSB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignUmVwb3J0IGRlZmluaXRpb24gbm90IGZvdW5kJyk7XG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgZXZlcnkgZGVmaW5pdGlvbiBhIHVzZXIgb3ducywgd2l0aCB0aGUgcmVhc29uIHJlY29yZGVkLiBDYWxsZWQgd2hlbiB0aGVcbiAgICogb3duZXIgaXMgZGVhY3RpdmF0ZWQgb3IgbG9zZXMgYHJlcG9ydHM6YXV0aG9yYCDigJQgYSByZXBvcnQgbXVzdCBzdG9wIHdoZW4gdGhlXG4gICAqIHBlcnNvbiBhY2NvdW50YWJsZSBmb3IgaXQgY2FuIG5vIGxvbmdlciBzZWUgdGhlIGRhdGEgYmVoaW5kIGl0LlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBwYXVzZWQgZGVmaW5pdGlvbnMgc28gdGhlIGNhbGxlciBjYW4gbm90aWZ5IGFuIG9yZyBhZG1pbjogYVxuICAgKiBzaWxlbnRseSBzdG9wcGVkIHdlZWtseSByZXBvcnQgaXMgZGlzY292ZXJlZCBieSBhIG1hbmFnZXIgbm90IHJlY2VpdmluZyBpdC5cbiAgICovXG4gIGFzeW5jIHBhdXNlRGVmaW5pdGlvbnNGb3JPd25lcihcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIG93bmVySWQ6IHN0cmluZyxcbiAgICByZWFzb246IFJlcG9ydFBhdXNlUmVhc29uLFxuICApOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb25bXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAuc2V0KHsgaXNBY3RpdmU6IGZhbHNlLCBwYXVzZWRSZWFzb246IHJlYXNvbiwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vd25lcklkLCBvd25lcklkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaXNBY3RpdmUsIHRydWUpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0KSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKCkpO1xuICAgIHJldHVybiByb3dzIGFzIFJlcG9ydERlZmluaXRpb25bXTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZURlZmluaXRpb24ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgZGVsZXRlZEJ5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAuc2V0KHsgZGVsZXRlZEF0OiBub3csIGRlbGV0ZWRCeSwgLi4ucHVyZ2VTdGFtcChub3cpIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCwgaWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0KSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkIH0pKTtcbiAgICBpZiAoKHJvd3MgYXMgdW5rbm93bltdKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdSZXBvcnQgZGVmaW5pdGlvbiBub3QgZm91bmQnKTtcbiAgICB9XG4gICAgLy8gTGlua3MgdG8gdGhpcyBkZWZpbml0aW9uJ3MgcnVucyBhcmUgcmV2b2tlZCBpbiB0aGUgc2FtZSBicmVhdGguIERlbGV0aW5nIGFcbiAgICAvLyByZXBvcnQgd2hpbGUgYSBwdWJsaWMgVVJMIHRvIGxhc3QgbW9udGgncyBudW1iZXJzIGtlZXBzIHdvcmtpbmcgaXMgdGhlIGtpbmRcbiAgICAvLyBvZiBnYXAgbm9ib2R5IG5vdGljZXMgdW50aWwgaXQgbWF0dGVycy5cbiAgICBhd2FpdCB0aGlzLnJldm9rZUxpbmtzRm9yRGVmaW5pdGlvbihvcmdJZCwgaWQsIGRlbGV0ZWRCeSk7XG4gIH1cblxuICAvLyDilIDilIAgUnVucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogSW5zZXJ0IGEgcnVuIGZvciBhIHBlcmlvZCwgb3IgcmV0dXJuIHRoZSBleGlzdGluZyBvbmUuXG4gICAqXG4gICAqIElkZW1wb3RlbnQgb24gKGRlZmluaXRpb24sIHBlcmlvZFN0YXJ0LCB2ZXJzaW9uKTogYSByZXRyeSwgYSBjYXRjaC11cCBwYXNzXG4gICAqIGFuZCBhIG1hbnVhbCBiYWNrZmlsbCBjYW4gYWxsIGFzayBmb3IgdGhlIHNhbWUgcGVyaW9kLCBhbmQgd2l0aG91dCB0aGlzIGVhY2hcbiAgICogd291bGQgaW5zZXJ0IGEgcm93IGFuZCB0aGUgbGVhZCB3b3VsZCByZXZpZXcgdGhyZWUgY29waWVzLiBgb25Db25mbGljdERvTm90aGluZ2BcbiAgICogcGx1cyBhIHJlLXJlYWQgaXMgZGVsaWJlcmF0ZSDigJQgdGhlIHVuaXF1ZSBpbmRleCBpcyB0aGUgYXJiaXRlciwgc28gdHdvIHBvZHNcbiAgICogcmFjaW5nIHByb2R1Y2Ugb25lIHJvdyB3aGljaGV2ZXIgd2lucy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVJ1bihpbnB1dDoge1xuICAgIG9yZ0lkOiBzdHJpbmc7XG4gICAgZGVmaW5pdGlvbklkOiBzdHJpbmc7XG4gICAgcGVyaW9kU3RhcnQ6IERhdGU7XG4gICAgcGVyaW9kRW5kOiBEYXRlO1xuICAgIHBlcmlvZExhYmVsOiBzdHJpbmc7XG4gICAgdmVyc2lvbj86IG51bWJlcjtcbiAgICBzdGF0dXM/OiBSZXBvcnRSdW5TdGF0dXM7XG4gICAgc25hcHNob3Q/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7XG4gICAgZmFpbHVyZVJlYXNvbj86IHN0cmluZyB8IG51bGw7XG4gIH0pOiBQcm9taXNlPHsgcnVuOiBSZXBvcnRSdW47IGNyZWF0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHZlcnNpb24gPSBpbnB1dC52ZXJzaW9uID8/IDE7XG4gICAgY29uc3QgaWQgPSByYW5kb21VVUlEKCk7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEucmVwb3J0UnVuKS52YWx1ZXMoe1xuICAgICAgaWQsXG4gICAgICBvcmdJZDogaW5wdXQub3JnSWQsXG4gICAgICBkZWZpbml0aW9uSWQ6IGlucHV0LmRlZmluaXRpb25JZCxcbiAgICAgIHBlcmlvZFN0YXJ0OiBpbnB1dC5wZXJpb2RTdGFydCxcbiAgICAgIHBlcmlvZEVuZDogaW5wdXQucGVyaW9kRW5kLFxuICAgICAgcGVyaW9kTGFiZWw6IGlucHV0LnBlcmlvZExhYmVsLFxuICAgICAgdmVyc2lvbixcbiAgICAgIHN0YXR1czogaW5wdXQuc3RhdHVzID8/ICdkcmFmdGluZycsXG4gICAgICBzbmFwc2hvdDogaW5wdXQuc25hcHNob3QgPz8gbnVsbCxcbiAgICAgIGZhaWx1cmVSZWFzb246IGlucHV0LmZhaWx1cmVSZWFzb24gPz8gbnVsbCxcbiAgICB9KS5vbkNvbmZsaWN0RG9Ob3RoaW5nKHtcbiAgICAgIHRhcmdldDogW3NjaGVtYS5yZXBvcnRSdW4uZGVmaW5pdGlvbklkLCBzY2hlbWEucmVwb3J0UnVuLnBlcmlvZFN0YXJ0LCBzY2hlbWEucmVwb3J0UnVuLnZlcnNpb25dLFxuICAgIH0pLnJldHVybmluZygpKTtcbiAgICBjb25zdCBpbnNlcnRlZCA9IChyb3dzIGFzIFJlcG9ydFJ1bltdKVswXTtcbiAgICBpZiAoaW5zZXJ0ZWQpIHJldHVybiB7IHJ1bjogaW5zZXJ0ZWQsIGNyZWF0ZWQ6IHRydWUgfTtcblxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5kZWZpbml0aW9uSWQsIGlucHV0LmRlZmluaXRpb25JZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4ucGVyaW9kU3RhcnQsIGlucHV0LnBlcmlvZFN0YXJ0KSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi52ZXJzaW9uLCB2ZXJzaW9uKSxcbiAgICAgICkpXG4gICAgICAubGltaXQoMSkpO1xuICAgIGNvbnN0IGZvdW5kID0gKGV4aXN0aW5nIGFzIFJlcG9ydFJ1bltdKVswXTtcbiAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAvLyBUaGUgaW5zZXJ0IHdhcyBza2lwcGVkIGJ5IHRoZSBjb25mbGljdCB0YXJnZXQgYnV0IG5vdGhpbmcgaXMgdGhlcmUgdG9cbiAgICAgIC8vIHJlYWQ6IHRoZSBvbmx5IHdheSBpcyBhIGNvbmN1cnJlbnQgZGVsZXRlIGJldHdlZW4gdGhlIHR3byBzdGF0ZW1lbnRzLlxuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoJ1JlcG9ydCBydW4gY291bGQgbm90IGJlIGNyZWF0ZWQnLCBFcnJvckNvZGUuQ09ORkxJQ1QsIHtcbiAgICAgICAgZGVmaW5pdGlvbklkOiBpbnB1dC5kZWZpbml0aW9uSWQsXG4gICAgICAgIHBlcmlvZExhYmVsOiBpbnB1dC5wZXJpb2RMYWJlbCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4geyBydW46IGZvdW5kLCBjcmVhdGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgLyoqIFRoZSBuZXh0IHZlcnNpb24gbnVtYmVyIGZvciBhIHBlcmlvZDogYG1heCh2ZXJzaW9uKSArIDFgLiAqL1xuICBhc3luYyBuZXh0VmVyc2lvbihkZWZpbml0aW9uSWQ6IHN0cmluZywgcGVyaW9kU3RhcnQ6IERhdGUpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoeyB2ZXJzaW9uOiBzY2hlbWEucmVwb3J0UnVuLnZlcnNpb24gfSlcbiAgICAgIC5mcm9tKHNjaGVtYS5yZXBvcnRSdW4pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UnVuLmRlZmluaXRpb25JZCwgZGVmaW5pdGlvbklkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5wZXJpb2RTdGFydCwgcGVyaW9kU3RhcnQpLFxuICAgICAgKSlcbiAgICAgIC5vcmRlckJ5KGRlc2Moc2NoZW1hLnJlcG9ydFJ1bi52ZXJzaW9uKSlcbiAgICAgIC5saW1pdCgxKSk7XG4gICAgY29uc3QgdG9wID0gKHJvd3MgYXMgQXJyYXk8eyB2ZXJzaW9uOiBudW1iZXIgfT4pWzBdO1xuICAgIHJldHVybiAodG9wPy52ZXJzaW9uID8/IDApICsgMTtcbiAgfVxuXG4gIC8qKiBQb2ludCBhbiBvbGRlciBydW4gYXQgdGhlIHZlcnNpb24gdGhhdCByZXBsYWNlZCBpdC4gKi9cbiAgYXN5bmMgc3VwZXJzZWRlKG9yZ0lkOiBzdHJpbmcsIG9sZFJ1bklkOiBzdHJpbmcsIG5ld1J1bklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC5zZXQoeyBzdXBlcnNlZGVkQnk6IG5ld1J1bklkLCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfSlcbiAgICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnJlcG9ydFJ1bi5pZCwgb2xkUnVuSWQpLCBlcShzY2hlbWEucmVwb3J0UnVuLm9yZ0lkLCBvcmdJZCkpKSk7XG4gIH1cblxuICBhc3luYyBsaXN0UnVucyhvcmdJZDogc3RyaW5nLCBkZWZpbml0aW9uSWQ6IHN0cmluZywgbGltaXQgPSA1MCk6IFByb21pc2U8UmVwb3J0UnVuW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UnVuLmRlZmluaXRpb25JZCwgZGVmaW5pdGlvbklkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSdW4uZGVsZXRlZEF0KSxcbiAgICAgICkpXG4gICAgICAub3JkZXJCeShkZXNjKHNjaGVtYS5yZXBvcnRSdW4ucGVyaW9kU3RhcnQpLCBkZXNjKHNjaGVtYS5yZXBvcnRSdW4udmVyc2lvbikpXG4gICAgICAubGltaXQobGltaXQpKTtcbiAgICByZXR1cm4gcm93cyBhcyBSZXBvcnRSdW5bXTtcbiAgfVxuXG4gIGFzeW5jIGdldFJ1bihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nKTogUHJvbWlzZTxSZXBvcnRSdW4gfCBudWxsPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnJlcG9ydFJ1bi5pZCwgaWQpLCBlcShzY2hlbWEucmVwb3J0UnVuLm9yZ0lkLCBvcmdJZCksIGlzTnVsbChzY2hlbWEucmVwb3J0UnVuLmRlbGV0ZWRBdCkpKVxuICAgICAgLmxpbWl0KDEpKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgUmVwb3J0UnVuW10pWzBdID8/IG51bGw7XG4gIH1cblxuICBhc3luYyByZXF1aXJlUnVuKG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBQcm9taXNlPFJlcG9ydFJ1bj4ge1xuICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgdGhpcy5nZXRSdW4ob3JnSWQsIGlkKTtcbiAgICBpZiAoIWZvdW5kKSB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignUmVwb3J0IHJ1biBub3QgZm91bmQnKTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICAvKiogU3RvcmUgYSBjb21wdXRlZCBzbmFwc2hvdCBhbmQgbW92ZSB0aGUgcnVuIHRvIGByZWFkeV9mb3JfcmV2aWV3YC4gKi9cbiAgYXN5bmMgY29tcGxldGVSdW4oXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBzdGF0dXM6IFJlcG9ydFJ1blN0YXR1cyA9ICdyZWFkeV9mb3JfcmV2aWV3JyxcbiAgKTogUHJvbWlzZTxSZXBvcnRSdW4+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSdW4pXG4gICAgICAuc2V0KHsgc25hcHNob3QsIHN0YXR1cywgZmFpbHVyZVJlYXNvbjogbnVsbCwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIGlkKSwgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpLCBpc051bGwoc2NoZW1hLnJlcG9ydFJ1bi5kZWxldGVkQXQpKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IChyb3dzIGFzIFJlcG9ydFJ1bltdKVswXTtcbiAgICBpZiAoIXVwZGF0ZWQpIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdSZXBvcnQgcnVuIG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9XG5cbiAgYXN5bmMgZmFpbFJ1bihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nLCBmYWlsdXJlUmVhc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC5zZXQoeyBzdGF0dXM6ICdmYWlsZWQnLCBmYWlsdXJlUmVhc29uLCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfSlcbiAgICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnJlcG9ydFJ1bi5pZCwgaWQpLCBlcShzY2hlbWEucmVwb3J0UnVuLm9yZ0lkLCBvcmdJZCkpKSk7XG4gIH1cblxuICAvKipcbiAgICogRWRpdCB0aGUgbGVhZCdzIG93biB3b3JkcyBvbiBhIHJ1biB0aGF0IGhhcyBOT1QgYmVlbiBwdWJsaXNoZWQuXG4gICAqXG4gICAqIFJlZnVzZWQgYWZ0ZXIgcHVibGlzaDogdGhlIG5vdGVzIGFyZSBwYXJ0IG9mIHdoYXQgdGhlIG1hbmFnZXIgcmVhZCwgYW5kIGFcbiAgICogcmVwb3J0IHdob3NlIG5hcnJhdGl2ZSBjYW4gYmUgZWRpdGVkIGFmdGVyIGRlbGl2ZXJ5IGlzIGEgcmVwb3J0IHdob3NlXG4gICAqIGRlbGl2ZXJlZCB2ZXJzaW9uIGNhbm5vdCBiZSByZWNvbnN0cnVjdGVkLiBSZWdlbmVyYXRpbmcgcHJvZHVjZXMgdmVyc2lvbiBOKzEsXG4gICAqIHdoaWNoIGlzIHRoZSBzdXBwb3J0ZWQgd2F5IHRvIGNvcnJlY3QgYSBwdWJsaXNoZWQgcmVwb3J0LlxuICAgKi9cbiAgYXN5bmMgc2V0UnVuTm90ZXMoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHBhdGNoOiB7IGxlYWROb3Rlcz86IHN0cmluZzsgYWlEcmFmdD86IHN0cmluZyB9LFxuICApOiBQcm9taXNlPFJlcG9ydFJ1bj4ge1xuICAgIGNvbnN0IHJ1biA9IGF3YWl0IHRoaXMucmVxdWlyZVJ1bihvcmdJZCwgaWQpO1xuICAgIGlmIChydW4uc3RhdHVzID09PSAncHVibGlzaGVkJykge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoXG4gICAgICAgICdUaGlzIHJlcG9ydCBoYXMgYWxyZWFkeSBiZWVuIHB1Ymxpc2hlZC4gUmVnZW5lcmF0ZSBpdCB0byBwcm9kdWNlIGEgbmV3IHZlcnNpb24gd2l0aCB5b3VyIGNoYW5nZXMg4oCUICdcbiAgICAgICAgKyAndGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIHN0YXlzIGV4YWN0bHkgYXMgdGhlIHJlY2lwaWVudHMgcmVhZCBpdC4nLFxuICAgICAgICBFcnJvckNvZGUuQ09ORkxJQ1QsXG4gICAgICAgIHsgcnVuSWQ6IGlkLCBwdWJsaXNoZWRBdDogcnVuLnB1Ymxpc2hlZEF0Py50b0lTT1N0cmluZygpIH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfTtcbiAgICBpZiAocGF0Y2gubGVhZE5vdGVzICE9PSB1bmRlZmluZWQpIHNldC5sZWFkTm90ZXMgPSBwYXRjaC5sZWFkTm90ZXM7XG4gICAgaWYgKHBhdGNoLmFpRHJhZnQgIT09IHVuZGVmaW5lZCkgc2V0LmFpRHJhZnQgPSBwYXRjaC5haURyYWZ0O1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJ1bikuc2V0KHNldClcbiAgICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnJlcG9ydFJ1bi5pZCwgaWQpLCBlcShzY2hlbWEucmVwb3J0UnVuLm9yZ0lkLCBvcmdJZCksIGlzTnVsbChzY2hlbWEucmVwb3J0UnVuLmRlbGV0ZWRBdCkpKVxuICAgICAgLnJldHVybmluZygpKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgUmVwb3J0UnVuW10pWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCB3aGF0IGhhcHBlbmVkIHdoZW4gYSBydW4gd2FzIGRlbGl2ZXJlZC5cbiAgICpcbiAgICogRGVsaWJlcmF0ZWx5IE5PVCBwYXJ0IG9mIHtAbGluayBzZXRSdW5Ob3Rlc30sIHdoaWNoIHJlZnVzZXMgYSBwdWJsaXNoZWQgcnVuOiBkZWxpdmVyeVxuICAgKiBoYXBwZW5zIEFUIHB1Ymxpc2gsIHNvIGEgbWV0aG9kIHRoYXQgcmVmdXNlZCBwdWJsaXNoZWQgcnVucyBjb3VsZCBuZXZlciByZWNvcmQgaXQuXG4gICAqIFRoaXMgb25lIHdyaXRlcyBleGFjdGx5IG9uZSBjb2x1bW4gYW5kIG5vdGhpbmcgZWxzZSwgd2hpY2ggaXMgd2h5IGl0IGlzIHNhZmUgdG8gYWxsb3dcbiAgICogYWZ0ZXIgcHVibGlzaCDigJQgaXQgY2Fubm90IGNoYW5nZSBhIG51bWJlciBhIHJlY2lwaWVudCBoYXMgcmVhZC5cbiAgICovXG4gIGFzeW5jIHJlY29yZERlbGl2ZXJ5KG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGRlbGl2ZXJ5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgLnNldCh7IGRlbGl2ZXJ5LCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIGlkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydFJ1bi5kZWxldGVkQXQpLFxuICAgICAgKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2ggYSBydW4uXG4gICAqXG4gICAqIENvbmRpdGlvbmFsIG9uIHRoZSByb3cgc3RpbGwgYmVpbmcgdW5wdWJsaXNoZWQgKGBwdWJsaXNoZWRfYXQgSVMgTlVMTGApLCBzb1xuICAgKiB0d28gY2xpY2tzIOKAlCBvciB0d28gdGFicyDigJQgcHJvZHVjZSBvbmUgcHVibGlzaCBhbmQgb25lIHNldCBvZiBkZWxpdmVyaWVzXG4gICAqIHJhdGhlciB0aGFuIHR3by4gQSBydW4gd2l0aCBubyBzbmFwc2hvdCBjYW5ub3QgYmUgcHVibGlzaGVkOiB0aGVyZSB3b3VsZCBiZVxuICAgKiBub3RoaW5nIGZvciBhIHJlY2lwaWVudCB0byByZWFkLlxuICAgKi9cbiAgYXN5bmMgcHVibGlzaFJ1bihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nLCBwdWJsaXNoZWRCeTogc3RyaW5nKTogUHJvbWlzZTx7IHJ1bjogUmVwb3J0UnVuOyBhbHJlYWR5UHVibGlzaGVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB0aGlzLnJlcXVpcmVSdW4ob3JnSWQsIGlkKTtcbiAgICBpZiAocnVuLnN0YXR1cyA9PT0gJ2ZhaWxlZCcgfHwgIXJ1bi5zbmFwc2hvdCkge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoXG4gICAgICAgICdUaGlzIHJlcG9ydCBoYXMgbm8gY29tcHV0ZWQgc25hcHNob3QsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gcHVibGlzaC4gUmVnZW5lcmF0ZSBpdCBmaXJzdC4nLFxuICAgICAgICBFcnJvckNvZGUuQ09ORkxJQ1QsXG4gICAgICAgIHsgcnVuSWQ6IGlkLCBzdGF0dXM6IHJ1bi5zdGF0dXMgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgLnNldCh7IHN0YXR1czogJ3B1Ymxpc2hlZCcsIHB1Ymxpc2hlZEJ5LCBwdWJsaXNoZWRBdDogbm93LCB1cGRhdGVkQXQ6IG5vdyB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5pZCwgaWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UnVuLm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UnVuLnB1Ymxpc2hlZEF0KSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSdW4uZGVsZXRlZEF0KSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKCkpO1xuICAgIGNvbnN0IHB1Ymxpc2hlZCA9IChyb3dzIGFzIFJlcG9ydFJ1bltdKVswXTtcbiAgICBpZiAocHVibGlzaGVkKSByZXR1cm4geyBydW46IHB1Ymxpc2hlZCwgYWxyZWFkeVB1Ymxpc2hlZDogZmFsc2UgfTtcbiAgICAvLyBUaGUgY29uZGl0aW9uYWwgdXBkYXRlIG1hdGNoZWQgbm90aGluZzogc29tZW9uZSBlbHNlIHB1Ymxpc2hlZCBpdCBmaXJzdC5cbiAgICByZXR1cm4geyBydW46IGF3YWl0IHRoaXMucmVxdWlyZVJ1bihvcmdJZCwgaWQpLCBhbHJlYWR5UHVibGlzaGVkOiB0cnVlIH07XG4gIH1cblxuICAvLyDilIDilIAgU2hhcmUgbGlua3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIE1pbnQgYSByZWFkLW9ubHkgbGluayB0byBhIHB1Ymxpc2hlZCBydW4uIFRoZSByYXcgdG9rZW4gaXMgcmV0dXJuZWQgaGVyZSBhbmRcbiAgICogbm93aGVyZSBlbHNlIOKAlCBvbmx5IGl0cyBoYXNoIGlzIHN0b3JlZCwgc28gYSBkYXRhYmFzZSBjb3B5IGNhbm5vdCBiZSB0dXJuZWRcbiAgICogYmFjayBpbnRvIHdvcmtpbmcgVVJMcy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNoYXJlTGluayhpbnB1dDoge1xuICAgIG9yZ0lkOiBzdHJpbmc7XG4gICAgcnVuSWQ6IHN0cmluZztcbiAgICBjcmVhdGVkQnk6IHN0cmluZztcbiAgICB0dGxEYXlzPzogbnVtYmVyO1xuICAgIHJlZGFjdE5hbWVzPzogYm9vbGVhbjtcbiAgICBub3c/OiBEYXRlO1xuICB9KTogUHJvbWlzZTxNaW50ZWRTaGFyZUxpbms+IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB0aGlzLnJlcXVpcmVSdW4oaW5wdXQub3JnSWQsIGlucHV0LnJ1bklkKTtcbiAgICBpZiAocnVuLnN0YXR1cyAhPT0gJ3B1Ymxpc2hlZCcpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgICAnT25seSBhIHB1Ymxpc2hlZCByZXBvcnQgY2FuIGJlIHNoYXJlZC4gUHVibGlzaCBpdCBmaXJzdCDigJQgYSBsaW5rIHRvIGEgZHJhZnQgd291bGQgc2hvdyBudW1iZXJzIHRoZSBsZWFkIGhhcyBub3QgcmV2aWV3ZWQuJyxcbiAgICAgICAgRXJyb3JDb2RlLkNPTkZMSUNULFxuICAgICAgICB7IHJ1bklkOiBpbnB1dC5ydW5JZCwgc3RhdHVzOiBydW4uc3RhdHVzIH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBkYXlzID0gTWF0aC5taW4oaW5wdXQudHRsRGF5cyA/PyBERUZBVUxUX1NIQVJFX0xJTktfVFRMX0RBWVMsIE1BWF9TSEFSRV9MSU5LX1RUTF9EQVlTKTtcbiAgICBjb25zdCBub3cgPSBpbnB1dC5ub3cgPz8gbmV3IERhdGUoKTtcbiAgICBjb25zdCB7IHRva2VuLCB0b2tlbkhhc2ggfSA9IG1pbnRUb2tlbigpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLnJlcG9ydFNoYXJlTGluaykudmFsdWVzKHtcbiAgICAgIGlkOiByYW5kb21VVUlEKCksXG4gICAgICBvcmdJZDogaW5wdXQub3JnSWQsXG4gICAgICBydW5JZDogaW5wdXQucnVuSWQsXG4gICAgICB0b2tlbkhhc2gsXG4gICAgICBleHBpcmVzQXQ6IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyBkYXlzICogMjQgKiA2MCAqIDYwICogMTAwMCksXG4gICAgICByZWRhY3ROYW1lczogaW5wdXQucmVkYWN0TmFtZXMgPz8gZmFsc2UsXG4gICAgICBjcmVhdGVkQnk6IGlucHV0LmNyZWF0ZWRCeSxcbiAgICB9KS5yZXR1cm5pbmcoKSk7XG4gICAgcmV0dXJuIHsgbGluazogKHJvd3MgYXMgUmVwb3J0U2hhcmVMaW5rW10pWzBdLCB0b2tlbiB9O1xuICB9XG5cbiAgYXN5bmMgbGlzdFNoYXJlTGlua3Mob3JnSWQ6IHN0cmluZywgcnVuSWQ6IHN0cmluZyk6IFByb21pc2U8UmVwb3J0U2hhcmVMaW5rW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0U2hhcmVMaW5rKVxuICAgICAgLndoZXJlKGFuZChlcShzY2hlbWEucmVwb3J0U2hhcmVMaW5rLm9yZ0lkLCBvcmdJZCksIGVxKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsucnVuSWQsIHJ1bklkKSkpXG4gICAgICAub3JkZXJCeShkZXNjKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsuY3JlYXRlZEF0KSkpO1xuICAgIHJldHVybiByb3dzIGFzIFJlcG9ydFNoYXJlTGlua1tdO1xuICB9XG5cbiAgYXN5bmMgcmV2b2tlU2hhcmVMaW5rKG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIHJldm9rZWRCeTogc3RyaW5nKTogUHJvbWlzZTxSZXBvcnRTaGFyZUxpbms+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmspXG4gICAgICAuc2V0KHsgcmV2b2tlZEF0OiBuZXcgRGF0ZSgpLCByZXZva2VkQnkgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsuaWQsIGlkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFNoYXJlTGluay5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydFNoYXJlTGluay5yZXZva2VkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgY29uc3QgcmV2b2tlZCA9IChyb3dzIGFzIFJlcG9ydFNoYXJlTGlua1tdKVswXTtcbiAgICBpZiAoIXJldm9rZWQpIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdTaGFyZSBsaW5rIG5vdCBmb3VuZCBvciBhbHJlYWR5IHJldm9rZWQnKTtcbiAgICByZXR1cm4gcmV2b2tlZDtcbiAgfVxuXG4gIC8qKiBSZXZva2UgZXZlcnkgbGl2ZSBsaW5rIHRvIGFueSBydW4gb2YgYSBkZWZpbml0aW9uLiBVc2VkIG9uIGRlbGV0ZS4gKi9cbiAgYXN5bmMgcmV2b2tlTGlua3NGb3JEZWZpbml0aW9uKG9yZ0lkOiBzdHJpbmcsIGRlZmluaXRpb25JZDogc3RyaW5nLCByZXZva2VkQnk6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgcnVucyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCh7IGlkOiBzY2hlbWEucmVwb3J0UnVuLmlkIH0pLmZyb20oc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpLCBlcShzY2hlbWEucmVwb3J0UnVuLmRlZmluaXRpb25JZCwgZGVmaW5pdGlvbklkKSkpKTtcbiAgICBjb25zdCBydW5JZHMgPSAocnVucyBhcyBBcnJheTx7IGlkOiBzdHJpbmcgfT4pLm1hcCgocikgPT4gci5pZCk7XG4gICAgaWYgKHJ1bklkcy5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFNoYXJlTGluaylcbiAgICAgIC5zZXQoeyByZXZva2VkQXQ6IG5ldyBEYXRlKCksIHJldm9rZWRCeSB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFNoYXJlTGluay5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpbkFycmF5KHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsucnVuSWQsIHJ1bklkcyksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0U2hhcmVMaW5rLnJldm9rZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucmVwb3J0U2hhcmVMaW5rLmlkIH0pKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgdW5rbm93bltdKS5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIHNoYXJlIHRva2VuIHRvIGl0cyBsaW5rIGFuZCBydW4sIGZvciB0aGUgVU5BVVRIRU5USUNBVEVEIHB1YmxpY1xuICAgKiByb3V0ZS5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgb25lIHJlYWQgaW4gdGhpcyBtb2R1bGUgdGhhdCBydW5zIGFzIHN5c2FkbWluLCBhbmQgdGhlIHJlYXNvbiBpc1xuICAgKiBzdHJ1Y3R1cmFsOiB0aGUgcmVhZGVyIGhvbGRzIGEgdG9rZW4gYW5kIG5vdGhpbmcgZWxzZSDigJQgbm8gYWNjb3VudCwgbm8gb3JnLFxuICAgKiBubyBKV1Qg4oCUIHNvIHRoZXJlIGlzIG5vIHRlbmFudCBjb250ZXh0IGZvciBSTFMgdG8gc2NvcGUgYnksIGFuZCB0aGUgb3JnIGNhblxuICAgKiBvbmx5IGJlIGxlYXJuZWQgRlJPTSB0aGUgcm93LiBUaGUgZXNjYWxhdGlvbiBpcyBrZXB0IGFzIG5hcnJvdyBhcyB0aGUgcHJvYmxlbTpcbiAgICpcbiAgICogIC0gVGhlIHN5c2FkbWluIHNjb3BlIGNvdmVycyB0aGUgdG9rZW4taGFzaCBsb29rdXAgT05MWS4gVGhlIHJ1biBpcyByZWFkIGJhY2tcbiAgICogICAgdW5kZXIgdGhlIGxpbmsncyBPV04gb3JnLCBzbyBhIGJ1ZyBpbiB0aGUgcnVuIHF1ZXJ5IGNhbm5vdCByZWFjaCBhbm90aGVyXG4gICAqICAgIHRlbmFudCdzIHJvd3MuXG4gICAqICAtIFRoZSBsb29rdXAgaXMgYnkgYSAyNTYtYml0IGhhc2ggb24gYSB1bmlxdWUgaW5kZXguIEl0IGlzIG5vdCBhIGZpbHRlciBhXG4gICAqICAgIGNhbGxlciBjYW4gd2lkZW4g4oCUIHRoZXJlIGlzIG5vIG90aGVyIHByZWRpY2F0ZSB0byBpbmZsdWVuY2UuXG4gICAqICAtIEV4cGlyZWQgYW5kIHJldm9rZWQgbGlua3MgcmVzb2x2ZSB0byBudWxsIGhlcmUsIHNvIHRoZSBjYWxsZXIgY2Fubm90XG4gICAqICAgIGFjY2lkZW50YWxseSBzZXJ2ZSBvbmUgYnkgZm9yZ2V0dGluZyBhIGNoZWNrLlxuICAgKlxuICAgKiBSZXR1cm5zIG51bGwgZm9yIGV2ZXJ5IGZhaWx1cmUg4oCUIHVua25vd24sIHJldm9rZWQsIGV4cGlyZWQsIG9yIHBvaW50aW5nIGF0IGFcbiAgICogcnVuIHRoYXQgaXMgbm8gbG9uZ2VyIHB1Ymxpc2hlZCDigJQgc28gdGhlIHJvdXRlIGFuc3dlcnMgb25lIGluZGlzdGluZ3Vpc2hhYmxlXG4gICAqIDQwNCBhbmQgYSBob2xkZXIgb2YgYSBkZWFkIGxpbmsgbGVhcm5zIG5vdGhpbmcgYWJvdXQgd2hpY2ggb2YgdGhvc2UgaXQgd2FzLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZVNoYXJlTGluayh0b2tlbjogc3RyaW5nLCBub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxSZXNvbHZlZFNoYXJlTGluayB8IG51bGw+IHtcbiAgICBjb25zdCB0b2tlbkhhc2ggPSBoYXNoVG9rZW4odG9rZW4pO1xuICAgIGNvbnN0IGxpbmtzID0gYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydFNoYXJlTGluaylcbiAgICAgICAgLndoZXJlKGVxKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsudG9rZW5IYXNoLCB0b2tlbkhhc2gpKVxuICAgICAgICAubGltaXQoMSkpKTtcbiAgICBjb25zdCBsaW5rID0gKGxpbmtzIGFzIFJlcG9ydFNoYXJlTGlua1tdKVswXTtcbiAgICAvLyBObyBjb25zdGFudC10aW1lIGNvbXBhcmlzb24gaGVyZSBvbiBwdXJwb3NlOiB0aGUgbG9va3VwIGlzIGFuIGVxdWFsaXR5IG1hdGNoXG4gICAgLy8gb24gYSAyNTYtYml0IGhhc2ggb3ZlciBhIHVuaXF1ZSBpbmRleCwgc28gdGhlcmUgaXMgbm8gc2VjcmV0LWRlcGVuZGVudCBicmFuY2hcbiAgICAvLyBpbiB0aGlzIGZ1bmN0aW9uIHRvIGxlYWsuIEEgaGFuZC1yb2xsZWQgY29tcGFyZSBhZnRlciB0aGUgZGF0YWJhc2UgYWxyZWFkeVxuICAgIC8vIGRlY2lkZWQgaXQgd291bGQgYmUgdGhlYXRyZS5cbiAgICBpZiAoIWxpbmspIHJldHVybiBudWxsO1xuICAgIGlmIChsaW5rLnJldm9rZWRBdCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKGxpbmsuZXhwaXJlc0F0LmdldFRpbWUoKSA8PSBub3cuZ2V0VGltZSgpKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJ1bnMgPSBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkOiBsaW5rLm9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnRSdW4pXG4gICAgICAgIC53aGVyZShhbmQoXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5pZCwgbGluay5ydW5JZCksXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgbGluay5vcmdJZCksXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5zdGF0dXMsICdwdWJsaXNoZWQnKSxcbiAgICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydFJ1bi5kZWxldGVkQXQpLFxuICAgICAgICApKVxuICAgICAgICAubGltaXQoMSkpKTtcbiAgICBjb25zdCBydW4gPSAocnVucyBhcyBSZXBvcnRSdW5bXSlbMF07XG4gICAgaWYgKCFydW4pIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7IGxpbmssIHJ1biB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvdW50IG9uZSBodW1hbiB2aWV3IG9mIGEgc2hhcmVkIHJlcG9ydC5cbiAgICpcbiAgICogU2VwYXJhdGUgZnJvbSB7QGxpbmsgcmVzb2x2ZVNoYXJlTGlua30gc28gdGhlIHJvdXRlIGNhbiBzZXJ2ZSBhIGxpbmsgcHJldmlldyxcbiAgICogYSBIRUFEIHByb2JlIG9yIGEgbWFpbCBzY2FubmVyJ3MgZmV0Y2ggV0lUSE9VVCBjb3VudGluZyBpdCDigJQgYSB2aWV3IGNvdW50IHRoYXRcbiAgICoganVtcHMgdGhlIG1vbWVudCBhIGxpbmsgaXMgcGFzdGVkIGludG8gU2xhY2sgdGVsbHMgdGhlIGxlYWQgdGhlaXIgbWFuYWdlciByZWFkXG4gICAqIHRoZSByZXBvcnQgd2hlbiBub2JvZHkgaGFzLlxuICAgKi9cbiAgYXN5bmMgcmVjb3JkU2hhcmVWaWV3KGxpbms6IFJlcG9ydFNoYXJlTGluaywgbm93ID0gbmV3IERhdGUoKSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQ6IGxpbmsub3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0U2hhcmVMaW5rKVxuICAgICAgICAuc2V0KHsgdmlld0NvdW50OiBzcWxgJHtzY2hlbWEucmVwb3J0U2hhcmVMaW5rLnZpZXdDb3VudH0gKyAxYCwgbGFzdFZpZXdlZEF0OiBub3cgfSlcbiAgICAgICAgLndoZXJlKGVxKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsuaWQsIGxpbmsuaWQpKSkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlY2lwaWVudHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEFkZCAob3IgcmUtYWRkKSBhIGRlbGl2ZXJ5IGFkZHJlc3MuXG4gICAqXG4gICAqIFVwc2VydHMgb24gKG9yZywgZW1haWwpIGFuZCBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgcmVzZXQgYHVuc3Vic2NyaWJlZF9hdGAgb3JcbiAgICogYHZlcmlmaWVkX2F0YDogYSBsZWFkIG11c3Qgbm90IGJlIGFibGUgdG8gdW5kbyBzb21lb25lJ3MgdW5zdWJzY3JpYmUgYnlcbiAgICogcmVtb3ZpbmcgYW5kIHJlLWFkZGluZyB0aGVtLCBhbmQgYW4gYWRkcmVzcyBhbHJlYWR5IHZlcmlmaWVkIHNob3VsZCBub3QgaGF2ZVxuICAgKiB0byBjb25maXJtIHR3aWNlLiBBIHZlcmlmaWNhdGlvbiB0b2tlbiBpcyBtaW50ZWQgb25seSB3aGVuIHRoZSBhZGRyZXNzIGlzIG5vdFxuICAgKiB5ZXQgdmVyaWZpZWQuXG4gICAqL1xuICBhc3luYyB1cHNlcnRSZWNpcGllbnQoaW5wdXQ6IHtcbiAgICBvcmdJZDogc3RyaW5nO1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gICAgLyoqIFNldCB3aGVuIGFuIGFkbWluIHByZS1hcHByb3ZlZCBhbiBvdXQtb2YtZG9tYWluIGFkZHJlc3MuICovXG4gICAgYXBwcm92ZWRCeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE9yZyBtZW1iZXJzIHNraXAgdmVyaWZpY2F0aW9uIOKAlCB0aGV5IGFscmVhZHkgYXV0aGVudGljYXRlZCB0byB0aGlzIG9yZy4gKi9cbiAgICBwcmVWZXJpZmllZD86IGJvb2xlYW47XG4gICAgbm93PzogRGF0ZTtcbiAgfSk6IFByb21pc2U8eyByZWNpcGllbnQ6IFJlcG9ydFJlY2lwaWVudDsgdmVyaWZpY2F0aW9uVG9rZW4/OiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IGVtYWlsID0gaW5wdXQuZW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3Qgbm93ID0gaW5wdXQubm93ID8/IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgbWludGVkID0gaW5wdXQucHJlVmVyaWZpZWQgPyB1bmRlZmluZWQgOiBtaW50VG9rZW4oKTtcbiAgICAvLyBUaGUgdW5zdWJzY3JpYmUgdG9rZW4gaXMgbWludGVkIGZvciBFVkVSWSByZWNpcGllbnQsIG1lbWJlciBvciBub3QsIGJlY2F1c2UgZXZlcnlcbiAgICAvLyByZXBvcnQgZW1haWwgY2FycmllcyB0aGUgbGluay4gTWludGVkIG9uY2UgYW5kIGtlcHQ6IGEgbGluayBpbiBhIHJlcG9ydCBmcm9tIE1hcmNoXG4gICAgLy8gaGFzIHRvIGtlZXAgd29ya2luZy5cbiAgICBjb25zdCB1bnN1YiA9IG1pbnRUb2tlbigpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLnJlcG9ydFJlY2lwaWVudCkudmFsdWVzKHtcbiAgICAgIGlkOiByYW5kb21VVUlEKCksXG4gICAgICBvcmdJZDogaW5wdXQub3JnSWQsXG4gICAgICBlbWFpbCxcbiAgICAgIGRpc3BsYXlOYW1lOiBpbnB1dC5kaXNwbGF5TmFtZSA/PyBudWxsLFxuICAgICAgdmVyaWZpZWRBdDogaW5wdXQucHJlVmVyaWZpZWQgPyBub3cgOiBudWxsLFxuICAgICAgdmVyaWZpY2F0aW9uVG9rZW5IYXNoOiBtaW50ZWQ/LnRva2VuSGFzaCA/PyBudWxsLFxuICAgICAgdW5zdWJzY3JpYmVUb2tlbjogdW5zdWIudG9rZW4sXG4gICAgICBhcHByb3ZlZEJ5OiBpbnB1dC5hcHByb3ZlZEJ5ID8/IG51bGwsXG4gICAgICBjcmVhdGVkQnk6IGlucHV0LmNyZWF0ZWRCeSxcbiAgICB9KS5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgICAgdGFyZ2V0OiBbc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5vcmdJZCwgc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5lbWFpbF0sXG4gICAgICBzZXQ6IHtcbiAgICAgICAgZGlzcGxheU5hbWU6IGlucHV0LmRpc3BsYXlOYW1lID8/IHNxbGAke3NjaGVtYS5yZXBvcnRSZWNpcGllbnQuZGlzcGxheU5hbWV9YCxcbiAgICAgICAgLy8gUmUtYWRkaW5nIGEgdG9tYnN0b25lZCByZWNpcGllbnQgcmV2aXZlcyB0aGUgcm93IHdpdGggaXRzIGhpc3RvcnkuXG4gICAgICAgIGRlbGV0ZWRBdDogbnVsbCxcbiAgICAgICAgZGVsZXRlZEJ5OiBudWxsLFxuICAgICAgICBwdXJnZUFmdGVyOiBudWxsLFxuICAgICAgICBhcHByb3ZlZEJ5OiBpbnB1dC5hcHByb3ZlZEJ5ID8/IHNxbGAke3NjaGVtYS5yZXBvcnRSZWNpcGllbnQuYXBwcm92ZWRCeX1gLFxuICAgICAgICAvLyBPbmx5IG1pbnQgb3ZlciBhbiBVTlZFUklGSUVEIHJvdzsgYSB2ZXJpZmllZCBhZGRyZXNzIGtlZXBzIGl0cyBzdGF0ZS5cbiAgICAgICAgdmVyaWZpY2F0aW9uVG9rZW5IYXNoOiBzcWxgQ0FTRSBXSEVOICR7c2NoZW1hLnJlcG9ydFJlY2lwaWVudC52ZXJpZmllZEF0fSBJUyBOVUxMXG4gICAgICAgICAgVEhFTiAke21pbnRlZD8udG9rZW5IYXNoID8/IG51bGx9IEVMU0UgJHtzY2hlbWEucmVwb3J0UmVjaXBpZW50LnZlcmlmaWNhdGlvblRva2VuSGFzaH0gRU5EYCxcbiAgICAgICAgdmVyaWZpZWRBdDogaW5wdXQucHJlVmVyaWZpZWRcbiAgICAgICAgICA/IHNxbGBDT0FMRVNDRSgke3NjaGVtYS5yZXBvcnRSZWNpcGllbnQudmVyaWZpZWRBdH0sICR7bm93fSlgXG4gICAgICAgICAgOiBzcWxgJHtzY2hlbWEucmVwb3J0UmVjaXBpZW50LnZlcmlmaWVkQXR9YCxcbiAgICAgICAgLy8gQ09BTEVTQ0UsIG5ldmVyIG92ZXJ3cml0ZTogcmUtYWRkaW5nIGFuIGFkZHJlc3MgbXVzdCBub3QgYnJlYWsgdGhlIHVuc3Vic2NyaWJlXG4gICAgICAgIC8vIGxpbmsgaW4gZXZlcnkgcmVwb3J0IGFscmVhZHkgZGVsaXZlcmVkIHRvIGl0LlxuICAgICAgICB1bnN1YnNjcmliZVRva2VuOiBzcWxgQ09BTEVTQ0UoJHtzY2hlbWEucmVwb3J0UmVjaXBpZW50LnVuc3Vic2NyaWJlVG9rZW59LCAke3Vuc3ViLnRva2VufSlgLFxuICAgICAgfSxcbiAgICB9KS5yZXR1cm5pbmcoKSk7XG4gICAgY29uc3QgcmVjaXBpZW50ID0gKHJvd3MgYXMgUmVwb3J0UmVjaXBpZW50W10pWzBdO1xuICAgIC8vIFRoZSB0b2tlbiBpcyBvbmx5IHVzZWZ1bCBpZiB0aGlzIHJvdyBhY3R1YWxseSB0b29rIGl0LlxuICAgIGNvbnN0IHRvb2tUb2tlbiA9IG1pbnRlZCAmJiByZWNpcGllbnQudmVyaWZpY2F0aW9uVG9rZW5IYXNoID09PSBtaW50ZWQudG9rZW5IYXNoO1xuICAgIHJldHVybiB7IHJlY2lwaWVudCwgLi4uKHRvb2tUb2tlbiA/IHsgdmVyaWZpY2F0aW9uVG9rZW46IG1pbnRlZC50b2tlbiB9IDoge30pIH07XG4gIH1cblxuICBhc3luYyBsaXN0UmVjaXBpZW50cyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxSZXBvcnRSZWNpcGllbnRbXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQub3JnSWQsIG9yZ0lkKSwgaXNOdWxsKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZGVsZXRlZEF0KSkpXG4gICAgICAub3JkZXJCeShhc2Moc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5lbWFpbCkpKTtcbiAgICByZXR1cm4gcm93cyBhcyBSZXBvcnRSZWNpcGllbnRbXTtcbiAgfVxuXG4gIGFzeW5jIGdldFJlY2lwaWVudHMob3JnSWQ6IHN0cmluZywgaWRzOiBzdHJpbmdbXSk6IFByb21pc2U8UmVwb3J0UmVjaXBpZW50W10+IHtcbiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50Lm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGluQXJyYXkoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5pZCwgaWRzKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZGVsZXRlZEF0KSxcbiAgICAgICkpKTtcbiAgICByZXR1cm4gcm93cyBhcyBSZXBvcnRSZWNpcGllbnRbXTtcbiAgfVxuXG4gIC8qKiBNaW50IGEgZnJlc2ggdmVyaWZpY2F0aW9uIHRva2VuIGZvciBhIHJlY2lwaWVudCB0aGF0IGhhcyBub3QgY29uZmlybWVkIHlldC4gKi9cbiAgYXN5bmMgcmVzZW5kVmVyaWZpY2F0aW9uKG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBQcm9taXNlPHsgcmVjaXBpZW50OiBSZXBvcnRSZWNpcGllbnQ7IHRva2VuOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHsgdG9rZW4sIHRva2VuSGFzaCB9ID0gbWludFRva2VuKCk7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0UmVjaXBpZW50KVxuICAgICAgLnNldCh7IHZlcmlmaWNhdGlvblRva2VuSGFzaDogdG9rZW5IYXNoIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50LmlkLCBpZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQudmVyaWZpZWRBdCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UmVjaXBpZW50LmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZygpKTtcbiAgICBjb25zdCByZWNpcGllbnQgPSAocm93cyBhcyBSZXBvcnRSZWNpcGllbnRbXSlbMF07XG4gICAgaWYgKCFyZWNpcGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgICAnVGhpcyByZWNpcGllbnQgaXMgYWxyZWFkeSB2ZXJpZmllZCwgb3Igbm8gbG9uZ2VyIGV4aXN0cy4nLFxuICAgICAgICBFcnJvckNvZGUuQ09ORkxJQ1QsXG4gICAgICAgIHsgcmVjaXBpZW50SWQ6IGlkIH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4geyByZWNpcGllbnQsIHRva2VuIH07XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlybSBhbiBhZGRyZXNzIGZyb20gdGhlIGVtYWlsZWQgdG9rZW4uIENyb3NzLW9yZyBieSBuZWNlc3NpdHkgKHRoZSBwZXJzb25cbiAgICogY2xpY2tpbmcgaGFzIG5vIHNlc3Npb24pLCBzbyBpdCBydW5zIGFzIHN5c2FkbWluIG92ZXIgYSB1bmlxdWUgMjU2LWJpdCBoYXNoIOKAlFxuICAgKiB0aGUgc2FtZSBzaGFwZSwgYW5kIHRoZSBzYW1lIHJlYXNvbmluZywgYXMge0BsaW5rIHJlc29sdmVTaGFyZUxpbmt9LlxuICAgKlxuICAgKiBUaGUgdG9rZW4gaXMgQ09OU1VNRUQ6IGl0IGlzIGNsZWFyZWQgb24gc3VjY2Vzcywgc28gYSBmb3J3YXJkZWQgY29uZmlybWF0aW9uXG4gICAqIGxpbmsgY2Fubm90IGJlIHJlcGxheWVkIGJ5IHdob2V2ZXIgdGhlIG1haWwgd2FzIGZvcndhcmRlZCB0by5cbiAgICovXG4gIGFzeW5jIHZlcmlmeVJlY2lwaWVudEJ5VG9rZW4odG9rZW46IHN0cmluZywgbm93ID0gbmV3IERhdGUoKSk6IFByb21pc2U8UmVwb3J0UmVjaXBpZW50IHwgbnVsbD4ge1xuICAgIGNvbnN0IHRva2VuSGFzaCA9IGhhc2hUb2tlbih0b2tlbik7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJlY2lwaWVudClcbiAgICAgICAgLnNldCh7IHZlcmlmaWVkQXQ6IG5vdywgdmVyaWZpY2F0aW9uVG9rZW5IYXNoOiBudWxsIH0pXG4gICAgICAgIC53aGVyZShhbmQoXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC52ZXJpZmljYXRpb25Ub2tlbkhhc2gsIHRva2VuSGFzaCksXG4gICAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQudmVyaWZpZWRBdCksXG4gICAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZGVsZXRlZEF0KSxcbiAgICAgICAgICAvLyBBIHRva2VuIG9sZGVyIHRoYW4gdGhlIHdpbmRvdyBpcyBub3QgYWNjZXB0ZWQuIGBjcmVhdGVkX2F0YCBpcyB0aGVcbiAgICAgICAgICAvLyBmbG9vciBmb3IgdGhlIGZpcnN0IHRva2VuOyBhIHJlc2VuZCByZWZyZXNoZXMgdGhlIGhhc2gsIHNvIHRoaXMgYm91bmRzXG4gICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIG1pbnQgYW5kIGlzIGRlbGliZXJhdGVseSBnZW5lcm91cy5cbiAgICAgICAgICBzcWxgJHtzY2hlbWEucmVwb3J0UmVjaXBpZW50LmNyZWF0ZWRBdH0gPiAke25ldyBEYXRlKG5vdy5nZXRUaW1lKCkgLSBWRVJJRklDQVRJT05fVFRMX01TKX1gLFxuICAgICAgICApKVxuICAgICAgICAucmV0dXJuaW5nKCkpKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgUmVwb3J0UmVjaXBpZW50W10pWzBdID8/IG51bGw7XG4gIH1cblxuICAvKiogSG9ub3VyIGFuIHVuc3Vic2NyaWJlIGFjcm9zcyBldmVyeSBkZWZpbml0aW9uIGluIHRoZSBvcmcuICovXG4gIGFzeW5jIHVuc3Vic2NyaWJlQnlFbWFpbChvcmdJZDogc3RyaW5nLCBlbWFpbDogc3RyaW5nLCBub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0UmVjaXBpZW50KVxuICAgICAgLnNldCh7IHVuc3Vic2NyaWJlZEF0OiBub3cgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5lbWFpbCwgZW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC51bnN1YnNjcmliZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucmVwb3J0UmVjaXBpZW50LmlkIH0pKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgdW5rbm93bltdKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvbm91ciBhbiB1bnN1YnNjcmliZSBmcm9tIHRoZSBsaW5rIGluIGEgcmVwb3J0IGVtYWlsLlxuICAgKlxuICAgKiBMb29rZWQgdXAgYnkgVE9LRU4gYWNyb3NzIG9yZ3MsIGFzIHN5c2FkbWluLCBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBzaGFyZS1saW5rXG4gICAqIHJlc29sdmUgaXM6IHRoZSBwZXJzb24gY2xpY2tpbmcgaGFzIG5vIGFjY291bnQgYW5kIG5vIHRlbmFudCwgYW5kIHRoZSB0b2tlbiBpcyB0aGVcbiAgICogb25seSB0aGluZyB0aGF0IGlkZW50aWZpZXMgdGhlIHJvdy4gSXQgaXMgdGhlIG5hcnJvd2VzdCBwb3NzaWJsZSBzaGFwZSDigJQgb25lIGluZGV4ZWRcbiAgICogbG9va3VwLCBvbmUgY29sdW1uIHdyaXR0ZW4sIG5vdGhpbmcgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciBidXQgd2hldGhlciBhIHJvd1xuICAgKiBtYXRjaGVkLlxuICAgKlxuICAgKiBJZGVtcG90ZW50LiBBIG1haWwgY2xpZW50IHRoYXQgc2VuZHMgdGhlIG9uZS1jbGljayBQT1NUIHR3aWNlLCBvciBhIG1hbmFnZXIgd2hvXG4gICAqIGNsaWNrcyBhZ2FpbiBtb250aHMgbGF0ZXIsIGdldHMgdGhlIHNhbWUgYW5zd2VyIHJhdGhlciB0aGFuIGFuIGVycm9yIHBhZ2Ug4oCUIHRoZVxuICAgKiBzZWNvbmQgY2FsbCBmaW5kcyB0aGUgcm93IGFscmVhZHkgdW5zdWJzY3JpYmVkIGFuZCByZXBvcnRzIHN1Y2Nlc3MsIGJlY2F1c2UgZnJvbSB0aGVcbiAgICogY2xpY2tlcidzIHBvaW50IG9mIHZpZXcgaXQgaXMuXG4gICAqL1xuICBhc3luYyB1bnN1YnNjcmliZUJ5VG9rZW4odG9rZW46IHN0cmluZywgbm93ID0gbmV3IERhdGUoKSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0b2tlbi5sZW5ndGggPCAxNikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAgIC5zZXQoeyB1bnN1YnNjcmliZWRBdDogc3FsYENPQUxFU0NFKCR7c2NoZW1hLnJlcG9ydFJlY2lwaWVudC51bnN1YnNjcmliZWRBdH0sICR7bm93fSlgIH0pXG4gICAgICAgIC53aGVyZShlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50LnVuc3Vic2NyaWJlVG9rZW4sIHRva2VuKSlcbiAgICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucmVwb3J0UmVjaXBpZW50LmlkIH0pKTtcbiAgICAgIHJldHVybiAocm93cyBhcyB1bmtub3duW10pLmxlbmd0aCA+IDA7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVjb3JkIGEgZGVsaXZlcnkgYm91bmNlLiBBdCB7QGxpbmsgTUFYX0JPVU5DRVN9IHRoZSBhZGRyZXNzIGlzIHNraXBwZWQuICovXG4gIGFzeW5jIHJlY29yZEJvdW5jZShvcmdJZDogc3RyaW5nLCBlbWFpbDogc3RyaW5nLCBub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAuc2V0KHsgYm91bmNlQ291bnQ6IHNxbGAke3NjaGVtYS5yZXBvcnRSZWNpcGllbnQuYm91bmNlQ291bnR9ICsgMWAsIGxhc3RCb3VuY2VBdDogbm93IH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50Lm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZW1haWwsIGVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKHsgYm91bmNlQ291bnQ6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuYm91bmNlQ291bnQgfSkpO1xuICAgIHJldHVybiAocm93cyBhcyBBcnJheTx7IGJvdW5jZUNvdW50OiBudW1iZXIgfT4pWzBdPy5ib3VuY2VDb3VudCA/PyAwO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlUmVjaXBpZW50KG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGRlbGV0ZWRCeTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAuc2V0KHsgZGVsZXRlZEF0OiBub3csIGRlbGV0ZWRCeSwgLi4ucHVyZ2VTdGFtcChub3cpIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50LmlkLCBpZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZGVsZXRlZEF0KSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuaWQgfSkpO1xuICAgIGlmICgocm93cyBhcyB1bmtub3duW10pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ1JlY2lwaWVudCBub3QgZm91bmQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXMgdGhpcyBhZGRyZXNzIGRlbGl2ZXJhYmxlIHJpZ2h0IG5vdz8gVGhlIHNpbmdsZSBwbGFjZSB0aGUgZGVsaXZlcnkgcnVsZXNcbiAgICogbGl2ZSwgc28gdGhlIHNjaGVkdWxlciBhbmQgdGhlIFVJIGFncmVlIGFib3V0IHdoeSBhIHJlY2lwaWVudCBpcyBiZWluZ1xuICAgKiBza2lwcGVkLlxuICAgKi9cbiAgZGVsaXZlcmFiaWxpdHkocmVjaXBpZW50OiBSZXBvcnRSZWNpcGllbnQpOiB7IGRlbGl2ZXJhYmxlOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSB7XG4gICAgaWYgKHJlY2lwaWVudC5kZWxldGVkQXQpIHJldHVybiB7IGRlbGl2ZXJhYmxlOiBmYWxzZSwgcmVhc29uOiAncmVtb3ZlZCcgfTtcbiAgICBpZiAocmVjaXBpZW50LnVuc3Vic2NyaWJlZEF0KSByZXR1cm4geyBkZWxpdmVyYWJsZTogZmFsc2UsIHJlYXNvbjogJ3Vuc3Vic2NyaWJlZCcgfTtcbiAgICBpZiAoIXJlY2lwaWVudC52ZXJpZmllZEF0KSByZXR1cm4geyBkZWxpdmVyYWJsZTogZmFsc2UsIHJlYXNvbjogJ3BlbmRpbmdfdmVyaWZpY2F0aW9uJyB9O1xuICAgIGlmIChyZWNpcGllbnQuYm91bmNlQ291bnQgPj0gTUFYX0JPVU5DRVMpIHJldHVybiB7IGRlbGl2ZXJhYmxlOiBmYWxzZSwgcmVhc29uOiAnYm91bmNpbmcnIH07XG4gICAgcmV0dXJuIHsgZGVsaXZlcmFibGU6IHRydWUgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWNpcGllbnQgcG9saWN5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUaGUgb3JnJ3MgYWRtaW4tb3duZWQgcmVwb3J0IHBvbGljeS4gUmVhZCB0aHJvdWdoIHRoZSByZXBvcnRpbmcgc2V0dGluZ3Mgcm93LFxuICAgKiB3aGljaCBtYXkgbm90IGV4aXN0IOKAlCBhbiBvcmcgdGhhdCBoYXMgbmV2ZXIgY29uZmlndXJlZCBhbnl0aGluZyBnZXRzIHRoZVxuICAgKiBjbG9zZWQgZGVmYXVsdHMgKG5vIGV4dGVybmFsIHNoYXJpbmcsIG5vIGV4dGVybmFsIGRvbWFpbnMsIGFwcHJvdmFsIHJlcXVpcmVkKS5cbiAgICovXG4gIGFzeW5jIGdldFJlcG9ydFBvbGljeShvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgZXh0ZXJuYWxTaGFyaW5nOiBib29sZWFuO1xuICAgIHJlY2lwaWVudERvbWFpbnM6IHN0cmluZ1tdIHwgbnVsbDtcbiAgICByZXF1aXJlQXBwcm92YWw6IGJvb2xlYW47XG4gICAgZGVmYXVsdFRpbWV6b25lOiBzdHJpbmcgfCBudWxsO1xuICAgIGRlZmF1bHRXZWVrU3RhcnQ6IHN0cmluZyB8IG51bGw7XG4gIH0+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KHtcbiAgICAgIGV4dGVybmFsU2hhcmluZzogc2NoZW1hLmRvcmFTZXR0aW5ncy5yZXBvcnRFeHRlcm5hbFNoYXJpbmcsXG4gICAgICByZWNpcGllbnREb21haW5zOiBzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydFJlY2lwaWVudERvbWFpbnMsXG4gICAgICByZXF1aXJlQXBwcm92YWw6IHNjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0UmVxdWlyZUFwcHJvdmFsLFxuICAgICAgZGVmYXVsdFRpbWV6b25lOiBzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydERlZmF1bHRUaW1lem9uZSxcbiAgICAgIGRlZmF1bHRXZWVrU3RhcnQ6IHNjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0RGVmYXVsdFdlZWtTdGFydCxcbiAgICB9KS5mcm9tKHNjaGVtYS5kb3JhU2V0dGluZ3MpLndoZXJlKGVxKHNjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWQsIG9yZ0lkKSkubGltaXQoMSkpO1xuICAgIGNvbnN0IHJvdyA9IChyb3dzIGFzIEFycmF5PHtcbiAgICAgIGV4dGVybmFsU2hhcmluZzogYm9vbGVhbjtcbiAgICAgIHJlY2lwaWVudERvbWFpbnM6IHN0cmluZ1tdIHwgbnVsbDtcbiAgICAgIHJlcXVpcmVBcHByb3ZhbDogYm9vbGVhbjtcbiAgICAgIGRlZmF1bHRUaW1lem9uZTogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGRlZmF1bHRXZWVrU3RhcnQ6IHN0cmluZyB8IG51bGw7XG4gICAgfT4pWzBdO1xuICAgIHJldHVybiB7XG4gICAgICBleHRlcm5hbFNoYXJpbmc6IHJvdz8uZXh0ZXJuYWxTaGFyaW5nID8/IGZhbHNlLFxuICAgICAgcmVjaXBpZW50RG9tYWluczogcm93Py5yZWNpcGllbnREb21haW5zID8/IG51bGwsXG4gICAgICByZXF1aXJlQXBwcm92YWw6IHJvdz8ucmVxdWlyZUFwcHJvdmFsID8/IHRydWUsXG4gICAgICAvLyBOVUxMIHJhdGhlciB0aGFuIGEgZ3Vlc3NlZCB6b25lOiB0aGUgY3JlYXRlIGZvcm0gZmFsbHMgYmFjayB0byB0aGUgQlJPV1NFUidzIHpvbmUsXG4gICAgICAvLyB3aGljaCBpcyBhIGJldHRlciBkZWZhdWx0IHRoYW4gdGhlIHNlcnZlcidzIGFuZCBpcyB2aXNpYmx5IHRoZSBsZWFkJ3Mgb3duLlxuICAgICAgZGVmYXVsdFRpbWV6b25lOiByb3c/LmRlZmF1bHRUaW1lem9uZSA/PyBudWxsLFxuICAgICAgZGVmYXVsdFdlZWtTdGFydDogcm93Py5kZWZhdWx0V2Vla1N0YXJ0ID8/IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNldFJlcG9ydFBvbGljeShvcmdJZDogc3RyaW5nLCBwYXRjaDoge1xuICAgIGV4dGVybmFsU2hhcmluZz86IGJvb2xlYW47XG4gICAgcmVjaXBpZW50RG9tYWlucz86IHN0cmluZ1tdIHwgbnVsbDtcbiAgICByZXF1aXJlQXBwcm92YWw/OiBib29sZWFuO1xuICAgIGRlZmF1bHRUaW1lem9uZT86IHN0cmluZyB8IG51bGw7XG4gICAgZGVmYXVsdFdlZWtTdGFydD86IHN0cmluZyB8IG51bGw7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfTtcbiAgICBpZiAocGF0Y2guZXh0ZXJuYWxTaGFyaW5nICE9PSB1bmRlZmluZWQpIHNldC5yZXBvcnRFeHRlcm5hbFNoYXJpbmcgPSBwYXRjaC5leHRlcm5hbFNoYXJpbmc7XG4gICAgaWYgKHBhdGNoLnJlY2lwaWVudERvbWFpbnMgIT09IHVuZGVmaW5lZCkgc2V0LnJlcG9ydFJlY2lwaWVudERvbWFpbnMgPSBwYXRjaC5yZWNpcGllbnREb21haW5zO1xuICAgIGlmIChwYXRjaC5yZXF1aXJlQXBwcm92YWwgIT09IHVuZGVmaW5lZCkgc2V0LnJlcG9ydFJlcXVpcmVBcHByb3ZhbCA9IHBhdGNoLnJlcXVpcmVBcHByb3ZhbDtcbiAgICBpZiAocGF0Y2guZGVmYXVsdFRpbWV6b25lICE9PSB1bmRlZmluZWQpIHNldC5yZXBvcnREZWZhdWx0VGltZXpvbmUgPSBwYXRjaC5kZWZhdWx0VGltZXpvbmU7XG4gICAgaWYgKHBhdGNoLmRlZmF1bHRXZWVrU3RhcnQgIT09IHVuZGVmaW5lZCkgc2V0LnJlcG9ydERlZmF1bHRXZWVrU3RhcnQgPSBwYXRjaC5kZWZhdWx0V2Vla1N0YXJ0O1xuICAgIGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEuZG9yYVNldHRpbmdzKS52YWx1ZXMoe1xuICAgICAgb3JnSWQsXG4gICAgICByZXBvcnRFeHRlcm5hbFNoYXJpbmc6IHBhdGNoLmV4dGVybmFsU2hhcmluZyA/PyBmYWxzZSxcbiAgICAgIHJlcG9ydFJlY2lwaWVudERvbWFpbnM6IHBhdGNoLnJlY2lwaWVudERvbWFpbnMgPz8gbnVsbCxcbiAgICAgIHJlcG9ydFJlcXVpcmVBcHByb3ZhbDogcGF0Y2gucmVxdWlyZUFwcHJvdmFsID8/IHRydWUsXG4gICAgICByZXBvcnREZWZhdWx0VGltZXpvbmU6IHBhdGNoLmRlZmF1bHRUaW1lem9uZSA/PyBudWxsLFxuICAgICAgcmVwb3J0RGVmYXVsdFdlZWtTdGFydDogcGF0Y2guZGVmYXVsdFdlZWtTdGFydCA/PyBudWxsLFxuICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7IHRhcmdldDogc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCwgc2V0IH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhIFN0YWtlaG9sZGVyIFJlcG9ydHMgZW50aXRsZW1lbnQgY2hhbmdlIGZyb20gYmlsbGluZzogcGF1c2UgZXZlcnl0aGluZywgb3JcbiAgICogcmVzdW1lIHdoYXQgdGhlIGxhcHNlIHBhdXNlZC5cbiAgICpcbiAgICogVEhFIFdBVEVSTUFSSyBBTkQgVEhFIFdPUksgQVJFIE9ORSBUUkFOU0FDVElPTiwgYW5kIHRoZSB3YXRlcm1hcmsgdXBkYXRlIGlzIHdoYXRcbiAgICogc2VyaWFsaXplcyBjb25jdXJyZW50IHB1c2hlcy4gQmlsbGluZydzIGxlZ3MgYXJlIGJlc3QtZWZmb3J0IGFuZCByZXRyaWVkLCBzb1xuICAgKiBcImxhcHNlZCBhdCAxMDowMFwiIGFuZCBcInJlbmV3ZWQgYXQgMTA6MDVcIiBjYW4gYXJyaXZlIGluIGVpdGhlciBvcmRlcjsgYXBwbHlpbmcgdGhlXG4gICAqIG9sZGVyIG9uZSBsYXN0IHdvdWxkIGxlYXZlIGEgbGFwc2VkIGFjY291bnQgcHJvZHVjaW5nIHJlcG9ydHMsIG9yIGEgcGF5aW5nIG9uZVxuICAgKiBwYXVzZWQuIFRoZSBjb25kaXRpb25hbCB1cGRhdGUgdGFrZXMgYSByb3cgbG9jayBvbiBgZG9yYV9zZXR0aW5nc2AsIHNvIGEgc2Vjb25kXG4gICAqIHB1c2ggd2FpdHMgYW5kIHRoZW4gc2VlcyB0aGUgbmV3ZXIgd2F0ZXJtYXJrIOKAlCBubyBhZHZpc29yeSBsb2NrIG5lZWRlZC5cbiAgICpcbiAgICogUkVTVU1FIElTIFNDT1BFRCBUTyBgZW50aXRsZW1lbnRgLiBJdCBtdXN0IG5vdCB1bi1wYXVzZSBhIGRlZmluaXRpb24gd2hvc2UgT1dORVIgd2FzXG4gICAqIGRlYWN0aXZhdGVkIG9yIHdobyBsb3N0IHRoZSBwZXJtaXNzaW9uOiB0aG9zZSBhcmUgZGlmZmVyZW50IHByb2JsZW1zIHdpdGggZGlmZmVyZW50XG4gICAqIGZpeGVzLCBhbmQgcmVzdW1pbmcgb25lIGJ5IGZpeGluZyB0aGUgb3RoZXIgaXMgaG93IGEgcmVwb3J0IHN0YXJ0cyBydW5uaW5nIHVuZGVyXG4gICAqIHNvbWVib2R5IHdobyBsZWZ0LlxuICAgKlxuICAgKiBgbmV4dFJ1bkZvcmAgaXMgYSBjYWxsYmFjayBiZWNhdXNlIHRoZSBwZXJpb2QgYXJpdGhtZXRpYyBuZWVkcyBlYWNoIGRlZmluaXRpb24nc1xuICAgKiBjYWRlbmNlLCB0aW1lem9uZSBhbmQgd2VlayBzdGFydCwgYW5kIHRoYXQgYmVsb25ncyB3aXRoIHRoZSBwZXJpb2QgcmVzb2x2ZXIgcmF0aGVyXG4gICAqIHRoYW4gdGhlIHN0b3JlIOKAlCB3aGlsZSB0aGUgd3JpdGUgc3RpbGwgaGFzIHRvIGhhcHBlbiBpbnNpZGUgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogVGhpcyBsZWcgbWFrZXMgdGhlIGNoYW5nZSBJTU1FRElBVEU7IGl0IGlzIG5vdCB3aGF0IG1ha2VzIGl0IHNhZmUuIEV2ZXJ5IHNjaGVkdWxlZFxuICAgKiBydW4gcmUtY2hlY2tzIHRoZSBlbnRpdGxlbWVudCBhZ2FpbnN0IHBsYXRmb3JtIGFueXdheSwgc28gYSBsb3N0IHB1c2ggZGVsYXlzXG4gICAqIGVuZm9yY2VtZW50IHRvIHRoZSBuZXh0IHJ1biByYXRoZXIgdGhhbiBkZWZlYXRpbmcgaXQuXG4gICAqL1xuICBhc3luYyBzeW5jUmVwb3J0RW50aXRsZW1lbnQoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBlbnRpdGxlZDogYm9vbGVhbixcbiAgICBvcHRzOiB7IG9jY3VycmVkQXQ/OiBEYXRlOyBuZXh0UnVuRm9yPzogKGQ6IFJlcG9ydERlZmluaXRpb24pID0+IERhdGU7IG5vdz86IERhdGUgfSA9IHt9LFxuICApOiBQcm9taXNlPHsgc2tpcHBlZDogYm9vbGVhbjsgcGF1c2VkOiBSZXBvcnREZWZpbml0aW9uW107IHJlc3VtZWQ6IFJlcG9ydERlZmluaXRpb25bXSB9PiB7XG4gICAgY29uc3Qgbm93ID0gb3B0cy5ub3cgPz8gbmV3IERhdGUoKTtcbiAgICBjb25zdCBvY2N1cnJlZEF0ID0gb3B0cy5vY2N1cnJlZEF0ID8/IG5vdztcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgLy8gVGhlIGNsYWltLiBBIHB1c2ggYXQgb3IgYmVmb3JlIHRoZSBsYXN0IGFwcGxpZWQgY2hhbmdlIHVwZGF0ZXMgemVybyByb3dzLlxuICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHR4Lmluc2VydChzY2hlbWEuZG9yYVNldHRpbmdzKVxuICAgICAgICAudmFsdWVzKHsgb3JnSWQsIHJlcG9ydEVudGl0bGVtZW50U3luY2VkQXQ6IG9jY3VycmVkQXQgfSlcbiAgICAgICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgICAgdGFyZ2V0OiBzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkLFxuICAgICAgICAgIHNldDogeyByZXBvcnRFbnRpdGxlbWVudFN5bmNlZEF0OiBvY2N1cnJlZEF0LCB1cGRhdGVkQXQ6IG5vdyB9LFxuICAgICAgICAgIHNldFdoZXJlOiBzcWxgJHtzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydEVudGl0bGVtZW50U3luY2VkQXR9IElTIE5VTExcbiAgICAgICAgICAgIE9SICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5yZXBvcnRFbnRpdGxlbWVudFN5bmNlZEF0fSA8ICR7b2NjdXJyZWRBdH1gLFxuICAgICAgICB9KVxuICAgICAgICAucmV0dXJuaW5nKHsgb3JnSWQ6IHNjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWQgfSk7XG4gICAgICBpZiAoKGNsYWltZWQgYXMgdW5rbm93bltdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHsgc2tpcHBlZDogdHJ1ZSwgcGF1c2VkOiBbXSwgcmVzdW1lZDogW10gfTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbnRpdGxlZCkge1xuICAgICAgICBjb25zdCByb3dzID0gYXdhaXQgdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgICAgIC5zZXQoeyBpc0FjdGl2ZTogZmFsc2UsIHBhdXNlZFJlYXNvbjogJ2VudGl0bGVtZW50JywgbmV4dFJ1bkF0OiBudWxsLCB1cGRhdGVkQXQ6IG5vdyB9KVxuICAgICAgICAgIC53aGVyZShhbmQoXG4gICAgICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaXNBY3RpdmUsIHRydWUpLFxuICAgICAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICAgICAgKSlcbiAgICAgICAgICAucmV0dXJuaW5nKCk7XG4gICAgICAgIHJldHVybiB7IHNraXBwZWQ6IGZhbHNlLCBwYXVzZWQ6IHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdLCByZXN1bWVkOiBbXSB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXVzZWQgPSBhd2FpdCB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm9yZ0lkLCBvcmdJZCksXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaXNBY3RpdmUsIGZhbHNlKSxcbiAgICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5wYXVzZWRSZWFzb24sICdlbnRpdGxlbWVudCcpLFxuICAgICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgICApKSBhcyBSZXBvcnREZWZpbml0aW9uW107XG4gICAgICBjb25zdCByZXN1bWVkOiBSZXBvcnREZWZpbml0aW9uW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZGVmaW5pdGlvbiBvZiBwYXVzZWQpIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbilcbiAgICAgICAgICAuc2V0KHtcbiAgICAgICAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgcGF1c2VkUmVhc29uOiBudWxsLFxuICAgICAgICAgICAgbmV4dFJ1bkF0OiBvcHRzLm5leHRSdW5Gb3IgPyBvcHRzLm5leHRSdW5Gb3IoZGVmaW5pdGlvbikgOiBudWxsLFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2hlcmUoZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGRlZmluaXRpb24uaWQpKVxuICAgICAgICAgIC5yZXR1cm5pbmcoKTtcbiAgICAgICAgY29uc3Qgcm93ID0gKHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdKVswXTtcbiAgICAgICAgaWYgKHJvdykgcmVzdW1lZC5wdXNoKHJvdyk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBza2lwcGVkOiBmYWxzZSwgcGF1c2VkOiBbXSwgcmVzdW1lZCB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRoZSBmcmVlIHByZXZpZXcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIENsYWltIHRoZSBvcmcncyBPTkUgZnJlZSBwcmV2aWV3LCBvciByZXBvcnQgdGhhdCBpdCBpcyBhbHJlYWR5IHNwZW50LlxuICAgKlxuICAgKiBBIENPTkRJVElPTkFMIGluc2VydC1vci11cGRhdGUsIG5vdCByZWFkLXRoZW4td3JpdGU6IHR3byB0YWJzIGNsaWNraW5nIFwic2VlIGEgc2FtcGxlXCJcbiAgICogYXQgdGhlIHNhbWUgbW9tZW50IG11c3QgcHJvZHVjZSBvbmUgcHJldmlldywgYW5kIGEgY2hlY2sgZm9sbG93ZWQgYnkgYSBzZXBhcmF0ZSB3cml0ZVxuICAgKiBoYXMgYSB3aW5kb3cgYmV0d2VlbiB0aGVtIHdpZGUgZW5vdWdoIGZvciBib3RoIHRvIHBhc3MuIGBXSEVSRSByZXBvcnRfcHJldmlld191c2VkX2F0XG4gICAqIElTIE5VTExgIG9uIHRoZSB1cGRhdGUsIGFuZCBgb25Db25mbGljdERvVXBkYXRlYCBmb3IgdGhlIHJvdyB0aGF0IG1heSBub3QgZXhpc3QgeWV0LFxuICAgKiBtYWtlIHRoZSBjbGFpbSBpdHNlbGYgdGhlIGd1YXJkLlxuICAgKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgVEhJUyBjYWxsZXIgd29uIGl0LiBBIGxvc2VyIGlzIHRvbGQgdGhlIHByZXZpZXcgaXMgc3BlbnQsIHdoaWNoIGlzXG4gICAqIHRoZSB0cnV0aCBhbmQgaXMgYWxzbyB0aGUgdXBzZWxsLlxuICAgKi9cbiAgYXN5bmMgY2xhaW1SZXBvcnRQcmV2aWV3KG9yZ0lkOiBzdHJpbmcsIG5vdyA9IG5ldyBEYXRlKCkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5kb3JhU2V0dGluZ3MpXG4gICAgICAudmFsdWVzKHsgb3JnSWQsIHJlcG9ydFByZXZpZXdVc2VkQXQ6IG5vdyB9KVxuICAgICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCxcbiAgICAgICAgc2V0OiB7IHJlcG9ydFByZXZpZXdVc2VkQXQ6IG5vdywgdXBkYXRlZEF0OiBub3cgfSxcbiAgICAgICAgLy8gVGhlIHByZWRpY2F0ZSBpcyB3aGF0IG1ha2VzIHRoaXMgb25jZS1ldmVyOiBhbiBvcmcgd2hvc2Ugcm93IGFscmVhZHkgY2FycmllcyBhXG4gICAgICAgIC8vIHRpbWVzdGFtcCB1cGRhdGVzIHplcm8gcm93cyBhbmQgcmV0dXJucyBub3RoaW5nLlxuICAgICAgICBzZXRXaGVyZTogaXNOdWxsKHNjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0UHJldmlld1VzZWRBdCksXG4gICAgICB9KVxuICAgICAgLnJldHVybmluZyh7IG9yZ0lkOiBzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkIH0pKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgdW5rbm93bltdKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIG9yZyBoYXMgYWxyZWFkeSBzcGVudCBpdHMgZnJlZSBwcmV2aWV3LiAqL1xuICBhc3luYyByZXBvcnRQcmV2aWV3VXNlZChvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCh7IGF0OiBzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydFByZXZpZXdVc2VkQXQgfSlcbiAgICAgIC5mcm9tKHNjaGVtYS5kb3JhU2V0dGluZ3MpXG4gICAgICAud2hlcmUoZXEoc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCwgb3JnSWQpKVxuICAgICAgLmxpbWl0KDEpKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgQXJyYXk8eyBhdDogRGF0ZSB8IG51bGwgfT4pWzBdPy5hdCAhPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElzIGBlbWFpbGAgYWRtaXNzaWJsZSBhcyBhIHJlY2lwaWVudCBmb3IgdGhpcyBvcmcsIGFuZCBkb2VzIGl0IG5lZWQgYW5cbiAgICogYWRtaW4ncyBhcHByb3ZhbCBmaXJzdD9cbiAgICpcbiAgICogYG9yZ01lbWJlckVtYWlsc2AgaXMgdGhlIHNldCBvZiBhZGRyZXNzZXMgdGhhdCBhbHJlYWR5IGF1dGhlbnRpY2F0ZSB0byB0aGlzXG4gICAqIG9yZyDigJQgdGhleSBhcmUgYWx3YXlzIGFkbWlzc2libGUgYW5kIG5ldmVyIG5lZWQgdmVyaWZpY2F0aW9uLCBiZWNhdXNlIHRoZSBvcmdcbiAgICogaGFzIGFscmVhZHkgZXN0YWJsaXNoZWQgdGhleSBiZWxvbmcgdG8gaXQuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBtZWFzdXJlZCBhZ2FpbnN0XG4gICAqIHRoZSBhbGxvd2VkLWRvbWFpbiBsaXN0LCBhbmQgYSBOVUxMIGxpc3QgbWVhbnMgXCJubyBleHRlcm5hbCBhZGRyZXNzZXMgYXQgYWxsXCIsXG4gICAqIG5vdCBcImFueSBhZGRyZXNzXCI6IHRoZSBjbG9zZWQgcmVhZGluZyBpcyB0aGUgb25lIHRoYXQgY2Fubm90IGxlYWsgYSByZXBvcnQgYnlcbiAgICogYW4gYWRtaW4gZm9yZ2V0dGluZyB0byBjb25maWd1cmUgc29tZXRoaW5nLlxuICAgKi9cbiAgYWRtaXRSZWNpcGllbnQoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBwb2xpY3k6IHsgcmVjaXBpZW50RG9tYWluczogc3RyaW5nW10gfCBudWxsOyByZXF1aXJlQXBwcm92YWw6IGJvb2xlYW4gfSxcbiAgICBvcmdNZW1iZXJFbWFpbHM6IFJlYWRvbmx5U2V0PHN0cmluZz4sXG4gICk6IHsgYWRtaXR0ZWQ6IHRydWU7IG1lbWJlcjogYm9vbGVhbjsgbmVlZHNBcHByb3ZhbDogYm9vbGVhbiB9IHwgeyBhZG1pdHRlZDogZmFsc2U7IHJlYXNvbjogc3RyaW5nIH0ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBlbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAob3JnTWVtYmVyRW1haWxzLmhhcyhub3JtYWxpemVkKSkgcmV0dXJuIHsgYWRtaXR0ZWQ6IHRydWUsIG1lbWJlcjogdHJ1ZSwgbmVlZHNBcHByb3ZhbDogZmFsc2UgfTtcblxuICAgIGNvbnN0IGF0ID0gbm9ybWFsaXplZC5sYXN0SW5kZXhPZignQCcpO1xuICAgIGNvbnN0IGRvbWFpbiA9IGF0ID49IDAgPyBub3JtYWxpemVkLnNsaWNlKGF0ICsgMSkgOiAnJztcbiAgICBpZiAoIWRvbWFpbikgcmV0dXJuIHsgYWRtaXR0ZWQ6IGZhbHNlLCByZWFzb246ICdOb3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLicgfTtcblxuICAgIGNvbnN0IGFsbG93ZWQgPSBwb2xpY3kucmVjaXBpZW50RG9tYWlucztcbiAgICBpZiAoIWFsbG93ZWQgfHwgYWxsb3dlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkbWl0dGVkOiBmYWxzZSxcbiAgICAgICAgcmVhc29uOiAnVGhpcyBvcmdhbml6YXRpb24gb25seSBkZWxpdmVycyByZXBvcnRzIHRvIGl0cyBvd24gbWVtYmVycy4gJ1xuICAgICAgICAgICsgJ0FuIGFkbWluaXN0cmF0b3IgY2FuIGFsbG93IHNwZWNpZmljIGV4dGVybmFsIGRvbWFpbnMgaW4gcmVwb3J0aW5nIHNldHRpbmdzLicsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBvayA9IGFsbG93ZWQuc29tZSgoZCkgPT4ge1xuICAgICAgY29uc3QgY2xlYW4gPSBkLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15ALywgJycpO1xuICAgICAgcmV0dXJuIGNsZWFuLmxlbmd0aCA+IDAgJiYgKGRvbWFpbiA9PT0gY2xlYW4gfHwgZG9tYWluLmVuZHNXaXRoKGAuJHtjbGVhbn1gKSk7XG4gICAgfSk7XG4gICAgaWYgKCFvaykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRtaXR0ZWQ6IGZhbHNlLFxuICAgICAgICByZWFzb246IGBSZXBvcnRzIGNhbiBvbmx5IGJlIHNlbnQgdG8gJHthbGxvd2VkLmpvaW4oJywgJyl9IGFkZHJlc3NlcyBpbiB0aGlzIG9yZ2FuaXphdGlvbi5gLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYWRtaXR0ZWQ6IHRydWUsIG1lbWJlcjogZmFsc2UsIG5lZWRzQXBwcm92YWw6IHBvbGljeS5yZXF1aXJlQXBwcm92YWwgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZXRlbnRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEhhcmQtZGVsZXRlIGV4cGlyZWQgdG9tYnN0b25lcyBhY3Jvc3MgZXZlcnkgb3JnLCBmb3IgdGhlIHNoYXJlZCBzb2Z0LWRlbGV0ZVxuICAgKiBzd2VlcC4gUnVucyBpbnNpZGUgdGhlIHN3ZWVwJ3Mgb3duIHN5c2FkbWluIHNjb3BlLlxuICAgKlxuICAgKiBSdW5zIGdvIGZpcnN0OiBhIHB1cmdlZCBkZWZpbml0aW9uIHdpdGggb3JwaGFuZWQgcnVucyB3b3VsZCBsZWF2ZSBzbmFwc2hvdHNcbiAgICogbm90aGluZyBjYW4gcmVhY2gsIGFuZCBzaGFyZSBsaW5rcyBhcmUgZGVsZXRlZCB3aXRoIHRoZWlyIHJ1bnMgc28gYSBwdXJnZVxuICAgKiBjYW5ub3QgbGVhdmUgYSBsaXZlIHRva2VuIHBvaW50aW5nIGF0IGEgcm93IHRoYXQgbm8gbG9uZ2VyIGV4aXN0cy5cbiAgICovXG4gIHB1cmdlYWJsZUVudGl0aWVzKCk6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBwdXJnZUV4cGlyZWQobm93OiBEYXRlLCBsaW1pdD86IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgbmFtZTogJ3JlcG9ydF9ydW4nLCBwdXJnZUV4cGlyZWQ6IChub3csIGxpbWl0KSA9PiB0aGlzLnB1cmdlUnVucyhub3csIGxpbWl0KSB9LFxuICAgICAgeyBuYW1lOiAncmVwb3J0X2RlZmluaXRpb24nLCBwdXJnZUV4cGlyZWQ6IChub3csIGxpbWl0KSA9PiB0aGlzLnB1cmdlRGVmaW5pdGlvbnMobm93LCBsaW1pdCkgfSxcbiAgICAgIHsgbmFtZTogJ3JlcG9ydF9yZWNpcGllbnQnLCBwdXJnZUV4cGlyZWQ6IChub3csIGxpbWl0KSA9PiB0aGlzLnB1cmdlUmVjaXBpZW50cyhub3csIGxpbWl0KSB9LFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1cmdlUnVucyhub3c6IERhdGUsIGxpbWl0ID0gNTAwKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3QgZHVlID0gYXdhaXQgdHguc2VsZWN0KHsgaWQ6IHNjaGVtYS5yZXBvcnRSdW4uaWQgfSkuZnJvbShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgICAud2hlcmUoYW5kKHNxbGAke3NjaGVtYS5yZXBvcnRSdW4uZGVsZXRlZEF0fSBJUyBOT1QgTlVMTGAsIGx0ZShzY2hlbWEucmVwb3J0UnVuLnB1cmdlQWZ0ZXIsIG5vdykpKVxuICAgICAgICAubGltaXQobGltaXQpO1xuICAgICAgY29uc3QgaWRzID0gKGR1ZSBhcyBBcnJheTx7IGlkOiBzdHJpbmcgfT4pLm1hcCgocikgPT4gci5pZCk7XG4gICAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgICBhd2FpdCB0eC5kZWxldGUoc2NoZW1hLnJlcG9ydFNoYXJlTGluaykud2hlcmUoaW5BcnJheShzY2hlbWEucmVwb3J0U2hhcmVMaW5rLnJ1bklkLCBpZHMpKTtcbiAgICAgIGNvbnN0IGdvbmUgPSBhd2FpdCB0eC5kZWxldGUoc2NoZW1hLnJlcG9ydFJ1bikud2hlcmUoaW5BcnJheShzY2hlbWEucmVwb3J0UnVuLmlkLCBpZHMpKVxuICAgICAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5yZXBvcnRSdW4uaWQgfSk7XG4gICAgICByZXR1cm4gKGdvbmUgYXMgdW5rbm93bltdKS5sZW5ndGg7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1cmdlRGVmaW5pdGlvbnMobm93OiBEYXRlLCBsaW1pdCA9IDUwMCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgIGNvbnN0IGR1ZSA9IGF3YWl0IHR4LnNlbGVjdCh7IGlkOiBzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCB9KS5mcm9tKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIHNxbGAke3NjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdH0gSVMgTk9UIE5VTExgLFxuICAgICAgICAgIGx0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5wdXJnZUFmdGVyLCBub3cpLFxuICAgICAgICApKVxuICAgICAgICAubGltaXQobGltaXQpO1xuICAgICAgY29uc3QgaWRzID0gKGR1ZSBhcyBBcnJheTx7IGlkOiBzdHJpbmcgfT4pLm1hcCgocikgPT4gci5pZCk7XG4gICAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgICAvLyBUaGUgZGVmaW5pdGlvbidzIHJ1bnMgKGFuZCB0aGVpciBsaW5rcykgZ28gd2l0aCBpdCwgdG9tYnN0b25lZCBvciBub3Q6XG4gICAgICAvLyBhIHNuYXBzaG90IHdob3NlIGRlZmluaXRpb24gaXMgZ29uZSBjYW4gbmV2ZXIgYmUgbGlzdGVkIGFnYWluLlxuICAgICAgY29uc3QgcnVucyA9IGF3YWl0IHR4LnNlbGVjdCh7IGlkOiBzY2hlbWEucmVwb3J0UnVuLmlkIH0pLmZyb20oc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgICAgLndoZXJlKGluQXJyYXkoc2NoZW1hLnJlcG9ydFJ1bi5kZWZpbml0aW9uSWQsIGlkcykpO1xuICAgICAgY29uc3QgcnVuSWRzID0gKHJ1bnMgYXMgQXJyYXk8eyBpZDogc3RyaW5nIH0+KS5tYXAoKHIpID0+IHIuaWQpO1xuICAgICAgaWYgKHJ1bklkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHR4LmRlbGV0ZShzY2hlbWEucmVwb3J0U2hhcmVMaW5rKS53aGVyZShpbkFycmF5KHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsucnVuSWQsIHJ1bklkcykpO1xuICAgICAgICBhd2FpdCB0eC5kZWxldGUoc2NoZW1hLnJlcG9ydFJ1bikud2hlcmUoaW5BcnJheShzY2hlbWEucmVwb3J0UnVuLmlkLCBydW5JZHMpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGdvbmUgPSBhd2FpdCB0eC5kZWxldGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pLndoZXJlKGluQXJyYXkoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkcykpXG4gICAgICAgIC5yZXR1cm5pbmcoeyBpZDogc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQgfSk7XG4gICAgICByZXR1cm4gKGdvbmUgYXMgdW5rbm93bltdKS5sZW5ndGg7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1cmdlUmVjaXBpZW50cyhub3c6IERhdGUsIGxpbWl0ID0gNTAwKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3QgZHVlID0gYXdhaXQgdHguc2VsZWN0KHsgaWQ6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuaWQgfSkuZnJvbShzY2hlbWEucmVwb3J0UmVjaXBpZW50KVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIHNxbGAke3NjaGVtYS5yZXBvcnRSZWNpcGllbnQuZGVsZXRlZEF0fSBJUyBOT1QgTlVMTGAsXG4gICAgICAgICAgbHRlKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQucHVyZ2VBZnRlciwgbm93KSxcbiAgICAgICAgKSlcbiAgICAgICAgLmxpbWl0KGxpbWl0KTtcbiAgICAgIGNvbnN0IGlkcyA9IChkdWUgYXMgQXJyYXk8eyBpZDogc3RyaW5nIH0+KS5tYXAoKHIpID0+IHIuaWQpO1xuICAgICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgICAgY29uc3QgZ29uZSA9IGF3YWl0IHR4LmRlbGV0ZShzY2hlbWEucmVwb3J0UmVjaXBpZW50KS53aGVyZShpbkFycmF5KHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuaWQsIGlkcykpXG4gICAgICAgIC5yZXR1cm5pbmcoeyBpZDogc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5pZCB9KTtcbiAgICAgIHJldHVybiAoZ29uZSBhcyB1bmtub3duW10pLmxlbmd0aDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBFdmVyeSBkZWZpbml0aW9uIHRoZSBvd25lciBtdXN0IGJlIHJlLWNoZWNrZWQgZm9yLCBmb3IgdGhlIHBhdXNlIHN3ZWVwLiAqL1xuICBhc3luYyBsaXN0T3duZWREZWZpbml0aW9ucyhvcmdJZDogc3RyaW5nLCBvd25lcklkOiBzdHJpbmcpOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb25bXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3duZXJJZCwgb3duZXJJZCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgKSkpO1xuICAgIHJldHVybiByb3dzIGFzIFJlcG9ydERlZmluaXRpb25bXTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUaGUgc2NoZWR1bGVyJ3MgcmVhZHMgYW5kIHdyaXRlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogRGVmaW5pdGlvbnMgd2hvc2UgbmV4dCBydW4gaXMgZHVlLCBhY3Jvc3MgZXZlcnkgb3JnLlxuICAgKlxuICAgKiBSdW5zIGFzIFNZU0FETUlOLCBiZWNhdXNlIHRoZSBzY2hlZHVsZXIgaGFzIG5vIHRlbmFudDogaXQgaXMgbG9va2luZyBmb3Igd29ya1xuICAgKiBpbiBvcmdzIGl0IGhhcyBub3QgYmVlbiB0b2xkIGFib3V0LiBUaGlzIGlzIHRoZSBvbmUgcmVhZCBoZXJlIHRoYXQgY3Jvc3NlcyBvcmdcbiAgICogYm91bmRhcmllcywgYW5kIGl0IGlzIGtlcHQgdG8gdGhlIG5hcnJvd2VzdCBwb3NzaWJsZSBzaGFwZSDigJQgdGhlIHJvd3MgbmVlZGVkIHRvXG4gICAqIGNsYWltIGFuZCBleGVjdXRlLCBvcmRlcmVkIG9sZGVzdC1kdWUgZmlyc3Qgc28gYSBiYWNrbG9nIGRyYWlucyBpbiBvcmRlciByYXRoZXJcbiAgICogdGhhbiBzdGFydmluZyB3aGljaGV2ZXIgb3JnIHNvcnRzIGxhc3QgYnkgaWQuXG4gICAqXG4gICAqIGBsaW1pdGAgaXMgdGhlIHBlci1jeWNsZSBjZWlsaW5nOiBhIGN5Y2xlIHRoYXQgdHJpZWQgdG8gZHJhaW4gZXZlcnl0aGluZyB3b3VsZFxuICAgKiBob2xkIHRoZSBsZWFkZXIgbG9jayBmb3IgYXMgbG9uZyBhcyB0aGUgc2xvd2VzdCBvcmcncyBjb21wb3NlIHRha2VzLCB0aW1lcyB0aGVcbiAgICogbnVtYmVyIG9mIGRlZmluaXRpb25zLlxuICAgKi9cbiAgYXN5bmMgZHVlRGVmaW5pdGlvbnMobm93OiBEYXRlLCBsaW1pdDogbnVtYmVyKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uW10+IHtcbiAgICByZXR1cm4gcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAgIC53aGVyZShhbmQoXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaXNBY3RpdmUsIHRydWUpLFxuICAgICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgICAgIGx0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5uZXh0UnVuQXQsIG5vdyksXG4gICAgICAgICkpXG4gICAgICAgIC5vcmRlckJ5KGFzYyhzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5uZXh0UnVuQXQpKVxuICAgICAgICAubGltaXQobGltaXQpKTtcbiAgICAgIHJldHVybiByb3dzIGFzIFJlcG9ydERlZmluaXRpb25bXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGFpbSBhIGR1ZSBkZWZpbml0aW9uIGJ5IGFkdmFuY2luZyBpdHMgYG5leHRSdW5BdGAsIGJ1dCBvbmx5IGlmIGl0IHN0aWxsIGhvbGRzXG4gICAqIHRoZSB2YWx1ZSB0aGUgc2NhbiBzYXcuXG4gICAqXG4gICAqIFRIRSBDT05ESVRJT05BTCBVUERBVEUgSVMgVEhFIENPTkNVUlJFTkNZIEdVQVJELCBub3QgdGhlIGxlYWRlciBsb2NrLiBUaGUgbG9ja1xuICAgKiBzdG9wcyB0d28gcmVwbGljYXMgc3dlZXBpbmcgaW4gdGhlIHNhbWUgd2luZG93OyBpdCBkb2VzIG5vdCBzdG9wIGEgc3dlZXAgdGhhdFxuICAgKiBvdXRsaXZlcyBpdHMgbG9jayBUVEwgZnJvbSBvdmVybGFwcGluZyB0aGUgbmV4dCBsZWFkZXIncyBzd2VlcCwgYW5kIGJvdGggd291bGRcbiAgICogdGhlbiBzZWxlY3QgdGhlIHNhbWUgc3RpbGwtZHVlIGRlZmluaXRpb24uIFdpdGhvdXQgdGhlIGBuZXh0X3J1bl9hdCA9IDxzZWVuPmBcbiAgICogcHJlZGljYXRlIGVhY2ggd291bGQgYWR2YW5jZSB0aGUgc2NoZWR1bGUgYW5kIGVhY2ggd291bGQgY29tcG9zZSBhbmQgREVMSVZFUiBhXG4gICAqIHJlcG9ydCDigJQgdGhlIHNhbWUgbWFuYWdlciBnZXRzIHRoZSBzYW1lIHJlcG9ydCB0d2ljZSwgZnJvbSB0d28gcG9kcywgd2hpY2ggaXNcbiAgICogdGhlIGZhaWx1cmUgZXZlcnlvbmUgbm90aWNlcy5cbiAgICpcbiAgICogUnVucyBhcyBzeXNhZG1pbiBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHRoZSBzY2FuLCBhbmQgcmV0dXJucyB3aGV0aGVyIHRoZSBjbGFpbVxuICAgKiB3b24gc28gdGhlIGNhbGxlciBjYW4gc2ltcGx5IHNraXAgYSBsb3N0IHJhY2UuXG4gICAqL1xuICBhc3luYyBjbGFpbURlZmluaXRpb24oaWQ6IHN0cmluZywgc2Vlbk5leHRSdW5BdDogRGF0ZSwgbmV4dFJ1bkF0OiBEYXRlLCBub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAgIC5zZXQoeyBsYXN0UnVuQXQ6IG5vdywgbmV4dFJ1bkF0LCB1cGRhdGVkQXQ6IG5vdyB9KVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkLCBpZCksXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ubmV4dFJ1bkF0LCBzZWVuTmV4dFJ1bkF0KSxcbiAgICAgICAgKSlcbiAgICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCB9KSk7XG4gICAgICByZXR1cm4gKGNsYWltZWQgYXMgdW5rbm93bltdKS5sZW5ndGggPiAwO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCAob3IgY2xlYXIpIGEgZGVmaW5pdGlvbidzIGBuZXh0UnVuQXRgIHdpdGhvdXQgY2xhaW1pbmcgaXQuXG4gICAqXG4gICAqIFVzZWQgd2hlbiBhIGRlZmluaXRpb24gaXMgY3JlYXRlZCwgcmVzdW1lZCwgb3IgaGFzIGl0cyBjYWRlbmNlL3RpbWV6b25lIGNoYW5nZWRcbiAgICog4oCUIHRoZSBzY2hlZHVsZSBoYXMgdG8gYmUgcmUtZGVyaXZlZCBmcm9tIHRoZSBjYWxlbmRhciByYXRoZXIgdGhhbiBsZWZ0IGF0XG4gICAqIHdoYXRldmVyIHRoZSBvbGQgY2FkZW5jZSBwcm9kdWNlZC5cbiAgICovXG4gIGFzeW5jIHNldE5leHRSdW4ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgbmV4dFJ1bkF0OiBEYXRlIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbilcbiAgICAgIC5zZXQoeyBuZXh0UnVuQXQsIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICApKSk7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgT05FIGRlZmluaXRpb24gd2l0aCB0aGUgcmVhc29uLCBmcm9tIHRoZSBzY2hlZHVsZXIuXG4gICAqXG4gICAqIFNlcGFyYXRlIGZyb20ge0BsaW5rIHBhdXNlRGVmaW5pdGlvbnNGb3JPd25lcn0gYmVjYXVzZSB0aGUgdHJpZ2dlciBpcyBkaWZmZXJlbnQ6XG4gICAqIHRoYXQgb25lIGlzIGEgbWVtYmVyc2hpcCBjaGFuZ2UgYWZmZWN0aW5nIGV2ZXJ5IGRlZmluaXRpb24gYSBwZXJzb24gb3ducywgdGhpc1xuICAgKiBvbmUgaXMgYSBwZXItcnVuIHJlY2hlY2sgdGhhdCBmYWlsZWQuIENsZWFycyBgbmV4dFJ1bkF0YCBzbyBhIHBhdXNlZCBkZWZpbml0aW9uXG4gICAqIHN0b3BzIGFwcGVhcmluZyBpbiB0aGUgZHVlIHNjYW4gYXQgYWxsLCByYXRoZXIgdGhhbiBiZWluZyByZS1jbGFpbWVkIGFuZFxuICAgKiByZS1yZWplY3RlZCBldmVyeSBjeWNsZS5cbiAgICpcbiAgICogUnVucyBhcyBzeXNhZG1pbjogdGhlIGNhbGxlciBpcyB0aGUgc2NoZWR1bGVyLCB3aGljaCBoYXMgbm8gdGVuYW50LCBhbmQgdGhlIGlkXG4gICAqIGNhbWUgZnJvbSBpdHMgb3duIGNyb3NzLW9yZyBzY2FuLlxuICAgKi9cbiAgYXN5bmMgcGF1c2VEZWZpbml0aW9uKGlkOiBzdHJpbmcsIHJlYXNvbjogUmVwb3J0UGF1c2VSZWFzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAgIC5zZXQoeyBpc0FjdGl2ZTogZmFsc2UsIHBhdXNlZFJlYXNvbjogcmVhc29uLCBuZXh0UnVuQXQ6IG51bGwsIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9KVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkLCBpZCksXG4gICAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICAgICkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWUgYSBwYXVzZWQgZGVmaW5pdGlvbiwgY2xlYXJpbmcgdGhlIHJlYXNvbiBhbmQgcmUtZGVyaXZpbmcgaXRzIHNjaGVkdWxlLlxuICAgKlxuICAgKiBgbmV4dFJ1bkF0YCBpcyBzdXBwbGllZCBieSB0aGUgY2FsbGVyIHJhdGhlciB0aGFuIGNvbXB1dGVkIGhlcmU6IHRoZSBwZXJpb2RcbiAgICogYXJpdGhtZXRpYyBuZWVkcyB0aGUgZGVmaW5pdGlvbidzIHRpbWV6b25lIGFuZCB3ZWVrIHN0YXJ0LCBhbmQgdGhhdCBiZWxvbmdzIHdpdGhcbiAgICogdGhlIHBlcmlvZCByZXNvbHZlciwgbm90IHRoZSBzdG9yZS5cbiAgICovXG4gIGFzeW5jIHJlc3VtZURlZmluaXRpb24ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgbmV4dFJ1bkF0OiBEYXRlLCBhY3RvcklkOiBzdHJpbmcpOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb24+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLnNldCh7IGlzQWN0aXZlOiB0cnVlLCBwYXVzZWRSZWFzb246IG51bGwsIG5leHRSdW5BdCwgdXBkYXRlZEJ5OiBhY3RvcklkLCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkLCBpZCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgY29uc3Qgcm93ID0gKHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdKVswXTtcbiAgICBpZiAoIXJvdykgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ1JlcG9ydCBkZWZpbml0aW9uIG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiByb3c7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgZXZlcnkgQUNUSVZFIGRlZmluaXRpb24gaW4gYW4gb3JnLCB3aXRoIHRoZSByZWFzb24uXG4gICAqXG4gICAqIFRoZSBlbnRpdGxlbWVudCBsYXBzZSBsZWc6IGJpbGxpbmcgdGVsbHMgcmVwb3J0aW5nIHRoZSBhZGQtb24gaXMgZ29uZSwgYW5kIGV2ZXJ5XG4gICAqIGRlZmluaXRpb24gaW4gdGhlIGFjY291bnQgc3RvcHMuIFJldHVybnMgdGhlIHJvd3Mgc28gdGhlIGNhbGxlciBjYW4gbm90aWZ5LlxuICAgKi9cbiAgYXN5bmMgcGF1c2VEZWZpbml0aW9uc0Zvck9yZyhvcmdJZDogc3RyaW5nLCByZWFzb246IFJlcG9ydFBhdXNlUmVhc29uKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLnNldCh7IGlzQWN0aXZlOiBmYWxzZSwgcGF1c2VkUmVhc29uOiByZWFzb24sIG5leHRSdW5BdDogbnVsbCwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgcmV0dXJuIHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IGRlZmluaXRpb24gaW4gYW4gb3JnIHBhdXNlZCBmb3IgYHJlYXNvbmAsIGZvciB0aGUgcmVzdW1lIGxlZy5cbiAgICpcbiAgICogU2NvcGVkIHRvIHRoZSByZWFzb24gb24gcHVycG9zZTogcmUtc3Vic2NyaWJpbmcgbXVzdCBub3QgdW4tcGF1c2UgYSBkZWZpbml0aW9uXG4gICAqIHdob3NlIG93bmVyIHdhcyBkZWFjdGl2YXRlZC4gVGhvc2UgYXJlIGRpZmZlcmVudCBwcm9ibGVtcyB3aXRoIGRpZmZlcmVudCBmaXhlcyxcbiAgICogYW5kIHJlc3VtaW5nIG9uZSBieSBmaXhpbmcgdGhlIG90aGVyIGlzIGhvdyBhIHJlcG9ydCBzdGFydHMgcnVubmluZyB1bmRlciBhXG4gICAqIHBlcnNvbiB3aG8gbGVmdC5cbiAgICovXG4gIGFzeW5jIGRlZmluaXRpb25zUGF1c2VkRm9yKG9yZ0lkOiBzdHJpbmcsIHJlYXNvbjogUmVwb3J0UGF1c2VSZWFzb24pOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb25bXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaXNBY3RpdmUsIGZhbHNlKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ucGF1c2VkUmVhc29uLCByZWFzb24pLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0KSxcbiAgICAgICkpKTtcbiAgICByZXR1cm4gcm93cyBhcyBSZXBvcnREZWZpbml0aW9uW107XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHN0YWtlaG9sZGVyUmVwb3J0U3RvcmUgPSBuZXcgU3Rha2Vob2xkZXJSZXBvcnRTdG9yZSgpO1xuIl19
|
|
992
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL3JlcG9ydGluZy9zdGFrZWhvbGRlci9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQVk3RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFlOUQsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBQzlDLDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFDM0MscUZBQXFGO0FBQ3JGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDM0Q7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFFN0IseUVBQXlFO0FBQ3pFLE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYTtJQUNyQyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxN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TyxJQUEwQixDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEtBQWEsRUFBRSxNQUF5QjtRQUNqRSxNQUFNLElBQUksR0FBRyxNQUFNLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7YUFDOUUsS0FBSyxDQUFDLEdBQUcsQ0FDUixFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFDeEMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQzNDLEVBQUUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNOLE9BQU8sSUFBMEIsQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBQZXJzaXN0ZW5jZSBmb3Igc3Rha2Vob2xkZXIgcmVwb3J0czogZGVmaW5pdGlvbnMsIHJ1bnMsIHNoYXJlIGxpbmtzIGFuZFxuICogcmVjaXBpZW50cy5cbiAqXG4gKiBIYW5kLXJvbGxlZCByYXRoZXIgdGhhbiBmb3VyIGBDcnVkU2VydmljZWAgc3ViY2xhc3NlcyBiZWNhdXNlIG5vbmUgb2YgdGhlc2UgaXNcbiAqIGEgZ2VuZXJpYyBsaXN0YWJsZSBlbnRpdHkgd2l0aCBhbiBgaXNEZWZhdWx0YCBzbG90IGFuZCBwcm9qZWN0LXNjb3BlZCBhY2Nlc3NcbiAqIGNvbnRyb2wuIFdoYXQgdGhleSBuZWVkIGluc3RlYWQgaXMgYSBzbWFsbCBudW1iZXIgb2YgZXhhY3Qgb3BlcmF0aW9ucyB3aXRoXG4gKiBpbnZhcmlhbnRzIHRoZSBnZW5lcmljIGJhc2UgY2Fubm90IGV4cHJlc3M6XG4gKlxuICogIC0gQSBSVU4gSVMgQVBQRU5ELU9OTFkgb25jZSBwdWJsaXNoZWQuIFJlZ2VuZXJhdGluZyBhIHBlcmlvZCBpbnNlcnRzIHZlcnNpb25cbiAqICAgIE4rMSBhbmQgcG9pbnRzIHRoZSBvbGQgcm93IGF0IGl0IChgc3VwZXJzZWRlZEJ5YCk7IG5vdGhpbmcgb3ZlcndyaXRlcyBhXG4gKiAgICBzbmFwc2hvdCBhIG1hbmFnZXIgaGFzIGFscmVhZHkgcmVhZC5cbiAqICAtIEEgU0hBUkUgTElOSyBJUyBSRVNPTFZFRCBXSVRIT1VUIEEgVEVOQU5ULiBUaGUgcmVhZGVyIGhhcyBubyBhY2NvdW50LCBzbyB0aGVcbiAqICAgIGxvb2t1cCBieSB0b2tlbiBoYXNoIGlzIHRoZSBvbmUgcmVhZCBoZXJlIHRoYXQgZGVsaWJlcmF0ZWx5IHJ1bnMgYXMgc3lzYWRtaW5cbiAqICAgIOKAlCBzZWUge0BsaW5rIHJlc29sdmVTaGFyZUxpbmt9IGZvciB3aHkgdGhhdCBpcyB0aGUgbmFycm93ZXN0IHNhZmUgc2hhcGUuXG4gKiAgLSBBIFJFQ0lQSUVOVCBJUyBVUFNFUlRFRCwgTkVWRVIgUkUtQ1JFQVRFRC4gUmUtYWRkaW5nIGFuIGFkZHJlc3MgbXVzdCBrZWVwIGl0c1xuICogICAgdmVyaWZpY2F0aW9uIGFuZCB1bnN1YnNjcmliZSBzdGF0ZSwgb3IgYW4gdW5zdWJzY3JpYmUgY291bGQgYmUgdW5kb25lIGJ5XG4gKiAgICBkZWxldGluZyBhbmQgcmUtYWRkaW5nIHRoZSByb3cuXG4gKlxuICogRXZlcnl0aGluZyBlbHNlIHJ1bnMgaW5zaWRlIHRoZSBjYWxsZXIncyBhbWJpZW50IHRlbmFudCBjb250ZXh0IChlc3RhYmxpc2hlZCBieVxuICogYHdpdGhUZW5hbnRDb250ZXh0KClgIGF0IHRoZSByZXF1ZXN0IGJvdW5kYXJ5KSwgc28gUkxTIGlzIHRoZSB0ZW5hbmN5IGdhdGUgYW5kXG4gKiBhbiBgb3JnSWRgIGFyZ3VtZW50IGlzIGEgcmVkdW5kYW50IHNlY29uZCBjaGVjayByYXRoZXIgdGhhbiB0aGUgb25seSBvbmUuXG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tVVVJRCwgY3JlYXRlSGFzaCwgcmFuZG9tQnl0ZXMgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBOb3RGb3VuZEVycm9yLCBDb25mbGljdEVycm9yLCBFcnJvckNvZGUgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBhbmQsIGFzYywgZGVzYywgZXEsIGluQXJyYXksIGlzTnVsbCwgbHRlLCBzcWwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuLi8uLi8uLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJlcG9ydENhZGVuY2UsXG4gIFJlcG9ydERlZmluaXRpb24sXG4gIFJlcG9ydFBhdXNlUmVhc29uLFxuICBSZXBvcnRSZWNpcGllbnQsXG4gIFJlcG9ydFJ1bixcbiAgUmVwb3J0UnVuU3RhdHVzLFxuICBSZXBvcnRTY29wZSxcbiAgUmVwb3J0U2hhcmVMaW5rLFxuICBSZXBvcnRUZW1wbGF0ZSxcbn0gZnJvbSAnLi4vLi4vLi4vZGF0YWJhc2Uvc2NoZW1hL3JlcG9ydGluZy1zdGFrZWhvbGRlci5qcyc7XG5pbXBvcnQgeyBydW5XaXRoVGVuYW50Q29udGV4dCwgd2l0aFRlbmFudFR4IH0gZnJvbSAnLi4vLi4vLi4vZGF0YWJhc2UvdGVuYW5jeS5qcyc7XG5pbXBvcnQgeyBzb2Z0RGVsZXRlUmV0ZW50aW9uTXMgfSBmcm9tICcuLi8uLi9jcnVkLXNlcnZpY2UuanMnO1xuXG4vKiogSG93IGxvbmcgYSBmcmVzaGx5IG1pbnRlZCBzaGFyZSBsaW5rIGxpdmVzIHdoZW4gdGhlIGNhbGxlciBuYW1lcyBubyB3aW5kb3cuICovXG5cbi8qKlxuICogV2hhdCBhbiB1bnN1YnNjcmliZSBjbGljayBkaWQuIGByZWNpcGllbnRgIGlzIHJldHVybmVkIHRvIHRoZSBST1VURSAoZm9yIGl0c1xuICogYXVkaXQgcm93KSwgbmV2ZXIgdG8gdGhlIGNsaWNrZXIsIHdobyBpcyB0b2xkIFwidW5zdWJzY3JpYmVkXCIgZWl0aGVyIHdheS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbnN1YnNjcmliZVJlc3VsdCB7XG4gIG1hdGNoZWQ6IGJvb2xlYW47XG4gIHJlY2lwaWVudD86IHsgaWQ6IHN0cmluZzsgb3JnSWQ6IHN0cmluZzsgZW1haWw6IHN0cmluZyB9O1xuICAvKiogVHJ1ZSBvbmx5IGZvciB0aGUgY2xpY2sgdGhhdCBhY3R1YWxseSBzZXQgYHVuc3Vic2NyaWJlZF9hdGAuICovXG4gIG5ld2x5VW5zdWJzY3JpYmVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0hBUkVfTElOS19UVExfREFZUyA9IDMwO1xuLyoqIFRoZSBsb25nZXN0IGEgc2hhcmUgbGluayBtYXkgbGl2ZS4gQmV5b25kIHRoaXMgaXQgaXMgYSBwZXJtYW5lbnQgVVJMLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9TSEFSRV9MSU5LX1RUTF9EQVlTID0gMTgwO1xuLyoqIEEgcmVjaXBpZW50J3MgdmVyaWZpY2F0aW9uIGxpbmsuIFNob3J0OiBpdCBpcyBjbGlja2VkIHdpdGhpbiBtaW51dGVzIG9yIG5ldmVyLiAqL1xuZXhwb3J0IGNvbnN0IFZFUklGSUNBVElPTl9UVExfTVMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcbi8qKlxuICogQm91bmNlcyBiZWZvcmUgYW4gYWRkcmVzcyBpcyB0cmVhdGVkIGFzIHVuZGVsaXZlcmFibGUgYW5kIHNraXBwZWQuIFRocmVlLCBub3RcbiAqIG9uZTogYSBzaW5nbGUgYm91bmNlIGlzIG9mdGVuIGFuIG91dC1vZi1vZmZpY2UgYXV0b3Jlc3BvbmRlciBvciBhIGZ1bGwgbWFpbGJveCxcbiAqIGFuZCBkcm9wcGluZyBhIG1hbmFnZXIgb2ZmIHRoZSBsaXN0IGZvciBvbmUgb2YgdGhvc2UgaXMgYSBzaWxlbnQgZmFpbHVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9CT1VOQ0VTID0gMztcblxuLyoqIFNIQS0yNTYgaGV4IG9mIGEgdG9rZW4uIFRoZSBvbmx5IGZvcm0gYW55IHRva2VuIGlzIGV2ZXIgc3RvcmVkIGluLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hUb2tlbih0b2tlbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZSh0b2tlbiwgJ3V0ZjgnKS5kaWdlc3QoJ2hleCcpO1xufVxuXG4vKiogQSBmcmVzaCBVUkwtc2FmZSB0b2tlbiwgYW5kIGl0cyBoYXNoLiBUaGUgcmF3IHZhbHVlIGlzIHJldHVybmVkIGV4YWN0bHkgb25jZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaW50VG9rZW4oKTogeyB0b2tlbjogc3RyaW5nOyB0b2tlbkhhc2g6IHN0cmluZyB9IHtcbiAgY29uc3QgdG9rZW4gPSByYW5kb21CeXRlcygzMikudG9TdHJpbmcoJ2Jhc2U2NHVybCcpO1xuICByZXR1cm4geyB0b2tlbiwgdG9rZW5IYXNoOiBoYXNoVG9rZW4odG9rZW4pIH07XG59XG5cbi8qKiBXaGF0IGNyZWF0aW5nIGEgZGVmaW5pdGlvbiBuZWVkcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRGVmaW5pdGlvbklucHV0IHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICB0ZW1wbGF0ZTogUmVwb3J0VGVtcGxhdGU7XG4gIHNlY3Rpb25zOiBzdHJpbmdbXTtcbiAgY2FkZW5jZTogUmVwb3J0Q2FkZW5jZTtcbiAgdGltZXpvbmU6IHN0cmluZztcbiAgd2Vla1N0YXJ0OiAnbW9uZGF5JyB8ICdzdW5kYXknO1xuICBzY29wZTogUmVwb3J0U2NvcGU7XG4gIHJlY2lwaWVudHM6IHN0cmluZ1tdO1xuICBhdXRvU2VuZDogYm9vbGVhbjtcbiAgb3duZXJJZDogc3RyaW5nO1xuICBjcmVhdGVkQnk6IHN0cmluZztcbiAgbmV4dFJ1bkF0PzogRGF0ZSB8IG51bGw7XG59XG5cbi8qKiBUaGUgbXV0YWJsZSBoYWxmIG9mIGEgZGVmaW5pdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRGVmaW5pdGlvbklucHV0IHtcbiAgbmFtZT86IHN0cmluZztcbiAgdGVtcGxhdGU/OiBSZXBvcnRUZW1wbGF0ZTtcbiAgc2VjdGlvbnM/OiBzdHJpbmdbXTtcbiAgY2FkZW5jZT86IFJlcG9ydENhZGVuY2U7XG4gIHRpbWV6b25lPzogc3RyaW5nO1xuICB3ZWVrU3RhcnQ/OiAnbW9uZGF5JyB8ICdzdW5kYXknO1xuICBzY29wZT86IFJlcG9ydFNjb3BlO1xuICByZWNpcGllbnRzPzogc3RyaW5nW107XG4gIGF1dG9TZW5kPzogYm9vbGVhbjtcbiAgaXNBY3RpdmU/OiBib29sZWFuO1xuICBwYXVzZWRSZWFzb24/OiBSZXBvcnRQYXVzZVJlYXNvbiB8IG51bGw7XG4gIG5leHRSdW5BdD86IERhdGUgfCBudWxsO1xufVxuXG4vKiogQSBzaGFyZSBsaW5rIHBsdXMgdGhlIG9uZS10aW1lIHRva2VuLCByZXR1cm5lZCBvbmx5IGZyb20gdGhlIG1pbnQgY2FsbC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWludGVkU2hhcmVMaW5rIHtcbiAgbGluazogUmVwb3J0U2hhcmVMaW5rO1xuICAvKiogU2hvd24gb25jZS4gTmV2ZXIgc3RvcmVkLCBuZXZlciBsb2dnZWQsIG5ldmVyIGluIGEgcmVzcG9uc2UgYWdhaW4uICovXG4gIHRva2VuOiBzdHJpbmc7XG59XG5cbi8qKiBXaGF0IHRoZSBwdWJsaWMgcm91dGUgbmVlZHM6IHRoZSBsaW5rLCBpdHMgcnVuLCBhbmQgdGhlIG93bmluZyBvcmcuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkU2hhcmVMaW5rIHtcbiAgbGluazogUmVwb3J0U2hhcmVMaW5rO1xuICBydW46IFJlcG9ydFJ1bjtcbn1cblxuLyoqIFRoZSBgcHVyZ2VfYWZ0ZXJgIHN0YW1wIGEgc29mdC1kZWxldGUgY2Fycmllcywgb3IgYHt9YCB3aGVuIHB1cmdpbmcgaXMgb2ZmLiAqL1xuZnVuY3Rpb24gcHVyZ2VTdGFtcChub3c6IERhdGUpOiB7IHB1cmdlQWZ0ZXI/OiBEYXRlIH0ge1xuICBjb25zdCBtcyA9IHNvZnREZWxldGVSZXRlbnRpb25NcygpO1xuICByZXR1cm4gbXMgPiAwID8geyBwdXJnZUFmdGVyOiBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgbXMpIH0gOiB7fTtcbn1cblxuZXhwb3J0IGNsYXNzIFN0YWtlaG9sZGVyUmVwb3J0U3RvcmUge1xuICAvLyDilIDilIAgRGVmaW5pdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgY3JlYXRlRGVmaW5pdGlvbihpbnB1dDogQ3JlYXRlRGVmaW5pdGlvbklucHV0KTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uPiB7XG4gICAgY29uc3QgaWQgPSByYW5kb21VVUlEKCk7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbikudmFsdWVzKHtcbiAgICAgIGlkLFxuICAgICAgb3JnSWQ6IGlucHV0Lm9yZ0lkLFxuICAgICAgb3duZXJJZDogaW5wdXQub3duZXJJZCxcbiAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICB0ZW1wbGF0ZTogaW5wdXQudGVtcGxhdGUsXG4gICAgICBzZWN0aW9uczogaW5wdXQuc2VjdGlvbnMsXG4gICAgICBjYWRlbmNlOiBpbnB1dC5jYWRlbmNlLFxuICAgICAgdGltZXpvbmU6IGlucHV0LnRpbWV6b25lLFxuICAgICAgd2Vla1N0YXJ0OiBpbnB1dC53ZWVrU3RhcnQsXG4gICAgICBzY29wZTogaW5wdXQuc2NvcGUsXG4gICAgICByZWNpcGllbnRzOiBpbnB1dC5yZWNpcGllbnRzLFxuICAgICAgYXV0b1NlbmQ6IGlucHV0LmF1dG9TZW5kLFxuICAgICAgbmV4dFJ1bkF0OiBpbnB1dC5uZXh0UnVuQXQgPz8gbnVsbCxcbiAgICAgIGNyZWF0ZWRCeTogaW5wdXQuY3JlYXRlZEJ5LFxuICAgIH0pLnJldHVybmluZygpKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdKVswXTtcbiAgfVxuXG4gIGFzeW5jIGxpc3REZWZpbml0aW9ucyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbilcbiAgICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSwgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCkpKVxuICAgICAgLm9yZGVyQnkoYXNjKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm5hbWUpKSk7XG4gICAgcmV0dXJuIHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdO1xuICB9XG5cbiAgYXN5bmMgZ2V0RGVmaW5pdGlvbihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLmxpbWl0KDEpKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdKVswXSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIFRocm93cyB7QGxpbmsgTm90Rm91bmRFcnJvcn0gcmF0aGVyIHRoYW4gcmV0dXJuaW5nIG51bGwsIGZvciByb3V0ZSBib2RpZXMuICovXG4gIGFzeW5jIHJlcXVpcmVEZWZpbml0aW9uKG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb24+IHtcbiAgICBjb25zdCBmb3VuZCA9IGF3YWl0IHRoaXMuZ2V0RGVmaW5pdGlvbihvcmdJZCwgaWQpO1xuICAgIGlmICghZm91bmQpIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdSZXBvcnQgZGVmaW5pdGlvbiBub3QgZm91bmQnKTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEZWZpbml0aW9uKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwYXRjaDogVXBkYXRlRGVmaW5pdGlvbklucHV0LFxuICAgIHVwZGF0ZWRCeTogc3RyaW5nLFxuICApOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb24+IHtcbiAgICBjb25zdCBzZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyB1cGRhdGVkQnksIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGNoKSkge1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHNldFtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pLnNldChzZXQpXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCwgaWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0KSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKCkpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSAocm93cyBhcyBSZXBvcnREZWZpbml0aW9uW10pWzBdO1xuICAgIGlmICghdXBkYXRlZCkgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ1JlcG9ydCBkZWZpbml0aW9uIG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmQgYSBkZWZpbml0aW9uIHRvIGEgbmV3IG93bmVyLiBUaGUgb3duZXIgaXMgd2hvIGEgc2NoZWR1bGVkIHJ1biBpc1xuICAgKiBhdXRob3JpemVkIEFTLCBzbyB0aGlzIGlzIGEgcHJpdmlsZWdlIG1vdmUsIG5vdCBhIG1ldGFkYXRhIGVkaXQg4oCUIHRoZSByb3V0ZVxuICAgKiBjaGVja3MgdGhlIG5ldyBvd25lciBpcyBhIGxpdmUgbWVtYmVyIG9mIHRoZSBvcmcgYmVmb3JlIGNhbGxpbmcuXG4gICAqL1xuICBhc3luYyB0cmFuc2Zlck93bmVyKG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIG5ld093bmVySWQ6IHN0cmluZywgYWN0b3JJZDogc3RyaW5nKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbilcbiAgICAgIC5zZXQoe1xuICAgICAgICBvd25lcklkOiBuZXdPd25lcklkLFxuICAgICAgICB1cGRhdGVkQnk6IGFjdG9ySWQsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgLy8gQSBkZWZpbml0aW9uIHBhdXNlZCBiZWNhdXNlIGl0cyBwcmV2aW91cyBvd25lciBsb3N0IGFjY2VzcyBpcyBsaXZlIGFnYWluXG4gICAgICAgIC8vIHVuZGVyIGFuIG93bmVyIHdobyBoYXMgaXQuIFRoZSBzY2hlZHVsZXIgcmUtY2hlY2tzIGV2ZXJ5IHJ1biBhbnl3YXksIHNvXG4gICAgICAgIC8vIHRoZSB3b3JzdCBjYXNlIGlzIG9uZSBtb3JlIHBhdXNlZCBydW4sIG5ldmVyIGEgc3RhbmRpbmcgZ3JhbnQuXG4gICAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgICBwYXVzZWRSZWFzb246IG51bGwsXG4gICAgICB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZygpKTtcbiAgICBjb25zdCB1cGRhdGVkID0gKHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdKVswXTtcbiAgICBpZiAoIXVwZGF0ZWQpIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdSZXBvcnQgZGVmaW5pdGlvbiBub3QgZm91bmQnKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSBldmVyeSBkZWZpbml0aW9uIGEgdXNlciBvd25zLCB3aXRoIHRoZSByZWFzb24gcmVjb3JkZWQuIENhbGxlZCB3aGVuIHRoZVxuICAgKiBvd25lciBpcyBkZWFjdGl2YXRlZCBvciBsb3NlcyBgcmVwb3J0czp3cml0ZWAg4oCUIGEgcmVwb3J0IG11c3Qgc3RvcCB3aGVuIHRoZVxuICAgKiBwZXJzb24gYWNjb3VudGFibGUgZm9yIGl0IGNhbiBubyBsb25nZXIgc2VlIHRoZSBkYXRhIGJlaGluZCBpdC5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgcGF1c2VkIGRlZmluaXRpb25zIHNvIHRoZSBjYWxsZXIgY2FuIG5vdGlmeSBhbiBvcmcgYWRtaW46IGFcbiAgICogc2lsZW50bHkgc3RvcHBlZCB3ZWVrbHkgcmVwb3J0IGlzIGRpc2NvdmVyZWQgYnkgYSBtYW5hZ2VyIG5vdCByZWNlaXZpbmcgaXQuXG4gICAqL1xuICBhc3luYyBwYXVzZURlZmluaXRpb25zRm9yT3duZXIoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBvd25lcklkOiBzdHJpbmcsXG4gICAgcmVhc29uOiBSZXBvcnRQYXVzZVJlYXNvbixcbiAgKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLnNldCh7IGlzQWN0aXZlOiBmYWxzZSwgcGF1c2VkUmVhc29uOiByZWFzb24sIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3duZXJJZCwgb3duZXJJZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlzQWN0aXZlLCB0cnVlKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZygpKTtcbiAgICByZXR1cm4gcm93cyBhcyBSZXBvcnREZWZpbml0aW9uW107XG4gIH1cblxuICBhc3luYyBkZWxldGVEZWZpbml0aW9uKG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGRlbGV0ZWRCeTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLnNldCh7IGRlbGV0ZWRBdDogbm93LCBkZWxldGVkQnksIC4uLnB1cmdlU3RhbXAobm93KSB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCB9KSk7XG4gICAgaWYgKChyb3dzIGFzIHVua25vd25bXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignUmVwb3J0IGRlZmluaXRpb24gbm90IGZvdW5kJyk7XG4gICAgfVxuICAgIC8vIExpbmtzIHRvIHRoaXMgZGVmaW5pdGlvbidzIHJ1bnMgYXJlIHJldm9rZWQgaW4gdGhlIHNhbWUgYnJlYXRoLiBEZWxldGluZyBhXG4gICAgLy8gcmVwb3J0IHdoaWxlIGEgcHVibGljIFVSTCB0byBsYXN0IG1vbnRoJ3MgbnVtYmVycyBrZWVwcyB3b3JraW5nIGlzIHRoZSBraW5kXG4gICAgLy8gb2YgZ2FwIG5vYm9keSBub3RpY2VzIHVudGlsIGl0IG1hdHRlcnMuXG4gICAgYXdhaXQgdGhpcy5yZXZva2VMaW5rc0ZvckRlZmluaXRpb24ob3JnSWQsIGlkLCBkZWxldGVkQnkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJ1bnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEluc2VydCBhIHJ1biBmb3IgYSBwZXJpb2QsIG9yIHJldHVybiB0aGUgZXhpc3Rpbmcgb25lLlxuICAgKlxuICAgKiBJZGVtcG90ZW50IG9uIChkZWZpbml0aW9uLCBwZXJpb2RTdGFydCwgdmVyc2lvbik6IGEgcmV0cnksIGEgY2F0Y2gtdXAgcGFzc1xuICAgKiBhbmQgYSBtYW51YWwgYmFja2ZpbGwgY2FuIGFsbCBhc2sgZm9yIHRoZSBzYW1lIHBlcmlvZCwgYW5kIHdpdGhvdXQgdGhpcyBlYWNoXG4gICAqIHdvdWxkIGluc2VydCBhIHJvdyBhbmQgdGhlIGxlYWQgd291bGQgcmV2aWV3IHRocmVlIGNvcGllcy4gYG9uQ29uZmxpY3REb05vdGhpbmdgXG4gICAqIHBsdXMgYSByZS1yZWFkIGlzIGRlbGliZXJhdGUg4oCUIHRoZSB1bmlxdWUgaW5kZXggaXMgdGhlIGFyYml0ZXIsIHNvIHR3byBwb2RzXG4gICAqIHJhY2luZyBwcm9kdWNlIG9uZSByb3cgd2hpY2hldmVyIHdpbnMuXG4gICAqL1xuICBhc3luYyBjcmVhdGVSdW4oaW5wdXQ6IHtcbiAgICBvcmdJZDogc3RyaW5nO1xuICAgIGRlZmluaXRpb25JZDogc3RyaW5nO1xuICAgIHBlcmlvZFN0YXJ0OiBEYXRlO1xuICAgIHBlcmlvZEVuZDogRGF0ZTtcbiAgICBwZXJpb2RMYWJlbDogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBudW1iZXI7XG4gICAgc3RhdHVzPzogUmVwb3J0UnVuU3RhdHVzO1xuICAgIHNuYXBzaG90PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsO1xuICAgIGZhaWx1cmVSZWFzb24/OiBzdHJpbmcgfCBudWxsO1xuICB9KTogUHJvbWlzZTx7IHJ1bjogUmVwb3J0UnVuOyBjcmVhdGVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB2ZXJzaW9uID0gaW5wdXQudmVyc2lvbiA/PyAxO1xuICAgIGNvbnN0IGlkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLnJlcG9ydFJ1bikudmFsdWVzKHtcbiAgICAgIGlkLFxuICAgICAgb3JnSWQ6IGlucHV0Lm9yZ0lkLFxuICAgICAgZGVmaW5pdGlvbklkOiBpbnB1dC5kZWZpbml0aW9uSWQsXG4gICAgICBwZXJpb2RTdGFydDogaW5wdXQucGVyaW9kU3RhcnQsXG4gICAgICBwZXJpb2RFbmQ6IGlucHV0LnBlcmlvZEVuZCxcbiAgICAgIHBlcmlvZExhYmVsOiBpbnB1dC5wZXJpb2RMYWJlbCxcbiAgICAgIHZlcnNpb24sXG4gICAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyA/PyAnZHJhZnRpbmcnLFxuICAgICAgc25hcHNob3Q6IGlucHV0LnNuYXBzaG90ID8/IG51bGwsXG4gICAgICBmYWlsdXJlUmVhc29uOiBpbnB1dC5mYWlsdXJlUmVhc29uID8/IG51bGwsXG4gICAgfSkub25Db25mbGljdERvTm90aGluZyh7XG4gICAgICB0YXJnZXQ6IFtzY2hlbWEucmVwb3J0UnVuLmRlZmluaXRpb25JZCwgc2NoZW1hLnJlcG9ydFJ1bi5wZXJpb2RTdGFydCwgc2NoZW1hLnJlcG9ydFJ1bi52ZXJzaW9uXSxcbiAgICB9KS5yZXR1cm5pbmcoKSk7XG4gICAgY29uc3QgaW5zZXJ0ZWQgPSAocm93cyBhcyBSZXBvcnRSdW5bXSlbMF07XG4gICAgaWYgKGluc2VydGVkKSByZXR1cm4geyBydW46IGluc2VydGVkLCBjcmVhdGVkOiB0cnVlIH07XG5cbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4uZGVmaW5pdGlvbklkLCBpbnB1dC5kZWZpbml0aW9uSWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UnVuLnBlcmlvZFN0YXJ0LCBpbnB1dC5wZXJpb2RTdGFydCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4udmVyc2lvbiwgdmVyc2lvbiksXG4gICAgICApKVxuICAgICAgLmxpbWl0KDEpKTtcbiAgICBjb25zdCBmb3VuZCA9IChleGlzdGluZyBhcyBSZXBvcnRSdW5bXSlbMF07XG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgLy8gVGhlIGluc2VydCB3YXMgc2tpcHBlZCBieSB0aGUgY29uZmxpY3QgdGFyZ2V0IGJ1dCBub3RoaW5nIGlzIHRoZXJlIHRvXG4gICAgICAvLyByZWFkOiB0aGUgb25seSB3YXkgaXMgYSBjb25jdXJyZW50IGRlbGV0ZSBiZXR3ZWVuIHRoZSB0d28gc3RhdGVtZW50cy5cbiAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKCdSZXBvcnQgcnVuIGNvdWxkIG5vdCBiZSBjcmVhdGVkJywgRXJyb3JDb2RlLkNPTkZMSUNULCB7XG4gICAgICAgIGRlZmluaXRpb25JZDogaW5wdXQuZGVmaW5pdGlvbklkLFxuICAgICAgICBwZXJpb2RMYWJlbDogaW5wdXQucGVyaW9kTGFiZWwsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcnVuOiBmb3VuZCwgY3JlYXRlZDogZmFsc2UgfTtcbiAgfVxuXG4gIC8qKiBUaGUgbmV4dCB2ZXJzaW9uIG51bWJlciBmb3IgYSBwZXJpb2Q6IGBtYXgodmVyc2lvbikgKyAxYC4gKi9cbiAgYXN5bmMgbmV4dFZlcnNpb24oZGVmaW5pdGlvbklkOiBzdHJpbmcsIHBlcmlvZFN0YXJ0OiBEYXRlKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KHsgdmVyc2lvbjogc2NoZW1hLnJlcG9ydFJ1bi52ZXJzaW9uIH0pXG4gICAgICAuZnJvbShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5kZWZpbml0aW9uSWQsIGRlZmluaXRpb25JZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4ucGVyaW9kU3RhcnQsIHBlcmlvZFN0YXJ0KSxcbiAgICAgICkpXG4gICAgICAub3JkZXJCeShkZXNjKHNjaGVtYS5yZXBvcnRSdW4udmVyc2lvbikpXG4gICAgICAubGltaXQoMSkpO1xuICAgIGNvbnN0IHRvcCA9IChyb3dzIGFzIEFycmF5PHsgdmVyc2lvbjogbnVtYmVyIH0+KVswXTtcbiAgICByZXR1cm4gKHRvcD8udmVyc2lvbiA/PyAwKSArIDE7XG4gIH1cblxuICAvKiogUG9pbnQgYW4gb2xkZXIgcnVuIGF0IHRoZSB2ZXJzaW9uIHRoYXQgcmVwbGFjZWQgaXQuICovXG4gIGFzeW5jIHN1cGVyc2VkZShvcmdJZDogc3RyaW5nLCBvbGRSdW5JZDogc3RyaW5nLCBuZXdSdW5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSdW4pXG4gICAgICAuc2V0KHsgc3VwZXJzZWRlZEJ5OiBuZXdSdW5JZCwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIG9sZFJ1bklkKSwgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpKSkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFJ1bnMob3JnSWQ6IHN0cmluZywgZGVmaW5pdGlvbklkOiBzdHJpbmcsIGxpbWl0ID0gNTApOiBQcm9taXNlPFJlcG9ydFJ1bltdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5kZWZpbml0aW9uSWQsIGRlZmluaXRpb25JZCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UnVuLmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLm9yZGVyQnkoZGVzYyhzY2hlbWEucmVwb3J0UnVuLnBlcmlvZFN0YXJ0KSwgZGVzYyhzY2hlbWEucmVwb3J0UnVuLnZlcnNpb24pKVxuICAgICAgLmxpbWl0KGxpbWl0KSk7XG4gICAgcmV0dXJuIHJvd3MgYXMgUmVwb3J0UnVuW107XG4gIH1cblxuICBhc3luYyBnZXRSdW4ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZyk6IFByb21pc2U8UmVwb3J0UnVuIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnRSdW4pXG4gICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIGlkKSwgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpLCBpc051bGwoc2NoZW1hLnJlcG9ydFJ1bi5kZWxldGVkQXQpKSlcbiAgICAgIC5saW1pdCgxKSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIFJlcG9ydFJ1bltdKVswXSA/PyBudWxsO1xuICB9XG5cbiAgYXN5bmMgcmVxdWlyZVJ1bihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nKTogUHJvbWlzZTxSZXBvcnRSdW4+IHtcbiAgICBjb25zdCBmb3VuZCA9IGF3YWl0IHRoaXMuZ2V0UnVuKG9yZ0lkLCBpZCk7XG4gICAgaWYgKCFmb3VuZCkgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ1JlcG9ydCBydW4gbm90IGZvdW5kJyk7XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgLyoqIFN0b3JlIGEgY29tcHV0ZWQgc25hcHNob3QgYW5kIG1vdmUgdGhlIHJ1biB0byBgcmVhZHlfZm9yX3Jldmlld2AuICovXG4gIGFzeW5jIGNvbXBsZXRlUnVuKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgc3RhdHVzOiBSZXBvcnRSdW5TdGF0dXMgPSAncmVhZHlfZm9yX3JldmlldycsXG4gICk6IFByb21pc2U8UmVwb3J0UnVuPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgLnNldCh7IHNuYXBzaG90LCBzdGF0dXMsIGZhaWx1cmVSZWFzb246IG51bGwsIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9KVxuICAgICAgLndoZXJlKGFuZChlcShzY2hlbWEucmVwb3J0UnVuLmlkLCBpZCksIGVxKHNjaGVtYS5yZXBvcnRSdW4ub3JnSWQsIG9yZ0lkKSwgaXNOdWxsKHNjaGVtYS5yZXBvcnRSdW4uZGVsZXRlZEF0KSkpXG4gICAgICAucmV0dXJuaW5nKCkpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSAocm93cyBhcyBSZXBvcnRSdW5bXSlbMF07XG4gICAgaWYgKCF1cGRhdGVkKSB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignUmVwb3J0IHJ1biBub3QgZm91bmQnKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfVxuXG4gIGFzeW5jIGZhaWxSdW4ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgZmFpbHVyZVJlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSdW4pXG4gICAgICAuc2V0KHsgc3RhdHVzOiAnZmFpbGVkJywgZmFpbHVyZVJlYXNvbiwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIGlkKSwgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXQgdGhlIGxlYWQncyBvd24gd29yZHMgb24gYSBydW4gdGhhdCBoYXMgTk9UIGJlZW4gcHVibGlzaGVkLlxuICAgKlxuICAgKiBSZWZ1c2VkIGFmdGVyIHB1Ymxpc2g6IHRoZSBub3RlcyBhcmUgcGFydCBvZiB3aGF0IHRoZSBtYW5hZ2VyIHJlYWQsIGFuZCBhXG4gICAqIHJlcG9ydCB3aG9zZSBuYXJyYXRpdmUgY2FuIGJlIGVkaXRlZCBhZnRlciBkZWxpdmVyeSBpcyBhIHJlcG9ydCB3aG9zZVxuICAgKiBkZWxpdmVyZWQgdmVyc2lvbiBjYW5ub3QgYmUgcmVjb25zdHJ1Y3RlZC4gUmVnZW5lcmF0aW5nIHByb2R1Y2VzIHZlcnNpb24gTisxLFxuICAgKiB3aGljaCBpcyB0aGUgc3VwcG9ydGVkIHdheSB0byBjb3JyZWN0IGEgcHVibGlzaGVkIHJlcG9ydC5cbiAgICovXG4gIGFzeW5jIHNldFJ1bk5vdGVzKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwYXRjaDogeyBsZWFkTm90ZXM/OiBzdHJpbmc7IGFpRHJhZnQ/OiBzdHJpbmcgfSxcbiAgKTogUHJvbWlzZTxSZXBvcnRSdW4+IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB0aGlzLnJlcXVpcmVSdW4ob3JnSWQsIGlkKTtcbiAgICBpZiAocnVuLnN0YXR1cyA9PT0gJ3B1Ymxpc2hlZCcpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgICAnVGhpcyByZXBvcnQgaGFzIGFscmVhZHkgYmVlbiBwdWJsaXNoZWQuIFJlZ2VuZXJhdGUgaXQgdG8gcHJvZHVjZSBhIG5ldyB2ZXJzaW9uIHdpdGggeW91ciBjaGFuZ2VzIOKAlCAnXG4gICAgICAgICsgJ3RoZSBwdWJsaXNoZWQgdmVyc2lvbiBzdGF5cyBleGFjdGx5IGFzIHRoZSByZWNpcGllbnRzIHJlYWQgaXQuJyxcbiAgICAgICAgRXJyb3JDb2RlLkNPTkZMSUNULFxuICAgICAgICB7IHJ1bklkOiBpZCwgcHVibGlzaGVkQXQ6IHJ1bi5wdWJsaXNoZWRBdD8udG9JU09TdHJpbmcoKSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH07XG4gICAgaWYgKHBhdGNoLmxlYWROb3RlcyAhPT0gdW5kZWZpbmVkKSBzZXQubGVhZE5vdGVzID0gcGF0Y2gubGVhZE5vdGVzO1xuICAgIGlmIChwYXRjaC5haURyYWZ0ICE9PSB1bmRlZmluZWQpIHNldC5haURyYWZ0ID0gcGF0Y2guYWlEcmFmdDtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSdW4pLnNldChzZXQpXG4gICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIGlkKSwgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpLCBpc051bGwoc2NoZW1hLnJlcG9ydFJ1bi5kZWxldGVkQXQpKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIFJlcG9ydFJ1bltdKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgd2hhdCBoYXBwZW5lZCB3aGVuIGEgcnVuIHdhcyBkZWxpdmVyZWQuXG4gICAqXG4gICAqIERlbGliZXJhdGVseSBOT1QgcGFydCBvZiB7QGxpbmsgc2V0UnVuTm90ZXN9LCB3aGljaCByZWZ1c2VzIGEgcHVibGlzaGVkIHJ1bjogZGVsaXZlcnlcbiAgICogaGFwcGVucyBBVCBwdWJsaXNoLCBzbyBhIG1ldGhvZCB0aGF0IHJlZnVzZWQgcHVibGlzaGVkIHJ1bnMgY291bGQgbmV2ZXIgcmVjb3JkIGl0LlxuICAgKiBUaGlzIG9uZSB3cml0ZXMgZXhhY3RseSBvbmUgY29sdW1uIGFuZCBub3RoaW5nIGVsc2UsIHdoaWNoIGlzIHdoeSBpdCBpcyBzYWZlIHRvIGFsbG93XG4gICAqIGFmdGVyIHB1Ymxpc2gg4oCUIGl0IGNhbm5vdCBjaGFuZ2UgYSBudW1iZXIgYSByZWNpcGllbnQgaGFzIHJlYWQuXG4gICAqL1xuICBhc3luYyByZWNvcmREZWxpdmVyeShvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nLCBkZWxpdmVyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC5zZXQoeyBkZWxpdmVyeSwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UnVuLmlkLCBpZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSdW4uZGVsZXRlZEF0KSxcbiAgICAgICkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIGEgcnVuLlxuICAgKlxuICAgKiBDb25kaXRpb25hbCBvbiB0aGUgcm93IHN0aWxsIGJlaW5nIHVucHVibGlzaGVkIChgcHVibGlzaGVkX2F0IElTIE5VTExgKSwgc29cbiAgICogdHdvIGNsaWNrcyDigJQgb3IgdHdvIHRhYnMg4oCUIHByb2R1Y2Ugb25lIHB1Ymxpc2ggYW5kIG9uZSBzZXQgb2YgZGVsaXZlcmllc1xuICAgKiByYXRoZXIgdGhhbiB0d28uIEEgcnVuIHdpdGggbm8gc25hcHNob3QgY2Fubm90IGJlIHB1Ymxpc2hlZDogdGhlcmUgd291bGQgYmVcbiAgICogbm90aGluZyBmb3IgYSByZWNpcGllbnQgdG8gcmVhZC5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hSdW4ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgcHVibGlzaGVkQnk6IHN0cmluZyk6IFByb21pc2U8eyBydW46IFJlcG9ydFJ1bjsgYWxyZWFkeVB1Ymxpc2hlZDogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgcnVuID0gYXdhaXQgdGhpcy5yZXF1aXJlUnVuKG9yZ0lkLCBpZCk7XG4gICAgaWYgKHJ1bi5zdGF0dXMgPT09ICdmYWlsZWQnIHx8ICFydW4uc25hcHNob3QpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgICAnVGhpcyByZXBvcnQgaGFzIG5vIGNvbXB1dGVkIHNuYXBzaG90LCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIHB1Ymxpc2guIFJlZ2VuZXJhdGUgaXQgZmlyc3QuJyxcbiAgICAgICAgRXJyb3JDb2RlLkNPTkZMSUNULFxuICAgICAgICB7IHJ1bklkOiBpZCwgc3RhdHVzOiBydW4uc3RhdHVzIH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC5zZXQoeyBzdGF0dXM6ICdwdWJsaXNoZWQnLCBwdWJsaXNoZWRCeSwgcHVibGlzaGVkQXQ6IG5vdywgdXBkYXRlZEF0OiBub3cgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIGlkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydFJ1bi5wdWJsaXNoZWRBdCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UnVuLmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZygpKTtcbiAgICBjb25zdCBwdWJsaXNoZWQgPSAocm93cyBhcyBSZXBvcnRSdW5bXSlbMF07XG4gICAgaWYgKHB1Ymxpc2hlZCkgcmV0dXJuIHsgcnVuOiBwdWJsaXNoZWQsIGFscmVhZHlQdWJsaXNoZWQ6IGZhbHNlIH07XG4gICAgLy8gVGhlIGNvbmRpdGlvbmFsIHVwZGF0ZSBtYXRjaGVkIG5vdGhpbmc6IHNvbWVvbmUgZWxzZSBwdWJsaXNoZWQgaXQgZmlyc3QuXG4gICAgcmV0dXJuIHsgcnVuOiBhd2FpdCB0aGlzLnJlcXVpcmVSdW4ob3JnSWQsIGlkKSwgYWxyZWFkeVB1Ymxpc2hlZDogdHJ1ZSB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIFNoYXJlIGxpbmtzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBNaW50IGEgcmVhZC1vbmx5IGxpbmsgdG8gYSBwdWJsaXNoZWQgcnVuLiBUaGUgcmF3IHRva2VuIGlzIHJldHVybmVkIGhlcmUgYW5kXG4gICAqIG5vd2hlcmUgZWxzZSDigJQgb25seSBpdHMgaGFzaCBpcyBzdG9yZWQsIHNvIGEgZGF0YWJhc2UgY29weSBjYW5ub3QgYmUgdHVybmVkXG4gICAqIGJhY2sgaW50byB3b3JraW5nIFVSTHMuXG4gICAqL1xuICBhc3luYyBjcmVhdGVTaGFyZUxpbmsoaW5wdXQ6IHtcbiAgICBvcmdJZDogc3RyaW5nO1xuICAgIHJ1bklkOiBzdHJpbmc7XG4gICAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gICAgdHRsRGF5cz86IG51bWJlcjtcbiAgICByZWRhY3ROYW1lcz86IGJvb2xlYW47XG4gICAgbm93PzogRGF0ZTtcbiAgfSk6IFByb21pc2U8TWludGVkU2hhcmVMaW5rPiB7XG4gICAgY29uc3QgcnVuID0gYXdhaXQgdGhpcy5yZXF1aXJlUnVuKGlucHV0Lm9yZ0lkLCBpbnB1dC5ydW5JZCk7XG4gICAgaWYgKHJ1bi5zdGF0dXMgIT09ICdwdWJsaXNoZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgJ09ubHkgYSBwdWJsaXNoZWQgcmVwb3J0IGNhbiBiZSBzaGFyZWQuIFB1Ymxpc2ggaXQgZmlyc3Qg4oCUIGEgbGluayB0byBhIGRyYWZ0IHdvdWxkIHNob3cgbnVtYmVycyB0aGUgbGVhZCBoYXMgbm90IHJldmlld2VkLicsXG4gICAgICAgIEVycm9yQ29kZS5DT05GTElDVCxcbiAgICAgICAgeyBydW5JZDogaW5wdXQucnVuSWQsIHN0YXR1czogcnVuLnN0YXR1cyB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZGF5cyA9IE1hdGgubWluKGlucHV0LnR0bERheXMgPz8gREVGQVVMVF9TSEFSRV9MSU5LX1RUTF9EQVlTLCBNQVhfU0hBUkVfTElOS19UVExfREFZUyk7XG4gICAgY29uc3Qgbm93ID0gaW5wdXQubm93ID8/IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgeyB0b2tlbiwgdG9rZW5IYXNoIH0gPSBtaW50VG9rZW4oKTtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5yZXBvcnRTaGFyZUxpbmspLnZhbHVlcyh7XG4gICAgICBpZDogcmFuZG9tVVVJRCgpLFxuICAgICAgb3JnSWQ6IGlucHV0Lm9yZ0lkLFxuICAgICAgcnVuSWQ6IGlucHV0LnJ1bklkLFxuICAgICAgdG9rZW5IYXNoLFxuICAgICAgZXhwaXJlc0F0OiBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgZGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApLFxuICAgICAgcmVkYWN0TmFtZXM6IGlucHV0LnJlZGFjdE5hbWVzID8/IGZhbHNlLFxuICAgICAgY3JlYXRlZEJ5OiBpbnB1dC5jcmVhdGVkQnksXG4gICAgfSkucmV0dXJuaW5nKCkpO1xuICAgIHJldHVybiB7IGxpbms6IChyb3dzIGFzIFJlcG9ydFNoYXJlTGlua1tdKVswXSwgdG9rZW4gfTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RTaGFyZUxpbmtzKG9yZ0lkOiBzdHJpbmcsIHJ1bklkOiBzdHJpbmcpOiBQcm9taXNlPFJlcG9ydFNoYXJlTGlua1tdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydFNoYXJlTGluaylcbiAgICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnJlcG9ydFNoYXJlTGluay5vcmdJZCwgb3JnSWQpLCBlcShzY2hlbWEucmVwb3J0U2hhcmVMaW5rLnJ1bklkLCBydW5JZCkpKVxuICAgICAgLm9yZGVyQnkoZGVzYyhzY2hlbWEucmVwb3J0U2hhcmVMaW5rLmNyZWF0ZWRBdCkpKTtcbiAgICByZXR1cm4gcm93cyBhcyBSZXBvcnRTaGFyZUxpbmtbXTtcbiAgfVxuXG4gIGFzeW5jIHJldm9rZVNoYXJlTGluayhvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nLCByZXZva2VkQnk6IHN0cmluZyk6IFByb21pc2U8UmVwb3J0U2hhcmVMaW5rPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0U2hhcmVMaW5rKVxuICAgICAgLnNldCh7IHJldm9rZWRBdDogbmV3IERhdGUoKSwgcmV2b2tlZEJ5IH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0U2hhcmVMaW5rLmlkLCBpZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsucmV2b2tlZEF0KSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKCkpO1xuICAgIGNvbnN0IHJldm9rZWQgPSAocm93cyBhcyBSZXBvcnRTaGFyZUxpbmtbXSlbMF07XG4gICAgaWYgKCFyZXZva2VkKSB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignU2hhcmUgbGluayBub3QgZm91bmQgb3IgYWxyZWFkeSByZXZva2VkJyk7XG4gICAgcmV0dXJuIHJldm9rZWQ7XG4gIH1cblxuICAvKiogUmV2b2tlIGV2ZXJ5IGxpdmUgbGluayB0byBhbnkgcnVuIG9mIGEgZGVmaW5pdGlvbi4gVXNlZCBvbiBkZWxldGUuICovXG4gIGFzeW5jIHJldm9rZUxpbmtzRm9yRGVmaW5pdGlvbihvcmdJZDogc3RyaW5nLCBkZWZpbml0aW9uSWQ6IHN0cmluZywgcmV2b2tlZEJ5OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHJ1bnMgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoeyBpZDogc2NoZW1hLnJlcG9ydFJ1bi5pZCB9KS5mcm9tKHNjaGVtYS5yZXBvcnRSdW4pXG4gICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5yZXBvcnRSdW4ub3JnSWQsIG9yZ0lkKSwgZXEoc2NoZW1hLnJlcG9ydFJ1bi5kZWZpbml0aW9uSWQsIGRlZmluaXRpb25JZCkpKSk7XG4gICAgY29uc3QgcnVuSWRzID0gKHJ1bnMgYXMgQXJyYXk8eyBpZDogc3RyaW5nIH0+KS5tYXAoKHIpID0+IHIuaWQpO1xuICAgIGlmIChydW5JZHMubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmspXG4gICAgICAuc2V0KHsgcmV2b2tlZEF0OiBuZXcgRGF0ZSgpLCByZXZva2VkQnkgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaW5BcnJheShzY2hlbWEucmVwb3J0U2hhcmVMaW5rLnJ1bklkLCBydW5JZHMpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydFNoYXJlTGluay5yZXZva2VkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoeyBpZDogc2NoZW1hLnJlcG9ydFNoYXJlTGluay5pZCB9KSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIHVua25vd25bXSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBzaGFyZSB0b2tlbiB0byBpdHMgbGluayBhbmQgcnVuLCBmb3IgdGhlIFVOQVVUSEVOVElDQVRFRCBwdWJsaWNcbiAgICogcm91dGUuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIG9uZSByZWFkIGluIHRoaXMgbW9kdWxlIHRoYXQgcnVucyBhcyBzeXNhZG1pbiwgYW5kIHRoZSByZWFzb24gaXNcbiAgICogc3RydWN0dXJhbDogdGhlIHJlYWRlciBob2xkcyBhIHRva2VuIGFuZCBub3RoaW5nIGVsc2Ug4oCUIG5vIGFjY291bnQsIG5vIG9yZyxcbiAgICogbm8gSldUIOKAlCBzbyB0aGVyZSBpcyBubyB0ZW5hbnQgY29udGV4dCBmb3IgUkxTIHRvIHNjb3BlIGJ5LCBhbmQgdGhlIG9yZyBjYW5cbiAgICogb25seSBiZSBsZWFybmVkIEZST00gdGhlIHJvdy4gVGhlIGVzY2FsYXRpb24gaXMga2VwdCBhcyBuYXJyb3cgYXMgdGhlIHByb2JsZW06XG4gICAqXG4gICAqICAtIFRoZSBzeXNhZG1pbiBzY29wZSBjb3ZlcnMgdGhlIHRva2VuLWhhc2ggbG9va3VwIE9OTFkuIFRoZSBydW4gaXMgcmVhZCBiYWNrXG4gICAqICAgIHVuZGVyIHRoZSBsaW5rJ3MgT1dOIG9yZywgc28gYSBidWcgaW4gdGhlIHJ1biBxdWVyeSBjYW5ub3QgcmVhY2ggYW5vdGhlclxuICAgKiAgICB0ZW5hbnQncyByb3dzLlxuICAgKiAgLSBUaGUgbG9va3VwIGlzIGJ5IGEgMjU2LWJpdCBoYXNoIG9uIGEgdW5pcXVlIGluZGV4LiBJdCBpcyBub3QgYSBmaWx0ZXIgYVxuICAgKiAgICBjYWxsZXIgY2FuIHdpZGVuIOKAlCB0aGVyZSBpcyBubyBvdGhlciBwcmVkaWNhdGUgdG8gaW5mbHVlbmNlLlxuICAgKiAgLSBFeHBpcmVkIGFuZCByZXZva2VkIGxpbmtzIHJlc29sdmUgdG8gbnVsbCBoZXJlLCBzbyB0aGUgY2FsbGVyIGNhbm5vdFxuICAgKiAgICBhY2NpZGVudGFsbHkgc2VydmUgb25lIGJ5IGZvcmdldHRpbmcgYSBjaGVjay5cbiAgICpcbiAgICogUmV0dXJucyBudWxsIGZvciBldmVyeSBmYWlsdXJlIOKAlCB1bmtub3duLCByZXZva2VkLCBleHBpcmVkLCBvciBwb2ludGluZyBhdCBhXG4gICAqIHJ1biB0aGF0IGlzIG5vIGxvbmdlciBwdWJsaXNoZWQg4oCUIHNvIHRoZSByb3V0ZSBhbnN3ZXJzIG9uZSBpbmRpc3Rpbmd1aXNoYWJsZVxuICAgKiA0MDQgYW5kIGEgaG9sZGVyIG9mIGEgZGVhZCBsaW5rIGxlYXJucyBub3RoaW5nIGFib3V0IHdoaWNoIG9mIHRob3NlIGl0IHdhcy5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVTaGFyZUxpbmsodG9rZW46IHN0cmluZywgbm93ID0gbmV3IERhdGUoKSk6IFByb21pc2U8UmVzb2x2ZWRTaGFyZUxpbmsgfCBudWxsPiB7XG4gICAgY29uc3QgdG9rZW5IYXNoID0gaGFzaFRva2VuKHRva2VuKTtcbiAgICBjb25zdCBsaW5rcyA9IGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmspXG4gICAgICAgIC53aGVyZShlcShzY2hlbWEucmVwb3J0U2hhcmVMaW5rLnRva2VuSGFzaCwgdG9rZW5IYXNoKSlcbiAgICAgICAgLmxpbWl0KDEpKSk7XG4gICAgY29uc3QgbGluayA9IChsaW5rcyBhcyBSZXBvcnRTaGFyZUxpbmtbXSlbMF07XG4gICAgLy8gTm8gY29uc3RhbnQtdGltZSBjb21wYXJpc29uIGhlcmUgb24gcHVycG9zZTogdGhlIGxvb2t1cCBpcyBhbiBlcXVhbGl0eSBtYXRjaFxuICAgIC8vIG9uIGEgMjU2LWJpdCBoYXNoIG92ZXIgYSB1bmlxdWUgaW5kZXgsIHNvIHRoZXJlIGlzIG5vIHNlY3JldC1kZXBlbmRlbnQgYnJhbmNoXG4gICAgLy8gaW4gdGhpcyBmdW5jdGlvbiB0byBsZWFrLiBBIGhhbmQtcm9sbGVkIGNvbXBhcmUgYWZ0ZXIgdGhlIGRhdGFiYXNlIGFscmVhZHlcbiAgICAvLyBkZWNpZGVkIGl0IHdvdWxkIGJlIHRoZWF0cmUuXG4gICAgaWYgKCFsaW5rKSByZXR1cm4gbnVsbDtcbiAgICBpZiAobGluay5yZXZva2VkQXQpIHJldHVybiBudWxsO1xuICAgIGlmIChsaW5rLmV4cGlyZXNBdC5nZXRUaW1lKCkgPD0gbm93LmdldFRpbWUoKSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBydW5zID0gYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZDogbGluay5vcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIGxpbmsucnVuSWQpLFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4ub3JnSWQsIGxpbmsub3JnSWQpLFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4uc3RhdHVzLCAncHVibGlzaGVkJyksXG4gICAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSdW4uZGVsZXRlZEF0KSxcbiAgICAgICAgKSlcbiAgICAgICAgLmxpbWl0KDEpKSk7XG4gICAgY29uc3QgcnVuID0gKHJ1bnMgYXMgUmVwb3J0UnVuW10pWzBdO1xuICAgIGlmICghcnVuKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4geyBsaW5rLCBydW4gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudCBvbmUgaHVtYW4gdmlldyBvZiBhIHNoYXJlZCByZXBvcnQuXG4gICAqXG4gICAqIFNlcGFyYXRlIGZyb20ge0BsaW5rIHJlc29sdmVTaGFyZUxpbmt9IHNvIHRoZSByb3V0ZSBjYW4gc2VydmUgYSBsaW5rIHByZXZpZXcsXG4gICAqIGEgSEVBRCBwcm9iZSBvciBhIG1haWwgc2Nhbm5lcidzIGZldGNoIFdJVEhPVVQgY291bnRpbmcgaXQg4oCUIGEgdmlldyBjb3VudCB0aGF0XG4gICAqIGp1bXBzIHRoZSBtb21lbnQgYSBsaW5rIGlzIHBhc3RlZCBpbnRvIFNsYWNrIHRlbGxzIHRoZSBsZWFkIHRoZWlyIG1hbmFnZXIgcmVhZFxuICAgKiB0aGUgcmVwb3J0IHdoZW4gbm9ib2R5IGhhcy5cbiAgICovXG4gIGFzeW5jIHJlY29yZFNoYXJlVmlldyhsaW5rOiBSZXBvcnRTaGFyZUxpbmssIG5vdyA9IG5ldyBEYXRlKCkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkOiBsaW5rLm9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFNoYXJlTGluaylcbiAgICAgICAgLnNldCh7IHZpZXdDb3VudDogc3FsYCR7c2NoZW1hLnJlcG9ydFNoYXJlTGluay52aWV3Q291bnR9ICsgMWAsIGxhc3RWaWV3ZWRBdDogbm93IH0pXG4gICAgICAgIC53aGVyZShlcShzY2hlbWEucmVwb3J0U2hhcmVMaW5rLmlkLCBsaW5rLmlkKSkpKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWNpcGllbnRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBZGQgKG9yIHJlLWFkZCkgYSBkZWxpdmVyeSBhZGRyZXNzLlxuICAgKlxuICAgKiBVcHNlcnRzIG9uIChvcmcsIGVtYWlsKSBhbmQgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIHJlc2V0IGB1bnN1YnNjcmliZWRfYXRgIG9yXG4gICAqIGB2ZXJpZmllZF9hdGA6IGEgbGVhZCBtdXN0IG5vdCBiZSBhYmxlIHRvIHVuZG8gc29tZW9uZSdzIHVuc3Vic2NyaWJlIGJ5XG4gICAqIHJlbW92aW5nIGFuZCByZS1hZGRpbmcgdGhlbSwgYW5kIGFuIGFkZHJlc3MgYWxyZWFkeSB2ZXJpZmllZCBzaG91bGQgbm90IGhhdmVcbiAgICogdG8gY29uZmlybSB0d2ljZS4gQSB2ZXJpZmljYXRpb24gdG9rZW4gaXMgbWludGVkIG9ubHkgd2hlbiB0aGUgYWRkcmVzcyBpcyBub3RcbiAgICogeWV0IHZlcmlmaWVkLlxuICAgKi9cbiAgYXN5bmMgdXBzZXJ0UmVjaXBpZW50KGlucHV0OiB7XG4gICAgb3JnSWQ6IHN0cmluZztcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICAgIGNyZWF0ZWRCeTogc3RyaW5nO1xuICAgIC8qKiBTZXQgd2hlbiBhbiBhZG1pbiBwcmUtYXBwcm92ZWQgYW4gb3V0LW9mLWRvbWFpbiBhZGRyZXNzLiAqL1xuICAgIGFwcHJvdmVkQnk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBPcmcgbWVtYmVycyBza2lwIHZlcmlmaWNhdGlvbiDigJQgdGhleSBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQgdG8gdGhpcyBvcmcuICovXG4gICAgcHJlVmVyaWZpZWQ/OiBib29sZWFuO1xuICAgIG5vdz86IERhdGU7XG4gIH0pOiBQcm9taXNlPHsgcmVjaXBpZW50OiBSZXBvcnRSZWNpcGllbnQ7IHZlcmlmaWNhdGlvblRva2VuPzogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBlbWFpbCA9IGlucHV0LmVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG5vdyA9IGlucHV0Lm5vdyA/PyBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IG1pbnRlZCA9IGlucHV0LnByZVZlcmlmaWVkID8gdW5kZWZpbmVkIDogbWludFRva2VuKCk7XG4gICAgLy8gVGhlIHVuc3Vic2NyaWJlIHRva2VuIGlzIG1pbnRlZCBmb3IgRVZFUlkgcmVjaXBpZW50LCBtZW1iZXIgb3Igbm90LCBiZWNhdXNlIGV2ZXJ5XG4gICAgLy8gcmVwb3J0IGVtYWlsIGNhcnJpZXMgdGhlIGxpbmsuIE1pbnRlZCBvbmNlIGFuZCBrZXB0OiBhIGxpbmsgaW4gYSByZXBvcnQgZnJvbSBNYXJjaFxuICAgIC8vIGhhcyB0byBrZWVwIHdvcmtpbmcuXG4gICAgY29uc3QgdW5zdWIgPSBtaW50VG9rZW4oKTtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpLnZhbHVlcyh7XG4gICAgICBpZDogcmFuZG9tVVVJRCgpLFxuICAgICAgb3JnSWQ6IGlucHV0Lm9yZ0lkLFxuICAgICAgZW1haWwsXG4gICAgICBkaXNwbGF5TmFtZTogaW5wdXQuZGlzcGxheU5hbWUgPz8gbnVsbCxcbiAgICAgIHZlcmlmaWVkQXQ6IGlucHV0LnByZVZlcmlmaWVkID8gbm93IDogbnVsbCxcbiAgICAgIHZlcmlmaWNhdGlvblRva2VuSGFzaDogbWludGVkPy50b2tlbkhhc2ggPz8gbnVsbCxcbiAgICAgIHVuc3Vic2NyaWJlVG9rZW46IHVuc3ViLnRva2VuLFxuICAgICAgYXBwcm92ZWRCeTogaW5wdXQuYXBwcm92ZWRCeSA/PyBudWxsLFxuICAgICAgY3JlYXRlZEJ5OiBpbnB1dC5jcmVhdGVkQnksXG4gICAgfSkub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgIHRhcmdldDogW3NjaGVtYS5yZXBvcnRSZWNpcGllbnQub3JnSWQsIHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZW1haWxdLFxuICAgICAgc2V0OiB7XG4gICAgICAgIGRpc3BsYXlOYW1lOiBpbnB1dC5kaXNwbGF5TmFtZSA/PyBzcWxgJHtzY2hlbWEucmVwb3J0UmVjaXBpZW50LmRpc3BsYXlOYW1lfWAsXG4gICAgICAgIC8vIFJlLWFkZGluZyBhIHRvbWJzdG9uZWQgcmVjaXBpZW50IHJldml2ZXMgdGhlIHJvdyB3aXRoIGl0cyBoaXN0b3J5LlxuICAgICAgICBkZWxldGVkQXQ6IG51bGwsXG4gICAgICAgIGRlbGV0ZWRCeTogbnVsbCxcbiAgICAgICAgcHVyZ2VBZnRlcjogbnVsbCxcbiAgICAgICAgYXBwcm92ZWRCeTogaW5wdXQuYXBwcm92ZWRCeSA/PyBzcWxgJHtzY2hlbWEucmVwb3J0UmVjaXBpZW50LmFwcHJvdmVkQnl9YCxcbiAgICAgICAgLy8gT25seSBtaW50IG92ZXIgYW4gVU5WRVJJRklFRCByb3c7IGEgdmVyaWZpZWQgYWRkcmVzcyBrZWVwcyBpdHMgc3RhdGUuXG4gICAgICAgIHZlcmlmaWNhdGlvblRva2VuSGFzaDogc3FsYENBU0UgV0hFTiAke3NjaGVtYS5yZXBvcnRSZWNpcGllbnQudmVyaWZpZWRBdH0gSVMgTlVMTFxuICAgICAgICAgIFRIRU4gJHttaW50ZWQ/LnRva2VuSGFzaCA/PyBudWxsfSBFTFNFICR7c2NoZW1hLnJlcG9ydFJlY2lwaWVudC52ZXJpZmljYXRpb25Ub2tlbkhhc2h9IEVORGAsXG4gICAgICAgIHZlcmlmaWVkQXQ6IGlucHV0LnByZVZlcmlmaWVkXG4gICAgICAgICAgPyBzcWxgQ09BTEVTQ0UoJHtzY2hlbWEucmVwb3J0UmVjaXBpZW50LnZlcmlmaWVkQXR9LCAke25vd30pYFxuICAgICAgICAgIDogc3FsYCR7c2NoZW1hLnJlcG9ydFJlY2lwaWVudC52ZXJpZmllZEF0fWAsXG4gICAgICAgIC8vIENPQUxFU0NFLCBuZXZlciBvdmVyd3JpdGU6IHJlLWFkZGluZyBhbiBhZGRyZXNzIG11c3Qgbm90IGJyZWFrIHRoZSB1bnN1YnNjcmliZVxuICAgICAgICAvLyBsaW5rIGluIGV2ZXJ5IHJlcG9ydCBhbHJlYWR5IGRlbGl2ZXJlZCB0byBpdC5cbiAgICAgICAgdW5zdWJzY3JpYmVUb2tlbjogc3FsYENPQUxFU0NFKCR7c2NoZW1hLnJlcG9ydFJlY2lwaWVudC51bnN1YnNjcmliZVRva2VufSwgJHt1bnN1Yi50b2tlbn0pYCxcbiAgICAgIH0sXG4gICAgfSkucmV0dXJuaW5nKCkpO1xuICAgIGNvbnN0IHJlY2lwaWVudCA9IChyb3dzIGFzIFJlcG9ydFJlY2lwaWVudFtdKVswXTtcbiAgICAvLyBUaGUgdG9rZW4gaXMgb25seSB1c2VmdWwgaWYgdGhpcyByb3cgYWN0dWFsbHkgdG9vayBpdC5cbiAgICBjb25zdCB0b29rVG9rZW4gPSBtaW50ZWQgJiYgcmVjaXBpZW50LnZlcmlmaWNhdGlvblRva2VuSGFzaCA9PT0gbWludGVkLnRva2VuSGFzaDtcbiAgICByZXR1cm4geyByZWNpcGllbnQsIC4uLih0b29rVG9rZW4gPyB7IHZlcmlmaWNhdGlvblRva2VuOiBtaW50ZWQudG9rZW4gfSA6IHt9KSB9O1xuICB9XG5cbiAgYXN5bmMgbGlzdFJlY2lwaWVudHMob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8UmVwb3J0UmVjaXBpZW50W10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0UmVjaXBpZW50KVxuICAgICAgLndoZXJlKGFuZChlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50Lm9yZ0lkLCBvcmdJZCksIGlzTnVsbChzY2hlbWEucmVwb3J0UmVjaXBpZW50LmRlbGV0ZWRBdCkpKVxuICAgICAgLm9yZGVyQnkoYXNjKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZW1haWwpKSk7XG4gICAgcmV0dXJuIHJvd3MgYXMgUmVwb3J0UmVjaXBpZW50W107XG4gIH1cblxuICBhc3luYyBnZXRSZWNpcGllbnRzKG9yZ0lkOiBzdHJpbmcsIGlkczogc3RyaW5nW10pOiBQcm9taXNlPFJlcG9ydFJlY2lwaWVudFtdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0UmVjaXBpZW50KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpbkFycmF5KHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuaWQsIGlkcyksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UmVjaXBpZW50LmRlbGV0ZWRBdCksXG4gICAgICApKSk7XG4gICAgcmV0dXJuIHJvd3MgYXMgUmVwb3J0UmVjaXBpZW50W107XG4gIH1cblxuICAvKiogTWludCBhIGZyZXNoIHZlcmlmaWNhdGlvbiB0b2tlbiBmb3IgYSByZWNpcGllbnQgdGhhdCBoYXMgbm90IGNvbmZpcm1lZCB5ZXQuICovXG4gIGFzeW5jIHJlc2VuZFZlcmlmaWNhdGlvbihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nKTogUHJvbWlzZTx7IHJlY2lwaWVudDogUmVwb3J0UmVjaXBpZW50OyB0b2tlbjogc3RyaW5nIH0+IHtcbiAgICBjb25zdCB7IHRva2VuLCB0b2tlbkhhc2ggfSA9IG1pbnRUb2tlbigpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJlY2lwaWVudClcbiAgICAgIC5zZXQoeyB2ZXJpZmljYXRpb25Ub2tlbkhhc2g6IHRva2VuSGFzaCB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5pZCwgaWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50Lm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UmVjaXBpZW50LnZlcmlmaWVkQXQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5kZWxldGVkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgY29uc3QgcmVjaXBpZW50ID0gKHJvd3MgYXMgUmVwb3J0UmVjaXBpZW50W10pWzBdO1xuICAgIGlmICghcmVjaXBpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgJ1RoaXMgcmVjaXBpZW50IGlzIGFscmVhZHkgdmVyaWZpZWQsIG9yIG5vIGxvbmdlciBleGlzdHMuJyxcbiAgICAgICAgRXJyb3JDb2RlLkNPTkZMSUNULFxuICAgICAgICB7IHJlY2lwaWVudElkOiBpZCB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmVjaXBpZW50LCB0b2tlbiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gYW4gYWRkcmVzcyBmcm9tIHRoZSBlbWFpbGVkIHRva2VuLiBDcm9zcy1vcmcgYnkgbmVjZXNzaXR5ICh0aGUgcGVyc29uXG4gICAqIGNsaWNraW5nIGhhcyBubyBzZXNzaW9uKSwgc28gaXQgcnVucyBhcyBzeXNhZG1pbiBvdmVyIGEgdW5pcXVlIDI1Ni1iaXQgaGFzaCDigJRcbiAgICogdGhlIHNhbWUgc2hhcGUsIGFuZCB0aGUgc2FtZSByZWFzb25pbmcsIGFzIHtAbGluayByZXNvbHZlU2hhcmVMaW5rfS5cbiAgICpcbiAgICogVGhlIHRva2VuIGlzIENPTlNVTUVEOiBpdCBpcyBjbGVhcmVkIG9uIHN1Y2Nlc3MsIHNvIGEgZm9yd2FyZGVkIGNvbmZpcm1hdGlvblxuICAgKiBsaW5rIGNhbm5vdCBiZSByZXBsYXllZCBieSB3aG9ldmVyIHRoZSBtYWlsIHdhcyBmb3J3YXJkZWQgdG8uXG4gICAqL1xuICBhc3luYyB2ZXJpZnlSZWNpcGllbnRCeVRva2VuKHRva2VuOiBzdHJpbmcsIG5vdyA9IG5ldyBEYXRlKCkpOiBQcm9taXNlPFJlcG9ydFJlY2lwaWVudCB8IG51bGw+IHtcbiAgICBjb25zdCB0b2tlbkhhc2ggPSBoYXNoVG9rZW4odG9rZW4pO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAgIC5zZXQoeyB2ZXJpZmllZEF0OiBub3csIHZlcmlmaWNhdGlvblRva2VuSGFzaDogbnVsbCB9KVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQudmVyaWZpY2F0aW9uVG9rZW5IYXNoLCB0b2tlbkhhc2gpLFxuICAgICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UmVjaXBpZW50LnZlcmlmaWVkQXQpLFxuICAgICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UmVjaXBpZW50LmRlbGV0ZWRBdCksXG4gICAgICAgICAgLy8gQSB0b2tlbiBvbGRlciB0aGFuIHRoZSB3aW5kb3cgaXMgbm90IGFjY2VwdGVkLiBgY3JlYXRlZF9hdGAgaXMgdGhlXG4gICAgICAgICAgLy8gZmxvb3IgZm9yIHRoZSBmaXJzdCB0b2tlbjsgYSByZXNlbmQgcmVmcmVzaGVzIHRoZSBoYXNoLCBzbyB0aGlzIGJvdW5kc1xuICAgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBtaW50IGFuZCBpcyBkZWxpYmVyYXRlbHkgZ2VuZXJvdXMuXG4gICAgICAgICAgc3FsYCR7c2NoZW1hLnJlcG9ydFJlY2lwaWVudC5jcmVhdGVkQXR9ID4gJHtuZXcgRGF0ZShub3cuZ2V0VGltZSgpIC0gVkVSSUZJQ0FUSU9OX1RUTF9NUyl9YCxcbiAgICAgICAgKSlcbiAgICAgICAgLnJldHVybmluZygpKSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIFJlcG9ydFJlY2lwaWVudFtdKVswXSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIEhvbm91ciBhbiB1bnN1YnNjcmliZSBhY3Jvc3MgZXZlcnkgZGVmaW5pdGlvbiBpbiB0aGUgb3JnLiAqL1xuICBhc3luYyB1bnN1YnNjcmliZUJ5RW1haWwob3JnSWQ6IHN0cmluZywgZW1haWw6IHN0cmluZywgbm93ID0gbmV3IERhdGUoKSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJlY2lwaWVudClcbiAgICAgIC5zZXQoeyB1bnN1YnNjcmliZWRBdDogbm93IH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50Lm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZW1haWwsIGVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQudW5zdWJzY3JpYmVkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoeyBpZDogc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5pZCB9KSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIHVua25vd25bXSkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb25vdXIgYW4gdW5zdWJzY3JpYmUgZnJvbSB0aGUgbGluayBpbiBhIHJlcG9ydCBlbWFpbC5cbiAgICpcbiAgICogTG9va2VkIHVwIGJ5IFRPS0VOIGFjcm9zcyBvcmdzLCBhcyBzeXNhZG1pbiwgZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgc2hhcmUtbGlua1xuICAgKiByZXNvbHZlIGlzOiB0aGUgcGVyc29uIGNsaWNraW5nIGhhcyBubyBhY2NvdW50IGFuZCBubyB0ZW5hbnQsIGFuZCB0aGUgdG9rZW4gaXMgdGhlXG4gICAqIG9ubHkgdGhpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSByb3cuIEl0IGlzIHRoZSBuYXJyb3dlc3QgcG9zc2libGUgc2hhcGUg4oCUIG9uZSBpbmRleGVkXG4gICAqIGxvb2t1cCwgb25lIGNvbHVtbiB3cml0dGVuLCBub3RoaW5nIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgYnV0IHdoZXRoZXIgYSByb3dcbiAgICogbWF0Y2hlZC5cbiAgICpcbiAgICogSWRlbXBvdGVudC4gQSBtYWlsIGNsaWVudCB0aGF0IHNlbmRzIHRoZSBvbmUtY2xpY2sgUE9TVCB0d2ljZSwgb3IgYSBtYW5hZ2VyIHdob1xuICAgKiBjbGlja3MgYWdhaW4gbW9udGhzIGxhdGVyLCBnZXRzIHRoZSBzYW1lIGFuc3dlciByYXRoZXIgdGhhbiBhbiBlcnJvciBwYWdlIOKAlCB0aGVcbiAgICogc2Vjb25kIGNhbGwgZmluZHMgdGhlIHJvdyBhbHJlYWR5IHVuc3Vic2NyaWJlZCBhbmQgcmVwb3J0cyBzdWNjZXNzLCBiZWNhdXNlIGZyb20gdGhlXG4gICAqIGNsaWNrZXIncyBwb2ludCBvZiB2aWV3IGl0IGlzLlxuICAgKi9cbiAgYXN5bmMgdW5zdWJzY3JpYmVCeVRva2VuKHRva2VuOiBzdHJpbmcsIG5vdyA9IG5ldyBEYXRlKCkpOiBQcm9taXNlPFVuc3Vic2NyaWJlUmVzdWx0PiB7XG4gICAgaWYgKHRva2VuLmxlbmd0aCA8IDE2KSByZXR1cm4geyBtYXRjaGVkOiBmYWxzZSB9O1xuICAgIHJldHVybiBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAgIC5zZXQoeyB1bnN1YnNjcmliZWRBdDogc3FsYENPQUxFU0NFKCR7c2NoZW1hLnJlcG9ydFJlY2lwaWVudC51bnN1YnNjcmliZWRBdH0sICR7bm93fSlgIH0pXG4gICAgICAgIC53aGVyZShlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50LnVuc3Vic2NyaWJlVG9rZW4sIHRva2VuKSlcbiAgICAgICAgLnJldHVybmluZyh7XG4gICAgICAgICAgaWQ6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuaWQsXG4gICAgICAgICAgb3JnSWQ6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQub3JnSWQsXG4gICAgICAgICAgZW1haWw6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZW1haWwsXG4gICAgICAgICAgdW5zdWJzY3JpYmVkQXQ6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQudW5zdWJzY3JpYmVkQXQsXG4gICAgICAgIH0pKTtcbiAgICAgIGNvbnN0IHJvdyA9IChyb3dzIGFzIEFycmF5PHsgaWQ6IHN0cmluZzsgb3JnSWQ6IHN0cmluZzsgZW1haWw6IHN0cmluZzsgdW5zdWJzY3JpYmVkQXQ6IERhdGUgfCBudWxsIH0+KVswXTtcbiAgICAgIGlmICghcm93KSByZXR1cm4geyBtYXRjaGVkOiBmYWxzZSB9O1xuICAgICAgLy8gQ09BTEVTQ0Uga2VwdCBhbiBlYXJsaWVyIGluc3RhbnQg4oeSIHRoaXMgY2xpY2sgY2hhbmdlZCBub3RoaW5nLiBPbmx5IHRoZVxuICAgICAgLy8gRklSU1QgdW5zdWJzY3JpYmUgaXMgYSBzdGF0ZSBjaGFuZ2Ugd29ydGggcmVjb3JkaW5nLCB3aGljaCBpcyBhbHNvIHdoYXRcbiAgICAgIC8vIGtlZXBzIGFuIGV4dGVybmFsbHktdHJpZ2dlcmVkIHJvdXRlIGZyb20gd3JpdGluZyB1bmJvdW5kZWQgYXVkaXQgcm93cy5cbiAgICAgIGNvbnN0IG5ld2x5ID0gcm93LnVuc3Vic2NyaWJlZEF0ICE9PSBudWxsICYmIG5ldyBEYXRlKHJvdy51bnN1YnNjcmliZWRBdCkuZ2V0VGltZSgpID09PSBub3cuZ2V0VGltZSgpO1xuICAgICAgcmV0dXJuIHsgbWF0Y2hlZDogdHJ1ZSwgcmVjaXBpZW50OiB7IGlkOiByb3cuaWQsIG9yZ0lkOiByb3cub3JnSWQsIGVtYWlsOiByb3cuZW1haWwgfSwgbmV3bHlVbnN1YnNjcmliZWQ6IG5ld2x5IH07XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVjb3JkIGEgZGVsaXZlcnkgYm91bmNlLiBBdCB7QGxpbmsgTUFYX0JPVU5DRVN9IHRoZSBhZGRyZXNzIGlzIHNraXBwZWQuICovXG4gIGFzeW5jIHJlY29yZEJvdW5jZShvcmdJZDogc3RyaW5nLCBlbWFpbDogc3RyaW5nLCBub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAuc2V0KHsgYm91bmNlQ291bnQ6IHNxbGAke3NjaGVtYS5yZXBvcnRSZWNpcGllbnQuYm91bmNlQ291bnR9ICsgMWAsIGxhc3RCb3VuY2VBdDogbm93IH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50Lm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZW1haWwsIGVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKHsgYm91bmNlQ291bnQ6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuYm91bmNlQ291bnQgfSkpO1xuICAgIHJldHVybiAocm93cyBhcyBBcnJheTx7IGJvdW5jZUNvdW50OiBudW1iZXIgfT4pWzBdPy5ib3VuY2VDb3VudCA/PyAwO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlUmVjaXBpZW50KG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGRlbGV0ZWRCeTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAuc2V0KHsgZGVsZXRlZEF0OiBub3csIGRlbGV0ZWRCeSwgLi4ucHVyZ2VTdGFtcChub3cpIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50LmlkLCBpZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZGVsZXRlZEF0KSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuaWQgfSkpO1xuICAgIGlmICgocm93cyBhcyB1bmtub3duW10pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ1JlY2lwaWVudCBub3QgZm91bmQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXMgdGhpcyBhZGRyZXNzIGRlbGl2ZXJhYmxlIHJpZ2h0IG5vdz8gVGhlIHNpbmdsZSBwbGFjZSB0aGUgZGVsaXZlcnkgcnVsZXNcbiAgICogbGl2ZSwgc28gdGhlIHNjaGVkdWxlciBhbmQgdGhlIFVJIGFncmVlIGFib3V0IHdoeSBhIHJlY2lwaWVudCBpcyBiZWluZ1xuICAgKiBza2lwcGVkLlxuICAgKi9cbiAgZGVsaXZlcmFiaWxpdHkocmVjaXBpZW50OiBSZXBvcnRSZWNpcGllbnQpOiB7IGRlbGl2ZXJhYmxlOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSB7XG4gICAgaWYgKHJlY2lwaWVudC5kZWxldGVkQXQpIHJldHVybiB7IGRlbGl2ZXJhYmxlOiBmYWxzZSwgcmVhc29uOiAncmVtb3ZlZCcgfTtcbiAgICBpZiAocmVjaXBpZW50LnVuc3Vic2NyaWJlZEF0KSByZXR1cm4geyBkZWxpdmVyYWJsZTogZmFsc2UsIHJlYXNvbjogJ3Vuc3Vic2NyaWJlZCcgfTtcbiAgICBpZiAoIXJlY2lwaWVudC52ZXJpZmllZEF0KSByZXR1cm4geyBkZWxpdmVyYWJsZTogZmFsc2UsIHJlYXNvbjogJ3BlbmRpbmdfdmVyaWZpY2F0aW9uJyB9O1xuICAgIGlmIChyZWNpcGllbnQuYm91bmNlQ291bnQgPj0gTUFYX0JPVU5DRVMpIHJldHVybiB7IGRlbGl2ZXJhYmxlOiBmYWxzZSwgcmVhc29uOiAnYm91bmNpbmcnIH07XG4gICAgcmV0dXJuIHsgZGVsaXZlcmFibGU6IHRydWUgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWNpcGllbnQgcG9saWN5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUaGUgb3JnJ3MgYWRtaW4tb3duZWQgcmVwb3J0IHBvbGljeS4gUmVhZCB0aHJvdWdoIHRoZSByZXBvcnRpbmcgc2V0dGluZ3Mgcm93LFxuICAgKiB3aGljaCBtYXkgbm90IGV4aXN0IOKAlCBhbiBvcmcgdGhhdCBoYXMgbmV2ZXIgY29uZmlndXJlZCBhbnl0aGluZyBnZXRzIHRoZVxuICAgKiBjbG9zZWQgZGVmYXVsdHMgKG5vIGV4dGVybmFsIHNoYXJpbmcsIG5vIGV4dGVybmFsIGRvbWFpbnMsIGFwcHJvdmFsIHJlcXVpcmVkKS5cbiAgICovXG4gIGFzeW5jIGdldFJlcG9ydFBvbGljeShvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgZXh0ZXJuYWxTaGFyaW5nOiBib29sZWFuO1xuICAgIHJlY2lwaWVudERvbWFpbnM6IHN0cmluZ1tdIHwgbnVsbDtcbiAgICByZXF1aXJlQXBwcm92YWw6IGJvb2xlYW47XG4gICAgZGVmYXVsdFRpbWV6b25lOiBzdHJpbmcgfCBudWxsO1xuICAgIGRlZmF1bHRXZWVrU3RhcnQ6IHN0cmluZyB8IG51bGw7XG4gIH0+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KHtcbiAgICAgIGV4dGVybmFsU2hhcmluZzogc2NoZW1hLmRvcmFTZXR0aW5ncy5yZXBvcnRFeHRlcm5hbFNoYXJpbmcsXG4gICAgICByZWNpcGllbnREb21haW5zOiBzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydFJlY2lwaWVudERvbWFpbnMsXG4gICAgICByZXF1aXJlQXBwcm92YWw6IHNjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0UmVxdWlyZUFwcHJvdmFsLFxuICAgICAgZGVmYXVsdFRpbWV6b25lOiBzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydERlZmF1bHRUaW1lem9uZSxcbiAgICAgIGRlZmF1bHRXZWVrU3RhcnQ6IHNjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0RGVmYXVsdFdlZWtTdGFydCxcbiAgICB9KS5mcm9tKHNjaGVtYS5kb3JhU2V0dGluZ3MpLndoZXJlKGVxKHNjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWQsIG9yZ0lkKSkubGltaXQoMSkpO1xuICAgIGNvbnN0IHJvdyA9IChyb3dzIGFzIEFycmF5PHtcbiAgICAgIGV4dGVybmFsU2hhcmluZzogYm9vbGVhbjtcbiAgICAgIHJlY2lwaWVudERvbWFpbnM6IHN0cmluZ1tdIHwgbnVsbDtcbiAgICAgIHJlcXVpcmVBcHByb3ZhbDogYm9vbGVhbjtcbiAgICAgIGRlZmF1bHRUaW1lem9uZTogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGRlZmF1bHRXZWVrU3RhcnQ6IHN0cmluZyB8IG51bGw7XG4gICAgfT4pWzBdO1xuICAgIHJldHVybiB7XG4gICAgICBleHRlcm5hbFNoYXJpbmc6IHJvdz8uZXh0ZXJuYWxTaGFyaW5nID8/IGZhbHNlLFxuICAgICAgcmVjaXBpZW50RG9tYWluczogcm93Py5yZWNpcGllbnREb21haW5zID8/IG51bGwsXG4gICAgICByZXF1aXJlQXBwcm92YWw6IHJvdz8ucmVxdWlyZUFwcHJvdmFsID8/IHRydWUsXG4gICAgICAvLyBOVUxMIHJhdGhlciB0aGFuIGEgZ3Vlc3NlZCB6b25lOiB0aGUgY3JlYXRlIGZvcm0gZmFsbHMgYmFjayB0byB0aGUgQlJPV1NFUidzIHpvbmUsXG4gICAgICAvLyB3aGljaCBpcyBhIGJldHRlciBkZWZhdWx0IHRoYW4gdGhlIHNlcnZlcidzIGFuZCBpcyB2aXNpYmx5IHRoZSBsZWFkJ3Mgb3duLlxuICAgICAgZGVmYXVsdFRpbWV6b25lOiByb3c/LmRlZmF1bHRUaW1lem9uZSA/PyBudWxsLFxuICAgICAgZGVmYXVsdFdlZWtTdGFydDogcm93Py5kZWZhdWx0V2Vla1N0YXJ0ID8/IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNldFJlcG9ydFBvbGljeShvcmdJZDogc3RyaW5nLCBwYXRjaDoge1xuICAgIGV4dGVybmFsU2hhcmluZz86IGJvb2xlYW47XG4gICAgcmVjaXBpZW50RG9tYWlucz86IHN0cmluZ1tdIHwgbnVsbDtcbiAgICByZXF1aXJlQXBwcm92YWw/OiBib29sZWFuO1xuICAgIGRlZmF1bHRUaW1lem9uZT86IHN0cmluZyB8IG51bGw7XG4gICAgZGVmYXVsdFdlZWtTdGFydD86IHN0cmluZyB8IG51bGw7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfTtcbiAgICBpZiAocGF0Y2guZXh0ZXJuYWxTaGFyaW5nICE9PSB1bmRlZmluZWQpIHNldC5yZXBvcnRFeHRlcm5hbFNoYXJpbmcgPSBwYXRjaC5leHRlcm5hbFNoYXJpbmc7XG4gICAgaWYgKHBhdGNoLnJlY2lwaWVudERvbWFpbnMgIT09IHVuZGVmaW5lZCkgc2V0LnJlcG9ydFJlY2lwaWVudERvbWFpbnMgPSBwYXRjaC5yZWNpcGllbnREb21haW5zO1xuICAgIGlmIChwYXRjaC5yZXF1aXJlQXBwcm92YWwgIT09IHVuZGVmaW5lZCkgc2V0LnJlcG9ydFJlcXVpcmVBcHByb3ZhbCA9IHBhdGNoLnJlcXVpcmVBcHByb3ZhbDtcbiAgICBpZiAocGF0Y2guZGVmYXVsdFRpbWV6b25lICE9PSB1bmRlZmluZWQpIHNldC5yZXBvcnREZWZhdWx0VGltZXpvbmUgPSBwYXRjaC5kZWZhdWx0VGltZXpvbmU7XG4gICAgaWYgKHBhdGNoLmRlZmF1bHRXZWVrU3RhcnQgIT09IHVuZGVmaW5lZCkgc2V0LnJlcG9ydERlZmF1bHRXZWVrU3RhcnQgPSBwYXRjaC5kZWZhdWx0V2Vla1N0YXJ0O1xuICAgIGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEuZG9yYVNldHRpbmdzKS52YWx1ZXMoe1xuICAgICAgb3JnSWQsXG4gICAgICByZXBvcnRFeHRlcm5hbFNoYXJpbmc6IHBhdGNoLmV4dGVybmFsU2hhcmluZyA/PyBmYWxzZSxcbiAgICAgIHJlcG9ydFJlY2lwaWVudERvbWFpbnM6IHBhdGNoLnJlY2lwaWVudERvbWFpbnMgPz8gbnVsbCxcbiAgICAgIHJlcG9ydFJlcXVpcmVBcHByb3ZhbDogcGF0Y2gucmVxdWlyZUFwcHJvdmFsID8/IHRydWUsXG4gICAgICByZXBvcnREZWZhdWx0VGltZXpvbmU6IHBhdGNoLmRlZmF1bHRUaW1lem9uZSA/PyBudWxsLFxuICAgICAgcmVwb3J0RGVmYXVsdFdlZWtTdGFydDogcGF0Y2guZGVmYXVsdFdlZWtTdGFydCA/PyBudWxsLFxuICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7IHRhcmdldDogc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCwgc2V0IH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhIFN0YWtlaG9sZGVyIFJlcG9ydHMgZW50aXRsZW1lbnQgY2hhbmdlIGZyb20gYmlsbGluZzogcGF1c2UgZXZlcnl0aGluZywgb3JcbiAgICogcmVzdW1lIHdoYXQgdGhlIGxhcHNlIHBhdXNlZC5cbiAgICpcbiAgICogVEhFIFdBVEVSTUFSSyBBTkQgVEhFIFdPUksgQVJFIE9ORSBUUkFOU0FDVElPTiwgYW5kIHRoZSB3YXRlcm1hcmsgdXBkYXRlIGlzIHdoYXRcbiAgICogc2VyaWFsaXplcyBjb25jdXJyZW50IHB1c2hlcy4gQmlsbGluZydzIGxlZ3MgYXJlIGJlc3QtZWZmb3J0IGFuZCByZXRyaWVkLCBzb1xuICAgKiBcImxhcHNlZCBhdCAxMDowMFwiIGFuZCBcInJlbmV3ZWQgYXQgMTA6MDVcIiBjYW4gYXJyaXZlIGluIGVpdGhlciBvcmRlcjsgYXBwbHlpbmcgdGhlXG4gICAqIG9sZGVyIG9uZSBsYXN0IHdvdWxkIGxlYXZlIGEgbGFwc2VkIGFjY291bnQgcHJvZHVjaW5nIHJlcG9ydHMsIG9yIGEgcGF5aW5nIG9uZVxuICAgKiBwYXVzZWQuIFRoZSBjb25kaXRpb25hbCB1cGRhdGUgdGFrZXMgYSByb3cgbG9jayBvbiBgZG9yYV9zZXR0aW5nc2AsIHNvIGEgc2Vjb25kXG4gICAqIHB1c2ggd2FpdHMgYW5kIHRoZW4gc2VlcyB0aGUgbmV3ZXIgd2F0ZXJtYXJrIOKAlCBubyBhZHZpc29yeSBsb2NrIG5lZWRlZC5cbiAgICpcbiAgICogUkVTVU1FIElTIFNDT1BFRCBUTyBgZW50aXRsZW1lbnRgLiBJdCBtdXN0IG5vdCB1bi1wYXVzZSBhIGRlZmluaXRpb24gd2hvc2UgT1dORVIgd2FzXG4gICAqIGRlYWN0aXZhdGVkIG9yIHdobyBsb3N0IHRoZSBwZXJtaXNzaW9uOiB0aG9zZSBhcmUgZGlmZmVyZW50IHByb2JsZW1zIHdpdGggZGlmZmVyZW50XG4gICAqIGZpeGVzLCBhbmQgcmVzdW1pbmcgb25lIGJ5IGZpeGluZyB0aGUgb3RoZXIgaXMgaG93IGEgcmVwb3J0IHN0YXJ0cyBydW5uaW5nIHVuZGVyXG4gICAqIHNvbWVib2R5IHdobyBsZWZ0LlxuICAgKlxuICAgKiBgbmV4dFJ1bkZvcmAgaXMgYSBjYWxsYmFjayBiZWNhdXNlIHRoZSBwZXJpb2QgYXJpdGhtZXRpYyBuZWVkcyBlYWNoIGRlZmluaXRpb24nc1xuICAgKiBjYWRlbmNlLCB0aW1lem9uZSBhbmQgd2VlayBzdGFydCwgYW5kIHRoYXQgYmVsb25ncyB3aXRoIHRoZSBwZXJpb2QgcmVzb2x2ZXIgcmF0aGVyXG4gICAqIHRoYW4gdGhlIHN0b3JlIOKAlCB3aGlsZSB0aGUgd3JpdGUgc3RpbGwgaGFzIHRvIGhhcHBlbiBpbnNpZGUgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogVGhpcyBsZWcgbWFrZXMgdGhlIGNoYW5nZSBJTU1FRElBVEU7IGl0IGlzIG5vdCB3aGF0IG1ha2VzIGl0IHNhZmUuIEV2ZXJ5IHNjaGVkdWxlZFxuICAgKiBydW4gcmUtY2hlY2tzIHRoZSBlbnRpdGxlbWVudCBhZ2FpbnN0IHBsYXRmb3JtIGFueXdheSwgc28gYSBsb3N0IHB1c2ggZGVsYXlzXG4gICAqIGVuZm9yY2VtZW50IHRvIHRoZSBuZXh0IHJ1biByYXRoZXIgdGhhbiBkZWZlYXRpbmcgaXQuXG4gICAqL1xuICBhc3luYyBzeW5jUmVwb3J0RW50aXRsZW1lbnQoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBlbnRpdGxlZDogYm9vbGVhbixcbiAgICBvcHRzOiB7IG9jY3VycmVkQXQ/OiBEYXRlOyBuZXh0UnVuRm9yPzogKGQ6IFJlcG9ydERlZmluaXRpb24pID0+IERhdGU7IG5vdz86IERhdGUgfSA9IHt9LFxuICApOiBQcm9taXNlPHsgc2tpcHBlZDogYm9vbGVhbjsgcGF1c2VkOiBSZXBvcnREZWZpbml0aW9uW107IHJlc3VtZWQ6IFJlcG9ydERlZmluaXRpb25bXSB9PiB7XG4gICAgY29uc3Qgbm93ID0gb3B0cy5ub3cgPz8gbmV3IERhdGUoKTtcbiAgICBjb25zdCBvY2N1cnJlZEF0ID0gb3B0cy5vY2N1cnJlZEF0ID8/IG5vdztcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgLy8gVGhlIGNsYWltLiBBIHB1c2ggYXQgb3IgYmVmb3JlIHRoZSBsYXN0IGFwcGxpZWQgY2hhbmdlIHVwZGF0ZXMgemVybyByb3dzLlxuICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHR4Lmluc2VydChzY2hlbWEuZG9yYVNldHRpbmdzKVxuICAgICAgICAudmFsdWVzKHsgb3JnSWQsIHJlcG9ydEVudGl0bGVtZW50U3luY2VkQXQ6IG9jY3VycmVkQXQgfSlcbiAgICAgICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgICAgdGFyZ2V0OiBzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkLFxuICAgICAgICAgIHNldDogeyByZXBvcnRFbnRpdGxlbWVudFN5bmNlZEF0OiBvY2N1cnJlZEF0LCB1cGRhdGVkQXQ6IG5vdyB9LFxuICAgICAgICAgIHNldFdoZXJlOiBzcWxgJHtzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydEVudGl0bGVtZW50U3luY2VkQXR9IElTIE5VTExcbiAgICAgICAgICAgIE9SICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5yZXBvcnRFbnRpdGxlbWVudFN5bmNlZEF0fSA8ICR7b2NjdXJyZWRBdH1gLFxuICAgICAgICB9KVxuICAgICAgICAucmV0dXJuaW5nKHsgb3JnSWQ6IHNjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWQgfSk7XG4gICAgICBpZiAoKGNsYWltZWQgYXMgdW5rbm93bltdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHsgc2tpcHBlZDogdHJ1ZSwgcGF1c2VkOiBbXSwgcmVzdW1lZDogW10gfTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbnRpdGxlZCkge1xuICAgICAgICBjb25zdCByb3dzID0gYXdhaXQgdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgICAgIC5zZXQoeyBpc0FjdGl2ZTogZmFsc2UsIHBhdXNlZFJlYXNvbjogJ2VudGl0bGVtZW50JywgbmV4dFJ1bkF0OiBudWxsLCB1cGRhdGVkQXQ6IG5vdyB9KVxuICAgICAgICAgIC53aGVyZShhbmQoXG4gICAgICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaXNBY3RpdmUsIHRydWUpLFxuICAgICAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICAgICAgKSlcbiAgICAgICAgICAucmV0dXJuaW5nKCk7XG4gICAgICAgIHJldHVybiB7IHNraXBwZWQ6IGZhbHNlLCBwYXVzZWQ6IHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdLCByZXN1bWVkOiBbXSB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXVzZWQgPSBhd2FpdCB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm9yZ0lkLCBvcmdJZCksXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaXNBY3RpdmUsIGZhbHNlKSxcbiAgICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5wYXVzZWRSZWFzb24sICdlbnRpdGxlbWVudCcpLFxuICAgICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgICApKSBhcyBSZXBvcnREZWZpbml0aW9uW107XG4gICAgICBjb25zdCByZXN1bWVkOiBSZXBvcnREZWZpbml0aW9uW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZGVmaW5pdGlvbiBvZiBwYXVzZWQpIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbilcbiAgICAgICAgICAuc2V0KHtcbiAgICAgICAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgcGF1c2VkUmVhc29uOiBudWxsLFxuICAgICAgICAgICAgbmV4dFJ1bkF0OiBvcHRzLm5leHRSdW5Gb3IgPyBvcHRzLm5leHRSdW5Gb3IoZGVmaW5pdGlvbikgOiBudWxsLFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2hlcmUoZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGRlZmluaXRpb24uaWQpKVxuICAgICAgICAgIC5yZXR1cm5pbmcoKTtcbiAgICAgICAgY29uc3Qgcm93ID0gKHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdKVswXTtcbiAgICAgICAgaWYgKHJvdykgcmVzdW1lZC5wdXNoKHJvdyk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBza2lwcGVkOiBmYWxzZSwgcGF1c2VkOiBbXSwgcmVzdW1lZCB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRoZSBmcmVlIHByZXZpZXcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIENsYWltIHRoZSBvcmcncyBPTkUgZnJlZSBwcmV2aWV3LCBvciByZXBvcnQgdGhhdCBpdCBpcyBhbHJlYWR5IHNwZW50LlxuICAgKlxuICAgKiBBIENPTkRJVElPTkFMIGluc2VydC1vci11cGRhdGUsIG5vdCByZWFkLXRoZW4td3JpdGU6IHR3byB0YWJzIGNsaWNraW5nIFwic2VlIGEgc2FtcGxlXCJcbiAgICogYXQgdGhlIHNhbWUgbW9tZW50IG11c3QgcHJvZHVjZSBvbmUgcHJldmlldywgYW5kIGEgY2hlY2sgZm9sbG93ZWQgYnkgYSBzZXBhcmF0ZSB3cml0ZVxuICAgKiBoYXMgYSB3aW5kb3cgYmV0d2VlbiB0aGVtIHdpZGUgZW5vdWdoIGZvciBib3RoIHRvIHBhc3MuIGBXSEVSRSByZXBvcnRfcHJldmlld191c2VkX2F0XG4gICAqIElTIE5VTExgIG9uIHRoZSB1cGRhdGUsIGFuZCBgb25Db25mbGljdERvVXBkYXRlYCBmb3IgdGhlIHJvdyB0aGF0IG1heSBub3QgZXhpc3QgeWV0LFxuICAgKiBtYWtlIHRoZSBjbGFpbSBpdHNlbGYgdGhlIGd1YXJkLlxuICAgKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgVEhJUyBjYWxsZXIgd29uIGl0LiBBIGxvc2VyIGlzIHRvbGQgdGhlIHByZXZpZXcgaXMgc3BlbnQsIHdoaWNoIGlzXG4gICAqIHRoZSB0cnV0aCBhbmQgaXMgYWxzbyB0aGUgdXBzZWxsLlxuICAgKi9cbiAgYXN5bmMgY2xhaW1SZXBvcnRQcmV2aWV3KG9yZ0lkOiBzdHJpbmcsIG5vdyA9IG5ldyBEYXRlKCkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5kb3JhU2V0dGluZ3MpXG4gICAgICAudmFsdWVzKHsgb3JnSWQsIHJlcG9ydFByZXZpZXdVc2VkQXQ6IG5vdyB9KVxuICAgICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCxcbiAgICAgICAgc2V0OiB7IHJlcG9ydFByZXZpZXdVc2VkQXQ6IG5vdywgdXBkYXRlZEF0OiBub3cgfSxcbiAgICAgICAgLy8gVGhlIHByZWRpY2F0ZSBpcyB3aGF0IG1ha2VzIHRoaXMgb25jZS1ldmVyOiBhbiBvcmcgd2hvc2Ugcm93IGFscmVhZHkgY2FycmllcyBhXG4gICAgICAgIC8vIHRpbWVzdGFtcCB1cGRhdGVzIHplcm8gcm93cyBhbmQgcmV0dXJucyBub3RoaW5nLlxuICAgICAgICBzZXRXaGVyZTogaXNOdWxsKHNjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0UHJldmlld1VzZWRBdCksXG4gICAgICB9KVxuICAgICAgLnJldHVybmluZyh7IG9yZ0lkOiBzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkIH0pKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgdW5rbm93bltdKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIG9yZyBoYXMgYWxyZWFkeSBzcGVudCBpdHMgZnJlZSBwcmV2aWV3LiAqL1xuICBhc3luYyByZXBvcnRQcmV2aWV3VXNlZChvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCh7IGF0OiBzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydFByZXZpZXdVc2VkQXQgfSlcbiAgICAgIC5mcm9tKHNjaGVtYS5kb3JhU2V0dGluZ3MpXG4gICAgICAud2hlcmUoZXEoc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCwgb3JnSWQpKVxuICAgICAgLmxpbWl0KDEpKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgQXJyYXk8eyBhdDogRGF0ZSB8IG51bGwgfT4pWzBdPy5hdCAhPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElzIGBlbWFpbGAgYWRtaXNzaWJsZSBhcyBhIHJlY2lwaWVudCBmb3IgdGhpcyBvcmcsIGFuZCBkb2VzIGl0IG5lZWQgYW5cbiAgICogYWRtaW4ncyBhcHByb3ZhbCBmaXJzdD9cbiAgICpcbiAgICogYG9yZ01lbWJlckVtYWlsc2AgaXMgdGhlIHNldCBvZiBhZGRyZXNzZXMgdGhhdCBhbHJlYWR5IGF1dGhlbnRpY2F0ZSB0byB0aGlzXG4gICAqIG9yZyDigJQgdGhleSBhcmUgYWx3YXlzIGFkbWlzc2libGUgYW5kIG5ldmVyIG5lZWQgdmVyaWZpY2F0aW9uLCBiZWNhdXNlIHRoZSBvcmdcbiAgICogaGFzIGFscmVhZHkgZXN0YWJsaXNoZWQgdGhleSBiZWxvbmcgdG8gaXQuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBtZWFzdXJlZCBhZ2FpbnN0XG4gICAqIHRoZSBhbGxvd2VkLWRvbWFpbiBsaXN0LCBhbmQgYSBOVUxMIGxpc3QgbWVhbnMgXCJubyBleHRlcm5hbCBhZGRyZXNzZXMgYXQgYWxsXCIsXG4gICAqIG5vdCBcImFueSBhZGRyZXNzXCI6IHRoZSBjbG9zZWQgcmVhZGluZyBpcyB0aGUgb25lIHRoYXQgY2Fubm90IGxlYWsgYSByZXBvcnQgYnlcbiAgICogYW4gYWRtaW4gZm9yZ2V0dGluZyB0byBjb25maWd1cmUgc29tZXRoaW5nLlxuICAgKi9cbiAgYWRtaXRSZWNpcGllbnQoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBwb2xpY3k6IHsgcmVjaXBpZW50RG9tYWluczogc3RyaW5nW10gfCBudWxsOyByZXF1aXJlQXBwcm92YWw6IGJvb2xlYW4gfSxcbiAgICBvcmdNZW1iZXJFbWFpbHM6IFJlYWRvbmx5U2V0PHN0cmluZz4sXG4gICk6IHsgYWRtaXR0ZWQ6IHRydWU7IG1lbWJlcjogYm9vbGVhbjsgbmVlZHNBcHByb3ZhbDogYm9vbGVhbiB9IHwgeyBhZG1pdHRlZDogZmFsc2U7IHJlYXNvbjogc3RyaW5nIH0ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBlbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAob3JnTWVtYmVyRW1haWxzLmhhcyhub3JtYWxpemVkKSkgcmV0dXJuIHsgYWRtaXR0ZWQ6IHRydWUsIG1lbWJlcjogdHJ1ZSwgbmVlZHNBcHByb3ZhbDogZmFsc2UgfTtcblxuICAgIGNvbnN0IGF0ID0gbm9ybWFsaXplZC5sYXN0SW5kZXhPZignQCcpO1xuICAgIGNvbnN0IGRvbWFpbiA9IGF0ID49IDAgPyBub3JtYWxpemVkLnNsaWNlKGF0ICsgMSkgOiAnJztcbiAgICBpZiAoIWRvbWFpbikgcmV0dXJuIHsgYWRtaXR0ZWQ6IGZhbHNlLCByZWFzb246ICdOb3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLicgfTtcblxuICAgIGNvbnN0IGFsbG93ZWQgPSBwb2xpY3kucmVjaXBpZW50RG9tYWlucztcbiAgICBpZiAoIWFsbG93ZWQgfHwgYWxsb3dlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkbWl0dGVkOiBmYWxzZSxcbiAgICAgICAgcmVhc29uOiAnVGhpcyBvcmdhbml6YXRpb24gb25seSBkZWxpdmVycyByZXBvcnRzIHRvIGl0cyBvd24gbWVtYmVycy4gJ1xuICAgICAgICAgICsgJ0FuIGFkbWluaXN0cmF0b3IgY2FuIGFsbG93IHNwZWNpZmljIGV4dGVybmFsIGRvbWFpbnMgaW4gcmVwb3J0aW5nIHNldHRpbmdzLicsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBvayA9IGFsbG93ZWQuc29tZSgoZCkgPT4ge1xuICAgICAgY29uc3QgY2xlYW4gPSBkLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15ALywgJycpO1xuICAgICAgcmV0dXJuIGNsZWFuLmxlbmd0aCA+IDAgJiYgKGRvbWFpbiA9PT0gY2xlYW4gfHwgZG9tYWluLmVuZHNXaXRoKGAuJHtjbGVhbn1gKSk7XG4gICAgfSk7XG4gICAgaWYgKCFvaykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRtaXR0ZWQ6IGZhbHNlLFxuICAgICAgICByZWFzb246IGBSZXBvcnRzIGNhbiBvbmx5IGJlIHNlbnQgdG8gJHthbGxvd2VkLmpvaW4oJywgJyl9IGFkZHJlc3NlcyBpbiB0aGlzIG9yZ2FuaXphdGlvbi5gLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYWRtaXR0ZWQ6IHRydWUsIG1lbWJlcjogZmFsc2UsIG5lZWRzQXBwcm92YWw6IHBvbGljeS5yZXF1aXJlQXBwcm92YWwgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZXRlbnRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEhhcmQtZGVsZXRlIGV4cGlyZWQgdG9tYnN0b25lcyBhY3Jvc3MgZXZlcnkgb3JnLCBmb3IgdGhlIHNoYXJlZCBzb2Z0LWRlbGV0ZVxuICAgKiBzd2VlcC4gUnVucyBpbnNpZGUgdGhlIHN3ZWVwJ3Mgb3duIHN5c2FkbWluIHNjb3BlLlxuICAgKlxuICAgKiBSdW5zIGdvIGZpcnN0OiBhIHB1cmdlZCBkZWZpbml0aW9uIHdpdGggb3JwaGFuZWQgcnVucyB3b3VsZCBsZWF2ZSBzbmFwc2hvdHNcbiAgICogbm90aGluZyBjYW4gcmVhY2gsIGFuZCBzaGFyZSBsaW5rcyBhcmUgZGVsZXRlZCB3aXRoIHRoZWlyIHJ1bnMgc28gYSBwdXJnZVxuICAgKiBjYW5ub3QgbGVhdmUgYSBsaXZlIHRva2VuIHBvaW50aW5nIGF0IGEgcm93IHRoYXQgbm8gbG9uZ2VyIGV4aXN0cy5cbiAgICovXG4gIHB1cmdlYWJsZUVudGl0aWVzKCk6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBwdXJnZUV4cGlyZWQobm93OiBEYXRlLCBsaW1pdD86IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgbmFtZTogJ3JlcG9ydF9ydW4nLCBwdXJnZUV4cGlyZWQ6IChub3csIGxpbWl0KSA9PiB0aGlzLnB1cmdlUnVucyhub3csIGxpbWl0KSB9LFxuICAgICAgeyBuYW1lOiAncmVwb3J0X2RlZmluaXRpb24nLCBwdXJnZUV4cGlyZWQ6IChub3csIGxpbWl0KSA9PiB0aGlzLnB1cmdlRGVmaW5pdGlvbnMobm93LCBsaW1pdCkgfSxcbiAgICAgIHsgbmFtZTogJ3JlcG9ydF9yZWNpcGllbnQnLCBwdXJnZUV4cGlyZWQ6IChub3csIGxpbWl0KSA9PiB0aGlzLnB1cmdlUmVjaXBpZW50cyhub3csIGxpbWl0KSB9LFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1cmdlUnVucyhub3c6IERhdGUsIGxpbWl0ID0gNTAwKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3QgZHVlID0gYXdhaXQgdHguc2VsZWN0KHsgaWQ6IHNjaGVtYS5yZXBvcnRSdW4uaWQgfSkuZnJvbShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgICAud2hlcmUoYW5kKHNxbGAke3NjaGVtYS5yZXBvcnRSdW4uZGVsZXRlZEF0fSBJUyBOT1QgTlVMTGAsIGx0ZShzY2hlbWEucmVwb3J0UnVuLnB1cmdlQWZ0ZXIsIG5vdykpKVxuICAgICAgICAubGltaXQobGltaXQpO1xuICAgICAgY29uc3QgaWRzID0gKGR1ZSBhcyBBcnJheTx7IGlkOiBzdHJpbmcgfT4pLm1hcCgocikgPT4gci5pZCk7XG4gICAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgICBhd2FpdCB0eC5kZWxldGUoc2NoZW1hLnJlcG9ydFNoYXJlTGluaykud2hlcmUoaW5BcnJheShzY2hlbWEucmVwb3J0U2hhcmVMaW5rLnJ1bklkLCBpZHMpKTtcbiAgICAgIGNvbnN0IGdvbmUgPSBhd2FpdCB0eC5kZWxldGUoc2NoZW1hLnJlcG9ydFJ1bikud2hlcmUoaW5BcnJheShzY2hlbWEucmVwb3J0UnVuLmlkLCBpZHMpKVxuICAgICAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5yZXBvcnRSdW4uaWQgfSk7XG4gICAgICByZXR1cm4gKGdvbmUgYXMgdW5rbm93bltdKS5sZW5ndGg7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1cmdlRGVmaW5pdGlvbnMobm93OiBEYXRlLCBsaW1pdCA9IDUwMCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgIGNvbnN0IGR1ZSA9IGF3YWl0IHR4LnNlbGVjdCh7IGlkOiBzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCB9KS5mcm9tKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIHNxbGAke3NjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdH0gSVMgTk9UIE5VTExgLFxuICAgICAgICAgIGx0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5wdXJnZUFmdGVyLCBub3cpLFxuICAgICAgICApKVxuICAgICAgICAubGltaXQobGltaXQpO1xuICAgICAgY29uc3QgaWRzID0gKGR1ZSBhcyBBcnJheTx7IGlkOiBzdHJpbmcgfT4pLm1hcCgocikgPT4gci5pZCk7XG4gICAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgICAvLyBUaGUgZGVmaW5pdGlvbidzIHJ1bnMgKGFuZCB0aGVpciBsaW5rcykgZ28gd2l0aCBpdCwgdG9tYnN0b25lZCBvciBub3Q6XG4gICAgICAvLyBhIHNuYXBzaG90IHdob3NlIGRlZmluaXRpb24gaXMgZ29uZSBjYW4gbmV2ZXIgYmUgbGlzdGVkIGFnYWluLlxuICAgICAgY29uc3QgcnVucyA9IGF3YWl0IHR4LnNlbGVjdCh7IGlkOiBzY2hlbWEucmVwb3J0UnVuLmlkIH0pLmZyb20oc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgICAgLndoZXJlKGluQXJyYXkoc2NoZW1hLnJlcG9ydFJ1bi5kZWZpbml0aW9uSWQsIGlkcykpO1xuICAgICAgY29uc3QgcnVuSWRzID0gKHJ1bnMgYXMgQXJyYXk8eyBpZDogc3RyaW5nIH0+KS5tYXAoKHIpID0+IHIuaWQpO1xuICAgICAgaWYgKHJ1bklkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHR4LmRlbGV0ZShzY2hlbWEucmVwb3J0U2hhcmVMaW5rKS53aGVyZShpbkFycmF5KHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsucnVuSWQsIHJ1bklkcykpO1xuICAgICAgICBhd2FpdCB0eC5kZWxldGUoc2NoZW1hLnJlcG9ydFJ1bikud2hlcmUoaW5BcnJheShzY2hlbWEucmVwb3J0UnVuLmlkLCBydW5JZHMpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGdvbmUgPSBhd2FpdCB0eC5kZWxldGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pLndoZXJlKGluQXJyYXkoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkcykpXG4gICAgICAgIC5yZXR1cm5pbmcoeyBpZDogc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQgfSk7XG4gICAgICByZXR1cm4gKGdvbmUgYXMgdW5rbm93bltdKS5sZW5ndGg7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1cmdlUmVjaXBpZW50cyhub3c6IERhdGUsIGxpbWl0ID0gNTAwKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3QgZHVlID0gYXdhaXQgdHguc2VsZWN0KHsgaWQ6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuaWQgfSkuZnJvbShzY2hlbWEucmVwb3J0UmVjaXBpZW50KVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIHNxbGAke3NjaGVtYS5yZXBvcnRSZWNpcGllbnQuZGVsZXRlZEF0fSBJUyBOT1QgTlVMTGAsXG4gICAgICAgICAgbHRlKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQucHVyZ2VBZnRlciwgbm93KSxcbiAgICAgICAgKSlcbiAgICAgICAgLmxpbWl0KGxpbWl0KTtcbiAgICAgIGNvbnN0IGlkcyA9IChkdWUgYXMgQXJyYXk8eyBpZDogc3RyaW5nIH0+KS5tYXAoKHIpID0+IHIuaWQpO1xuICAgICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgICAgY29uc3QgZ29uZSA9IGF3YWl0IHR4LmRlbGV0ZShzY2hlbWEucmVwb3J0UmVjaXBpZW50KS53aGVyZShpbkFycmF5KHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuaWQsIGlkcykpXG4gICAgICAgIC5yZXR1cm5pbmcoeyBpZDogc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5pZCB9KTtcbiAgICAgIHJldHVybiAoZ29uZSBhcyB1bmtub3duW10pLmxlbmd0aDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBFdmVyeSBkZWZpbml0aW9uIHRoZSBvd25lciBtdXN0IGJlIHJlLWNoZWNrZWQgZm9yLCBmb3IgdGhlIHBhdXNlIHN3ZWVwLiAqL1xuICBhc3luYyBsaXN0T3duZWREZWZpbml0aW9ucyhvcmdJZDogc3RyaW5nLCBvd25lcklkOiBzdHJpbmcpOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb25bXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3duZXJJZCwgb3duZXJJZCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgKSkpO1xuICAgIHJldHVybiByb3dzIGFzIFJlcG9ydERlZmluaXRpb25bXTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUaGUgc2NoZWR1bGVyJ3MgcmVhZHMgYW5kIHdyaXRlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogRGVmaW5pdGlvbnMgd2hvc2UgbmV4dCBydW4gaXMgZHVlLCBhY3Jvc3MgZXZlcnkgb3JnLlxuICAgKlxuICAgKiBSdW5zIGFzIFNZU0FETUlOLCBiZWNhdXNlIHRoZSBzY2hlZHVsZXIgaGFzIG5vIHRlbmFudDogaXQgaXMgbG9va2luZyBmb3Igd29ya1xuICAgKiBpbiBvcmdzIGl0IGhhcyBub3QgYmVlbiB0b2xkIGFib3V0LiBUaGlzIGlzIHRoZSBvbmUgcmVhZCBoZXJlIHRoYXQgY3Jvc3NlcyBvcmdcbiAgICogYm91bmRhcmllcywgYW5kIGl0IGlzIGtlcHQgdG8gdGhlIG5hcnJvd2VzdCBwb3NzaWJsZSBzaGFwZSDigJQgdGhlIHJvd3MgbmVlZGVkIHRvXG4gICAqIGNsYWltIGFuZCBleGVjdXRlLCBvcmRlcmVkIG9sZGVzdC1kdWUgZmlyc3Qgc28gYSBiYWNrbG9nIGRyYWlucyBpbiBvcmRlciByYXRoZXJcbiAgICogdGhhbiBzdGFydmluZyB3aGljaGV2ZXIgb3JnIHNvcnRzIGxhc3QgYnkgaWQuXG4gICAqXG4gICAqIGBsaW1pdGAgaXMgdGhlIHBlci1jeWNsZSBjZWlsaW5nOiBhIGN5Y2xlIHRoYXQgdHJpZWQgdG8gZHJhaW4gZXZlcnl0aGluZyB3b3VsZFxuICAgKiBob2xkIHRoZSBsZWFkZXIgbG9jayBmb3IgYXMgbG9uZyBhcyB0aGUgc2xvd2VzdCBvcmcncyBjb21wb3NlIHRha2VzLCB0aW1lcyB0aGVcbiAgICogbnVtYmVyIG9mIGRlZmluaXRpb25zLlxuICAgKi9cbiAgYXN5bmMgZHVlRGVmaW5pdGlvbnMobm93OiBEYXRlLCBsaW1pdDogbnVtYmVyKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uW10+IHtcbiAgICByZXR1cm4gcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAgIC53aGVyZShhbmQoXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaXNBY3RpdmUsIHRydWUpLFxuICAgICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgICAgIGx0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5uZXh0UnVuQXQsIG5vdyksXG4gICAgICAgICkpXG4gICAgICAgIC5vcmRlckJ5KGFzYyhzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5uZXh0UnVuQXQpKVxuICAgICAgICAubGltaXQobGltaXQpKTtcbiAgICAgIHJldHVybiByb3dzIGFzIFJlcG9ydERlZmluaXRpb25bXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGFpbSBhIGR1ZSBkZWZpbml0aW9uIGJ5IGFkdmFuY2luZyBpdHMgYG5leHRSdW5BdGAsIGJ1dCBvbmx5IGlmIGl0IHN0aWxsIGhvbGRzXG4gICAqIHRoZSB2YWx1ZSB0aGUgc2NhbiBzYXcuXG4gICAqXG4gICAqIFRIRSBDT05ESVRJT05BTCBVUERBVEUgSVMgVEhFIENPTkNVUlJFTkNZIEdVQVJELCBub3QgdGhlIGxlYWRlciBsb2NrLiBUaGUgbG9ja1xuICAgKiBzdG9wcyB0d28gcmVwbGljYXMgc3dlZXBpbmcgaW4gdGhlIHNhbWUgd2luZG93OyBpdCBkb2VzIG5vdCBzdG9wIGEgc3dlZXAgdGhhdFxuICAgKiBvdXRsaXZlcyBpdHMgbG9jayBUVEwgZnJvbSBvdmVybGFwcGluZyB0aGUgbmV4dCBsZWFkZXIncyBzd2VlcCwgYW5kIGJvdGggd291bGRcbiAgICogdGhlbiBzZWxlY3QgdGhlIHNhbWUgc3RpbGwtZHVlIGRlZmluaXRpb24uIFdpdGhvdXQgdGhlIGBuZXh0X3J1bl9hdCA9IDxzZWVuPmBcbiAgICogcHJlZGljYXRlIGVhY2ggd291bGQgYWR2YW5jZSB0aGUgc2NoZWR1bGUgYW5kIGVhY2ggd291bGQgY29tcG9zZSBhbmQgREVMSVZFUiBhXG4gICAqIHJlcG9ydCDigJQgdGhlIHNhbWUgbWFuYWdlciBnZXRzIHRoZSBzYW1lIHJlcG9ydCB0d2ljZSwgZnJvbSB0d28gcG9kcywgd2hpY2ggaXNcbiAgICogdGhlIGZhaWx1cmUgZXZlcnlvbmUgbm90aWNlcy5cbiAgICpcbiAgICogUnVucyBhcyBzeXNhZG1pbiBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHRoZSBzY2FuLCBhbmQgcmV0dXJucyB3aGV0aGVyIHRoZSBjbGFpbVxuICAgKiB3b24gc28gdGhlIGNhbGxlciBjYW4gc2ltcGx5IHNraXAgYSBsb3N0IHJhY2UuXG4gICAqL1xuICBhc3luYyBjbGFpbURlZmluaXRpb24oaWQ6IHN0cmluZywgc2Vlbk5leHRSdW5BdDogRGF0ZSwgbmV4dFJ1bkF0OiBEYXRlLCBub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAgIC5zZXQoeyBsYXN0UnVuQXQ6IG5vdywgbmV4dFJ1bkF0LCB1cGRhdGVkQXQ6IG5vdyB9KVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkLCBpZCksXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ubmV4dFJ1bkF0LCBzZWVuTmV4dFJ1bkF0KSxcbiAgICAgICAgKSlcbiAgICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCB9KSk7XG4gICAgICByZXR1cm4gKGNsYWltZWQgYXMgdW5rbm93bltdKS5sZW5ndGggPiAwO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCAob3IgY2xlYXIpIGEgZGVmaW5pdGlvbidzIGBuZXh0UnVuQXRgIHdpdGhvdXQgY2xhaW1pbmcgaXQuXG4gICAqXG4gICAqIFVzZWQgd2hlbiBhIGRlZmluaXRpb24gaXMgY3JlYXRlZCwgcmVzdW1lZCwgb3IgaGFzIGl0cyBjYWRlbmNlL3RpbWV6b25lIGNoYW5nZWRcbiAgICog4oCUIHRoZSBzY2hlZHVsZSBoYXMgdG8gYmUgcmUtZGVyaXZlZCBmcm9tIHRoZSBjYWxlbmRhciByYXRoZXIgdGhhbiBsZWZ0IGF0XG4gICAqIHdoYXRldmVyIHRoZSBvbGQgY2FkZW5jZSBwcm9kdWNlZC5cbiAgICovXG4gIGFzeW5jIHNldE5leHRSdW4ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgbmV4dFJ1bkF0OiBEYXRlIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbilcbiAgICAgIC5zZXQoeyBuZXh0UnVuQXQsIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICApKSk7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgT05FIGRlZmluaXRpb24gd2l0aCB0aGUgcmVhc29uLCBmcm9tIHRoZSBzY2hlZHVsZXIuXG4gICAqXG4gICAqIFNlcGFyYXRlIGZyb20ge0BsaW5rIHBhdXNlRGVmaW5pdGlvbnNGb3JPd25lcn0gYmVjYXVzZSB0aGUgdHJpZ2dlciBpcyBkaWZmZXJlbnQ6XG4gICAqIHRoYXQgb25lIGlzIGEgbWVtYmVyc2hpcCBjaGFuZ2UgYWZmZWN0aW5nIGV2ZXJ5IGRlZmluaXRpb24gYSBwZXJzb24gb3ducywgdGhpc1xuICAgKiBvbmUgaXMgYSBwZXItcnVuIHJlY2hlY2sgdGhhdCBmYWlsZWQuIENsZWFycyBgbmV4dFJ1bkF0YCBzbyBhIHBhdXNlZCBkZWZpbml0aW9uXG4gICAqIHN0b3BzIGFwcGVhcmluZyBpbiB0aGUgZHVlIHNjYW4gYXQgYWxsLCByYXRoZXIgdGhhbiBiZWluZyByZS1jbGFpbWVkIGFuZFxuICAgKiByZS1yZWplY3RlZCBldmVyeSBjeWNsZS5cbiAgICpcbiAgICogUnVucyBhcyBzeXNhZG1pbjogdGhlIGNhbGxlciBpcyB0aGUgc2NoZWR1bGVyLCB3aGljaCBoYXMgbm8gdGVuYW50LCBhbmQgdGhlIGlkXG4gICAqIGNhbWUgZnJvbSBpdHMgb3duIGNyb3NzLW9yZyBzY2FuLlxuICAgKi9cbiAgYXN5bmMgcGF1c2VEZWZpbml0aW9uKGlkOiBzdHJpbmcsIHJlYXNvbjogUmVwb3J0UGF1c2VSZWFzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAgIC5zZXQoeyBpc0FjdGl2ZTogZmFsc2UsIHBhdXNlZFJlYXNvbjogcmVhc29uLCBuZXh0UnVuQXQ6IG51bGwsIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9KVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkLCBpZCksXG4gICAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICAgICkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWUgYSBwYXVzZWQgZGVmaW5pdGlvbiwgY2xlYXJpbmcgdGhlIHJlYXNvbiBhbmQgcmUtZGVyaXZpbmcgaXRzIHNjaGVkdWxlLlxuICAgKlxuICAgKiBgbmV4dFJ1bkF0YCBpcyBzdXBwbGllZCBieSB0aGUgY2FsbGVyIHJhdGhlciB0aGFuIGNvbXB1dGVkIGhlcmU6IHRoZSBwZXJpb2RcbiAgICogYXJpdGhtZXRpYyBuZWVkcyB0aGUgZGVmaW5pdGlvbidzIHRpbWV6b25lIGFuZCB3ZWVrIHN0YXJ0LCBhbmQgdGhhdCBiZWxvbmdzIHdpdGhcbiAgICogdGhlIHBlcmlvZCByZXNvbHZlciwgbm90IHRoZSBzdG9yZS5cbiAgICovXG4gIGFzeW5jIHJlc3VtZURlZmluaXRpb24ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgbmV4dFJ1bkF0OiBEYXRlLCBhY3RvcklkOiBzdHJpbmcpOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb24+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLnNldCh7IGlzQWN0aXZlOiB0cnVlLCBwYXVzZWRSZWFzb246IG51bGwsIG5leHRSdW5BdCwgdXBkYXRlZEJ5OiBhY3RvcklkLCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkLCBpZCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgY29uc3Qgcm93ID0gKHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdKVswXTtcbiAgICBpZiAoIXJvdykgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ1JlcG9ydCBkZWZpbml0aW9uIG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiByb3c7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgZXZlcnkgQUNUSVZFIGRlZmluaXRpb24gaW4gYW4gb3JnLCB3aXRoIHRoZSByZWFzb24uXG4gICAqXG4gICAqIFRoZSBlbnRpdGxlbWVudCBsYXBzZSBsZWc6IGJpbGxpbmcgdGVsbHMgcmVwb3J0aW5nIHRoZSBhZGQtb24gaXMgZ29uZSwgYW5kIGV2ZXJ5XG4gICAqIGRlZmluaXRpb24gaW4gdGhlIGFjY291bnQgc3RvcHMuIFJldHVybnMgdGhlIHJvd3Mgc28gdGhlIGNhbGxlciBjYW4gbm90aWZ5LlxuICAgKi9cbiAgYXN5bmMgcGF1c2VEZWZpbml0aW9uc0Zvck9yZyhvcmdJZDogc3RyaW5nLCByZWFzb246IFJlcG9ydFBhdXNlUmVhc29uKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLnNldCh7IGlzQWN0aXZlOiBmYWxzZSwgcGF1c2VkUmVhc29uOiByZWFzb24sIG5leHRSdW5BdDogbnVsbCwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgcmV0dXJuIHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IGRlZmluaXRpb24gaW4gYW4gb3JnIHBhdXNlZCBmb3IgYHJlYXNvbmAsIGZvciB0aGUgcmVzdW1lIGxlZy5cbiAgICpcbiAgICogU2NvcGVkIHRvIHRoZSByZWFzb24gb24gcHVycG9zZTogcmUtc3Vic2NyaWJpbmcgbXVzdCBub3QgdW4tcGF1c2UgYSBkZWZpbml0aW9uXG4gICAqIHdob3NlIG93bmVyIHdhcyBkZWFjdGl2YXRlZC4gVGhvc2UgYXJlIGRpZmZlcmVudCBwcm9ibGVtcyB3aXRoIGRpZmZlcmVudCBmaXhlcyxcbiAgICogYW5kIHJlc3VtaW5nIG9uZSBieSBmaXhpbmcgdGhlIG90aGVyIGlzIGhvdyBhIHJlcG9ydCBzdGFydHMgcnVubmluZyB1bmRlciBhXG4gICAqIHBlcnNvbiB3aG8gbGVmdC5cbiAgICovXG4gIGFzeW5jIGRlZmluaXRpb25zUGF1c2VkRm9yKG9yZ0lkOiBzdHJpbmcsIHJlYXNvbjogUmVwb3J0UGF1c2VSZWFzb24pOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb25bXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaXNBY3RpdmUsIGZhbHNlKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ucGF1c2VkUmVhc29uLCByZWFzb24pLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0KSxcbiAgICAgICkpKTtcbiAgICByZXR1cm4gcm93cyBhcyBSZXBvcnREZWZpbml0aW9uW107XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHN0YWtlaG9sZGVyUmVwb3J0U3RvcmUgPSBuZXcgU3Rha2Vob2xkZXJSZXBvcnRTdG9yZSgpO1xuIl19
|