sonamu 0.7.39 → 0.7.41
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/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +9 -1
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +3 -2
- package/dist/template/implementations/queries.template.d.ts.map +1 -1
- package/dist/template/implementations/queries.template.js +10 -2
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +34 -21
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +4 -2
- package/dist/template/implementations/view_id_async_select.template.js +2 -2
- package/dist/template/zod-converter.js +4 -2
- package/dist/testing/fixture-manager.d.ts +18 -6
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +124 -46
- package/dist/ui-web/assets/{index-Bfv7V57v.css → index-CWExqVO5.css} +1 -1
- package/dist/ui-web/assets/{index-DCf469Xl.js → index-DoZuAOiq.js} +69 -67
- package/dist/ui-web/index.html +2 -2
- package/package.json +3 -3
- package/src/tasks/workflow-manager.ts +10 -0
- package/src/template/implementations/generated_http.template.ts +2 -1
- package/src/template/implementations/queries.template.ts +23 -12
- package/src/template/implementations/sd.template.ts +33 -20
- package/src/template/implementations/view_form.template.ts +3 -1
- package/src/template/implementations/view_id_async_select.template.ts +1 -1
- package/src/template/zod-converter.ts +3 -1
- package/src/testing/fixture-manager.ts +167 -59
|
@@ -38,7 +38,6 @@ export class FixtureManagerClass {
|
|
|
38
38
|
// UpsertBuilder 기반 import를 위한 상태
|
|
39
39
|
builder = new UpsertBuilder();
|
|
40
40
|
fixtureRefMap = new Map();
|
|
41
|
-
uuidToFixtureId = new Map();
|
|
42
41
|
skippedFixtures = new Map();
|
|
43
42
|
init() {
|
|
44
43
|
if (this._tdb !== null) {
|
|
@@ -308,14 +307,18 @@ export class FixtureManagerClass {
|
|
|
308
307
|
}
|
|
309
308
|
/**
|
|
310
309
|
* 1. RelationGraph로 fixture 단위 삽입 순서 계산 (self-reference 포함)
|
|
311
|
-
* 2.
|
|
312
|
-
* 3.
|
|
310
|
+
* 2. 테이블별 레벨별로 UpsertBuilder에 등록 및 upsert 실행
|
|
311
|
+
* 3. 순서 기반 uuid→id 매핑 (UpsertBuilder가 uuid를 DB에 저장하지 않으므로)
|
|
312
|
+
*
|
|
313
|
+
* UpsertBuilder는 self-reference가 있으면 buildInsertLevels()로 재정렬하여
|
|
314
|
+
* 등록 순서와 반환 순서가 달라질 수 있습니다. 이를 방지하기 위해
|
|
315
|
+
* FixtureManager가 레벨별로 나눠서 처리하여 각 upsert 호출에서는
|
|
316
|
+
* self-reference가 없도록 합니다.
|
|
313
317
|
*/ async insertFixtures(dbName, _fixtures) {
|
|
314
318
|
const fixtures = unique(_fixtures, (f)=>f.fixtureId);
|
|
315
319
|
// 초기화
|
|
316
320
|
this.builder = new UpsertBuilder();
|
|
317
321
|
this.fixtureRefMap = new Map();
|
|
318
|
-
this.uuidToFixtureId = new Map();
|
|
319
322
|
this.skippedFixtures = new Map();
|
|
320
323
|
const db = createKnexInstance(Sonamu.dbConfig[dbName]);
|
|
321
324
|
const results = [];
|
|
@@ -323,7 +326,7 @@ export class FixtureManagerClass {
|
|
|
323
326
|
// 1. RelationGraph로 fixture 단위 삽입 순서 계산
|
|
324
327
|
this.relationGraph.buildGraph(fixtures);
|
|
325
328
|
const insertionOrder = this.relationGraph.getInsertionOrder();
|
|
326
|
-
// 2.
|
|
329
|
+
// 2. 스킵할 fixture 먼저 처리 (override 체크)
|
|
327
330
|
for (const fixtureId of insertionOrder){
|
|
328
331
|
const fixture = fixtures.find((f)=>f.fixtureId === fixtureId);
|
|
329
332
|
if (!fixture) continue;
|
|
@@ -340,35 +343,57 @@ export class FixtureManagerClass {
|
|
|
340
343
|
existingId
|
|
341
344
|
});
|
|
342
345
|
console.log(chalk.yellow(`Skipped ${fixture.entityId}#${fixture.id} (existing: #${existingId}, override: false)`));
|
|
343
|
-
continue;
|
|
344
346
|
}
|
|
345
|
-
this.registerFixture(fixture);
|
|
346
|
-
console.log(chalk.blue(`Registered ${fixture.entityId}#${fixture.id}${fixture.override ? ` (override existing: #${fixture.target?.id})` : ""}`));
|
|
347
347
|
}
|
|
348
|
-
// 3. 테이블별
|
|
349
|
-
const
|
|
348
|
+
// 3. 테이블별 fixture 그룹화 (insertionOrder 순서 기반)
|
|
349
|
+
const fixturesByTable = new Map();
|
|
350
|
+
const tableOrder = [];
|
|
351
|
+
for (const fixtureId of insertionOrder){
|
|
352
|
+
// 스킵된 fixture 제외
|
|
353
|
+
if (this.skippedFixtures.has(fixtureId)) continue;
|
|
354
|
+
const fixture = fixtures.find((f)=>f.fixtureId === fixtureId);
|
|
355
|
+
if (!fixture) continue;
|
|
356
|
+
const entity = EntityManager.get(fixture.entityId);
|
|
357
|
+
const tableName = entity.table;
|
|
358
|
+
if (!fixturesByTable.has(tableName)) {
|
|
359
|
+
fixturesByTable.set(tableName, []);
|
|
360
|
+
tableOrder.push(tableName);
|
|
361
|
+
}
|
|
362
|
+
fixturesByTable.get(tableName)?.push(fixture);
|
|
363
|
+
}
|
|
350
364
|
await db.transaction(async (trx)=>{
|
|
351
365
|
const insertedIdsByTable = new Map();
|
|
366
|
+
// 4. 테이블별 레벨별 처리
|
|
352
367
|
for (const tableName of tableOrder){
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
const
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
const
|
|
363
|
-
|
|
364
|
-
|
|
368
|
+
const tableFixtures = fixturesByTable.get(tableName) ?? [];
|
|
369
|
+
const levels = this.groupFixturesByLevel(tableFixtures);
|
|
370
|
+
for (const levelFixtures of levels){
|
|
371
|
+
// 해당 레벨의 fixture들 register
|
|
372
|
+
for (const fixture of levelFixtures){
|
|
373
|
+
this.registerFixture(fixture, insertedIdsByTable);
|
|
374
|
+
console.log(chalk.blue(`Registered ${fixture.entityId}#${fixture.id}${fixture.override ? ` (override)` : ""}`));
|
|
375
|
+
}
|
|
376
|
+
// upsert 실행 전 uuid 목록 저장
|
|
377
|
+
const table = this.builder.getTable(tableName);
|
|
378
|
+
const uuids = table.rows.map((row)=>row.uuid);
|
|
379
|
+
console.log(chalk.blue(`Upserting ${tableName} with ${uuids.length} rows (level ${levels.indexOf(levelFixtures) + 1}/${levels.length})`));
|
|
380
|
+
const ids = await this.builder.upsert(trx, tableName);
|
|
381
|
+
// 순서 기반 uuid -> id 매핑
|
|
382
|
+
// self-reference가 없으므로 등록 순서 = 반환 순서 보장
|
|
383
|
+
if (uuids.length > 0 && uuids.length === ids.length) {
|
|
384
|
+
const existingMap = insertedIdsByTable.get(tableName) ?? new Map();
|
|
385
|
+
for(let i = 0; i < uuids.length; i++){
|
|
386
|
+
existingMap.set(uuids[i], ids[i]);
|
|
387
|
+
}
|
|
388
|
+
insertedIdsByTable.set(tableName, existingMap);
|
|
389
|
+
} else if (uuids.length !== ids.length) {
|
|
390
|
+
console.warn(chalk.yellow(`Warning: uuid count (${uuids.length}) != id count (${ids.length}) for ${tableName}`));
|
|
365
391
|
}
|
|
366
|
-
insertedIdsByTable.set(tableName, uuidToId);
|
|
367
392
|
}
|
|
368
393
|
}
|
|
369
|
-
//
|
|
394
|
+
// 5. ManyToMany 관계 처리
|
|
370
395
|
await this.processManyToManyRelations(trx, fixtures, insertedIdsByTable);
|
|
371
|
-
//
|
|
396
|
+
// 6. 결과 수집
|
|
372
397
|
for (const fixture of fixtures){
|
|
373
398
|
const entity = EntityManager.get(fixture.entityId);
|
|
374
399
|
// 스킵된 fixture는 기존 레코드 정보로 결과 추가
|
|
@@ -401,7 +426,8 @@ export class FixtureManagerClass {
|
|
|
401
426
|
}
|
|
402
427
|
/**
|
|
403
428
|
* FixtureRecord를 UpsertBuilder에 등록
|
|
404
|
-
|
|
429
|
+
* @param insertedIdsByTable 이미 upsert된 테이블의 uuid→id 매핑 (레벨별 처리 시 사용)
|
|
430
|
+
*/ registerFixture(fixture, insertedIdsByTable) {
|
|
405
431
|
const entity = EntityManager.get(fixture.entityId);
|
|
406
432
|
const row = {};
|
|
407
433
|
// Override 모드 판단: target 또는 unique가 있고 override=true인 경우
|
|
@@ -412,8 +438,12 @@ export class FixtureManagerClass {
|
|
|
412
438
|
if (isVirtualProp(prop)) {
|
|
413
439
|
continue;
|
|
414
440
|
}
|
|
415
|
-
//
|
|
416
|
-
if (
|
|
441
|
+
// Generated column은 INSERT에서 제외 (DB가 자동 생성)
|
|
442
|
+
if ("generated" in prop && prop.generated) {
|
|
443
|
+
continue;
|
|
444
|
+
}
|
|
445
|
+
// id 처리: Override 모드일 때만 기존 값 사용
|
|
446
|
+
if (propName === "id") {
|
|
417
447
|
if (isOverrideMode && existingRecord) {
|
|
418
448
|
// Override: 기존 레코드의 값 사용 → UPDATE
|
|
419
449
|
row[propName] = existingRecord.columns[propName]?.value;
|
|
@@ -433,8 +463,17 @@ export class FixtureManagerClass {
|
|
|
433
463
|
} else {
|
|
434
464
|
const relatedRef = this.fixtureRefMap.get(relatedFixtureId);
|
|
435
465
|
if (relatedRef) {
|
|
436
|
-
// 이미
|
|
437
|
-
|
|
466
|
+
// 이미 upsert된 같은 테이블 fixture 확인
|
|
467
|
+
const relatedEntity = EntityManager.get(prop.with);
|
|
468
|
+
const relatedInsertedIds = insertedIdsByTable?.get(relatedEntity.table);
|
|
469
|
+
const actualId = relatedInsertedIds?.get(relatedRef.uuid);
|
|
470
|
+
if (actualId !== undefined) {
|
|
471
|
+
// 이미 upsert됨 → 실제 ID 사용
|
|
472
|
+
row[`${propName}_id`] = actualId;
|
|
473
|
+
} else {
|
|
474
|
+
// 아직 upsert 안됨 → UBRef 사용
|
|
475
|
+
row[`${propName}_id`] = relatedRef;
|
|
476
|
+
}
|
|
438
477
|
} else {
|
|
439
478
|
// fixtures에 포함되지 않은 레코드 → ID 그대로 사용
|
|
440
479
|
row[`${propName}_id`] = relatedId;
|
|
@@ -453,7 +492,6 @@ export class FixtureManagerClass {
|
|
|
453
492
|
console.log(chalk.blue(`Registering ${entity.table} - ${inspect(row, false, null, true)}`));
|
|
454
493
|
const ref = this.builder.register(entity.table, row);
|
|
455
494
|
this.fixtureRefMap.set(fixture.fixtureId, ref);
|
|
456
|
-
this.uuidToFixtureId.set(ref.uuid, fixture.fixtureId);
|
|
457
495
|
return ref;
|
|
458
496
|
}
|
|
459
497
|
/**
|
|
@@ -475,20 +513,6 @@ export class FixtureManagerClass {
|
|
|
475
513
|
return value;
|
|
476
514
|
}
|
|
477
515
|
}
|
|
478
|
-
/**
|
|
479
|
-
* 테이블 순서 추출 (fixtures에 포함된 테이블만)
|
|
480
|
-
*/ getTableOrder(fixtures) {
|
|
481
|
-
const tables = [];
|
|
482
|
-
const seen = new Set();
|
|
483
|
-
for (const fixture of fixtures){
|
|
484
|
-
const entity = EntityManager.get(fixture.entityId);
|
|
485
|
-
if (!seen.has(entity.table)) {
|
|
486
|
-
seen.add(entity.table);
|
|
487
|
-
tables.push(entity.table);
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
return tables;
|
|
491
|
-
}
|
|
492
516
|
async processManyToManyRelations(trx, fixtures, insertedIdsByTable) {
|
|
493
517
|
for (const fixture of fixtures){
|
|
494
518
|
const entity = EntityManager.get(fixture.entityId);
|
|
@@ -541,6 +565,60 @@ export class FixtureManagerClass {
|
|
|
541
565
|
}
|
|
542
566
|
}
|
|
543
567
|
}
|
|
568
|
+
/**
|
|
569
|
+
* 같은 테이블 내 fixture들을 self-reference 레벨별로 분할
|
|
570
|
+
* - self-reference가 없는 fixture들: Level 0
|
|
571
|
+
* - Level 0을 참조하는 fixture들: Level 1
|
|
572
|
+
* - 반복
|
|
573
|
+
*
|
|
574
|
+
* UpsertBuilder가 self-reference가 있으면 buildInsertLevels()로 재정렬하여
|
|
575
|
+
* 등록 순서와 반환 순서가 달라질 수 있습니다.
|
|
576
|
+
* 이를 방지하기 위해 FixtureManager가 레벨별로 나눠서 처리합니다.
|
|
577
|
+
*/ groupFixturesByLevel(fixtures) {
|
|
578
|
+
if (fixtures.length === 0) {
|
|
579
|
+
return [];
|
|
580
|
+
}
|
|
581
|
+
const entity = EntityManager.get(fixtures[0].entityId);
|
|
582
|
+
// self-reference relation prop 찾기
|
|
583
|
+
const selfRefProps = entity.props.filter((p)=>isRelationProp(p) && (isBelongsToOneRelationProp(p) || isOneToOneRelationProp(p) && p.hasJoinColumn) && p.with === entity.id);
|
|
584
|
+
if (selfRefProps.length === 0) {
|
|
585
|
+
// self-reference 없음 → 단일 레벨
|
|
586
|
+
return [
|
|
587
|
+
fixtures
|
|
588
|
+
];
|
|
589
|
+
}
|
|
590
|
+
// 레벨별 분할 (topological sort)
|
|
591
|
+
const levels = [];
|
|
592
|
+
const remaining = new Set(fixtures.map((f)=>f.fixtureId));
|
|
593
|
+
const processed = new Set();
|
|
594
|
+
while(remaining.size > 0){
|
|
595
|
+
const currentLevel = [];
|
|
596
|
+
for (const fixture of fixtures){
|
|
597
|
+
if (!remaining.has(fixture.fixtureId)) continue;
|
|
598
|
+
// self-reference가 모두 이미 처리됐거나 null인 경우
|
|
599
|
+
const canProcess = selfRefProps.every((prop)=>{
|
|
600
|
+
const refId = fixture.columns[prop.name]?.value;
|
|
601
|
+
if (refId === null || refId === undefined) return true;
|
|
602
|
+
const refFixtureId = `${prop.with}#${refId}`;
|
|
603
|
+
// 이미 처리됐거나, 현재 fixtures에 포함되지 않은 경우 (외부 참조)
|
|
604
|
+
return processed.has(refFixtureId) || !remaining.has(refFixtureId);
|
|
605
|
+
});
|
|
606
|
+
if (canProcess) {
|
|
607
|
+
currentLevel.push(fixture);
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
if (currentLevel.length === 0) {
|
|
611
|
+
const remainingIds = Array.from(remaining).join(", ");
|
|
612
|
+
throw new Error(`Circular self-reference detected in ${entity.table}. Remaining fixtures: ${remainingIds}`);
|
|
613
|
+
}
|
|
614
|
+
for (const fixture of currentLevel){
|
|
615
|
+
remaining.delete(fixture.fixtureId);
|
|
616
|
+
processed.add(fixture.fixtureId);
|
|
617
|
+
}
|
|
618
|
+
levels.push(currentLevel);
|
|
619
|
+
}
|
|
620
|
+
return levels;
|
|
621
|
+
}
|
|
544
622
|
async checkUniqueViolation(db, entity, fixture) {
|
|
545
623
|
const _uniqueIndexes = entity.indexes?.filter((i)=>i.type === "unique") ?? [];
|
|
546
624
|
const uniqueIndexes = _uniqueIndexes.filter((index)=>index.columns.every((column)=>!column.name.startsWith(`${entity.table}__`)));
|
|
@@ -610,4 +688,4 @@ export class FixtureManagerClass {
|
|
|
610
688
|
}
|
|
611
689
|
export const FixtureManager = new FixtureManagerClass();
|
|
612
690
|
|
|
613
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgY3JlYXRlS25leEluc3RhbmNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2tuZXhcIjtcbmltcG9ydCB7IHR5cGUgVUJSZWYsIFVwc2VydEJ1aWxkZXIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvdXBzZXJ0LWJ1aWxkZXJcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIERhdGFiYXNlU2NoZW1hRXh0ZW5kLFxuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRml4dHVyZUltcG9ydFJlc3VsdCxcbiAgdHlwZSBGaXh0dXJlUmVjb3JkLFxuICB0eXBlIEZpeHR1cmVTZWFyY2hPcHRpb25zLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNIYXNNYW55UmVsYXRpb25Qcm9wLFxuICBpc01hbnlUb01hbnlSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICB0eXBlIE1hbnlUb01hbnlSZWxhdGlvblByb3AsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgUmVsYXRpb25HcmFwaCB9IGZyb20gXCIuL19yZWxhdGlvbi1ncmFwaFwiO1xuXG4vKiog7IKs7Jqp7J6QIOyngOyglSDspJHrs7Ug7ZmV7J24IOy7rOufvCAoZW50aXR5SWTrs4TroZwg7KeA7KCVKSAqL1xuZXhwb3J0IGludGVyZmFjZSBEdXBsaWNhdGVDaGVja09wdGlvbnMge1xuICBjb2x1bW5zPzoge1xuICAgIFtlbnRpdHlJZDogc3RyaW5nXTogc3RyaW5nW107XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBGaXh0dXJlTWFuYWdlckNsYXNzIHtcbiAgcHJpdmF0ZSBfdGRiOiBLbmV4IHwgbnVsbCA9IG51bGw7XG4gIHNldCB0ZGIodGRiOiBLbmV4KSB7XG4gICAgdGhpcy5fdGRiID0gdGRiO1xuICB9XG4gIGdldCB0ZGIoKTogS25leCB7XG4gICAgaWYgKHRoaXMuX3RkYiA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRml4dHVyZU1hbmFnZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdGRiO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmRiOiBLbmV4IHwgbnVsbCA9IG51bGw7XG4gIHNldCBmZGIoZmRiOiBLbmV4KSB7XG4gICAgdGhpcy5fZmRiID0gZmRiO1xuICB9XG4gIGdldCBmZGIoKTogS25leCB7XG4gICAgaWYgKHRoaXMuX2ZkYiA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRml4dHVyZU1hbmFnZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZmRiO1xuICB9XG4gIGNhY2hlZFRhYmxlTmFtZXM6IHN0cmluZ1tdIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZWxhdGlvbkdyYXBoID0gbmV3IFJlbGF0aW9uR3JhcGgoKTtcblxuICAvLyBVcHNlcnRCdWlsZGVyIOq4sOuwmCBpbXBvcnTrpbwg7JyE7ZWcIOyDge2DnFxuICBwcml2YXRlIGJ1aWxkZXI6IFVwc2VydEJ1aWxkZXIgPSBuZXcgVXBzZXJ0QnVpbGRlcigpO1xuICBwcml2YXRlIGZpeHR1cmVSZWZNYXA6IE1hcDxzdHJpbmcsIFVCUmVmPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSB1dWlkVG9GaXh0dXJlSWQ6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc2tpcHBlZEZpeHR1cmVzOiBNYXA8c3RyaW5nLCB7IGVudGl0eUlkOiBzdHJpbmc7IGV4aXN0aW5nSWQ6IG51bWJlciB9PiA9IG5ldyBNYXAoKTtcblxuICBpbml0KCkge1xuICAgIGlmICh0aGlzLl90ZGIgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFNvbmFtdS5kYkNvbmZpZy50ZXN0ICYmIFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlcikge1xuICAgICAgY29uc3QgdENvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBjb25zdCBwQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlci5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBpZiAoXG4gICAgICAgIGAke3RDb25uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHt0Q29ubi5wb3J0ID8/IDU0MzJ9LyR7dENvbm4uZGF0YWJhc2V9YCA9PT1cbiAgICAgICAgYCR7cENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3BDb25uLnBvcnQgPz8gNTQzMn0vJHtwQ29ubi5kYXRhYmFzZX1gXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDthYzsiqTtirhEQuyZgCDtlITroZzrjZXshZhEQuyXkCDrj5nsnbztlZwg642w7J207YSw67Kg7J207Iqk6rCAIOyCrOyaqeuQmOyXiOyKteuLiOuLpC5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcudGVzdCk7XG4gICAgdGhpcy5mZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuICB9XG5cbiAgLyoqXG4gICAg7JuQ6rKpIGZpeHR1cmUgRELrpbwg66Gc7LusIHRlc3QgRELroZwg67O17IKs7ZWp64uI64ukLlxuICAgIHBnX2R1bXDroZwg7JuQ6rKpIERC66W8IOuNpO2UhO2VmOqzoCwgcGdfcmVzdG9yZeuhnCDroZzsu6zsl5Ag67O17JuQ7ZWp64uI64ukLlxuICAqL1xuICBhc3luYyBzeW5jKCkge1xuICAgIGNvbnN0IGZpeHR1cmVDb25uID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICBjb25zdCB0ZXN0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG5cbiAgICAvLyAxLiDroZzsu6wgdGVzdCBEQiDsl7DqsrAg7KKF66OMIOuwjyDsnqzsg53shLFcbiAgICBjb25zdCB0ZXN0UGdFbnYgPSB7IFBHUEFTU1dPUkQ6IHRlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3Rlc3RDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBcImAsXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSBhcyBOb2RlSlMuUHJvY2Vzc0VudiB9LFxuICAgICk7XG5cbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkNSRUFURSBEQVRBQkFTRSBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIC8vIDIuIOybkOqyqSBmaXh0dXJlIERCIOKGkiDroZzsu6wgdGVzdCBEQuuhnCDrs7XsgqwgKHBnX2R1bXAgfCBwZ19yZXN0b3JlKVxuICAgIGNvbnN0IGZpeHR1cmVQZ0VudiA9IHsgUEdQQVNTV09SRDogZml4dHVyZUNvbm4ucGFzc3dvcmQgfHwgXCJcIiB9O1xuICAgIGNvbnN0IGR1bXBDbWQgPSBgcGdfZHVtcCAtaCAke2ZpeHR1cmVDb25uLmhvc3R9IC1wICR7Zml4dHVyZUNvbm4ucG9ydCA/PyA1NDMyfSAtVSAke2ZpeHR1cmVDb25uLnVzZXJ9IC1kICR7Zml4dHVyZUNvbm4uZGF0YWJhc2V9IC1GY2A7XG4gICAgY29uc3QgcmVzdG9yZUNtZCA9IGBwZ19yZXN0b3JlIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgJHt0ZXN0Q29ubi5kYXRhYmFzZX0gLS1uby1vd25lciAtLW5vLWFjbGA7XG5cbiAgICBleGVjU3luYyhgJHtkdW1wQ21kfSB8IFBHUEFTU1dPUkQ9XCIke3Rlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCJ9XCIgJHtyZXN0b3JlQ21kfWAsIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZVBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICBzaGVsbDogXCIvYmluL2Jhc2hcIixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRlZFJlY29yZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgYXN5bmMgaW1wb3J0Rml4dHVyZShlbnRpdHlJZDogc3RyaW5nLCBpZHM6IG51bWJlcltdKSB7XG4gICAgLy8g67Cp66y4IOq4sOuhnSDstIjquLDtmZQgKOyDiOuhnOyatCBpbXBvcnQg7J6R7JeFIOyLnOyekSlcbiAgICB0aGlzLnZpc2l0ZWRSZWNvcmRzLmNsZWFyKCk7XG5cbiAgICBjb25zdCBxdWVyaWVzID0gdW5pcXVlKFxuICAgICAgKFxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBpZHMubWFwKGFzeW5jIChpZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZCwgXCJpZFwiLCBpZCk7XG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpLFxuICAgICk7XG5cbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgIGZvciAoY29uc3QgcXVlcnkgb2YgcXVlcmllcykge1xuICAgICAgYXdhaXQgd2RiLnJhdyhxdWVyeSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nLCBpZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2VudGl0eUlkfSMke2ZpZWxkfSMke2lkfWA7XG5cbiAgICAvLyDsiJztmZgg7LC47KGwIOuwqeyngDog7J2066+4IOuwqeusuO2VnCDroIjsvZTrk5zripQg7Iqk7YK1XG4gICAgaWYgKHRoaXMudmlzaXRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhpcy52aXNpdGVkUmVjb3Jkcy5hZGQocmVjb3JkS2V5KTtcblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuXG4gICAgLy8g7Jes6riw7IScIOyLpERC7J2YIHJvdyDqsIDsoLjsmLRcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IHdkYihlbnRpdHkudGFibGUpLndoZXJlKGZpZWxkLCBpZCkubGltaXQoMSk7XG4gICAgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR9IyR7aWR9IHJvd+ulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICAvLyDtlL3siqTss5BEQiwg7IukREJcbiAgICBjb25zdCBmaXh0dXJlRGF0YWJhc2UgPSAoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpLmRhdGFiYXNlO1xuICAgIGNvbnN0IHJlYWxEYXRhYmFzZSA9IChTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbl9tYXN0ZXIuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpXG4gICAgICAuZGF0YWJhc2U7XG5cbiAgICBjb25zdCBzZWxmUXVlcnkgPSBgSU5TRVJUIElHTk9SRSBJTlRPIFxcYCR7Zml4dHVyZURhdGFiYXNlfVxcYC5cXGAke2VudGl0eS50YWJsZX1cXGAgKFNFTEVDVCAqIEZST00gXFxgJHtyZWFsRGF0YWJhc2V9XFxgLlxcYCR7ZW50aXR5LnRhYmxlfVxcYCBXSEVSRSBcXGBpZFxcYCA9ICR7aWR9KWA7XG5cbiAgICBjb25zdCBhcmdzID0gT2JqZWN0LmVudHJpZXMoZW50aXR5LnJlbGF0aW9ucylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbLCByZWxhdGlvbl0pID0+XG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pICYmIHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UgPT09IHVuZGVmaW5lZCksXG4gICAgICApXG4gICAgICAubWFwKChbLCByZWxhdGlvbl0pID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgQmVsb25nc1RvT25l7J24IOqyveyasFxuICAgICAgICAgIENhdGVnb3J5IC8gJ2lkJyAvIHJvd1tjYXRlZ29yeV9pZF0g7Zi47LacXG4gICAgICAgIE9uZVRvT25l7JeQIGpvaW5Db2x1bW4gPT09IHRydWUg7J24IOqyveyasFxuICAgICAgICAgIFByb2ZpbGUgLyAnaWQnIC8gcm93W3Byb2ZpbGVfaWRdIO2YuOy2nFxuICAgICAgICBPbmVUb09uZeyXkCBqb2luQ29sdW1uID09PSBmYWxzZSDsnbgg6rK97JqwXG4gICAgICAgICAgUHJvZmlsZSAvICdwcm9maWxlX2lkJyAvIHJvd1snaWQnXSDtmLjstpxcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IGZpZWxkOiBzdHJpbmc7XG4gICAgICAgIGxldCBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgIXJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkQ29sdW1uTmFtZSA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApPy5uYW1lO1xuICAgICAgICAgIGlmICghcmVsYXRlZElkQ29sdW1uTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0ZWRFbnRpdHkuaWR97J2YICR7ZW50aXR5LmlkfSDqtIDqs4Qg7ZSE66Gt7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZCA9IGAke3JlbGF0ZWRJZENvbHVtbk5hbWV9X2lkYDtcbiAgICAgICAgICBpZCA9IHJvdy5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZCA9IFwiaWRcIjtcbiAgICAgICAgICBpZCA9IHJvd1tgJHtyZWxhdGlvbi5uYW1lfV9pZGBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHJlbGF0aW9uLndpdGgsXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgaWQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoYXJnKSA9PiBhcmcuaWQgIT09IG51bGwpO1xuXG4gICAgY29uc3QgcmVsUXVlcmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYXJncy5tYXAoYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhhcmdzLmVudGl0eUlkLCBhcmdzLmZpZWxkLCBhcmdzLmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gWy4uLnVuaXF1ZShyZWxRdWVyaWVzLnJldmVyc2UoKS5mbGF0KCkpLCBzZWxmUXVlcnldO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fdGRiKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fdGRiID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZkYikge1xuICAgICAgYXdhaXQgdGhpcy5fZmRiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2ZkYiA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRGaXh0dXJlcyhcbiAgICBzb3VyY2VEQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHRhcmdldERCTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgc2VhcmNoT3B0aW9uczogRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gICAgZHVwbGljYXRlQ2hlY2s/OiBEdXBsaWNhdGVDaGVja09wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHNvdXJjZURCID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tzb3VyY2VEQk5hbWVdKTtcbiAgICBjb25zdCB0YXJnZXREQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbdGFyZ2V0REJOYW1lXSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBlbnRpdHlJZCwgZmllbGQsIHZhbHVlLCBzZWFyY2hUeXBlIH0gPSBzZWFyY2hPcHRpb25zO1xuXG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICBjb25zdCBjb2x1bW4gPVxuICAgICAgICBlbnRpdHkucHJvcHMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSBmaWVsZCk/LnR5cGUgPT09IFwicmVsYXRpb25cIlxuICAgICAgICAgID8gYCR7ZmllbGR9X2lkYFxuICAgICAgICAgIDogZmllbGQ7XG5cbiAgICAgIGxldCBxdWVyeSA9IHNvdXJjZURCKGVudGl0eS50YWJsZSk7XG4gICAgICBpZiAoc2VhcmNoVHlwZSA9PT0gXCJlcXVhbHNcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzZWFyY2hUeXBlID09PSBcImxpa2VcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgXCJsaWtlXCIsIGAlJHt2YWx1ZX0lYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeTtcbiAgICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWNvcmRzIGZvdW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSZWNvcmRzTGVuZ3RoID0gZml4dHVyZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBuZXdSZWNvcmRzID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgcm93LCB7XG4gICAgICAgICAgX2RiOiBzb3VyY2VEQixcbiAgICAgICAgfSk7XG4gICAgICAgIGZpeHR1cmVzLnB1c2goLi4ubmV3UmVjb3Jkcyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaXh0dXJlUmVjb3JkID0gZml4dHVyZXMuZmluZCgocikgPT4gci5maXh0dXJlSWQgPT09IGAke2VudGl0eUlkfSMke3Jvdy5pZH1gKTtcblxuICAgICAgICBpZiAoY3VycmVudEZpeHR1cmVSZWNvcmQpIHtcbiAgICAgICAgICAvLyDtmITsnqwgZml4dHVyZeuhnOu2gO2EsCDsg53shLHrkJwgZmV0Y2hlZFJlY29yZHMg7ISk7KCVXG4gICAgICAgICAgY3VycmVudEZpeHR1cmVSZWNvcmQuZmV0Y2hlZFJlY29yZHMgPSBmaXh0dXJlc1xuICAgICAgICAgICAgLmZpbHRlcigocikgPT4gci5maXh0dXJlSWQgIT09IGN1cnJlbnRGaXh0dXJlUmVjb3JkLmZpeHR1cmVJZClcbiAgICAgICAgICAgIC5zbGljZShpbml0aWFsUmVjb3Jkc0xlbmd0aClcbiAgICAgICAgICAgIC5tYXAoKHIpID0+IHIuZml4dHVyZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOyngOyglSDsu6zrn7wg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIHRhcmdldFxuICAgICAgICBjb25zdCBjdXN0b21Db2x1bW5zID0gZHVwbGljYXRlQ2hlY2s/LmNvbHVtbnM/LltmaXh0dXJlLmVudGl0eUlkXTtcbiAgICAgICAgaWYgKGN1c3RvbUNvbHVtbnMgJiYgY3VzdG9tQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tRHVwbGljYXRlUm93ID0gYXdhaXQgdGhpcy5jaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICAgICAgICAgIHRhcmdldERCLFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgZml4dHVyZSxcbiAgICAgICAgICAgIGN1c3RvbUNvbHVtbnMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY3VzdG9tRHVwbGljYXRlUm93KSB7XG4gICAgICAgICAgICBjb25zdCBbcmVjb3JkXSA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIGN1c3RvbUR1cGxpY2F0ZVJvdywge1xuICAgICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICAgIF9kYjogdGFyZ2V0REIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZpeHR1cmUudGFyZ2V0ID0gcmVjb3JkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVuaXF1ZSBpbmRleCDquLDspIAg7KSR67O1IO2ZleyduCDihpIgZml4dHVyZS51bmlxdWVcbiAgICAgICAgY29uc3QgdW5pcXVlUm93ID0gYXdhaXQgdGhpcy5jaGVja1VuaXF1ZVZpb2xhdGlvbih0YXJnZXREQiwgZW50aXR5LCBmaXh0dXJlKTtcbiAgICAgICAgaWYgKHVuaXF1ZVJvdykge1xuICAgICAgICAgIGNvbnN0IFtyZWNvcmRdID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgdW5pcXVlUm93LCB7XG4gICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICBfZGI6IHRhcmdldERCLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZpeHR1cmUudW5pcXVlID0gcmVjb3JkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmlxdWUoZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRhcmdldERCLmRlc3Ryb3koKTtcbiAgICAgIGF3YWl0IHNvdXJjZURCLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHJvdzoge1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgIH0sXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHNpbmdsZVJlY29yZD86IGJvb2xlYW47XG4gICAgICBfZGI/OiBLbmV4O1xuICAgIH0sXG4gICk6IFByb21pc2U8Rml4dHVyZVJlY29yZFtdPiB7XG4gICAgY29uc3QgcmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgY29uc3QgdmlzaXRlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBjcmVhdGUgPSBhc3luYyAoXG4gICAgICBlbnRpdHk6IEVudGl0eSxcbiAgICAgIHJvdzoge1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgIH0sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBmaXh0dXJlSWQgPSBgJHtlbnRpdHkuaWR9IyR7cm93LmlkfWA7XG4gICAgICBpZiAodmlzaXRlZEVudGl0aWVzLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZpc2l0ZWRFbnRpdGllcy5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3QgcmVjb3JkOiBGaXh0dXJlUmVjb3JkID0ge1xuICAgICAgICBmaXh0dXJlSWQsXG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIGlkOiByb3cuaWQsXG4gICAgICAgIGNvbHVtbnM6IHt9LFxuICAgICAgICBmZXRjaGVkUmVjb3JkczogW10sXG4gICAgICAgIGJlbG9uZ3NSZWNvcmRzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJvcDogcHJvcCxcbiAgICAgICAgICB2YWx1ZTogcm93W3Byb3AubmFtZV0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGIgPSBvcHRpb25zPy5fZGIgPz8gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHRocm91Z2hUYWJsZSA9IHByb3Auam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IGZyb21Db2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSl9X2lkYDtcbiAgICAgICAgICBjb25zdCB0b0NvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsYXRlZEVudGl0eS50YWJsZSl9X2lkYDtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYih0aHJvdWdoVGFibGUpLndoZXJlKGZyb21Db2x1bW4sIHJvdy5pZCkucGx1Y2sodG9Db2x1bW4pO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWRzO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKVxuICAgICAgICAgICAgLndoZXJlKHByb3Auam9pbkNvbHVtbiwgcm93LmlkKVxuICAgICAgICAgICAgLnBsdWNrKFwiaWRcIik7XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZHM7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiAhcHJvcC5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZFByb3AgPSByZWxhdGVkRW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gaXNSZWxhdGlvblByb3AocCkgJiYgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmVsYXRlZFByb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIHJvdy5pZCkuZmlyc3QoKTtcbiAgICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkUm93Py5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWQgPSByb3dbYCR7cHJvcC5uYW1lfV9pZGBdO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWQ7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCkge1xuICAgICAgICAgICAgcmVjb3JkLmJlbG9uZ3NSZWNvcmRzLnB1c2goYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFvcHRpb25zPy5zaW5nbGVSZWNvcmQgJiYgcmVsYXRlZElkKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIHJlbGF0ZWRJZCkuZmlyc3QoKTtcbiAgICAgICAgICAgIGlmIChyZWxhdGVkUm93KSB7XG4gICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZShyZWxhdGVkRW50aXR5LCByZWxhdGVkUm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgfTtcblxuICAgIGF3YWl0IGNyZWF0ZShlbnRpdHksIHJvdyk7XG5cbiAgICByZXR1cm4gcmVjb3JkcztcbiAgfVxuXG4gIC8qKlxuICAgKiAxLiBSZWxhdGlvbkdyYXBo66GcIGZpeHR1cmUg64uo7JyEIOyCveyehSDsiJzshJwg6rOE7IKwIChzZWxmLXJlZmVyZW5jZSDtj6ztlagpXG4gICAqIDIuIOyInOyEnOuMgOuhnCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnSAoVUJSZWbroZwg7LC47KGwIOq0gOqzhCDtkZztmIQpXG4gICAqIDMuIO2FjOydtOu4lOuzhCB1cHNlcnQg7Iuk7ZaJIChJROuKlCBEQuqwgCDsnpDrj5kg7ZWg64u5KVxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0Rml4dHVyZXMoXG4gICAgZGJOYW1lOiBrZXlvZiBTb25hbXVEQkNvbmZpZyxcbiAgICBfZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICBjb25zdCBmaXh0dXJlcyA9IHVuaXF1ZShfZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG5cbiAgICAvLyDstIjquLDtmZRcbiAgICB0aGlzLmJ1aWxkZXIgPSBuZXcgVXBzZXJ0QnVpbGRlcigpO1xuICAgIHRoaXMuZml4dHVyZVJlZk1hcCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnV1aWRUb0ZpeHR1cmVJZCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnNraXBwZWRGaXh0dXJlcyA9IG5ldyBNYXAoKTtcblxuICAgIGNvbnN0IGRiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tkYk5hbWVdKTtcbiAgICBjb25zdCByZXN1bHRzOiBGaXh0dXJlSW1wb3J0UmVzdWx0W10gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAvLyAxLiBSZWxhdGlvbkdyYXBo66GcIGZpeHR1cmUg64uo7JyEIOyCveyehSDsiJzshJwg6rOE7IKwXG4gICAgICB0aGlzLnJlbGF0aW9uR3JhcGguYnVpbGRHcmFwaChmaXh0dXJlcyk7XG4gICAgICBjb25zdCBpbnNlcnRpb25PcmRlciA9IHRoaXMucmVsYXRpb25HcmFwaC5nZXRJbnNlcnRpb25PcmRlcigpO1xuXG4gICAgICAvLyAyLiDsiJzshJzrjIDroZwgVXBzZXJ0QnVpbGRlcuyXkCDrk7HroZ0gKG92ZXJyaWRlIOyytO2BrClcbiAgICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIGluc2VydGlvbk9yZGVyKSB7XG4gICAgICAgIGNvbnN0IGZpeHR1cmUgPSBmaXh0dXJlcy5maW5kKChmKSA9PiBmLmZpeHR1cmVJZCA9PT0gZml4dHVyZUlkKTtcbiAgICAgICAgaWYgKCFmaXh0dXJlKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBoYXNUYXJnZXQgPSAhIWZpeHR1cmUudGFyZ2V0O1xuICAgICAgICBjb25zdCBoYXNVbmlxdWUgPSAhIWZpeHR1cmUudW5pcXVlO1xuICAgICAgICBjb25zdCBoYXNEdXBsaWNhdGUgPSBoYXNUYXJnZXQgfHwgaGFzVW5pcXVlO1xuXG4gICAgICAgIC8vIOykkeuzteydtCDsnojqs6Agb3ZlcnJpZGU9ZmFsc2Xsnbgg6rK97JqwOiDsiqTtgrVcbiAgICAgICAgaWYgKGhhc0R1cGxpY2F0ZSAmJiAhZml4dHVyZS5vdmVycmlkZSkge1xuICAgICAgICAgIC8vIOq4sOyhtCDroIjsvZTrk5wgSUQg7KCA7J6lICh1bmlxdWUg7Jqw7ISgLCDsl4bsnLzrqbQgdGFyZ2V0KVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSBmaXh0dXJlLnVuaXF1ZT8uaWQgPz8gZml4dHVyZS50YXJnZXQ/LmlkO1xuICAgICAgICAgIGFzc2VydChleGlzdGluZ0lkKTtcbiAgICAgICAgICB0aGlzLnNraXBwZWRGaXh0dXJlcy5zZXQoZml4dHVyZUlkLCB7XG4gICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgIGV4aXN0aW5nSWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYFNraXBwZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9IChleGlzdGluZzogIyR7ZXhpc3RpbmdJZH0sIG92ZXJyaWRlOiBmYWxzZSlgLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWdpc3RlckZpeHR1cmUoZml4dHVyZSk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgICBgUmVnaXN0ZXJlZCAke2ZpeHR1cmUuZW50aXR5SWR9IyR7Zml4dHVyZS5pZH0ke2ZpeHR1cmUub3ZlcnJpZGUgPyBgIChvdmVycmlkZSBleGlzdGluZzogIyR7Zml4dHVyZS50YXJnZXQ/LmlkfSlgIDogXCJcIn1gLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIO2FjOydtOu4lOuzhCB1cHNlcnQg7Iuk7ZaJXG4gICAgICBjb25zdCB0YWJsZU9yZGVyID0gdGhpcy5nZXRUYWJsZU9yZGVyKGZpeHR1cmVzKTtcblxuICAgICAgYXdhaXQgZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgICBjb25zdCBpbnNlcnRlZElkc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyPj4oKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmJ1aWxkZXIuaGFzVGFibGUodGFibGVOYW1lKSkgY29udGludWU7XG5cbiAgICAgICAgICAvLyB1cHNlcnQg7Iuk7ZaJIOyghCB1dWlkIOuqqeuhnSDsoIDsnqVcbiAgICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuYnVpbGRlci5nZXRUYWJsZSh0YWJsZU5hbWUpO1xuICAgICAgICAgIGNvbnN0IHV1aWRzID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4gcm93LnV1aWQgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYFVwc2VydGluZyAke3RhYmxlTmFtZX0gd2l0aCAke3V1aWRzLmxlbmd0aH0gcm93c2ApKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmJ1aWxkZXIudXBzZXJ0KHRyeCwgdGFibGVOYW1lKTtcblxuICAgICAgICAgIC8vIHVwc2VydOuQnCByb3frk6TsnZggdXVpZCAtPiBpZCDrp6TtlZEg6rWs7LaVXG4gICAgICAgICAgaWYgKHV1aWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHV1aWRUb0lkID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgICAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0cngodGFibGVOYW1lIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgLnNlbGVjdChcInV1aWRcIiwgXCJpZFwiKVxuICAgICAgICAgICAgICAud2hlcmVJbihcInV1aWRcIiwgdXVpZHMpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgICAgICAgIHV1aWRUb0lkLnNldChyb3cudXVpZCwgcm93LmlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5zZXJ0ZWRJZHNCeVRhYmxlLnNldCh0YWJsZU5hbWUsIHV1aWRUb0lkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LiBNYW55VG9NYW55IOq0gOqzhCDsspjrpqxcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzTWFueVRvTWFueVJlbGF0aW9ucyh0cngsIGZpeHR1cmVzLCBpbnNlcnRlZElkc0J5VGFibGUpO1xuXG4gICAgICAgIC8vIDUuIOqysOqzvCDsiJjsp5FcbiAgICAgICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG5cbiAgICAgICAgICAvLyDsiqTtgrXrkJwgZml4dHVyZeuKlCDquLDsobQg66CI7L2U65OcIOygleuztOuhnCDqsrDqs7wg7LaU6rCAXG4gICAgICAgICAgY29uc3Qgc2tpcHBlZCA9IHRoaXMuc2tpcHBlZEZpeHR1cmVzLmdldChmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICAgICAgaWYgKHNraXBwZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICBkYXRhOiBhd2FpdCB0cngoZW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIHNraXBwZWQuZXhpc3RpbmdJZCkuZmlyc3QoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgY29uc3QgdXVpZFRvSWQgPSBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KGVudGl0eS50YWJsZSk7XG4gICAgICAgICAgICBjb25zdCBpbnNlcnRlZElkID0gdXVpZFRvSWQ/LmdldChyZWYudXVpZCk7XG5cbiAgICAgICAgICAgIGlmIChpbnNlcnRlZElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgICAgICBkYXRhOiBhd2FpdCB0cngoZW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIGluc2VydGVkSWQpLmZpcnN0KCksXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKGBJbnNlcnRlZCBpbnRvICR7ZW50aXR5LnRhYmxlfTogIyR7Zml4dHVyZS5pZH0gLT4gIyR7aW5zZXJ0ZWRJZH1gKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaXF1ZShyZXN1bHRzLCAocikgPT4gYCR7ci5lbnRpdHlJZH0jJHtyLmRhdGEuaWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogRml4dHVyZVJlY29yZOulvCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnVxuICAgKi9cbiAgcHJpdmF0ZSByZWdpc3RlckZpeHR1cmUoZml4dHVyZTogRml4dHVyZVJlY29yZCk6IFVCUmVmIHtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICBjb25zdCByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICAvLyBPdmVycmlkZSDrqqjrk5wg7YyQ64uoOiB0YXJnZXQg65iQ64qUIHVuaXF1ZeqwgCDsnojqs6Agb3ZlcnJpZGU9dHJ1ZeyduCDqsr3smrBcbiAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9IGZpeHR1cmUudGFyZ2V0ID8/IGZpeHR1cmUudW5pcXVlO1xuICAgIGNvbnN0IGlzT3ZlcnJpZGVNb2RlID0gZml4dHVyZS5vdmVycmlkZSAmJiBleGlzdGluZ1JlY29yZDtcblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb2x1bW5dIG9mIE9iamVjdC5lbnRyaWVzKGZpeHR1cmUuY29sdW1ucykpIHtcbiAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlkL3V1aWQg7LKY66asOiBPdmVycmlkZSDrqqjrk5zsnbwg65WM66eMIOq4sOyhtCDqsJIg7IKs7JqpXG4gICAgICBpZiAocHJvcE5hbWUgPT09IFwiaWRcIiB8fCBwcm9wTmFtZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgaWYgKGlzT3ZlcnJpZGVNb2RlICYmIGV4aXN0aW5nUmVjb3JkKSB7XG4gICAgICAgICAgLy8gT3ZlcnJpZGU6IOq4sOyhtCDroIjsvZTrk5zsnZgg6rCSIOyCrOyaqSDihpIgVVBEQVRFXG4gICAgICAgICAgcm93W3Byb3BOYW1lXSA9IGV4aXN0aW5nUmVjb3JkLmNvbHVtbnNbcHJvcE5hbWVdPy52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyDsg4gg66CI7L2U65OcOiDsoJzsmbgg4oaSIElOU0VSVCAoREIvVXBzZXJ0QnVpbGRlcuqwgCDsg53shLEpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWQgPSBjb2x1bW4udmFsdWUgYXMgbnVtYmVyIHwgbnVsbDtcbiAgICAgICAgICBpZiAocmVsYXRlZElkICE9PSBudWxsICYmIHJlbGF0ZWRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gO1xuXG4gICAgICAgICAgICAvLyDrqLzsoIAgc2tpcOuQnCBmaXh0dXJl7J247KeAIO2ZleyduFxuICAgICAgICAgICAgY29uc3Qgc2tpcHBlZEV4aXN0aW5nSWQgPSB0aGlzLnNraXBwZWRGaXh0dXJlcy5nZXQocmVsYXRlZEZpeHR1cmVJZCk/LmV4aXN0aW5nSWQ7XG4gICAgICAgICAgICBpZiAoc2tpcHBlZEV4aXN0aW5nSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBza2lw65CcIGZpeHR1cmUg4oaSIHRhcmdldCBEQuydmCDquLDsobQg66CI7L2U65OcIGlkIOyCrOyaqVxuICAgICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSBza2lwcGVkRXhpc3RpbmdJZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpO1xuICAgICAgICAgICAgICBpZiAocmVsYXRlZFJlZikge1xuICAgICAgICAgICAgICAgIC8vIOydtOuvuCDrk7HroZ3rkJwgZml4dHVyZSDssLjsobAg4oaSIFVCUmVmIOyCrOyaqVxuICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHJlbGF0ZWRSZWY7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZml4dHVyZXPsl5Ag7Y+s7ZWo65CY7KeAIOyViuydgCDroIjsvZTrk5wg4oaSIElEIOq3uOuMgOuhnCDsgqzsmqlcbiAgICAgICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSByZWxhdGVkSWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFzTWFueSwgTWFueVRvTWFueeuKlCDrs4Trj4Qg7LKY66asXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDsnbzrsJgg7Lus65+8XG4gICAgICAgIHJvd1twcm9wTmFtZV0gPSB0aGlzLmNvbnZlcnRDb2x1bW5WYWx1ZShwcm9wIGFzIEVudGl0eVByb3AsIGNvbHVtbi52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgUmVnaXN0ZXJpbmcgJHtlbnRpdHkudGFibGV9IC0gJHtpbnNwZWN0KHJvdywgZmFsc2UsIG51bGwsIHRydWUpfWApKTtcbiAgICBjb25zdCByZWYgPSB0aGlzLmJ1aWxkZXIucmVnaXN0ZXIoZW50aXR5LnRhYmxlLCByb3cpO1xuICAgIHRoaXMuZml4dHVyZVJlZk1hcC5zZXQoZml4dHVyZS5maXh0dXJlSWQsIHJlZik7XG4gICAgdGhpcy51dWlkVG9GaXh0dXJlSWQuc2V0KHJlZi51dWlkLCBmaXh0dXJlLmZpeHR1cmVJZCk7XG5cbiAgICByZXR1cm4gcmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIOy7rOufvCDqsJIg67OA7ZmYXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRDb2x1bW5WYWx1ZShwcm9wOiBFbnRpdHlQcm9wLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHByb3AudHlwZSkge1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgLy8gVXBzZXJ0QnVpbGRlci5yZWdpc3RlcuyXkOyEnCBKU09OLnN0cmluZ2lmeSDsspjrpqztlZjrr4DroZwgb2JqZWN0IOq3uOuMgOuhnCDsoITri6xcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIO2FjOydtOu4lCDsiJzshJwg7LaU7LacIChmaXh0dXJlc+yXkCDtj6ztlajrkJwg7YWM7J2067iU66eMKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUYWJsZU9yZGVyKGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10pOiAoa2V5b2YgRGF0YWJhc2VTY2hlbWFFeHRlbmQpW10ge1xuICAgIGNvbnN0IHRhYmxlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgaWYgKCFzZWVuLmhhcyhlbnRpdHkudGFibGUpKSB7XG4gICAgICAgIHNlZW4uYWRkKGVudGl0eS50YWJsZSk7XG4gICAgICAgIHRhYmxlcy5wdXNoKGVudGl0eS50YWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlcyBhcyAoa2V5b2YgRGF0YWJhc2VTY2hlbWFFeHRlbmQpW107XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NNYW55VG9NYW55UmVsYXRpb25zKFxuICAgIHRyeDogS25leC5UcmFuc2FjdGlvbixcbiAgICBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdLFxuICAgIGluc2VydGVkSWRzQnlUYWJsZTogTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyPj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG4gICAgICBjb25zdCBzb3VyY2VSZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcblxuICAgICAgaWYgKCFzb3VyY2VSZWYpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBzb3VyY2VVdWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQoZW50aXR5LnRhYmxlKTtcbiAgICAgIGNvbnN0IHNvdXJjZUlkID0gc291cmNlVXVpZFRvSWQ/LmdldChzb3VyY2VSZWYudXVpZCk7XG5cbiAgICAgIGlmIChzb3VyY2VJZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgICAgZm9yIChjb25zdCBbLCBjb2x1bW5dIG9mIE9iamVjdC5lbnRyaWVzKGZpeHR1cmUuY29sdW1ucykpIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IGNvbHVtbi5wcm9wO1xuXG4gICAgICAgIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocHJvcCkgJiYgQXJyYXkuaXNBcnJheShjb2x1bW4udmFsdWUpKSB7XG4gICAgICAgICAgLy8g7ISg7YOd65CY7KeAIOyViuydgCBNYW55VG9NYW55IOq0gOqzhOuKlCDsoIDsnqXtlZjsp4Ag7JWK7J2MXG4gICAgICAgICAgY29uc3QgdGFyZ2V0VGFibGUgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGlmICh0aGlzLmJ1aWxkZXIuaGFzVGFibGUodGFyZ2V0VGFibGUudGFibGUpID09PSBmYWxzZSkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCByZWxhdGVkSWRzID0gY29sdW1uLnZhbHVlIGFzIG51bWJlcltdO1xuICAgICAgICAgIGlmIChyZWxhdGVkSWRzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBqb2luVGFibGUgPSAocHJvcCBhcyBNYW55VG9NYW55UmVsYXRpb25Qcm9wKS5qb2luVGFibGU7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG5cbiAgICAgICAgICBjb25zdCBzb3VyY2VDb2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSl9X2lkYDtcbiAgICAgICAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbGF0ZWRFbnRpdHkudGFibGUpfV9pZGA7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWRJZCBvZiByZWxhdGVkSWRzKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQocmVsYXRlZEZpeHR1cmVJZCk7XG5cbiAgICAgICAgICAgIGxldCB0YXJnZXRJZDogbnVtYmVyO1xuXG4gICAgICAgICAgICBpZiAocmVsYXRlZFJlZikge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkVXVpZFRvSWQgPSBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KHJlbGF0ZWRFbnRpdHkudGFibGUpO1xuICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZElkID0gcmVsYXRlZFV1aWRUb0lkPy5nZXQocmVsYXRlZFJlZi51dWlkKTtcblxuICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgYFJlbGF0ZWQgZml4dHVyZSAke3JlbGF0ZWRGaXh0dXJlSWR9IG5vdCBmb3VuZCBpbiBpbnNlcnRlZElkcywgc2tpcHBpbmdgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGFyZ2V0SWQgPSByZXNvbHZlZElkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SWQgPSByZWxhdGVkSWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEpvaW5UYWJsZeyXkCDsgr3snoVcbiAgICAgICAgICAgIGNvbnN0IFtmb3VuZF0gPSBhd2FpdCB0cngoam9pblRhYmxlKVxuICAgICAgICAgICAgICAud2hlcmUoe1xuICAgICAgICAgICAgICAgIFtzb3VyY2VDb2x1bW5dOiBzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBbdGFyZ2V0Q29sdW1uXTogdGFyZ2V0SWQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5saW1pdCgxKTtcblxuICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICBhd2FpdCB0cngoam9pblRhYmxlKS5pbnNlcnQoe1xuICAgICAgICAgICAgICAgIFtzb3VyY2VDb2x1bW5dOiBzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBbdGFyZ2V0Q29sdW1uXTogdGFyZ2V0SWQsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgICAgICAgYEluc2VydGVkIGludG8gJHtqb2luVGFibGV9OiAke2VudGl0eS50YWJsZX0oJHtzb3VyY2VJZH0pIC0gJHtyZWxhdGVkRW50aXR5LnRhYmxlfSgke3RhcmdldElkfSlgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1VuaXF1ZVZpb2xhdGlvbihkYjogS25leCwgZW50aXR5OiBFbnRpdHksIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQpIHtcbiAgICBjb25zdCBfdW5pcXVlSW5kZXhlcyA9IGVudGl0eS5pbmRleGVzPy5maWx0ZXIoKGkpID0+IGkudHlwZSA9PT0gXCJ1bmlxdWVcIikgPz8gW107XG5cbiAgICBjb25zdCB1bmlxdWVJbmRleGVzID0gX3VuaXF1ZUluZGV4ZXMuZmlsdGVyKChpbmRleCkgPT5cbiAgICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKGNvbHVtbikgPT4gIWNvbHVtbi5uYW1lLnN0YXJ0c1dpdGgoYCR7ZW50aXR5LnRhYmxlfV9fYCkpLFxuICAgICk7XG4gICAgaWYgKHVuaXF1ZUluZGV4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgdW5pcXVlUXVlcnkgPSBkYihlbnRpdHkudGFibGUpO1xuICAgIGxldCBoYXNDb25kaXRpb24gPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgdW5pcXVlSW5kZXhlcykge1xuICAgICAgLy8g7Lus65+8IOykkSDtlZjrgpjrnbzrj4QgbnVsbOydtOuptCDsnKDri4jtgawg7KCc7JW97J2EIOychOuwmO2VmOyngCDslYrquLAg65WM66y47JeQIO2VtOuLuSDsnbjrjbHsiqTripQg66y07IucXG4gICAgICBjb25zdCBjb250YWluc051bGwgPSBpbmRleC5jb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5uYW1lLnJlcGxhY2UoL19pZCQvLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlID09PSBudWxsO1xuICAgICAgfSk7XG4gICAgICBpZiAoY29udGFpbnNOdWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB1bmlxdWVRdWVyeSA9IHVuaXF1ZVF1ZXJ5Lm9yV2hlcmUoKHFiKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGluZGV4LmNvbHVtbnMpIHtcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5uYW1lLnJlcGxhY2UoL19pZCQvLCBcIlwiKTtcblxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlKSkge1xuICAgICAgICAgICAgcWIud2hlcmVJbihjb2x1bW4ubmFtZSwgZml4dHVyZS5jb2x1bW5zW2ZpZWxkXS52YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHFiLmFuZFdoZXJlKGNvbHVtbi5uYW1lLCBmaXh0dXJlLmNvbHVtbnNbZmllbGRdPy52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGhhc0NvbmRpdGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNDb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IFt1bmlxdWVGb3VuZF0gPSBhd2FpdCB1bmlxdWVRdWVyeTtcbiAgICByZXR1cm4gdW5pcXVlRm91bmQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrRHVwbGljYXRlQnlDb2x1bW5zKFxuICAgIGRiOiBLbmV4LFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQsXG4gICAgY29sdW1uczogc3RyaW5nW10sXG4gICkge1xuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgd2hlcmVDbGF1c2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgICAvLyByZWxhdGlvbiDtlYTrk5zsnbgg6rK97JqwIF9pZCDrtpnsnbTquLBcbiAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW4pO1xuICAgICAgY29uc3QgZGJDb2x1bW4gPSBwcm9wICYmIGlzUmVsYXRpb25Qcm9wKHByb3ApID8gYCR7Y29sdW1ufV9pZGAgOiBjb2x1bW47XG4gICAgICBjb25zdCB2YWx1ZSA9IGZpeHR1cmUuY29sdW1uc1tjb2x1bW5dPy52YWx1ZTtcblxuICAgICAgLy8gbnVsbCDqsJLsnbQg7Y+s7ZWo65CcIOqyveyasCDspJHrs7Ug7ZmV7J24IOyKpO2CtVxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHdoZXJlQ2xhdXNlW2RiQ29sdW1uXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IFtmb3VuZF0gPSBhd2FpdCBkYihlbnRpdHkudGFibGUpLndoZXJlKHdoZXJlQ2xhdXNlKS5saW1pdCgxKTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBhc3luYyBhZGRGaXh0dXJlTG9hZGVyKGNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdGggPSBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy90ZXN0aW5nL2ZpeHR1cmUudHNgO1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMocGF0aCkudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IGZpeHR1cmVMb2FkZXJTdGFydCA9IGNvbnRlbnQuaW5kZXhPZihcImNvbnN0IGZpeHR1cmVMb2FkZXIgPSB7XCIpO1xuICAgIGNvbnN0IGZpeHR1cmVMb2FkZXJFbmQgPSBjb250ZW50LmluZGV4T2YoXCJ9O1wiLCBmaXh0dXJlTG9hZGVyU3RhcnQpO1xuXG4gICAgaWYgKGZpeHR1cmVMb2FkZXJTdGFydCAhPT0gLTEgJiYgZml4dHVyZUxvYWRlckVuZCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtjb250ZW50LnNsaWNlKDAsIGZpeHR1cmVMb2FkZXJFbmQpfSAgJHtjb2RlfVxcbiR7Y29udGVudC5zbGljZShmaXh0dXJlTG9hZGVyRW5kKX1gO1xuXG4gICAgICB3cml0ZUZpbGVTeW5jKHBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBmaXh0dXJlTG9hZGVyIGluIGZpeHR1cmUudHNcIik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBGaXh0dXJlTWFuYWdlciA9IG5ldyBGaXh0dXJlTWFuYWdlckNsYXNzKCk7XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwiY2hhbGsiLCJleGVjU3luYyIsInJlYWRGaWxlU3luYyIsIndyaXRlRmlsZVN5bmMiLCJpbmZsZWN0aW9uIiwidW5pcXVlIiwiaW5zcGVjdCIsIlNvbmFtdSIsIkJhc2VNb2RlbCIsImNyZWF0ZUtuZXhJbnN0YW5jZSIsIlVwc2VydEJ1aWxkZXIiLCJFbnRpdHlNYW5hZ2VyIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0hhc01hbnlSZWxhdGlvblByb3AiLCJpc01hbnlUb01hbnlSZWxhdGlvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc1ZpcnR1YWxQcm9wIiwiUmVsYXRpb25HcmFwaCIsIkZpeHR1cmVNYW5hZ2VyQ2xhc3MiLCJfdGRiIiwidGRiIiwiRXJyb3IiLCJfZmRiIiwiZmRiIiwiY2FjaGVkVGFibGVOYW1lcyIsInJlbGF0aW9uR3JhcGgiLCJidWlsZGVyIiwiZml4dHVyZVJlZk1hcCIsIk1hcCIsInV1aWRUb0ZpeHR1cmVJZCIsInNraXBwZWRGaXh0dXJlcyIsImluaXQiLCJkYkNvbmZpZyIsInRlc3QiLCJwcm9kdWN0aW9uX21hc3RlciIsInRDb25uIiwiY29ubmVjdGlvbiIsInBDb25uIiwiaG9zdCIsInBvcnQiLCJkYXRhYmFzZSIsImZpeHR1cmUiLCJzeW5jIiwiZml4dHVyZUNvbm4iLCJ0ZXN0Q29ubiIsInRlc3RQZ0VudiIsIlBHUEFTU1dPUkQiLCJwYXNzd29yZCIsInVzZXIiLCJzdGRpbyIsImVudiIsInByb2Nlc3MiLCJmaXh0dXJlUGdFbnYiLCJkdW1wQ21kIiwicmVzdG9yZUNtZCIsInNoZWxsIiwidmlzaXRlZFJlY29yZHMiLCJTZXQiLCJpbXBvcnRGaXh0dXJlIiwiZW50aXR5SWQiLCJpZHMiLCJjbGVhciIsInF1ZXJpZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwiaWQiLCJnZXRJbXBvcnRRdWVyaWVzIiwiZmxhdCIsIndkYiIsImdldERCIiwicXVlcnkiLCJyYXciLCJmaWVsZCIsInJlY29yZEtleSIsImhhcyIsImFkZCIsImVudGl0eSIsImdldCIsInJvdyIsInRhYmxlIiwid2hlcmUiLCJsaW1pdCIsInVuZGVmaW5lZCIsImZpeHR1cmVEYXRhYmFzZSIsInJlYWxEYXRhYmFzZSIsInNlbGZRdWVyeSIsImFyZ3MiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVsYXRpb25zIiwiZmlsdGVyIiwicmVsYXRpb24iLCJjdXN0b21Kb2luQ2xhdXNlIiwiaGFzSm9pbkNvbHVtbiIsInJlbGF0ZWRFbnRpdHkiLCJ3aXRoIiwicmVsYXRlZElkQ29sdW1uTmFtZSIsInByb3BzIiwiZmluZCIsInAiLCJuYW1lIiwiYXJnIiwicmVsUXVlcmllcyIsInJldmVyc2UiLCJkZXN0cm95IiwiZ2V0Rml4dHVyZXMiLCJzb3VyY2VEQk5hbWUiLCJ0YXJnZXREQk5hbWUiLCJzZWFyY2hPcHRpb25zIiwiZHVwbGljYXRlQ2hlY2siLCJzb3VyY2VEQiIsInRhcmdldERCIiwidmFsdWUiLCJzZWFyY2hUeXBlIiwiY29sdW1uIiwicHJvcCIsInR5cGUiLCJyb3dzIiwibGVuZ3RoIiwiZml4dHVyZXMiLCJpbml0aWFsUmVjb3Jkc0xlbmd0aCIsIm5ld1JlY29yZHMiLCJjcmVhdGVGaXh0dXJlUmVjb3JkIiwiX2RiIiwicHVzaCIsImN1cnJlbnRGaXh0dXJlUmVjb3JkIiwiciIsImZpeHR1cmVJZCIsImZldGNoZWRSZWNvcmRzIiwic2xpY2UiLCJjdXN0b21Db2x1bW5zIiwiY29sdW1ucyIsImN1c3RvbUR1cGxpY2F0ZVJvdyIsImNoZWNrRHVwbGljYXRlQnlDb2x1bW5zIiwicmVjb3JkIiwic2luZ2xlUmVjb3JkIiwidGFyZ2V0IiwidW5pcXVlUm93IiwiY2hlY2tVbmlxdWVWaW9sYXRpb24iLCJmIiwib3B0aW9ucyIsInJlY29yZHMiLCJ2aXNpdGVkRW50aXRpZXMiLCJjcmVhdGUiLCJiZWxvbmdzUmVjb3JkcyIsImRiIiwidGhyb3VnaFRhYmxlIiwiam9pblRhYmxlIiwiZnJvbUNvbHVtbiIsInNpbmd1bGFyaXplIiwidG9Db2x1bW4iLCJyZWxhdGVkSWRzIiwicGx1Y2siLCJqb2luQ29sdW1uIiwicmVsYXRlZFByb3AiLCJyZWxhdGVkUm93IiwiZmlyc3QiLCJyZWxhdGVkSWQiLCJpbnNlcnRGaXh0dXJlcyIsImRiTmFtZSIsIl9maXh0dXJlcyIsInJlc3VsdHMiLCJidWlsZEdyYXBoIiwiaW5zZXJ0aW9uT3JkZXIiLCJnZXRJbnNlcnRpb25PcmRlciIsImhhc1RhcmdldCIsImhhc1VuaXF1ZSIsImhhc0R1cGxpY2F0ZSIsIm92ZXJyaWRlIiwiZXhpc3RpbmdJZCIsInNldCIsImNvbnNvbGUiLCJsb2ciLCJ5ZWxsb3ciLCJyZWdpc3RlckZpeHR1cmUiLCJibHVlIiwidGFibGVPcmRlciIsImdldFRhYmxlT3JkZXIiLCJ0cmFuc2FjdGlvbiIsInRyeCIsImluc2VydGVkSWRzQnlUYWJsZSIsInRhYmxlTmFtZSIsImhhc1RhYmxlIiwiZ2V0VGFibGUiLCJ1dWlkcyIsInV1aWQiLCJ1cHNlcnQiLCJ1dWlkVG9JZCIsInNlbGVjdCIsIndoZXJlSW4iLCJwcm9jZXNzTWFueVRvTWFueVJlbGF0aW9ucyIsInNraXBwZWQiLCJkYXRhIiwicmVmIiwiaW5zZXJ0ZWRJZCIsImdyZWVuIiwiZXhpc3RpbmdSZWNvcmQiLCJpc092ZXJyaWRlTW9kZSIsInByb3BOYW1lIiwicmVsYXRlZEZpeHR1cmVJZCIsInNraXBwZWRFeGlzdGluZ0lkIiwicmVsYXRlZFJlZiIsImNvbnZlcnRDb2x1bW5WYWx1ZSIsInJlZ2lzdGVyIiwiRGF0ZSIsInRhYmxlcyIsInNlZW4iLCJzb3VyY2VSZWYiLCJzb3VyY2VVdWlkVG9JZCIsInNvdXJjZUlkIiwiQXJyYXkiLCJpc0FycmF5IiwidGFyZ2V0VGFibGUiLCJzb3VyY2VDb2x1bW4iLCJ0YXJnZXRDb2x1bW4iLCJ0YXJnZXRJZCIsInJlbGF0ZWRVdWlkVG9JZCIsInJlc29sdmVkSWQiLCJ3YXJuIiwiZm91bmQiLCJpbnNlcnQiLCJfdW5pcXVlSW5kZXhlcyIsImluZGV4ZXMiLCJpIiwidW5pcXVlSW5kZXhlcyIsImluZGV4IiwiZXZlcnkiLCJzdGFydHNXaXRoIiwidW5pcXVlUXVlcnkiLCJoYXNDb25kaXRpb24iLCJjb250YWluc051bGwiLCJzb21lIiwicmVwbGFjZSIsIm9yV2hlcmUiLCJxYiIsImFuZFdoZXJlIiwidW5pcXVlRm91bmQiLCJ3aGVyZUNsYXVzZSIsImRiQ29sdW1uIiwiYWRkRml4dHVyZUxvYWRlciIsImNvZGUiLCJwYXRoIiwiYXBpUm9vdFBhdGgiLCJjb250ZW50IiwidG9TdHJpbmciLCJmaXh0dXJlTG9hZGVyU3RhcnQiLCJpbmRleE9mIiwiZml4dHVyZUxvYWRlckVuZCIsIm5ld0NvbnRlbnQiLCJGaXh0dXJlTWFuYWdlciJdLCJtYXBw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
|
|
691
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgY3JlYXRlS25leEluc3RhbmNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2tuZXhcIjtcbmltcG9ydCB7IHR5cGUgVUJSZWYsIFVwc2VydEJ1aWxkZXIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvdXBzZXJ0LWJ1aWxkZXJcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEJlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgdHlwZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCxcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEZpeHR1cmVJbXBvcnRSZXN1bHQsXG4gIHR5cGUgRml4dHVyZVJlY29yZCxcbiAgdHlwZSBGaXh0dXJlU2VhcmNoT3B0aW9ucyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgdHlwZSBNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICB0eXBlIE9uZVRvT25lUmVsYXRpb25Qcm9wLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IFJlbGF0aW9uR3JhcGggfSBmcm9tIFwiLi9fcmVsYXRpb24tZ3JhcGhcIjtcblxuLyoqIOyCrOyaqeyekCDsp4DsoJUg7KSR67O1IO2ZleyduCDsu6zrn7wgKGVudGl0eUlk67OE66GcIOyngOyglSkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHVwbGljYXRlQ2hlY2tPcHRpb25zIHtcbiAgY29sdW1ucz86IHtcbiAgICBbZW50aXR5SWQ6IHN0cmluZ106IHN0cmluZ1tdO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgRml4dHVyZU1hbmFnZXJDbGFzcyB7XG4gIHByaXZhdGUgX3RkYjogS25leCB8IG51bGwgPSBudWxsO1xuICBzZXQgdGRiKHRkYjogS25leCkge1xuICAgIHRoaXMuX3RkYiA9IHRkYjtcbiAgfVxuICBnZXQgdGRiKCk6IEtuZXgge1xuICAgIGlmICh0aGlzLl90ZGIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpeHR1cmVNYW5hZ2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3RkYjtcbiAgfVxuXG4gIHByaXZhdGUgX2ZkYjogS25leCB8IG51bGwgPSBudWxsO1xuICBzZXQgZmRiKGZkYjogS25leCkge1xuICAgIHRoaXMuX2ZkYiA9IGZkYjtcbiAgfVxuICBnZXQgZmRiKCk6IEtuZXgge1xuICAgIGlmICh0aGlzLl9mZGIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpeHR1cmVNYW5hZ2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2ZkYjtcbiAgfVxuICBjYWNoZWRUYWJsZU5hbWVzOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVsYXRpb25HcmFwaCA9IG5ldyBSZWxhdGlvbkdyYXBoKCk7XG5cbiAgLy8gVXBzZXJ0QnVpbGRlciDquLDrsJggaW1wb3J066W8IOychO2VnCDsg4Htg5xcbiAgcHJpdmF0ZSBidWlsZGVyOiBVcHNlcnRCdWlsZGVyID0gbmV3IFVwc2VydEJ1aWxkZXIoKTtcbiAgcHJpdmF0ZSBmaXh0dXJlUmVmTWFwOiBNYXA8c3RyaW5nLCBVQlJlZj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc2tpcHBlZEZpeHR1cmVzOiBNYXA8c3RyaW5nLCB7IGVudGl0eUlkOiBzdHJpbmc7IGV4aXN0aW5nSWQ6IG51bWJlciB9PiA9IG5ldyBNYXAoKTtcblxuICBpbml0KCkge1xuICAgIGlmICh0aGlzLl90ZGIgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFNvbmFtdS5kYkNvbmZpZy50ZXN0ICYmIFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlcikge1xuICAgICAgY29uc3QgdENvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBjb25zdCBwQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlci5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBpZiAoXG4gICAgICAgIGAke3RDb25uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHt0Q29ubi5wb3J0ID8/IDU0MzJ9LyR7dENvbm4uZGF0YWJhc2V9YCA9PT1cbiAgICAgICAgYCR7cENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3BDb25uLnBvcnQgPz8gNTQzMn0vJHtwQ29ubi5kYXRhYmFzZX1gXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDthYzsiqTtirhEQuyZgCDtlITroZzrjZXshZhEQuyXkCDrj5nsnbztlZwg642w7J207YSw67Kg7J207Iqk6rCAIOyCrOyaqeuQmOyXiOyKteuLiOuLpC5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcudGVzdCk7XG4gICAgdGhpcy5mZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuICB9XG5cbiAgLyoqXG4gICAg7JuQ6rKpIGZpeHR1cmUgRELrpbwg66Gc7LusIHRlc3QgRELroZwg67O17IKs7ZWp64uI64ukLlxuICAgIHBnX2R1bXDroZwg7JuQ6rKpIERC66W8IOuNpO2UhO2VmOqzoCwgcGdfcmVzdG9yZeuhnCDroZzsu6zsl5Ag67O17JuQ7ZWp64uI64ukLlxuICAqL1xuICBhc3luYyBzeW5jKCkge1xuICAgIGNvbnN0IGZpeHR1cmVDb25uID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICBjb25zdCB0ZXN0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG5cbiAgICAvLyAxLiDroZzsu6wgdGVzdCBEQiDsl7DqsrAg7KKF66OMIOuwjyDsnqzsg53shLFcbiAgICBjb25zdCB0ZXN0UGdFbnYgPSB7IFBHUEFTU1dPUkQ6IHRlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3Rlc3RDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBcImAsXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSBhcyBOb2RlSlMuUHJvY2Vzc0VudiB9LFxuICAgICk7XG5cbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkNSRUFURSBEQVRBQkFTRSBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIC8vIDIuIOybkOqyqSBmaXh0dXJlIERCIOKGkiDroZzsu6wgdGVzdCBEQuuhnCDrs7XsgqwgKHBnX2R1bXAgfCBwZ19yZXN0b3JlKVxuICAgIGNvbnN0IGZpeHR1cmVQZ0VudiA9IHsgUEdQQVNTV09SRDogZml4dHVyZUNvbm4ucGFzc3dvcmQgfHwgXCJcIiB9O1xuICAgIGNvbnN0IGR1bXBDbWQgPSBgcGdfZHVtcCAtaCAke2ZpeHR1cmVDb25uLmhvc3R9IC1wICR7Zml4dHVyZUNvbm4ucG9ydCA/PyA1NDMyfSAtVSAke2ZpeHR1cmVDb25uLnVzZXJ9IC1kICR7Zml4dHVyZUNvbm4uZGF0YWJhc2V9IC1GY2A7XG4gICAgY29uc3QgcmVzdG9yZUNtZCA9IGBwZ19yZXN0b3JlIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgJHt0ZXN0Q29ubi5kYXRhYmFzZX0gLS1uby1vd25lciAtLW5vLWFjbGA7XG5cbiAgICBleGVjU3luYyhgJHtkdW1wQ21kfSB8IFBHUEFTU1dPUkQ9XCIke3Rlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCJ9XCIgJHtyZXN0b3JlQ21kfWAsIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZVBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICBzaGVsbDogXCIvYmluL2Jhc2hcIixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRlZFJlY29yZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgYXN5bmMgaW1wb3J0Rml4dHVyZShlbnRpdHlJZDogc3RyaW5nLCBpZHM6IG51bWJlcltdKSB7XG4gICAgLy8g67Cp66y4IOq4sOuhnSDstIjquLDtmZQgKOyDiOuhnOyatCBpbXBvcnQg7J6R7JeFIOyLnOyekSlcbiAgICB0aGlzLnZpc2l0ZWRSZWNvcmRzLmNsZWFyKCk7XG5cbiAgICBjb25zdCBxdWVyaWVzID0gdW5pcXVlKFxuICAgICAgKFxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBpZHMubWFwKGFzeW5jIChpZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZCwgXCJpZFwiLCBpZCk7XG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpLFxuICAgICk7XG5cbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgIGZvciAoY29uc3QgcXVlcnkgb2YgcXVlcmllcykge1xuICAgICAgYXdhaXQgd2RiLnJhdyhxdWVyeSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nLCBpZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2VudGl0eUlkfSMke2ZpZWxkfSMke2lkfWA7XG5cbiAgICAvLyDsiJztmZgg7LC47KGwIOuwqeyngDog7J2066+4IOuwqeusuO2VnCDroIjsvZTrk5zripQg7Iqk7YK1XG4gICAgaWYgKHRoaXMudmlzaXRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhpcy52aXNpdGVkUmVjb3Jkcy5hZGQocmVjb3JkS2V5KTtcblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuXG4gICAgLy8g7Jes6riw7IScIOyLpERC7J2YIHJvdyDqsIDsoLjsmLRcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IHdkYihlbnRpdHkudGFibGUpLndoZXJlKGZpZWxkLCBpZCkubGltaXQoMSk7XG4gICAgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR9IyR7aWR9IHJvd+ulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICAvLyDtlL3siqTss5BEQiwg7IukREJcbiAgICBjb25zdCBmaXh0dXJlRGF0YWJhc2UgPSAoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpLmRhdGFiYXNlO1xuICAgIGNvbnN0IHJlYWxEYXRhYmFzZSA9IChTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbl9tYXN0ZXIuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpXG4gICAgICAuZGF0YWJhc2U7XG5cbiAgICBjb25zdCBzZWxmUXVlcnkgPSBgSU5TRVJUIElHTk9SRSBJTlRPIFxcYCR7Zml4dHVyZURhdGFiYXNlfVxcYC5cXGAke2VudGl0eS50YWJsZX1cXGAgKFNFTEVDVCAqIEZST00gXFxgJHtyZWFsRGF0YWJhc2V9XFxgLlxcYCR7ZW50aXR5LnRhYmxlfVxcYCBXSEVSRSBcXGBpZFxcYCA9ICR7aWR9KWA7XG5cbiAgICBjb25zdCBhcmdzID0gT2JqZWN0LmVudHJpZXMoZW50aXR5LnJlbGF0aW9ucylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbLCByZWxhdGlvbl0pID0+XG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pICYmIHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UgPT09IHVuZGVmaW5lZCksXG4gICAgICApXG4gICAgICAubWFwKChbLCByZWxhdGlvbl0pID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgQmVsb25nc1RvT25l7J24IOqyveyasFxuICAgICAgICAgIENhdGVnb3J5IC8gJ2lkJyAvIHJvd1tjYXRlZ29yeV9pZF0g7Zi47LacXG4gICAgICAgIE9uZVRvT25l7JeQIGpvaW5Db2x1bW4gPT09IHRydWUg7J24IOqyveyasFxuICAgICAgICAgIFByb2ZpbGUgLyAnaWQnIC8gcm93W3Byb2ZpbGVfaWRdIO2YuOy2nFxuICAgICAgICBPbmVUb09uZeyXkCBqb2luQ29sdW1uID09PSBmYWxzZSDsnbgg6rK97JqwXG4gICAgICAgICAgUHJvZmlsZSAvICdwcm9maWxlX2lkJyAvIHJvd1snaWQnXSDtmLjstpxcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IGZpZWxkOiBzdHJpbmc7XG4gICAgICAgIGxldCBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgIXJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkQ29sdW1uTmFtZSA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApPy5uYW1lO1xuICAgICAgICAgIGlmICghcmVsYXRlZElkQ29sdW1uTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0ZWRFbnRpdHkuaWR97J2YICR7ZW50aXR5LmlkfSDqtIDqs4Qg7ZSE66Gt7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZCA9IGAke3JlbGF0ZWRJZENvbHVtbk5hbWV9X2lkYDtcbiAgICAgICAgICBpZCA9IHJvdy5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZCA9IFwiaWRcIjtcbiAgICAgICAgICBpZCA9IHJvd1tgJHtyZWxhdGlvbi5uYW1lfV9pZGBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHJlbGF0aW9uLndpdGgsXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgaWQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoYXJnKSA9PiBhcmcuaWQgIT09IG51bGwpO1xuXG4gICAgY29uc3QgcmVsUXVlcmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYXJncy5tYXAoYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhhcmdzLmVudGl0eUlkLCBhcmdzLmZpZWxkLCBhcmdzLmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gWy4uLnVuaXF1ZShyZWxRdWVyaWVzLnJldmVyc2UoKS5mbGF0KCkpLCBzZWxmUXVlcnldO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fdGRiKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fdGRiID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZkYikge1xuICAgICAgYXdhaXQgdGhpcy5fZmRiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2ZkYiA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRGaXh0dXJlcyhcbiAgICBzb3VyY2VEQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHRhcmdldERCTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgc2VhcmNoT3B0aW9uczogRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gICAgZHVwbGljYXRlQ2hlY2s/OiBEdXBsaWNhdGVDaGVja09wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHNvdXJjZURCID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tzb3VyY2VEQk5hbWVdKTtcbiAgICBjb25zdCB0YXJnZXREQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbdGFyZ2V0REJOYW1lXSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBlbnRpdHlJZCwgZmllbGQsIHZhbHVlLCBzZWFyY2hUeXBlIH0gPSBzZWFyY2hPcHRpb25zO1xuXG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICBjb25zdCBjb2x1bW4gPVxuICAgICAgICBlbnRpdHkucHJvcHMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSBmaWVsZCk/LnR5cGUgPT09IFwicmVsYXRpb25cIlxuICAgICAgICAgID8gYCR7ZmllbGR9X2lkYFxuICAgICAgICAgIDogZmllbGQ7XG5cbiAgICAgIGxldCBxdWVyeSA9IHNvdXJjZURCKGVudGl0eS50YWJsZSk7XG4gICAgICBpZiAoc2VhcmNoVHlwZSA9PT0gXCJlcXVhbHNcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzZWFyY2hUeXBlID09PSBcImxpa2VcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgXCJsaWtlXCIsIGAlJHt2YWx1ZX0lYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeTtcbiAgICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWNvcmRzIGZvdW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSZWNvcmRzTGVuZ3RoID0gZml4dHVyZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBuZXdSZWNvcmRzID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgcm93LCB7XG4gICAgICAgICAgX2RiOiBzb3VyY2VEQixcbiAgICAgICAgfSk7XG4gICAgICAgIGZpeHR1cmVzLnB1c2goLi4ubmV3UmVjb3Jkcyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaXh0dXJlUmVjb3JkID0gZml4dHVyZXMuZmluZCgocikgPT4gci5maXh0dXJlSWQgPT09IGAke2VudGl0eUlkfSMke3Jvdy5pZH1gKTtcblxuICAgICAgICBpZiAoY3VycmVudEZpeHR1cmVSZWNvcmQpIHtcbiAgICAgICAgICAvLyDtmITsnqwgZml4dHVyZeuhnOu2gO2EsCDsg53shLHrkJwgZmV0Y2hlZFJlY29yZHMg7ISk7KCVXG4gICAgICAgICAgY3VycmVudEZpeHR1cmVSZWNvcmQuZmV0Y2hlZFJlY29yZHMgPSBmaXh0dXJlc1xuICAgICAgICAgICAgLmZpbHRlcigocikgPT4gci5maXh0dXJlSWQgIT09IGN1cnJlbnRGaXh0dXJlUmVjb3JkLmZpeHR1cmVJZClcbiAgICAgICAgICAgIC5zbGljZShpbml0aWFsUmVjb3Jkc0xlbmd0aClcbiAgICAgICAgICAgIC5tYXAoKHIpID0+IHIuZml4dHVyZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOyngOyglSDsu6zrn7wg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIHRhcmdldFxuICAgICAgICBjb25zdCBjdXN0b21Db2x1bW5zID0gZHVwbGljYXRlQ2hlY2s/LmNvbHVtbnM/LltmaXh0dXJlLmVudGl0eUlkXTtcbiAgICAgICAgaWYgKGN1c3RvbUNvbHVtbnMgJiYgY3VzdG9tQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tRHVwbGljYXRlUm93ID0gYXdhaXQgdGhpcy5jaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICAgICAgICAgIHRhcmdldERCLFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgZml4dHVyZSxcbiAgICAgICAgICAgIGN1c3RvbUNvbHVtbnMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY3VzdG9tRHVwbGljYXRlUm93KSB7XG4gICAgICAgICAgICBjb25zdCBbcmVjb3JkXSA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIGN1c3RvbUR1cGxpY2F0ZVJvdywge1xuICAgICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICAgIF9kYjogdGFyZ2V0REIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZpeHR1cmUudGFyZ2V0ID0gcmVjb3JkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVuaXF1ZSBpbmRleCDquLDspIAg7KSR67O1IO2ZleyduCDihpIgZml4dHVyZS51bmlxdWVcbiAgICAgICAgY29uc3QgdW5pcXVlUm93ID0gYXdhaXQgdGhpcy5jaGVja1VuaXF1ZVZpb2xhdGlvbih0YXJnZXREQiwgZW50aXR5LCBmaXh0dXJlKTtcbiAgICAgICAgaWYgKHVuaXF1ZVJvdykge1xuICAgICAgICAgIGNvbnN0IFtyZWNvcmRdID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgdW5pcXVlUm93LCB7XG4gICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICBfZGI6IHRhcmdldERCLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZpeHR1cmUudW5pcXVlID0gcmVjb3JkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmlxdWUoZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRhcmdldERCLmRlc3Ryb3koKTtcbiAgICAgIGF3YWl0IHNvdXJjZURCLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHJvdzoge1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgIH0sXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHNpbmdsZVJlY29yZD86IGJvb2xlYW47XG4gICAgICBfZGI/OiBLbmV4O1xuICAgIH0sXG4gICk6IFByb21pc2U8Rml4dHVyZVJlY29yZFtdPiB7XG4gICAgY29uc3QgcmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgY29uc3QgdmlzaXRlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBjcmVhdGUgPSBhc3luYyAoXG4gICAgICBlbnRpdHk6IEVudGl0eSxcbiAgICAgIHJvdzoge1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgIH0sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBmaXh0dXJlSWQgPSBgJHtlbnRpdHkuaWR9IyR7cm93LmlkfWA7XG4gICAgICBpZiAodmlzaXRlZEVudGl0aWVzLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZpc2l0ZWRFbnRpdGllcy5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3QgcmVjb3JkOiBGaXh0dXJlUmVjb3JkID0ge1xuICAgICAgICBmaXh0dXJlSWQsXG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIGlkOiByb3cuaWQsXG4gICAgICAgIGNvbHVtbnM6IHt9LFxuICAgICAgICBmZXRjaGVkUmVjb3JkczogW10sXG4gICAgICAgIGJlbG9uZ3NSZWNvcmRzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJvcDogcHJvcCxcbiAgICAgICAgICB2YWx1ZTogcm93W3Byb3AubmFtZV0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGIgPSBvcHRpb25zPy5fZGIgPz8gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHRocm91Z2hUYWJsZSA9IHByb3Auam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IGZyb21Db2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSl9X2lkYDtcbiAgICAgICAgICBjb25zdCB0b0NvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsYXRlZEVudGl0eS50YWJsZSl9X2lkYDtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYih0aHJvdWdoVGFibGUpLndoZXJlKGZyb21Db2x1bW4sIHJvdy5pZCkucGx1Y2sodG9Db2x1bW4pO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWRzO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKVxuICAgICAgICAgICAgLndoZXJlKHByb3Auam9pbkNvbHVtbiwgcm93LmlkKVxuICAgICAgICAgICAgLnBsdWNrKFwiaWRcIik7XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZHM7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiAhcHJvcC5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZFByb3AgPSByZWxhdGVkRW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gaXNSZWxhdGlvblByb3AocCkgJiYgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmVsYXRlZFByb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIHJvdy5pZCkuZmlyc3QoKTtcbiAgICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkUm93Py5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWQgPSByb3dbYCR7cHJvcC5uYW1lfV9pZGBdO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWQ7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCkge1xuICAgICAgICAgICAgcmVjb3JkLmJlbG9uZ3NSZWNvcmRzLnB1c2goYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFvcHRpb25zPy5zaW5nbGVSZWNvcmQgJiYgcmVsYXRlZElkKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIHJlbGF0ZWRJZCkuZmlyc3QoKTtcbiAgICAgICAgICAgIGlmIChyZWxhdGVkUm93KSB7XG4gICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZShyZWxhdGVkRW50aXR5LCByZWxhdGVkUm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgfTtcblxuICAgIGF3YWl0IGNyZWF0ZShlbnRpdHksIHJvdyk7XG5cbiAgICByZXR1cm4gcmVjb3JkcztcbiAgfVxuXG4gIC8qKlxuICAgKiAxLiBSZWxhdGlvbkdyYXBo66GcIGZpeHR1cmUg64uo7JyEIOyCveyehSDsiJzshJwg6rOE7IKwIChzZWxmLXJlZmVyZW5jZSDtj6ztlagpXG4gICAqIDIuIO2FjOydtOu4lOuzhCDroIjrsqjrs4TroZwgVXBzZXJ0QnVpbGRlcuyXkCDrk7HroZ0g67CPIHVwc2VydCDsi6TtlolcbiAgICogMy4g7Iic7IScIOq4sOuwmCB1dWlk4oaSaWQg66ek7ZWRIChVcHNlcnRCdWlsZGVy6rCAIHV1aWTrpbwgRELsl5Ag7KCA7J6l7ZWY7KeAIOyViuycvOuvgOuhnClcbiAgICpcbiAgICogVXBzZXJ0QnVpbGRlcuuKlCBzZWxmLXJlZmVyZW5jZeqwgCDsnojsnLzrqbQgYnVpbGRJbnNlcnRMZXZlbHMoKeuhnCDsnqzsoJXroKztlZjsl6xcbiAgICog65Ox66GdIOyInOyEnOyZgCDrsJjtmZgg7Iic7ISc6rCAIOuLrOudvOyniCDsiJgg7J6I7Iq164uI64ukLiDsnbTrpbwg67Cp7KeA7ZWY6riwIOychO2VtFxuICAgKiBGaXh0dXJlTWFuYWdlcuqwgCDroIjrsqjrs4TroZwg64KY64ig7IScIOyymOumrO2VmOyXrCDqsIEgdXBzZXJ0IO2YuOy2nOyXkOyEnOuKlFxuICAgKiBzZWxmLXJlZmVyZW5jZeqwgCDsl4brj4TroZ0g7ZWp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0Rml4dHVyZXMoXG4gICAgZGJOYW1lOiBrZXlvZiBTb25hbXVEQkNvbmZpZyxcbiAgICBfZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICBjb25zdCBmaXh0dXJlcyA9IHVuaXF1ZShfZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG5cbiAgICAvLyDstIjquLDtmZRcbiAgICB0aGlzLmJ1aWxkZXIgPSBuZXcgVXBzZXJ0QnVpbGRlcigpO1xuICAgIHRoaXMuZml4dHVyZVJlZk1hcCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnNraXBwZWRGaXh0dXJlcyA9IG5ldyBNYXAoKTtcblxuICAgIGNvbnN0IGRiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tkYk5hbWVdKTtcbiAgICBjb25zdCByZXN1bHRzOiBGaXh0dXJlSW1wb3J0UmVzdWx0W10gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAvLyAxLiBSZWxhdGlvbkdyYXBo66GcIGZpeHR1cmUg64uo7JyEIOyCveyehSDsiJzshJwg6rOE7IKwXG4gICAgICB0aGlzLnJlbGF0aW9uR3JhcGguYnVpbGRHcmFwaChmaXh0dXJlcyk7XG4gICAgICBjb25zdCBpbnNlcnRpb25PcmRlciA9IHRoaXMucmVsYXRpb25HcmFwaC5nZXRJbnNlcnRpb25PcmRlcigpO1xuXG4gICAgICAvLyAyLiDsiqTtgrXtlaAgZml4dHVyZSDrqLzsoIAg7LKY66asIChvdmVycmlkZSDssrTtgawpXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiBpbnNlcnRpb25PcmRlcikge1xuICAgICAgICBjb25zdCBmaXh0dXJlID0gZml4dHVyZXMuZmluZCgoZikgPT4gZi5maXh0dXJlSWQgPT09IGZpeHR1cmVJZCk7XG4gICAgICAgIGlmICghZml4dHVyZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgaGFzVGFyZ2V0ID0gISFmaXh0dXJlLnRhcmdldDtcbiAgICAgICAgY29uc3QgaGFzVW5pcXVlID0gISFmaXh0dXJlLnVuaXF1ZTtcbiAgICAgICAgY29uc3QgaGFzRHVwbGljYXRlID0gaGFzVGFyZ2V0IHx8IGhhc1VuaXF1ZTtcblxuICAgICAgICAvLyDspJHrs7XsnbQg7J6I6rOgIG92ZXJyaWRlPWZhbHNl7J24IOqyveyasDog7Iqk7YK1XG4gICAgICAgIGlmIChoYXNEdXBsaWNhdGUgJiYgIWZpeHR1cmUub3ZlcnJpZGUpIHtcbiAgICAgICAgICAvLyDquLDsobQg66CI7L2U65OcIElEIOyggOyepSAodW5pcXVlIOyasOyEoCwg7JeG7Jy866m0IHRhcmdldClcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkID0gZml4dHVyZS51bmlxdWU/LmlkID8/IGZpeHR1cmUudGFyZ2V0Py5pZDtcbiAgICAgICAgICBhc3NlcnQoZXhpc3RpbmdJZCk7XG4gICAgICAgICAgdGhpcy5za2lwcGVkRml4dHVyZXMuc2V0KGZpeHR1cmVJZCwge1xuICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICBleGlzdGluZ0lkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGBTa2lwcGVkICR7Zml4dHVyZS5lbnRpdHlJZH0jJHtmaXh0dXJlLmlkfSAoZXhpc3Rpbmc6ICMke2V4aXN0aW5nSWR9LCBvdmVycmlkZTogZmFsc2UpYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiDthYzsnbTruJTrs4QgZml4dHVyZSDqt7jro7ntmZQgKGluc2VydGlvbk9yZGVyIOyInOyEnCDquLDrsJgpXG4gICAgICBjb25zdCBmaXh0dXJlc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgRml4dHVyZVJlY29yZFtdPigpO1xuICAgICAgY29uc3QgdGFibGVPcmRlcjogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgaW5zZXJ0aW9uT3JkZXIpIHtcbiAgICAgICAgLy8g7Iqk7YK165CcIGZpeHR1cmUg7KCc7Jm4XG4gICAgICAgIGlmICh0aGlzLnNraXBwZWRGaXh0dXJlcy5oYXMoZml4dHVyZUlkKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZml4dHVyZSA9IGZpeHR1cmVzLmZpbmQoKGYpID0+IGYuZml4dHVyZUlkID09PSBmaXh0dXJlSWQpO1xuICAgICAgICBpZiAoIWZpeHR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBlbnRpdHkudGFibGU7XG5cbiAgICAgICAgaWYgKCFmaXh0dXJlc0J5VGFibGUuaGFzKHRhYmxlTmFtZSkpIHtcbiAgICAgICAgICBmaXh0dXJlc0J5VGFibGUuc2V0KHRhYmxlTmFtZSwgW10pO1xuICAgICAgICAgIHRhYmxlT3JkZXIucHVzaCh0YWJsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKT8ucHVzaChmaXh0dXJlKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgICBjb25zdCBpbnNlcnRlZElkc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyPj4oKTtcblxuICAgICAgICAvLyA0LiDthYzsnbTruJTrs4Qg66CI67Ko67OEIOyymOumrFxuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgY29uc3QgdGFibGVGaXh0dXJlcyA9IGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKSA/PyBbXTtcbiAgICAgICAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmdyb3VwRml4dHVyZXNCeUxldmVsKHRhYmxlRml4dHVyZXMpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBsZXZlbEZpeHR1cmVzIG9mIGxldmVscykge1xuICAgICAgICAgICAgLy8g7ZW064u5IOugiOuyqOydmCBmaXh0dXJl65OkIHJlZ2lzdGVyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgbGV2ZWxGaXh0dXJlcykge1xuICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRml4dHVyZShmaXh0dXJlLCBpbnNlcnRlZElkc0J5VGFibGUpO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ibHVlKFxuICAgICAgICAgICAgICAgICAgYFJlZ2lzdGVyZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9JHtmaXh0dXJlLm92ZXJyaWRlID8gYCAob3ZlcnJpZGUpYCA6IFwiXCJ9YCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB1cHNlcnQg7Iuk7ZaJIOyghCB1dWlkIOuqqeuhnSDsoIDsnqVcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5idWlsZGVyLmdldFRhYmxlKHRhYmxlTmFtZSk7XG4gICAgICAgICAgICBjb25zdCB1dWlkcyA9IHRhYmxlLnJvd3MubWFwKChyb3cpID0+IHJvdy51dWlkIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay5ibHVlKFxuICAgICAgICAgICAgICAgIGBVcHNlcnRpbmcgJHt0YWJsZU5hbWV9IHdpdGggJHt1dWlkcy5sZW5ndGh9IHJvd3MgKGxldmVsICR7bGV2ZWxzLmluZGV4T2YobGV2ZWxGaXh0dXJlcykgKyAxfS8ke2xldmVscy5sZW5ndGh9KWAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgaWRzID0gYXdhaXQgdGhpcy5idWlsZGVyLnVwc2VydCh0cngsIHRhYmxlTmFtZSBhcyBrZXlvZiBEYXRhYmFzZVNjaGVtYUV4dGVuZCk7XG5cbiAgICAgICAgICAgIC8vIOyInOyEnCDquLDrsJggdXVpZCAtPiBpZCDrp6TtlZFcbiAgICAgICAgICAgIC8vIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuycvOuvgOuhnCDrk7HroZ0g7Iic7IScID0g67CY7ZmYIOyInOyEnCDrs7TsnqVcbiAgICAgICAgICAgIGlmICh1dWlkcy5sZW5ndGggPiAwICYmIHV1aWRzLmxlbmd0aCA9PT0gaWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ01hcCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQodGFibGVOYW1lKSA/PyBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHV1aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdNYXAuc2V0KHV1aWRzW2ldLCBpZHNbaV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5zZXQodGFibGVOYW1lLCBleGlzdGluZ01hcCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHV1aWRzLmxlbmd0aCAhPT0gaWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgICAgYFdhcm5pbmc6IHV1aWQgY291bnQgKCR7dXVpZHMubGVuZ3RofSkgIT0gaWQgY291bnQgKCR7aWRzLmxlbmd0aH0pIGZvciAke3RhYmxlTmFtZX1gLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNS4gTWFueVRvTWFueSDqtIDqs4Qg7LKY66asXG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnModHJ4LCBmaXh0dXJlcywgaW5zZXJ0ZWRJZHNCeVRhYmxlKTtcblxuICAgICAgICAvLyA2LiDqsrDqs7wg7IiY7KeRXG4gICAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuXG4gICAgICAgICAgLy8g7Iqk7YK165CcIGZpeHR1cmXripQg6riw7KG0IOugiOy9lOuTnCDsoJXrs7TroZwg6rKw6rO8IOy2lOqwgFxuICAgICAgICAgIGNvbnN0IHNraXBwZWQgPSB0aGlzLnNraXBwZWRGaXh0dXJlcy5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgIGlmIChza2lwcGVkKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgICAgZGF0YTogYXdhaXQgdHJ4KGVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCBza2lwcGVkLmV4aXN0aW5nSWQpLmZpcnN0KCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgIGNvbnN0IHV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgICAgICAgY29uc3QgaW5zZXJ0ZWRJZCA9IHV1aWRUb0lkPy5nZXQocmVmLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoaW5zZXJ0ZWRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgZGF0YTogYXdhaXQgdHJ4KGVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCBpbnNlcnRlZElkKS5maXJzdCgpLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgSW5zZXJ0ZWQgaW50byAke2VudGl0eS50YWJsZX06ICMke2ZpeHR1cmUuaWR9IC0+ICMke2luc2VydGVkSWR9YCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmlxdWUocmVzdWx0cywgKHIpID0+IGAke3IuZW50aXR5SWR9IyR7ci5kYXRhLmlkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpeHR1cmVSZWNvcmTrpbwgVXBzZXJ0QnVpbGRlcuyXkCDrk7HroZ1cbiAgICogQHBhcmFtIGluc2VydGVkSWRzQnlUYWJsZSDsnbTrr7ggdXBzZXJ065CcIO2FjOydtOu4lOydmCB1dWlk4oaSaWQg66ek7ZWRICjroIjrsqjrs4Qg7LKY66asIOyLnCDsgqzsmqkpXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyRml4dHVyZShcbiAgICBmaXh0dXJlOiBGaXh0dXJlUmVjb3JkLFxuICAgIGluc2VydGVkSWRzQnlUYWJsZT86IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlcj4+LFxuICApOiBVQlJlZiB7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG4gICAgY29uc3Qgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgLy8gT3ZlcnJpZGUg66qo65OcIO2MkOuLqDogdGFyZ2V0IOuYkOuKlCB1bmlxdWXqsIAg7J6I6rOgIG92ZXJyaWRlPXRydWXsnbgg6rK97JqwXG4gICAgY29uc3QgZXhpc3RpbmdSZWNvcmQgPSBmaXh0dXJlLnRhcmdldCA/PyBmaXh0dXJlLnVuaXF1ZTtcbiAgICBjb25zdCBpc092ZXJyaWRlTW9kZSA9IGZpeHR1cmUub3ZlcnJpZGUgJiYgZXhpc3RpbmdSZWNvcmQ7XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZWQgY29sdW1u7J2AIElOU0VSVOyXkOyEnCDsoJzsmbggKERC6rCAIOyekOuPmSDsg53shLEpXG4gICAgICBpZiAoXCJnZW5lcmF0ZWRcIiBpbiBwcm9wICYmIHByb3AuZ2VuZXJhdGVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZCDsspjrpqw6IE92ZXJyaWRlIOuqqOuTnOydvCDrlYzrp4wg6riw7KG0IOqwkiDsgqzsmqlcbiAgICAgIGlmIChwcm9wTmFtZSA9PT0gXCJpZFwiKSB7XG4gICAgICAgIGlmIChpc092ZXJyaWRlTW9kZSAmJiBleGlzdGluZ1JlY29yZCkge1xuICAgICAgICAgIC8vIE92ZXJyaWRlOiDquLDsobQg66CI7L2U65Oc7J2YIOqwkiDsgqzsmqkg4oaSIFVQREFURVxuICAgICAgICAgIHJvd1twcm9wTmFtZV0gPSBleGlzdGluZ1JlY29yZC5jb2x1bW5zW3Byb3BOYW1lXT8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8g7IOIIOugiOy9lOuTnDog7KCc7Jm4IOKGkiBJTlNFUlQgKERCL1Vwc2VydEJ1aWxkZXLqsIAg7IOd7ISxKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gY29sdW1uLnZhbHVlIGFzIG51bWJlciB8IG51bGw7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCAhPT0gbnVsbCAmJiByZWxhdGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcblxuICAgICAgICAgICAgLy8g66i87KCAIHNraXDrkJwgZml4dHVyZeyduOyngCDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IHNraXBwZWRFeGlzdGluZ0lkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpPy5leGlzdGluZ0lkO1xuICAgICAgICAgICAgaWYgKHNraXBwZWRFeGlzdGluZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gc2tpcOuQnCBmaXh0dXJlIOKGkiB0YXJnZXQgRELsnZgg6riw7KG0IOugiOy9lOuTnCBpZCDsgqzsmqlcbiAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gc2tpcHBlZEV4aXN0aW5nSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgICAvLyDsnbTrr7ggdXBzZXJ065CcIOqwmeydgCDthYzsnbTruJQgZml4dHVyZSDtmZXsnbhcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkSW5zZXJ0ZWRJZHMgPSBpbnNlcnRlZElkc0J5VGFibGU/LmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxJZCA9IHJlbGF0ZWRJbnNlcnRlZElkcz8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0dWFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgLy8g7J2066+4IHVwc2VydOuQqCDihpIg7Iuk7KCcIElEIOyCrOyaqVxuICAgICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gYWN0dWFsSWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIOyVhOyngSB1cHNlcnQg7JWI65CoIOKGkiBVQlJlZiDsgqzsmqlcbiAgICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHJlbGF0ZWRSZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg66CI7L2U65OcIOKGkiBJRCDqt7jrjIDroZwg7IKs7JqpXG4gICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhc01hbnksIE1hbnlUb01hbnnripQg67OE64+EIOyymOumrFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvFxuICAgICAgICByb3dbcHJvcE5hbWVdID0gdGhpcy5jb252ZXJ0Q29sdW1uVmFsdWUocHJvcCBhcyBFbnRpdHlQcm9wLCBjb2x1bW4udmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYFJlZ2lzdGVyaW5nICR7ZW50aXR5LnRhYmxlfSAtICR7aW5zcGVjdChyb3csIGZhbHNlLCBudWxsLCB0cnVlKX1gKSk7XG4gICAgY29uc3QgcmVmID0gdGhpcy5idWlsZGVyLnJlZ2lzdGVyKGVudGl0eS50YWJsZSwgcm93KTtcbiAgICB0aGlzLmZpeHR1cmVSZWZNYXAuc2V0KGZpeHR1cmUuZml4dHVyZUlkLCByZWYpO1xuXG4gICAgcmV0dXJuIHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6zrn7wg6rCSIOuzgO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0Q29sdW1uVmFsdWUocHJvcDogRW50aXR5UHJvcCwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwcm9wLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIC8vIFVwc2VydEJ1aWxkZXIucmVnaXN0ZXLsl5DshJwgSlNPTi5zdHJpbmdpZnkg7LKY66as7ZWY66+A66GcIG9iamVjdCDqt7jrjIDroZwg7KCE64usXG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnMoXG4gICAgdHJ4OiBLbmV4LlRyYW5zYWN0aW9uLFxuICAgIGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10sXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXI+PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHNvdXJjZVJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuXG4gICAgICBpZiAoIXNvdXJjZVJlZikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHNvdXJjZVV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgY29uc3Qgc291cmNlSWQgPSBzb3VyY2VVdWlkVG9JZD8uZ2V0KHNvdXJjZVJlZi51dWlkKTtcblxuICAgICAgaWYgKHNvdXJjZUlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IFssIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSAmJiBBcnJheS5pc0FycmF5KGNvbHVtbi52YWx1ZSkpIHtcbiAgICAgICAgICAvLyDshKDtg53rkJjsp4Ag7JWK7J2AIE1hbnlUb01hbnkg6rSA6rOE64qUIOyggOyepe2VmOyngCDslYrsnYxcbiAgICAgICAgICBjb25zdCB0YXJnZXRUYWJsZSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgaWYgKHRoaXMuYnVpbGRlci5oYXNUYWJsZSh0YXJnZXRUYWJsZS50YWJsZSkgPT09IGZhbHNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBjb2x1bW4udmFsdWUgYXMgbnVtYmVyW107XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGpvaW5UYWJsZSA9IChwcm9wIGFzIE1hbnlUb01hbnlSZWxhdGlvblByb3ApLmpvaW5UYWJsZTtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcblxuICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUoZW50aXR5LnRhYmxlKX1faWRgO1xuICAgICAgICAgIGNvbnN0IHRhcmdldENvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsYXRlZEVudGl0eS50YWJsZSl9X2lkYDtcblxuICAgICAgICAgIGZvciAoY29uc3QgcmVsYXRlZElkIG9mIHJlbGF0ZWRJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWA7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcblxuICAgICAgICAgICAgbGV0IHRhcmdldElkOiBudW1iZXI7XG5cbiAgICAgICAgICAgIGlmIChyZWxhdGVkUmVmKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRVdWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQocmVsYXRlZEVudGl0eS50YWJsZSk7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkSWQgPSByZWxhdGVkVXVpZFRvSWQ/LmdldChyZWxhdGVkUmVmLnV1aWQpO1xuXG4gICAgICAgICAgICAgIGlmIChyZXNvbHZlZElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBgUmVsYXRlZCBmaXh0dXJlICR7cmVsYXRlZEZpeHR1cmVJZH0gbm90IGZvdW5kIGluIGluc2VydGVkSWRzLCBza2lwcGluZ2AsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0YXJnZXRJZCA9IHJlc29sdmVkSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0YXJnZXRJZCA9IHJlbGF0ZWRJZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSm9pblRhYmxl7JeQIOyCveyehVxuICAgICAgICAgICAgY29uc3QgW2ZvdW5kXSA9IGF3YWl0IHRyeChqb2luVGFibGUpXG4gICAgICAgICAgICAgIC53aGVyZSh7XG4gICAgICAgICAgICAgICAgW3NvdXJjZUNvbHVtbl06IHNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIFt0YXJnZXRDb2x1bW5dOiB0YXJnZXRJZCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmxpbWl0KDEpO1xuXG4gICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRyeChqb2luVGFibGUpLmluc2VydCh7XG4gICAgICAgICAgICAgICAgW3NvdXJjZUNvbHVtbl06IHNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIFt0YXJnZXRDb2x1bW5dOiB0YXJnZXRJZCxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICAgICAgICBgSW5zZXJ0ZWQgaW50byAke2pvaW5UYWJsZX06ICR7ZW50aXR5LnRhYmxlfSgke3NvdXJjZUlkfSkgLSAke3JlbGF0ZWRFbnRpdHkudGFibGV9KCR7dGFyZ2V0SWR9KWAsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6rCZ7J2AIO2FjOydtOu4lCDrgrQgZml4dHVyZeuTpOydhCBzZWxmLXJlZmVyZW5jZSDroIjrsqjrs4TroZwg67aE7ZWgXG4gICAqIC0gc2VsZi1yZWZlcmVuY2XqsIAg7JeG64qUIGZpeHR1cmXrk6Q6IExldmVsIDBcbiAgICogLSBMZXZlbCAw7J2EIOywuOyhsO2VmOuKlCBmaXh0dXJl65OkOiBMZXZlbCAxXG4gICAqIC0g67CY67O1XG4gICAqXG4gICAqIFVwc2VydEJ1aWxkZXLqsIAgc2VsZi1yZWZlcmVuY2XqsIAg7J6I7Jy866m0IGJ1aWxkSW5zZXJ0TGV2ZWxzKCnroZwg7J6s7KCV66Cs7ZWY7JesXG4gICAqIOuTseuhnSDsiJzshJzsmYAg67CY7ZmYIOyInOyEnOqwgCDri6zrnbzsp4gg7IiYIOyeiOyKteuLiOuLpC5cbiAgICog7J2066W8IOuwqeyngO2VmOq4sCDsnITtlbQgRml4dHVyZU1hbmFnZXLqsIAg66CI67Ko67OE66GcIOuCmOuIoOyEnCDsspjrpqztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGdyb3VwRml4dHVyZXNCeUxldmVsKGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10pOiBGaXh0dXJlUmVjb3JkW11bXSB7XG4gICAgaWYgKGZpeHR1cmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmVzWzBdLmVudGl0eUlkKTtcblxuICAgIC8vIHNlbGYtcmVmZXJlbmNlIHJlbGF0aW9uIHByb3Ag7LC+6riwXG4gICAgY29uc3Qgc2VsZlJlZlByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcihcbiAgICAgIChwKTogcCBpcyBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AgfCBPbmVUb09uZVJlbGF0aW9uUHJvcCA9PlxuICAgICAgICBpc1JlbGF0aW9uUHJvcChwKSAmJlxuICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocCkgJiYgcC5oYXNKb2luQ29sdW1uKSkgJiZcbiAgICAgICAgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgKTtcblxuICAgIGlmIChzZWxmUmVmUHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBzZWxmLXJlZmVyZW5jZSDsl4bsnYwg4oaSIOuLqOydvCDroIjrsqhcbiAgICAgIHJldHVybiBbZml4dHVyZXNdO1xuICAgIH1cblxuICAgIC8vIOugiOuyqOuzhCDrtoTtlaAgKHRvcG9sb2dpY2FsIHNvcnQpXG4gICAgY29uc3QgbGV2ZWxzOiBGaXh0dXJlUmVjb3JkW11bXSA9IFtdO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IG5ldyBTZXQoZml4dHVyZXMubWFwKChmKSA9PiBmLmZpeHR1cmVJZCkpO1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgd2hpbGUgKHJlbWFpbmluZy5zaXplID4gMCkge1xuICAgICAgY29uc3QgY3VycmVudExldmVsOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICAgIGlmICghcmVtYWluaW5nLmhhcyhmaXh0dXJlLmZpeHR1cmVJZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIHNlbGYtcmVmZXJlbmNl6rCAIOuqqOuRkCDsnbTrr7gg7LKY66as65CQ6rGw64KYIG51bGzsnbgg6rK97JqwXG4gICAgICAgIGNvbnN0IGNhblByb2Nlc3MgPSBzZWxmUmVmUHJvcHMuZXZlcnkoKHByb3ApID0+IHtcbiAgICAgICAgICBjb25zdCByZWZJZCA9IGZpeHR1cmUuY29sdW1uc1twcm9wLm5hbWVdPy52YWx1ZSBhcyBudW1iZXIgfCBudWxsO1xuICAgICAgICAgIGlmIChyZWZJZCA9PT0gbnVsbCB8fCByZWZJZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICBjb25zdCByZWZGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVmSWR9YDtcbiAgICAgICAgICAvLyDsnbTrr7gg7LKY66as65CQ6rGw64KYLCDtmITsnqwgZml4dHVyZXPsl5Ag7Y+s7ZWo65CY7KeAIOyViuydgCDqsr3smrAgKOyZuOu2gCDssLjsobApXG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZC5oYXMocmVmRml4dHVyZUlkKSB8fCAhcmVtYWluaW5nLmhhcyhyZWZGaXh0dXJlSWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2FuUHJvY2Vzcykge1xuICAgICAgICAgIGN1cnJlbnRMZXZlbC5wdXNoKGZpeHR1cmUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50TGV2ZWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ0lkcyA9IEFycmF5LmZyb20ocmVtYWluaW5nKS5qb2luKFwiLCBcIik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2lyY3VsYXIgc2VsZi1yZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gJHtlbnRpdHkudGFibGV9LiBSZW1haW5pbmcgZml4dHVyZXM6ICR7cmVtYWluaW5nSWRzfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBjdXJyZW50TGV2ZWwpIHtcbiAgICAgICAgcmVtYWluaW5nLmRlbGV0ZShmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICAgIHByb2Nlc3NlZC5hZGQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgfVxuXG4gICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgIH1cblxuICAgIHJldHVybiBsZXZlbHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrVW5pcXVlVmlvbGF0aW9uKGRiOiBLbmV4LCBlbnRpdHk6IEVudGl0eSwgZml4dHVyZTogRml4dHVyZVJlY29yZCkge1xuICAgIGNvbnN0IF91bmlxdWVJbmRleGVzID0gZW50aXR5LmluZGV4ZXM/LmZpbHRlcigoaSkgPT4gaS50eXBlID09PSBcInVuaXF1ZVwiKSA/PyBbXTtcblxuICAgIGNvbnN0IHVuaXF1ZUluZGV4ZXMgPSBfdW5pcXVlSW5kZXhlcy5maWx0ZXIoKGluZGV4KSA9PlxuICAgICAgaW5kZXguY29sdW1ucy5ldmVyeSgoY29sdW1uKSA9PiAhY29sdW1uLm5hbWUuc3RhcnRzV2l0aChgJHtlbnRpdHkudGFibGV9X19gKSksXG4gICAgKTtcbiAgICBpZiAodW5pcXVlSW5kZXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCB1bmlxdWVRdWVyeSA9IGRiKGVudGl0eS50YWJsZSk7XG4gICAgbGV0IGhhc0NvbmRpdGlvbiA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBpbmRleCBvZiB1bmlxdWVJbmRleGVzKSB7XG4gICAgICAvLyDsu6zrn7wg7KSRIO2VmOuCmOudvOuPhCBudWxs7J2066m0IOycoOuLiO2BrCDsoJzslb3snYQg7JyE67CY7ZWY7KeAIOyViuq4sCDrlYzrrLjsl5Ag7ZW064u5IOyduOuNseyKpOuKlCDrrLTsi5xcbiAgICAgIGNvbnN0IGNvbnRhaW5zTnVsbCA9IGluZGV4LmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuICAgICAgICByZXR1cm4gZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUgPT09IG51bGw7XG4gICAgICB9KTtcbiAgICAgIGlmIChjb250YWluc051bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHVuaXF1ZVF1ZXJ5ID0gdW5pcXVlUXVlcnkub3JXaGVyZSgocWIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgaW5kZXguY29sdW1ucykge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUpKSB7XG4gICAgICAgICAgICBxYi53aGVyZUluKGNvbHVtbi5uYW1lLCBmaXh0dXJlLmNvbHVtbnNbZmllbGRdLnZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcWIuYW5kV2hlcmUoY29sdW1uLm5hbWUsIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaGFzQ29uZGl0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgW3VuaXF1ZUZvdW5kXSA9IGF3YWl0IHVuaXF1ZVF1ZXJ5O1xuICAgIHJldHVybiB1bmlxdWVGb3VuZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMoXG4gICAgZGI6IEtuZXgsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgZml4dHVyZTogRml4dHVyZVJlY29yZCxcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZUNsYXVzZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgIC8vIHJlbGF0aW9uIO2VhOuTnOyduCDqsr3smrAgX2lkIOu2meydtOq4sFxuICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbik7XG4gICAgICBjb25zdCBkYkNvbHVtbiA9IHByb3AgJiYgaXNSZWxhdGlvblByb3AocHJvcCkgPyBgJHtjb2x1bW59X2lkYCA6IGNvbHVtbjtcbiAgICAgIGNvbnN0IHZhbHVlID0gZml4dHVyZS5jb2x1bW5zW2NvbHVtbl0/LnZhbHVlO1xuXG4gICAgICAvLyBudWxsIOqwkuydtCDtj6ztlajrkJwg6rK97JqwIOykkeuztSDtmZXsnbgg7Iqk7YK1XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgd2hlcmVDbGF1c2VbZGJDb2x1bW5dID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZvdW5kXSA9IGF3YWl0IGRiKGVudGl0eS50YWJsZSkud2hlcmUod2hlcmVDbGF1c2UpLmxpbWl0KDEpO1xuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIGFzeW5jIGFkZEZpeHR1cmVMb2FkZXIoY29kZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcGF0aCA9IGAke1NvbmFtdS5hcGlSb290UGF0aH0vc3JjL3Rlc3RpbmcvZml4dHVyZS50c2A7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhwYXRoKS50b1N0cmluZygpO1xuXG4gICAgY29uc3QgZml4dHVyZUxvYWRlclN0YXJ0ID0gY29udGVudC5pbmRleE9mKFwiY29uc3QgZml4dHVyZUxvYWRlciA9IHtcIik7XG4gICAgY29uc3QgZml4dHVyZUxvYWRlckVuZCA9IGNvbnRlbnQuaW5kZXhPZihcIn07XCIsIGZpeHR1cmVMb2FkZXJTdGFydCk7XG5cbiAgICBpZiAoZml4dHVyZUxvYWRlclN0YXJ0ICE9PSAtMSAmJiBmaXh0dXJlTG9hZGVyRW5kICE9PSAtMSkge1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGAke2NvbnRlbnQuc2xpY2UoMCwgZml4dHVyZUxvYWRlckVuZCl9ICAke2NvZGV9XFxuJHtjb250ZW50LnNsaWNlKGZpeHR1cmVMb2FkZXJFbmQpfWA7XG5cbiAgICAgIHdyaXRlRmlsZVN5bmMocGF0aCwgbmV3Q29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBmaW5kIGZpeHR1cmVMb2FkZXIgaW4gZml4dHVyZS50c1wiKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEZpeHR1cmVNYW5hZ2VyID0gbmV3IEZpeHR1cmVNYW5hZ2VyQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJjaGFsayIsImV4ZWNTeW5jIiwicmVhZEZpbGVTeW5jIiwid3JpdGVGaWxlU3luYyIsImluZmxlY3Rpb24iLCJ1bmlxdWUiLCJpbnNwZWN0IiwiU29uYW11IiwiQmFzZU1vZGVsIiwiY3JlYXRlS25leEluc3RhbmNlIiwiVXBzZXJ0QnVpbGRlciIsIkVudGl0eU1hbmFnZXIiLCJpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCIsImlzSGFzTWFueVJlbGF0aW9uUHJvcCIsImlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCIsImlzT25lVG9PbmVSZWxhdGlvblByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImlzVmlydHVhbFByb3AiLCJSZWxhdGlvbkdyYXBoIiwiRml4dHVyZU1hbmFnZXJDbGFzcyIsIl90ZGIiLCJ0ZGIiLCJFcnJvciIsIl9mZGIiLCJmZGIiLCJjYWNoZWRUYWJsZU5hbWVzIiwicmVsYXRpb25HcmFwaCIsImJ1aWxkZXIiLCJmaXh0dXJlUmVmTWFwIiwiTWFwIiwic2tpcHBlZEZpeHR1cmVzIiwiaW5pdCIsImRiQ29uZmlnIiwidGVzdCIsInByb2R1Y3Rpb25fbWFzdGVyIiwidENvbm4iLCJjb25uZWN0aW9uIiwicENvbm4iLCJob3N0IiwicG9ydCIsImRhdGFiYXNlIiwiZml4dHVyZSIsInN5bmMiLCJmaXh0dXJlQ29ubiIsInRlc3RDb25uIiwidGVzdFBnRW52IiwiUEdQQVNTV09SRCIsInBhc3N3b3JkIiwidXNlciIsInN0ZGlvIiwiZW52IiwicHJvY2VzcyIsImZpeHR1cmVQZ0VudiIsImR1bXBDbWQiLCJyZXN0b3JlQ21kIiwic2hlbGwiLCJ2aXNpdGVkUmVjb3JkcyIsIlNldCIsImltcG9ydEZpeHR1cmUiLCJlbnRpdHlJZCIsImlkcyIsImNsZWFyIiwicXVlcmllcyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJpZCIsImdldEltcG9ydFF1ZXJpZXMiLCJmbGF0Iiwid2RiIiwiZ2V0REIiLCJxdWVyeSIsInJhdyIsImZpZWxkIiwicmVjb3JkS2V5IiwiaGFzIiwiYWRkIiwiZW50aXR5IiwiZ2V0Iiwicm93IiwidGFibGUiLCJ3aGVyZSIsImxpbWl0IiwidW5kZWZpbmVkIiwiZml4dHVyZURhdGFiYXNlIiwicmVhbERhdGFiYXNlIiwic2VsZlF1ZXJ5IiwiYXJncyIsIk9iamVjdCIsImVudHJpZXMiLCJyZWxhdGlvbnMiLCJmaWx0ZXIiLCJyZWxhdGlvbiIsImN1c3RvbUpvaW5DbGF1c2UiLCJoYXNKb2luQ29sdW1uIiwicmVsYXRlZEVudGl0eSIsIndpdGgiLCJyZWxhdGVkSWRDb2x1bW5OYW1lIiwicHJvcHMiLCJmaW5kIiwicCIsIm5hbWUiLCJhcmciLCJyZWxRdWVyaWVzIiwicmV2ZXJzZSIsImRlc3Ryb3kiLCJnZXRGaXh0dXJlcyIsInNvdXJjZURCTmFtZSIsInRhcmdldERCTmFtZSIsInNlYXJjaE9wdGlvbnMiLCJkdXBsaWNhdGVDaGVjayIsInNvdXJjZURCIiwidGFyZ2V0REIiLCJ2YWx1ZSIsInNlYXJjaFR5cGUiLCJjb2x1bW4iLCJwcm9wIiwidHlwZSIsInJvd3MiLCJsZW5ndGgiLCJmaXh0dXJlcyIsImluaXRpYWxSZWNvcmRzTGVuZ3RoIiwibmV3UmVjb3JkcyIsImNyZWF0ZUZpeHR1cmVSZWNvcmQiLCJfZGIiLCJwdXNoIiwiY3VycmVudEZpeHR1cmVSZWNvcmQiLCJyIiwiZml4dHVyZUlkIiwiZmV0Y2hlZFJlY29yZHMiLCJzbGljZSIsImN1c3RvbUNvbHVtbnMiLCJjb2x1bW5zIiwiY3VzdG9tRHVwbGljYXRlUm93IiwiY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMiLCJyZWNvcmQiLCJzaW5nbGVSZWNvcmQiLCJ0YXJnZXQiLCJ1bmlxdWVSb3ciLCJjaGVja1VuaXF1ZVZpb2xhdGlvbiIsImYiLCJvcHRpb25zIiwicmVjb3JkcyIsInZpc2l0ZWRFbnRpdGllcyIsImNyZWF0ZSIsImJlbG9uZ3NSZWNvcmRzIiwiZGIiLCJ0aHJvdWdoVGFibGUiLCJqb2luVGFibGUiLCJmcm9tQ29sdW1uIiwic2luZ3VsYXJpemUiLCJ0b0NvbHVtbiIsInJlbGF0ZWRJZHMiLCJwbHVjayIsImpvaW5Db2x1bW4iLCJyZWxhdGVkUHJvcCIsInJlbGF0ZWRSb3ciLCJmaXJzdCIsInJlbGF0ZWRJZCIsImluc2VydEZpeHR1cmVzIiwiZGJOYW1lIiwiX2ZpeHR1cmVzIiwicmVzdWx0cyIsImJ1aWxkR3JhcGgiLCJpbnNlcnRpb25PcmRlciIsImdldEluc2VydGlvbk9yZGVyIiwiaGFzVGFyZ2V0IiwiaGFzVW5pcXVlIiwiaGFzRHVwbGljYXRlIiwib3ZlcnJpZGUiLCJleGlzdGluZ0lkIiwic2V0IiwiY29uc29sZSIsImxvZyIsInllbGxvdyIsImZpeHR1cmVzQnlUYWJsZSIsInRhYmxlT3JkZXIiLCJ0YWJsZU5hbWUiLCJ0cmFuc2FjdGlvbiIsInRyeCIsImluc2VydGVkSWRzQnlUYWJsZSIsInRhYmxlRml4dHVyZXMiLCJsZXZlbHMiLCJncm91cEZpeHR1cmVzQnlMZXZlbCIsImxldmVsRml4dHVyZXMiLCJyZWdpc3RlckZpeHR1cmUiLCJibHVlIiwiZ2V0VGFibGUiLCJ1dWlkcyIsInV1aWQiLCJpbmRleE9mIiwidXBzZXJ0IiwiZXhpc3RpbmdNYXAiLCJpIiwid2FybiIsInByb2Nlc3NNYW55VG9NYW55UmVsYXRpb25zIiwic2tpcHBlZCIsImRhdGEiLCJyZWYiLCJ1dWlkVG9JZCIsImluc2VydGVkSWQiLCJncmVlbiIsImV4aXN0aW5nUmVjb3JkIiwiaXNPdmVycmlkZU1vZGUiLCJwcm9wTmFtZSIsImdlbmVyYXRlZCIsInJlbGF0ZWRGaXh0dXJlSWQiLCJza2lwcGVkRXhpc3RpbmdJZCIsInJlbGF0ZWRSZWYiLCJyZWxhdGVkSW5zZXJ0ZWRJZHMiLCJhY3R1YWxJZCIsImNvbnZlcnRDb2x1bW5WYWx1ZSIsInJlZ2lzdGVyIiwiRGF0ZSIsInNvdXJjZVJlZiIsInNvdXJjZVV1aWRUb0lkIiwic291cmNlSWQiLCJBcnJheSIsImlzQXJyYXkiLCJ0YXJnZXRUYWJsZSIsImhhc1RhYmxlIiwic291cmNlQ29sdW1uIiwidGFyZ2V0Q29sdW1uIiwidGFyZ2V0SWQiLCJyZWxhdGVkVXVpZFRvSWQiLCJyZXNvbHZlZElkIiwiZm91bmQiLCJpbnNlcnQiLCJzZWxmUmVmUHJvcHMiLCJyZW1haW5pbmciLCJwcm9jZXNzZWQiLCJzaXplIiwiY3VycmVudExldmVsIiwiY2FuUHJvY2VzcyIsImV2ZXJ5IiwicmVmSWQiLCJyZWZGaXh0dXJlSWQiLCJyZW1haW5pbmdJZHMiLCJmcm9tIiwiam9pbiIsImRlbGV0ZSIsIl91bmlxdWVJbmRleGVzIiwiaW5kZXhlcyIsInVuaXF1ZUluZGV4ZXMiLCJpbmRleCIsInN0YXJ0c1dpdGgiLCJ1bmlxdWVRdWVyeSIsImhhc0NvbmRpdGlvbiIsImNvbnRhaW5zTnVsbCIsInNvbWUiLCJyZXBsYWNlIiwib3JXaGVyZSIsInFiIiwid2hlcmVJbiIsImFuZFdoZXJlIiwidW5pcXVlRm91bmQiLCJ3aGVyZUNsYXVzZSIsImRiQ29sdW1uIiwiYWRkRml4dHVyZUxvYWRlciIsImNvZGUiLCJwYXRoIiwiYXBpUm9vdFBhdGgiLCJjb250ZW50IiwidG9TdHJpbmciLCJmaXh0dXJlTG9hZGVyU3RhcnQiLCJmaXh0dXJlTG9hZGVyRW5kIiwibmV3Q29udGVudCIsIkZpeHR1cmVNYW5hZ2VyIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLFNBQVNDLFFBQVEsUUFBUSxnQkFBZ0I7QUFDekMsU0FBU0MsWUFBWSxFQUFFQyxhQUFhLFFBQVEsS0FBSztBQUNqRCxPQUFPQyxnQkFBZ0IsYUFBYTtBQUVwQyxTQUFTQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxPQUFPLFFBQVEsT0FBTztBQUMvQixTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFDaEMsU0FBU0MsU0FBUyxRQUFRLDRCQUF5QjtBQUVuRCxTQUFTQyxrQkFBa0IsUUFBUSxzQkFBbUI7QUFDdEQsU0FBcUJDLGFBQWEsUUFBUSxnQ0FBNkI7QUFFdkUsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQU9FQywwQkFBMEIsRUFDMUJDLHFCQUFxQixFQUNyQkMsd0JBQXdCLEVBQ3hCQyxzQkFBc0IsRUFDdEJDLGNBQWMsRUFDZEMsYUFBYSxRQUdSLG9CQUFpQjtBQUN4QixTQUFTQyxhQUFhLFFBQVEsdUJBQW9CO0FBU2xELE9BQU8sTUFBTUM7SUFDSEMsT0FBb0IsS0FBSztJQUNqQyxJQUFJQyxJQUFJQSxHQUFTLEVBQUU7UUFDakIsSUFBSSxDQUFDRCxJQUFJLEdBQUdDO0lBQ2Q7SUFDQSxJQUFJQSxNQUFZO1FBQ2QsSUFBSSxJQUFJLENBQUNELElBQUksS0FBSyxNQUFN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
|