@magic-xpa/engine 4.801.0-dev481.310 → 4.801.0-dev481.313
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/esm2020/index.mjs +1 -3
- package/esm2020/src/ClientManager.mjs +3 -39
- package/esm2020/src/ConstInterface.mjs +2 -216
- package/esm2020/src/CurrentClientVersion.mjs +2 -2
- package/esm2020/src/FlowMonitorInterface.mjs +1 -23
- package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +2 -28
- package/esm2020/src/data/DataView.mjs +1 -23
- package/esm2020/src/data/FieldsTable.mjs +1 -9
- package/esm2020/src/data/RecordOutOfDataViewException.mjs +1 -9
- package/esm2020/src/env/Environment.mjs +2 -71
- package/esm2020/src/event/EventHandler.mjs +1 -12
- package/esm2020/src/event/EventsManager.mjs +2 -2
- package/esm2020/src/event/RunTimeEvent.mjs +1 -15
- package/esm2020/src/event/UserEventsTable.mjs +1 -4
- package/esm2020/src/exp/YesNoExp.mjs +1 -6
- package/esm2020/src/remote/RemoteCommandsProcessor.mjs +1 -4
- package/esm2020/src/remote/ServerError.mjs +1 -5
- package/esm2020/src/rt/Argument.mjs +2 -11
- package/esm2020/src/rt/Boundary.mjs +1 -7
- package/esm2020/src/rt/DataviewHeaders.mjs +1 -4
- package/esm2020/src/rt/HandlersTable.mjs +1 -4
- package/esm2020/src/rt/Transaction.mjs +1 -2
- package/esm2020/src/tasks/MGDataCollection.mjs +1 -8
- package/esm2020/src/tasks/sort/SortCollection.mjs +1 -6
- package/fesm2015/magic-xpa-engine.mjs +38 -522
- package/fesm2015/magic-xpa-engine.mjs.map +1 -1
- package/fesm2020/magic-xpa-engine.mjs +38 -522
- package/fesm2020/magic-xpa-engine.mjs.map +1 -1
- package/index.d.ts +0 -2
- package/package.json +4 -4
- package/src/ClientManager.d.ts +0 -10
- package/src/ConstInterface.d.ts +1 -214
- package/src/FlowMonitorInterface.d.ts +0 -22
- package/src/commands/ClientToServer/CommandFactory.d.ts +0 -7
- package/src/data/DataView.d.ts +0 -5
- package/src/data/FieldsTable.d.ts +0 -1
- package/src/data/RecordOutOfDataViewException.d.ts +0 -3
- package/src/env/Environment.d.ts +0 -27
- package/src/event/EventHandler.d.ts +0 -4
- package/src/event/RunTimeEvent.d.ts +0 -8
- package/src/event/UserEventsTable.d.ts +0 -1
- package/src/exp/YesNoExp.d.ts +0 -1
- package/src/remote/ServerError.d.ts +0 -4
- package/src/rt/Argument.d.ts +0 -1
- package/src/rt/Boundary.d.ts +0 -3
- package/src/rt/DataviewHeaders.d.ts +0 -1
- package/src/rt/HandlersTable.d.ts +0 -1
- package/src/rt/Transaction.d.ts +0 -1
- package/src/tasks/MGDataCollection.d.ts +0 -1
- package/src/tasks/sort/SortCollection.d.ts +0 -1
- package/esm2020/src/tasks/MenusDeserializer.mjs +0 -3
- package/esm2020/src/util/Process.mjs +0 -7
- package/src/tasks/MenusDeserializer.d.ts +0 -2
- package/src/util/Process.d.ts +0 -3
|
@@ -384,11 +384,6 @@ export class DataView extends DataViewBase {
|
|
|
384
384
|
this.getTask().setTransactionFailed(true);
|
|
385
385
|
}
|
|
386
386
|
}
|
|
387
|
-
InsertSingleRecord(record) {
|
|
388
|
-
this._recordsTab.InsertedRecordsCount = 0;
|
|
389
|
-
this._recordsTab.InsertRecord(this._insertAt, record);
|
|
390
|
-
this.UpdateDataviewAfterInsert();
|
|
391
|
-
}
|
|
392
387
|
UpdateDataviewAfterInsert() {
|
|
393
388
|
if (this._insertAt === 'B') {
|
|
394
389
|
let newRecs = this._recordsTab.InsertedRecordsCount;
|
|
@@ -1566,29 +1561,12 @@ export class DataView extends DataViewBase {
|
|
|
1566
1561
|
this.CurrRec.setSameAs(recBackup, false);
|
|
1567
1562
|
this.takeFldValsFromCurrRec();
|
|
1568
1563
|
}
|
|
1569
|
-
GetRecordById(id) {
|
|
1570
|
-
return this._recordsTab.getRecord(id);
|
|
1571
|
-
}
|
|
1572
|
-
GetModifiedRecord() {
|
|
1573
|
-
let record = null;
|
|
1574
|
-
if (this._modifiedRecordsTab.getSize() > 0) {
|
|
1575
|
-
Debug.Assert(this._modifiedRecordsTab.getSize() === 1);
|
|
1576
|
-
record = this._modifiedRecordsTab.getRecByIdx(0);
|
|
1577
|
-
}
|
|
1578
|
-
return record;
|
|
1579
|
-
}
|
|
1580
1564
|
GetCurrentRecId() {
|
|
1581
1565
|
return this._currRecId;
|
|
1582
1566
|
}
|
|
1583
1567
|
DataviewBoundriesAreChanged(orgIncludesFirst, orgIncludesLast) {
|
|
1584
1568
|
return orgIncludesFirst !== this.IncludesFirst() || orgIncludesLast !== this.IncludesLast();
|
|
1585
1569
|
}
|
|
1586
|
-
GetRecordMainIdx() {
|
|
1587
|
-
return this._rmIdx;
|
|
1588
|
-
}
|
|
1589
|
-
GetRecordMainSize() {
|
|
1590
|
-
return this._rmSize;
|
|
1591
|
-
}
|
|
1592
1570
|
GetRouteParams() {
|
|
1593
1571
|
let params = new List();
|
|
1594
1572
|
for (let i = 0; i < this._fieldsTab.getSize(); i++) {
|
|
@@ -1629,4 +1607,4 @@ export class DataView extends DataViewBase {
|
|
|
1629
1607
|
return (params.length > 0) ? params : null;
|
|
1630
1608
|
}
|
|
1631
1609
|
}
|
|
1632
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YVZpZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL2RhdGEvRGF0YVZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixLQUFLLEVBQ0wsS0FBSyxFQUNMLEtBQUssRUFDTCxpQkFBaUIsRUFDakIsSUFBSSxFQUNKLE9BQU8sRUFFUixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixJQUFJLEVBQ0osZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wscUJBQXFCLEVBRXJCLGdCQUFnQixFQUloQixHQUFHLEVBRUgsYUFBYSxFQUNkLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU3QyxPQUFPLEVBQUUsY0FBYyxJQUFJLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLDBDQUEwQyxFQUMzQyxNQUFNLGdDQUFnQyxDQUFDO0FBRXhDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFeEMsT0FBTyxF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Q0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO3dCQUN6RixHQUFHLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUN0RSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNqQixNQUFNO3FCQUNQO2lCQUNGO2FBQ0Y7U0FDRjtRQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uRXhjZXB0aW9uLFxyXG4gIERlYnVnLFxyXG4gIEludDMyLFxyXG4gIEludDY0LFxyXG4gIGlzTnVsbE9yVW5kZWZpbmVkLFxyXG4gIExpc3QsXHJcbiAgTk51bWJlcixcclxuICBTdHJpbmdCdWlsZGVyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTWlzYyxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBEYXRhTW9kaWZpY2F0aW9uVHlwZXMsXHJcbiAgRGNWYWx1ZXMsXHJcbiAgRGlzcGxheUNvbnZlcnRvcixcclxuICBJUmVjb3JkLFxyXG4gIE1nQ29udHJvbEJhc2UsXHJcbiAgTWdGb3JtQmFzZSxcclxuICBQSUMsXHJcbiAgUHJvcGVydHksXHJcbiAgUHJvcEludGVyZmFjZVxyXG59IGZyb20gJ0BtYWdpYy14cGEvZ3VpJztcclxuaW1wb3J0IHsgQ29uc3RJbnRlcmZhY2UgfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7IFJlY29yZHNUYWJsZSB9IGZyb20gJy4vUmVjb3Jkc1RhYmxlJztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi9SZWNvcmQnO1xyXG5pbXBvcnQgeyBUYXNrQmFzZSB9IGZyb20gJy4uL3Rhc2tzL1Rhc2tCYXNlJztcclxuaW1wb3J0IHsgTWdGb3JtIH0gZnJvbSAnLi4vZ3VpL01nRm9ybSc7XHJcbmltcG9ydCB7IEZpZWxkc1RhYmxlRXh0IGFzIEZpZWxkc1RhYmxlIH0gZnJvbSAnLi9GaWVsZHNUYWJsZSc7XHJcbmltcG9ydCB7XHJcbiAgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbixcclxuICBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uX0V4Y2VwdGlvblR5cGVcclxufSBmcm9tICcuL1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24nO1xyXG5pbXBvcnQgeyBJQ2xpZW50Q29tbWFuZCB9IGZyb20gJy4uL2NvbW1hbmRzL0lDbGllbnRDb21tYW5kJztcclxuaW1wb3J0IHsgQ29tbWFuZEZhY3RvcnkgfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db21tYW5kRmFjdG9yeSc7XHJcbmltcG9ydCB7IFhNTEJhc2VkRGNWYWx1ZXNCdWlsZGVyIH0gZnJvbSAnLi9YTUxCYXNlZERjVmFsdWVzQnVpbGRlcic7XHJcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9GaWVsZCc7XHJcbmltcG9ydCB7IE1nQ29udHJvbCB9IGZyb20gJy4uL2d1aS9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQgeyBFdmVudFN1YlR5cGUgfSBmcm9tICcuLi9lbnVtcyc7XHJcbmltcG9ydCB7IEV2ZW50Q29tbWFuZCB9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0V2ZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yIH0gZnJvbSAnLi4vcmVtb3RlL1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yJztcclxuaW1wb3J0IHsgRmllbGRCYXNlIH0gZnJvbSAnLi9GaWVsZEJhc2UnO1xyXG5pbXBvcnQgeyBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIgfSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3Nvck1hbmFnZXInO1xyXG5pbXBvcnQgeyBEYXRhVmlld0Jhc2UgfSBmcm9tICcuL0RhdGFWaWV3QmFzZSc7XHJcbmltcG9ydCB7IEFjY2Vzc0hlbHBlciwgQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24gfSBmcm9tICcuLi9BY2Nlc3NIZWxwZXInO1xyXG5pbXBvcnQgeyBNR0RhdGFDb2xsZWN0aW9uIH0gZnJvbSAnLi4vdGFza3MvTUdEYXRhQ29sbGVjdGlvbic7XHJcbmltcG9ydCB7IFRhc2sgfSBmcm9tICcuLi90YXNrcy9UYXNrJztcclxuXHJcblxyXG4vLyBDT05TVEFOVFNcclxuZXhwb3J0IGNvbnN0IFNFVF9ESVNQTEFZTElORV9CWV9EVjogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcbmNvbnN0IENPTVBVVEVfTkVXUkVDX09OX0NMSUVOVDogc3RyaW5nID0gJ0MnO1xyXG5jb25zdCBVTktOT1dOX1JDTVBTX05PVF9JTklURUQ6IHN0cmluZyA9ICdNJztcclxuY29uc3QgVU5LTk9XTl9SQ01QU19GT1VORDogc3RyaW5nID0gJ1knO1xyXG5cclxuY29uc3QgSU5WT0tFRF9GUk9NX09GRkxJTkVfVEFTSzogc3RyaW5nID0gJy05OTk5OSc7XHJcblxyXG5jb25zdCBDSFVOS19DQUNIRV9ORVhUOiBzdHJpbmcgPSAnTic7XHJcbmNvbnN0IENIVU5LX0NBQ0hFX1BSRVY6IHN0cmluZyA9ICdQJztcclxuY29uc3QgQ0hVTktfRFZfQk9UVE9NOiBzdHJpbmcgPSAnQic7XHJcbmNvbnN0IENIVU5LX0RWX1RPUDogc3RyaW5nID0gJ1QnO1xyXG5cclxuY29uc3QgQ09NUFVURV9GTFVTSF9VUERBVEVTOiBzdHJpbmcgPSAnSCc7XHJcblxyXG5jb25zdCBDT01QVVRFX05FV1JFQ19PTl9TRVJWRVI6IHN0cmluZyA9ICdTJztcclxuY29uc3QgRU5EX0RWX1RBRzogc3RyaW5nID0gJzwvJyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVyArICc+JztcclxuY29uc3QgUkVDT1ZFUllfQUNUX0JFR0lOX1NDUkVFTjogc3RyaW5nID0gJ1MnO1xyXG5cclxuLy8gcmVjb3ZlcnkgYWN0aW9uIHRha2VuIGJ5IHRoZSBjbGllbnQgaW4gcmVzcG9uc2UgdG8gcmVjb3ZlcnkgdHlwZVxyXG5jb25zdCBSRUNPVkVSWV9BQ1RfQkVHSU5fVEFCTEU6IHN0cmluZyA9ICdUJztcclxuY29uc3QgUkVDT1ZFUllfQUNUX0NBTkNFTDogc3RyaW5nID0gJ0MnO1xyXG5jb25zdCBSRUNPVkVSWV9BQ1RfTU9WRV9ESVJFQ1RJT05fQkVHSU46IHN0cmluZyA9ICdCJztcclxuY29uc3QgUkVDT1ZFUllfQUNUX05PTkU6IHN0cmluZyA9ICdOJztcclxuY29uc3QgVFJBTlNfU1RBVF9DTE9TRUQ6IHN0cmluZyA9ICdDJztcclxuY29uc3QgVFJBTlNfU1RBVF9PUEVORUQ6IHN0cmluZyA9ICdPJztcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgdGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBkYXRhdmlldyBvZiBhIHRhc2tcclxuZXhwb3J0IGNsYXNzIERhdGFWaWV3IGV4dGVuZHMgRGF0YVZpZXdCYXNlIHtcclxuICBwcml2YXRlIF9jYWNoZUxydVRpbWVTdGFtcDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9jaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfY2h1bmtTaXplOiBudW1iZXIgPSAzMDtcclxuICBwcml2YXRlIF9jb21wdXRlQnk6IHN0cmluZyA9ICdcXDAnOyAvLyB0ZWxscyB0aGUgY2xpZW50IHRvIGV4ZWN1dGUgdGhlIGNvbXB1dGUgb2YgbmV3IHJlY29yZHMgb24gdGhlIGNsaWVudCBvciBvbiB0aGUgc2VydmVyXHJcbiAgcHJpdmF0ZSBfY3VyclJlY0lkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX2N1cnJSZWNJZHg6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfZHZQb3NWYWx1ZTogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9maXJzdER2OiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIF9mbHVzaFVwZGF0ZXM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVFJVRSBtZWFucyB0aGF0IHdoZW5ldmVyIGEgcmVjb3JkIGlzIGNoYW5nZWQgd2UgbXVzdCBzZW5kIGl0IHRvIHRoZSBzZXJ2ZXJcclxuICBwcml2YXRlIF9oYXNNYWluVGFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIF9pbnNlcnRBdDogc3RyaW5nID0gJyAnO1xyXG5cclxuICBzZXQgSW5zZXJ0QXQodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5faW5zZXJ0QXQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBJbnNlcnRBdCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luc2VydEF0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB0cnVlLCBpZiB3ZSBhcmUgZXhlY3V0aW5nIGxvY2FsIGRhdGF2aWV3IGNvbW1hbmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEluTG9jYWxEYXRhdmlld0NvbW1hbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9sYXN0Q3JlYXRlZFJlY0lkOiBudW1iZXIgPSAwOyAvLyB0aGUgcmVjb3JkIGlkIG9mIHRoZSBsYXN0IGNyZWF0ZWQgcmVjb3JkIGlkXHJcbiAgcHJpdmF0ZSBfbGFzdFNlc3Npb25Db3VudGVyOiBudW1iZXIgPSBJbnQ2NC5NaW5WYWx1ZTtcclxuICBwcml2YXRlIF9sb2NhdGVGaXJzdFJlYzogbnVtYmVyID0gLTE7XHJcbiAgcHJpdmF0ZSBfbW9kaWZpZWRSZWNvcmRzVGFiOiBSZWNvcmRzVGFibGUgPSBudWxsOyAvLyBhZnRlciBzZW5kaW5nIHRoZXNlIHJlY29yZHMgdG8gdGhlIHNlcnZlciB0aGUgbGlzdCBpcyBjbGVhcmVkXHJcblxyXG4gIHByaXZhdGUgX29sZFRvcFJlY0lkeDogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcbiAgcHJpdmF0ZSBfb3JpZ2luYWw6IFJlY29yZCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGVuZGluZ1JlY292ZXJ5OiBzdHJpbmcgPSBSRUNPVkVSWV9BQ1RfTk9ORTsgLy8gd2hlbiBkaWZmZXJlbnQgdGhhbiBOT05FLCBtZWFucyB0aGUgc2VydmVyIG9yZGVyIGZvciByZWNvdmVyeSB3YXMgbm90IHBlcmZvcm1lZCAoeWV0KS5cclxuICBwcml2YXRlIF9wcmV2Q3VyclJlYzogUmVjb3JkID0gbnVsbDtcclxuICBwcml2YXRlIF9yZWNvcmRzVGFiOiBSZWNvcmRzVGFibGUgPSBudWxsOyAvLyA8ZGF0YXZpZXc+IC4uLjwvZGF0YXZpZXc+IHRhZ1xyXG4gIHByaXZhdGUgX3JlY292ZXJ5OiBzdHJpbmcgPSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FOyAvLyByZWNvdmVyeSBhY3Rpb24gcmVxdWVzdCwgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXHJcbiAgcHJpdmF0ZSBfcm1JZHg6IG51bWJlciA9IDA7IC8vIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZmllbGQgaW4gdGhlIHJlY29yZCBtYWluXHJcbiAgcHJpdmF0ZSBfcm1TaXplOiBudW1iZXIgPSAwOyAvLyBudW1iZXIgb2YgXCJzZWxlY3RcInMgaW4gdGhlIHJlY29yZCBtYWluXHJcbiAgcHJpdmF0ZSBfc2tpcFBhcnNpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF90b3BSZWNJZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF90b3BSZWNJZHg6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gIHByaXZhdGUgX3RvcFJlY0lkeE1vZGlmaWVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfdHJhbnNDbGVhcmVkOiBib29sZWFuID0gZmFsc2U7IC8vIElmIHRydWUsIF90YXNrIGlzIHRoZSBvd25lciBvZiBhIFJlYyBsZXZlbCB0cmFuc2FjdGlvbiBhbmQgdGhlIF90YXNrIGlzIGluIF90YXNrIHN1ZmZpeFxyXG4gIHByaXZhdGUgX3Vua25vd25SY21wOiBzdHJpbmcgPSBVTktOT1dOX1JDTVBTX05PVF9JTklURUQ7IC8vIHNpZ25hbHMgaWYgYSB2aXJ0dWFsIGZpZWxkIHdpdGhvdXQgaW5pdCBleHByZXNzaW9uIGhhcyBzZXJ2ZXIgcmNtcCBhY3Rpb25cclxuXHJcbiAgSXNPbmVXYXlLZXk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgX2luY2x1ZGVzRmlyc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBfaW5jbHVkZXNMYXN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgX3NlcnZlclRyYW5zQ2FjaGVFbXB0eTogYm9vbGVhbiA9IHRydWU7IC8vIGluZGljYXRpb24gd2hldGhlciB0aGUgc2VydmVyIHNpZGUgdHJhbnNhY3Rpb24gY2FjaGUgaXMgZW1wdHlcclxuXHJcbiAgcHJpdmF0ZSBfY3VyclJlY19ET19OT1RfVVNFX0RJUkVDVExZX1VTRV9TRVRURVJfR0VUVEVSOiBSZWNvcmQgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGdldCBDdXJyUmVjKCk6IFJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyclJlY19ET19OT1RfVVNFX0RJUkVDVExZX1VTRV9TRVRURVJfR0VUVEVSO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXQgQ3VyclJlYyh2YWx1ZTogUmVjb3JkKSB7XHJcbiAgICAvLyByZXNldCB0aGUgcHJldiBkY1ZhbElkcyBpbiBtZ2NvbnRyb2xcclxuICAgIGlmICh0aGlzLl9jdXJyUmVjX0RPX05PVF9VU0VfRElSRUNUTFlfVVNFX1NFVFRFUl9HRVRURVIgIT09IG51bGwgJiYgdmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fY3VyclJlY19ET19OT1RfVVNFX0RJUkVDVExZX1VTRV9TRVRURVJfR0VUVEVSLnJlc2V0RGNWYWx1ZUlkKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9jdXJyUmVjX0RPX05PVF9VU0VfRElSRUNUTFlfVVNFX1NFVFRFUl9HRVRURVIgPSB2YWx1ZTtcclxuXHJcbiAgICAvLyBzZXQgdGhlIGRjVmFsSWRzIGluIG1nY29udHJvbFxyXG4gICAgaWYgKHRoaXMuX2N1cnJSZWNfRE9fTk9UX1VTRV9ESVJFQ1RMWV9VU0VfU0VUVEVSX0dFVFRFUiAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9jdXJyUmVjX0RPX05PVF9VU0VfRElSRUNUTFlfVVNFX1NFVFRFUl9HRVRURVIuU2V0RGNWYWx1ZUlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgRmx1c2hVcGRhdGVzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZsdXNoVXBkYXRlcztcclxuICB9XHJcblxyXG4gIGdldCBIYXNNYWluVGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faGFzTWFpblRhYmxlO1xyXG4gIH1cclxuXHJcbiAgREJWaWV3U2l6ZTogbnVtYmVyID0gMDtcclxuICB0YXNrTW9kZUZyb21DYWNoZTogc3RyaW5nO1xyXG5cclxuICBnZXQgQ3VycmVudFJlY0lkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyclJlY0lkO1xyXG4gIH1cclxuXHJcbiAgRHZjb3VudDogbnVtYmVyID0gMDtcclxuICBUb3RhbFJlY29yZHNDb3VudDogbnVtYmVyID0gMDtcclxuICBSZWNvcmRzQmVmb3JlQ3VycmVudFZpZXc6IG51bWJlciA9IDA7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZmlyc3QgRGF0YXZpZXcgUmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXQgRmlyc3RSZWNvcmQoKTogSVJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCgwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gbGFzdCBkYXRhdmlldyByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBMYXN0UmVjb3JkKCk6IElSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgodGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgLSAxKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3Rvcih0YXNrOiBUYXNrQmFzZSk7XHJcbiAgY29uc3RydWN0b3IoRGF0YVZpZXc6IERhdGFWaWV3KTtcclxuICBjb25zdHJ1Y3Rvcih0YXNrT3JEYXRhVmlldzogRGF0YVZpZXcgfCBUYXNrQmFzZSkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIGlmICh0YXNrT3JEYXRhVmlldyBpbnN0YW5jZW9mIFRhc2tCYXNlKSB7XHJcbiAgICAgIHRoaXMuX3Rhc2sgPSA8VGFza0Jhc2U+dGFza09yRGF0YVZpZXc7XHJcbiAgICAgIHRoaXMuX2ZpZWxkc1RhYiA9IG5ldyBGaWVsZHNUYWJsZSgpO1xyXG4gICAgICB0aGlzLl9yZWNvcmRzVGFiID0gbmV3IFJlY29yZHNUYWJsZSh0cnVlKTtcclxuICAgICAgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiID0gbmV3IFJlY29yZHNUYWJsZShmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHRhc2tPckRhdGFWaWV3KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIGlmIHRoZSBmaXJzdCByb3cgb2YgZGF0YSBpcyBleGlzdHMgaW4gdGhlIGNsaWVudCdzIGRhdGEgdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlzIHRoZSBmaXJzdCByb3cgb2YgZGF0YSBpcyBpbmNsdWRlZCBpbiB0aGUgY2xpZW50IDwvcmV0dXJucz5cclxuICBJbmNsdWRlc0ZpcnN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVzRmlyc3Q7XHJcbiAgfVxyXG5cclxuICBnZXQgU2VydmVyVHJhbnNhY3Rpb25DYWNoZUVtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlclRyYW5zQ2FjaGVFbXB0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVja3MgaWYgdGhlIGxhc3Qgcm93IG9mIGRhdGEgaXMgaW5jbHVkZWQgaW4gdGhlIGNsaWVudCdzIGRhdGEgdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoZSBsYXN0IHJvdyBvZiBkYXRhIGlzIGluY2x1ZGVkIGluIHRoZSBjbGllbnQncyBkYXRhIHZpZXcgPC9yZXR1cm5zPlxyXG4gIEluY2x1ZGVzTGFzdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlc0xhc3Q7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgdGhlIERWSEVBREVSIHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZmlsbEhlYWRlckRhdGEocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIHdoaWxlICh0aGlzLmluaXRIZWFkZXJJbm5lck9iamVjdHMocGFyc2VyLCBwYXJzZXIuZ2V0TmV4dFRhZygpKSkge1xyXG4gICAgfVxyXG4gICAgdGhpcy5EdmNvdW50ID0gKDxUYXNrQmFzZT50aGlzLl90YXNrKS5jdGxfaXRtXzRfcGFyZW50X3ZlZSgwLCAxKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSB0aGUgRFZIRUFERVIgaW5uZXIgb2JqZWN0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3VuZFRhZ05hbWVcIj4gIG5hbWUgb2YgdGFnLCBvZiBvYmplY3QsIHdoaWNoIG5lZWQgYmUgYWxsb2NhdGVkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGlzIGZpbmlzaGVkIGlubmVyIHRhZzwvcmV0dXJucz5cclxuICBwcml2YXRlIGluaXRIZWFkZXJJbm5lck9iamVjdHMocGFyc2VyOiBYbWxQYXJzZXIsIGZvdW5kVGFnTmFtZTogU3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19EVkhFQURFUikge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZygnZHZoZWFkZXIgZm91bmQnKTtcclxuICAgICAgdGhpcy5nZXRIZWFkZXJBdHRyaWJ1dGVzKHBhcnNlcik7XHJcbiAgICAgIHRoaXMuX2ZpZWxkc1RhYi5maWxsRGF0YShwYXJzZXIsIHRoaXMpO1xyXG4gICAgICAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuc2V0Uk1Qb3ModGhpcy5fcm1TaXplLCB0aGlzLl9ybUlkeCk7XHJcbiAgICB9IGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gKCcvJyArIFhNTENvbnN0YW50cy5NR19UQUdfRFZIRUFERVIpKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgRFZIRUFERVIgdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldEhlYWRlckF0dHJpYnV0ZXMocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPjtcclxuICAgIGxldCB0YWc6IHN0cmluZztcclxuICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZztcclxuICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nO1xyXG5cclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIHRhZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKFhNTENvbnN0YW50cy5NR19UQUdfRFZIRUFERVIpICsgWE1MQ29uc3RhbnRzLk1HX1RBR19EVkhFQURFUi5sZW5ndGgpO1xyXG4gICAgICB0b2tlbnNWZWN0b3IgPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcblxyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgICAgYXR0cmlidXRlID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgICAgdmFsdWVTdHIgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKSk7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUk1QT1M6IHtcclxuICAgICAgICAgICAgbGV0IGk6IG51bWJlciA9IHZhbHVlU3RyLmluZGV4T2YoJywnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpID4gLTEpIHtcclxuICAgICAgICAgICAgICB0aGlzLl9ybVNpemUgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyLnN1YnN0cigwLCBpKSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcm1JZHggPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyLnN1YnN0cihpICsgMSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NPTVBVVEVfQlk6XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXB1dGVCeSA9IHZhbHVlU3RyWzBdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbXB1dGVCeSA9PT0gQ09NUFVURV9GTFVTSF9VUERBVEVTKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fY29tcHV0ZUJ5ID0gQ09NUFVURV9ORVdSRUNfT05fU0VSVkVSO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2ZsdXNoVXBkYXRlcyA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuX2ZsdXNoVXBkYXRlcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSEFTX01BSU5fVEJMOlxyXG4gICAgICAgICAgICB0aGlzLl9oYXNNYWluVGFibGUgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NIVU5LX1NJWkU6XHJcbiAgICAgICAgICAgIHRoaXMuX2NodW5rU2l6ZSA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DSFVOS19TSVpFX0VYUFJFU1NJT046XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdVbmtub3duIGF0dHJpYnV0ZSBmb3IgPCcgKyBYTUxDb25zdGFudHMuTUdfVEFHX0RWSEVBREVSICsgJz4gdGFnOiAnICtcclxuICAgICAgICAgICAgICBhdHRyaWJ1dGUpOyAvLyB0byBkZWxldGUgXCI+XCIgdG9vXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZygnaW4gRGF0YVZpZXcuZ2V0SGVhZGVyQXR0cmlidXRlcygpOiBvdXQgb2YgYm91bmRzJyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgdGhlIERBVEFWSUVXIHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZmlsbERhdGEocGFyc2VyOiBYbWxQYXJzZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3NraXBQYXJzaW5nID0gZmFsc2U7XHJcbiAgICB3aGlsZSAoYXdhaXQgdGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlciwgcGFyc2VyLmdldE5leHRUYWcoKSkpIHtcclxuICAgIH1cclxuICAgIHRoaXMuUmVzZXRGaXJzdER2KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCB0cmFuc2FjdGlvbiBiZWdpbiBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIEdldFRyYW5zYWN0aW9uQmVnaW4oKTogc3RyaW5nIHtcclxuICAgIGxldCB0cmFuc0JlZ2luOiBzdHJpbmcgPSAnXFwwJztcclxuICAgIGxldCB0cmFuc0JlZ2luUHJvcDogUHJvcGVydHkgPSB0aGlzLl90YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVFJBU0FDVElPTl9CRUdJTik7XHJcbiAgICBpZiAodHJhbnNCZWdpblByb3AgIT09IG51bGwpIHtcclxuICAgICAgdHJhbnNCZWdpbiA9ICh0cmFuc0JlZ2luUHJvcC5HZXRDb21wdXRlZFZhbHVlKCkpLmNoYXJBdCgwKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJhbnNCZWdpbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSB0aGUgREFUQVZJRVcgaW5uZXIgb2JqZWN0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3VuZFRhZ05hbWVcIj4gIG5hbWUgb2YgdGFnLCBvZiBvYmplY3QsIHdoaWNoIG5lZWQgYmUgYWxsb2NhdGVkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGlzIGZpbmlzaGVkIGlubmVyIHRhZzwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGluaXRJbm5lck9iamVjdHMocGFyc2VyOiBYbWxQYXJzZXIsIGZvdW5kVGFnTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKTtcclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSAoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXKSkge1xyXG4gICAgICBsZXQgaW52YWxpZGF0ZTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuZ2V0QXR0cmlidXRlcyhwYXJzZXIpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3NraXBQYXJzaW5nKSB7XHJcbiAgICAgICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihFTkRfRFZfVEFHLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIEVORF9EVl9UQUcubGVuZ3RoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBwYXJzZSB0aGUgZXhlYyBzdGFjayBlbnRyaWVzIHZhbHVlc1xyXG4gICAgICAgIHRoaXMuZmlsbEV4ZWNTdGFjayhwYXJzZXIpO1xyXG5cclxuICAgICAgICAvLyBwYXJzZSB0aGUgZGF0YSBjb250cm9scyB2YWx1ZXNcclxuICAgICAgICB0aGlzLmZpbGxEYXRhRGMocGFyc2VyKTtcclxuICAgICAgICBpZiAoaW52YWxpZGF0ZSAmJiBmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgZm9ybS5TZXRUYWJsZUl0ZW1zQ291bnQoMCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGxldCB0YXNrUmVmcmVzaFR5cGU6IHN0cmluZyA9IHRoaXMuX3JlY29yZHNUYWIuZmlsbERhdGEodGhpcywgdGhpcy5faW5zZXJ0QXQsIHBhcnNlcik7XHJcblxyXG4gICAgICAgIGlmIChmb3JtICE9IG51bGwpIHtcclxuICAgICAgICAgIC8vIEZvciB0aGUgZmlyc3QgdGltZSwgYXMgdGhlIHRhYmxlIGNvbnRyb2wgaXMgbm90IHlldCBjcmVhdGVkLCBubyBuZWVkIHRvIHVwZGF0ZSB0aGUgdGFibGUgaXRlbSdzIGNvdW50LlxyXG4gICAgICAgICAgLy8gU2V0IHRoZSB1cGRhdGVkIHRhYmxlIGl0ZW1zIGNvdW50IG9ubHkgd2hlbiBmb3JtIGlzIGFscmVhZHkgb3BlbmVkLlxyXG4gICAgICAgICAgaWYgKGZvcm0uT3BlbmVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbnNlcnRBdCA9PT0gJ0InICYmIChpbnZhbGlkYXRlIHx8IHRoaXMuX3JlY29yZHNUYWIuSW5zZXJ0ZWRSZWNvcmRzQ291bnQgPiAwKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGlmIChpbnZhbGlkYXRlIHx8ICEoPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKSkuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgICAgICAgICAgIGZvcm0uU2V0VGFibGVJdGVtc0NvdW50KDAsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgZm9ybS5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBmb3JtLkluc2VydFRhYmxlSXRlbXMoMCwgdGhpcy5fcmVjb3Jkc1RhYi5JbnNlcnRlZFJlY29yZHNDb3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGZvcm0uc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuQ3VyclJlYyAhPSBudWxsICYmIHRoaXMuQ3VyclJlYy5JblJlY29tcHV0ZSAmJiB0YXNrUmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfTk9ORSlcclxuICAgICAgICAgIHRhc2tSZWZyZXNoVHlwZSA9IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUM7XHJcblxyXG4gICAgICAgIGlmIChpbnZhbGlkYXRlKSB7XHJcbiAgICAgICAgICB0YXNrUmVmcmVzaFR5cGUgPSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk07XHJcbiAgICAgICAgICBpZiAodGhpcy5fdGFzay5Jc1N1YkZvcm0pXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdldFRhc2soKS5TZXRSZWZyZXNoVHlwZSh0YXNrUmVmcmVzaFR5cGUpO1xyXG4gICAgICAgIHRoaXMuVXBkYXRlRGF0YXZpZXdBZnRlckluc2VydCgpO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAgICAgKiB0aGUgcmVjb3JkcyB0YWJsZSBtaWdodCBzZXQgYSBuZXcgY3VycmVudCByZWNvcmQuIEl0XHJcbiAgICAgICAgICAgICAqIGFjdHVhbGx5IGJlY29tZXMgdGhlIGN1cnJlbnQgcmVjb3JkIGJ5IGNhbGxpbmcgc2V0Q3VyclJlYygpXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgIGxldCBuZXdSZWNJZDogbnVtYmVyID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRJbml0aWFsQ3VyclJlY0lkKCk7XHJcblxyXG4gICAgICAgIGlmIChuZXdSZWNJZCAhPT0gSW50MzIuTWluVmFsdWUgJiYgKHRoaXMuX3JlY292ZXJ5ID09PSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FIHx8IHRoaXMuX2ZpcnN0RHYpKSB7XHJcblxyXG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjbGllbnQgcGVyZm9ybXMgdGhlIGZpcnN0IHJlY29yZCBwcmVmaXhcclxuICAgICAgICAgIGlmICh0aGlzLl9maXJzdER2ICYmIHRoaXMuX3JlY292ZXJ5ID09PSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FICYmXHJcbiAgICAgICAgICAgICh0aGlzLl90YXNrLmdldExldmVsKCkuY2hhckNvZGVBdCgwKSA9PT0gMCB8fCB0aGlzLl90YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spKVxyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgICAgIC8vIElmIHRoZSBzZXJ2ZXIgc2VudCB1cyBhbiB1cGRhdGVkIGN1cnJSZWMgdGhlbiBpbnZhbGlkYXRlIGFsbCBjdXJyZW50IHZhbHVlcy5cclxuICAgICAgICAgIC8vIHRoaXMgd2lsbCBmb3JjZSBhbGwgbmV3IHZhbHVlcyB0byBiZSBjb3BpZWQgZnJvbSB0aGUgY3VyclJlYyB0byB0aGUgZGF0YXZpZXcsXHJcbiAgICAgICAgICAvLyBlc3BlY2lhbGx5IHZpcnR1YWwgZmllbGRzIHdpdGggbm8gaW5pdCBleHByZXNzaW9uLlxyXG4gICAgICAgICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmludmFsaWRhdGUodHJ1ZSwgRmllbGQuTEVBVkVfRkxBR1MpO1xyXG5cclxuICAgICAgICAgIGlmIChuZXdSZWNJZCAhPT0gdGhpcy5fY3VyclJlY0lkKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlYyhuZXdSZWNJZCwgIXRoaXMuX2ZpcnN0RHYpO1xyXG4gICAgICAgICAgICB0aGlzLl9vcmlnaW5hbCA9IHRoaXMuQ3VyclJlYy5yZXBsaWNhdGUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGZpeCBidWcgIzc3OTg1ODogZm9yY2UgY29tcHV0ZSBmb3IgdGhlIGZpcnN0IHJlY29yZCBpbiBhIHNjcmVlbiBtb2RlIF90YXNrXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9maXJzdER2KVxyXG4gICAgICAgICAgICAgIHRoaXMudGFrZUZsZFZhbHNGcm9tQ3VyclJlYygpO1xyXG5cclxuICAgICAgICAgICAgLy8gUUNSICM5ODEzMjA6IG1ha2Ugc3VyZSB0aGF0IHZpcnR1YWxzIHdpdGggbm8gaW5pdCBvciBjb250cm9sIGFyZSBpbml0aWFsaXplZFxyXG4gICAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRGb3JtKCkgIT0gbnVsbClcclxuICAgICAgICAgICAgICAoPE1nRm9ybT4odGhpcy5fdGFzay5nZXRGb3JtKCkpKS51cGRhdGVEaXNwbGF5TGluZUJ5RFYoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgdGhpcy50YWtlRmxkVmFsc0Zyb21DdXJyUmVjKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGludmFsaWRhdGUgJiYgdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgPiAwKSB7XHJcbiAgICAgICAgICBpZiAoZm9ybSA9PSBudWxsIHx8IGZvcm0uaXNTY3JlZW5Nb2RlKCkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeCgwLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgLy8gUUNSICM0MzE2MzA6IEZvciBmb3JtcyBpbiBsaW5lIG1vZGUgdGhlcmUgd2FzIGEgc2l0dWF0aW9uIGluIHdoaWNoXHJcbiAgICAgICAgICAgIC8vIGFmdGVyIGludmFsaWRhdGlvbiwgdGhlIGN1cnJlbnQgcmVjb3JkIHdhcyBzZXQgdG8gYmUgdGhlIGZpcnN0IG9mXHJcbiAgICAgICAgICAgIC8vIHRoZSBkYXRhdmlldyBidXQgdGhlIGN1cnJlbnQgbGluZSBvZiB0aGUgZm9ybSB3YXMgZ3JlYXRlciB0aGFuIDAuXHJcbiAgICAgICAgICAgIC8vIEl0IGNhdXNlZCBzYXZpbmcgYW4gb3JpZ2luYWwgcmVjb3JkIHdoaWNoIGlzIGRpZmZlcmVudCB0aGFuIHRoZVxyXG4gICAgICAgICAgICAvLyBvcmlnaW5hbCBvZiB0aGUgY3VycmVudCBmb3JtIGxpbmUuIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSB3ZSBmaXJzdFxyXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgY3Vyc29yIHBhcmtzIG9uIHRoZSBmaXJzdCByb3cgb2YgdGhlIGRhdGF2aWV3LlxyXG4gICAgICAgICAgICAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuaW52YWxpZGF0ZSh0cnVlLCBGaWVsZC5MRUFWRV9GTEFHUyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VG9wUmVjSWR4KDApO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0Rm9ybSgpICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgoMCwgZmFsc2UsIHRydWUsIHRydWUsIDApO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldEZvcm0oKSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIC8vIHRvIHVwZGF0ZSB0cmVlIHdlIG5lZWQgdG8gbG9hZCBub2RlcyBmaXJzdFxyXG4gICAgICAgICAgICAgICAgKDxNZ0Zvcm0+KHRoaXMuX3Rhc2suZ2V0Rm9ybSgpKSkudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCAmJiB0aGlzLl90YXNrLmdldExhc3RQYXJrZWRDdHJsKCkgIT0gbnVsbClcclxuICAgICAgICAgICAgICB0aGlzLl90YXNrLmdldExhc3RQYXJrZWRDdHJsKCkucmVzZXRQcmV2VmFsKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnNhdmVPcmlnaW5hbCgpOyAvLyBBZnRlciBpbnZhbGlkYXRpb24sIHdlIG11c3Qgc2F2ZSB0aGUgb3JpZ2luYWwgcmVjb3JkIHRvb1xyXG4gICAgICAgICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmludmFsaWRhdGUodHJ1ZSwgRmllbGRCYXNlLkNMRUFSX0ZMQUdTKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFFDUiAjNzYxODQ4IHByZXZDdXJyUmVjIHNob3VsZCBzZXQgdGhlIGZpcnN0IHRpbWUgdGhlIGRhdGF2aWV3IGlzIGluaXRpYWxpemVkXHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpcnN0RHYpXHJcbiAgICAgICAgICB0aGlzLnNldFByZXZDdXJyUmVjKCk7XHJcblxyXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBzdWIgZm9ybXMgYXJlIG5vdCB1bm5lY2Vzc2FyaWx5IHJlZnJlc2hlZDpcclxuICAgICAgICAvLyBBZnRlciBzZXR0aW5nIHRoZSBjdXJyZW50IHJlY29yZCBhbmQgYmVmb3JlIGV4ZWN1dGluZyByZWNvcmQgcHJlZml4XHJcbiAgICAgICAgLy8gd2Ugc2F2ZSB0aGUgY3VycmVudCByZWNvcmQgYXMgdGhlIHByZXZpb3VzIHJlY29yZCBzbyB3aGVuIHRoZSByZWNvcmQgcHJlZml4XHJcbiAgICAgICAgLy8gaXMgZXhlY3V0ZWQgaXQgd2lsbCBza2lwIHJlZnJlc2hpbmcgdGhlIHN1YiBmb3Jtcy4gV2UgZG8gdGhhdCBiZWNhdXNlXHJcbiAgICAgICAgLy8gdGhlIHNlcnZlciBhbHJlYWR5IHBhc3NlcyBiYWNrIHRvIHRoZSBjbGllbnQgYWxsIHRoZSBkYXRhdmlld3Mgb2YgdGhlXHJcbiAgICAgICAgLy8gc3ViIGZvcm1zIGluIGEgc2luZ2xlIGl0ZXJhdGlvbi5cclxuICAgICAgICBpZiAoaW52YWxpZGF0ZSAmJiB0aGlzLl90YXNrLklzU3ViRm9ybSlcclxuICAgICAgICAgICg8TWdDb250cm9sQmFzZT50aGlzLl90YXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpKS5SZWZyZXNoT25WaXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yZWNvdmVyeSA9PT0gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSkge1xyXG4gICAgICAgICAgLy8gTm8gbmVlZCB0byBwZXJmb3JtIHJlY29yZCBwcmVmaXggYWZ0ZXIgYSByZWNvcmQgbGV2ZWwgdHJhbnNhY3Rpb24gcmV0cnlcclxuICAgICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5nZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JFVFJZKSAmJlxyXG4gICAgICAgICAgICAhdGhpcy5nZXRUYXNrKCkuSXNBZnRlclJldHJ5QmVmb3JlQnVpbGRYTUwpXHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgdHJhbnNCZWdpbiA9IDxzdHJpbmc+IHRoaXMuR2V0VHJhbnNhY3Rpb25CZWdpbigpO1xyXG5cclxuICAgICAgICAgIGxldCBzdG9wRXhlY3V0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3JlY292ZXJ5KSB7XHJcbiAgICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUk9MTEJBQ0s6XHJcblxyXG4gICAgICAgICAgICAgIGlmICh0cmFuc0JlZ2luID09PSBDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBRQ1IgIzc0NzMxNiBjYW4ndCByb2xsYmFjayBhIGxvc3QgcmVjb3JkXHJcbiAgICAgICAgICAgICAgICAvLyBBbHNvLCBpbiBjYXNlIG9mIG5vbiBpbnRlcmFjdGl2ZSBfdGFzaywgc2tpcCB0byB0aGUgbmV4dCByZWNvcmQuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFIHx8XHJcbiAgICAgICAgICAgICAgICAgICF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUpXHJcbiAgICAgICAgICAgICAgICAgIHN0b3BFeGVjdXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmdldFRhc2soKS5zZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JPTExCQUNLKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5DdXJyUmVjLnJlc3RhcnQodGhpcy5DdXJyUmVjLmdldE1vZGUoKSk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuQ3VyclJlYy5yZXNldE1vZGlmaWVkKCk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsID0gdGhpcy5DdXJyUmVjLnJlcGxpY2F0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVjb3ZlcnkgPSBSRUNPVkVSWV9BQ1RfQ0FOQ0VMO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmICh0cmFuc0JlZ2luICE9PSBDb25zdEludGVyZmFjZS5UUkFOU19OT05FKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1JlY292ZXJ5ID0gUkVDT1ZFUllfQUNUX0JFR0lOX1RBQkxFO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9ST0xMQkFDSyk7XHJcbiAgICAgICAgICAgICAgICAvLyBlbnN1cmUgX3Rhc2sgY2xvc2UgYWN0aW9uIGlzIHN0b3BwZWQgKHRhc2tFbmQpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9SRVRSWTpcclxuICAgICAgICAgICAgICB0aGlzLlJlY292ZXJ5UmV0cnkodHJhbnNCZWdpbik7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICAvLyBpbiBjYXNlIHRoZSB0YXNrIHN1ZmZpeCB3YXMgYWxyZWFkeSBleGVjdXRlZCwgbmVlZCB0byBzZXQgdGhpcyBmbGFnIHRvIGZhbHNlIGluIG9yZGVyIHRvIGVuYWJsZSBpdCB0byBleGVjdXRlIFRTIGFnYWluLlxyXG4gICAgICAgICAgICB0aGlzLmdldFRhc2soKS5UYXNrU3VmZml4RXhlY3V0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gJy8nICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXKSB7XHJcbiAgICAgIGlmICh0aGlzLl9pbmNsdWRlc0ZpcnN0ICYmIHRoaXMuX2luY2x1ZGVzTGFzdCAmJiB0aGlzLmlzRW1wdHkoKSkge1xyXG4gICAgICAgIHRoaXMuX2N1cnJSZWNJZCA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgICAgIHRoaXMuX2N1cnJSZWNJZHggPSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgICAgICB0aGlzLkN1cnJSZWMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc2V0VG9wUmVjSWR4KEludDMyLk1pblZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRyYW5zQmVnaW5cIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgUmVjb3ZlcnlSZXRyeSh0cmFuc0JlZ2luOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0cmFuc0JlZ2luID09PSBDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSB7XHJcbiAgICAgIC8vIE5vIG5lZWQgdG8gcmUtcGVyZm9ybSByZWNvcmQgcHJlZml4IGR1cmluZyByZXRyeS5cclxuICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG5cclxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIHJlY29yZCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc2VydmVyIGFmdGVyIGNvcnJlY3Rpb25cclxuICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0VHJhbnNhY3Rpb25GYWlsZWQodHJ1ZSk7XHJcblxyXG4gICAgICAvLyBlbnN1cmUgcmVjb3JkIHByZWZpeCBpcyBub3QgZXhlY3V0ZWQgZm9yIGFsbCB0YXNrcyB3aGljaCBwYXJ0aWNpcGF0ZSBpbiB0aGUgdHJhbnNhY3Rpb25cclxuICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9SRVRSWSk7XHJcblxyXG4gICAgICAvLyBRQ1IgIzQ3OTY4Njogbm8gbmVlZCB0byBhZGQgdGhlIGN1cnIgcmVjIHRvIHRoZSBsaXN0IGFueW1vcmVcclxuICAgICAgLy8gYmVjYXVzZSB0aGUgaW5zZXJ0L21vZGlmeSBtYXkgYmUgY2FuY2VsZWQgYW5kIGEgcm9sbGJhY2sgZXZlbnRcclxuICAgICAgLy8gd291bGQgYmUgc2VudCB0byB0aGUgc2VydmVyXHJcbiAgICAgIHRoaXMuQ3VyclJlYy5yZXN0YXJ0KHRoaXMuQ3VyclJlYy5nZXRNb2RlKCkpO1xyXG5cclxuICAgICAgLy8gQW4gZXJyb3Igd2hlbiBpbml0aWFsaXppbmcgdGhlIF90YXNrIG5lZWRzIG5vIG1vdmVtZW50IChlcnJvciBpbiByZWMtcHJlZml4KVxyXG4gICAgICBpZiAoIXRoaXMuX2ZpcnN0RHYpIHtcclxuICAgICAgICB0aGlzLnRha2VGbGRWYWxzRnJvbUN1cnJSZWMoKTtcclxuICAgICAgICB0aGlzLl9wZW5kaW5nUmVjb3ZlcnkgPSBSRUNPVkVSWV9BQ1RfTU9WRV9ESVJFQ1RJT05fQkVHSU47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRyYW5zQmVnaW4gIT09IENvbnN0SW50ZXJmYWNlLlRSQU5TX05PTkUpIHtcclxuICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgdGhpcy5fcGVuZGluZ1JlY292ZXJ5ID0gUkVDT1ZFUllfQUNUX0JFR0lOX1NDUkVFTjtcclxuICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9SRVRSWSk7XHJcbiAgICAgIC8vIGVuc3VyZSBfdGFzayBjbG9zZSBhY3Rpb24gaXMgc3RvcHBlZCAodGFza0VuZClcclxuICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0VHJhbnNhY3Rpb25GYWlsZWQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluc2VydCBzaW5nbGUgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNvcmRcIj48L3BhcmFtPlxyXG4gIEluc2VydFNpbmdsZVJlY29yZChyZWNvcmQ6IFJlY29yZCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVjb3Jkc1RhYi5JbnNlcnRlZFJlY29yZHNDb3VudCA9IDA7XHJcbiAgICB0aGlzLl9yZWNvcmRzVGFiLkluc2VydFJlY29yZCh0aGlzLl9pbnNlcnRBdCwgcmVjb3JkKTtcclxuICAgIHRoaXMuVXBkYXRlRGF0YXZpZXdBZnRlckluc2VydCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB1cGRhdGUgRGF0YXZpZXcgQWZ0ZXIgaW5zZXJ0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIFVwZGF0ZURhdGF2aWV3QWZ0ZXJJbnNlcnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faW5zZXJ0QXQgPT09ICdCJy8qJ0InKi8pIHtcclxuXHJcbiAgICAgIGxldCBuZXdSZWNzOiBudW1iZXIgPSB0aGlzLl9yZWNvcmRzVGFiLkluc2VydGVkUmVjb3Jkc0NvdW50O1xyXG4gICAgICBpZiAodGhpcy5fY3VyclJlY0lkeCAhPT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgdGhpcy5fY3VyclJlY0lkeCArPSBuZXdSZWNzO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3RvcFJlY0lkeCAhPT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgdGhpcy5fdG9wUmVjSWR4ICs9IG5ld1JlY3M7XHJcblxyXG4gICAgICBpZiAodGhpcy5fb2xkVG9wUmVjSWR4ICE9PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgICB0aGlzLl9vbGRUb3BSZWNJZHggKz0gbmV3UmVjcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIERBVEFWSUVXIHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRBdHRyaWJ1dGVzKHBhcnNlcjogWG1sUGFyc2VyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz47XHJcbiAgICBsZXQgdGFnOiBTdHJpbmc7XHJcbiAgICBsZXQgYm9vbFZhbDogYm9vbGVhbjtcclxuICAgIGxldCBkYXRhVmlld0NvbW1hbmQ6IElDbGllbnRDb21tYW5kID0gbnVsbDtcclxuICAgIGxldCBpc0VtcHR5RGF0YXZpZXcgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLl9yZWNvdmVyeSA9IENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkU7XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcblxyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgdGFnID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXKSArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVy5sZW5ndGgpO1xyXG4gICAgICB0b2tlbnNWZWN0b3IgPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcblxyXG4gICAgICB0aGlzLl9pbnNlcnRBdCA9ICcgJztcclxuICAgICAgLy8gZmluZCBhbmQgZXhlY3V0ZSBpbnZhbGlkYXRlIGltbWVkaWF0ZWx5XHJcbiAgICAgIGxldCBpbnZhbGlkYXRlOiBib29sZWFuID0gdGhpcy5wZWVrSW52YWxpZGF0ZSh0b2tlbnNWZWN0b3IpO1xyXG5cclxuXHJcblxyXG4gICAgICAvLyBsb2NhdGVGaXJzdFJlYyBpcyBzZW50IGJ5IHNlcnZlciBvbmx5IGlmIHJlY29yZHMgYXJlIGxvY2F0ZWQgZm9yIHRoZSBzdWJmb3JtLlxyXG4gICAgICAvLyBTbywgaXQgc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIDAuXHJcbiAgICAgIHRoaXMuX2xvY2F0ZUZpcnN0UmVjID0gMDtcclxuXHJcbiAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmcgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGopKTtcclxuICAgICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpKTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTlNFUlRfQVQ6XHJcbiAgICAgICAgICAgIHRoaXMuX2luc2VydEF0ID0gdmFsdWVTdHJbMF07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0lOQ0xVREVfRklSU1Q6XHJcbiAgICAgICAgICAgIGJvb2xWYWwgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIHRoaXMuU2V0SW5jbHVkZXNGaXJzdChib29sVmFsKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5DTFVERV9MQVNUOlxyXG4gICAgICAgICAgICBib29sVmFsID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgICB0aGlzLlNldEluY2x1ZGVzTGFzdChib29sVmFsKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSVNfT05FV0FZX0tFWTpcclxuICAgICAgICAgICAgYm9vbFZhbCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgdGhpcy5TZXRPbmVXYXlLZXkoYm9vbFZhbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0RCVklFV1NJWkU6XHJcbiAgICAgICAgICAgIHRoaXMuREJWaWV3U2l6ZSA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTlZBTElEQVRFOiB7XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UT1BfUkVDX0lEOlxyXG4gICAgICAgICAgICB0aGlzLl90b3BSZWNJZCA9IE5OdW1iZXIuUGFyc2UodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UQVNLTU9ERTpcclxuICAgICAgICAgICAgaWYgKCg8VGFza0Jhc2U+dGhpcy5fdGFzaykuZ2V0T3JpZ2luYWxUYXNrTW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX05PTkUgfHwgaW52YWxpZGF0ZSlcclxuICAgICAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldE9yaWdpbmFsVGFza01vZGUodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19NT0RFLCB2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0VNUFRZX0RBVEFWSUVXOlxyXG4gICAgICAgICAgICBpc0VtcHR5RGF0YXZpZXcgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVEFTS0lEOlxyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9MT1dfSUQ6XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RDcmVhdGVkUmVjSWQgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVFJBTlNfU1RBVDpcclxuICAgICAgICAgICAgbGV0IHRyYW5zU3RhdDogc3RyaW5nID0gdmFsdWVTdHJbMF07XHJcbiAgICAgICAgICAgIHN3aXRjaCAodHJhbnNTdGF0KSB7XHJcbiAgICAgICAgICAgICAgY2FzZSBUUkFOU19TVEFUX09QRU5FRDpcclxuICAgICAgICAgICAgICAgIGRhdGFWaWV3Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVNldFRyYW5zYWN0aW9uU3RhdGVEYXRhdmlld0NvbW1hbmQodGhpcy5nZXRUYXNrKCkuZ2V0VGFza1RhZygpLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0VGFzaygpLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuRXhlY3V0ZShkYXRhVmlld0NvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSBUUkFOU19TVEFUX0NMT1NFRDpcclxuICAgICAgICAgICAgICAgIGRhdGFWaWV3Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVNldFRyYW5zYWN0aW9uU3RhdGVEYXRhdmlld0NvbW1hbmQodGhpcy5nZXRUYXNrKCkuZ2V0VGFza1RhZygpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldFRhc2soKS5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLnNldFRyYW5zYWN0aW9uRmFpbGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9SRUNPVkVSWTpcclxuICAgICAgICAgICAgaWYgKCg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSXNUcnlpbmdUb1N0b3ApXHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0VHJ5aW5nVG9TdG9wKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRUYXNrKCkucmVzZXRFeGVjRW5kVGFzaygpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZWNvdmVyeSA9IHZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EVlBPU19WQUxVRTpcclxuICAgICAgICAgICAgdGhpcy5fZHZQb3NWYWx1ZSA9IE5OdW1iZXIuUGFyc2UodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9MT0NBVEVfRklSU1RfSUQ6XHJcbiAgICAgICAgICAgIHRoaXMuX2xvY2F0ZUZpcnN0UmVjID0gTk51bWJlci5QYXJzZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX09GRlNFVDpcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1VTRVJfU09SVDpcclxuICAgICAgICAgICAgLy8gUUNSICMgOTIzMzgwOkdldHRpbmcgdGhlIHZhbHVlIG9mIHVzZXJTb3J0IGZyb20gdGhlIGRhdGF2aWV3IGhlYWRlci5JZiB0cnVlIHRoZW4gc29ydCBzaWduIHdpbGwgYmUgcmVtb3ZlZCBvciBlbHNlIHNob3duLlxyXG4gICAgICAgICAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKTtcclxuICAgICAgICAgICAgZm9ybS5jbGVhclRhYmxlQ29sdW1uU29ydE1hcmsoWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVkFMX1RPVEFMX1JFQ09SRFNfQ09VTlQ6XHJcbiAgICAgICAgICAgIHRoaXMuVG90YWxSZWNvcmRzQ291bnQgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVkFMX1JFQ09SRFNfQkVGT1JFX0NVUlJFTlRfVklFVzpcclxuICAgICAgICAgICAgdGhpcy5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1ZBTF9TRVJWRVJfVFJBTlNfQ0FDSEVfRU1QVFk6XHJcbiAgICAgICAgICAgIHRoaXMuX3NlcnZlclRyYW5zQ2FjaGVFbXB0eSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdVbmtub3duIGF0dHJpYnV0ZSBmb3IgPCcgKyBDb25zdEludGVyZmFjZS5NR19UQUdfREFUQVZJRVcgKyAnPiB0YWc6ICcgKyBhdHRyaWJ1dGUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2V0RW1wdHlEYXRhdmlldyhpc0VtcHR5RGF0YXZpZXcpO1xyXG5cclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleCgrK2VuZENvbnRleHQpO1xyXG4gICAgICByZXR1cm4gaW52YWxpZGF0ZTtcclxuICAgIH1cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZygnaW4gRGF0YVZpZXcuZ2V0QXR0cmlidXRlcygpOiBvdXQgb2YgYm91bmRzJyk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgU2V0T25lV2F5S2V5KHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5Jc09uZVdheUtleSA9IHZhbDtcclxuICB9XHJcblxyXG4gIFNldEluY2x1ZGVzTGFzdCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2luY2x1ZGVzTGFzdCA9IHZhbDtcclxuICB9XHJcblxyXG4gIFNldEluY2x1ZGVzRmlyc3QodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgcHJldkluY2x1ZGVGaXJzdDogYm9vbGVhbiA9IHRoaXMuX2luY2x1ZGVzRmlyc3Q7XHJcbiAgICB0aGlzLl9pbmNsdWRlc0ZpcnN0ID0gdmFsO1xyXG5cclxuICAgIGlmICh0aGlzLl9pbmNsdWRlc0ZpcnN0ICE9PSBwcmV2SW5jbHVkZUZpcnN0KSB7XHJcbiAgICAgIGxldCBmb3JtOiBNZ0Zvcm1CYXNlID0gdGhpcy5fdGFzay5nZXRGb3JtKCk7XHJcbiAgICAgIGlmIChmb3JtICE9PSBudWxsKSB7XHJcbiAgICAgICAgIGZvcm0uU2V0VGFibGVJdGVtc0NvdW50KDAsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgYW5kIGZpbGwgaW5uZXIgZGF0YSBmb3IgYWxsIDxkY192YWw+IHRhZ3MgYXJlIGNvbnRhaW5lZCBpbnRvIHRoZSA8ZGF0YXZpZXc+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGZpbGxEYXRhRGMocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBDcmVhdGUgYSBEQyB2YWx1ZXMgYnVpbGRlci5cclxuICAgIGxldCBkY3ZCdWlsZGVyOiBYTUxCYXNlZERjVmFsdWVzQnVpbGRlciA9IG5ldyBYTUxCYXNlZERjVmFsdWVzQnVpbGRlcigpO1xyXG5cclxuICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgXCJkY192YWxzXCIgdGFncy5cclxuICAgIGxldCBmb3VuZFRhZ05hbWU6IHN0cmluZyA9IHBhcnNlci5nZXROZXh0VGFnKCk7XHJcblxyXG4gICAgd2hpbGUgKGZvdW5kVGFnTmFtZSAhPT0gbnVsbCAmJiBmb3VuZFRhZ05hbWUgPT09IENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQ19WQUxTKSB7XHJcblxyXG4gICAgICAvLyBTYXZlIGN1cnJlbnQgaW5kZXggZm9yIGZ1dHVyZSByZWZlcmVuY2UsIGluIGNhc2Ugb2YgYW4gZXJyb3IuXHJcbiAgICAgIGxldCBkY1ZhbHNQb3NpdGlvbjogbnVtYmVyID0gcGFyc2VyLmdldEN1cnJJbmRleCgpO1xyXG5cclxuICAgICAgZGN2QnVpbGRlci5TZXJpYWxpemVkRENWYWxzID0gcGFyc2VyLlJlYWRUb0VuZE9mQ3VycmVudEVsZW1lbnQoKTtcclxuICAgICAgbGV0IGRjdjogRGNWYWx1ZXMgPSBkY3ZCdWlsZGVyLkJ1aWxkKCk7XHJcblxyXG4gICAgICBpZiAoZGN2ICE9PSBudWxsKVxyXG4gICAgICAgIHRoaXMuQWRkRGNWYWx1ZXMoZGN2KTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZygnRXJyb3Igd2hpbGUgcGFyc2luZyBEQyB2YWx1ZXMgYXQgcG9zaXRpb24gJyArIGRjVmFsc1Bvc2l0aW9uKTtcclxuXHJcbiAgICAgIGZvdW5kVGFnTmFtZSA9IHBhcnNlci5nZXROZXh0VGFnKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBBZGREY1ZhbHVlcyhkY3Y6IERjVmFsdWVzKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kY1ZhbHNDb2xsZWN0aW9uLkFkZChkY3YuZ2V0SWQoKS50b1N0cmluZygpLCBkY3YpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIGFuZCBmaWxsIGlubmVyIGRhdGEgZm9yIGFsbCA8ZXhlY3N0YWNrZW50cnk+IHRhZ3MgYXJlIGNvbnRhaW5lZCBpbnRvIHRoZSA8ZGF0YXZpZXc+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGZpbGxFeGVjU3RhY2socGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGxldCBmb3VuZFRhZ05hbWU6IHN0cmluZyA9IHBhcnNlci5nZXROZXh0VGFnKCk7XHJcbiAgICBsZXQgZXhlY1N0YWNrVGFnRXhpc3RzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgd2hpbGUgKGZvdW5kVGFnTmFtZSAhPT0gbnVsbCAmJiBmb3VuZFRhZ05hbWUgPT09IENvbnN0SW50ZXJmYWNlLk1HX1RBR19FWEVDX1NUQUNLX0VOVFJZKSB7XHJcbiAgICAgIHRoaXMuZmlsbElubmVyRXhlY1N0YWNrKHBhcnNlcik7XHJcbiAgICAgIGZvdW5kVGFnTmFtZSA9IHBhcnNlci5nZXROZXh0VGFnKCk7XHJcbiAgICAgIGV4ZWNTdGFja1RhZ0V4aXN0cyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoZXhlY1N0YWNrVGFnRXhpc3RzKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnJldmVyc2VTZXJ2ZXJFeGVjU3RhY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmaWxsIGlubmVyIG9iamVjdHMgb2YgPGV4ZWNzdGFja2VudHJ5PiB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZmlsbElubmVyRXhlY1N0YWNrKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz47XHJcbiAgICBjb25zdCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19URVJNLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nO1xyXG4gICAgbGV0IHRhc2tJZDogc3RyaW5nID0gJyc7XHJcbiAgICBsZXQgaGFuZGxlcklkOiBzdHJpbmcgPSAnJztcclxuICAgIGxldCBvcGVySWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKENvbnN0SW50ZXJmYWNlLk1HX1RBR19FWEVDX1NUQUNLX0VOVFJZKSArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19FWEVDX1NUQUNLX0VOVFJZLmxlbmd0aCk7XHJcblxyXG4gICAgICB0b2tlbnNWZWN0b3IgPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcblxyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgICAgYXR0cmlidXRlID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgICAgbGV0IHZhbHVlU3RyOiBzdHJpbmcgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKSk7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1RBU0tJRDpcclxuICAgICAgICAgICAgdGFza0lkID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0hBTkRMRVJJRDpcclxuICAgICAgICAgICAgaGFuZGxlcklkID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX09QRVJfSURYOlxyXG4gICAgICAgICAgICBvcGVySWR4ID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoU2VydmVyRXhlY1N0YWNrKHRhc2tJZCwgaGFuZGxlcklkLCBvcGVySWR4KTtcclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0ICsgWE1MQ29uc3RhbnRzLlRBR19URVJNLmxlbmd0aCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZygnaW4gRGF0YVZpZXcuZmlsbElubmVyRXhlY1N0YWNrKCkgb3V0IG9mIGJvdW5kcycpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNlYXJjaCBmb3IgdGhlIGludmFsaWRhdGUgYXR0cmlidXRlIGFuZCBpZiBpdCBpcyB0cnVlIHRoZW4gaXQgYWxzbyBjbGVhcnMgdGhlIGRhdGF2aWV3XHJcbiAgLy8vICAgZXhlY3V0ZSB0aGlzIG1ldGhvZCBCRUZPUkUgcGFyc2luZyB0aGUgcmVjb3Jkc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0b2tlbnNWZWN0b3JcIj5vZiBhbGwgYXR0cmlidXRlcyBhbmQgdmFsdWVzPC9wYXJhbT5cclxuICBwcml2YXRlIHBlZWtJbnZhbGlkYXRlKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2Vzc2lvbkNvdW50ZXI6IG51bWJlciA9IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkdldFNlc3Npb25Db3VudGVyKCk7XHJcblxyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogKz0gMikge1xyXG4gICAgICBsZXQgYXR0cmlidXRlID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGopO1xyXG4gICAgICBpZiAoYXR0cmlidXRlID09PSAoQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTlZBTElEQVRFKSkge1xyXG4gICAgICAgIGxldCB2YWx1ZVN0ciA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSk7XHJcblxyXG4gICAgICAgIGlmIChYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cikpIHtcclxuXHJcbiAgICAgICAgICAvLyBRQ1IgIzI4NjM6IFdoZW4gZXhlY3V0aW5nIFJFQ1VSU0lWRSBjYWxscyB0byB0aGUgc2VydmVyIHRoZXJlIHdlcmUgY2FzZXNcclxuICAgICAgICAgIC8vIGluIHdoaWNoIGFuIG9sZGVyIGRhdGF2aWV3IHN1cGVyc2VkcyBhIG5ldyBvbmUgYmVjYXVzZSBpdHMgcGFyc2luZyBjb21lc1xyXG4gICAgICAgICAgLy8gYWZ0ZXIgdGhlIHBhcnNpbmcgb2YgdGhlIG5ldyBkYXRhdmlldy4gVGhlIHNvbHV0aW9uIGlzIHRvIHNraXAgdGhlXHJcbiAgICAgICAgICAvLyBwYXJzaW5nIG9mIHRoZSBvbGRlciBkYXRhdmlldyBpZiB0aGUgbmV3ZXIgZGF0YXZpZXcgaGFzIGludmFsaWRhdGU9dHJ1ZVxyXG4gICAgICAgICAgaWYgKHNlc3Npb25Db3VudGVyIDwgdGhpcy5fbGFzdFNlc3Npb25Db3VudGVyKVxyXG4gICAgICAgICAgICB0aGlzLl9za2lwUGFyc2luZyA9IHRydWU7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdFNlc3Npb25Db3VudGVyID0gc2Vzc2lvbkNvdW50ZXI7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIGZpZWxkIGJ5IGl0cyBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZE5hbWVcIj5vZiB0aGUgZmllbGQgPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHJlcXVpcmVkIGZpZWxkIChvciBudWxsIGlmIG5vdCBmb3VuZCkgPC9yZXR1cm5zPlxyXG4gIGdldEZpZWxkQnlOYW1lKGZsZE5hbWU6IHN0cmluZyk6IEZpZWxkIHtcclxuXHJcbiAgICBpZiAodGhpcy5fZmllbGRzVGFiICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gPEZpZWxkPnRoaXMuX2ZpZWxkc1RhYi5nZXRGaWVsZChmbGROYW1lKTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coJ2luIERhdGFWaWV3LmdldEZpZWxkKFN0cmluZyk6IFRoZXJlIGlzIG5vIGZpZWxkc1RhYiBvYmplY3QnKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBYTUwgc3RyaW5nIGZvciB0aGUgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWVzc2FnZVwiPnRoZSBtZXNzYWdlIGJ1ZmZlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHB1YmxpYyBhc3luYyBidWlsZFhNTChtZXNzYWdlOiBTdHJpbmdCdWlsZGVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZGN2OiBEY1ZhbHVlcztcclxuICAgIGxldCB0YXNrVGFnOiBTdHJpbmcgPSB0aGlzLl90YXNrLmdldFRhc2tUYWcoKTtcclxuICAgIGxldCBicmtMZXZlbEluZGV4OiBudW1iZXIgPSB0aGlzLl90YXNrLmdldEJya0xldmVsSW5kZXgoKTtcclxuICAgIGxldCBjdXJyUmVjRGVsZXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHNlcnZlclBhcmVudDogU3RyaW5nO1xyXG5cclxuICAgIGxldCBjb250ZXh0VGFzazogVGFza0Jhc2UgPSA8VGFza0Jhc2U+KHRoaXMuZ2V0VGFzaygpLkdldENvbnRleHRUYXNrKCkpO1xyXG4gICAgbGV0IGludm9raW5nVGFza1RhZzogc3RyaW5nID0gY29udGV4dFRhc2suSXNPZmZsaW5lID8gSU5WT0tFRF9GUk9NX09GRkxJTkVfVEFTSyA6IGNvbnRleHRUYXNrLmdldFRhc2tUYWcoKTtcclxuXHJcbiAgICAvLyBwdXQgdGhlIGRhdGF2aWV3IHRhZyBldmVuIGlmIHRoZXJlIGFyZSBubyBtb2RpZmllZCByZWNvcmRzIGp1c3QgdG8gbGV0XHJcbiAgICAvLyB0aGUgc2VydmVyIGtub3cgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgICBtZXNzYWdlLkFwcGVuZCgnXFxuICAgICAgPCcgKyBDb25zdEludGVyZmFjZS5NR19UQUdfREFUQVZJRVcgKyAnICcgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9UQVNLSUQgKyAnPVwiJyArXHJcbiAgICAgIHRhc2tUYWcgKyAnXCInKTtcclxuXHJcbiAgICAvLyBRQ1IgNDIzMDY0IHB1dHMgdGhlIGN1cnJlbnQgZXhlY3V0aW5nIGhhbmRsZXIgaW5kZXhcclxuICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVEFTS0xFVkVMICsgJz1cIicgKyBicmtMZXZlbEluZGV4ICsgJ1wiJyk7XHJcblxyXG4gICAgLy8gSWYgdGhlIHRyaWdnZXIgdGFzayBpcyBhbiBPZmZsaW5lIHByb2dyYW0sIHRoZSBwYXJlbnQgb24gdGhlIHNlcnZlciBzaG91bGQgYmVcclxuICAgIC8vIHRoZSBNYWluIFByb2dyYW0gb2YgdGhlIGN1cnJlbnQgQ1RMLlxyXG4gICAgc2VydmVyUGFyZW50ID0gJzAnO1xyXG4gICAgbGV0IHRyaWdnZXJpbmdUYXNrOiBUYXNrQmFzZSA9IHRoaXMuZ2V0VGFzaygpLmdldFRyaWdnZXJpbmdUYXNrKCk7XHJcbiAgICBpZiAodHJpZ2dlcmluZ1Rhc2sgIT0gbnVsbCkge1xyXG4gICAgICBpZiAodHJpZ2dlcmluZ1Rhc2suSXNPZmZsaW5lKSB7XHJcbiAgICAgICAgbGV0IGN0bElkeDogbnVtYmVyID0gdHJpZ2dlcmluZ1Rhc2suZ2V0Q3RsSWR4KCk7XHJcbiAgICAgICAgbGV0IG1haW5Qcmc6IFRhc2tCYXNlID0gPFRhc2tCYXNlPiBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCgtMSwgY3RsSWR4KTtcclxuICAgICAgICBzZXJ2ZXJQYXJlbnQgPSBtYWluUHJnLmdldFRhc2tUYWcoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgc2VydmVyUGFyZW50ID0gdHJpZ2dlcmluZ1Rhc2suZ2V0VGFza1RhZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9jdXJyUmVjSWQgPiBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICBpZiAodGhpcy5DdXJyUmVjICE9IG51bGwpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DVVJSX1JFQyArICc9XCInICsgdGhpcy5fY3VyclJlY0lkICsgJ1wiJyk7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVEFTS01PREUgKyAnPVwiJyArIHRoaXMuX3Rhc2suZ2V0TW9kZSgpICsgJ1wiJyk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fdHJhbnNDbGVhcmVkICYmICEoTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkluRW5kVGFzayAmJiBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuQ2xvc2luZ0Zvcm1VSSkpIHtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1RSQU5TX0NMRUFSRUQgKyAnPVwiMVwiJyk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNDbGVhcmVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFFDUiA3Nzk5ODIgcHV0cyB0aGUgaW52b2tpbmcgX3Rhc2sgaWQgYW5kIHRoZSBkaXJlY3QgcGFyZW50IF90YXNrIGlkXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5WT0tFUl9JRCArICc9XCInICsgaW52b2tpbmdUYXNrVGFnICsgJywnICsgc2VydmVyUGFyZW50ICsgJ1wiJyk7XHJcblxyXG4vLyBwdXQgdGhlIGN1cnJlbnQgKChEYXRhVmlldylkYXRhVmlldykgZHZQb3MgdmFsdWVcclxuICAgICAgaWYgKGF3YWl0IHRoaXMuZ2V0VGFzaygpLmlzQ2FjaGVkKCkpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EVlBPU19WQUxVRSArICc9XCInICsgdGhpcy5fZHZQb3NWYWx1ZSArICdcIicpO1xyXG5cclxuICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9MT09QX0NPVU5URVIgKyAnPVwiJyArIHRoaXMuZ2V0VGFzaygpLmdldExvb3BDb3VudGVyKCkgKyAnXCInKTtcclxuXHJcbiAgICAgIC8vIHNlbmQgc3ViZm9ybSB2aXNpYmlsaXR5IG9ubHkgaWYgdGhlIHN1YmZvcm0gd2l0aCBwcm9wZXJ0eSBcIlJlZnJlc2hXaGVuSGlkZGVuPU5cIiBhbmQgaXQgaXMgbm90IHZpc2libGUsXHJcbiAgICAgIC8vIGkuZS4gbm90IG5lZWRlZCByZWZyZXNoIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICBpZiAodGhpcy5fdGFzay5Jc1N1YkZvcm0pIHtcclxuICAgICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGhpcy5fdGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgICAgICBpZiAoIXN1YmZvcm1DdHJsLmlzVmlzaWJsZSgpICYmXHJcbiAgICAgICAgICAhIGF3YWl0IHN1YmZvcm1DdHJsLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRUZSRVNIX1dIRU5fSElEREVOLCBmYWxzZSkpXHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1NVQkZPUk1fVklTSUJMRSArICc9XCIwXCInKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UQVNLX0NPVU5URVIgKyAnPVwiJyArIHRoaXMuZ2V0VGFzaygpLmdldENvdW50ZXIoKSArICdcIicpO1xyXG5cclxuICAgICAgLy8gUUNSIzU5MTk3MzogbGFzdFJlY2lkIGFuZCBvbGRGaXJzdFJlY0lEIHNob3VsZCBiZSBzZW50IGJ5IGNsaWVudC5cclxuICAgICAgLy8gSW4gY2FzZSBvZiBtb3VzZSBzY3JvbGxpbmcsIHdlIHBhcmsgb24gdGhlIHNhbWUgcmVjb3JkIChkb24ndCBsZWF2ZSB0aGUgY3VycmVudCByZWNvcmQpLiBTbyBvbiBzZXJ2ZXIgd2UgZ2V0IGN1cnIgcmVjb3JkIG9uIHdoaWNoXHJcbiAgICAgIC8vIHdlIHdlcmUgcGFya2VkIGJlZm9yZSBzY3JvbGxpbmcuIFNvIHdlIGNhbiBub3QgdXNlIHRoaXMgaW5kZXggdG8gZmV0Y2ggdGhlIHJlY29yZC5cclxuICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIHNlbmQgdGhlIGxhc3QgZmV0Y2hlZCByZWNvcmQncyBpZHggZnJvbSBjbGllbnQgaW4gY2FzZSBvZiBzY3JvbGwgZG93blxyXG4gICAgICAvLyBhbmQgb2xkRmlyc3RSZWNJRCAoZmlyc3QgcmVjb3JkIG9mIGxhc3Qgc2VudCBjaHVuaykgaW4gY2FzZSBvZiBzY3JvbGwgdXAsIGZyb20gd2hpY2ggd2UgbmVlZCB0byBmZXRjaCB0aGUgY2h1bmsgb2YgcmVjb3Jkcy5cclxuICAgICAgaWYgKHRoaXMuX3Rhc2sgIT0gbnVsbCAmJiAgdGhpcy5fdGFzay5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSRUxPQURfVklFVykuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKSkge1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTEFTVF9SRUNfSUQgKyAnPVwiJyArXHJcbiAgICAgICAgICAodGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCh0aGlzLmdldFNpemUoKSAtIDEpLmdldElkKCkpICsgJ1wiJyk7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9PTERfRklSU1RfUkVDX0lEICsgJz1cIicgK1xyXG4gICAgICAgICAgdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCgwKS5nZXRJZCgpICsgJ1wiJyk7XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICAvLyBzZW5kIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHJlYyBpbiB0aGUgZm9ybXMgdGFibGUuXHJcbiAgICAgIC8vIGl0IGNhbiBiZSB1c2VkIGJ5IHRoZSBzZXJ2ZXIgdG8ga2VlcCB0aGUgcmVjb3JkIGluIHRoaXMgcG9zaXRpb24gYWZ0ZXIgdGhlIHZpZXcgcmVmcmVzaC5cclxuICAgICAgaWYgKHRoaXMuX3Rhc2suSXNJbnRlcmFjdGl2ZSkge1xyXG4gICAgICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICAgIGlmIChmb3JtICE9IG51bGwgJiYgdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgPiAxKSB7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0NVUlJfUkVDX1BPU19JTl9GT1JNICsgJz1cIicgK1xyXG4gICAgICAgICAgICBmb3JtLmdldEN1cnJSZWNQb3NJbkZvcm0oKSArICdcIicpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuXHJcbiAgICAgIC8vIEFkZCBVc2VyIFJhbmdlc1xyXG4gICAgICBpZiAodGhpcy5nZXRUYXNrKCkuUmVzZXRSYW5nZSB8fCB0aGlzLmdldFRhc2soKS5Vc2VyUm5ncyAhPSBudWxsKSB7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIENvbnN0SW50ZXJmYWNlLlVTRVJfUkFOR0VTKTtcclxuICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuUmVzZXRSYW5nZSkge1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuQ0xFQVJfUkFOR0UgKyAnPVwiMVwiJyk7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5SZXNldFJhbmdlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5Vc2VyUm5ncyAhPSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5idWlsZFhNTEZvclJuZ3MobWVzc2FnZSwgdGhpcy5nZXRUYXNrKCkuVXNlclJuZ3MsIGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLlVzZXJSbmdzLkNsZWFyKCk7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5Vc2VyUm5ncyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQWRkIFVzZXIgTG9jYXRlc1xyXG4gICAgICBpZiAodGhpcy5nZXRUYXNrKCkuUmVzZXRMb2NhdGUgfHwgdGhpcy5nZXRUYXNrKCkuVXNlckxvY3MgIT0gbnVsbCkge1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5VU0VSX0xPQ0FURVMpO1xyXG4gICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5SZXNldExvY2F0ZSkge1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuQ0xFQVJfTE9DQVRFUyArICc9XCIxXCInKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLlJlc2V0TG9jYXRlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5Vc2VyTG9jcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5idWlsZFhNTEZvclJuZ3MobWVzc2FnZSwgdGhpcy5nZXRUYXNrKCkuVXNlckxvY3MsIHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuVXNlckxvY3MuQ2xlYXIoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLlVzZXJMb2NzID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gQWRkIFVzZXIgU29ydHNcclxuICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLlJlc2V0U29ydCB8fCB0aGlzLmdldFRhc2soKS5Vc2VyU29ydHMgIT0gbnVsbCkge1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5NR19UQUdfU09SVFMpO1xyXG4gICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5SZXNldFNvcnQpIHtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLkNMRUFSX1NPUlRTICsgJz1cIjFcIicpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuUmVzZXRTb3J0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5Vc2VyU29ydHMgIT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLmJ1aWxkWE1MRm9yU29ydHMobWVzc2FnZSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2VuZCBkZWxldGVkIGNhY2hlIGVudHJpZXNcclxuICAgICAgaWYgKGF3YWl0IHRoaXMuZ2V0VGFzaygpLmlzQ2FjaGVkKCkpIHtcclxuICAgICAgICBsZXQgZGVsTGlzdDogU3RyaW5nID0gdGhpcy5nZXRUYXNrKCkuZ2V0VGFza0NhY2hlKCkuZ2V0RGVsZXRlZExpc3RUb1hNTCgpO1xyXG4gICAgICAgIGlmIChkZWxMaXN0ICE9PSAnJykge1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19ERUxfTElTVCk7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9JRCArICc9XCInICsgdGhpcy5fdGFzay5nZXRUYXNrVGFnKCkgKyAnXCInKTtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUkVNT1ZFICsgJz1cIicgKyBkZWxMaXN0ICsgJ1wiJyk7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG5cclxuICAgICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IGFjdGl2ZSBkYXRhdmlldyBpcyBpbiB0aGUgZGVsdGVkZSBsaXN0IG1hcmsgaXQgYXMgdW4tdmFsaWQgc29cclxuICAgICAgICAgIC8vIGl0IHdvbnQgZW50ZXIgdGhlIGNhY2hlIG9uIHJldHVybiBmcm9tIHNlcnZlclxyXG4gICAgICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLmdldFRhc2tDYWNoZSgpLmlzRGVsZXRlZCh0aGlzLl9kdlBvc1ZhbHVlKSlcclxuICAgICAgICAgICAgdGhpcy5zZXRDaGFuZ2VkKHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuZ2V0VGFza0NhY2hlKCkuY2xlYXJEZWxldGVkTGlzdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVtb3ZlIHVubmVjZXNzYXJ5IGRhdGEgY29udHJvbCB2YWx1ZXNcclxuICAgICAgbGV0IGRjVmFsS2V5czogc3RyaW5nW10gPSB0aGlzLl9kY1ZhbHNDb2xsZWN0aW9uLktleXM7XHJcblxyXG4gICAgICBkY1ZhbEtleXMuZm9yRWFjaCgoZGNWYWxLZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGRjdiA9IHRoaXMuX2RjVmFsc0NvbGxlY3Rpb24uZ2V0X0l0ZW0oZGNWYWxLZXkpO1xyXG5cclxuICAgICAgICBpZiAoIWRjdi5IYXNSZWZlcmVuY2VzKSB7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RDX1ZBTFMpO1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSUQgKyAnPVwiJyArIGRjdi5nZXRJZCgpICsgJ1wiJyk7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFTU9WRSArICc9XCIxXCInKTtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5fZGNWYWxzQ29sbGVjdGlvbi5SZW1vdmUoZGNWYWxLZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5DdXJyUmVjICE9IG51bGwpXHJcbiAgICAgICAgY3VyclJlY0RlbGV0ZWQgPSAodGhpcy5DdXJyUmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZVxyXG4gICAgICAgICAgJiYgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmdldFJlY29yZCh0aGlzLkN1cnJSZWMuZ2V0SWQoKSkgIT0gbnVsbCAmJiB0aGlzLkN1cnJSZWMuU2VuZFRvU2VydmVyKTtcclxuXHJcbiAgICAgIC8vIElmIHRoZSBjdXJyZW50IHVzZXIgZXZlbnQgYmVpbmcgaGFuZGxlZCBoYXMgRm9yY2UgZXhpdCA9ICdQcmUgUmVjb3JkIFVwZGF0ZScsIHRoZW5cclxuICAgICAgLy8gZG8gbm90IGFkZCBjdXJyZW50IHJlY29yZCB0byB0aGUgbW9kaWZpZWQgcmVjb3JkcyBsaXN0LiBXZSBhbnl3YXkgc2VuZCBjdXJyZW50XHJcbiAgICAgIC8vIHJlY29yZCBzZXBhcmF0ZWx5LlxyXG4gICAgICBsZXQgc2tpcEN1cnJSZWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgIGlmICh0aGlzLkN1cnJSZWMgIT0gbnVsbCAmJiB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuZ2V0UmVjb3JkKHRoaXMuQ3VyclJlYy5nZXRJZCgpKSAhPSBudWxsKVxyXG4gICAgICAgIHNraXBDdXJyUmVjID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaXNGb3JjZUV4aXRQcmVSZWNvcmRVcGRhdGUodGhpcy5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmJ1aWxkWE1MKCBtZXNzYWdlLCBza2lwQ3VyclJlYywgdGhpcy5DdXJyUmVjLmdldElkKCkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX29yaWdpbmFsICE9IG51bGwpXHJcbiAgICAgICAgdGhpcy5fb3JpZ2luYWwuY2xlYXJNb2RlKCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuZ2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBpZiAoc2tpcEN1cnJSZWMgJiYgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmdldFJlY0J5SWR4KGkpLmdldElkKCkgPT09IHRoaXMuQ3VyclJlYy5nZXRJZCgpKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5nZXRSZWNCeUlkeChpKS5jbGVhckZsYWdzSGlzdG9yeSgpO1xyXG4gICAgICAgIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5yZW1vdmVSZWNvcmQoaSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLkN1cnJSZWMgIT0gbnVsbCAmJiAhY3VyclJlY0RlbGV0ZWQpIHtcclxuXHJcbiAgICAgICAgLy8gV2hlbiB3ZSByZWNvbm5lY3QgdG8gdGhlIHNlcnZlciBvbmNlIGl0IGlzIGRpc2Nvbm5lY3RlZCwgc2VydmVyIHdpbGwgY3JlYXRlIGEgbmV3IGNvbnRleHQgYW5kXHJcbiAgICAgICAgLy8gdGhlcmVmb3JlIE1QIHZhcmlhYmxlcyBhcmUgd2l0aCB0aGVpciBpbnRpYWwgKGVtcHR5KSB2YWx1ZSBhbmQgbm90IHdpdGggdGhlaXIgcmVhbCB2YWx1ZXMuXHJcbiAgICAgICAgLy8gU28sIHdlIG11c3QgYWx3YXlzIHNlbmQgTWFpbiBwcm9ncmFtJ3MgZmllbGQncyBsYXRlc3QgIHZhbHVlcyB0byB0aGUgc2VydmVyLlxyXG4gICAgICAgIGxldCBmb3JjZUJ1aWxkOiBib29sZWFuID0gKHRoaXMuX3Rhc2suaXNNYWluUHJvZygpICYmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZykpO1xyXG4gICAgICAgIHRoaXMuQ3VyclJlYy5idWlsZFhNTChtZXNzYWdlLCB0cnVlLCBmb3JjZUJ1aWxkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiA3Nzk5ODIgaWYgd2UgaGF2ZSBtYWluIHByb2cgd2l0aCBubyBzZWxlY3QncyBzZW5kIHRoZSBpbnZva2VyIGFuZCBwYXJlbnQgX3Rhc2tcclxuICAgIGVsc2Uge1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0lOVk9LRVJfSUQgKyAnPVwiJyArIGludm9raW5nVGFza1RhZyArICcsJyArIHNlcnZlclBhcmVudCArICdcIicgK1xyXG4gICAgICAgIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgfVxyXG4gICAgbWVzc2FnZS5BcHBlbmQoJ1xcbiAgICAgIDwvJyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVyArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gUmVjb3JkIGlzIHRoZSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgcmVjb3JkIDwvcmV0dXJucz5cclxuICBnZXRDdXJyUmVjKCk6IFJlY29yZCB7XHJcbiAgICBpZiAodGhpcy5DdXJyUmVjID09PSBudWxsICYmIHRoaXMuX2N1cnJSZWNJZCA+IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdEYXRhVmlldy5nZXRDdXJyUmVjKCk6IHJlY29yZCAnICsgdGhpcy5fY3VyclJlY0lkICsgJyBub3QgZm91bmQnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLkN1cnJSZWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBSZWNvcmQgaXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgY3VycmVudCByZWNvcmQgPC9yZXR1cm5zPlxyXG4gIGdldFByZXZDdXJyUmVjKCk6IFJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJldkN1cnJSZWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gUmVjb3JkIGlzIHRoZSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHJlY29yZFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZ2V0T3JpZ2luYWxSZWMoKTogUmVjb3JkIHtcclxuXHJcbiAgICBpZiAodGhpcy5fb3JpZ2luYWwgPT09IG51bGwgfHwgdGhpcy5fb3JpZ2luYWwuZ2V0SWQoKSAhPT0gdGhpcy5DdXJyUmVjLmdldElkKCkpXHJcbiAgICAgIHJldHVybiB0aGlzLkN1cnJSZWM7XHJcbiAgICByZXR1cm4gdGhpcy5fb3JpZ2luYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBjdXJyZW50IHJlY29yZCAtIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+dGhlIHJlY29yZCBpZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29tcHV0ZVwiPmlmIHRydWUgdGhlbiBleGVjdXRlIGNvbXB1dGUgZm9yIHRoZSBuZXcgcmVjb3JkXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgYXN5bmMgc2V0Q3VyclJlYyhpZDogbnVtYmVyLCBjb21wdXRlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgb2xkUmVjSWQ6IG51bWJlciA9IHRoaXMuX2N1cnJSZWNJZDtcclxuICAgIGlmIChpZCA+IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgIGxldCBuZXdJZHg6IG51bWJlciA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjSWR4KGlkKTtcclxuXHJcbiAgICAgIGlmIChuZXdJZHggPT09IC0xKVxyXG4gICAgICAgIHRoaXMuX29yaWdpbmFsID0gbnVsbDtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGxldCBpZ25vcmVDdXJyUmVjOiBib29sZWFuID0gdGhpcy5fY3VyclJlY0lkID09PSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KG5ld0lkeCwgIWlnbm9yZUN1cnJSZWMsIGlnbm9yZUN1cnJSZWMsIGNvbXB1dGUsIEludDMyLk1pblZhbHVlKTtcclxuICAgICAgICAgIGlmIChpZCAhPT0gb2xkUmVjSWQpXHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZU9yaWdpbmFsKCk7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIGRvIG5vdCBwb2ludCB0byBhbnkgY3VycmVudCByZWNvcmRcclxuICAgICAgdGhpcy5DdXJyUmVjID0gbnVsbDtcclxuICAgICAgdGhpcy5fb3JpZ2luYWwgPSBudWxsO1xyXG4gICAgICB0aGlzLl9jdXJyUmVjSWQgPSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgdGhlIGN1cnJlbnQgcmVjb3JkIGluZGV4IGFuZCByZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3NcclxuICAvLy8gICBVc2UgdGhlIE1HX0RBVEFWSUVXX0ZJUlNUX1JFQ09SRCBhbmQgTUdfREFUQVZJRVdfTEFTVF9SRUNPUkQgY29uc3RhbnRzXHJcbiAgLy8vICAgdG8gcmV0cmlldmUgdGhlIGZpcnN0IG9yIHRoZSBsYXN0IHJlY29yZCByZXNwZWN0aXZlbHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3SWR4XCI+dGhlIG5ldyBpbmRleCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZG9TdWZmaXhcIj5pZiB0cnVlIHRoZW4gZG8gdGhlIHJlY29yZCBzdWZmaXggZm9yIHRoZSBwcmV2aW91cyByZWNvcmQgd2hlbiB0aGUgcmVjb3JkIHdhcyBjaGFuZ2VkIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZ25vcmVDdXJyUmVjXCI+aWYgdHJ1ZSBhbGwgdGhlIG9wZXJhdGlvbnMgYXJlIGRvbmUgaXMgaWYgdGhlcmUgaXMgbm8gY3VycmVudCByZWNvcmQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbXB1dGVcIj5pZiB0cnVlIHRoZW4gZXhlY3V0ZSBjb21wdXRlIGZvciB0aGUgbmV3IHJlY29yZCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3RGlzcGxheUxpbmVcIj50byB1cGRhdGUgZm9ybSA8L3BhcmFtPlxyXG4gIGFzeW5jIHNldEN1cnJSZWNCeUlkeChuZXdJZHg6IG51bWJlciwgZG9TdWZmaXg6IGJvb2xlYW4sIGlnbm9yZUN1cnJSZWM6IGJvb2xlYW4sIGNvbXB1dGU6IGJvb2xlYW4sIG5ld0Rpc3BsYXlMaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBsYXN0UmVjSWR4OiBudW1iZXIgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKSAtIDE7XHJcbiAgICBsZXQgb2xkRmlyc3RSZWM6IFJlY29yZCwgbmV4dFJlYzogUmVjb3JkO1xyXG5cclxuICAgIC8vIFFDUiAjOTg0OTYwOiB0aGUgdmFyaWFibGUgcmVjb3JkU3VmZiBpcyB1c2VkIHRvIHJlY29nbml6ZSBpZiB3ZSBoYXZlIHByZXNzZWRcclxuICAgIC8vIGN0cmwraG9tZSBvciBjdHJsK2VuZCBpbiB0aGVzZSBjYXNlcyB3ZSBtdXN0IGluaXRpYXRlIHJlY29yZCBzdWZmaXhcclxuICAgIC8vIHRoZSBjb3JyZWN0IHdheSB0byBkbyB0aGlzIGlzIHVzaW5nIHRoZSBkb1N1ZmZpeCBwYXJhbWV0ZXIgYnV0IHNpbmNlIGl0IGlzIHVzZWRcclxuICAgIC8vIGluIGEgbG90IG9mIGNhc2VzIHNvbWV0aW1lIG5vdCBpbiBhIGNvcnJlY3Qgd2F5LCBmb3JjaW5nIHJlY29yZCBzdWZmaXhcclxuICAgIC8vIHVzaW5nIGRvU3VmZml4IHdpbGwgY2F1c2UgbWFueSBjaGFuZ2VzIGluIHRoZSBjb2RlLlxyXG4gICAgbGV0IHJlY29yZFN1ZmY6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAobmV3SWR4ID09PSBDb25zdGFudHMuTUdfREFUQVZJRVdfRklSU1RfUkVDT1JEKSB7XHJcblxyXG4gICAgICAvLyBBcyBtb3ZpbmcgdG8gZmlyc3QgcmVjb3JkIGluIHRoZSB2aWV3LCByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgc2hvdWxkIGJlIDAuXHJcbiAgICAgIGlmICh0aGlzLmdldFRhc2soKS5pc1RhYmxlV2l0aEFic29sdXRlc1Njcm9sbGJhcigpKSB7XHJcbiAgICAgICAgdGhpcy5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgPSAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5faW5jbHVkZXNGaXJzdCkge1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjdXJyZW50IHJlY29yZCBpcyBhbHJlYWR5IHRoZSBmaXJzdCByZWNvcmQgb2YgdGhlIGRhdGEgdmlld1xyXG4gICAgICAgIGlmICh0aGlzLl9jdXJyUmVjSWR4ID49IDAgfHwgdGhpcy5fY3VyclJlY0lkeCA9PT0gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgICAgIG5ld0lkeCA9IDA7XHJcblxyXG4gICAgICAgICAgLy8gY3RybCtob21lIHdhc2UgcHJlc3NlZFxyXG4gICAgICAgICAgcmVjb3JkU3VmZiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb25fRXhjZXB0aW9uVHlwZS5UT1ApO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoQ0hVTktfRFZfVE9QLCBkb1N1ZmZpeCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgobmV3SWR4LCBmYWxzZSwgaWdub3JlQ3VyclJlYywgY29tcHV0ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG5ld0lkeCA9PT0gQ29uc3RhbnRzLk1HX0RBVEFWSUVXX0xBU1RfUkVDT1JEKSB7XHJcbiAgICAgIGlmICh0aGlzLl9pbmNsdWRlc0xhc3QpIHtcclxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCByZWNvcmQgaXMgYWxyZWFkeSB0aGUgbGFzdCByZWNvcmQgb2YgdGhlIGRhdGEgdmlld1xyXG4gICAgICAgIGlmICh0aGlzLl9jdXJyUmVjSWR4IDw9IGxhc3RSZWNJZHgpIHtcclxuICAgICAgICAgIG5ld0lkeCA9IGxhc3RSZWNJZHg7XHJcbiAgICAgICAgICAvLyBjdHJsK2VuZCB3YXMgcHJlc3NlZFxyXG4gICAgICAgICAgcmVjb3JkU3VmZiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24oUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbl9FeGNlcHRpb25UeXBlLkJPVFRPTSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gSWYgbGFzdCByZWNvcmQgaXMgbm90IGluIHRoZSB2aWV3LCBhbmQgYmVpbmcgZmV0Y2hlZCBmcm9tIHRoZSBzZXJ2ZXIsIFJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA9IFRvdGFsUmVjb3Jkc0NvdW50LiBBbmQgYXMgdGhpcyBjaHVuayBnZXQgYWRkZWRcclxuICAgICAgICAvLyBpbnRvIHJlY29yZHMgdGFibGUsIHRoZSBSZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgd2lsbCBiZSBkZWNyZW1lbnRlZCBieSBubyBvZiByb3dzIGluIHZpZXcuXHJcbiAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlLCB3ZSBvcGVuIHRoZSBjdXJzb3Igd2l0aCByZXZlcnNlIGRpcmVjdGlvbiBmb3Igd2hpY2ggZG8gbm90IGJyaW5nIHRoZSBjb3VudHMgZnJvbSBnYXRld2F5LlxyXG4gICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5pc1RhYmxlV2l0aEFic29sdXRlc1Njcm9sbGJhcigpKVxyXG4gICAgICAgICAgdGhpcy5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgPSB0aGlzLlRvdGFsUmVjb3Jkc0NvdW50O1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoQ2h1bmtGcm9tU2VydmVyKENIVU5LX0RWX0JPVFRPTSwgZG9TdWZmaXgpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2luY2x1ZGVzTGFzdClcclxuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb25fRXhjZXB0aW9uVHlwZS5CT1RUT00pO1xyXG5cclxuICAgICAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKTtcclxuICAgICAgICBpZiAoZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICB3aGlsZSAoIXRoaXMuX2luY2x1ZGVzRmlyc3QgJiYgZm9ybS5nZXRSb3dzSW5QYWdlKCkgPj0gdGhpcy5nZXRTaXplKCkpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5mZXRjaENodW5rRnJvbVNlcnZlcihDSFVOS19DQUNIRV9QUkVWLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KG5ld0lkeCwgZmFsc2UsIGlnbm9yZUN1cnJSZWMsIGNvbXB1dGUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSByZWNvcmQgd2FzIG5vdCBmb3VuZCBiZXlvbmQgdGhlIFRPUCBlbmRcclxuICAgIGVsc2UgaWYgKG5ld0lkeCA8IDApIHtcclxuICAgICAgaWYgKHRoaXMuX2luY2x1ZGVzRmlyc3QpXHJcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24oUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbl9FeGNlcHRpb25UeXBlLlRPUCk7XHJcblxyXG4gICAgICBvbGRGaXJzdFJlYyA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgoMCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgPiAwIHx8IHRoaXMuSW5jbHVkZXNMYXN0KCkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaENodW5rRnJvbVNlcnZlcihDSFVOS19DQUNIRV9QUkVWLCBkb1N1ZmZpeCk7XHJcbiAgICAgIC8vIGlmIG5vIHJlY29yZHMgYW5kIGl0cyBmaXJzdCBzaW11bGF0ZSBzdGFydCB0YWJsZVxyXG4gICAgICBlbHNlIGlmICh0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKSA9PT0gMCAmJiB0aGlzLkluY2x1ZGVzRmlyc3QoKSlcclxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoQ2h1bmtGcm9tU2VydmVyKENIVU5LX0RWX1RPUCwgZG9TdWZmaXgpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdpbiBEYXRhVmlldy5mZXRjaENodW5rRnJvbVNlcnZlcigpIHdyb25nIG9wdGlvbicpO1xyXG5cclxuICAgICAgLy8gZ2V0IHRoZSBuZXcgaW5kZXggb2YgdGhlIHJlY29yZCB3aGljaCB3YXMgZmlyc3QgYmVmb3JlIHRoZSBmZXRjaFxyXG4gICAgICBsZXQgb2xkRmlyc3ROZXdJZHg6IG51bWJlciA9IG9sZEZpcnN0UmVjICE9IG51bGxcclxuICAgICAgICA/IHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjSWR4KG9sZEZpcnN0UmVjLmdldElkKCkpXHJcbiAgICAgICAgOiB0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKTtcclxuICAgICAgaWYgKG9sZEZpcnN0TmV3SWR4ICE9PSAwKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KG9sZEZpcnN0TmV3SWR4ICsgbmV3SWR4LCBmYWxzZSwgaWdub3JlQ3VyclJlYywgY29tcHV0ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gY2hlY2sgd2hldGhlciB0aGUgcmVjb3JkIHdhcyBub3QgZm91bmQgYmV5b25kIHRoZSBCT1RUT00gZW5kXHJcbiAgICBlbHNlIGlmIChuZXdJZHggPiBsYXN0UmVjSWR4KSB7XHJcbiAgICAgIGlmICh0aGlzLl9pbmNsdWRlc0xhc3QpXHJcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24oUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbl9FeGNlcHRpb25UeXBlLkJPVFRPTSk7XHJcbiAgICAgIC8vdGhlIHJvdyBpcyBhY3R1YWxseSBub3QgY3JlYXRlZCB5ZXQgaW4gVUksIGl0IHdpbGwgYmUgY3JlYXRlZCBvbmx5IGFmdGVyIHdlIGJyaW5nIHRoZSBuZXcgY2h1bmtcclxuICAgICAgaWYgKHRoaXMuZ2V0Rm9ybSgpLmlzUm93Q3JlYXRlZChuZXdJZHgpKVxyXG4gICAgICAgIHRoaXMuZ2V0Rm9ybSgpLm1hcmtSb3dOT1RDcmVhdGVkKG5ld0lkeCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmZldGNoQ2h1bmtGcm9tU2VydmVyKENIVU5LX0NBQ0hFX05FWFQsIGRvU3VmZml4KTtcclxuICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgobmV3SWR4LCBmYWxzZSwgaWdub3JlQ3VyclJlYywgY29tcHV0ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCAgaXNDcmVhdGVMaW5lQWJvdmVBY3QgOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgbGFzdEV2ZW50IDogbnVtYmVyID0gaXNOdWxsT3JVbmRlZmluZWQoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TGFzdFJ0RXZlbnQoKSkgPyAwIDpcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TGFzdFJ0RXZlbnQoKS5nZXRJbnRlcm5hbENvZGUoKTtcclxuXHJcbiAgICBpZiAobmV3SWR4ID49IDAgJiYgIXRoaXMuZ2V0VGFzaygpLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpICYmXHJcbiAgICBsYXN0RXZlbnQgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FX0FCT1ZFKSB7XHJcbiAgICAgIGlmICgoKDxUYXNrPnRoaXMuZ2V0VGFzaygpKS5nZXRJbkNyZWF0ZUxpbmUoKSkgJiYgbmV3SWR4ID09IHRoaXMuX2N1cnJSZWNJZHgpIHtcclxuICAgICAgICBsZXQgbmV3UmVjOiBSZWNvcmQgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KG5ld0lkeCk7XHJcbiAgICAgICAgaWYgKG5ld1JlYy5nZXRNb2RlKCkgPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgICAgIGlzQ3JlYXRlTGluZUFib3ZlQWN0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiAjIDk4NDk2MCAtIHNlZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgdmFyaWFibGUgcmVjb3JkU3VmZiBpbiB0aGUgdG9wIG9mIHRoaXMgbWV0aG9kXHJcbiAgICBpZiAocmVjb3JkU3VmZiB8fCBpc0NyZWF0ZUxpbmVBYm92ZUFjdCB8fCBuZXdJZHggIT09IHRoaXMuX2N1cnJSZWNJZHggfHwgaWdub3JlQ3VyclJlYyAmJiBjb21wdXRlKSB7XHJcbiAgICAgIGlmICghaWdub3JlQ3VyclJlYyAmJiBkb1N1ZmZpeCAmJiB0aGlzLkN1cnJSZWMgIT0gbnVsbCkge1xyXG4gICAgICAgIGxldCBvbGRSZWNUYWJTaXplOiBudW1iZXIgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKTtcclxuXHJcbiAgICAgICAgbmV4dFJlYyA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgobmV3SWR4KTtcclxuICAgICAgICBpZiAobmV4dFJlYy5pc05ld1JlYygpKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmXHJcbiAgICAgICAgICAgICFhd2FpdCB0aGlzLl90YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUsIHRydWUpKVxyXG4gICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICBsZXQgb3JnVG9wUmVjSWR4OiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3RvcFJlY0lkeE1vZGlmaWVkKSB7XHJcbiAgICAgICAgICAgIG9yZ1RvcFJlY0lkeCA9IHRoaXMuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZVRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgIGlmICh0aGlzLl90b3BSZWNJZHhNb2RpZmllZClcclxuICAgICAgICAgICAgdGhpcy5zZXRUb3BSZWNJZHgob3JnVG9wUmVjSWR4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICB0aHJvdyBuZXcgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbihSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uX0V4Y2VwdGlvblR5cGUuUkVDX1NVRkZJWF9GQUlMRUQpO1xyXG5cclxuICAgICAgICAvLyBRQ1IgIzIwNDY6IHdoZW4gdGhlIG5leHQgcmVjb3JkIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBjdXJyZW50IG9uZSB3ZSBzaG91bGRcclxuICAgICAgICAvLyBhbGxvdyB0aGUgZXhlY3V0aW9uIG9mIHRoZSByZWNvcmQgcHJlZml4IGJ5IHNldHRpbmcgdGhlIF90YXNrIGxldmVsIHRvIFRBU0suXHJcbiAgICAgICAgaWYgKG5leHRSZWMgIT09IHRoaXMuQ3VyclJlYyAmJiB0aGlzLmdldFRhc2soKS5nZXRBZnRlclJldHJ5KCkpXHJcbiAgICAgICAgICB0aGlzLl90YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgICAvLyBpZiB0aGUgcmVjb3JkcyB0YWJsZSBzaXplIHdhcyBkZWNyZWFzZWQgZHVyaW5nIGhhbmRsaW5nIHRoZVxyXG4gICAgICAgIC8vIHJlY29yZCBzdWZmaXggKGUuZy4gY2FuY2VsIGVkaXQpIGFuZCB0aGUgdXNlciB0cmllcyB0byBtb3ZlIHRvXHJcbiAgICAgICAgLy8gYSByZWNvcmQgd2l0aCBhIGhpZ2hlciBpbmRleCB0aGVuIHdlIHNob3VsZCBhbHNvIGRlY3JlYXNlIHRoZVxyXG4gICAgICAgIC8vIG5ld0lkeCB0byByZWZsZWN0IHRoZSBjaGFuZ2VcclxuICAgICAgICBpZiAob2xkUmVjVGFiU2l6ZSAtIDEgPT09IHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpICYmIHRoaXMuX2N1cnJSZWNJZHggPCBuZXdJZHgpXHJcbiAgICAgICAgICBuZXdJZHgtLTtcclxuXHJcbiAgICAgICAgLy8gdGhlIG5ldyBjdXJyIHJlYyBtYXkgYmUgYWxyZWFkeSBzZXQgYnkgdGhlIGV2ZW50cyBjaGFpbiB0cmlnZ2VyZWQgYnkgdGhlXHJcbiAgICAgICAgLy8gcmVjb3JkIHN1ZmZpeCBhYm92ZSAtIGluIHRoYXQgY2FzZSB0aGVyZSBpcyBubyBuZWVkIHRvIGNvbnRpbnVlXHJcbiAgICAgICAgaWYgKG5ld0lkeCA9PT0gdGhpcy5fY3VyclJlY0lkeCkge1xyXG5cclxuICAgICAgICAgIC8vIFFDUiA5MTg5ODMgY2hhbmdlcyB0byB0aGUgX3Rhc2sgbW9kZSBtdXN0IGJlIGRvbmUgYmVmb3JlIHJlY29tcHV0ZVxyXG4gICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiAhdGhpcy5DdXJyUmVjLmlzTmV3UmVjKCkgJiZcclxuICAgICAgICAgICAgIXRoaXMuX3Rhc2suZ2V0Rm9ybSgpLmluUmVmcmVzaERpc3BsYXkoKSlcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5DdXJyUmVjID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeChuZXdJZHgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuQ3VyclJlYyA9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbignaW4gRGF0YVZpZXcuc2V0Q3VyclJlY0J5SWR4KCkgY3VycmVudCByZWNvcmQgbm90IGZvdW5kIScpO1xyXG5cclxuICAgICAgdGhpcy5fY3VyclJlY0lkID0gdGhpcy5DdXJyUmVjLmdldElkKCk7XHJcbiAgICAgIHRoaXMuX2N1cnJSZWNJZHggPSBuZXdJZHg7XHJcblxyXG4gICAgICBpZiAodGhpcy5fdGFzay5nZXRGb3JtKCkgIT0gbnVsbCkge1xyXG5cclxuICAgICAgICAvLyBRQ1IgIzEwNzkyNiwgd2UgbXVzdCB1cGRhdGUgZGlzcGxheSBsaW5lIGhlcmUsIHNpbmNlIGN1cnJSZWNDb21wdXRlIHdoaWNoIGlzIGFjdGl2YXRlZCBsYXRlclxyXG4gICAgICAgIC8vIG1heSBnbyB0byBzZXJ2ZXIgYW5kIGNhdXNlIHJlZnJlc2ggZGlzcGxheS5cclxuICAgICAgICAvLyBJbiBjYXNlIG9mIGFkZGluZyBuZXcgbm9kZSB0byB0aGUgdHJlZSwgdGhlIG5vZGUgbXVzdCBiZSBhY3R1YWxseSBhZGRlZCB0byB0aGUgdHJlZS5cclxuICAgICAgICBpZiAobmV3RGlzcGxheUxpbmUgPT09IFNFVF9ESVNQTEFZTElORV9CWV9EVikge1xyXG4gICAgICAgICAgKDxNZ0Zvcm0+KHRoaXMuX3Rhc2suZ2V0Rm9ybSgpKSkudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuX3Rhc2suZ2V0Rm9ybSgpLkRpc3BsYXlMaW5lID0gbmV3RGlzcGxheUxpbmU7XHJcbiAgICAgIH1cclxuICAgICAgLy8gUUNSIDkxODk4MyBjaGFuZ2VzIHRvIHRoZSBfdGFzayBtb2RlIG11c3QgYmUgZG9uZSBiZWZvcmUgcmVjb21wdXRlXHJcbiAgICAgIGlmICh0aGlzLl90YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgIXRoaXMuQ3VyclJlYy5pc05ld1JlYygpICYmXHJcbiAgICAgICAgIXRoaXMuX3Rhc2suZ2V0Rm9ybSgpLmluUmVmcmVzaERpc3BsYXkoKSlcclxuICAgICAgICB0aGlzLl90YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG5cclxuICAgICAgaWYgKGNvbXB1dGUpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5jdXJyUmVjQ29tcHV0ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVjb21wdXRlIEFMTCB0aGUgaW5pdCBleHByZXNzaW9ucyBvZiB0aGUgY3VycmVudCByZWNvcmQgLSBjYWxsIHRoaXMgbWV0aG9kIHdoZW5cclxuICAvLy8gICBlbnRlcmluZyBhIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JjZUNsaWVudENvbXB1dGVcIj5pZiBUUlVFIGZvcmNlcyB0aGUgY2xpZW50IHRvIGNvbXB1dGUgdGhlIHJlY29yZCBldmVuIGlmIGl0IGlzIGZsYWdnZWRcclxuICAvLy8gICBhcyBcInNlcnZlciBjb21wdXRlZFwiLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIGFzeW5jIGN1cnJSZWNDb21wdXRlKGZvcmNlQ2xpZW50Q29tcHV0ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmludmFsaWRhdGUoZmFsc2UsIHRydWUpO1xyXG4gICAgYXdhaXQgdGhpcy5jb21wdXRlKGZhbHNlLCBmb3JjZUNsaWVudENvbXB1dGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNhdmVzIGEgcmVwbGljYXRpb24gb2YgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzYXZlT3JpZ2luYWwoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuQ3VyclJlYy5Nb2RpZmllZClcclxuICAgICAgdGhpcy5fb3JpZ2luYWwgPSB0aGlzLkN1cnJSZWMucmVwbGljYXRlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmV0Y2ggYSBjaHVuayBvZiByZWNvcmRzIGZyb20gdGhlIHNlcnZlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIHB1YmxpYyBhc3luYyBmZXRjaENodW5rRnJvbVNlcnZlcihjaHVua0lkOiBzdHJpbmcsIGRvU3VmZml4OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgLy8gUUNSICM0MzAxMzQ6IGlmIHRoZSBzZXJ2ZXIgc2VudCB1cyByZWNvcmRzIGZld2VyIHRoYW4gdGhlIG51bWJlciB0aGF0IGZpdHMgaW50byBhIHRhYmxlXHJcbiAgICAvLyB0aGVuIHdlIGdvIGJhY2sgdG8gdGhlIHNlcnZlciBhbmQgbXVzdCByZWZyZXNoIHRoZSBzY3JlZW4uXHJcbiAgICAoPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKSkuRm9ybVJlZnJlc2hlZCA9IHRydWU7XHJcblxyXG4gICAgaWYgKGRvU3VmZml4ICYmIHRoaXMuQ3VyclJlYyAhPSBudWxsKSB7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IHRoaXMuX3Rhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICAgIHRocm93IG5ldyBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb25fRXhjZXB0aW9uVHlwZS5SRUNfU1VGRklYX0ZBSUxFRCk7XHJcbiAgICAgICg8TWdGb3JtPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpKS5zZXRTdWZmaXhEb25lKCk7IC8vIFFDUiA3NTg2MzlcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZXZlbnRDb2RlOiBudW1iZXI7XHJcbiAgICBsZXQgY2xpZW50UmVjSWQ6IG51bWJlciA9IHRoaXMuX2N1cnJSZWNJZDtcclxuICAgIHN3aXRjaCAoY2h1bmtJZCkge1xyXG4gICAgICBjYXNlIENIVU5LX0RWX1RPUDpcclxuICAgICAgICBldmVudENvZGUgPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREFUQVZJRVdfVE9QO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENIVU5LX0RWX0JPVFRPTTpcclxuICAgICAgICBldmVudENvZGUgPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREFUQVZJRVdfQk9UVE9NO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENIVU5LX0NBQ0hFX1BSRVY6XHJcbiAgICAgICAgY2xpZW50UmVjSWQgPSB0aGlzLkZpcnN0UmVjb3JkID09IG51bGwgPyAwIDogdGhpcy5GaXJzdFJlY29yZC5nZXRJZCgpO1xyXG4gICAgICAgIGV2ZW50Q29kZSA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQUNIRV9QUkVWO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENIVU5LX0NBQ0hFX05FWFQ6XHJcbiAgICAgICAgZXZlbnRDb2RlID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBQ0hFX05FWFQ7XHJcbiAgICAgICAgY2xpZW50UmVjSWQgPSB0aGlzLkxhc3RSZWNvcmQgPT0gbnVsbCA/IDAgOiB0aGlzLkxhc3RSZWNvcmQuZ2V0SWQoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coJ2luIERhdGFWaWV3LmZldGNoQ2h1bmtGcm9tU2VydmVyKCkgdW5rbm93biBjaHVuayBpZDogJyArIGNodW5rSWQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBjbWQ6IEV2ZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0aGlzLl90YXNrLmdldFRhc2tUYWcoKSwgZXZlbnRDb2RlKTtcclxuICAgIGNtZC5DbGllbnRSZWNJZCA9IGNsaWVudFJlY0lkO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRUYXNrKCkuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBGZXRjaGVzIHRoZSBjaHVuayBmcm9tIHNlcnZlcixcclxuICAvLy8gICBJZiB0aGUgbGFzdCByZWNvcmRzIGlzIG5vdCB5ZXQgZmV0Y2hlZCBpdCBmZXRjaGVzIHRoZSBuZXh0IGNodW5rLFxyXG4gIC8vLyAgIEVsc2UsIGZldGNoZXMgdGhlIHByZXZpb3VzIGNodW5rXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBGZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuX2luY2x1ZGVzTGFzdClcclxuICAgICAgYXdhaXQgdGhpcy5mZXRjaENodW5rRnJvbVNlcnZlcihDSFVOS19DQUNIRV9ORVhULCBmYWxzZSk7XHJcbiAgICBlbHNlIGlmICghdGhpcy5faW5jbHVkZXNGaXJzdClcclxuICAgICAgYXdhaXQgdGhpcy5mZXRjaENodW5rRnJvbVNlcnZlcihDSFVOS19DQUNIRV9QUkVWLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiBhIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBpbmRleCBleGlzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNJZHhcIj5pbmRleCB0byBjaGVjayA8L3BhcmFtPlxyXG4gIHJlY0V4aXN0cyhyZWNJZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGxhc3RSZWNJZHg6IG51bWJlciA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpIC0gMTtcclxuICAgIHJldHVybiByZWNJZHggPj0gMCAmJiByZWNJZHggPD0gbGFzdFJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVja3MgaWYgdGhlIGlmIHRoZSBjdXJyZW50IGZpcnN0IHJlY29yZCBleGlzdFxyXG4gIC8vLyAgIGluIGNhc2UgdGhlcmUgaXMgbm8gbG9jYXRlIGNoZWNrIGluY2x1ZGUgZmlyc3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNoZWNrRmlyc3QobG9jYXRlRmlyc3Q6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjb3JkKGxvY2F0ZUZpcnN0KSAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGN1cnJlbnQgcmVjb3JkIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSByZWNvcmQgaW5kZXggPC9yZXR1cm5zPlxyXG4gIGdldEN1cnJSZWNJZHgoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLl9jdXJyUmVjSWR4ID09PSBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICBpZiAoIXRoaXMuc2V0Q3VyclJlYyh0aGlzLl9jdXJyUmVjSWQsIHRydWUpKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlV2FybmluZ1RvTG9nV2l0aE1zZygnRGF0YVZpZXcuZ2V0Q3VyclJlY0lkeCgpOiBfdGFzayAnICtcclxuICAgICAgICAgICh0aGlzLmdldFRhc2soKSkuUHJldmlvdXNseUFjdGl2ZVRhc2tJZCArXHJcbiAgICAgICAgICAnLCByZWNvcmQgJyArIHRoaXMuX2N1cnJSZWNJZCArICcgbm90IGZvdW5kJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9jdXJyUmVjSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdGhlIGRidmlld3Jvd2lkIGZvciB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEN1cnJEQlZpZXdSb3dJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLkN1cnJSZWMuZ2V0REJWaWV3Um93SWR4KCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdG9wIHJlY29yZCBpbmRleCBhbmQgc2F2ZXMgdGhlIG9sZCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdUb3BSZWNJZHhcIj50aGUgbmV3IHZhbHVlIGZvciB0aGUgdG9wIHJlY29yZCBpbmRleCA8L3BhcmFtPlxyXG4gIHNldFRvcFJlY0lkeChuZXdUb3BSZWNJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fb2xkVG9wUmVjSWR4ID0gdGhpcy5nZXRUb3BSZWNJZHgoKTtcclxuICAgIHRoaXMuX3RvcFJlY0lkeCA9IG5ld1RvcFJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHRvcCByZWNvcmQgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRvcFJlY0lkeCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RvcFJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHRvcCByZWNvcmQgaW5kZXggbW9kaWZpZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIG5ldyB2YWx1ZSBmb3IgdG9wUmVjSWR4TW9kaWZpZWQgPC9wYXJhbT5cclxuICBzZXRUb3BSZWNJZHhNb2RpZmllZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3RvcFJlY0lkeE1vZGlmaWVkID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgY2h1bmsgc2l6ZSBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q2h1bmtTaXplKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2h1bmtTaXplO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc3RvcmUgdGhlIG9sZCBzYXZlZCB2YWx1ZSBvZiB0aGUgdG9wIHJlY29yZCBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzdG9yZVRvcFJlY0lkeCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RvcFJlY0lkeCA9IHRoaXMuX29sZFRvcFJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1vdmVzIGFsbCB0aGUgcmVjb3JkcyBmcm9tIHRoZSBEYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZWNvcmRzVGFiLnJlbW92ZUFsbCgpO1xyXG4gICAgdGhpcy5fb3JpZ2luYWwgPSBudWxsO1xyXG4gICAgbGV0IG1nRm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKTtcclxuICAgIGlmIChtZ0Zvcm0gIT09IG51bGwpIHtcclxuICAgICAgIHRoaXMuX3Rhc2suZ2V0Rm9ybSgpLlNldFRhYmxlSXRlbXNDb3VudCgwLCB0cnVlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5yZW1vdmVBbGwoKTtcclxuICAgIHRoaXMuaW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluaXRpYWxpemUgdGhlIGNsYXNzIG1lbWJlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2N1cnJSZWNJZCA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgdGhpcy5fY3VyclJlY0lkeCA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgdGhpcy5DdXJyUmVjID0gbnVsbDtcclxuICAgIHRoaXMuX3ByZXZDdXJyUmVjID0gbnVsbDtcclxuICAgIHRoaXMuX2luY2x1ZGVzRmlyc3QgPSBmYWxzZTtcclxuICAgIHRoaXMuX2luY2x1ZGVzTGFzdCA9IGZhbHNlO1xyXG4gICAgdGhpcy5Jc09uZVdheUtleSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZXRUb3BSZWNJZHgoSW50MzIuTWluVmFsdWUpO1xyXG4gICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmludmFsaWRhdGUoZmFsc2UsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2hlcyB0aGUgc3ViRm9ybXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gICBhc3luYyBjb21wdXRlU3ViRm9ybXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgLy8gd2UgZG8gbm90IG5lZWQgdG8gZ28gdG8gdGhlIHNlcnZlciBkdWUgdG8gdXBkYXRlc1xyXG4gICAgIGlmIChhd2FpdCB0aGlzLmdldFRhc2soKS5wcmVwYXJlQ2FjaGUodHJ1ZSkpIHtcclxuXHJcbiAgICAgICAvLyBvbmUgb2YgdGhlIG5lZWRlZCBkLnYgd2FzIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGVcclxuICAgICAgIGlmICghYXdhaXQgdGhpcy5nZXRUYXNrKCkudGVzdEFuZFNldCh0cnVlKSlcclxuICAgICAgICAgYXdhaXQgdGhpcy5jb21wdXRlKHRydWUsIGZhbHNlKTtcclxuICAgICB9XHJcbiAgICAgZWxzZVxyXG4gICAgICAgYXdhaXQgdGhpcy5jb21wdXRlKHRydWUsIGZhbHNlKTtcclxuICAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29tcHV0ZSB0aGUgdmFsdWVzIG9mIHRoZSBmaWVsZHMgd2l0aG91dCB1cGRhdGluZyB0aGUgZGlzcGxheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJGb3Jtc1wiPmlmIHRydWUgdGhlIGEgc3ViRm9ybXMgY29tcHV0ZSBpcyB0byBiZSBkb25lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcmNlQ2xpZW50Q29tcHV0ZVwiPmlmIFRSVUUgZm9yY2VzIHRoZSBjbGllbnQgdG8gY29tcHV0ZSB0aGUgcmVjb3JkIGV2ZW4gaWYgaXQgaXMgZmxhZ2dlZFxyXG4gIC8vLyAgIGFzIFwic2VydmVyIGNvbXB1dGVkXCIuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21wdXRlKHN1YkZvcm1zOiBib29sZWFuLCBmb3JjZUNsaWVudENvbXB1dGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0bXBSZWM6IFJlY29yZCA9IG51bGw7XHJcbiAgICBsZXQgY29tcHV0ZUJ5U2VydmVyOiBib29sZWFuID0gIXRoaXMuY29tcHV0ZUJ5Q2xpZW50KCk7XHJcbiAgICBsZXQgb3JnQ29tcHV0ZUJ5OiBzdHJpbmcgPSB0aGlzLl9jb21wdXRlQnk7XHJcbiAgICAvKidDJyovXHJcbiAgICBpZiAoZm9yY2VDbGllbnRDb21wdXRlKVxyXG4gICAgICB0aGlzLl9jb21wdXRlQnkgPSBDT01QVVRFX05FV1JFQ19PTl9DTElFTlQvKidDJyovO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuQ3VyclJlYy5zZXRJbkNvbXB1dGUodHJ1ZSk7XHJcblxyXG4gICAgICBpZiAoIXN1YkZvcm1zKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuQ3VyclJlYy5pc05ld1JlYygpKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFIC8qJ0MnKi8gJiYgIXN1cGVyLmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkvKidDJyovO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLl90YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSkvKidNJyovO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGdldFJlY29yZERhdGE6IGJvb2xlYW4gPSBjb21wdXRlQnlTZXJ2ZXI7XHJcbiAgICAgIC8vIGZvciBuZXdseSBjcmVhdGVkIHJlY29yZHMgLSBnbyB0byB0aGUgc2VydmVyIChpZiB0aGV5IHdlcmUgbm90IGNvbXB1dGVkIGFscmVhZHkpXHJcbiAgICAgIGlmIChzdWJGb3JtcyB8fCAoZ2V0UmVjb3JkRGF0YSAmJiAhdGhpcy5DdXJyUmVjLmlzQ29tcHV0ZWQoKSAmJiAhZm9yY2VDbGllbnRDb21wdXRlKSkge1xyXG4gICAgICAgIGxldCBjb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUNvbXB1dGVFdmVudENvbW1hbmQodGhpcy5fdGFzay5nZXRUYXNrVGFnKCksIHN1YkZvcm1zLCB0aGlzLl9jdXJyUmVjSWQpO1xyXG4gICAgICAgIGF3YWl0ICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY29tbWFuZCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gUUNSICM5MjE0NzUgLSByZWxpbmsgZHVyaW5nIGNvbXB1dGUgZGVzdHJveXMgdmFsdWVzIG9mIHZpcnR1YWwgZmllbGRzIHdpdGggbm8gaW5pdCBleHAuXHJcbiAgICAgICAgLy8gdGh1cyB3ZSBzYXZlIHRoZW0gYmVmb3JlIHRoZSBjb21wdXRlIGFuZCByZXN0b3JlIHRoZW0gZHVyaW5nIHRoZSBsb29wLlxyXG4gICAgICAgIGlmIChnZXRSZWNvcmREYXRhKSB7XHJcbiAgICAgICAgICB0bXBSZWMgPSBuZXcgUmVjb3JkKHRoaXMuQ3VyclJlYy5nZXRJZCgpLCB0aGlzKTtcclxuICAgICAgICAgIHRtcFJlYy5Jbml0aWFsaXplKCk7XHJcbiAgICAgICAgICB0bXBSZWMuc2V0SW5pdGlhbEZsZFZhbHModHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuc2V0U2VydmVyUmNtcChmYWxzZSk7XHJcbiAgICAgICAgbGV0IGZyb206IG51bWJlciA9ICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5nZXRSTUlkeCgpO1xyXG4gICAgICAgIGxldCBzaXplOiBudW1iZXIgPSAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuZ2V0Uk1TaXplKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGZyb207IGkgPCBmcm9tICsgc2l6ZTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgICBsZXQgZmxkOiBGaWVsZCA9IDxGaWVsZD50aGlzLl9maWVsZHNUYWIuZ2V0RmllbGQoaSk7XHJcbiAgICAgICAgICBpZiAoZ2V0UmVjb3JkRGF0YSAmJiAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuc2VydmVyUmNtcERvbmUoKSAmJiBmbGQuSXNWaXJ0dWFsICYmICFmbGQuVmlyQXNSZWFsICYmICFmbGQuaGFzSW5pdEV4cCgpKSB7XHJcbiAgICAgICAgICAgIGxldCBjdXJyUmVjMjogUmVjb3JkID0gdGhpcy5DdXJyUmVjO1xyXG4gICAgICAgICAgICB0aGlzLkN1cnJSZWMgPSB0bXBSZWM7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgZmxkLnRha2VWYWxGcm9tUmVjKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5DdXJyUmVjID0gY3VyclJlYzI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvL1RPRE86IENoZWNrIGlmIHdlIGNhbiB1c2UgYW5vdGhlciAobWF5YmUsIG5ldykgZnVuY3Rpb24gdG8gZ2V0IHRoZSBkYXRhIHdoaWxlIHRyYW5zZmVycmluZyB0aGVtIHRvIFVJIGluc3RlYWQgb2YgY29tcHV0ZSgpLlxyXG4gICAgICAgICAgaWYgKCEoPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKSkuVHJhbnNmZXJyaW5nRGF0YVRvR1VJKVxyXG4gICAgICAgICAgICBhd2FpdCBmbGQuY29tcHV0ZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5DdXJyUmVjLnNldEluQ29tcHV0ZShmYWxzZSk7XHJcbiAgICAgIHRoaXMuQ3VyclJlYy5zZXRMYXRlQ29tcHV0ZShmYWxzZSk7XHJcbiAgICAgIHRoaXMuX2NvbXB1dGVCeSA9IG9yZ0NvbXB1dGVCeTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZFJlY29yZChkb1N1ZmZpeDogYm9vbGVhbiwgaWdub3JlQ3VyclJlYzogYm9vbGVhbiwgaXNDcmVsaW5lQWJvdmU6IGJvb2xlYW4pOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgbGV0IG5ld0N1cnJSZWNJZDogbnVtYmVyID0gKC0tdGhpcy5fbGFzdENyZWF0ZWRSZWNJZCk7XHJcbiAgICBsZXQgbW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzID0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydDtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmFkZFJlY29yZF8xKGRvU3VmZml4LCBpZ25vcmVDdXJyUmVjLCBmYWxzZSwgbmV3Q3VyclJlY0lkLCBtb2RlLCBpc0NyZWxpbmVBYm92ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkb1N1ZmZpeFwiPmlmIHRydWUgdGhlbiBkbyB0aGUgc3VmZml4IG9mIHRoZSBwcmV2aW91cyByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlnbm9yZUN1cnJSZWNcIj5pZiB0cnVlIHRoZW4gZG8gdGhlIHN1ZmZpeCBvZiB0aGUgcHJldmlvdXMgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc0ZpcnN0UmVjb3JkXCI+IGlzIGZpcnN0IHJlY29yZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibmV3Q3VyclJlY0lkXCI+IG5ldyByZWNvcmQgaWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vZGVcIj4gb3BlcmF0aW9uIG1vZGU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50aGUgbmV3IHJlYyBpbmRleDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGFkZFJlY29yZF8xKGRvU3VmZml4OiBib29sZWFuLCBpZ25vcmVDdXJyUmVjOiBib29sZWFuLCBpc0ZpcnN0UmVjb3JkOiBib29sZWFuLCBuZXdDdXJyUmVjSWQ6IG51bWJlciwgbW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzLCBpc0NyZWxpbmVBYm92ZTogYm9vbGVhbik6IFByb21pc2U8bnVtYmVyPiB7XHJcblxyXG4gICAgLy8gZ2l2ZSB0aGUgbmV3IHJlY29yZCBhIG5lZ2F0aXZlIGlkXHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSBuZXcgUmVjb3JkKG5ld0N1cnJSZWNJZCwgdGhpcyk7XHJcbiAgICByZWMuSW5pdGlhbGl6ZSgpO1xyXG4gICAgcmVjLnNldEluaXRpYWxGbGRWYWxzKGZhbHNlLCAhaXNGaXJzdFJlY29yZCk7XHJcblxyXG4gICAgbGV0IG5ld0N1cnJSZWNJZHg6IG51bWJlciA9IDA7XHJcbiAgICBpZiAoaXNDcmVsaW5lQWJvdmUpXHJcbiAgICB7XHJcbiAgICAgIG5ld0N1cnJSZWNJZHggPSAodGhpcy5fY3VyclJlY0lkeCA+PSAwXHJcbiAgICAgICAgPyB0aGlzLl9jdXJyUmVjSWR4XHJcbiAgICAgICAgOiAwKTtcclxuXHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIG5ld0N1cnJSZWNJZHggPSAodGhpcy5fY3VyclJlY0lkeCAhPSBJbnQzMi5NaW5WYWx1ZVxyXG4gICAgICAgID8gdGhpcy5fY3VyclJlY0lkeCArIDFcclxuICAgICAgICA6IDApO1xyXG5cclxuXHJcbiAgICAvL2xldCBuZXdDdXJyUmVjSWR4OiBudW1iZXIgPSAodGhpcy5fY3VyclJlY0lkeCAhPT0gSW50MzIuTWluVmFsdWUpID9cclxuICAgICAgLy8odGhpcy5fY3VyclJlY0lkeCArIDEpXHJcbiAgICAgIC8vOiAwO1xyXG5cclxuICAgIHRoaXMuX3JlY29yZHNUYWIuaW5zZXJ0UmVjb3JkKHJlYywgbmV3Q3VyclJlY0lkeCk7XHJcbiAgICByZWMuc2V0TW9kZShtb2RlKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgY29tcHV0ZTogYm9vbGVhbiA9ICFpc0ZpcnN0UmVjb3JkO1xyXG4gICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChuZXdDdXJyUmVjSWR4LCBkb1N1ZmZpeCwgaWdub3JlQ3VyclJlYywgY29tcHV0ZSwgSW50MzIuTWluVmFsdWUpO1xyXG5cclxuICAgICAgLy8gd2hpbGUgd2UgaW4gY3JlYXRlIG1vZGUgZG9uJ3Qgc2V0IHJlc2V0IHRvIF9uZXdSZWNcclxuICAgICAgaWYgKGlzRmlyc3RSZWNvcmQgJiYgdGhpcy5nZXRUYXNrKCkuZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICByZWMuc2V0T2xkUmVjKCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXhlY3B0aW9uKSB7XHJcbiAgICAgIGlmIChleGVjcHRpb24gaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICBuZXdDdXJyUmVjSWR4ID0gLTE7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKCdpbiBEYXRhVmlldy5hZGRSZWNvcmQoKSBpbnZhbGlkIGV4Y2VwdGlvbicpO1xyXG5cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXhlY3B0aW9uO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld0N1cnJSZWNJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVtb3ZlIHRoZSBjdXJyZW50IHJlY29yZCBmcm9tIHRoZSBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgcmVtb3ZlQ3VyclJlYygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtZ0Zvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgb25EZWxldGU6IGJvb2xlYW47IC8vIHRydWUgaWYgd2UgYXJlIHJlbW92aW5nIHRoZSByZWNvcmQgZHVlIHRvIGRlbGV0ZS4gZmFsc2UgaWYgZHVlIHRvIGNhbmNlbCBvbiBpbnNlcnRcclxuXHJcbiAgICBpZiAodGhpcy5DdXJyUmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCAmJlxyXG4gICAgICAhdGhpcy5nZXRUYXNrKCkudHJhbnNhY3Rpb25GYWlsZWQoQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkpIHtcclxuICAgICAgLy8gdGhlIHJlY29yZCB3YXMgY3JlYXRlZCBieSB0aGUgY2xpZW50IHNvIGl0IGhhcyB0byBiZSByZW1vdmVkIGZyb20gdGhlXHJcbiAgICAgIC8vIG1vZGlmaWVkIHJlY29yZHMgdGFibGUgKGlmIGl0IGlzIGFscmVhZHkgdGhlcmUpIGJlY2F1c2UgdGhlIHNlcnZlclxyXG4gICAgICAvLyBkb2Vzbid0IGhhdmUgdG8ga25vdyBhbnl0aGluZyBhYm91dCBpdFxyXG4gICAgICB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIucmVtb3ZlUmVjb3JkKHRoaXMuQ3VyclJlYyk7XHJcbiAgICAgIG9uRGVsZXRlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gbW92ZSB0aGUgY3VycmVudCByZWNvcmQgZnJvbSB0aGUgcmVjb3JkcyB0YWJsZSB0byB0aGUgbW9kaWZpZWQgdGFibGVcclxuICAgICAgdGhpcy5DdXJyUmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICB0aGlzLkN1cnJSZWMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlKTtcclxuICAgICAgb25EZWxldGUgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5DdXJyUmVjLnJlbW92ZVJlY0Zyb21EYygpO1xyXG4gICAgdGhpcy5fcmVjb3Jkc1RhYi5yZW1vdmVSZWNvcmQodGhpcy5fY3VyclJlY0lkeCk7XHJcbiAgICB0aGlzLnNldENoYW5nZWQodHJ1ZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpICYmICEoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLklzVHJ5aW5nVG9TdG9wKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuTW92ZVRvRW1wdHlEYXRhdmlld0lmQWxsb3dlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBuZXdEaXNwbGF5TGluZTogbnVtYmVyID0gdGhpcy5jYWxjTGluZVRvTW92ZShvbkRlbGV0ZSk7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAobWdGb3JtLmlzU2NyZWVuTW9kZSgpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgobmV3RGlzcGxheUxpbmUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBhd2FpdCBtZ0Zvcm0uc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUobmV3RGlzcGxheUxpbmUsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IGluZGV4IGlzIGJleW9uZCB0aGUgYm90dG9tIGVuZCBvZiB0aGUgZGF0YXZpZXdcclxuICAgICAgICAvLyB0cnkgdG8gc2V0IGl0IHRvIHRoZSBwcmVjZWRpbmcgcmVjb3JkXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGlmICghc3VwZXIuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgICAgICAgIG5ld0Rpc3BsYXlMaW5lID0gbWdGb3JtLmdldFByZXZMaW5lKG5ld0Rpc3BsYXlMaW5lKTtcclxuICAgICAgICAgIGlmIChtZ0Zvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KG5ld0Rpc3BsYXlMaW5lLCBmYWxzZSwgZmFsc2UsIHRydWUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGF3YWl0IG1nRm9ybS5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShuZXdEaXNwbGF5TGluZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG5cclxuICAgICAgICAgICAgLy8gbm8gbW9yZSByZWNvcmRzIGluIHRoZSBkYXRhdmlld1xyXG4gICAgICAgICAgICAvLyBvciBubyBub2RlcyBpbiB0aGUgdHJlZVxyXG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmVtb3ZlIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjb3JkXCI+PC9wYXJhbT5cclxuICBSZW1vdmVSZWNvcmQocmVjb3JkOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIGxldCByZWNJZHg6IG51bWJlciA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjSWR4KHJlY29yZC5nZXRJZCgpKTtcclxuXHJcbiAgICBpZiAodGhpcy5fdG9wUmVjSWR4ID4gcmVjSWR4KVxyXG4gICAgICB0aGlzLl90b3BSZWNJZHgtLTtcclxuICAgIGlmICh0aGlzLl9vbGRUb3BSZWNJZHggPiByZWNJZHgpXHJcbiAgICAgIHRoaXMuX29sZFRvcFJlY0lkeC0tO1xyXG4gICAgaWYgKHRoaXMuX2N1cnJSZWNJZHggPiByZWNJZHgpXHJcbiAgICAgIHRoaXMuX2N1cnJSZWNJZHgtLTtcclxuICAgIHRoaXMuX3JlY29yZHNUYWIucmVtb3ZlUmVjb3JkKHJlY29yZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIG1vdmUgdG8gZW1wdHkgZGF0YXZpZXcgaWYgYWxsb3dlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgTW92ZVRvRW1wdHlEYXRhdmlld0lmQWxsb3dlZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghc3VwZXIuaXNFbXB0eURhdGF2aWV3KCkgJiYgdGhpcy5fdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgIGlmIChhd2FpdCB0aGlzLl90YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19FTVBUWV9EQVRBVklFVywgdHJ1ZSkpXHJcbiAgICAgICAgc3VwZXIuc2V0RW1wdHlEYXRhdmlldyh0cnVlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmIHN1cGVyLmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICAgIHN1cGVyLnNldEVtcHR5RGF0YXZpZXcoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgZGlzcGxheSBsaW5lIHRvIG1vdmUgYWZ0ZXIgZGVsZXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9uRGVsZXRlXCI+dHJ1ZSBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIHJlY29yZCBkdWUgdG8gZGVsZXRlLiBmYWxzZSBpZiBkdWUgdG8gY2FuY2VsIG9uIGluc2VydFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2FsY0xpbmVUb01vdmUob25EZWxldGU6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgbGV0IG5ld0Rpc3BsYXlMaW5lOiBudW1iZXI7XHJcblxyXG4gICAgLy8gaWYgdGhlIHJlY29yZCBpcyByZW1vdmVkIGR1ZSB0byBpdHMgZGVsZXRpb24sIHdlIG5lZWQgdG8gZ290IHRvIHRoZSBuZXh0IHJlY29yZCBpbiB0aGUgdmlldyAtXHJcbiAgICAvLyBub3cgdGhhdCB3ZSBkZWxldGVkIHRoZSBjdXJyZW50IHJlY29yZCwgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHJlY29yZCBpcyB0aGUgc2FtZSBpbmRleCB0aGF0IHdhc1xyXG4gICAgLy8gb2YgdGhlIHJlY29yZCB0aGF0IHdhcyBkZWxldGVkLlxyXG5cclxuICAgIGlmIChvbkRlbGV0ZSlcclxuICAgICAgbmV3RGlzcGxheUxpbmUgPSB0aGlzLl9jdXJyUmVjSWR4O1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vICM3NTAxOTAgU2hheWFcclxuICAgICAgLy8gbW92ZSB0byB0aGUgUFJFViByZWNvcmQgYWZ0ZXIgY2FuY2VsXHJcbiAgICAgIGlmICh0aGlzLl9jdXJyUmVjSWR4ID4gMClcclxuICAgICAgICBuZXdEaXNwbGF5TGluZSA9IHRoaXMuX2N1cnJSZWNJZHggLSAxO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgbmV3RGlzcGxheUxpbmUgPSB0aGlzLl9jdXJyUmVjSWR4O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld0Rpc3BsYXlMaW5lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHZhbHVlcyBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jdXJyUmVjSWQgPSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgIHRoaXMuX2N1cnJSZWNJZHggPSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgIHRoaXMuQ3VyclJlYyA9IG51bGw7XHJcbiAgICB0aGlzLnNldFRvcFJlY0lkeChJbnQzMi5NaW5WYWx1ZSk7XHJcbiAgICB0aGlzLlNldEluY2x1ZGVzRmlyc3QodHJ1ZSk7XHJcbiAgICB0aGlzLlNldEluY2x1ZGVzTGFzdCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYW5jZWwgdGhlIGVkaXRpbmcgb2YgdGhlIGN1cnJlbnQgcmVjb3JkIGFuZCByZXN0b3JlIHRoZSBvbGQgdmFsdWVzIG9mXHJcbiAgLy8vICAgdGhlIGZpZWxkc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbmx5UmVhbFwiPmlmIHRydWUgb25seSByZXN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSByZWFsIGZpZWxkcy4gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY29tcHV0ZVVua25vd25zXCI+cmUtcGVyZm9ybSB1bmtub3duIHJlY29tcHV0ZXMuIDwvcGFyYW0+XHJcbiAgYXN5bmMgY2FuY2VsRWRpdChvbmx5UmVhbDogYm9vbGVhbiwgcmVjb21wdXRlVW5rbm93bnM6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCB0ZW1wQ3VyclJlYzogUmVjb3JkID0gbnVsbDtcclxuICAgIGxldCByZWNSZW1vdmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgaW5FbmRUYXNrOiBib29sZWFuID0gKDxUYXNrQmFzZT50aGlzLl90YXNrKS5JbkVuZFRhc2s7XHJcblxyXG4gICAgLy8gUUNSICMzNjI5MDMgLSBBdCBfdGFzayBzdWZmaXgsIHdlIHdhbnQgdG8gcHJlc2VydmUgdGhlIGxhc3QgdmFsdWVzIG9mIHRoZSB2aXJ0dWFscy5cclxuICAgIGlmIChpbkVuZFRhc2spXHJcbiAgICAgIG9ubHlSZWFsID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5DdXJyUmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCAmJiB0aGlzLkN1cnJSZWMuaXNOZXdSZWMoKSkge1xyXG4gICAgICBpZiAoKHRoaXMuX2luY2x1ZGVzRmlyc3QgJiYgdGhpcy5faW5jbHVkZXNMYXN0ICYmICh0aGlzLl9yZWNvcmRzVGFiID09PSBudWxsIHx8IHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpID09PSAxKSkgfHwgIXRoaXMuSGFzTWFpblRhYmxlKSB7XHJcblxyXG4gICAgICAgIC8vIGRlZmVjdCAxMjE5NjguIFdoZW4gZnJvbSB0aGUgcGFyZW50IHRhc2sgXCJWaWV3UmVmcmVzaFwiIG9yIFwiQ2FuY2VsXCIgYXJlIGRvbmUgYW5kIHRoZSBzdWJmb3JtIGlzIGluIENyZWF0ZSBub2RlXHJcbiAgICAgICAgLy8gYW5kIHRoZSBzdWJmb3JtIGhhcyBubyByZWNvcmRzLCBfb3JpZ2luYWwgaXMgbnVsbC4gU28gcGFzcyBpdC5cclxuICAgICAgICBpZiAodGhpcy5fb3JpZ2luYWwgIT09IG51bGwpIHtcclxuICAgICAgICAgIHRoaXMuQ3VyclJlYy5zZXRTYW1lQXModGhpcy5fb3JpZ2luYWwsIG9ubHlSZWFsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVDdXJyUmVjKCk7XHJcbiAgICAgICAgcmVjUmVtb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fb3JpZ2luYWwgPSB0aGlzLkN1cnJSZWMucmVwbGljYXRlKCk7IC8vIG11c3QgY29weSBhZ2FpbiB0byBwcmV2ZW50IGFsdGVyaW5nIHRoZSBvcmlnaW5hbCB2YWx1ZXNcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gaWYgKGN1cnJSZWMubW9kaWZpZWQoKSlcclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMuQ3VyclJlYy5Nb2RpZmllZCkge1xyXG4gICAgICAgIGxldCBjdXJyQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50aGlzLl90YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgaWYgKGN1cnJDdHJsICE9PSBudWxsKVxyXG4gICAgICAgICAgY3VyckN0cmwucmVzZXRQcmV2VmFsKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZWNvbXB1dGVVbmtub3ducylcclxuICAgICAgICB0ZW1wQ3VyclJlYyA9IHRoaXMuQ3VyclJlYy5yZXBsaWNhdGUoKTtcclxuXHJcbiAgICAgIC8vIEFUVEVOVElPTiAhISFcclxuICAgICAgLy8gd2UgZG9uJ3Qgc3RlcCBvdmVyIHRoZSBjdXJyUmVjIHJlZmVyZW5jZSB3aXRoIHRoZSBvcmlnaW5hbCByZWNvcmRcclxuICAgICAgLy8gdG8gYXNzdXJlIHRoYXQgaWYgdGhpcyByZWNvcmQgaXMgYm90aCBpbiB0aGUgcmVjb3JkcyB0YWJsZSBhbmQgaW5cclxuICAgICAgLy8gdGhlIG1vZGlmaWVkIHRhYmxlIHRoZXNlIHRhYmxlcyB3aWxsIGtlZXAgcmVmZXJlbmNpbmcgdGhlIHNhbWUgaW5zdGFuY2VcclxuICAgICAgaWYgKHRoaXMuX29yaWdpbmFsICE9PSBudWxsKVxyXG4gICAgICAgIHRoaXMuQ3VyclJlYy5zZXRTYW1lQXModGhpcy5fb3JpZ2luYWwsIG9ubHlSZWFsKTtcclxuXHJcbiAgICAgIGlmICgodGhpcy5fb3JpZ2luYWwgIT09IG51bGwgJiYgcmVjb21wdXRlVW5rbm93bnMpICYmICF0aGlzLkN1cnJSZWMuaXNTYW1lUmVjRGF0YSh0ZW1wQ3VyclJlYywgZmFsc2UsIGZhbHNlKSlcclxuICAgICAgICBhd2FpdCB0aGlzLmV4ZWNVbmtub3duUmNtcHModGhpcy5fb3JpZ2luYWwpO1xyXG5cclxuICAgICAgdGhpcy50YWtlRmxkVmFsc0Zyb21DdXJyUmVjKCk7XHJcbiAgICAgIHRoaXMuX29yaWdpbmFsID0gdGhpcy5DdXJyUmVjLnJlcGxpY2F0ZSgpOyAvLyBtdXN0IGNvcHkgYWdhaW4gdG8gcHJldmVudCBhbHRlcmluZyB0aGUgb3JpZ2luYWwgdmFsdWVzXHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVjUmVtb3ZlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGVyZSBhcmUgbm8gcmVjb3JkcyBpbiB0aGUgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZXNGaXJzdCAmJiB0aGlzLl9pbmNsdWRlc0xhc3QgJiYgKHRoaXMuX3JlY29yZHNUYWIgPT09IG51bGwgfHwgdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgPT09IDApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkQ3VyclRvTW9kaWZpZWQoKTogUHJvbWlzZTx2b2lkPiA7XHJcbiAgYXN5bmMgYWRkQ3VyclRvTW9kaWZpZWQoc2V0UmVjVG9PbGQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IDtcclxuICBhc3luYyBhZGRDdXJyVG9Nb2RpZmllZChzZXRSZWNUb09sZD86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChzZXRSZWNUb09sZCkpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hZGRDdXJyVG9Nb2RpZmllZF8wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuYWRkQ3VyclRvTW9kaWZpZWRfMShzZXRSZWNUb09sZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIHRoZSBjdXJyZW50IHJlY29yZCB0byB0aGUgbW9kaWZpZWQgcmVjb3JkcyB0YWJsZSAtIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGFkZEN1cnJUb01vZGlmaWVkXzAoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmFkZEN1cnJUb01vZGlmaWVkKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCB0aGUgY3VycmVudCByZWNvcmQgdG8gdGhlIG1vZGlmaWVkIHJlY29yZHMgdGFibGUgLSBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNTZXRPbGRSZWNcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgYWRkQ3VyclRvTW9kaWZpZWRfMShzZXRSZWNUb09sZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmFkZFJlY29yZCh0aGlzLkN1cnJSZWMpO1xyXG4gICAgaWYgKHNldFJlY1RvT2xkKSB7XHJcbiAgICAgIHRoaXMuQ3VyclJlYy5zZXRPbGRSZWMoKTtcclxuICAgIH1cclxuICAgIGxldCBjb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVNldFRyYW5zYWN0aW9uU3RhdGVEYXRhdmlld0NvbW1hbmQodGhpcy5nZXRUYXNrKCkuZ2V0VGFza1RhZygpLCB0cnVlKTtcclxuICAgIGF3YWl0IHRoaXMuZ2V0VGFzaygpLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuRXhlY3V0ZShjb21tYW5kKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0YWtlIHRoZSBmaWVsZCB2YWx1ZXMgZnJvbSB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHRha2VGbGRWYWxzRnJvbUN1cnJSZWMoKTogdm9pZCB7XHJcbiAgICAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikudGFrZVZhbHNGcm9tUmVjKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29tcGFyZSBhIHNlbGVjdGVkIGZpZWxkcyB2YWx1ZXMgYmV0d2VlbiB0aGUgY3VycmVudCByZWNvcmQgYW5kIHRoZSBwcmV2aW91cyByZWNvcmRcclxuICAvLy8gICBhbmQgcmV0dXJuIHRydWUgaWYgdGhlaXIgdmFsdWVzIGFyZSBlcXVhbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRMaXN0XCI+dGhlIGxpc3Qgb2YgZmllbGQgaW5kZXhlcyB0byBjb21wYXJlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgY3VyckVxdWFsc1ByZXYoZmxkTGlzdDogbnVtYmVyW10pOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLkN1cnJSZWMgIT09IG51bGwgJiYgdGhpcy5fcHJldkN1cnJSZWMgIT09IG51bGwpIHtcclxuICAgICAgaWYgKHRoaXMuQ3VyclJlYyA9PT0gdGhpcy5fcHJldkN1cnJSZWMpXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZmxkTGlzdC5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGlmICghdGhpcy5DdXJyUmVjLmZsZFZhbHNFcXVhbCh0aGlzLl9wcmV2Q3VyclJlYywgZmxkTGlzdFtpXSkpXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuQ3VyclJlYyAhPT0gdGhpcy5fcHJldkN1cnJSZWMpXHJcbiAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgX3Rhc2sgb2YgdGhpcyBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VGFzaygpOiBUYXNrQmFzZSB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5fdGFzayBpbnN0YW5jZW9mIFRhc2tCYXNlKTtcclxuICAgIHJldHVybiA8VGFza0Jhc2U+dGhpcy5fdGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGZvcm0gZm9yIF90YXNrIG9mIHRoaXMgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEZvcm0oKTogTWdGb3JtIHtcclxuICAgIHJldHVybiA8TWdGb3JtPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIG1vZGlmaWVkIHJlY29yZHMgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIG1vZGlmaWVkUmVjb3Jkc051bWJlcigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5nZXRTaXplKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIGNsaWVudCBrbm93cyBob3cgdG8gaW5pdCBhIG5ldyByZWNvcmQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb21wdXRlQnlDbGllbnQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29tcHV0ZUJ5ID09PSBDT01QVVRFX05FV1JFQ19PTl9DTElFTlQvKidDJyovO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGlzIFJlY29yZCBleGlzdHMgaW4gdGhlIERhdGFWaWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+b2YgbmVlZGVkIHJlY29yZCA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiB0aGUgcmVjb3JkIGV4aXN0cyA8L3JldHVybnM+XHJcbiAgcmVjRXhpc3RzQnlJZChpZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNvcmQoaWQpICE9PSBudWxsO1xyXG4gIH1cclxuXHJcblxyXG4gIFBhcmFtZXRlcnNFeGlzdChpUG9zOiBudW1iZXIsIGlMZW46IG51bWJlcik6IGJvb2xlYW47XHJcbiAgUGFyYW1ldGVyc0V4aXN0KCk6IGJvb2xlYW47XHJcbiAgUGFyYW1ldGVyc0V4aXN0KGlQb3M/OiBudW1iZXIsIGlMZW4/OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKVxyXG4gICAgICByZXR1cm4gdGhpcy5QYXJhbWV0ZXJzRXhpc3RfMChpUG9zLCBpTGVuKTtcclxuICAgIHJldHVybiB0aGlzLlBhcmFtZXRlcnNFeGlzdF8xKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhlcmUgYXJlIHBhcmFtcyBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlQb3NcIj5wb3NpdGlvbiBvZiBmaXJzdCBmaWVsZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpTGVuXCI+bnVtYmVyIG9mIGZpZWxkcyBpbiB0aGUgcmFuZ2U8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSA9IHRoZXJlIGFyZSBwYXJhbWV0ZXJzIGluIHRoZSByYW5nZTwvcmV0dXJucz5cclxuICBwcml2YXRlIFBhcmFtZXRlcnNFeGlzdF8wKGlQb3M6IG51bWJlciwgaUxlbjogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBpUG9zOyBpIDwgaVBvcyArIGlMZW47IGkgPSBpICsgMSkge1xyXG4gICAgICBpZiAoKDxGaWVsZD5zdXBlci5nZXRGaWVsZChpKSkuaXNQYXJhbSgpKVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjaGVjayBpZiB0aGVyZSBhcmUgcGFyYW1zIGluIERhdGF2aWV3IHRhYlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIFBhcmFtZXRlcnNFeGlzdF8xKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuUGFyYW1ldGVyc0V4aXN0KHRoaXMuX3JtSWR4LCB0aGlzLl9ybVNpemUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBhIHJlY29yZCBpcyBpbiB0aGUgbW9kaWZpZWQgcmVjb3JkcyB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPnRoZSBpZCBvZiB0aGUgcmVjb3JkPC9wYXJhbT5cclxuICByZWNJbk1vZGlmaWVkVGFiKGlkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCByZWNvcmQ6IFJlY29yZCA9IHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5nZXRSZWNvcmQoaWQpO1xyXG4gICAgcmV0dXJuIHJlY29yZCAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIHNldFByZXZDdXJyUmVjKCk6IHZvaWQ7XHJcbiAgc2V0UHJldkN1cnJSZWMocmVjOiBSZWNvcmQpOiB2b2lkO1xyXG4gIHNldFByZXZDdXJyUmVjKHJlYz86IFJlY29yZCk6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5zZXRQcmV2Q3VyclJlY18wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0UHJldkN1cnJSZWNfMShyZWMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNhdmVzIHRoZSBjdXJyZW50IHJlY29yZCBhcyB0aGUgcHJldmlvdXMgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0UHJldkN1cnJSZWNfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZDdXJyUmVjID0gdGhpcy5DdXJyUmVjO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRQcmV2Q3VyclJlY18xKHJlYzogUmVjb3JkKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2Q3VyclJlYyA9IHJlYztcclxuICB9XHJcblxyXG4gIGlzUHJldkN1cnJSZWNOdWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXZDdXJyUmVjID09PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlY29tcHV0ZSBhbGwgdmlydHVhbHMgd2l0aCBubyBpbml0IGV4cHJlc3Npb24gd2hpY2ggaGF2ZSBzZXJ2ZXIgcmVjb21wdXRlIGRlZmluZWQgZm9yIHRoZW0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9yZ1JlY1wiPmNvbnRhaW5zIHRoZSB2aXJ0dWFsJ3Mgb3JpZ2luYWwgdmFsdWUgPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGV4ZWNVbmtub3duUmNtcHMob3JnUmVjOiBSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IGZyb206IG51bWJlciA9ICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5nZXRSTUlkeCgpO1xyXG4gICAgbGV0IHNpemU6IG51bWJlciA9ICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5nZXRSTVNpemUoKTtcclxuXHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSB0aGlzLmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAvLyBGaXJzdCB0aW1lIC0gaW5pdGlhbGl6ZSB1bmtub3duUmNtcCB2YWx1ZVxyXG4gICAgaWYgKHRoaXMuX3Vua25vd25SY21wID09PSBVTktOT1dOX1JDTVBTX05PVF9JTklURUQpIHtcclxuXHJcbiAgICAgIGZvciAoaSA9IGZyb207XHJcbiAgICAgICAgICAgaSA8IGZyb20gKyBzaXplICYmIHRoaXMuX3Vua25vd25SY21wID09PSBVTktOT1dOX1JDTVBTX05PVF9JTklURUQ7XHJcbiAgICAgICAgICAgaSsrKSB7XHJcblxyXG4gICAgICAgIGxldCBmaWVsZDogRmllbGQgPSA8RmllbGQ+dGhpcy5fZmllbGRzVGFiLmdldEZpZWxkKGkpO1xyXG5cclxuICAgICAgICBpZiAoZmllbGQuSXNWaXJ0dWFsICYmICFmaWVsZC5oYXNJbml0RXhwKCkgJiYgZmllbGQuaXNTZXJ2ZXJSY21wKCkpXHJcbiAgICAgICAgICB0aGlzLl91bmtub3duUmNtcCA9IFVOS05PV05fUkNNUFNfRk9VTkQvKidZJyovO1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl91bmtub3duUmNtcCA9PT0gVU5LTk9XTl9SQ01QU19GT1VORCAvKidZJyovICYmIHJlYyAhPT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGkgPSBmcm9tOyBpIDwgZnJvbSArIHNpemU7IGkgPSBpICsgMSkge1xyXG5cclxuICAgICAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPnRoaXMuX2ZpZWxkc1RhYi5nZXRGaWVsZChpKTtcclxuICAgICAgICBpZiAoZmllbGQuSXNWaXJ0dWFsICYmICFmaWVsZC5oYXNJbml0RXhwKCkgJiYgZmllbGQuaXNTZXJ2ZXJSY21wKCkgJiYgIXJlYy5mbGRWYWxzRXF1YWwob3JnUmVjLCBpKSkge1xyXG4gICAgICAgICAgbGV0IGZpZWxkVmFsdWU6IHN0cmluZyA9IHJlYy5HZXRGaWVsZFZhbHVlKGkpO1xyXG4gICAgICAgICAgbGV0IGlzTnVsbEZsZDogYm9vbGVhbiA9IHJlYy5Jc051bGwoaSk7XHJcbiAgICAgICAgICByZWMuc2V0RmllbGRWYWx1ZShpLCBvcmdSZWMuR2V0RmllbGRWYWx1ZShpKSwgZmFsc2UpO1xyXG4gICAgICAgICAgYXdhaXQgZmllbGQuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZShmaWVsZFZhbHVlLCBpc051bGxGbGQsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdHJhbnNDbGVhcmVkIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFRyYW5zQ2xlYXJlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RyYW5zQ2xlYXJlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGVyZm9ybSBhbnkgZGF0YSBlcnJvciByZWNvdmVyeSBhY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBhc3luYyBwcm9jZXNzUmVjb3ZlcnkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuX3Rhc2suaXNBYm9ydGluZygpKSB7XHJcbiAgICAgIGxldCBvcmdBY3Rpb246IHN0cmluZyA9IHRoaXMuX3BlbmRpbmdSZWNvdmVyeTtcclxuICAgICAgbGV0IG9yZ1N0b3BFeGVjdXRpb246IGJvb2xlYW4gPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpO1xyXG5cclxuICAgICAgdGhpcy5fcGVuZGluZ1JlY292ZXJ5ID0gUkVDT1ZFUllfQUNUX05PTkU7XHJcbiAgICAgIGlmIChvcmdTdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG5cclxuICAgICAgbGV0IHRlbXBvcmFyeVJlc2V0SW5DdHJsUHJlZml4OiBib29sZWFuID0gKDxUYXNrQmFzZT50aGlzLl90YXNrKS5JbkN0cmxQcmVmaXg7XHJcblxyXG4gICAgICAvLyBpZiB0aGUgZXJyb3IgZnJvbSB3aGljaCB3ZSByZWNvdmVyIGhhcHBlbmVkIHdoaWxlIGluIGN0cmwgcHJlZml4LCByZXNldCBpdCBmb3IgdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZCBoZXJlLFxyXG4gICAgICAvLyBzbyB0aGF0IGVudGVyaW5nIGEgbmV3IGNvbnRyb2wgd2lsbCB3b3JrIChEZWZlY3QgMTIyMzg3KS5cclxuICAgICAgaWYgKHRlbXBvcmFyeVJlc2V0SW5DdHJsUHJlZml4KVxyXG4gICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcblxyXG4gICAgICBzd2l0Y2ggKG9yZ0FjdGlvbikge1xyXG4gICAgICAgIGNhc2UgUkVDT1ZFUllfQUNUX0NBTkNFTDpcclxuICAgICAgICAgICgoPERhdGFWaWV3PnRoaXMuX3Rhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKSkucmVzZXRVcGRhdGVkKCk7XHJcblxyXG4gICAgICAgICAgLy8gUUNSICM3NzM5NzkgKHVwZGF0ZWQgcmVjb3JkIGNhbnQgYmUgY2FuY2VsZWQpXHJcblxyXG4gICAgICAgICAgLy8gY2xlYXIgdGhlIGNhY2hlXHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5nZXRUYXNrQ2FjaGUoKS5jbGVhckNhY2hlKCk7XHJcblxyXG4gICAgICAgICAgLy8gcWNyICM3NzY5NTIuIGNyZWF0ZSBtb2RlIGFuZCBvbmx5IDEgcmVjIG9uIGR2LiBUaGUgc2VydmVyIGhhcyBvcmRlcmVkXHJcbiAgICAgICAgICAvLyBhIHJvbGxiYWNrLiBIZXJlLCB3ZSByZXNldCBvcmlnaW5hbCByZWMgYW5kIGN1cnIgcmVjIHRvIGluc2VydCBtb2RlLFxyXG4gICAgICAgICAgLy8gb3RoZXJ3aXNlLCBuZXh0IHRpbWUgdGhlIGNsaWVudCB3aWxsIHNldCB1cGRhdGUgbW9kZSBmb3IgdGhlIHJlYyBpbnN0ZWFkIG9mIGluc2VydC5cclxuICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA9PT0gMSAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgICAgdGhpcy5DdXJyUmVjLnJlc2V0TW9kaWZpZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5DdXJyUmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgICB0aGlzLkN1cnJSZWMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KTtcclxuICAgICAgICAgICAgdGhpcy5DdXJyUmVjLnNldE5ld1JlYygpO1xyXG4gICAgICAgICAgICB0aGlzLl9vcmlnaW5hbC5zZXRTYW1lQXModGhpcy5DdXJyUmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gVGhlIGNhbmNlbCBoYW5kbGVkIGhlcmUgd2lsbCBub3QgY2F1c2VkIGEgcm9sbGJhY2sgc2luY2UgaXQgd2FzIHJhaXNlZCBieSByb2xsYmFjay4gKHJvbGxiIGFscmVhZHkgZG9uZSBpbiBzZXJ2ZXIpLlxyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kRXZlbnRTdWJ0eXBlKHRoaXMuZ2V0VGFzaygpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLFxyXG4gICAgICAgICAgICBFdmVudFN1YlR5cGUuQ2FuY2VsV2l0aE5vUm9sbGJhY2spO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUkVDT1ZFUllfQUNUX01PVkVfRElSRUNUSU9OX0JFR0lOOlxyXG4gICAgICAgICAgLy8gRGVmZWN0IDE1MjMyMDogV2hlbiBEYXRhYmFzZSBlcnJvciBvY2N1cnMgd2UgbmVlZCBub3QgY2FsbCBSZWNvcmQgc3VmZml4IGFnYWluIGFzIHRoaXMgaXMgY2FsbGVkIGZyb20gUmVjb3JkIHN1ZmZpeC5cclxuICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYXR0ZW1wdCB0byBwYXJrIG9uIGxhc3RwYXJrZWRDdHJsIGFuZCB3YWl0IHRoZXJlXHJcbiAgICAgICAgICBsZXQgbGFzdFBhcmtlZENvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGhpcy5fdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgaWYobGFzdFBhcmtlZENvbnRyb2wgIT09IG51bGwpXHJcbiAgICAgICAgICAgIGF3YWl0IGxhc3RQYXJrZWRDb250cm9sLmludm9rZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUkVDT1ZFUllfQUNUX0JFR0lOX1NDUkVFTjpcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLnNldFByZXZlbnRSZWNvcmRTdWZmaXgodHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdQQUdFKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLnNldFByZXZlbnRSZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUkVDT1ZFUllfQUNUX0JFR0lOX1RBQkxFOlxyXG4gICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBhY3Rpb24gaXMgZW5hYmxlZCBubyBtYXR0ZXIgb3VyIGxvY2F0aW9uIGluIHRoZSB0YWJsZS4gb3RoZXJ3aXNlLCByZWMgcHJlZml4IHdpbGwgbm90IGJlIGV4ZWN1dGVkIGFmdGVyIHJvbGxiYWNrLlxyXG4gICAgICAgICAgdGhpcy5fdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCwgdHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkwpO1xyXG4gICAgICAgICAgLy8gY2xlYXIgdGhlIGNhY2hlXHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5nZXRUYXNrQ2FjaGUoKS5jbGVhckNhY2hlKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKG9yZ1N0b3BFeGVjdXRpb24pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRlbXBvcmFyeVJlc2V0SW5DdHJsUHJlZml4KVxyXG4gICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSW5DdHJsUHJlZml4ID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmIChvcmdBY3Rpb24gIT09IFJFQ09WRVJZX0FDVF9OT05FKVxyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFN0b3BFeGVjdXRpb24odHJ1ZSwgb3JnQWN0aW9uICE9PSBSRUNPVkVSWV9BQ1RfQkVHSU5fVEFCTEUgPyBDbGVhckV2ZW50c09uU3RvcEV4ZWN1dGlvbi5BTEwgOiBDbGVhckV2ZW50c09uU3RvcEV4ZWN1dGlvbi5TRVJWRVIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlcGxlY2lhdGVzIHRoZSBjdXJyZW50IGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXBsaWNhdGUoKTogRGF0YVZpZXcge1xyXG4gICAgbGV0IHJlcDogRGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcyk7XHJcbiAgICByZXAuX3JlY29yZHNUYWIgPSB0aGlzLl9yZWNvcmRzVGFiLnJlcGxpY2F0ZSgpO1xyXG4gICAgcmVwLl9jdXJyUmVjSWQgPSByZXAuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgoMCkuZ2V0SWQoKTtcclxuICAgIHJlcC5fY3VyclJlY0lkeCA9IDA7XHJcbiAgICByZXAuQ3VyclJlYyA9IHJlcC5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCgwKTtcclxuICAgIHJlcC5fcHJldkN1cnJSZWMgPSByZXAuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgoMCk7XHJcbiAgICByZXAuX29yaWdpbmFsID0gcmVwLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KDApO1xyXG4gICAgcmVwLnNldFRvcFJlY0lkeChJbnQzMi5NaW5WYWx1ZSk7XHJcbiAgICAvLyB3ZSBtdXN0IGNoZWNrIGRjVmFscyBpZiBpdCBuZWVkIHRvIGJlIHJlcGxpY2F0ZWQgYXMgd2VsbCBjdXJyZW50eSB3ZSB0aGluayBub3RcclxuICAgIHJldHVybiByZXA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgZHZQb3MgdmFsdWUgbm9uIGhhc2hlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RHZQb3NWYWx1ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2R2UG9zVmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaXMgaXQgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIGQudiBpcyBwYXJzZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEZpcnN0RHYoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlyc3REdjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNldCBpcyB0aGUgZmlyc3QgdGltZSB0aGUgZC52IGlzIHBhcnNlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgUmVzZXRGaXJzdER2KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZmlyc3REdiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGlzIGRhdGF2aWV3IGNhY2hlIHRpbWUgc3RhbXBcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldENhY2hlTFJVKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVMcnVUaW1lU3RhbXA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgdGltZSBzdGFtcCBvZiB0aGUgZGF0YXZpZXdcclxuICAvLy8gICB1c2VkIHdoZW4gaW5zZXJ0aW5nIGRhdGF2aWV3IGluIGNhY2hlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRDYWNoZUxSVSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhY2hlTHJ1VGltZVN0YW1wID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBuZXdzIHRvIHRha2UgdGhlIHZhbHVlcyBmcm9tIHRoZSBnaXZlbiBkdiBhbmQgdG8gc2V0IHRoZW0gYXMgdGhlIGN1cnJlbnQgdmFsdWVzXHJcbiAgLy8vICAgdGhlIGdpdmVuIGR2IGlzIHVzdWFsbHkgY3JlYXRlZCB2aWEgZGF0YXZpZXcucmVwbGljYXRlKClcclxuICAvLy8gICB0aGlzIG1ldGhvZCBkb2VzIG5vdCB0YWtlIHRoZSB2YWx1ZXMgb2YgIGxhc3RTZXNzaW9uQ291bnQgYW5kIGNhY2hlTFJVVGltZVN0YW1wXHJcbiAgLy8vICAgZnJvbSB0aGUgZ2l2ZW4gZHYgc2luY2UgdGhleSBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIG9uZSBjdXJyZW50IGR2IHRvIHRoZSBvdGhlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgc2V0U2FtZUFzKG5ld0R2OiBEYXRhVmlldyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fcm1TaXplID0gbmV3RHYuX3JtU2l6ZTtcclxuICAgIHRoaXMuX3JtSWR4ID0gbmV3RHYuX3JtSWR4O1xyXG4gICAgdGhpcy5fY29tcHV0ZUJ5ID0gbmV3RHYuX2NvbXB1dGVCeTtcclxuICAgIHRoaXMuX2ZsdXNoVXBkYXRlcyA9IG5ld0R2Ll9mbHVzaFVwZGF0ZXM7XHJcbiAgICB0aGlzLl9jdXJyUmVjSWQgPSBuZXdEdi5fY3VyclJlY0lkO1xyXG4gICAgdGhpcy5fY3VyclJlY0lkeCA9IG5ld0R2Ll9jdXJyUmVjSWR4O1xyXG4gICAgdGhpcy5fdG9wUmVjSWQgPSBuZXdEdi5fdG9wUmVjSWQ7XHJcbiAgICB0aGlzLkN1cnJSZWMgPSBuZXdEdi5DdXJyUmVjO1xyXG4gICAgdGhpcy5fb3JpZ2luYWwgPSBuZXdEdi5fb3JpZ2luYWw7XHJcbiAgICB0aGlzLl9wcmV2Q3VyclJlYyA9IG51bGw7XHJcbiAgICB0aGlzLl9maWVsZHNUYWIgPSBuZXdEdi5fZmllbGRzVGFiO1xyXG4gICAgdGhpcy5fcmVjb3Jkc1RhYiA9IG5ld0R2Ll9yZWNvcmRzVGFiO1xyXG4gICAgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiID0gbmV3RHYuX21vZGlmaWVkUmVjb3Jkc1RhYjtcclxuICAgIHRoaXMuX2luY2x1ZGVzRmlyc3QgPSBuZXdEdi5faW5jbHVkZXNGaXJzdDtcclxuICAgIHRoaXMuX2luY2x1ZGVzTGFzdCA9IG5ld0R2Ll9pbmNsdWRlc0xhc3Q7XHJcbiAgICB0aGlzLl9pbnNlcnRBdCA9IG5ld0R2Ll9pbnNlcnRBdDtcclxuICAgIHRoaXMuX2xhc3RDcmVhdGVkUmVjSWQgPSBuZXdEdi5fbGFzdENyZWF0ZWRSZWNJZDtcclxuICAgIHRoaXMuX3Rhc2sgPSBuZXdEdi5fdGFzaztcclxuICAgIHRoaXMuX2RjVmFsc0NvbGxlY3Rpb24gPSBuZXdEdi5fZGNWYWxzQ29sbGVjdGlvbjtcclxuICAgIHRoaXMuX3JlY292ZXJ5ID0gbmV3RHYuX3JlY292ZXJ5O1xyXG4gICAgdGhpcy5fcGVuZGluZ1JlY292ZXJ5ID0gbmV3RHYuX3BlbmRpbmdSZWNvdmVyeTtcclxuICAgIHRoaXMuX2hhc01haW5UYWJsZSA9IG5ld0R2Ll9oYXNNYWluVGFibGU7XHJcbiAgICB0aGlzLl9jaHVua1NpemUgPSBuZXdEdi5fY2h1bmtTaXplO1xyXG4gICAgdGhpcy5fZmlyc3REdiA9IG5ld0R2Ll9maXJzdER2O1xyXG4gICAgdGhpcy5fbGFzdFNlc3Npb25Db3VudGVyID0gbmV3RHYuX2xhc3RTZXNzaW9uQ291bnRlcjtcclxuICAgIHRoaXMuX3NraXBQYXJzaW5nID0gbmV3RHYuX3NraXBQYXJzaW5nO1xyXG4gICAgdGhpcy5fdW5rbm93blJjbXAgPSBuZXdEdi5fdW5rbm93blJjbXA7XHJcbiAgICB0aGlzLl90cmFuc0NsZWFyZWQgPSBuZXdEdi5fdHJhbnNDbGVhcmVkO1xyXG4gICAgdGhpcy5fZHZQb3NWYWx1ZSA9IG5ld0R2Ll9kdlBvc1ZhbHVlO1xyXG4gICAgdGhpcy5fY2FjaGVMcnVUaW1lU3RhbXAgPSBuZXdEdi5fY2FjaGVMcnVUaW1lU3RhbXA7XHJcbiAgICB0aGlzLl9jaGFuZ2VkID0gbmV3RHYuX2NoYW5nZWQ7XHJcbiAgICB0aGlzLl9sb2NhdGVGaXJzdFJlYyA9IG5ld0R2Ll9sb2NhdGVGaXJzdFJlYztcclxuICAgIHN1cGVyLnNldEVtcHR5RGF0YXZpZXcobmV3RHYuaXNFbXB0eURhdGF2aWV3KCkpO1xyXG4gICAgdGhpcy5fdGFzay5zZXRNb2RlKG5ld0R2LnRhc2tNb2RlRnJvbUNhY2hlKTtcclxuXHJcbiAgICAvLyBVUERBVEUgVEhFIFRBQkxFIERJU1BMQVlcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLmdldFRhc2soKS5IYXNMb2FjdGUoKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlYyh0aGlzLl9sb2NhdGVGaXJzdFJlYywgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5zZXRUb3BSZWNJZHgodGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNJZHgodGhpcy5fbG9jYXRlRmlyc3RSZWMpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmdldFRhc2soKS5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KEludDMyLk1pblZhbHVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgSW50MzIuTWluVmFsdWUpO1xyXG4gICAgICAgIHRoaXMuZ2V0VGFzaygpLnNldFByZXZlbnRSZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMuX3Rhc2suZ2V0Rm9ybSgpLmlzU2NyZWVuTW9kZSgpKSB7XHJcbiAgICAgICAgaWYgKCg8TWdGb3JtPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpKS5pc1RhYmxlV2l0aFBhZ2luYXRpb24oKSkge1xyXG4gICAgICAgICAgdGhpcy5Ub3RhbFJlY29yZHNDb3VudCA9IG5ld0R2LlRvdGFsUmVjb3Jkc0NvdW50O1xyXG4gICAgICAgICAgdGhpcy5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgPSBuZXdEdi5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KHRoaXMuX3RvcFJlY0lkeCwgdHJ1ZSwgZmFsc2UsIHRydWUsIEludDMyLk1pblZhbHVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0Rm9ybSgpICE9PSBudWxsKVxyXG4gICAgICAgICg8TWdGb3JtPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpKS51cGRhdGVEaXNwbGF5TGluZUJ5RFYoKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coJ3dyb25nIHRvcCByZWNvcmQgaWR4IGluIERhdGFWaWV3LnNldFNhbWVBcycgKyBleC5NZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRDaGFuZ2VkKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fY2hhbmdlZCA9IHZhbDtcclxuICB9XHJcblxyXG4gIGdldENoYW5nZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlZDtcclxuICB9XHJcblxyXG4gIGdldExvY2F0ZUZpcnN0UmVjKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fbG9jYXRlRmlyc3RSZWM7XHJcbiAgfVxyXG5cclxuICBzZXRMb2NhdGVGaXJzdFJlYyhuZXdGaXJzdDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9sb2NhdGVGaXJzdFJlYyA9IG5ld0ZpcnN0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgYSByZWNvcmQgYnkgaXRzIGlkeFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UmVjQnlJZHgoaWR4OiBudW1iZXIpOiBSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgoaWR4KTtcclxuICB9XHJcblxyXG4gIGdldFNlcnZlckN1cnJSZWMoKTogUmVjb3JkIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvcmRzVGFiLmdldFNlcnZlckN1cnJSZWMoKTtcclxuICB9XHJcblxyXG4gIHplcm9TZXJ2ZXJDdXJyUmVjKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVjb3Jkc1RhYi56ZXJvU2VydmVyQ3VyclJlYygpO1xyXG4gIH1cclxuXHJcbiAgaW5Sb2xsYmFjaygpOiBib29sZWFuIHtcclxuICAgIGxldCBpblJvbGxiYWNrOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX3JlY292ZXJ5ID09PSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9ST0xMQkFDSyAvKidSJyovICYmIHRoaXMuZ2V0VGFzaygpLmlzVHJhbnNhY3Rpb25Pd25lcigpKSB7XHJcbiAgICAgIGluUm9sbGJhY2sgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGluUm9sbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+IDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiA8L3JldHVybnM+XHJcbiAgZ2V0UmVjSWR4KGlkOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjSWR4KGlkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBiYWNrdXAgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGJhY2t1cEN1cnJlbnQoKTogUmVjb3JkIHtcclxuICAgIHJldHVybiB0aGlzLkN1cnJSZWMucmVwbGljYXRlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzdG9yZSBjdXJyZW50IHJlY29yZCBmcm9tIGJhY2t1cFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNCYWNrdXBcIj5iYWNrdXAgb2YgcHJldmlvdXMgY3VycmVudCByZWNvcmQgPC9wYXJhbT5cclxuICByZXN0b3JlQ3VycmVudChyZWNCYWNrdXA6IFJlY29yZCk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KHJlY0JhY2t1cCAhPT0gbnVsbCk7XHJcbiAgICB0aGlzLl9jdXJyUmVjSWQgPSByZWNCYWNrdXAuZ2V0SWQoKTtcclxuICAgIHRoaXMuX2N1cnJSZWNJZHggPSB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0lkeCh0aGlzLl9jdXJyUmVjSWQpO1xyXG4gICAgdGhpcy5DdXJyUmVjID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCh0aGlzLl9jdXJyUmVjSWR4KTtcclxuICAgIHRoaXMuQ3VyclJlYy5zZXRTYW1lQXMocmVjQmFja3VwLCBmYWxzZSk7XHJcbiAgICB0aGlzLnRha2VGbGRWYWxzRnJvbUN1cnJSZWMoKTtcclxuICB9XHJcblxyXG4gIEdldFJlY29yZEJ5SWQoaWQ6IG51bWJlcik6IElSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjb3JkKGlkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyBtb2RpZmllZCByZWNvcmQgb2YgdGhlIHRhc2sgLSBudWxsIGlmIG5vIHJlY29yZCB3YXMgbW9kaWZpZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0TW9kaWZpZWRSZWNvcmQoKTogUmVjb3JkIHtcclxuICAgIGxldCByZWNvcmQ6IFJlY29yZCA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5nZXRTaXplKCkgPiAwKSB7XHJcbiAgICAgIC8vIGluIG1vZFJlY29yZFRibCB3ZSBuZWVkIHRvIGhhdmUgb25seSAxIHJlY29yZFxyXG4gICAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmdldFNpemUoKSA9PT0gMSk7XHJcbiAgICAgIHJlY29yZCA9IHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCgwKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZWNvcmQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0aGUgaWQgb2YgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldEN1cnJlbnRSZWNJZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJSZWNJZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZGF0YXZpZXcgYm91bmRhcmllcyBhcmUgY2hhbmdlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib3JnSW5jbHVkZXNGaXJzdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib3JnSW5jbHVkZXNMYXN0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIERhdGF2aWV3Qm91bmRyaWVzQXJlQ2hhbmdlZChvcmdJbmNsdWRlc0ZpcnN0OiBib29sZWFuLCBvcmdJbmNsdWRlc0xhc3Q6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiBvcmdJbmNsdWRlc0ZpcnN0ICE9PSB0aGlzLkluY2x1ZGVzRmlyc3QoKSB8fCBvcmdJbmNsdWRlc0xhc3QgIT09IHRoaXMuSW5jbHVkZXNMYXN0KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgaW5kZXggb2YgZmlyc3QgZmllbGQgaW4gRGF0YVZpZXcgVGFiXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldFJlY29yZE1haW5JZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9ybUlkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyBudW1iZXIgb2YgZmllbGRzIGluIERhdGFWaWV3IFRhYlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRSZWNvcmRNYWluU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JtU2l6ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgcm91dGUgcGFyYW1zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRSb3V0ZVBhcmFtcygpOiBMaXN0PGFueT4ge1xyXG4gICAgbGV0IHBhcmFtczogTGlzdDxhbnk+ID0gbmV3IExpc3QoKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZmllbGRzVGFiLmdldFNpemUoKTsgaSsrKSB7XHJcblxyXG4gICAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPnRoaXMuX2ZpZWxkc1RhYi5nZXRGaWVsZChpKTtcclxuICAgICAgbGV0IHZhbDogYW55O1xyXG4gICAgICBpZiAoZmllbGQuSXNFeHBvc2VkUm91dGVQYXJhbSAmJiAhZmllbGQuaXNOdWxsKCkpIHtcclxuICAgICAgICBzd2l0Y2ggKGZpZWxkLmdldFR5cGUoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERToge1xyXG4gICAgICAgICAgICB2YWwgPSBmaWVsZC5nZXREaXNwVmFsdWUoKTtcclxuICAgICAgICAgICAgaWYgKGZpZWxkLmlzTnVsbCgpKVxyXG4gICAgICAgICAgICAgIHZhbCA9IGZpZWxkLmdldE51bGxEaXNwbGF5KCk7XHJcbiAgICAgICAgICAgIHZhbCA9IHZhbC50cmltKCk7XHJcbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKCg8c3RyaW5nPnZhbCkubGVuZ3RoID09PSAwID8gJyAnIDogdmFsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOiB7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5pc051bGwoKSlcclxuICAgICAgICAgICAgICBwYXJhbXMucHVzaChmYWxzZSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBwYXJhbXMucHVzaCgoZmllbGQuZ2V0RGlzcFZhbHVlKCkpLmNoYXJBdCgwKSA9PT0gJzEnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6IHtcclxuICAgICAgICAgICAgdmFsID0gZmllbGQuZ2V0RGlzcFZhbHVlKCk7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5pc051bGwoKSlcclxuICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5nZXROdWxsRGlzcGxheSgpO1xyXG4gICAgICAgICAgICBsZXQgcGljOiBQSUMgPSBuZXcgUElDKGZpZWxkLmdldFBpY3R1cmUoKSwgZmllbGQuZ2V0VHlwZSgpLCB0aGlzLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICAgICAgICB2YWwgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AodmFsLCAnJywgcGljLCB0cnVlLCAwLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKHZhbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIChwYXJhbXMubGVuZ3RoID4gMCkgPyBwYXJhbXMgOiBudWxsO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
1610
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YVZpZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL2RhdGEvRGF0YVZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixLQUFLLEVBQ0wsS0FBSyxFQUNMLEtBQUssRUFDTCxpQkFBaUIsRUFDakIsSUFBSSxFQUNKLE9BQU8sRUFFUixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixJQUFJLEVBQ0osZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wscUJBQXFCLEVBRXJCLGdCQUFnQixFQUloQixHQUFHLEVBRUgsYUFBYSxFQUNkLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU3QyxPQUFPLEVBQUUsY0FBYyxJQUFJLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLDBDQUEwQyxFQUMzQyxNQUFNLGdDQUFnQyxDQUFDO0FBRXhDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFeEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDNUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBSzdELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUM7QUFDNUQsTUFBTSx3QkFBd0IsR0FBVyxHQUFHLENBQUM7QUFDN0MsTUFBTSx3QkFBd0IsR0FBVyxHQUFHLENBQUM7QUFDN0MsTUFBTSxtQkFBbUIsR0FBVyxHQUFHLENBQUM7QUFFeEMsTUFBTSx5QkFBeUIsR0FBVyxRQUFRLENBQUM7QUFFbkQsTUFBTSxnQkFBZ0IsR0FBVyxHQUFHLENBQUM7QUFDckMsTUFBTSxnQkFBZ0IsR0FBVyxHQUFHLENBQUM7QUFDckMsTUFBTSxlQUFlLEdBQVcsR0FBRyxDQUFDO0FBQ3BDLE1BQU0sWUFBWSxHQUFXLEdBQUcsQ0FBQztBQUVqQyxNQUFNLHFCQUFxQixHQUFXLEdBQUcsQ0FBQztBQUUxQyxNQUFNLHdCQUF3QixHQUFXLEdBQUcsQ0FBQztBQUM3QyxNQUFNLFVBQVUsR0FBVyxJQUFJLEdBQUcsY0FBYyxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFDdkUsTUFBTSx5QkFBeUIsR0FBVyxHQUFHLENBQUM7QUFHOUMsTUFBTSx3QkFBd0IsR0FBVyxHQUFHLENBQUM7QUFDN0MsTUFBTSxtQkFBbUIsR0FBVyxHQUFHLENBQUM7QUFDeEMsTUFBTSxpQ0FBaUMsR0FBVyxHQUFHLENBQUM7QUFDdEQsTUFBTSxpQkFBaUIsR0FBVyxHQUFHLENBQUM7QUFDdEMsTUFBTSxpQkFBaUIsR0FBVyxHQUFHLENBQUM7QUFDdEMsTUFBTSxpQkFBaUIsR0FBVyxHQUFHLENBQUM7QUFJdEMsTUFBTSxPQUFPLFFBQVMsU0FBUSxZQUFZO0lBNkd4QyxZQUFZLGNBQW1DO1FBQzdDLEtBQUssRUFBRSxDQUFDO1FBN0dGLHVCQUFrQixHQUFXLENBQUMsQ0FBQztRQUMvQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFDeEIsZUFBVSxHQUFXLElBQUksQ0FBQztRQUMxQixlQUFVLEdBQVcsQ0FBQyxDQUFDO1FBQ3ZCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFDekIsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0Isa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFFOUIsY0FBUyxHQUFXLEdBQUcsQ0FBQztRQWFoQywyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFDaEMsc0JBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBQzlCLHdCQUFtQixHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDN0Msb0JBQWUsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUM3Qix3QkFBbUIsR0FBaUIsSUFBSSxDQUFDO1FBRXpDLGtCQUFhLEdBQVcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUN2QyxjQUFTLEdBQVcsSUFBSSxDQUFDO1FBQ3pCLHFCQUFnQixHQUFXLGlCQUFpQixDQUFDO1FBQzdDLGlCQUFZLEdBQVcsSUFBSSxDQUFDO1FBQzVCLGdCQUFXLEdBQWlCLElBQUksQ0FBQztRQUNqQyxjQUFTLEdBQVcsY0FBYyxDQUFDLGFBQWEsQ0FBQztRQUNqRCxXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBQ25CLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDcEIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsY0FBUyxHQUFXLENBQUMsQ0FBQztRQUN0QixlQUFVLEdBQVcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNwQyx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFDcEMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsaUJBQVksR0FBVyx3QkFBd0IsQ0FBQztRQUV4RCxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUU3QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUMvQiwyQkFBc0IsR0FBWSxJQUFJLENBQUM7UUFFL0IsbURBQThDLEdBQVcsSUFBSSxDQUFDO1FBMkJ0RSxlQUFVLEdBQVcsQ0FBQyxDQUFDO1FBT3ZCLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDcEIsc0JBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBQzlCLDZCQUF3QixHQUFXLENBQUMsQ0FBQztRQXVCbkMsSUFBSSxjQUFjLFlBQVksUUFBUSxFQUFFO1lBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQWEsY0FBYyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNwRDthQUFNO1lBQ0wsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBekdELElBQUksUUFBUSxDQUFDLEtBQWE7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBa0NELElBQVksT0FBTztRQUNqQixPQUFPLElBQUksQ0FBQyw4Q0FBOEMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsSUFBWSxPQUFPLENBQUMsS0FBYTtRQUUvQixJQUFJLElBQUksQ0FBQyw4Q0FBOEMsS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsRixJQUFJLENBQUMsOENBQThDLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdEU7UUFDRCxJQUFJLENBQUMsOENBQThDLEdBQUcsS0FBSyxDQUFDO1FBRzVELElBQUksSUFBSSxDQUFDLDhDQUE4QyxLQUFLLElBQUksRUFBRTtZQUNoRSxJQUFJLENBQUMsOENBQThDLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDcEU7SUFDSCxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUtELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBU0QsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBS0QsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFtQk0sSUFBSTtRQUNULElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFNRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLDJCQUEyQjtRQUM3QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztJQUNyQyxDQUFDO0lBTUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBS0QsY0FBYyxDQUFDLE1BQWlCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRTtTQUNoRTtRQUNELElBQUksQ0FBQyxPQUFPLEdBQWMsSUFBSSxDQUFDLEtBQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQU9PLHNCQUFzQixDQUFDLE1BQWlCLEVBQUUsWUFBb0I7UUFDcEUsSUFBSSxZQUFZLEtBQUssSUFBSTtZQUN2QixPQUFPLEtBQUssQ0FBQztRQUVmLElBQUksWUFBWSxLQUFLLFlBQVksQ0FBQyxlQUFlLEVBQUU7WUFDakQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxVQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3BFO2FBQU0sSUFBSSxZQUFZLEtBQUssQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQ2hFLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQy9CLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7O1lBQU0sT0FBTyxLQUFLLENBQUM7UUFDcEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBS08sbUJBQW1CLENBQUMsTUFBaUI7UUFDM0MsSUFBSSxZQUEwQixDQUFDO1FBQy9CLElBQUksR0FBVyxDQUFDO1FBQ2hCLElBQUksU0FBaUIsQ0FBQztRQUN0QixJQUFJLFFBQWdCLENBQUM7UUFFckIsSUFBSSxVQUFVLEdBQVcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFO1lBRWhFLEdBQUcsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RyxZQUFZLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUVwRyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN2RCxTQUFTLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLFFBQVEsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTFDLFFBQVEsU0FBUyxFQUFFO29CQUNqQixLQUFLLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFDakMsSUFBSSxDQUFDLEdBQVcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFFdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7NEJBQ1YsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3BELElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUNyRDt3QkFDRCxNQUFNO3FCQUNQO29CQUNELEtBQUssY0FBYyxDQUFDLGtCQUFrQjt3QkFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBRTlCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxxQkFBcUIsRUFBRTs0QkFDN0MsSUFBSSxDQUFDLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQzs0QkFDM0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7eUJBQzNCOzs0QkFDQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQzt3QkFFN0IsTUFBTTtvQkFDUixLQUFLLGNBQWMsQ0FBQyxvQkFBb0I7d0JBQ3RDLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDcEQsTUFBTTtvQkFDUixLQUFLLGNBQWMsQ0FBQyxrQkFBa0I7d0JBQ3BDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDN0MsTUFBTTtvQkFDUixLQUFLLGNBQWMsQ0FBQyw2QkFBNkI7d0JBQy9DLE1BQU07b0JBQ1I7d0JBQ0UsTUFBTSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyx5QkFBeUIsR0FBRyxZQUFZLENBQUMsZUFBZSxHQUFHLFNBQVM7NEJBQzdHLFNBQVMsQ0FBQyxDQUFDO3dCQUNiLE1BQU07aUJBQ1Q7YUFDRjtZQUNELE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNsQyxPQUFPO1NBQ1I7UUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLGtEQUFrRCxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUtELEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBaUI7UUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUU7U0FDaEU7UUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQU1PLG1CQUFtQjtRQUN6QixJQUFJLFVBQVUsR0FBVyxJQUFJLENBQUM7UUFDOUIsSUFBSSxjQUFjLEdBQWEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDNUYsSUFBSSxjQUFjLEtBQUssSUFBSSxFQUFFO1lBQzNCLFVBQVUsR0FBRyxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVEO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQU9PLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFpQixFQUFFLFlBQW9CO1FBQ3BFLElBQUksSUFBSSxHQUFtQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWhELElBQUksWUFBWSxJQUFJLElBQUk7WUFDdEIsT0FBTyxLQUFLLENBQUM7UUFFZixJQUFJLFlBQVksS0FBSyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUNyRCxJQUFJLFVBQVUsR0FBWSxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFM0QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNyQixJQUFJLFVBQVUsR0FBVyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDeEYsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3JEO2lCQUNJO2dCQUVILElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRzNCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hCLElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxJQUFJO29CQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUVwQyxJQUFJLGVBQWUsR0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFFdEYsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO29CQUdoQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7d0JBQ2YsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxFQUN2Rjs0QkFDRSxJQUFJLFVBQVUsSUFBSSxDQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFHLENBQUMscUJBQXFCLEVBQUUsRUFBRTtnQ0FDekUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQ0FDakMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDOzZCQUNoQzs7Z0NBRUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLENBQUM7eUJBQ25FOzs0QkFFQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ2xDO2lCQUNGO2dCQUNELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksZUFBZSxLQUFLLFNBQVMsQ0FBQyxpQkFBaUI7b0JBQ3JHLGVBQWUsR0FBRyxTQUFTLENBQUMscUJBQXFCLENBQUM7Z0JBRXBELElBQUksVUFBVSxFQUFFO29CQUNkLGVBQWUsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUM7b0JBQzlDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTO3dCQUN0QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO2lCQUMvQztnQkFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztnQkFNakMsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUU5RCxJQUFJLFFBQVEsS0FBSyxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxjQUFjLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFHckcsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssY0FBYyxDQUFDLGFBQWE7d0JBQ2xFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWUsQ0FBQzt3QkFDbEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUtuQyxJQUFJLENBQUMsVUFBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUVuRSxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsVUFBVSxFQUFFO3dCQUNoQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNoRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBRzFDLElBQUksSUFBSSxDQUFDLFFBQVE7NEJBQ2YsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7d0JBR2hDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJOzRCQUNyQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO3FCQUM1RDs7d0JBQ0ksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7aUJBQ3BDO3FCQUNJLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFO29CQUNyRCxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO3dCQUN2QyxJQUFJOzRCQUNGLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7eUJBQ3REO3dCQUNELE9BQU8sU0FBUyxFQUFFOzRCQUNoQixJQUFJLFNBQVMsWUFBWSw0QkFBNEIsRUFBRTs2QkFDdEQ7O2dDQUVDLE1BQU0sU0FBUyxDQUFDO3lCQUNuQjtxQkFDRjt5QkFDSTt3QkFRVyxJQUFJLENBQUMsVUFBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUNuRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUVyQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSTs0QkFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO3dCQUVwRCxJQUFJOzRCQUNGLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQ3BELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJO2dDQUVyQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO3lCQUM1RDt3QkFDRCxPQUFPLFNBQVMsRUFBRTs0QkFDaEIsSUFBSSxTQUFTLFlBQVksNEJBQTRCLEVBQUU7NkJBQ3REOztnQ0FFQyxNQUFNLFNBQVMsQ0FBQzt5QkFDbkI7d0JBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLElBQUksSUFBSTs0QkFDbEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO3FCQUNqRDtvQkFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ04sSUFBSSxDQUFDLFVBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDeEU7Z0JBR0QsSUFBSSxJQUFJLENBQUMsUUFBUTtvQkFDZixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBUXhCLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUztvQkFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxjQUFjLEVBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7Z0JBRWxGLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxjQUFjLENBQUMsYUFBYSxFQUFFO29CQUVuRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQzt3QkFDN0QsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsMEJBQTBCO3dCQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztpQkFDcEQ7cUJBQ0k7b0JBQ0gsSUFBSSxVQUFVLEdBQVksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBRXJELElBQUksYUFBYSxHQUFZLElBQUksQ0FBQztvQkFFbEMsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFO3dCQUN0QixLQUFLLGNBQWMsQ0FBQyxpQkFBaUI7NEJBRW5DLElBQUksVUFBVSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRTtnQ0FHckQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0I7b0NBQ3JELENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhO29DQUN6QixhQUFhLEdBQUcsS0FBSyxDQUFDO3FDQUNuQjtvQ0FDSCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29DQUMvRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7b0NBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7b0NBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQ0FDMUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDO2lDQUM3Qzs2QkFDRjtpQ0FDSSxJQUFJLFVBQVUsS0FBSyxjQUFjLENBQUMsVUFBVSxFQUFFO2dDQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7Z0NBQy9DLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyx3QkFBd0IsQ0FBQztnQ0FDakQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQzs2QkFFaEU7NEJBQ0QsTUFBTTt3QkFFUixLQUFLLGNBQWMsQ0FBQyxjQUFjOzRCQUNoQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDOzRCQUMvQixNQUFNO3FCQUNUO29CQUNELElBQUksYUFBYSxFQUFFO3dCQUNqQixZQUFZLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUVsRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO3FCQUMzQztpQkFDRjthQUNGO1NBQ0Y7YUFDSSxJQUFJLFlBQVksS0FBSyxHQUFHLEdBQUcsY0FBYyxDQUFDLGVBQWUsRUFBRTtZQUM5RCxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQy9ELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztnQkFDakMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDbkM7WUFDRCxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvQixPQUFPLEtBQUssQ0FBQztTQUNkOztZQUVDLE9BQU8sS0FBSyxDQUFDO1FBRWYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBT08sYUFBYSxDQUFDLFVBQWtCO1FBQ3RDLElBQUksVUFBVSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRTtZQUVyRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUdqRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFHMUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7WUFLNUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRzdDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNsQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGlDQUFpQyxDQUFDO2FBQzNEO1NBQ0Y7YUFDSSxJQUFJLFVBQVUsS0FBSyxjQUFjLENBQUMsVUFBVSxFQUFFO1lBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcseUJBQXlCLENBQUM7WUFDbEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFNUQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNDO0lBQ0gsQ0FBQztJQU9PLHlCQUF5QjtRQUMvQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssR0FBRyxFQUFTO1lBRWpDLElBQUksT0FBTyxHQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUM7WUFDNUQsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQyxRQUFRO2dCQUNyQyxJQUFJLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQztZQUU5QixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssS0FBSyxDQUFDLFFBQVE7Z0JBQ3BDLElBQUksQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDO1lBRTdCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUMsUUFBUTtnQkFDdkMsSUFBSSxDQUFDLGFBQWEsSUFBSSxPQUFPLENBQUM7U0FDakM7SUFDSCxDQUFDO0lBS08sS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFpQjtRQUMzQyxJQUFJLFlBQTBCLENBQUM7UUFDL0IsSUFBSSxHQUFXLENBQUM7UUFDaEIsSUFBSSxPQUFnQixDQUFDO1FBQ3JCLElBQUksZUFBZSxHQUFtQixJQUFJLENBQUM7UUFDM0MsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBRTVCLElBQUksQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQztRQUM5QyxJQUFJLFVBQVUsR0FBVyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDcEcsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFHaEUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDekMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsR0FBRyxjQUFjLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFHLFlBQVksR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRXBHLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1lBRXJCLElBQUksVUFBVSxHQUFZLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7WUFNNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7WUFFekIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDdkQsSUFBSSxTQUFTLEdBQVcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELElBQUksUUFBUSxHQUFXLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFdEQsUUFBUSxTQUFTLEVBQUU7b0JBQ2pCLEtBQUssY0FBYyxDQUFDLGlCQUFpQjt3QkFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzdCLE1BQU07b0JBQ1IsS0FBSyxjQUFjLENBQUMscUJBQXFCO3dCQUN2QyxPQUFPLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDekMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUMvQixNQUFNO29CQUNSLEtBQUssY0FBYyxDQUFDLG9CQUFvQjt3QkFDdEMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3pDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQzlCLE1BQU07b0JBQ1IsS0FBSyxjQUFjLENBQUMscUJBQXFCO3dCQUN2QyxPQUFPLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDM0IsTUFBTTtvQkFDUixLQUFLLGNBQWMsQ0FBQyxrQkFBa0I7d0JBQ3BDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDN0MsTUFBTTtvQkFDUixLQUFLLGNBQWMsQ0FBQyxrQkFBa0I7d0JBQUU7eUJBRXZDO3dCQUNDLE1BQU07b0JBQ1IsS0FBSyxjQUFjLENBQUMsa0JBQWtCO3dCQUNwQyxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3pDLE1BQU07b0JBQ1IsS0FBSyxjQUFjLENBQUMsZ0JBQWdCO3dCQUNsQyxJQUFlLElBQUksQ0FBQyxLQUFNLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxTQUFTLENBQUMsY0FBYyxJQUFJLFVBQVU7NEJBQzlFLElBQUksQ0FBQyxLQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3ZELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsQ0FBQzt3QkFDaEUsTUFBTTtvQkFDUixLQUFLLGNBQWMsQ0FBQyxzQkFBc0I7d0JBQ3hDLGVBQWUsR0FBRyxJQUFJLENBQUM7d0JBQ3ZCLE1BQU07b0JBQ1IsS0FBSyxZQUFZLENBQUMsY0FBYzt3QkFDOUIsU0FBUztvQkFDWCxLQUFLLGNBQWMsQ0FBQyxjQUFjO3dCQUNoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDakQsTUFBTTtvQkFDUixLQUFLLGNBQWMsQ0FBQyxrQkFBa0I7d0JBQ3BDLElBQUksU0FBUyxHQUFXLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDcEMsUUFBUSxTQUFTLEVBQUU7NEJBQ2pCLEtBQUssaUJBQWlCO2dDQUNwQixlQUFlLEdBQUcsY0FBYyxDQUFDLHdDQUF3QyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztnQ0FDN0csTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztnQ0FDcEYsTUFBTTs0QkFDUixLQUFLLGlCQUFpQjtnQ0FDcEIsZUFBZSxHQUFHLGNBQWMsQ0FBQyx3Q0FBd0MsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0NBQzlHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7Z0NBQ3BGLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDM0MsTUFBTTs0QkFDUjtnQ0FDRSxNQUFNO3lCQUNUO3dCQUNELE1BQU07b0JBQ1IsS0FBSyxjQUFjLENBQUMsZ0JBQWdCO3dCQUNsQyxJQUFlLElBQUksQ0FBQyxLQUFNLENBQUMsY0FBYzs0QkFDdkMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDeEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLGdCQUFnQixFQUFFLENBQUM7d0JBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM3QixNQUFNO29CQUNSLEtBQUssY0FBYyxDQUFDLG1CQUFtQjt3QkFDckMsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUMzQyxNQUFNO29CQUNSLEtBQUssY0FBYyxDQUFDLHVCQUF1Qjt3QkFDekMsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUMvQyxNQUFNO29CQUNSLEtBQUssY0FBYyxDQUFDLGNBQWM7d0JBRWhDLE1BQU07b0JBQ1IsS0FBSyxjQUFjLENBQUMsaUJBQWlCO3dCQUVuQyxJQUFJLElBQUksR0FBbUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDaEQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzt3QkFDOUQsTUFBTTtvQkFDUixLQUFLLGNBQWMsQ0FBQywrQkFBK0I7d0JBQ2pELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNwRCxNQUFNO29CQUNSLEtBQUssY0FBYyxDQUFDLHVDQUF1Qzt3QkFDekQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQzNELE1BQU07b0JBRVIsS0FBSyxjQUFjLENBQUMsb0NBQW9DO3dCQUN0RCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDN0QsTUFBTTtvQkFFUjt3QkFDRSxNQUFNLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLHlCQUF5QixHQUFHLGNBQWMsQ0FBQyxlQUFlLEdBQUcsU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDO3dCQUMvSCxNQUFNO2lCQUNUO2FBQ0Y7WUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFdkMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2xDLE9BQU8sVUFBVSxDQUFDO1NBQ25CO1FBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ3pGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUdELFlBQVksQ0FBQyxHQUFZO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxlQUFlLENBQUMsR0FBWTtRQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQztJQUMzQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsR0FBWTtRQUMzQixJQUFJLGdCQUFnQixHQUFZLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDcEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUM7UUFFMUIsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLGdCQUFnQixFQUFFO1lBQzVDLElBQUksSUFBSSxHQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO2dCQUNoQixJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ25DO1NBQ0Y7SUFDSCxDQUFDO0lBS08sVUFBVSxDQUFDLE1BQWlCO1FBR2xDLElBQUksVUFBVSxHQUE0QixJQUFJLHVCQUF1QixFQUFFLENBQUM7UUFHeEUsSUFBSSxZQUFZLEdBQVcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRS9DLE9BQU8sWUFBWSxLQUFLLElBQUksSUFBSSxZQUFZLEtBQUssY0FBYyxDQUFDLGNBQWMsRUFBRTtZQUc5RSxJQUFJLGNBQWMsR0FBVyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFbkQsVUFBVSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ2pFLElBQUksR0FBRyxHQUFhLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUV2QyxJQUFJLEdBQUcsS0FBSyxJQUFJO2dCQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7O2dCQUV0QixNQUFNLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLDRDQUE0QyxHQUFHLGNBQWMsQ0FBQyxDQUFDO1lBRTVHLFlBQVksR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDcEM7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQWE7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUtPLGFBQWEsQ0FBQyxNQUFpQjtRQUNyQyxJQUFJLFlBQVksR0FBVyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0MsSUFBSSxrQkFBa0IsR0FBWSxLQUFLLENBQUM7UUFFeEMsT0FBTyxZQUFZLEtBQUssSUFBSSxJQUFJLFlBQVksS0FBSyxjQUFjLENBQUMsdUJBQXVCLEVBQUU7WUFDdkYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLFlBQVksR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbkMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1NBQzNCO1FBQ0QsSUFBSSxrQkFBa0IsRUFBRTtZQUN0QixZQUFZLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLENBQUM7U0FDckQ7SUFDSCxDQUFDO0lBS08sa0JBQWtCLENBQUMsTUFBaUI7UUFDMUMsSUFBSSxZQUEwQixDQUFDO1FBQy9CLE1BQU0sVUFBVSxHQUFXLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUNyRyxJQUFJLFNBQWlCLENBQUM7UUFDdEIsSUFBSSxNQUFNLEdBQVcsRUFBRSxDQUFDO1FBQ3hCLElBQUksU0FBUyxHQUFXLEVBQUUsQ0FBQztRQUMzQixJQUFJLE9BQU8sR0FBVyxDQUFDLENBQUM7UUFFeEIsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFFaEUsSUFBSSxHQUFHLEdBQVcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyRCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsY0FBYyxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTFILFlBQVksR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRXBHLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3ZELFNBQVMsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxRQUFRLEdBQVcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV0RCxRQUFRLFNBQVMsRUFBRTtvQkFDakIsS0FBSyxZQUFZLENBQUMsY0FBYzt3QkFDOUIsTUFBTSxHQUFHLFFBQVEsQ0FBQzt3QkFDbEIsTUFBTTtvQkFDUixLQUFLLGNBQWMsQ0FBQyxpQkFBaUI7d0JBQ25DLFNBQVMsR0FBRyxRQUFRLENBQUM7d0JBQ3JCLE1BQU07b0JBQ1IsS0FBSyxjQUFjLENBQUMsZ0JBQWdCO3dCQUNsQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDckMsTUFBTTtpQkFDVDthQUNGO1lBQ0QsWUFBWSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzNFLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDaEU7O1lBRUMsTUFBTSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFPTyxjQUFjLENBQUMsWUFBMEI7UUFDL0MsSUFBSSxjQUFjLEdBQVcsd0JBQXdCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRWpHLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkQsSUFBSSxTQUFTLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxJQUFJLFNBQVMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO2dCQUNyRCxJQUFJLFFBQVEsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFFNUMsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQU1sQyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsbUJBQW1CO3dCQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQzt5QkFDdEI7d0JBQ0gsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGNBQWMsQ0FBQzt3QkFDMUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNiLE9BQU8sSUFBSSxDQUFDO3FCQUNiO2lCQUNGO2dCQUNELE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQU9ELGNBQWMsQ0FBQyxPQUFlO1FBRTVCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJO1lBQzFCLE9BQWMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbEQsTUFBTSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1FBQ3pHLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQU9NLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBc0I7UUFDMUMsSUFBSSxHQUFhLENBQUM7UUFDbEIsSUFBSSxPQUFPLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM5QyxJQUFJLGFBQWEsR0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDMUQsSUFBSSxjQUFjLEdBQVksS0FBSyxDQUFDO1FBQ3BDLElBQUksWUFBb0IsQ0FBQztRQUV6QixJQUFJLFdBQVcsR0FBdUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUN4RSxJQUFJLGVBQWUsR0FBVyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBSTNHLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FBQyxlQUFlLEdBQUcsR0FBRyxHQUFHLFlBQVksQ0FBQyxjQUFjLEdBQUcsSUFBSTtZQUNwRyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFHakIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLGlCQUFpQixHQUFHLElBQUksR0FBRyxhQUFhLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFJcEYsWUFBWSxHQUFHLEdBQUcsQ0FBQztRQUNuQixJQUFJLGNBQWMsR0FBYSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNsRSxJQUFJLGNBQWMsSUFBSSxJQUFJLEVBQUU7WUFDMUIsSUFBSSxjQUFjLENBQUMsU0FBUyxFQUFFO2dCQUM1QixJQUFJLE1BQU0sR0FBVyxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2hELElBQUksT0FBTyxHQUF3QixZQUFZLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUM1RixZQUFZLEdBQUcsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQ3JDOztnQkFFQyxZQUFZLEdBQUcsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQzlDO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDcEMsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUk7Z0JBQ3RCLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUN2RixPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFFMUYsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUNySyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMscUJBQXFCLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3BFLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO2FBQzVCO1lBR0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLGtCQUFrQixHQUFHLElBQUksR0FBRyxlQUFlLEdBQUcsR0FBRyxHQUFHLFlBQVksR0FBRyxHQUFHLENBQUMsQ0FBQztZQUc1RyxJQUFJLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRTtnQkFDakMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLG1CQUFtQixHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBRTNGLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLGNBQWMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBSXpHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUU7Z0JBQ3hCLElBQUksV0FBVyxHQUF5QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUM5RSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRTtvQkFDMUIsQ0FBRSxNQUFNLFdBQVcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLDZCQUE2QixFQUFFLEtBQUssQ0FBQztvQkFDakYsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxDQUFDO2FBQ3pFO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYTtnQkFDM0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLG9CQUFvQixHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFPdkcsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLEVBQUU7Z0JBQ3pILE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJO29CQUM1RCxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUNwRSxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsd0JBQXdCLEdBQUcsSUFBSTtvQkFDakUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7YUFDbEQ7WUFLRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFO2dCQUM1QixJQUFJLElBQUksR0FBbUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFO29CQUNsRCxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsNEJBQTRCLEdBQUcsSUFBSTt3QkFDckUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7aUJBQ3JDO2FBQ0Y7WUFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUd2QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0JBQ2hFLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3BFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRTtvQkFDN0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7aUJBQ25DO2dCQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7b0JBQ25DLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3hFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2hDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2lCQUNoQzs7b0JBQ0ksT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDNUM7WUFHRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0JBQ2pFLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3JFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFdBQVcsRUFBRTtvQkFDOUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsQ0FBQztvQkFDNUQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7aUJBQ3BDO2dCQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7b0JBQ25DLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3ZFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2hDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2lCQUNoQzs7b0JBQ0ksT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDNUM7WUFJRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUU7Z0JBQ2hFLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3JFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRTtvQkFDNUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7aUJBQ2xDO2dCQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsSUFBSSxJQUFJO29CQUNsQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7O29CQUV6QyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN6QztZQUdELElBQUksTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ25DLElBQUksT0FBTyxHQUFXLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUMxRSxJQUFJLE9BQU8sS0FBSyxFQUFFLEVBQUU7b0JBQ2xCLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3hFLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxVQUFVLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7b0JBQ3JGLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxjQUFjLEdBQUcsSUFBSSxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQztvQkFDM0UsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBSXRDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO3dCQUMzRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN4QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztpQkFDbEQ7YUFDRjtZQUdELElBQUksU0FBUyxHQUFhLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFFdEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQWdCLEVBQUUsRUFBRTtnQkFDckMsR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRWhELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFO29CQUN0QixPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUN2RSxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7b0JBQ3pFLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLENBQUM7b0JBQzdELE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUV0QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUN6QztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUk7Z0JBQ3RCLGNBQWMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUsscUJBQXFCLENBQUMsTUFBTTt1QkFDcEUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7WUFLdEcsSUFBSSxXQUFXLEdBQVksS0FBSyxDQUFDO1lBRWpDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksSUFBSTtnQkFDMUYsV0FBVyxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFFdEYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUUvRSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSTtnQkFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUU3QixLQUFLLElBQUksQ0FBQyxHQUFXLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEUsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtvQkFDekYsU0FBUztnQkFFWCxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDMUM7WUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUszQyxJQUFJLFVBQVUsR0FBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDbEQ7U0FDRjthQUdJO1lBQ0gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLGtCQUFrQixHQUFHLElBQUksR0FBRyxlQUFlLEdBQUcsR0FBRyxHQUFHLFlBQVksR0FBRyxHQUFHO2dCQUN4RyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDM0I7UUFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxjQUFjLENBQUMsZUFBZSxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBTUQsVUFBVTtRQUNSLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQzNELE1BQU0sQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUMsQ0FBQztTQUNqSDtRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBTUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBT0QsY0FBYztRQUVaLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtZQUM1RSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFTRCxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQVUsRUFBRSxPQUFnQjtRQUMzQyxJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3ZDLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDdkIsSUFBSSxNQUFNLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFcEQsSUFBSSxNQUFNLEtBQUssQ0FBQyxDQUFDO2dCQUNmLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2lCQUNuQjtnQkFDSCxJQUFJO29CQUNGLElBQUksYUFBYSxHQUFZLElBQUksQ0FBQyxVQUFVLEtBQUssS0FBSyxDQUFDLFFBQVEsQ0FBQztvQkFDaEUsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDM0YsSUFBSSxFQUFFLEtBQUssUUFBUTt3QkFDakIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUN0QixPQUFPLElBQUksQ0FBQztpQkFDYjtnQkFDRCxPQUFPLFNBQVMsRUFBRTtvQkFDaEIsSUFBSSxTQUFTLFlBQVksNEJBQTRCLEVBQUU7cUJBQ3REOzt3QkFFQyxNQUFNLFNBQVMsQ0FBQztpQkFDbkI7YUFDRjtTQUNGO2FBQ0k7WUFFSCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7U0FDbEM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFZRCxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQWMsRUFBRSxRQUFpQixFQUFFLGFBQXNCLEVBQUUsT0FBZ0IsRUFBRSxjQUFzQjtRQUN2SCxJQUFJLFVBQVUsR0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RCxJQUFJLFdBQW1CLEVBQUUsT0FBZSxDQUFDO1FBT3pDLElBQUksVUFBVSxHQUFZLEtBQUssQ0FBQztRQUVoQyxJQUFJLE1BQU0sS0FBSyxTQUFTLENBQUMsd0JBQXdCLEVBQUU7WUFHakQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsNkJBQTZCLEVBQUUsRUFBRTtnQkFDbEQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLENBQUMsQ0FBQzthQUNuQztZQUVELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFFdkIsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQyxRQUFRLEVBQUU7b0JBQ2hFLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBR1gsVUFBVSxHQUFHLElBQUksQ0FBQztpQkFDbkI7O29CQUVDLE1BQU0sSUFBSSw0QkFBNEIsQ0FBQywwQ0FBMEMsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUMxRjtpQkFDSTtnQkFDSCxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUscUJBQXFCLENBQUMsQ0FBQztnQkFDekYsT0FBTzthQUNSO1NBQ0Y7YUFDSSxJQUFJLE1BQU0sS0FBSyxTQUFTLENBQUMsdUJBQXVCLEVBQUU7WUFDckQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUV0QixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksVUFBVSxFQUFFO29CQUNsQyxNQUFNLEdBQUcsVUFBVSxDQUFDO29CQUVwQixVQUFVLEdBQUcsSUFBSSxDQUFDO2lCQUNuQjs7b0JBQ0ksTUFBTSxJQUFJLDRCQUE0QixDQUFDLDBDQUEwQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ2hHO2lCQUNJO2dCQUlILElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLDZCQUE2QixFQUFFO29CQUNoRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2dCQUV6RCxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBRTNELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYTtvQkFDckIsTUFBTSxJQUFJLDRCQUE0QixDQUFDLDBDQUEwQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUU1RixJQUFJLElBQUksR0FBbUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO29CQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO3dCQUNyRSxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztxQkFDMUQ7aUJBQ0Y7Z0JBQ0QsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO2dCQUN6RixPQUFPO2FBQ1I7U0FDRjthQUVJLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuQixJQUFJLElBQUksQ0FBQyxjQUFjO2dCQUNyQixNQUFNLElBQUksNEJBQTRCLENBQUMsMENBQTBDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFekYsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTlDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDdkQsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBRXpELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDL0QsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDOztnQkFFeEQsTUFBTSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1lBR2hHLElBQUksY0FBYyxHQUFXLFdBQVcsSUFBSSxJQUFJO2dCQUM5QyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQixJQUFJLGNBQWMsS0FBSyxDQUFDO2dCQUN0QixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1lBQzVHLE9BQU87U0FDUjthQUVJLElBQUksTUFBTSxHQUFHLFVBQVUsRUFBRTtZQUM1QixJQUFJLElBQUksQ0FBQyxhQUFhO2dCQUNwQixNQUFNLElBQUksNEJBQTRCLENBQUMsMENBQTBDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFNUYsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztnQkFDckMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTNDLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzVELE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUN6RixPQUFPO1NBQ1I7UUFFRCxJQUFLLG9CQUFvQixHQUFhLEtBQUssQ0FBQztRQUM1QyxJQUFJLFNBQVMsR0FBWSxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNGLFlBQVksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFaEUsSUFBSSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQztZQUN4RixTQUFTLEtBQUssaUJBQWlCLENBQUMsb0JBQW9CLEVBQUU7WUFDcEQsSUFBSSxDQUFRLElBQUksQ0FBQyxPQUFPLEVBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUM1RSxJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUkscUJBQXFCLENBQUMsTUFBTTtvQkFDbEQsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO2FBQy9CO1NBQ0Y7UUFHRCxJQUFJLFVBQVUsSUFBSSxvQkFBb0IsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLFdBQVcsSUFBSSxhQUFhLElBQUksT0FBTyxFQUFFO1lBQ2pHLElBQUksQ0FBQyxhQUFhLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFO2dCQUN0RCxJQUFJLGFBQWEsR0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUV2RCxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQy9DLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUN0QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQjt3QkFDckQsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUM7d0JBQ3ZFLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3JEO2dCQUVELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLEVBQUU7b0JBQ3RELElBQUksWUFBWSxHQUFXLENBQUMsQ0FBQztvQkFDN0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7d0JBQzNCLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQ25DLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO3FCQUN6QjtvQkFDRCxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUM5RyxJQUFJLElBQUksQ0FBQyxrQkFBa0I7d0JBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ25DO2dCQUNELElBQUksWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRTtvQkFDbkQsTUFBTSxJQUFJLDRCQUE0QixDQUFDLDBDQUEwQyxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBSXZHLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLGFBQWEsRUFBRTtvQkFDNUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQU1qRCxJQUFJLGFBQWEsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU07b0JBQy9FLE1BQU0sRUFBRSxDQUFDO2dCQUlYLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBRy9CLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTt3QkFDakYsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLGdCQUFnQixFQUFFO3dCQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDakQsT0FBTztpQkFDUjthQUNGO1lBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVwRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSTtnQkFDdEIsTUFBTSxJQUFJLG9CQUFvQixDQUFDLHlEQUF5RCxDQUFDLENBQUM7WUFFNUYsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1lBRTFCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLEVBQUU7Z0JBS2hDLElBQUksY0FBYyxLQUFLLHFCQUFxQixFQUFFO29CQUNuQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2lCQUMxRDs7b0JBRUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDO2FBQ3JEO1lBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO2dCQUNqRixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBRWpELElBQUksT0FBTztnQkFDVCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDcEM7SUFDSCxDQUFDO0lBU0QsS0FBSyxDQUFDLGNBQWMsQ0FBQyxrQkFBMkI7UUFDaEMsSUFBSSxDQUFDLFVBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBS0QsWUFBWTtRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFNTSxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBZSxFQUFFLFFBQWlCO1FBSXpELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFHLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUVwRCxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRTtZQUNwQyxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzlHLElBQUksWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFO2dCQUM5RSxNQUFNLElBQUksNEJBQTRCLENBQUMsMENBQTBDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM5RixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ2hEO1FBRUQsSUFBSSxTQUFpQixDQUFDO1FBQ3RCLElBQUksV0FBVyxHQUFXLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDMUMsUUFBUSxPQUFPLEVBQUU7WUFDZixLQUFLLFlBQVk7Z0JBQ2YsU0FBUyxHQUFHLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDO2dCQUNsRCxNQUFNO1lBQ1IsS0FBSyxlQUFlO2dCQUNsQixTQUFTLEdBQUcsaUJBQWlCLENBQUMsc0JBQXNCLENBQUM7Z0JBQ3JELE1BQU07WUFDUixLQUFLLGdCQUFnQjtnQkFDbkIsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3RFLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDaEQsTUFBTTtZQUNSLEtBQUssZ0JBQWdCO2dCQUNuQixTQUFTLEdBQUcsaUJBQWlCLENBQUMsaUJBQWlCLENBQUM7Z0JBQ2hELFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNwRSxNQUFNO1lBQ1I7Z0JBQ0UsTUFBTSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyx1REFBdUQsR0FBRyxPQUFPLENBQUMsQ0FBQztnQkFDOUcsT0FBTztTQUNWO1FBQ0QsSUFBSSxHQUFHLEdBQWlCLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlGLEdBQUcsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQzlCLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQU9ELEtBQUssQ0FBQywyQkFBMkI7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQ3JCLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztZQUMzQixNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBTUQsU0FBUyxDQUFDLE1BQWM7UUFDdEIsSUFBSSxVQUFVLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEQsT0FBTyxNQUFNLElBQUksQ0FBQyxJQUFJLE1BQU0sSUFBSSxVQUFVLENBQUM7SUFDN0MsQ0FBQztJQU1ELFVBQVUsQ0FBQyxXQUFtQjtRQUM1QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksQ0FBQztJQUMxRCxDQUFDO0lBTUQsYUFBYTtRQUNYLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQzNDLE1BQU0sQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsa0NBQWtDO29CQUN6RSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQjtvQkFDdkMsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDLENBQUM7YUFDakQ7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBS0QsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBT0QsWUFBWSxDQUFDLFlBQW9CO1FBQy9CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDO0lBQ2pDLENBQUM7SUFLRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFNRCxvQkFBb0IsQ0FBQyxHQUFZO1FBQy9CLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUM7SUFDaEMsQ0FBQztJQUtELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUtELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUN2QyxDQUFDO0lBS0QsS0FBSztRQUNILElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxNQUFNLEdBQW1CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEQsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFLTyxJQUFJO1FBQ1YsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUtBLEtBQUssQ0FBQyxlQUFlO1FBRW5CLElBQUksTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBRzNDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO2dCQUN4QyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ25DOztZQUVDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQVNNLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBaUIsRUFBRSxrQkFBMkI7UUFDbEUsSUFBSSxNQUFNLEdBQVcsSUFBSSxDQUFDO1FBQzFCLElBQUksZUFBZSxHQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZELElBQUksWUFBWSxHQUFXLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFM0MsSUFBSSxrQkFBa0I7WUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyx3QkFBd0IsQ0FBUTtRQUVwRCxJQUFJO1lBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFaEMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDYixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUU7b0JBQzNCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLElBQVksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLEVBQUU7d0JBQzNGLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFRO3FCQUN2RDtpQkFDRjtxQkFDSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixFQUFFO29CQUM1RCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBUTtpQkFDdkQ7YUFDRjtZQUVELElBQUksYUFBYSxHQUFZLGVBQWUsQ0FBQztZQUU3QyxJQUFJLFFBQVEsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO2dCQUNwRixJQUFJLE9BQU8sR0FBbUIsY0FBYyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDM0gsTUFBaUIsSUFBSSxDQUFDLEtBQU0sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQy9EO2lCQUNJO2dCQUdILElBQUksYUFBYSxFQUFFO29CQUNqQixNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDaEQsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNwQixNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUN0QztnQkFFYSxJQUFJLENBQUMsVUFBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxJQUFJLEdBQXlCLElBQUksQ0FBQyxVQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzdELElBQUksSUFBSSxHQUF5QixJQUFJLENBQUMsVUFBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUU5RCxLQUFLLElBQUksQ0FBQyxHQUFXLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDckQsSUFBSSxHQUFHLEdBQWlCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNwRCxJQUFJLGFBQWEsSUFBa0IsSUFBSSxDQUFDLFVBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRTt3QkFDNUgsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDLE9BQU8sQ0FBQzt3QkFDcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7d0JBQ3RCLElBQUk7NEJBQ0YsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO3lCQUN0QjtnQ0FDTzs0QkFDTixJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQzt5QkFDekI7cUJBQ0Y7b0JBR0QsSUFBSSxDQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFHLENBQUMscUJBQXFCO3dCQUN2RCxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzVCO2FBQ0Y7U0FDRjtnQkFDTztZQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBaUIsRUFBRSxhQUFzQixFQUFFLGNBQXVCO1FBQ2hGLElBQUksWUFBWSxHQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN0RCxJQUFJLElBQUksR0FBMEIscUJBQXFCLENBQUMsTUFBTSxDQUFDO1FBQy9ELE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQVdPLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBaUIsRUFBRSxhQUFzQixFQUFFLGFBQXNCLEVBQUUsWUFBb0IsRUFBRSxJQUEyQixFQUFFLGNBQXVCO1FBR3JLLElBQUksR0FBRyxHQUFXLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDakIsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTdDLElBQUksYUFBYSxHQUFXLENBQUMsQ0FBQztRQUM5QixJQUFJLGNBQWMsRUFDbEI7WUFDRSxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUM7Z0JBQ3BDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVztnQkFDbEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBRVI7O1lBRUMsYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsUUFBUTtnQkFDakQsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQztnQkFDdEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBT1QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2xELEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEIsSUFBSTtZQUNGLElBQUksT0FBTyxHQUFZLENBQUMsYUFBYSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRzVGLElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCO2dCQUMxRSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDbkI7UUFDRCxPQUFPLFNBQVMsRUFBRTtZQUNoQixJQUFJLFNBQVMsWUFBWSw0QkFBNEIsRUFBRTtnQkFDckQsSUFBSSxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFO29CQUNuRCxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7O29CQUVuQixNQUFNLElBQUksb0JBQW9CLENBQUMsMkNBQTJDLENBQUMsQ0FBQzthQUUvRTs7Z0JBRUMsTUFBTSxTQUFTLENBQUM7U0FDbkI7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBS0QsS0FBSyxDQUFDLGFBQWE7UUFDakIsSUFBSSxNQUFNLEdBQW1CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEQsSUFBSSxRQUFpQixDQUFDO1FBRXRCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNO1lBQ3pELENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBSXZFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELFFBQVEsR0FBRyxLQUFLLENBQUM7U0FDbEI7YUFDSTtZQUVILElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkQsUUFBUSxHQUFHLElBQUksQ0FBQztTQUNqQjtRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBWSxJQUFJLENBQUMsS0FBTSxDQUFDLGNBQWMsRUFBRTtZQUM1RCxNQUFNLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1NBQzNDO1FBRUQsSUFBSSxjQUFjLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRCxJQUFJO1lBQ0YsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBQ3pCLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUscUJBQXFCLENBQUMsQ0FBQzthQUN2RjtpQkFDSTtnQkFDSCxNQUFNLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ25FO1NBQ0Y7UUFDRCxPQUFPLFNBQVMsRUFBRTtZQUNoQixJQUFJLFNBQVMsWUFBWSw0QkFBNEIsRUFBRTtnQkFHckQsSUFBSTtvQkFDRixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRTt3QkFDMUIsY0FBYyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQ3RELElBQUksTUFBTSxDQUFDLFlBQVksRUFBRTt3QkFDdkIsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxDQUFDOzt3QkFFdEYsTUFBTSxNQUFNLENBQUMsdUJBQXVCLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDckU7Z0JBQ0QsT0FBTyxTQUFTLEVBQUU7b0JBQ2hCLElBQUksU0FBUyxZQUFZLDRCQUE0QixFQUFFO3dCQUlyRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7cUJBQ2Q7O3dCQUVDLE1BQU0sU0FBUyxDQUFDO2lCQUNuQjthQUNGOztnQkFFQyxNQUFNLFNBQVMsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFNRCxZQUFZLENBQUMsTUFBYztRQUN6QixJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUVoRSxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTTtZQUMxQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU07WUFDN0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNO1lBQzNCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBS0QsS0FBSyxDQUFDLDRCQUE0QjtRQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixFQUFFO1lBQ25GLElBQUksTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsOEJBQThCLEVBQUUsSUFBSSxDQUFDO2dCQUNoRixLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEM7YUFDSTtZQUNILElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRTtnQkFDaEYsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQVNPLGNBQWMsQ0FBQyxRQUFpQjtRQUN0QyxJQUFJLGNBQXNCLENBQUM7UUFNM0IsSUFBSSxRQUFRO1lBQ1YsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7YUFDL0I7WUFHSCxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQztnQkFDdEIsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDOztnQkFFdEMsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7U0FDckM7UUFDRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBS0QsS0FBSztRQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQVFELEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBaUIsRUFBRSxpQkFBMEI7UUFDNUQsSUFBSSxXQUFXLEdBQVcsSUFBSSxDQUFDO1FBQy9CLElBQUksVUFBVSxHQUFZLEtBQUssQ0FBQztRQUNoQyxJQUFJLFNBQVMsR0FBdUIsSUFBSSxDQUFDLEtBQU0sQ0FBQyxTQUFTLENBQUM7UUFHMUQsSUFBSSxTQUFTO1lBQ1gsUUFBUSxHQUFHLElBQUksQ0FBQztRQUVsQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUsscUJBQXFCLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDdEYsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBSXhJLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLEVBQUU7b0JBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBQ2xEO2FBQ0Y7aUJBQ0k7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzNCLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQzthQUMzQztTQUNGO2FBRUk7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7Z0JBQzFCLElBQUksUUFBUSxHQUF5QixJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3BFLElBQUksUUFBUSxLQUFLLElBQUk7b0JBQ25CLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUMzQjtZQUVELElBQUksaUJBQWlCO2dCQUNuQixXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQU16QyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSTtnQkFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUVuRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO2dCQUMxRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFOUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQzNDO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUtELE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdEgsQ0FBQztJQUlELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxXQUFxQjtRQUMzQyxJQUFJLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDakMsT0FBTztTQUNSO1FBQ0QsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUtPLEtBQUssQ0FBQyxtQkFBbUI7UUFDL0IsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQU1PLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxXQUFvQjtRQUNwRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRCxJQUFJLFdBQVcsRUFBRTtZQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDMUI7UUFDRCxJQUFJLE9BQU8sR0FBbUIsY0FBYyxDQUFDLHdDQUF3QyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6SCxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFLRCxzQkFBc0I7UUFDTixJQUFJLENBQUMsVUFBVyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFRRCxjQUFjLENBQUMsT0FBaUI7UUFDOUIsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksRUFBRTtZQUN2RCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLFlBQVk7Z0JBQ3BDLE9BQU8sSUFBSSxDQUFDO1lBRWQsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDM0QsT0FBTyxLQUFLLENBQUM7YUFDaEI7U0FDRjthQUNJLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsWUFBWTtZQUM3QyxPQUFPLEtBQUssQ0FBQztRQUVYLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUtELE9BQU87UUFDTCxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLFlBQVksUUFBUSxDQUFDLENBQUM7UUFDN0MsT0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBS0QsT0FBTztRQUNMLE9BQWUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBS0QscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFLRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFLRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxLQUFLLHdCQUF3QixDQUFRO0lBQzdELENBQUM7SUFPRCxhQUFhLENBQUMsRUFBVTtRQUN0QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQztJQUNqRCxDQUFDO0lBS0QsZUFBZSxDQUFDLElBQWEsRUFBRSxJQUFhO1FBQzFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFRTyxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsSUFBWTtRQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFXLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNyRCxJQUFZLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFFLENBQUMsT0FBTyxFQUFFO2dCQUN0QyxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBTU8saUJBQWlCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBTUQsZ0JBQWdCLENBQUMsRUFBVTtRQUN6QixJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVELE9BQU8sTUFBTSxLQUFLLElBQUksQ0FBQztJQUN6QixDQUFDO0lBSUQsY0FBYyxDQUFDLEdBQVk7UUFDekIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUtPLGdCQUFnQjtRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDbkMsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEdBQVc7UUFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7SUFDMUIsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUM7SUFDcEMsQ0FBQztJQU1PLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFjO1FBRTNDLElBQUksQ0FBUyxDQUFDO1FBQ2QsSUFBSSxJQUFJLEdBQXlCLElBQUksQ0FBQyxVQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0QsSUFBSSxJQUFJLEdBQXlCLElBQUksQ0FBQyxVQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFOUQsSUFBSSxHQUFHLEdBQVcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBR3BDLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyx3QkFBd0IsRUFBRTtZQUVsRCxLQUFLLENBQUMsR0FBRyxJQUFJLEVBQ1IsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyx3QkFBd0IsRUFDakUsQ0FBQyxFQUFFLEVBQUU7Z0JBRVIsSUFBSSxLQUFLLEdBQWlCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV0RCxJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTtvQkFDaEUsSUFBSSxDQUFDLFlBQVksR0FBRyxtQkFBbUIsQ0FBUTthQUVsRDtTQUNGO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLG1CQUFtQixJQUFZLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDckUsS0FBSyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUV6QyxJQUFJLEtBQUssR0FBaUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RELElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRTtvQkFDbEcsSUFBSSxVQUFVLEdBQVcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxTQUFTLEdBQVksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdkMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDckQsTUFBTSxLQUFLLENBQUMseUJBQXlCLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUNuRjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBS0QsZUFBZTtRQUNiLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFLTSxLQUFLLENBQUMsZUFBZTtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUM1QixJQUFJLFNBQVMsR0FBVyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFDOUMsSUFBSSxnQkFBZ0IsR0FBWSxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFFbEYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDO1lBQzFDLElBQUksZ0JBQWdCO2dCQUNsQixZQUFZLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXJELElBQUksMEJBQTBCLEdBQXVCLElBQUksQ0FBQyxLQUFNLENBQUMsWUFBWSxDQUFDO1lBSTlFLElBQUksMEJBQTBCO2dCQUNqQixJQUFJLENBQUMsS0FBTSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFFOUMsUUFBUSxTQUFTLEVBQUU7Z0JBQ2pCLEtBQUssbUJBQW1CO29CQUN0QixDQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBSzlELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFLM0MsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixFQUFFO3dCQUMvRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztxQkFDL0M7b0JBR0QsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxhQUFhLEVBQ3pILFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUNyQyxNQUFNO2dCQUVSLEtBQUssaUNBQWlDO29CQUdwQyxJQUFJLGlCQUFpQixHQUF5QixJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQzdFLElBQUcsaUJBQWlCLEtBQUssSUFBSTt3QkFDM0IsTUFBTSxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDbkMsTUFBTTtnQkFFUixLQUFLLHlCQUF5QjtvQkFDNUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM1QyxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUMvRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzdDLE1BQU07Z0JBRVIsS0FBSyx3QkFBd0I7b0JBRTNCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDM0UsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFFOUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUMzQyxNQUFNO2dCQUdSO29CQUNFLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDOUQsTUFBTTthQUNUO1lBQ0QsSUFBSSwwQkFBMEI7Z0JBQ2pCLElBQUksQ0FBQyxLQUFNLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUU3QyxJQUFJLFNBQVMsS0FBSyxpQkFBaUI7Z0JBQ2pDLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFNBQVMsS0FBSyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNsSztJQUNILENBQUM7SUFLRCxTQUFTO1FBQ1AsSUFBSSxHQUFHLEdBQWEsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsR0FBRyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQy9DLEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEQsR0FBRyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDcEIsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxHQUFHLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELEdBQUcsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFakMsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBS0QsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBS0QsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBS0QsWUFBWTtRQUNWLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFLRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQU1ELFdBQVc7UUFDVCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDekQsQ0FBQztJQVFELEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBZTtRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDekMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQUM7UUFDckQsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUN6QyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDakMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztRQUNqRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztRQUNqRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDekMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1FBQ3JELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDO1FBQ25ELElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7UUFDN0MsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRzVDLElBQUk7WUFDRixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDOUIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7YUFDckU7aUJBQ0k7Z0JBQ0gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzlFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0QjtZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFO2dCQUN4QyxJQUFhLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFHLENBQUMscUJBQXFCLEVBQUUsRUFBRTtvQkFDMUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztvQkFDakQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQztpQkFDaEU7Z0JBQ0QsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2hGO1lBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUk7Z0JBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFHLENBQUMscUJBQXFCLEVBQUUsQ0FBQztTQUMxRDtRQUNELE9BQU8sRUFBRSxFQUFFO1lBQ1QsSUFBSSxFQUFFLFlBQVksNEJBQTRCLEVBQUU7Z0JBQzlDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLDRDQUE0QyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMxRjs7Z0JBRUMsTUFBTSxFQUFFLENBQUM7U0FDWjtJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsR0FBWTtRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztJQUN0QixDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxRQUFnQjtRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztJQUNsQyxDQUFDO0lBS0QsV0FBVyxDQUFDLEdBQVc7UUFDckIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksVUFBVSxHQUFZLEtBQUssQ0FBQztRQUVoQyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssY0FBYyxDQUFDLGlCQUFpQixJQUFZLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFO1lBQ3RHLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDbkI7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBTUQsU0FBUyxDQUFDLEVBQVU7UUFDbEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBS0QsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBTUQsY0FBYyxDQUFDLFNBQWlCO1FBQzlCLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBT0QsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBUUQsMkJBQTJCLENBQUMsZ0JBQXlCLEVBQUUsZUFBd0I7UUFDN0UsT0FBTyxnQkFBZ0IsS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksZUFBZSxLQUFLLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5RixDQUFDO0lBTUQsY0FBYztRQUNaLElBQUksTUFBTSxHQUFjLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFFbEQsSUFBSSxLQUFLLEdBQWlCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RELElBQUksR0FBUSxDQUFDO1lBQ2IsSUFBSSxLQUFLLENBQUMsbUJBQW1CLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ2hELFFBQVEsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUN2QjtvQkFDRSxLQUFLLGdCQUFnQixDQUFDLEtBQUssQ0FBQztvQkFDNUIsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPO3dCQUFFOzRCQUM3QixHQUFHLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDOzRCQUMzQixJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0NBQ2hCLEdBQUcsR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7NEJBQy9CLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQVUsR0FBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7eUJBQ3JEO3dCQUNELE1BQU07b0JBRU4sS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPO3dCQUFFOzRCQUM3QixJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0NBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7O2dDQUVuQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO3lCQUN6RDt3QkFDQyxNQUFNO29CQUVSLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQzdCLEdBQUcsR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQzNCLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTs0QkFDaEIsR0FBRyxHQUFHLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDL0IsSUFBSSxHQUFHLEdBQVEsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQzt3QkFDekYsR0FBRyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDdEUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDakIsTUFBTTtxQkFDUDtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBEZWJ1ZyxcclxuICBJbnQzMixcclxuICBJbnQ2NCxcclxuICBpc051bGxPclVuZGVmaW5lZCxcclxuICBMaXN0LFxyXG4gIE5OdW1iZXIsXHJcbiAgU3RyaW5nQnVpbGRlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtcclxuICBDb25zdGFudHMsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTG9nZ2VyLFxyXG4gIE1pc2MsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBYTUxDb25zdGFudHMsXHJcbiAgWG1sUGFyc2VyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7XHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIERjVmFsdWVzLFxyXG4gIERpc3BsYXlDb252ZXJ0b3IsXHJcbiAgSVJlY29yZCxcclxuICBNZ0NvbnRyb2xCYXNlLFxyXG4gIE1nRm9ybUJhc2UsXHJcbiAgUElDLFxyXG4gIFByb3BlcnR5LFxyXG4gIFByb3BJbnRlcmZhY2VcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7IENvbnN0SW50ZXJmYWNlIH0gZnJvbSAnLi4vQ29uc3RJbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBSZWNvcmRzVGFibGUgfSBmcm9tICcuL1JlY29yZHNUYWJsZSc7XHJcbmltcG9ydCB7IFJlY29yZCB9IGZyb20gJy4vUmVjb3JkJztcclxuaW1wb3J0IHsgVGFza0Jhc2UgfSBmcm9tICcuLi90YXNrcy9UYXNrQmFzZSc7XHJcbmltcG9ydCB7IE1nRm9ybSB9IGZyb20gJy4uL2d1aS9NZ0Zvcm0nO1xyXG5pbXBvcnQgeyBGaWVsZHNUYWJsZUV4dCBhcyBGaWVsZHNUYWJsZSB9IGZyb20gJy4vRmllbGRzVGFibGUnO1xyXG5pbXBvcnQge1xyXG4gIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24sXHJcbiAgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbl9FeGNlcHRpb25UeXBlXHJcbn0gZnJvbSAnLi9SZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uJztcclxuaW1wb3J0IHsgSUNsaWVudENvbW1hbmQgfSBmcm9tICcuLi9jb21tYW5kcy9JQ2xpZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7IENvbW1hbmRGYWN0b3J5IH0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvQ29tbWFuZEZhY3RvcnknO1xyXG5pbXBvcnQgeyBYTUxCYXNlZERjVmFsdWVzQnVpbGRlciB9IGZyb20gJy4vWE1MQmFzZWREY1ZhbHVlc0J1aWxkZXInO1xyXG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4vRmllbGQnO1xyXG5pbXBvcnQgeyBNZ0NvbnRyb2wgfSBmcm9tICcuLi9ndWkvTWdDb250cm9sJztcclxuaW1wb3J0IHsgRXZlbnRTdWJUeXBlIH0gZnJvbSAnLi4vZW51bXMnO1xyXG5pbXBvcnQgeyBFdmVudENvbW1hbmQgfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9FdmVudENvbW1hbmQnO1xyXG5pbXBvcnQgeyBSZW1vdGVDb21tYW5kc1Byb2Nlc3NvciB9IGZyb20gJy4uL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcic7XHJcbmltcG9ydCB7IEZpZWxkQmFzZSB9IGZyb20gJy4vRmllbGRCYXNlJztcclxuaW1wb3J0IHsgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyIH0gZnJvbSAnLi4vQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyJztcclxuaW1wb3J0IHsgRGF0YVZpZXdCYXNlIH0gZnJvbSAnLi9EYXRhVmlld0Jhc2UnO1xyXG5pbXBvcnQgeyBBY2Nlc3NIZWxwZXIsIENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uIH0gZnJvbSAnLi4vQWNjZXNzSGVscGVyJztcclxuaW1wb3J0IHsgTUdEYXRhQ29sbGVjdGlvbiB9IGZyb20gJy4uL3Rhc2tzL01HRGF0YUNvbGxlY3Rpb24nO1xyXG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi4vdGFza3MvVGFzayc7XHJcblxyXG5cclxuLy8gQ09OU1RBTlRTXHJcbmV4cG9ydCBjb25zdCBTRVRfRElTUExBWUxJTkVfQllfRFY6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG5jb25zdCBDT01QVVRFX05FV1JFQ19PTl9DTElFTlQ6IHN0cmluZyA9ICdDJztcclxuY29uc3QgVU5LTk9XTl9SQ01QU19OT1RfSU5JVEVEOiBzdHJpbmcgPSAnTSc7XHJcbmNvbnN0IFVOS05PV05fUkNNUFNfRk9VTkQ6IHN0cmluZyA9ICdZJztcclxuXHJcbmNvbnN0IElOVk9LRURfRlJPTV9PRkZMSU5FX1RBU0s6IHN0cmluZyA9ICctOTk5OTknO1xyXG5cclxuY29uc3QgQ0hVTktfQ0FDSEVfTkVYVDogc3RyaW5nID0gJ04nO1xyXG5jb25zdCBDSFVOS19DQUNIRV9QUkVWOiBzdHJpbmcgPSAnUCc7XHJcbmNvbnN0IENIVU5LX0RWX0JPVFRPTTogc3RyaW5nID0gJ0InO1xyXG5jb25zdCBDSFVOS19EVl9UT1A6IHN0cmluZyA9ICdUJztcclxuXHJcbmNvbnN0IENPTVBVVEVfRkxVU0hfVVBEQVRFUzogc3RyaW5nID0gJ0gnO1xyXG5cclxuY29uc3QgQ09NUFVURV9ORVdSRUNfT05fU0VSVkVSOiBzdHJpbmcgPSAnUyc7XHJcbmNvbnN0IEVORF9EVl9UQUc6IHN0cmluZyA9ICc8LycgKyBDb25zdEludGVyZmFjZS5NR19UQUdfREFUQVZJRVcgKyAnPic7XHJcbmNvbnN0IFJFQ09WRVJZX0FDVF9CRUdJTl9TQ1JFRU46IHN0cmluZyA9ICdTJztcclxuXHJcbi8vIHJlY292ZXJ5IGFjdGlvbiB0YWtlbiBieSB0aGUgY2xpZW50IGluIHJlc3BvbnNlIHRvIHJlY292ZXJ5IHR5cGVcclxuY29uc3QgUkVDT1ZFUllfQUNUX0JFR0lOX1RBQkxFOiBzdHJpbmcgPSAnVCc7XHJcbmNvbnN0IFJFQ09WRVJZX0FDVF9DQU5DRUw6IHN0cmluZyA9ICdDJztcclxuY29uc3QgUkVDT1ZFUllfQUNUX01PVkVfRElSRUNUSU9OX0JFR0lOOiBzdHJpbmcgPSAnQic7XHJcbmNvbnN0IFJFQ09WRVJZX0FDVF9OT05FOiBzdHJpbmcgPSAnTic7XHJcbmNvbnN0IFRSQU5TX1NUQVRfQ0xPU0VEOiBzdHJpbmcgPSAnQyc7XHJcbmNvbnN0IFRSQU5TX1NUQVRfT1BFTkVEOiBzdHJpbmcgPSAnTyc7XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgZGF0YXZpZXcgb2YgYSB0YXNrXHJcbmV4cG9ydCBjbGFzcyBEYXRhVmlldyBleHRlbmRzIERhdGFWaWV3QmFzZSB7XHJcbiAgcHJpdmF0ZSBfY2FjaGVMcnVUaW1lU3RhbXA6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfY2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2NodW5rU2l6ZTogbnVtYmVyID0gMzA7XHJcbiAgcHJpdmF0ZSBfY29tcHV0ZUJ5OiBzdHJpbmcgPSAnXFwwJzsgLy8gdGVsbHMgdGhlIGNsaWVudCB0byBleGVjdXRlIHRoZSBjb21wdXRlIG9mIG5ldyByZWNvcmRzIG9uIHRoZSBjbGllbnQgb3Igb24gdGhlIHNlcnZlclxyXG4gIHByaXZhdGUgX2N1cnJSZWNJZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9jdXJyUmVjSWR4OiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX2R2UG9zVmFsdWU6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfZmlyc3REdjogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfZmx1c2hVcGRhdGVzOiBib29sZWFuID0gZmFsc2U7IC8vIFRSVUUgbWVhbnMgdGhhdCB3aGVuZXZlciBhIHJlY29yZCBpcyBjaGFuZ2VkIHdlIG11c3Qgc2VuZCBpdCB0byB0aGUgc2VydmVyXHJcbiAgcHJpdmF0ZSBfaGFzTWFpblRhYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgcHJpdmF0ZSBfaW5zZXJ0QXQ6IHN0cmluZyA9ICcgJztcclxuXHJcbiAgc2V0IEluc2VydEF0KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2luc2VydEF0ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgSW5zZXJ0QXQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9pbnNlcnRBdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdHJ1ZSwgaWYgd2UgYXJlIGV4ZWN1dGluZyBsb2NhbCBkYXRhdmlldyBjb21tYW5kXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBJbkxvY2FsRGF0YXZpZXdDb21tYW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfbGFzdENyZWF0ZWRSZWNJZDogbnVtYmVyID0gMDsgLy8gdGhlIHJlY29yZCBpZCBvZiB0aGUgbGFzdCBjcmVhdGVkIHJlY29yZCBpZFxyXG4gIHByaXZhdGUgX2xhc3RTZXNzaW9uQ291bnRlcjogbnVtYmVyID0gSW50NjQuTWluVmFsdWU7XHJcbiAgcHJpdmF0ZSBfbG9jYXRlRmlyc3RSZWM6IG51bWJlciA9IC0xO1xyXG4gIHByaXZhdGUgX21vZGlmaWVkUmVjb3Jkc1RhYjogUmVjb3Jkc1RhYmxlID0gbnVsbDsgLy8gYWZ0ZXIgc2VuZGluZyB0aGVzZSByZWNvcmRzIHRvIHRoZSBzZXJ2ZXIgdGhlIGxpc3QgaXMgY2xlYXJlZFxyXG5cclxuICBwcml2YXRlIF9vbGRUb3BSZWNJZHg6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gIHByaXZhdGUgX29yaWdpbmFsOiBSZWNvcmQgPSBudWxsO1xyXG4gIHByaXZhdGUgX3BlbmRpbmdSZWNvdmVyeTogc3RyaW5nID0gUkVDT1ZFUllfQUNUX05PTkU7IC8vIHdoZW4gZGlmZmVyZW50IHRoYW4gTk9ORSwgbWVhbnMgdGhlIHNlcnZlciBvcmRlciBmb3IgcmVjb3Zlcnkgd2FzIG5vdCBwZXJmb3JtZWQgKHlldCkuXHJcbiAgcHJpdmF0ZSBfcHJldkN1cnJSZWM6IFJlY29yZCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcmVjb3Jkc1RhYjogUmVjb3Jkc1RhYmxlID0gbnVsbDsgLy8gPGRhdGF2aWV3PiAuLi48L2RhdGF2aWV3PiB0YWdcclxuICBwcml2YXRlIF9yZWNvdmVyeTogc3RyaW5nID0gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORTsgLy8gcmVjb3ZlcnkgYWN0aW9uIHJlcXVlc3QsIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxyXG4gIHByaXZhdGUgX3JtSWR4OiBudW1iZXIgPSAwOyAvLyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGZpZWxkIGluIHRoZSByZWNvcmQgbWFpblxyXG4gIHByaXZhdGUgX3JtU2l6ZTogbnVtYmVyID0gMDsgLy8gbnVtYmVyIG9mIFwic2VsZWN0XCJzIGluIHRoZSByZWNvcmQgbWFpblxyXG4gIHByaXZhdGUgX3NraXBQYXJzaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfdG9wUmVjSWQ6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfdG9wUmVjSWR4OiBudW1iZXIgPSBJbnQzMi5NaW5WYWx1ZTtcclxuICBwcml2YXRlIF90b3BSZWNJZHhNb2RpZmllZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3RyYW5zQ2xlYXJlZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBJZiB0cnVlLCBfdGFzayBpcyB0aGUgb3duZXIgb2YgYSBSZWMgbGV2ZWwgdHJhbnNhY3Rpb24gYW5kIHRoZSBfdGFzayBpcyBpbiBfdGFzayBzdWZmaXhcclxuICBwcml2YXRlIF91bmtub3duUmNtcDogc3RyaW5nID0gVU5LTk9XTl9SQ01QU19OT1RfSU5JVEVEOyAvLyBzaWduYWxzIGlmIGEgdmlydHVhbCBmaWVsZCB3aXRob3V0IGluaXQgZXhwcmVzc2lvbiBoYXMgc2VydmVyIHJjbXAgYWN0aW9uXHJcblxyXG4gIElzT25lV2F5S2V5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIF9pbmNsdWRlc0ZpcnN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgX2luY2x1ZGVzTGFzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIF9zZXJ2ZXJUcmFuc0NhY2hlRW1wdHk6IGJvb2xlYW4gPSB0cnVlOyAvLyBpbmRpY2F0aW9uIHdoZXRoZXIgdGhlIHNlcnZlciBzaWRlIHRyYW5zYWN0aW9uIGNhY2hlIGlzIGVtcHR5XHJcblxyXG4gIHByaXZhdGUgX2N1cnJSZWNfRE9fTk9UX1VTRV9ESVJFQ1RMWV9VU0VfU0VUVEVSX0dFVFRFUjogUmVjb3JkID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBnZXQgQ3VyclJlYygpOiBSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJSZWNfRE9fTk9UX1VTRV9ESVJFQ1RMWV9VU0VfU0VUVEVSX0dFVFRFUjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0IEN1cnJSZWModmFsdWU6IFJlY29yZCkge1xyXG4gICAgLy8gcmVzZXQgdGhlIHByZXYgZGNWYWxJZHMgaW4gbWdjb250cm9sXHJcbiAgICBpZiAodGhpcy5fY3VyclJlY19ET19OT1RfVVNFX0RJUkVDVExZX1VTRV9TRVRURVJfR0VUVEVSICE9PSBudWxsICYmIHZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2N1cnJSZWNfRE9fTk9UX1VTRV9ESVJFQ1RMWV9VU0VfU0VUVEVSX0dFVFRFUi5yZXNldERjVmFsdWVJZCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fY3VyclJlY19ET19OT1RfVVNFX0RJUkVDVExZX1VTRV9TRVRURVJfR0VUVEVSID0gdmFsdWU7XHJcblxyXG4gICAgLy8gc2V0IHRoZSBkY1ZhbElkcyBpbiBtZ2NvbnRyb2xcclxuICAgIGlmICh0aGlzLl9jdXJyUmVjX0RPX05PVF9VU0VfRElSRUNUTFlfVVNFX1NFVFRFUl9HRVRURVIgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fY3VyclJlY19ET19OT1RfVVNFX0RJUkVDVExZX1VTRV9TRVRURVJfR0VUVEVSLlNldERjVmFsdWVJZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IEZsdXNoVXBkYXRlcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9mbHVzaFVwZGF0ZXM7XHJcbiAgfVxyXG5cclxuICBnZXQgSGFzTWFpblRhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhc01haW5UYWJsZTtcclxuICB9XHJcblxyXG4gIERCVmlld1NpemU6IG51bWJlciA9IDA7XHJcbiAgdGFza01vZGVGcm9tQ2FjaGU6IHN0cmluZztcclxuXHJcbiAgZ2V0IEN1cnJlbnRSZWNJZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJSZWNJZDtcclxuICB9XHJcblxyXG4gIER2Y291bnQ6IG51bWJlciA9IDA7XHJcbiAgVG90YWxSZWNvcmRzQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3OiBudW1iZXIgPSAwO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGZpcnN0IERhdGF2aWV3IFJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0IEZpcnN0UmVjb3JkKCk6IElSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgoMCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGxhc3QgZGF0YXZpZXcgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXQgTGFzdFJlY29yZCgpOiBJUmVjb3JkIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ1RPUlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY29uc3RydWN0b3IodGFzazogVGFza0Jhc2UpO1xyXG4gIGNvbnN0cnVjdG9yKERhdGFWaWV3OiBEYXRhVmlldyk7XHJcbiAgY29uc3RydWN0b3IodGFza09yRGF0YVZpZXc6IERhdGFWaWV3IHwgVGFza0Jhc2UpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBpZiAodGFza09yRGF0YVZpZXcgaW5zdGFuY2VvZiBUYXNrQmFzZSkge1xyXG4gICAgICB0aGlzLl90YXNrID0gPFRhc2tCYXNlPnRhc2tPckRhdGFWaWV3O1xyXG4gICAgICB0aGlzLl9maWVsZHNUYWIgPSBuZXcgRmllbGRzVGFibGUoKTtcclxuICAgICAgdGhpcy5fcmVjb3Jkc1RhYiA9IG5ldyBSZWNvcmRzVGFibGUodHJ1ZSk7XHJcbiAgICAgIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYiA9IG5ldyBSZWNvcmRzVGFibGUoZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCB0YXNrT3JEYXRhVmlldyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrcyBpZiB0aGUgZmlyc3Qgcm93IG9mIGRhdGEgaXMgZXhpc3RzIGluIHRoZSBjbGllbnQncyBkYXRhIHZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpcyB0aGUgZmlyc3Qgcm93IG9mIGRhdGEgaXMgaW5jbHVkZWQgaW4gdGhlIGNsaWVudCA8L3JldHVybnM+XHJcbiAgSW5jbHVkZXNGaXJzdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlc0ZpcnN0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IFNlcnZlclRyYW5zYWN0aW9uQ2FjaGVFbXB0eSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJUcmFuc0NhY2hlRW1wdHk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIGlmIHRoZSBsYXN0IHJvdyBvZiBkYXRhIGlzIGluY2x1ZGVkIGluIHRoZSBjbGllbnQncyBkYXRhIHZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiB0aGUgbGFzdCByb3cgb2YgZGF0YSBpcyBpbmNsdWRlZCBpbiB0aGUgY2xpZW50J3MgZGF0YSB2aWV3IDwvcmV0dXJucz5cclxuICBJbmNsdWRlc0xhc3QoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZXNMYXN0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSBEVkhFQURFUiB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGZpbGxIZWFkZXJEYXRhKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICB3aGlsZSAodGhpcy5pbml0SGVhZGVySW5uZXJPYmplY3RzKHBhcnNlciwgcGFyc2VyLmdldE5leHRUYWcoKSkpIHtcclxuICAgIH1cclxuICAgIHRoaXMuRHZjb3VudCA9ICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuY3RsX2l0bV80X3BhcmVudF92ZWUoMCwgMSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgdGhlIERWSEVBREVSIGlubmVyIG9iamVjdHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm91bmRUYWdOYW1lXCI+ICBuYW1lIG9mIHRhZywgb2Ygb2JqZWN0LCB3aGljaCBuZWVkIGJlIGFsbG9jYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBpcyBmaW5pc2hlZCBpbm5lciB0YWc8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBpbml0SGVhZGVySW5uZXJPYmplY3RzKHBhcnNlcjogWG1sUGFyc2VyLCBmb3VuZFRhZ05hbWU6IFN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfRFZIRUFERVIpIHtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coJ2R2aGVhZGVyIGZvdW5kJyk7XHJcbiAgICAgIHRoaXMuZ2V0SGVhZGVyQXR0cmlidXRlcyhwYXJzZXIpO1xyXG4gICAgICB0aGlzLl9maWVsZHNUYWIuZmlsbERhdGEocGFyc2VyLCB0aGlzKTtcclxuICAgICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLnNldFJNUG9zKHRoaXMuX3JtU2l6ZSwgdGhpcy5fcm1JZHgpO1xyXG4gICAgfSBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09ICgnLycgKyBYTUxDb25zdGFudHMuTUdfVEFHX0RWSEVBREVSKSkge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIERWSEVBREVSIHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRIZWFkZXJBdHRyaWJ1dGVzKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz47XHJcbiAgICBsZXQgdGFnOiBzdHJpbmc7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmc7XHJcbiAgICBsZXQgdmFsdWVTdHI6IHN0cmluZztcclxuXHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICB0YWcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihYTUxDb25zdGFudHMuTUdfVEFHX0RWSEVBREVSKSArIFhNTENvbnN0YW50cy5NR19UQUdfRFZIRUFERVIubGVuZ3RoKTtcclxuICAgICAgdG9rZW5zVmVjdG9yID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG5cclxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogKz0gMikge1xyXG4gICAgICAgIGF0dHJpYnV0ZSA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICAgIHZhbHVlU3RyID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1JNUE9TOiB7XHJcbiAgICAgICAgICAgIGxldCBpOiBudW1iZXIgPSB2YWx1ZVN0ci5pbmRleE9mKCcsJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcm1TaXplID0gTk51bWJlci5QYXJzZSh2YWx1ZVN0ci5zdWJzdHIoMCwgaSkpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3JtSWR4ID0gTk51bWJlci5QYXJzZSh2YWx1ZVN0ci5zdWJzdHIoaSArIDEpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DT01QVVRFX0JZOlxyXG4gICAgICAgICAgICB0aGlzLl9jb21wdXRlQnkgPSB2YWx1ZVN0clswXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb21wdXRlQnkgPT09IENPTVBVVEVfRkxVU0hfVVBEQVRFUykge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NvbXB1dGVCeSA9IENPTVBVVEVfTkVXUkVDX09OX1NFUlZFUjtcclxuICAgICAgICAgICAgICB0aGlzLl9mbHVzaFVwZGF0ZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICB0aGlzLl9mbHVzaFVwZGF0ZXMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0hBU19NQUlOX1RCTDpcclxuICAgICAgICAgICAgdGhpcy5faGFzTWFpblRhYmxlID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DSFVOS19TSVpFOlxyXG4gICAgICAgICAgICB0aGlzLl9jaHVua1NpemUgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQ0hVTktfU0laRV9FWFBSRVNTSU9OOlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZygnVW5rbm93biBhdHRyaWJ1dGUgZm9yIDwnICsgWE1MQ29uc3RhbnRzLk1HX1RBR19EVkhFQURFUiArICc+IHRhZzogJyArXHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlKTsgLy8gdG8gZGVsZXRlIFwiPlwiIHRvb1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleCgrK2VuZENvbnRleHQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coJ2luIERhdGFWaWV3LmdldEhlYWRlckF0dHJpYnV0ZXMoKTogb3V0IG9mIGJvdW5kcycpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSBEQVRBVklFVyB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGZpbGxEYXRhKHBhcnNlcjogWG1sUGFyc2VyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9za2lwUGFyc2luZyA9IGZhbHNlO1xyXG4gICAgd2hpbGUgKGF3YWl0IHRoaXMuaW5pdElubmVyT2JqZWN0cyhwYXJzZXIsIHBhcnNlci5nZXROZXh0VGFnKCkpKSB7XHJcbiAgICB9XHJcbiAgICB0aGlzLlJlc2V0Rmlyc3REdigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdHJhbnNhY3Rpb24gYmVnaW4gb2YgdGhlIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBHZXRUcmFuc2FjdGlvbkJlZ2luKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgdHJhbnNCZWdpbjogc3RyaW5nID0gJ1xcMCc7XHJcbiAgICBsZXQgdHJhbnNCZWdpblByb3A6IFByb3BlcnR5ID0gdGhpcy5fdGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RSQVNBQ1RJT05fQkVHSU4pO1xyXG4gICAgaWYgKHRyYW5zQmVnaW5Qcm9wICE9PSBudWxsKSB7XHJcbiAgICAgIHRyYW5zQmVnaW4gPSAodHJhbnNCZWdpblByb3AuR2V0Q29tcHV0ZWRWYWx1ZSgpKS5jaGFyQXQoMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRyYW5zQmVnaW47XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgdGhlIERBVEFWSUVXIGlubmVyIG9iamVjdHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm91bmRUYWdOYW1lXCI+ICBuYW1lIG9mIHRhZywgb2Ygb2JqZWN0LCB3aGljaCBuZWVkIGJlIGFsbG9jYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBpcyBmaW5pc2hlZCBpbm5lciB0YWc8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBpbml0SW5uZXJPYmplY3RzKHBhcnNlcjogWG1sUGFyc2VyLCBmb3VuZFRhZ05hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCk7XHJcblxyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gKENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVykpIHtcclxuICAgICAgbGV0IGludmFsaWRhdGU6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmdldEF0dHJpYnV0ZXMocGFyc2VyKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9za2lwUGFyc2luZykge1xyXG4gICAgICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoRU5EX0RWX1RBRywgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyBFTkRfRFZfVEFHLmxlbmd0aCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIGV4ZWMgc3RhY2sgZW50cmllcyB2YWx1ZXNcclxuICAgICAgICB0aGlzLmZpbGxFeGVjU3RhY2socGFyc2VyKTtcclxuXHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIGRhdGEgY29udHJvbHMgdmFsdWVzXHJcbiAgICAgICAgdGhpcy5maWxsRGF0YURjKHBhcnNlcik7XHJcbiAgICAgICAgaWYgKGludmFsaWRhdGUgJiYgZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgIGZvcm0uU2V0VGFibGVJdGVtc0NvdW50KDAsIHRydWUpO1xyXG5cclxuICAgICAgICBsZXQgdGFza1JlZnJlc2hUeXBlOiBzdHJpbmcgPSB0aGlzLl9yZWNvcmRzVGFiLmZpbGxEYXRhKHRoaXMsIHRoaXMuX2luc2VydEF0LCBwYXJzZXIpO1xyXG5cclxuICAgICAgICBpZiAoZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAvLyBGb3IgdGhlIGZpcnN0IHRpbWUsIGFzIHRoZSB0YWJsZSBjb250cm9sIGlzIG5vdCB5ZXQgY3JlYXRlZCwgbm8gbmVlZCB0byB1cGRhdGUgdGhlIHRhYmxlIGl0ZW0ncyBjb3VudC5cclxuICAgICAgICAgIC8vIFNldCB0aGUgdXBkYXRlZCB0YWJsZSBpdGVtcyBjb3VudCBvbmx5IHdoZW4gZm9ybSBpcyBhbHJlYWR5IG9wZW5lZC5cclxuICAgICAgICAgIGlmIChmb3JtLk9wZW5lZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faW5zZXJ0QXQgPT09ICdCJyAmJiAoaW52YWxpZGF0ZSB8fCB0aGlzLl9yZWNvcmRzVGFiLkluc2VydGVkUmVjb3Jkc0NvdW50ID4gMCkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBpZiAoaW52YWxpZGF0ZSB8fCAhKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtLlNldFRhYmxlSXRlbXNDb3VudCgwLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGZvcm0uc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZm9ybS5JbnNlcnRUYWJsZUl0ZW1zKDAsIHRoaXMuX3JlY29yZHNUYWIuSW5zZXJ0ZWRSZWNvcmRzQ291bnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBmb3JtLnNldFRhYmxlSXRlbXNDb3VudChmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLkN1cnJSZWMgIT0gbnVsbCAmJiB0aGlzLkN1cnJSZWMuSW5SZWNvbXB1dGUgJiYgdGFza1JlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX05PTkUpXHJcbiAgICAgICAgICB0YXNrUmVmcmVzaFR5cGUgPSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDO1xyXG5cclxuICAgICAgICBpZiAoaW52YWxpZGF0ZSkge1xyXG4gICAgICAgICAgdGFza1JlZnJlc2hUeXBlID0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3Rhc2suSXNTdWJGb3JtKVxyXG4gICAgICAgICAgICB0aGlzLmdldFRhc2soKS5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5nZXRUYXNrKCkuU2V0UmVmcmVzaFR5cGUodGFza1JlZnJlc2hUeXBlKTtcclxuICAgICAgICB0aGlzLlVwZGF0ZURhdGF2aWV3QWZ0ZXJJbnNlcnQoKTtcclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAgICAgICogdGhlIHJlY29yZHMgdGFibGUgbWlnaHQgc2V0IGEgbmV3IGN1cnJlbnQgcmVjb3JkLiBJdFxyXG4gICAgICAgICAgICAgKiBhY3R1YWxseSBiZWNvbWVzIHRoZSBjdXJyZW50IHJlY29yZCBieSBjYWxsaW5nIHNldEN1cnJSZWMoKVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICBsZXQgbmV3UmVjSWQ6IG51bWJlciA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0SW5pdGlhbEN1cnJSZWNJZCgpO1xyXG5cclxuICAgICAgICBpZiAobmV3UmVjSWQgIT09IEludDMyLk1pblZhbHVlICYmICh0aGlzLl9yZWNvdmVyeSA9PT0gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSB8fCB0aGlzLl9maXJzdER2KSkge1xyXG5cclxuICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY2xpZW50IHBlcmZvcm1zIHRoZSBmaXJzdCByZWNvcmQgcHJlZml4XHJcbiAgICAgICAgICBpZiAodGhpcy5fZmlyc3REdiAmJiB0aGlzLl9yZWNvdmVyeSA9PT0gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSAmJlxyXG4gICAgICAgICAgICAodGhpcy5fdGFzay5nZXRMZXZlbCgpLmNoYXJDb2RlQXQoMCkgPT09IDAgfHwgdGhpcy5fdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKSlcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuXHJcbiAgICAgICAgICAvLyBJZiB0aGUgc2VydmVyIHNlbnQgdXMgYW4gdXBkYXRlZCBjdXJyUmVjIHRoZW4gaW52YWxpZGF0ZSBhbGwgY3VycmVudCB2YWx1ZXMuXHJcbiAgICAgICAgICAvLyB0aGlzIHdpbGwgZm9yY2UgYWxsIG5ldyB2YWx1ZXMgdG8gYmUgY29waWVkIGZyb20gdGhlIGN1cnJSZWMgdG8gdGhlIGRhdGF2aWV3LFxyXG4gICAgICAgICAgLy8gZXNwZWNpYWxseSB2aXJ0dWFsIGZpZWxkcyB3aXRoIG5vIGluaXQgZXhwcmVzc2lvbi5cclxuICAgICAgICAgICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5pbnZhbGlkYXRlKHRydWUsIEZpZWxkLkxFQVZFX0ZMQUdTKTtcclxuXHJcbiAgICAgICAgICBpZiAobmV3UmVjSWQgIT09IHRoaXMuX2N1cnJSZWNJZCkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWMobmV3UmVjSWQsICF0aGlzLl9maXJzdER2KTtcclxuICAgICAgICAgICAgdGhpcy5fb3JpZ2luYWwgPSB0aGlzLkN1cnJSZWMucmVwbGljYXRlKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBmaXggYnVnICM3Nzk4NTg6IGZvcmNlIGNvbXB1dGUgZm9yIHRoZSBmaXJzdCByZWNvcmQgaW4gYSBzY3JlZW4gbW9kZSBfdGFza1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZmlyc3REdilcclxuICAgICAgICAgICAgICB0aGlzLnRha2VGbGRWYWxzRnJvbUN1cnJSZWMoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFFDUiAjOTgxMzIwOiBtYWtlIHN1cmUgdGhhdCB2aXJ0dWFscyB3aXRoIG5vIGluaXQgb3IgY29udHJvbCBhcmUgaW5pdGlhbGl6ZWRcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0Rm9ybSgpICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgKDxNZ0Zvcm0+KHRoaXMuX3Rhc2suZ2V0Rm9ybSgpKSkudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHRoaXMudGFrZUZsZFZhbHNGcm9tQ3VyclJlYygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpbnZhbGlkYXRlICYmIHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpID4gMCkge1xyXG4gICAgICAgICAgaWYgKGZvcm0gPT0gbnVsbCB8fCBmb3JtLmlzU2NyZWVuTW9kZSgpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgoMCwgZmFsc2UsIHRydWUsIGZhbHNlLCAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIC8vIFFDUiAjNDMxNjMwOiBGb3IgZm9ybXMgaW4gbGluZSBtb2RlIHRoZXJlIHdhcyBhIHNpdHVhdGlvbiBpbiB3aGljaFxyXG4gICAgICAgICAgICAvLyBhZnRlciBpbnZhbGlkYXRpb24sIHRoZSBjdXJyZW50IHJlY29yZCB3YXMgc2V0IHRvIGJlIHRoZSBmaXJzdCBvZlxyXG4gICAgICAgICAgICAvLyB0aGUgZGF0YXZpZXcgYnV0IHRoZSBjdXJyZW50IGxpbmUgb2YgdGhlIGZvcm0gd2FzIGdyZWF0ZXIgdGhhbiAwLlxyXG4gICAgICAgICAgICAvLyBJdCBjYXVzZWQgc2F2aW5nIGFuIG9yaWdpbmFsIHJlY29yZCB3aGljaCBpcyBkaWZmZXJlbnQgdGhhbiB0aGVcclxuICAgICAgICAgICAgLy8gb3JpZ2luYWwgb2YgdGhlIGN1cnJlbnQgZm9ybSBsaW5lLiBUbyBzb2x2ZSB0aGlzIHByb2JsZW0gd2UgZmlyc3RcclxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGN1cnNvciBwYXJrcyBvbiB0aGUgZmlyc3Qgcm93IG9mIHRoZSBkYXRhdmlldy5cclxuICAgICAgICAgICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmludmFsaWRhdGUodHJ1ZSwgRmllbGQuTEVBVkVfRkxBR1MpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFRvcFJlY0lkeCgwKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldEZvcm0oKSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICg8TWdGb3JtPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpKS5TZXRUYWJsZVRvcEluZGV4KCk7XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KDAsIGZhbHNlLCB0cnVlLCB0cnVlLCAwKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRGb3JtKCkgIT0gbnVsbClcclxuICAgICAgICAgICAgICAvLyB0byB1cGRhdGUgdHJlZSB3ZSBuZWVkIHRvIGxvYWQgbm9kZXMgZmlyc3RcclxuICAgICAgICAgICAgICAgICg8TWdGb3JtPih0aGlzLl90YXNrLmdldEZvcm0oKSkpLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wgJiYgdGhpcy5fdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgdGhpcy5fdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLnJlc2V0UHJldlZhbCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zYXZlT3JpZ2luYWwoKTsgLy8gQWZ0ZXIgaW52YWxpZGF0aW9uLCB3ZSBtdXN0IHNhdmUgdGhlIG9yaWdpbmFsIHJlY29yZCB0b29cclxuICAgICAgICAgICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5pbnZhbGlkYXRlKHRydWUsIEZpZWxkQmFzZS5DTEVBUl9GTEFHUyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBRQ1IgIzc2MTg0OCBwcmV2Q3VyclJlYyBzaG91bGQgc2V0IHRoZSBmaXJzdCB0aW1lIHRoZSBkYXRhdmlldyBpcyBpbml0aWFsaXplZFxyXG4gICAgICAgIGlmICh0aGlzLl9maXJzdER2KVxyXG4gICAgICAgICAgdGhpcy5zZXRQcmV2Q3VyclJlYygpO1xyXG5cclxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgc3ViIGZvcm1zIGFyZSBub3QgdW5uZWNlc3NhcmlseSByZWZyZXNoZWQ6XHJcbiAgICAgICAgLy8gQWZ0ZXIgc2V0dGluZyB0aGUgY3VycmVudCByZWNvcmQgYW5kIGJlZm9yZSBleGVjdXRpbmcgcmVjb3JkIHByZWZpeFxyXG4gICAgICAgIC8vIHdlIHNhdmUgdGhlIGN1cnJlbnQgcmVjb3JkIGFzIHRoZSBwcmV2aW91cyByZWNvcmQgc28gd2hlbiB0aGUgcmVjb3JkIHByZWZpeFxyXG4gICAgICAgIC8vIGlzIGV4ZWN1dGVkIGl0IHdpbGwgc2tpcCByZWZyZXNoaW5nIHRoZSBzdWIgZm9ybXMuIFdlIGRvIHRoYXQgYmVjYXVzZVxyXG4gICAgICAgIC8vIHRoZSBzZXJ2ZXIgYWxyZWFkeSBwYXNzZXMgYmFjayB0byB0aGUgY2xpZW50IGFsbCB0aGUgZGF0YXZpZXdzIG9mIHRoZVxyXG4gICAgICAgIC8vIHN1YiBmb3JtcyBpbiBhIHNpbmdsZSBpdGVyYXRpb24uXHJcbiAgICAgICAgaWYgKGludmFsaWRhdGUgJiYgdGhpcy5fdGFzay5Jc1N1YkZvcm0pXHJcbiAgICAgICAgICAoPE1nQ29udHJvbEJhc2U+dGhpcy5fdGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKSkuUmVmcmVzaE9uVmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVjb3ZlcnkgPT09IENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpIHtcclxuICAgICAgICAgIC8vIE5vIG5lZWQgdG8gcGVyZm9ybSByZWNvcmQgcHJlZml4IGFmdGVyIGEgcmVjb3JkIGxldmVsIHRyYW5zYWN0aW9uIHJldHJ5XHJcbiAgICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuZ2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9SRVRSWSkgJiZcclxuICAgICAgICAgICAgIXRoaXMuZ2V0VGFzaygpLklzQWZ0ZXJSZXRyeUJlZm9yZUJ1aWxkWE1MKVxyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHRyYW5zQmVnaW4gPSA8c3RyaW5nPiB0aGlzLkdldFRyYW5zYWN0aW9uQmVnaW4oKTtcclxuXHJcbiAgICAgICAgICBsZXQgc3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgICAgICAgc3dpdGNoICh0aGlzLl9yZWNvdmVyeSkge1xyXG4gICAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JPTExCQUNLOlxyXG5cclxuICAgICAgICAgICAgICBpZiAodHJhbnNCZWdpbiA9PT0gQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkge1xyXG4gICAgICAgICAgICAgICAgLy8gUUNSICM3NDczMTYgY2FuJ3Qgcm9sbGJhY2sgYSBsb3N0IHJlY29yZFxyXG4gICAgICAgICAgICAgICAgLy8gQWxzbywgaW4gY2FzZSBvZiBub24gaW50ZXJhY3RpdmUgX3Rhc2ssIHNraXAgdG8gdGhlIG5leHQgcmVjb3JkLlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSB8fFxyXG4gICAgICAgICAgICAgICAgICAhdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlKVxyXG4gICAgICAgICAgICAgICAgICBzdG9wRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9ST0xMQkFDSyk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuQ3VyclJlYy5yZXN0YXJ0KHRoaXMuQ3VyclJlYy5nZXRNb2RlKCkpO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLkN1cnJSZWMucmVzZXRNb2RpZmllZCgpO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbCA9IHRoaXMuQ3VyclJlYy5yZXBsaWNhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1JlY292ZXJ5ID0gUkVDT1ZFUllfQUNUX0NBTkNFTDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSBpZiAodHJhbnNCZWdpbiAhPT0gQ29uc3RJbnRlcmZhY2UuVFJBTlNfTk9ORSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdSZWNvdmVyeSA9IFJFQ09WRVJZX0FDVF9CRUdJTl9UQUJMRTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLnNldEFmdGVyUmV0cnkoQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUk9MTEJBQ0spO1xyXG4gICAgICAgICAgICAgICAgLy8gZW5zdXJlIF90YXNrIGNsb3NlIGFjdGlvbiBpcyBzdG9wcGVkICh0YXNrRW5kKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUkVUUlk6XHJcbiAgICAgICAgICAgICAgdGhpcy5SZWNvdmVyeVJldHJ5KHRyYW5zQmVnaW4pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHN0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGUgdGFzayBzdWZmaXggd2FzIGFscmVhZHkgZXhlY3V0ZWQsIG5lZWQgdG8gc2V0IHRoaXMgZmxhZyB0byBmYWxzZSBpbiBvcmRlciB0byBlbmFibGUgaXQgdG8gZXhlY3V0ZSBUUyBhZ2Fpbi5cclxuICAgICAgICAgICAgdGhpcy5nZXRUYXNrKCkuVGFza1N1ZmZpeEV4ZWN1dGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09ICcvJyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVykge1xyXG4gICAgICBpZiAodGhpcy5faW5jbHVkZXNGaXJzdCAmJiB0aGlzLl9pbmNsdWRlc0xhc3QgJiYgdGhpcy5pc0VtcHR5KCkpIHtcclxuICAgICAgICB0aGlzLl9jdXJyUmVjSWQgPSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgICAgICB0aGlzLl9jdXJyUmVjSWR4ID0gSW50MzIuTWluVmFsdWU7XHJcbiAgICAgICAgdGhpcy5DdXJyUmVjID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNldFRvcFJlY0lkeChJbnQzMi5NaW5WYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0cmFuc0JlZ2luXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIFJlY292ZXJ5UmV0cnkodHJhbnNCZWdpbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodHJhbnNCZWdpbiA9PT0gQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkge1xyXG4gICAgICAvLyBObyBuZWVkIHRvIHJlLXBlcmZvcm0gcmVjb3JkIHByZWZpeCBkdXJpbmcgcmV0cnkuXHJcbiAgICAgIHRoaXMuX3Rhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuXHJcbiAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSByZWNvcmQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHNlcnZlciBhZnRlciBjb3JyZWN0aW9uXHJcbiAgICAgIHRoaXMuZ2V0VGFzaygpLnNldFRyYW5zYWN0aW9uRmFpbGVkKHRydWUpO1xyXG5cclxuICAgICAgLy8gZW5zdXJlIHJlY29yZCBwcmVmaXggaXMgbm90IGV4ZWN1dGVkIGZvciBhbGwgdGFza3Mgd2hpY2ggcGFydGljaXBhdGUgaW4gdGhlIHRyYW5zYWN0aW9uXHJcbiAgICAgIHRoaXMuZ2V0VGFzaygpLnNldEFmdGVyUmV0cnkoQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUkVUUlkpO1xyXG5cclxuICAgICAgLy8gUUNSICM0Nzk2ODY6IG5vIG5lZWQgdG8gYWRkIHRoZSBjdXJyIHJlYyB0byB0aGUgbGlzdCBhbnltb3JlXHJcbiAgICAgIC8vIGJlY2F1c2UgdGhlIGluc2VydC9tb2RpZnkgbWF5IGJlIGNhbmNlbGVkIGFuZCBhIHJvbGxiYWNrIGV2ZW50XHJcbiAgICAgIC8vIHdvdWxkIGJlIHNlbnQgdG8gdGhlIHNlcnZlclxyXG4gICAgICB0aGlzLkN1cnJSZWMucmVzdGFydCh0aGlzLkN1cnJSZWMuZ2V0TW9kZSgpKTtcclxuXHJcbiAgICAgIC8vIEFuIGVycm9yIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBfdGFzayBuZWVkcyBubyBtb3ZlbWVudCAoZXJyb3IgaW4gcmVjLXByZWZpeClcclxuICAgICAgaWYgKCF0aGlzLl9maXJzdER2KSB7XHJcbiAgICAgICAgdGhpcy50YWtlRmxkVmFsc0Zyb21DdXJyUmVjKCk7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ1JlY292ZXJ5ID0gUkVDT1ZFUllfQUNUX01PVkVfRElSRUNUSU9OX0JFR0lOO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0cmFuc0JlZ2luICE9PSBDb25zdEludGVyZmFjZS5UUkFOU19OT05FKSB7XHJcbiAgICAgIHRoaXMuX3Rhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgIHRoaXMuX3BlbmRpbmdSZWNvdmVyeSA9IFJFQ09WRVJZX0FDVF9CRUdJTl9TQ1JFRU47XHJcbiAgICAgIHRoaXMuZ2V0VGFzaygpLnNldEFmdGVyUmV0cnkoQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUkVUUlkpO1xyXG4gICAgICAvLyBlbnN1cmUgX3Rhc2sgY2xvc2UgYWN0aW9uIGlzIHN0b3BwZWQgKHRhc2tFbmQpXHJcbiAgICAgIHRoaXMuZ2V0VGFzaygpLnNldFRyYW5zYWN0aW9uRmFpbGVkKHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHVwZGF0ZSBEYXRhdmlldyBBZnRlciBpbnNlcnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgVXBkYXRlRGF0YXZpZXdBZnRlckluc2VydCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9pbnNlcnRBdCA9PT0gJ0InLyonQicqLykge1xyXG5cclxuICAgICAgbGV0IG5ld1JlY3M6IG51bWJlciA9IHRoaXMuX3JlY29yZHNUYWIuSW5zZXJ0ZWRSZWNvcmRzQ291bnQ7XHJcbiAgICAgIGlmICh0aGlzLl9jdXJyUmVjSWR4ICE9PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgICB0aGlzLl9jdXJyUmVjSWR4ICs9IG5ld1JlY3M7XHJcblxyXG4gICAgICBpZiAodGhpcy5fdG9wUmVjSWR4ICE9PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgICB0aGlzLl90b3BSZWNJZHggKz0gbmV3UmVjcztcclxuXHJcbiAgICAgIGlmICh0aGlzLl9vbGRUb3BSZWNJZHggIT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIHRoaXMuX29sZFRvcFJlY0lkeCArPSBuZXdSZWNzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgREFUQVZJRVcgdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGdldEF0dHJpYnV0ZXMocGFyc2VyOiBYbWxQYXJzZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPjtcclxuICAgIGxldCB0YWc6IFN0cmluZztcclxuICAgIGxldCBib29sVmFsOiBib29sZWFuO1xyXG4gICAgbGV0IGRhdGFWaWV3Q29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBudWxsO1xyXG4gICAgbGV0IGlzRW1wdHlEYXRhdmlldyA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuX3JlY292ZXJ5ID0gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORTtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuXHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICB0YWcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihDb25zdEludGVyZmFjZS5NR19UQUdfREFUQVZJRVcpICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXLmxlbmd0aCk7XHJcbiAgICAgIHRva2Vuc1ZlY3RvciA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuXHJcbiAgICAgIHRoaXMuX2luc2VydEF0ID0gJyAnO1xyXG4gICAgICAvLyBmaW5kIGFuZCBleGVjdXRlIGludmFsaWRhdGUgaW1tZWRpYXRlbHlcclxuICAgICAgbGV0IGludmFsaWRhdGU6IGJvb2xlYW4gPSB0aGlzLnBlZWtJbnZhbGlkYXRlKHRva2Vuc1ZlY3Rvcik7XHJcblxyXG5cclxuXHJcbiAgICAgIC8vIGxvY2F0ZUZpcnN0UmVjIGlzIHNlbnQgYnkgc2VydmVyIG9ubHkgaWYgcmVjb3JkcyBhcmUgbG9jYXRlZCBmb3IgdGhlIHN1YmZvcm0uXHJcbiAgICAgIC8vIFNvLCBpdCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gMC5cclxuICAgICAgdGhpcy5fbG9jYXRlRmlyc3RSZWMgPSAwO1xyXG5cclxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogKz0gMikge1xyXG4gICAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0lOU0VSVF9BVDpcclxuICAgICAgICAgICAgdGhpcy5faW5zZXJ0QXQgPSB2YWx1ZVN0clswXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5DTFVERV9GSVJTVDpcclxuICAgICAgICAgICAgYm9vbFZhbCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgdGhpcy5TZXRJbmNsdWRlc0ZpcnN0KGJvb2xWYWwpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTkNMVURFX0xBU1Q6XHJcbiAgICAgICAgICAgIGJvb2xWYWwgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIHRoaXMuU2V0SW5jbHVkZXNMYXN0KGJvb2xWYWwpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JU19PTkVXQVlfS0VZOlxyXG4gICAgICAgICAgICBib29sVmFsID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgICB0aGlzLlNldE9uZVdheUtleShib29sVmFsKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfREJWSUVXU0laRTpcclxuICAgICAgICAgICAgdGhpcy5EQlZpZXdTaXplID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0lOVkFMSURBVEU6IHtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1RPUF9SRUNfSUQ6XHJcbiAgICAgICAgICAgIHRoaXMuX3RvcFJlY0lkID0gTk51bWJlci5QYXJzZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tNT0RFOlxyXG4gICAgICAgICAgICBpZiAoKDxUYXNrQmFzZT50aGlzLl90YXNrKS5nZXRPcmlnaW5hbFRhc2tNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfTk9ORSB8fCBpbnZhbGlkYXRlKVxyXG4gICAgICAgICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0T3JpZ2luYWxUYXNrTW9kZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX01PREUsIHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRU1QVFlfREFUQVZJRVc6XHJcbiAgICAgICAgICAgIGlzRW1wdHlEYXRhdmlldyA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9UQVNLSUQ6XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0xPV19JRDpcclxuICAgICAgICAgICAgdGhpcy5fbGFzdENyZWF0ZWRSZWNJZCA9IE5OdW1iZXIuUGFyc2UodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UUkFOU19TVEFUOlxyXG4gICAgICAgICAgICBsZXQgdHJhbnNTdGF0OiBzdHJpbmcgPSB2YWx1ZVN0clswXTtcclxuICAgICAgICAgICAgc3dpdGNoICh0cmFuc1N0YXQpIHtcclxuICAgICAgICAgICAgICBjYXNlIFRSQU5TX1NUQVRfT1BFTkVEOlxyXG4gICAgICAgICAgICAgICAgZGF0YVZpZXdDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU2V0VHJhbnNhY3Rpb25TdGF0ZURhdGF2aWV3Q29tbWFuZCh0aGlzLmdldFRhc2soKS5nZXRUYXNrVGFnKCksIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRUYXNrKCkuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBjYXNlIFRSQU5TX1NUQVRfQ0xPU0VEOlxyXG4gICAgICAgICAgICAgICAgZGF0YVZpZXdDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU2V0VHJhbnNhY3Rpb25TdGF0ZURhdGF2aWV3Q29tbWFuZCh0aGlzLmdldFRhc2soKS5nZXRUYXNrVGFnKCksIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0VGFzaygpLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuRXhlY3V0ZShkYXRhVmlld0NvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0VHJhbnNhY3Rpb25GYWlsZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFQ09WRVJZOlxyXG4gICAgICAgICAgICBpZiAoKDxUYXNrQmFzZT50aGlzLl90YXNrKS5Jc1RyeWluZ1RvU3RvcClcclxuICAgICAgICAgICAgICB0aGlzLmdldFRhc2soKS5zZXRUcnlpbmdUb1N0b3AoZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLmdldFRhc2soKS5yZXNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlY292ZXJ5ID0gdmFsdWVTdHJbMF07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0RWUE9TX1ZBTFVFOlxyXG4gICAgICAgICAgICB0aGlzLl9kdlBvc1ZhbHVlID0gTk51bWJlci5QYXJzZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0xPQ0FURV9GSVJTVF9JRDpcclxuICAgICAgICAgICAgdGhpcy5fbG9jYXRlRmlyc3RSZWMgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfT0ZGU0VUOlxyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVVNFUl9TT1JUOlxyXG4gICAgICAgICAgICAvLyBRQ1IgIyA5MjMzODA6R2V0dGluZyB0aGUgdmFsdWUgb2YgdXNlclNvcnQgZnJvbSB0aGUgZGF0YXZpZXcgaGVhZGVyLklmIHRydWUgdGhlbiBzb3J0IHNpZ24gd2lsbCBiZSByZW1vdmVkIG9yIGVsc2Ugc2hvd24uXHJcbiAgICAgICAgICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICAgICAgICBmb3JtLmNsZWFyVGFibGVDb2x1bW5Tb3J0TWFyayhYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9WQUxfVE9UQUxfUkVDT1JEU19DT1VOVDpcclxuICAgICAgICAgICAgdGhpcy5Ub3RhbFJlY29yZHNDb3VudCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9WQUxfUkVDT1JEU19CRUZPUkVfQ1VSUkVOVF9WSUVXOlxyXG4gICAgICAgICAgICB0aGlzLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVkFMX1NFUlZFUl9UUkFOU19DQUNIRV9FTVBUWTpcclxuICAgICAgICAgICAgdGhpcy5fc2VydmVyVHJhbnNDYWNoZUVtcHR5ID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coJ1Vua25vd24gYXR0cmlidXRlIGZvciA8JyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVyArICc+IHRhZzogJyArIGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZXRFbXB0eURhdGF2aWV3KGlzRW1wdHlEYXRhdmlldyk7XHJcblxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7XHJcbiAgICAgIHJldHVybiBpbnZhbGlkYXRlO1xyXG4gICAgfVxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdpbiBEYXRhVmlldy5nZXRBdHRyaWJ1dGVzKCk6IG91dCBvZiBib3VuZHMnKTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG5cclxuICBTZXRPbmVXYXlLZXkodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLklzT25lV2F5S2V5ID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgU2V0SW5jbHVkZXNMYXN0KHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5faW5jbHVkZXNMYXN0ID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgU2V0SW5jbHVkZXNGaXJzdCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBwcmV2SW5jbHVkZUZpcnN0OiBib29sZWFuID0gdGhpcy5faW5jbHVkZXNGaXJzdDtcclxuICAgIHRoaXMuX2luY2x1ZGVzRmlyc3QgPSB2YWw7XHJcblxyXG4gICAgaWYgKHRoaXMuX2luY2x1ZGVzRmlyc3QgIT09IHByZXZJbmNsdWRlRmlyc3QpIHtcclxuICAgICAgbGV0IGZvcm06IE1nRm9ybUJhc2UgPSB0aGlzLl90YXNrLmdldEZvcm0oKTtcclxuICAgICAgaWYgKGZvcm0gIT09IG51bGwpIHtcclxuICAgICAgICAgZm9ybS5TZXRUYWJsZUl0ZW1zQ291bnQoMCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSBhbmQgZmlsbCBpbm5lciBkYXRhIGZvciBhbGwgPGRjX3ZhbD4gdGFncyBhcmUgY29udGFpbmVkIGludG8gdGhlIDxkYXRhdmlldz5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZmlsbERhdGFEYyhwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG5cclxuICAgIC8vIENyZWF0ZSBhIERDIHZhbHVlcyBidWlsZGVyLlxyXG4gICAgbGV0IGRjdkJ1aWxkZXI6IFhNTEJhc2VkRGNWYWx1ZXNCdWlsZGVyID0gbmV3IFhNTEJhc2VkRGNWYWx1ZXNCdWlsZGVyKCk7XHJcblxyXG4gICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBcImRjX3ZhbHNcIiB0YWdzLlxyXG4gICAgbGV0IGZvdW5kVGFnTmFtZTogc3RyaW5nID0gcGFyc2VyLmdldE5leHRUYWcoKTtcclxuXHJcbiAgICB3aGlsZSAoZm91bmRUYWdOYW1lICE9PSBudWxsICYmIGZvdW5kVGFnTmFtZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RDX1ZBTFMpIHtcclxuXHJcbiAgICAgIC8vIFNhdmUgY3VycmVudCBpbmRleCBmb3IgZnV0dXJlIHJlZmVyZW5jZSwgaW4gY2FzZSBvZiBhbiBlcnJvci5cclxuICAgICAgbGV0IGRjVmFsc1Bvc2l0aW9uOiBudW1iZXIgPSBwYXJzZXIuZ2V0Q3VyckluZGV4KCk7XHJcblxyXG4gICAgICBkY3ZCdWlsZGVyLlNlcmlhbGl6ZWREQ1ZhbHMgPSBwYXJzZXIuUmVhZFRvRW5kT2ZDdXJyZW50RWxlbWVudCgpO1xyXG4gICAgICBsZXQgZGN2OiBEY1ZhbHVlcyA9IGRjdkJ1aWxkZXIuQnVpbGQoKTtcclxuXHJcbiAgICAgIGlmIChkY3YgIT09IG51bGwpXHJcbiAgICAgICAgdGhpcy5BZGREY1ZhbHVlcyhkY3YpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdFcnJvciB3aGlsZSBwYXJzaW5nIERDIHZhbHVlcyBhdCBwb3NpdGlvbiAnICsgZGNWYWxzUG9zaXRpb24pO1xyXG5cclxuICAgICAgZm91bmRUYWdOYW1lID0gcGFyc2VyLmdldE5leHRUYWcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEFkZERjVmFsdWVzKGRjdjogRGNWYWx1ZXMpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RjVmFsc0NvbGxlY3Rpb24uQWRkKGRjdi5nZXRJZCgpLnRvU3RyaW5nKCksIGRjdik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgYW5kIGZpbGwgaW5uZXIgZGF0YSBmb3IgYWxsIDxleGVjc3RhY2tlbnRyeT4gdGFncyBhcmUgY29udGFpbmVkIGludG8gdGhlIDxkYXRhdmlldz5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZmlsbEV4ZWNTdGFjayhwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IGZvdW5kVGFnTmFtZTogc3RyaW5nID0gcGFyc2VyLmdldE5leHRUYWcoKTtcclxuICAgIGxldCBleGVjU3RhY2tUYWdFeGlzdHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICB3aGlsZSAoZm91bmRUYWdOYW1lICE9PSBudWxsICYmIGZvdW5kVGFnTmFtZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VYRUNfU1RBQ0tfRU5UUlkpIHtcclxuICAgICAgdGhpcy5maWxsSW5uZXJFeGVjU3RhY2socGFyc2VyKTtcclxuICAgICAgZm91bmRUYWdOYW1lID0gcGFyc2VyLmdldE5leHRUYWcoKTtcclxuICAgICAgZXhlY1N0YWNrVGFnRXhpc3RzID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChleGVjU3RhY2tUYWdFeGlzdHMpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucmV2ZXJzZVNlcnZlckV4ZWNTdGFjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZpbGwgaW5uZXIgb2JqZWN0cyBvZiA8ZXhlY3N0YWNrZW50cnk+IHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBmaWxsSW5uZXJFeGVjU3RhY2socGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPjtcclxuICAgIGNvbnN0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX1RFUk0sIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmc7XHJcbiAgICBsZXQgdGFza0lkOiBzdHJpbmcgPSAnJztcclxuICAgIGxldCBoYW5kbGVySWQ6IHN0cmluZyA9ICcnO1xyXG4gICAgbGV0IG9wZXJJZHg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VYRUNfU1RBQ0tfRU5UUlkpICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VYRUNfU1RBQ0tfRU5UUlkubGVuZ3RoKTtcclxuXHJcbiAgICAgIHRva2Vuc1ZlY3RvciA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgICBhdHRyaWJ1dGUgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGopKTtcclxuICAgICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpKTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVEFTS0lEOlxyXG4gICAgICAgICAgICB0YXNrSWQgPSB2YWx1ZVN0cjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSEFORExFUklEOlxyXG4gICAgICAgICAgICBoYW5kbGVySWQgPSB2YWx1ZVN0cjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfT1BFUl9JRFg6XHJcbiAgICAgICAgICAgIG9wZXJJZHggPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hTZXJ2ZXJFeGVjU3RhY2sodGFza0lkLCBoYW5kbGVySWQsIG9wZXJJZHgpO1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyBYTUxDb25zdGFudHMuVEFHX1RFUk0ubGVuZ3RoKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdpbiBEYXRhVmlldy5maWxsSW5uZXJFeGVjU3RhY2soKSBvdXQgb2YgYm91bmRzJyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2VhcmNoIGZvciB0aGUgaW52YWxpZGF0ZSBhdHRyaWJ1dGUgYW5kIGlmIGl0IGlzIHRydWUgdGhlbiBpdCBhbHNvIGNsZWFycyB0aGUgZGF0YXZpZXdcclxuICAvLy8gICBleGVjdXRlIHRoaXMgbWV0aG9kIEJFRk9SRSBwYXJzaW5nIHRoZSByZWNvcmRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRva2Vuc1ZlY3RvclwiPm9mIGFsbCBhdHRyaWJ1dGVzIGFuZCB2YWx1ZXM8L3BhcmFtPlxyXG4gIHByaXZhdGUgcGVla0ludmFsaWRhdGUodG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4pOiBib29sZWFuIHtcclxuICAgIGxldCBzZXNzaW9uQ291bnRlcjogbnVtYmVyID0gQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCkuR2V0U2Vzc2lvbkNvdW50ZXIoKTtcclxuXHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgIGxldCBhdHRyaWJ1dGUgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaik7XHJcbiAgICAgIGlmIChhdHRyaWJ1dGUgPT09IChDb25zdEludGVyZmFjZS5NR19BVFRSX0lOVkFMSURBVEUpKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlU3RyID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKTtcclxuXHJcbiAgICAgICAgaWYgKFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKSkge1xyXG5cclxuICAgICAgICAgIC8vIFFDUiAjMjg2MzogV2hlbiBleGVjdXRpbmcgUkVDVVJTSVZFIGNhbGxzIHRvIHRoZSBzZXJ2ZXIgdGhlcmUgd2VyZSBjYXNlc1xyXG4gICAgICAgICAgLy8gaW4gd2hpY2ggYW4gb2xkZXIgZGF0YXZpZXcgc3VwZXJzZWRzIGEgbmV3IG9uZSBiZWNhdXNlIGl0cyBwYXJzaW5nIGNvbWVzXHJcbiAgICAgICAgICAvLyBhZnRlciB0aGUgcGFyc2luZyBvZiB0aGUgbmV3IGRhdGF2aWV3LiBUaGUgc29sdXRpb24gaXMgdG8gc2tpcCB0aGVcclxuICAgICAgICAgIC8vIHBhcnNpbmcgb2YgdGhlIG9sZGVyIGRhdGF2aWV3IGlmIHRoZSBuZXdlciBkYXRhdmlldyBoYXMgaW52YWxpZGF0ZT10cnVlXHJcbiAgICAgICAgICBpZiAoc2Vzc2lvbkNvdW50ZXIgPCB0aGlzLl9sYXN0U2Vzc2lvbkNvdW50ZXIpXHJcbiAgICAgICAgICAgIHRoaXMuX3NraXBQYXJzaW5nID0gdHJ1ZTtcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0U2Vzc2lvbkNvdW50ZXIgPSBzZXNzaW9uQ291bnRlcjtcclxuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgZmllbGQgYnkgaXRzIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkTmFtZVwiPm9mIHRoZSBmaWVsZCA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gcmVxdWlyZWQgZmllbGQgKG9yIG51bGwgaWYgbm90IGZvdW5kKSA8L3JldHVybnM+XHJcbiAgZ2V0RmllbGRCeU5hbWUoZmxkTmFtZTogc3RyaW5nKTogRmllbGQge1xyXG5cclxuICAgIGlmICh0aGlzLl9maWVsZHNUYWIgIT09IG51bGwpXHJcbiAgICAgIHJldHVybiA8RmllbGQ+dGhpcy5fZmllbGRzVGFiLmdldEZpZWxkKGZsZE5hbWUpO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZygnaW4gRGF0YVZpZXcuZ2V0RmllbGQoU3RyaW5nKTogVGhlcmUgaXMgbm8gZmllbGRzVGFiIG9iamVjdCcpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIFhNTCBzdHJpbmcgZm9yIHRoZSBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZXNzYWdlXCI+dGhlIG1lc3NhZ2UgYnVmZmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHVibGljIGFzeW5jIGJ1aWxkWE1MKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkY3Y6IERjVmFsdWVzO1xyXG4gICAgbGV0IHRhc2tUYWc6IFN0cmluZyA9IHRoaXMuX3Rhc2suZ2V0VGFza1RhZygpO1xyXG4gICAgbGV0IGJya0xldmVsSW5kZXg6IG51bWJlciA9IHRoaXMuX3Rhc2suZ2V0QnJrTGV2ZWxJbmRleCgpO1xyXG4gICAgbGV0IGN1cnJSZWNEZWxldGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgc2VydmVyUGFyZW50OiBTdHJpbmc7XHJcblxyXG4gICAgbGV0IGNvbnRleHRUYXNrOiBUYXNrQmFzZSA9IDxUYXNrQmFzZT4odGhpcy5nZXRUYXNrKCkuR2V0Q29udGV4dFRhc2soKSk7XHJcbiAgICBsZXQgaW52b2tpbmdUYXNrVGFnOiBzdHJpbmcgPSBjb250ZXh0VGFzay5Jc09mZmxpbmUgPyBJTlZPS0VEX0ZST01fT0ZGTElORV9UQVNLIDogY29udGV4dFRhc2suZ2V0VGFza1RhZygpO1xyXG5cclxuICAgIC8vIHB1dCB0aGUgZGF0YXZpZXcgdGFnIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIG1vZGlmaWVkIHJlY29yZHMganVzdCB0byBsZXRcclxuICAgIC8vIHRoZSBzZXJ2ZXIga25vdyB0aGUgY3VycmVudCByZWNvcmRcclxuICAgIG1lc3NhZ2UuQXBwZW5kKCdcXG4gICAgICA8JyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVyArICcgJyArIFhNTENvbnN0YW50cy5NR19BVFRSX1RBU0tJRCArICc9XCInICtcclxuICAgICAgdGFza1RhZyArICdcIicpO1xyXG5cclxuICAgIC8vIFFDUiA0MjMwNjQgcHV0cyB0aGUgY3VycmVudCBleGVjdXRpbmcgaGFuZGxlciBpbmRleFxyXG4gICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UQVNLTEVWRUwgKyAnPVwiJyArIGJya0xldmVsSW5kZXggKyAnXCInKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgdHJpZ2dlciB0YXNrIGlzIGFuIE9mZmxpbmUgcHJvZ3JhbSwgdGhlIHBhcmVudCBvbiB0aGUgc2VydmVyIHNob3VsZCBiZVxyXG4gICAgLy8gdGhlIE1haW4gUHJvZ3JhbSBvZiB0aGUgY3VycmVudCBDVEwuXHJcbiAgICBzZXJ2ZXJQYXJlbnQgPSAnMCc7XHJcbiAgICBsZXQgdHJpZ2dlcmluZ1Rhc2s6IFRhc2tCYXNlID0gdGhpcy5nZXRUYXNrKCkuZ2V0VHJpZ2dlcmluZ1Rhc2soKTtcclxuICAgIGlmICh0cmlnZ2VyaW5nVGFzayAhPSBudWxsKSB7XHJcbiAgICAgIGlmICh0cmlnZ2VyaW5nVGFzay5Jc09mZmxpbmUpIHtcclxuICAgICAgICBsZXQgY3RsSWR4OiBudW1iZXIgPSB0cmlnZ2VyaW5nVGFzay5nZXRDdGxJZHgoKTtcclxuICAgICAgICBsZXQgbWFpblByZzogVGFza0Jhc2UgPSA8VGFza0Jhc2U+IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCBjdGxJZHgpO1xyXG4gICAgICAgIHNlcnZlclBhcmVudCA9IG1haW5QcmcuZ2V0VGFza1RhZygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBzZXJ2ZXJQYXJlbnQgPSB0cmlnZ2VyaW5nVGFzay5nZXRUYXNrVGFnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2N1cnJSZWNJZCA+IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgIGlmICh0aGlzLkN1cnJSZWMgIT0gbnVsbClcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0NVUlJfUkVDICsgJz1cIicgKyB0aGlzLl9jdXJyUmVjSWQgKyAnXCInKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UQVNLTU9ERSArICc9XCInICsgdGhpcy5fdGFzay5nZXRNb2RlKCkgKyAnXCInKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl90cmFuc0NsZWFyZWQgJiYgIShNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuSW5FbmRUYXNrICYmIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5DbG9zaW5nRm9ybVVJKSkge1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVFJBTlNfQ0xFQVJFRCArICc9XCIxXCInKTtcclxuICAgICAgICB0aGlzLl90cmFuc0NsZWFyZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUUNSIDc3OTk4MiBwdXRzIHRoZSBpbnZva2luZyBfdGFzayBpZCBhbmQgdGhlIGRpcmVjdCBwYXJlbnQgX3Rhc2sgaWRcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTlZPS0VSX0lEICsgJz1cIicgKyBpbnZva2luZ1Rhc2tUYWcgKyAnLCcgKyBzZXJ2ZXJQYXJlbnQgKyAnXCInKTtcclxuXHJcbi8vIHB1dCB0aGUgY3VycmVudCAoKERhdGFWaWV3KWRhdGFWaWV3KSBkdlBvcyB2YWx1ZVxyXG4gICAgICBpZiAoYXdhaXQgdGhpcy5nZXRUYXNrKCkuaXNDYWNoZWQoKSlcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0RWUE9TX1ZBTFVFICsgJz1cIicgKyB0aGlzLl9kdlBvc1ZhbHVlICsgJ1wiJyk7XHJcblxyXG4gICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0xPT1BfQ09VTlRFUiArICc9XCInICsgdGhpcy5nZXRUYXNrKCkuZ2V0TG9vcENvdW50ZXIoKSArICdcIicpO1xyXG5cclxuICAgICAgLy8gc2VuZCBzdWJmb3JtIHZpc2liaWxpdHkgb25seSBpZiB0aGUgc3ViZm9ybSB3aXRoIHByb3BlcnR5IFwiUmVmcmVzaFdoZW5IaWRkZW49TlwiIGFuZCBpdCBpcyBub3QgdmlzaWJsZSxcclxuICAgICAgLy8gaS5lLiBub3QgbmVlZGVkIHJlZnJlc2ggZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgIGlmICh0aGlzLl90YXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50aGlzLl90YXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICAgIGlmICghc3ViZm9ybUN0cmwuaXNWaXNpYmxlKCkgJiZcclxuICAgICAgICAgICEgYXdhaXQgc3ViZm9ybUN0cmwuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFRlJFU0hfV0hFTl9ISURERU4sIGZhbHNlKSlcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfU1VCRk9STV9WSVNJQkxFICsgJz1cIjBcIicpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMuX3Rhc2suSXNJbnRlcmFjdGl2ZSlcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tfQ09VTlRFUiArICc9XCInICsgdGhpcy5nZXRUYXNrKCkuZ2V0Q291bnRlcigpICsgJ1wiJyk7XHJcblxyXG4gICAgICAvLyBRQ1IjNTkxOTczOiBsYXN0UmVjaWQgYW5kIG9sZEZpcnN0UmVjSUQgc2hvdWxkIGJlIHNlbnQgYnkgY2xpZW50LlxyXG4gICAgICAvLyBJbiBjYXNlIG9mIG1vdXNlIHNjcm9sbGluZywgd2UgcGFyayBvbiB0aGUgc2FtZSByZWNvcmQgKGRvbid0IGxlYXZlIHRoZSBjdXJyZW50IHJlY29yZCkuIFNvIG9uIHNlcnZlciB3ZSBnZXQgY3VyciByZWNvcmQgb24gd2hpY2hcclxuICAgICAgLy8gd2Ugd2VyZSBwYXJrZWQgYmVmb3JlIHNjcm9sbGluZy4gU28gd2UgY2FuIG5vdCB1c2UgdGhpcyBpbmRleCB0byBmZXRjaCB0aGUgcmVjb3JkLlxyXG4gICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gc2VuZCB0aGUgbGFzdCBmZXRjaGVkIHJlY29yZCdzIGlkeCBmcm9tIGNsaWVudCBpbiBjYXNlIG9mIHNjcm9sbCBkb3duXHJcbiAgICAgIC8vIGFuZCBvbGRGaXJzdFJlY0lEIChmaXJzdCByZWNvcmQgb2YgbGFzdCBzZW50IGNodW5rKSBpbiBjYXNlIG9mIHNjcm9sbCB1cCwgZnJvbSB3aGljaCB3ZSBuZWVkIHRvIGZldGNoIHRoZSBjaHVuayBvZiByZWNvcmRzLlxyXG4gICAgICBpZiAodGhpcy5fdGFzayAhPSBudWxsICYmICB0aGlzLl90YXNrLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUFJFTE9BRF9WSUVXKS5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpKSB7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9MQVNUX1JFQ19JRCArICc9XCInICtcclxuICAgICAgICAgICh0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KHRoaXMuZ2V0U2l6ZSgpIC0gMSkuZ2V0SWQoKSkgKyAnXCInKTtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX09MRF9GSVJTVF9SRUNfSUQgKyAnPVwiJyArXHJcbiAgICAgICAgICB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KDApLmdldElkKCkgKyAnXCInKTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIC8vIHNlbmQgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgcmVjIGluIHRoZSBmb3JtcyB0YWJsZS5cclxuICAgICAgLy8gaXQgY2FuIGJlIHVzZWQgYnkgdGhlIHNlcnZlciB0byBrZWVwIHRoZSByZWNvcmQgaW4gdGhpcyBwb3NpdGlvbiBhZnRlciB0aGUgdmlldyByZWZyZXNoLlxyXG4gICAgICBpZiAodGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlKSB7XHJcbiAgICAgICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICAgaWYgKGZvcm0gIT0gbnVsbCAmJiB0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKSA+IDEpIHtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQ1VSUl9SRUNfUE9TX0lOX0ZPUk0gKyAnPVwiJyArXHJcbiAgICAgICAgICAgIGZvcm0uZ2V0Q3VyclJlY1Bvc0luRm9ybSgpICsgJ1wiJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG5cclxuICAgICAgLy8gQWRkIFVzZXIgUmFuZ2VzXHJcbiAgICAgIGlmICh0aGlzLmdldFRhc2soKS5SZXNldFJhbmdlIHx8IHRoaXMuZ2V0VGFzaygpLlVzZXJSbmdzICE9IG51bGwpIHtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuVVNFUl9SQU5HRVMpO1xyXG4gICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5SZXNldFJhbmdlKSB7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5DTEVBUl9SQU5HRSArICc9XCIxXCInKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLlJlc2V0UmFuZ2UgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLlVzZXJSbmdzICE9IG51bGwpIHtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLmJ1aWxkWE1MRm9yUm5ncyhtZXNzYWdlLCB0aGlzLmdldFRhc2soKS5Vc2VyUm5ncywgZmFsc2UpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuVXNlclJuZ3MuQ2xlYXIoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLlVzZXJSbmdzID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBBZGQgVXNlciBMb2NhdGVzXHJcbiAgICAgIGlmICh0aGlzLmdldFRhc2soKS5SZXNldExvY2F0ZSB8fCB0aGlzLmdldFRhc2soKS5Vc2VyTG9jcyAhPSBudWxsKSB7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIENvbnN0SW50ZXJmYWNlLlVTRVJfTE9DQVRFUyk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLlJlc2V0TG9jYXRlKSB7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5DTEVBUl9MT0NBVEVTICsgJz1cIjFcIicpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuUmVzZXRMb2NhdGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLlVzZXJMb2NzICE9IG51bGwpIHtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLmJ1aWxkWE1MRm9yUm5ncyhtZXNzYWdlLCB0aGlzLmdldFRhc2soKS5Vc2VyTG9jcywgdHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5Vc2VyTG9jcy5DbGVhcigpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuVXNlckxvY3MgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICAvLyBBZGQgVXNlciBTb3J0c1xyXG4gICAgICBpZiAodGhpcy5nZXRUYXNrKCkuUmVzZXRTb3J0IHx8IHRoaXMuZ2V0VGFzaygpLlVzZXJTb3J0cyAhPSBudWxsKSB7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19TT1JUUyk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLlJlc2V0U29ydCkge1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuQ0xFQVJfU09SVFMgKyAnPVwiMVwiJyk7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5SZXNldFNvcnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLlVzZXJTb3J0cyAhPSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuYnVpbGRYTUxGb3JTb3J0cyhtZXNzYWdlKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBzZW5kIGRlbGV0ZWQgY2FjaGUgZW50cmllc1xyXG4gICAgICBpZiAoYXdhaXQgdGhpcy5nZXRUYXNrKCkuaXNDYWNoZWQoKSkge1xyXG4gICAgICAgIGxldCBkZWxMaXN0OiBTdHJpbmcgPSB0aGlzLmdldFRhc2soKS5nZXRUYXNrQ2FjaGUoKS5nZXREZWxldGVkTGlzdFRvWE1MKCk7XHJcbiAgICAgICAgaWYgKGRlbExpc3QgIT09ICcnKSB7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RFTF9MSVNUKTtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIFhNTENvbnN0YW50cy5NR19BVFRSX0lEICsgJz1cIicgKyB0aGlzLl90YXNrLmdldFRhc2tUYWcoKSArICdcIicpO1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9SRU1PVkUgKyAnPVwiJyArIGRlbExpc3QgKyAnXCInKTtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcblxyXG4gICAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgYWN0aXZlIGRhdGF2aWV3IGlzIGluIHRoZSBkZWx0ZWRlIGxpc3QgbWFyayBpdCBhcyB1bi12YWxpZCBzb1xyXG4gICAgICAgICAgLy8gaXQgd29udCBlbnRlciB0aGUgY2FjaGUgb24gcmV0dXJuIGZyb20gc2VydmVyXHJcbiAgICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuZ2V0VGFza0NhY2hlKCkuaXNEZWxldGVkKHRoaXMuX2R2UG9zVmFsdWUpKVxyXG4gICAgICAgICAgICB0aGlzLnNldENoYW5nZWQodHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5nZXRUYXNrQ2FjaGUoKS5jbGVhckRlbGV0ZWRMaXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyByZW1vdmUgdW5uZWNlc3NhcnkgZGF0YSBjb250cm9sIHZhbHVlc1xyXG4gICAgICBsZXQgZGNWYWxLZXlzOiBzdHJpbmdbXSA9IHRoaXMuX2RjVmFsc0NvbGxlY3Rpb24uS2V5cztcclxuXHJcbiAgICAgIGRjVmFsS2V5cy5mb3JFYWNoKChkY1ZhbEtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgZGN2ID0gdGhpcy5fZGNWYWxzQ29sbGVjdGlvbi5nZXRfSXRlbShkY1ZhbEtleSk7XHJcblxyXG4gICAgICAgIGlmICghZGN2Lkhhc1JlZmVyZW5jZXMpIHtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5NR19UQUdfRENfVkFMUyk7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9JRCArICc9XCInICsgZGN2LmdldElkKCkgKyAnXCInKTtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUkVNT1ZFICsgJz1cIjFcIicpO1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuXHJcbiAgICAgICAgICB0aGlzLl9kY1ZhbHNDb2xsZWN0aW9uLlJlbW92ZShkY1ZhbEtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLkN1cnJSZWMgIT0gbnVsbClcclxuICAgICAgICBjdXJyUmVjRGVsZXRlZCA9ICh0aGlzLkN1cnJSZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlXHJcbiAgICAgICAgICAmJiB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuZ2V0UmVjb3JkKHRoaXMuQ3VyclJlYy5nZXRJZCgpKSAhPSBudWxsICYmIHRoaXMuQ3VyclJlYy5TZW5kVG9TZXJ2ZXIpO1xyXG5cclxuICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgdXNlciBldmVudCBiZWluZyBoYW5kbGVkIGhhcyBGb3JjZSBleGl0ID0gJ1ByZSBSZWNvcmQgVXBkYXRlJywgdGhlblxyXG4gICAgICAvLyBkbyBub3QgYWRkIGN1cnJlbnQgcmVjb3JkIHRvIHRoZSBtb2RpZmllZCByZWNvcmRzIGxpc3QuIFdlIGFueXdheSBzZW5kIGN1cnJlbnRcclxuICAgICAgLy8gcmVjb3JkIHNlcGFyYXRlbHkuXHJcbiAgICAgIGxldCBza2lwQ3VyclJlYzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKHRoaXMuQ3VyclJlYyAhPSBudWxsICYmIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5nZXRSZWNvcmQodGhpcy5DdXJyUmVjLmdldElkKCkpICE9IG51bGwpXHJcbiAgICAgICAgc2tpcEN1cnJSZWMgPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5pc0ZvcmNlRXhpdFByZVJlY29yZFVwZGF0ZSh0aGlzLmdldFRhc2soKSk7XHJcblxyXG4gICAgICB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuYnVpbGRYTUwoIG1lc3NhZ2UsIHNraXBDdXJyUmVjLCB0aGlzLkN1cnJSZWMuZ2V0SWQoKSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fb3JpZ2luYWwgIT0gbnVsbClcclxuICAgICAgICB0aGlzLl9vcmlnaW5hbC5jbGVhck1vZGUoKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5nZXRTaXplKCkgLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIGlmIChza2lwQ3VyclJlYyAmJiB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuZ2V0UmVjQnlJZHgoaSkuZ2V0SWQoKSA9PT0gdGhpcy5DdXJyUmVjLmdldElkKCkpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmdldFJlY0J5SWR4KGkpLmNsZWFyRmxhZ3NIaXN0b3J5KCk7XHJcbiAgICAgICAgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLnJlbW92ZVJlY29yZChpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuQ3VyclJlYyAhPSBudWxsICYmICFjdXJyUmVjRGVsZXRlZCkge1xyXG5cclxuICAgICAgICAvLyBXaGVuIHdlIHJlY29ubmVjdCB0byB0aGUgc2VydmVyIG9uY2UgaXQgaXMgZGlzY29ubmVjdGVkLCBzZXJ2ZXIgd2lsbCBjcmVhdGUgYSBuZXcgY29udGV4dCBhbmRcclxuICAgICAgICAvLyB0aGVyZWZvcmUgTVAgdmFyaWFibGVzIGFyZSB3aXRoIHRoZWlyIGludGlhbCAoZW1wdHkpIHZhbHVlIGFuZCBub3Qgd2l0aCB0aGVpciByZWFsIHZhbHVlcy5cclxuICAgICAgICAvLyBTbywgd2UgbXVzdCBhbHdheXMgc2VuZCBNYWluIHByb2dyYW0ncyBmaWVsZCdzIGxhdGVzdCAgdmFsdWVzIHRvIHRoZSBzZXJ2ZXIuXHJcbiAgICAgICAgbGV0IGZvcmNlQnVpbGQ6IGJvb2xlYW4gPSAodGhpcy5fdGFzay5pc01haW5Qcm9nKCkgJiYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLklzU2Vzc2lvblJlSW5pdGlhbGl6aW5nKSk7XHJcbiAgICAgICAgdGhpcy5DdXJyUmVjLmJ1aWxkWE1MKG1lc3NhZ2UsIHRydWUsIGZvcmNlQnVpbGQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSIDc3OTk4MiBpZiB3ZSBoYXZlIG1haW4gcHJvZyB3aXRoIG5vIHNlbGVjdCdzIHNlbmQgdGhlIGludm9rZXIgYW5kIHBhcmVudCBfdGFza1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5WT0tFUl9JRCArICc9XCInICsgaW52b2tpbmdUYXNrVGFnICsgJywnICsgc2VydmVyUGFyZW50ICsgJ1wiJyArXHJcbiAgICAgICAgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICB9XHJcbiAgICBtZXNzYWdlLkFwcGVuZCgnXFxuICAgICAgPC8nICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBSZWNvcmQgaXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCByZWNvcmQgPC9yZXR1cm5zPlxyXG4gIGdldEN1cnJSZWMoKTogUmVjb3JkIHtcclxuICAgIGlmICh0aGlzLkN1cnJSZWMgPT09IG51bGwgJiYgdGhpcy5fY3VyclJlY0lkID4gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coJ0RhdGFWaWV3LmdldEN1cnJSZWMoKTogcmVjb3JkICcgKyB0aGlzLl9jdXJyUmVjSWQgKyAnIG5vdCBmb3VuZCcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuQ3VyclJlYztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIHByZXZpb3VzIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFJlY29yZCBpcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyBjdXJyZW50IHJlY29yZCA8L3JldHVybnM+XHJcbiAgZ2V0UHJldkN1cnJSZWMoKTogUmVjb3JkIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2Q3VyclJlYztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBSZWNvcmQgaXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgcmVjb3JkXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBnZXRPcmlnaW5hbFJlYygpOiBSZWNvcmQge1xyXG5cclxuICAgIGlmICh0aGlzLl9vcmlnaW5hbCA9PT0gbnVsbCB8fCB0aGlzLl9vcmlnaW5hbC5nZXRJZCgpICE9PSB0aGlzLkN1cnJSZWMuZ2V0SWQoKSlcclxuICAgICAgcmV0dXJuIHRoaXMuQ3VyclJlYztcclxuICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGN1cnJlbnQgcmVjb3JkIC0gcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWRcIj50aGUgcmVjb3JkIGlkXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb21wdXRlXCI+aWYgdHJ1ZSB0aGVuIGV4ZWN1dGUgY29tcHV0ZSBmb3IgdGhlIG5ldyByZWNvcmRcclxuICAvLy8gPC9wYXJhbT5cclxuICBhc3luYyBzZXRDdXJyUmVjKGlkOiBudW1iZXIsIGNvbXB1dGU6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBvbGRSZWNJZDogbnVtYmVyID0gdGhpcy5fY3VyclJlY0lkO1xyXG4gICAgaWYgKGlkID4gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgbGV0IG5ld0lkeDogbnVtYmVyID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNJZHgoaWQpO1xyXG5cclxuICAgICAgaWYgKG5ld0lkeCA9PT0gLTEpXHJcbiAgICAgICAgdGhpcy5fb3JpZ2luYWwgPSBudWxsO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgbGV0IGlnbm9yZUN1cnJSZWM6IGJvb2xlYW4gPSB0aGlzLl9jdXJyUmVjSWQgPT09IEludDMyLk1pblZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgobmV3SWR4LCAhaWdub3JlQ3VyclJlYywgaWdub3JlQ3VyclJlYywgY29tcHV0ZSwgSW50MzIuTWluVmFsdWUpO1xyXG4gICAgICAgICAgaWYgKGlkICE9PSBvbGRSZWNJZClcclxuICAgICAgICAgICAgdGhpcy5zYXZlT3JpZ2luYWwoKTtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBleGNlcHRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gZG8gbm90IHBvaW50IHRvIGFueSBjdXJyZW50IHJlY29yZFxyXG4gICAgICB0aGlzLkN1cnJSZWMgPSBudWxsO1xyXG4gICAgICB0aGlzLl9vcmlnaW5hbCA9IG51bGw7XHJcbiAgICAgIHRoaXMuX2N1cnJSZWNJZCA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFNldCB0aGUgY3VycmVudCByZWNvcmQgaW5kZXggYW5kIHJldHVybnMgdHJ1ZSBmb3Igc3VjY2Vzc1xyXG4gIC8vLyAgIFVzZSB0aGUgTUdfREFUQVZJRVdfRklSU1RfUkVDT1JEIGFuZCBNR19EQVRBVklFV19MQVNUX1JFQ09SRCBjb25zdGFudHNcclxuICAvLy8gICB0byByZXRyaWV2ZSB0aGUgZmlyc3Qgb3IgdGhlIGxhc3QgcmVjb3JkIHJlc3BlY3RpdmVseVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdJZHhcIj50aGUgbmV3IGluZGV4IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkb1N1ZmZpeFwiPmlmIHRydWUgdGhlbiBkbyB0aGUgcmVjb3JkIHN1ZmZpeCBmb3IgdGhlIHByZXZpb3VzIHJlY29yZCB3aGVuIHRoZSByZWNvcmQgd2FzIGNoYW5nZWQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlnbm9yZUN1cnJSZWNcIj5pZiB0cnVlIGFsbCB0aGUgb3BlcmF0aW9ucyBhcmUgZG9uZSBpcyBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHJlY29yZCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29tcHV0ZVwiPmlmIHRydWUgdGhlbiBleGVjdXRlIGNvbXB1dGUgZm9yIHRoZSBuZXcgcmVjb3JkIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdEaXNwbGF5TGluZVwiPnRvIHVwZGF0ZSBmb3JtIDwvcGFyYW0+XHJcbiAgYXN5bmMgc2V0Q3VyclJlY0J5SWR4KG5ld0lkeDogbnVtYmVyLCBkb1N1ZmZpeDogYm9vbGVhbiwgaWdub3JlQ3VyclJlYzogYm9vbGVhbiwgY29tcHV0ZTogYm9vbGVhbiwgbmV3RGlzcGxheUxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGxhc3RSZWNJZHg6IG51bWJlciA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpIC0gMTtcclxuICAgIGxldCBvbGRGaXJzdFJlYzogUmVjb3JkLCBuZXh0UmVjOiBSZWNvcmQ7XHJcblxyXG4gICAgLy8gUUNSICM5ODQ5NjA6IHRoZSB2YXJpYWJsZSByZWNvcmRTdWZmIGlzIHVzZWQgdG8gcmVjb2duaXplIGlmIHdlIGhhdmUgcHJlc3NlZFxyXG4gICAgLy8gY3RybCtob21lIG9yIGN0cmwrZW5kIGluIHRoZXNlIGNhc2VzIHdlIG11c3QgaW5pdGlhdGUgcmVjb3JkIHN1ZmZpeFxyXG4gICAgLy8gdGhlIGNvcnJlY3Qgd2F5IHRvIGRvIHRoaXMgaXMgdXNpbmcgdGhlIGRvU3VmZml4IHBhcmFtZXRlciBidXQgc2luY2UgaXQgaXMgdXNlZFxyXG4gICAgLy8gaW4gYSBsb3Qgb2YgY2FzZXMgc29tZXRpbWUgbm90IGluIGEgY29ycmVjdCB3YXksIGZvcmNpbmcgcmVjb3JkIHN1ZmZpeFxyXG4gICAgLy8gdXNpbmcgZG9TdWZmaXggd2lsbCBjYXVzZSBtYW55IGNoYW5nZXMgaW4gdGhlIGNvZGUuXHJcbiAgICBsZXQgcmVjb3JkU3VmZjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChuZXdJZHggPT09IENvbnN0YW50cy5NR19EQVRBVklFV19GSVJTVF9SRUNPUkQpIHtcclxuXHJcbiAgICAgIC8vIEFzIG1vdmluZyB0byBmaXJzdCByZWNvcmQgaW4gdGhlIHZpZXcsIHJlY29yZHNCZWZvcmVDdXJyZW50VmlldyBzaG91bGQgYmUgMC5cclxuICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLmlzVGFibGVXaXRoQWJzb2x1dGVzU2Nyb2xsYmFyKCkpIHtcclxuICAgICAgICB0aGlzLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA9IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl9pbmNsdWRlc0ZpcnN0KSB7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIGFscmVhZHkgdGhlIGZpcnN0IHJlY29yZCBvZiB0aGUgZGF0YSB2aWV3XHJcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJSZWNJZHggPj0gMCB8fCB0aGlzLl9jdXJyUmVjSWR4ID09PSBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICAgICAgbmV3SWR4ID0gMDtcclxuXHJcbiAgICAgICAgICAvLyBjdHJsK2hvbWUgd2FzZSBwcmVzc2VkXHJcbiAgICAgICAgICByZWNvcmRTdWZmID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgbmV3IFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24oUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbl9FeGNlcHRpb25UeXBlLlRPUCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaENodW5rRnJvbVNlcnZlcihDSFVOS19EVl9UT1AsIGRvU3VmZml4KTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChuZXdJZHgsIGZhbHNlLCBpZ25vcmVDdXJyUmVjLCBjb21wdXRlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobmV3SWR4ID09PSBDb25zdGFudHMuTUdfREFUQVZJRVdfTEFTVF9SRUNPUkQpIHtcclxuICAgICAgaWYgKHRoaXMuX2luY2x1ZGVzTGFzdCkge1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjdXJyZW50IHJlY29yZCBpcyBhbHJlYWR5IHRoZSBsYXN0IHJlY29yZCBvZiB0aGUgZGF0YSB2aWV3XHJcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJSZWNJZHggPD0gbGFzdFJlY0lkeCkge1xyXG4gICAgICAgICAgbmV3SWR4ID0gbGFzdFJlY0lkeDtcclxuICAgICAgICAgIC8vIGN0cmwrZW5kIHdhcyBwcmVzc2VkXHJcbiAgICAgICAgICByZWNvcmRTdWZmID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB0aHJvdyBuZXcgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbihSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uX0V4Y2VwdGlvblR5cGUuQk9UVE9NKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBJZiBsYXN0IHJlY29yZCBpcyBub3QgaW4gdGhlIHZpZXcsIGFuZCBiZWluZyBmZXRjaGVkIGZyb20gdGhlIHNlcnZlciwgUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID0gVG90YWxSZWNvcmRzQ291bnQuIEFuZCBhcyB0aGlzIGNodW5rIGdldCBhZGRlZFxyXG4gICAgICAgIC8vIGludG8gcmVjb3JkcyB0YWJsZSwgdGhlIFJlY29yZHNCZWZvcmVDdXJyZW50VmlldyB3aWxsIGJlIGRlY3JlbWVudGVkIGJ5IG5vIG9mIHJvd3MgaW4gdmlldy5cclxuICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2UsIHdlIG9wZW4gdGhlIGN1cnNvciB3aXRoIHJldmVyc2UgZGlyZWN0aW9uIGZvciB3aGljaCBkbyBub3QgYnJpbmcgdGhlIGNvdW50cyBmcm9tIGdhdGV3YXkuXHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLmlzVGFibGVXaXRoQWJzb2x1dGVzU2Nyb2xsYmFyKCkpXHJcbiAgICAgICAgICB0aGlzLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA9IHRoaXMuVG90YWxSZWNvcmRzQ291bnQ7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoQ0hVTktfRFZfQk9UVE9NLCBkb1N1ZmZpeCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5faW5jbHVkZXNMYXN0KVxyXG4gICAgICAgICAgdGhyb3cgbmV3IFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24oUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbl9FeGNlcHRpb25UeXBlLkJPVFRPTSk7XHJcblxyXG4gICAgICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICAgIGlmIChmb3JtICE9IG51bGwpIHtcclxuICAgICAgICAgIHdoaWxlICghdGhpcy5faW5jbHVkZXNGaXJzdCAmJiBmb3JtLmdldFJvd3NJblBhZ2UoKSA+PSB0aGlzLmdldFNpemUoKSkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmZldGNoQ2h1bmtGcm9tU2VydmVyKENIVU5LX0NBQ0hFX1BSRVYsIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgobmV3SWR4LCBmYWxzZSwgaWdub3JlQ3VyclJlYywgY29tcHV0ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHJlY29yZCB3YXMgbm90IGZvdW5kIGJleW9uZCB0aGUgVE9QIGVuZFxyXG4gICAgZWxzZSBpZiAobmV3SWR4IDwgMCkge1xyXG4gICAgICBpZiAodGhpcy5faW5jbHVkZXNGaXJzdClcclxuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbihSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uX0V4Y2VwdGlvblR5cGUuVE9QKTtcclxuXHJcbiAgICAgIG9sZEZpcnN0UmVjID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCgwKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKSA+IDAgfHwgdGhpcy5JbmNsdWRlc0xhc3QoKSlcclxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoQ2h1bmtGcm9tU2VydmVyKENIVU5LX0NBQ0hFX1BSRVYsIGRvU3VmZml4KTtcclxuICAgICAgLy8gaWYgbm8gcmVjb3JkcyBhbmQgaXRzIGZpcnN0IHNpbXVsYXRlIHN0YXJ0IHRhYmxlXHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpID09PSAwICYmIHRoaXMuSW5jbHVkZXNGaXJzdCgpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoQ0hVTktfRFZfVE9QLCBkb1N1ZmZpeCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coJ2luIERhdGFWaWV3LmZldGNoQ2h1bmtGcm9tU2VydmVyKCkgd3Jvbmcgb3B0aW9uJyk7XHJcblxyXG4gICAgICAvLyBnZXQgdGhlIG5ldyBpbmRleCBvZiB0aGUgcmVjb3JkIHdoaWNoIHdhcyBmaXJzdCBiZWZvcmUgdGhlIGZldGNoXHJcbiAgICAgIGxldCBvbGRGaXJzdE5ld0lkeDogbnVtYmVyID0gb2xkRmlyc3RSZWMgIT0gbnVsbFxyXG4gICAgICAgID8gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNJZHgob2xkRmlyc3RSZWMuZ2V0SWQoKSlcclxuICAgICAgICA6IHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpO1xyXG4gICAgICBpZiAob2xkRmlyc3ROZXdJZHggIT09IDApXHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgob2xkRmlyc3ROZXdJZHggKyBuZXdJZHgsIGZhbHNlLCBpZ25vcmVDdXJyUmVjLCBjb21wdXRlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSByZWNvcmQgd2FzIG5vdCBmb3VuZCBiZXlvbmQgdGhlIEJPVFRPTSBlbmRcclxuICAgIGVsc2UgaWYgKG5ld0lkeCA+IGxhc3RSZWNJZHgpIHtcclxuICAgICAgaWYgKHRoaXMuX2luY2x1ZGVzTGFzdClcclxuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbihSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uX0V4Y2VwdGlvblR5cGUuQk9UVE9NKTtcclxuICAgICAgLy90aGUgcm93IGlzIGFjdHVhbGx5IG5vdCBjcmVhdGVkIHlldCBpbiBVSSwgaXQgd2lsbCBiZSBjcmVhdGVkIG9ubHkgYWZ0ZXIgd2UgYnJpbmcgdGhlIG5ldyBjaHVua1xyXG4gICAgICBpZiAodGhpcy5nZXRGb3JtKCkuaXNSb3dDcmVhdGVkKG5ld0lkeCkpXHJcbiAgICAgICAgdGhpcy5nZXRGb3JtKCkubWFya1Jvd05PVENyZWF0ZWQobmV3SWR4KTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoQ0hVTktfQ0FDSEVfTkVYVCwgZG9TdWZmaXgpO1xyXG4gICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChuZXdJZHgsIGZhbHNlLCBpZ25vcmVDdXJyUmVjLCBjb21wdXRlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0ICBpc0NyZWF0ZUxpbmVBYm92ZUFjdCA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBsYXN0RXZlbnQgOiBudW1iZXIgPSBpc051bGxPclVuZGVmaW5lZChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpKSA/IDAgOlxyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpLmdldEludGVybmFsQ29kZSgpO1xyXG5cclxuICAgIGlmIChuZXdJZHggPj0gMCAmJiAhdGhpcy5nZXRUYXNrKCkudHJhbnNhY3Rpb25GYWlsZWQoQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkgJiZcclxuICAgIGxhc3RFdmVudCA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkVfQUJPVkUpIHtcclxuICAgICAgaWYgKCgoPFRhc2s+dGhpcy5nZXRUYXNrKCkpLmdldEluQ3JlYXRlTGluZSgpKSAmJiBuZXdJZHggPT0gdGhpcy5fY3VyclJlY0lkeCkge1xyXG4gICAgICAgIGxldCBuZXdSZWM6IFJlY29yZCA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgobmV3SWR4KTtcclxuICAgICAgICBpZiAobmV3UmVjLmdldE1vZGUoKSA9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICAgICAgaXNDcmVhdGVMaW5lQWJvdmVBY3QgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSICMgOTg0OTYwIC0gc2VlIGRvY3VtZW50YXRpb24gZm9yIHRoZSB2YXJpYWJsZSByZWNvcmRTdWZmIGluIHRoZSB0b3Agb2YgdGhpcyBtZXRob2RcclxuICAgIGlmIChyZWNvcmRTdWZmIHx8IGlzQ3JlYXRlTGluZUFib3ZlQWN0IHx8IG5ld0lkeCAhPT0gdGhpcy5fY3VyclJlY0lkeCB8fCBpZ25vcmVDdXJyUmVjICYmIGNvbXB1dGUpIHtcclxuICAgICAgaWYgKCFpZ25vcmVDdXJyUmVjICYmIGRvU3VmZml4ICYmIHRoaXMuQ3VyclJlYyAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IG9sZFJlY1RhYlNpemU6IG51bWJlciA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgICBuZXh0UmVjID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeChuZXdJZHgpO1xyXG4gICAgICAgIGlmIChuZXh0UmVjLmlzTmV3UmVjKCkpIHtcclxuICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiZcclxuICAgICAgICAgICAgIWF3YWl0IHRoaXMuX3Rhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSwgdHJ1ZSkpXHJcbiAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgIGxldCBvcmdUb3BSZWNJZHg6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICBpZiAodGhpcy5fdG9wUmVjSWR4TW9kaWZpZWQpIHtcclxuICAgICAgICAgICAgb3JnVG9wUmVjSWR4ID0gdGhpcy5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgdGhpcy5yZXN0b3JlVG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3RvcFJlY0lkeE1vZGlmaWVkKVxyXG4gICAgICAgICAgICB0aGlzLnNldFRvcFJlY0lkeChvcmdUb3BSZWNJZHgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb25fRXhjZXB0aW9uVHlwZS5SRUNfU1VGRklYX0ZBSUxFRCk7XHJcblxyXG4gICAgICAgIC8vIFFDUiAjMjA0Njogd2hlbiB0aGUgbmV4dCByZWNvcmQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGN1cnJlbnQgb25lIHdlIHNob3VsZFxyXG4gICAgICAgIC8vIGFsbG93IHRoZSBleGVjdXRpb24gb2YgdGhlIHJlY29yZCBwcmVmaXggYnkgc2V0dGluZyB0aGUgX3Rhc2sgbGV2ZWwgdG8gVEFTSy5cclxuICAgICAgICBpZiAobmV4dFJlYyAhPT0gdGhpcy5DdXJyUmVjICYmIHRoaXMuZ2V0VGFzaygpLmdldEFmdGVyUmV0cnkoKSlcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcblxyXG4gICAgICAgIC8vIGlmIHRoZSByZWNvcmRzIHRhYmxlIHNpemUgd2FzIGRlY3JlYXNlZCBkdXJpbmcgaGFuZGxpbmcgdGhlXHJcbiAgICAgICAgLy8gcmVjb3JkIHN1ZmZpeCAoZS5nLiBjYW5jZWwgZWRpdCkgYW5kIHRoZSB1c2VyIHRyaWVzIHRvIG1vdmUgdG9cclxuICAgICAgICAvLyBhIHJlY29yZCB3aXRoIGEgaGlnaGVyIGluZGV4IHRoZW4gd2Ugc2hvdWxkIGFsc28gZGVjcmVhc2UgdGhlXHJcbiAgICAgICAgLy8gbmV3SWR4IHRvIHJlZmxlY3QgdGhlIGNoYW5nZVxyXG4gICAgICAgIGlmIChvbGRSZWNUYWJTaXplIC0gMSA9PT0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgJiYgdGhpcy5fY3VyclJlY0lkeCA8IG5ld0lkeClcclxuICAgICAgICAgIG5ld0lkeC0tO1xyXG5cclxuICAgICAgICAvLyB0aGUgbmV3IGN1cnIgcmVjIG1heSBiZSBhbHJlYWR5IHNldCBieSB0aGUgZXZlbnRzIGNoYWluIHRyaWdnZXJlZCBieSB0aGVcclxuICAgICAgICAvLyByZWNvcmQgc3VmZml4IGFib3ZlIC0gaW4gdGhhdCBjYXNlIHRoZXJlIGlzIG5vIG5lZWQgdG8gY29udGludWVcclxuICAgICAgICBpZiAobmV3SWR4ID09PSB0aGlzLl9jdXJyUmVjSWR4KSB7XHJcblxyXG4gICAgICAgICAgLy8gUUNSIDkxODk4MyBjaGFuZ2VzIHRvIHRoZSBfdGFzayBtb2RlIG11c3QgYmUgZG9uZSBiZWZvcmUgcmVjb21wdXRlXHJcbiAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICF0aGlzLkN1cnJSZWMuaXNOZXdSZWMoKSAmJlxyXG4gICAgICAgICAgICAhdGhpcy5fdGFzay5nZXRGb3JtKCkuaW5SZWZyZXNoRGlzcGxheSgpKVxyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLkN1cnJSZWMgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KG5ld0lkeCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5DdXJyUmVjID09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKCdpbiBEYXRhVmlldy5zZXRDdXJyUmVjQnlJZHgoKSBjdXJyZW50IHJlY29yZCBub3QgZm91bmQhJyk7XHJcblxyXG4gICAgICB0aGlzLl9jdXJyUmVjSWQgPSB0aGlzLkN1cnJSZWMuZ2V0SWQoKTtcclxuICAgICAgdGhpcy5fY3VyclJlY0lkeCA9IG5ld0lkeDtcclxuXHJcbiAgICAgIGlmICh0aGlzLl90YXNrLmdldEZvcm0oKSAhPSBudWxsKSB7XHJcblxyXG4gICAgICAgIC8vIFFDUiAjMTA3OTI2LCB3ZSBtdXN0IHVwZGF0ZSBkaXNwbGF5IGxpbmUgaGVyZSwgc2luY2UgY3VyclJlY0NvbXB1dGUgd2hpY2ggaXMgYWN0aXZhdGVkIGxhdGVyXHJcbiAgICAgICAgLy8gbWF5IGdvIHRvIHNlcnZlciBhbmQgY2F1c2UgcmVmcmVzaCBkaXNwbGF5LlxyXG4gICAgICAgIC8vIEluIGNhc2Ugb2YgYWRkaW5nIG5ldyBub2RlIHRvIHRoZSB0cmVlLCB0aGUgbm9kZSBtdXN0IGJlIGFjdHVhbGx5IGFkZGVkIHRvIHRoZSB0cmVlLlxyXG4gICAgICAgIGlmIChuZXdEaXNwbGF5TGluZSA9PT0gU0VUX0RJU1BMQVlMSU5FX0JZX0RWKSB7XHJcbiAgICAgICAgICAoPE1nRm9ybT4odGhpcy5fdGFzay5nZXRGb3JtKCkpKS51cGRhdGVEaXNwbGF5TGluZUJ5RFYoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5fdGFzay5nZXRGb3JtKCkuRGlzcGxheUxpbmUgPSBuZXdEaXNwbGF5TGluZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBRQ1IgOTE4OTgzIGNoYW5nZXMgdG8gdGhlIF90YXNrIG1vZGUgbXVzdCBiZSBkb25lIGJlZm9yZSByZWNvbXB1dGVcclxuICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiAhdGhpcy5DdXJyUmVjLmlzTmV3UmVjKCkgJiZcclxuICAgICAgICAhdGhpcy5fdGFzay5nZXRGb3JtKCkuaW5SZWZyZXNoRGlzcGxheSgpKVxyXG4gICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcblxyXG4gICAgICBpZiAoY29tcHV0ZSlcclxuICAgICAgICBhd2FpdCB0aGlzLmN1cnJSZWNDb21wdXRlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWNvbXB1dGUgQUxMIHRoZSBpbml0IGV4cHJlc3Npb25zIG9mIHRoZSBjdXJyZW50IHJlY29yZCAtIGNhbGwgdGhpcyBtZXRob2Qgd2hlblxyXG4gIC8vLyAgIGVudGVyaW5nIGEgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcmNlQ2xpZW50Q29tcHV0ZVwiPmlmIFRSVUUgZm9yY2VzIHRoZSBjbGllbnQgdG8gY29tcHV0ZSB0aGUgcmVjb3JkIGV2ZW4gaWYgaXQgaXMgZmxhZ2dlZFxyXG4gIC8vLyAgIGFzIFwic2VydmVyIGNvbXB1dGVkXCIuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgYXN5bmMgY3VyclJlY0NvbXB1dGUoZm9yY2VDbGllbnRDb21wdXRlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuaW52YWxpZGF0ZShmYWxzZSwgdHJ1ZSk7XHJcbiAgICBhd2FpdCB0aGlzLmNvbXB1dGUoZmFsc2UsIGZvcmNlQ2xpZW50Q29tcHV0ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2F2ZXMgYSByZXBsaWNhdGlvbiBvZiB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNhdmVPcmlnaW5hbCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5DdXJyUmVjLk1vZGlmaWVkKVxyXG4gICAgICB0aGlzLl9vcmlnaW5hbCA9IHRoaXMuQ3VyclJlYy5yZXBsaWNhdGUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmZXRjaCBhIGNodW5rIG9mIHJlY29yZHMgZnJvbSB0aGUgc2VydmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgcHVibGljIGFzeW5jIGZldGNoQ2h1bmtGcm9tU2VydmVyKGNodW5rSWQ6IHN0cmluZywgZG9TdWZmaXg6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICAvLyBRQ1IgIzQzMDEzNDogaWYgdGhlIHNlcnZlciBzZW50IHVzIHJlY29yZHMgZmV3ZXIgdGhhbiB0aGUgbnVtYmVyIHRoYXQgZml0cyBpbnRvIGEgdGFibGVcclxuICAgIC8vIHRoZW4gd2UgZ28gYmFjayB0byB0aGUgc2VydmVyIGFuZCBtdXN0IHJlZnJlc2ggdGhlIHNjcmVlbi5cclxuICAgICg8TWdGb3JtPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpKS5Gb3JtUmVmcmVzaGVkID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAoZG9TdWZmaXggJiYgdGhpcy5DdXJyUmVjICE9IG51bGwpIHtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgdGhpcy5fdGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24oUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbl9FeGNlcHRpb25UeXBlLlJFQ19TVUZGSVhfRkFJTEVEKTtcclxuICAgICAgKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLnNldFN1ZmZpeERvbmUoKTsgLy8gUUNSIDc1ODYzOVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBldmVudENvZGU6IG51bWJlcjtcclxuICAgIGxldCBjbGllbnRSZWNJZDogbnVtYmVyID0gdGhpcy5fY3VyclJlY0lkO1xyXG4gICAgc3dpdGNoIChjaHVua0lkKSB7XHJcbiAgICAgIGNhc2UgQ0hVTktfRFZfVE9QOlxyXG4gICAgICAgIGV2ZW50Q29kZSA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9EQVRBVklFV19UT1A7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ0hVTktfRFZfQk9UVE9NOlxyXG4gICAgICAgIGV2ZW50Q29kZSA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9EQVRBVklFV19CT1RUT007XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ0hVTktfQ0FDSEVfUFJFVjpcclxuICAgICAgICBjbGllbnRSZWNJZCA9IHRoaXMuRmlyc3RSZWNvcmQgPT0gbnVsbCA/IDAgOiB0aGlzLkZpcnN0UmVjb3JkLmdldElkKCk7XHJcbiAgICAgICAgZXZlbnRDb2RlID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBQ0hFX1BSRVY7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ0hVTktfQ0FDSEVfTkVYVDpcclxuICAgICAgICBldmVudENvZGUgPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FDSEVfTkVYVDtcclxuICAgICAgICBjbGllbnRSZWNJZCA9IHRoaXMuTGFzdFJlY29yZCA9PSBudWxsID8gMCA6IHRoaXMuTGFzdFJlY29yZC5nZXRJZCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZygnaW4gRGF0YVZpZXcuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoKSB1bmtub3duIGNodW5rIGlkOiAnICsgY2h1bmtJZCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGNtZDogRXZlbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKHRoaXMuX3Rhc2suZ2V0VGFza1RhZygpLCBldmVudENvZGUpO1xyXG4gICAgY21kLkNsaWVudFJlY0lkID0gY2xpZW50UmVjSWQ7XHJcbiAgICBhd2FpdCB0aGlzLmdldFRhc2soKS5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShjbWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZldGNoZXMgdGhlIGNodW5rIGZyb20gc2VydmVyLFxyXG4gIC8vLyAgIElmIHRoZSBsYXN0IHJlY29yZHMgaXMgbm90IHlldCBmZXRjaGVkIGl0IGZldGNoZXMgdGhlIG5leHQgY2h1bmssXHJcbiAgLy8vICAgRWxzZSwgZmV0Y2hlcyB0aGUgcHJldmlvdXMgY2h1bmtcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIEZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5faW5jbHVkZXNMYXN0KVxyXG4gICAgICBhd2FpdCB0aGlzLmZldGNoQ2h1bmtGcm9tU2VydmVyKENIVU5LX0NBQ0hFX05FWFQsIGZhbHNlKTtcclxuICAgIGVsc2UgaWYgKCF0aGlzLl9pbmNsdWRlc0ZpcnN0KVxyXG4gICAgICBhd2FpdCB0aGlzLmZldGNoQ2h1bmtGcm9tU2VydmVyKENIVU5LX0NBQ0hFX1BSRVYsIGZhbHNlKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIGEgcmVjb3JkIHdpdGggdGhlIGdpdmVuIGluZGV4IGV4aXN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY0lkeFwiPmluZGV4IHRvIGNoZWNrIDwvcGFyYW0+XHJcbiAgcmVjRXhpc3RzKHJlY0lkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgbGFzdFJlY0lkeDogbnVtYmVyID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgLSAxO1xyXG4gICAgcmV0dXJuIHJlY0lkeCA+PSAwICYmIHJlY0lkeCA8PSBsYXN0UmVjSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrcyBpZiB0aGUgaWYgdGhlIGN1cnJlbnQgZmlyc3QgcmVjb3JkIGV4aXN0XHJcbiAgLy8vICAgaW4gY2FzZSB0aGVyZSBpcyBubyBsb2NhdGUgY2hlY2sgaW5jbHVkZSBmaXJzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2hlY2tGaXJzdChsb2NhdGVGaXJzdDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNvcmQobG9jYXRlRmlyc3QpICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgY3VycmVudCByZWNvcmQgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHJlY29yZCBpbmRleCA8L3JldHVybnM+XHJcbiAgZ2V0Q3VyclJlY0lkeCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuX2N1cnJSZWNJZHggPT09IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgIGlmICghdGhpcy5zZXRDdXJyUmVjKHRoaXMuX2N1cnJSZWNJZCwgdHJ1ZSkpIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVXYXJuaW5nVG9Mb2dXaXRoTXNnKCdEYXRhVmlldy5nZXRDdXJyUmVjSWR4KCk6IF90YXNrICcgK1xyXG4gICAgICAgICAgKHRoaXMuZ2V0VGFzaygpKS5QcmV2aW91c2x5QWN0aXZlVGFza0lkICtcclxuICAgICAgICAgICcsIHJlY29yZCAnICsgdGhpcy5fY3VyclJlY0lkICsgJyBub3QgZm91bmQnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJSZWNJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0aGUgZGJ2aWV3cm93aWQgZm9yIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q3VyckRCVmlld1Jvd0lkeCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuQ3VyclJlYy5nZXREQlZpZXdSb3dJZHgoKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB0b3AgcmVjb3JkIGluZGV4IGFuZCBzYXZlcyB0aGUgb2xkIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1RvcFJlY0lkeFwiPnRoZSBuZXcgdmFsdWUgZm9yIHRoZSB0b3AgcmVjb3JkIGluZGV4IDwvcGFyYW0+XHJcbiAgc2V0VG9wUmVjSWR4KG5ld1RvcFJlY0lkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vbGRUb3BSZWNJZHggPSB0aGlzLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgdGhpcy5fdG9wUmVjSWR4ID0gbmV3VG9wUmVjSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgdG9wIHJlY29yZCBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VG9wUmVjSWR4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fdG9wUmVjSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdG9wIHJlY29yZCBpbmRleCBtb2RpZmllZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIGZvciB0b3BSZWNJZHhNb2RpZmllZCA8L3BhcmFtPlxyXG4gIHNldFRvcFJlY0lkeE1vZGlmaWVkKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fdG9wUmVjSWR4TW9kaWZpZWQgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBjaHVuayBzaXplIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDaHVua1NpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaHVua1NpemU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzdG9yZSB0aGUgb2xkIHNhdmVkIHZhbHVlIG9mIHRoZSB0b3AgcmVjb3JkIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXN0b3JlVG9wUmVjSWR4KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdG9wUmVjSWR4ID0gdGhpcy5fb2xkVG9wUmVjSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZXMgYWxsIHRoZSByZWNvcmRzIGZyb20gdGhlIERhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlY29yZHNUYWIucmVtb3ZlQWxsKCk7XHJcbiAgICB0aGlzLl9vcmlnaW5hbCA9IG51bGw7XHJcbiAgICBsZXQgbWdGb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpO1xyXG4gICAgaWYgKG1nRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgdGhpcy5fdGFzay5nZXRGb3JtKCkuU2V0VGFibGVJdGVtc0NvdW50KDAsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLnJlbW92ZUFsbCgpO1xyXG4gICAgdGhpcy5pbml0KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5pdGlhbGl6ZSB0aGUgY2xhc3MgbWVtYmVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY3VyclJlY0lkID0gSW50MzIuTWluVmFsdWU7XHJcbiAgICB0aGlzLl9jdXJyUmVjSWR4ID0gSW50MzIuTWluVmFsdWU7XHJcbiAgICB0aGlzLkN1cnJSZWMgPSBudWxsO1xyXG4gICAgdGhpcy5fcHJldkN1cnJSZWMgPSBudWxsO1xyXG4gICAgdGhpcy5faW5jbHVkZXNGaXJzdCA9IGZhbHNlO1xyXG4gICAgdGhpcy5faW5jbHVkZXNMYXN0ID0gZmFsc2U7XHJcbiAgICB0aGlzLklzT25lV2F5S2V5ID0gZmFsc2U7XHJcbiAgICB0aGlzLnNldFRvcFJlY0lkeChJbnQzMi5NaW5WYWx1ZSk7XHJcbiAgICAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuaW52YWxpZGF0ZShmYWxzZSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaGVzIHRoZSBzdWJGb3Jtc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgIGFzeW5jIGNvbXB1dGVTdWJGb3JtcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAvLyB3ZSBkbyBub3QgbmVlZCB0byBnbyB0byB0aGUgc2VydmVyIGR1ZSB0byB1cGRhdGVzXHJcbiAgICAgaWYgKGF3YWl0IHRoaXMuZ2V0VGFzaygpLnByZXBhcmVDYWNoZSh0cnVlKSkge1xyXG5cclxuICAgICAgIC8vIG9uZSBvZiB0aGUgbmVlZGVkIGQudiB3YXMgbm90IGZvdW5kIGluIHRoZSBjYWNoZVxyXG4gICAgICAgaWYgKCFhd2FpdCB0aGlzLmdldFRhc2soKS50ZXN0QW5kU2V0KHRydWUpKVxyXG4gICAgICAgICBhd2FpdCB0aGlzLmNvbXB1dGUodHJ1ZSwgZmFsc2UpO1xyXG4gICAgIH1cclxuICAgICBlbHNlXHJcbiAgICAgICBhd2FpdCB0aGlzLmNvbXB1dGUodHJ1ZSwgZmFsc2UpO1xyXG4gICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb21wdXRlIHRoZSB2YWx1ZXMgb2YgdGhlIGZpZWxkcyB3aXRob3V0IHVwZGF0aW5nIHRoZSBkaXNwbGF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1YkZvcm1zXCI+aWYgdHJ1ZSB0aGUgYSBzdWJGb3JtcyBjb21wdXRlIGlzIHRvIGJlIGRvbmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9yY2VDbGllbnRDb21wdXRlXCI+aWYgVFJVRSBmb3JjZXMgdGhlIGNsaWVudCB0byBjb21wdXRlIHRoZSByZWNvcmQgZXZlbiBpZiBpdCBpcyBmbGFnZ2VkXHJcbiAgLy8vICAgYXMgXCJzZXJ2ZXIgY29tcHV0ZWRcIi5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGNvbXB1dGUoc3ViRm9ybXM6IGJvb2xlYW4sIGZvcmNlQ2xpZW50Q29tcHV0ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRtcFJlYzogUmVjb3JkID0gbnVsbDtcclxuICAgIGxldCBjb21wdXRlQnlTZXJ2ZXI6IGJvb2xlYW4gPSAhdGhpcy5jb21wdXRlQnlDbGllbnQoKTtcclxuICAgIGxldCBvcmdDb21wdXRlQnk6IHN0cmluZyA9IHRoaXMuX2NvbXB1dGVCeTtcclxuICAgIC8qJ0MnKi9cclxuICAgIGlmIChmb3JjZUNsaWVudENvbXB1dGUpXHJcbiAgICAgIHRoaXMuX2NvbXB1dGVCeSA9IENPTVBVVEVfTkVXUkVDX09OX0NMSUVOVC8qJ0MnKi87XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5DdXJyUmVjLnNldEluQ29tcHV0ZSh0cnVlKTtcclxuXHJcbiAgICAgIGlmICghc3ViRm9ybXMpIHtcclxuICAgICAgICBpZiAodGhpcy5DdXJyUmVjLmlzTmV3UmVjKCkpIHtcclxuICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgLyonQycqLyAmJiAhc3VwZXIuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKS8qJ0MnKi87XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKS8qJ00nKi87XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZ2V0UmVjb3JkRGF0YTogYm9vbGVhbiA9IGNvbXB1dGVCeVNlcnZlcjtcclxuICAgICAgLy8gZm9yIG5ld2x5IGNyZWF0ZWQgcmVjb3JkcyAtIGdvIHRvIHRoZSBzZXJ2ZXIgKGlmIHRoZXkgd2VyZSBub3QgY29tcHV0ZWQgYWxyZWFkeSlcclxuICAgICAgaWYgKHN1YkZvcm1zIHx8IChnZXRSZWNvcmREYXRhICYmICF0aGlzLkN1cnJSZWMuaXNDb21wdXRlZCgpICYmICFmb3JjZUNsaWVudENvbXB1dGUpKSB7XHJcbiAgICAgICAgbGV0IGNvbW1hbmQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlQ29tcHV0ZUV2ZW50Q29tbWFuZCh0aGlzLl90YXNrLmdldFRhc2tUYWcoKSwgc3ViRm9ybXMsIHRoaXMuX2N1cnJSZWNJZCk7XHJcbiAgICAgICAgYXdhaXQgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShjb21tYW5kKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBRQ1IgIzkyMTQ3NSAtIHJlbGluayBkdXJpbmcgY29tcHV0ZSBkZXN0cm95cyB2YWx1ZXMgb2YgdmlydHVhbCBmaWVsZHMgd2l0aCBubyBpbml0IGV4cC5cclxuICAgICAgICAvLyB0aHVzIHdlIHNhdmUgdGhlbSBiZWZvcmUgdGhlIGNvbXB1dGUgYW5kIHJlc3RvcmUgdGhlbSBkdXJpbmcgdGhlIGxvb3AuXHJcbiAgICAgICAgaWYgKGdldFJlY29yZERhdGEpIHtcclxuICAgICAgICAgIHRtcFJlYyA9IG5ldyBSZWNvcmQodGhpcy5DdXJyUmVjLmdldElkKCksIHRoaXMpO1xyXG4gICAgICAgICAgdG1wUmVjLkluaXRpYWxpemUoKTtcclxuICAgICAgICAgIHRtcFJlYy5zZXRJbml0aWFsRmxkVmFscyh0cnVlLCB0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5zZXRTZXJ2ZXJSY21wKGZhbHNlKTtcclxuICAgICAgICBsZXQgZnJvbTogbnVtYmVyID0gKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmdldFJNSWR4KCk7XHJcbiAgICAgICAgbGV0IHNpemU6IG51bWJlciA9ICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5nZXRSTVNpemUoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gZnJvbTsgaSA8IGZyb20gKyBzaXplOyBpID0gaSArIDEpIHtcclxuICAgICAgICAgIGxldCBmbGQ6IEZpZWxkID0gPEZpZWxkPnRoaXMuX2ZpZWxkc1RhYi5nZXRGaWVsZChpKTtcclxuICAgICAgICAgIGlmIChnZXRSZWNvcmREYXRhICYmICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5zZXJ2ZXJSY21wRG9uZSgpICYmIGZsZC5Jc1ZpcnR1YWwgJiYgIWZsZC5WaXJBc1JlYWwgJiYgIWZsZC5oYXNJbml0RXhwKCkpIHtcclxuICAgICAgICAgICAgbGV0IGN1cnJSZWMyOiBSZWNvcmQgPSB0aGlzLkN1cnJSZWM7XHJcbiAgICAgICAgICAgIHRoaXMuQ3VyclJlYyA9IHRtcFJlYztcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBmbGQudGFrZVZhbEZyb21SZWMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICB0aGlzLkN1cnJSZWMgPSBjdXJyUmVjMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vVE9ETzogQ2hlY2sgaWYgd2UgY2FuIHVzZSBhbm90aGVyIChtYXliZSwgbmV3KSBmdW5jdGlvbiB0byBnZXQgdGhlIGRhdGEgd2hpbGUgdHJhbnNmZXJyaW5nIHRoZW0gdG8gVUkgaW5zdGVhZCBvZiBjb21wdXRlKCkuXHJcbiAgICAgICAgICBpZiAoISg8TWdGb3JtPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpKS5UcmFuc2ZlcnJpbmdEYXRhVG9HVUkpXHJcbiAgICAgICAgICAgIGF3YWl0IGZsZC5jb21wdXRlKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICB0aGlzLkN1cnJSZWMuc2V0SW5Db21wdXRlKGZhbHNlKTtcclxuICAgICAgdGhpcy5DdXJyUmVjLnNldExhdGVDb21wdXRlKGZhbHNlKTtcclxuICAgICAgdGhpcy5fY29tcHV0ZUJ5ID0gb3JnQ29tcHV0ZUJ5O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkUmVjb3JkKGRvU3VmZml4OiBib29sZWFuLCBpZ25vcmVDdXJyUmVjOiBib29sZWFuLCBpc0NyZWxpbmVBYm92ZTogYm9vbGVhbik6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICBsZXQgbmV3Q3VyclJlY0lkOiBudW1iZXIgPSAoLS10aGlzLl9sYXN0Q3JlYXRlZFJlY0lkKTtcclxuICAgIGxldCBtb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMgPSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0O1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYWRkUmVjb3JkXzEoZG9TdWZmaXgsIGlnbm9yZUN1cnJSZWMsIGZhbHNlLCBuZXdDdXJyUmVjSWQsIG1vZGUsIGlzQ3JlbGluZUFib3ZlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRvU3VmZml4XCI+aWYgdHJ1ZSB0aGVuIGRvIHRoZSBzdWZmaXggb2YgdGhlIHByZXZpb3VzIHJlY29yZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaWdub3JlQ3VyclJlY1wiPmlmIHRydWUgdGhlbiBkbyB0aGUgc3VmZml4IG9mIHRoZSBwcmV2aW91cyByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzRmlyc3RSZWNvcmRcIj4gaXMgZmlyc3QgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXdDdXJyUmVjSWRcIj4gbmV3IHJlY29yZCBpZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW9kZVwiPiBvcGVyYXRpb24gbW9kZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnRoZSBuZXcgcmVjIGluZGV4PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgYWRkUmVjb3JkXzEoZG9TdWZmaXg6IGJvb2xlYW4sIGlnbm9yZUN1cnJSZWM6IGJvb2xlYW4sIGlzRmlyc3RSZWNvcmQ6IGJvb2xlYW4sIG5ld0N1cnJSZWNJZDogbnVtYmVyLCBtb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMsIGlzQ3JlbGluZUFib3ZlOiBib29sZWFuKTogUHJvbWlzZTxudW1iZXI+IHtcclxuXHJcbiAgICAvLyBnaXZlIHRoZSBuZXcgcmVjb3JkIGEgbmVnYXRpdmUgaWRcclxuICAgIGxldCByZWM6IFJlY29yZCA9IG5ldyBSZWNvcmQobmV3Q3VyclJlY0lkLCB0aGlzKTtcclxuICAgIHJlYy5Jbml0aWFsaXplKCk7XHJcbiAgICByZWMuc2V0SW5pdGlhbEZsZFZhbHMoZmFsc2UsICFpc0ZpcnN0UmVjb3JkKTtcclxuXHJcbiAgICBsZXQgbmV3Q3VyclJlY0lkeDogbnVtYmVyID0gMDtcclxuICAgIGlmIChpc0NyZWxpbmVBYm92ZSlcclxuICAgIHtcclxuICAgICAgbmV3Q3VyclJlY0lkeCA9ICh0aGlzLl9jdXJyUmVjSWR4ID49IDBcclxuICAgICAgICA/IHRoaXMuX2N1cnJSZWNJZHhcclxuICAgICAgICA6IDApO1xyXG5cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgbmV3Q3VyclJlY0lkeCA9ICh0aGlzLl9jdXJyUmVjSWR4ICE9IEludDMyLk1pblZhbHVlXHJcbiAgICAgICAgPyB0aGlzLl9jdXJyUmVjSWR4ICsgMVxyXG4gICAgICAgIDogMCk7XHJcblxyXG5cclxuICAgIC8vbGV0IG5ld0N1cnJSZWNJZHg6IG51bWJlciA9ICh0aGlzLl9jdXJyUmVjSWR4ICE9PSBJbnQzMi5NaW5WYWx1ZSkgP1xyXG4gICAgICAvLyh0aGlzLl9jdXJyUmVjSWR4ICsgMSlcclxuICAgICAgLy86IDA7XHJcblxyXG4gICAgdGhpcy5fcmVjb3Jkc1RhYi5pbnNlcnRSZWNvcmQocmVjLCBuZXdDdXJyUmVjSWR4KTtcclxuICAgIHJlYy5zZXRNb2RlKG1vZGUpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBjb21wdXRlOiBib29sZWFuID0gIWlzRmlyc3RSZWNvcmQ7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KG5ld0N1cnJSZWNJZHgsIGRvU3VmZml4LCBpZ25vcmVDdXJyUmVjLCBjb21wdXRlLCBJbnQzMi5NaW5WYWx1ZSk7XHJcblxyXG4gICAgICAvLyB3aGlsZSB3ZSBpbiBjcmVhdGUgbW9kZSBkb24ndCBzZXQgcmVzZXQgdG8gX25ld1JlY1xyXG4gICAgICBpZiAoaXNGaXJzdFJlY29yZCAmJiB0aGlzLmdldFRhc2soKS5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgIHJlYy5zZXRPbGRSZWMoKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChleGVjcHRpb24pIHtcclxuICAgICAgaWYgKGV4ZWNwdGlvbiBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgIG5ld0N1cnJSZWNJZHggPSAtMTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oJ2luIERhdGFWaWV3LmFkZFJlY29yZCgpIGludmFsaWQgZXhjZXB0aW9uJyk7XHJcblxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBleGVjcHRpb247XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3Q3VyclJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1vdmUgdGhlIGN1cnJlbnQgcmVjb3JkIGZyb20gdGhlIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZW1vdmVDdXJyUmVjKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1nRm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBvbkRlbGV0ZTogYm9vbGVhbjsgLy8gdHJ1ZSBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIHJlY29yZCBkdWUgdG8gZGVsZXRlLiBmYWxzZSBpZiBkdWUgdG8gY2FuY2VsIG9uIGluc2VydFxyXG5cclxuICAgIGlmICh0aGlzLkN1cnJSZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0ICYmXHJcbiAgICAgICF0aGlzLmdldFRhc2soKS50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSkge1xyXG4gICAgICAvLyB0aGUgcmVjb3JkIHdhcyBjcmVhdGVkIGJ5IHRoZSBjbGllbnQgc28gaXQgaGFzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGVcclxuICAgICAgLy8gbW9kaWZpZWQgcmVjb3JkcyB0YWJsZSAoaWYgaXQgaXMgYWxyZWFkeSB0aGVyZSkgYmVjYXVzZSB0aGUgc2VydmVyXHJcbiAgICAgIC8vIGRvZXNuJ3QgaGF2ZSB0byBrbm93IGFueXRoaW5nIGFib3V0IGl0XHJcbiAgICAgIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5yZW1vdmVSZWNvcmQodGhpcy5DdXJyUmVjKTtcclxuICAgICAgb25EZWxldGUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBtb3ZlIHRoZSBjdXJyZW50IHJlY29yZCBmcm9tIHRoZSByZWNvcmRzIHRhYmxlIHRvIHRoZSBtb2RpZmllZCB0YWJsZVxyXG4gICAgICB0aGlzLkN1cnJSZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgIHRoaXMuQ3VyclJlYy5zZXRNb2RlKERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpO1xyXG4gICAgICBvbkRlbGV0ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLkN1cnJSZWMucmVtb3ZlUmVjRnJvbURjKCk7XHJcbiAgICB0aGlzLl9yZWNvcmRzVGFiLnJlbW92ZVJlY29yZCh0aGlzLl9jdXJyUmVjSWR4KTtcclxuICAgIHRoaXMuc2V0Q2hhbmdlZCh0cnVlKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkgJiYgISg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSXNUcnlpbmdUb1N0b3ApIHtcclxuICAgICAgYXdhaXQgdGhpcy5Nb3ZlVG9FbXB0eURhdGF2aWV3SWZBbGxvd2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG5ld0Rpc3BsYXlMaW5lOiBudW1iZXIgPSB0aGlzLmNhbGNMaW5lVG9Nb3ZlKG9uRGVsZXRlKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChtZ0Zvcm0uaXNTY3JlZW5Nb2RlKCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChuZXdEaXNwbGF5TGluZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IG1nRm9ybS5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShuZXdEaXNwbGF5TGluZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XHJcbiAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgaW5kZXggaXMgYmV5b25kIHRoZSBib3R0b20gZW5kIG9mIHRoZSBkYXRhdmlld1xyXG4gICAgICAgIC8vIHRyeSB0byBzZXQgaXQgdG8gdGhlIHByZWNlZGluZyByZWNvcmRcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKCFzdXBlci5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgICAgICAgbmV3RGlzcGxheUxpbmUgPSBtZ0Zvcm0uZ2V0UHJldkxpbmUobmV3RGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgaWYgKG1nRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgobmV3RGlzcGxheUxpbmUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgYXdhaXQgbWdGb3JtLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKG5ld0Rpc3BsYXlMaW5lLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcblxyXG4gICAgICAgICAgICAvLyBubyBtb3JlIHJlY29yZHMgaW4gdGhlIGRhdGF2aWV3XHJcbiAgICAgICAgICAgIC8vIG9yIG5vIG5vZGVzIGluIHRoZSB0cmVlXHJcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZW1vdmUgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNvcmRcIj48L3BhcmFtPlxyXG4gIFJlbW92ZVJlY29yZChyZWNvcmQ6IFJlY29yZCk6IHZvaWQge1xyXG4gICAgbGV0IHJlY0lkeDogbnVtYmVyID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNJZHgocmVjb3JkLmdldElkKCkpO1xyXG5cclxuICAgIGlmICh0aGlzLl90b3BSZWNJZHggPiByZWNJZHgpXHJcbiAgICAgIHRoaXMuX3RvcFJlY0lkeC0tO1xyXG4gICAgaWYgKHRoaXMuX29sZFRvcFJlY0lkeCA+IHJlY0lkeClcclxuICAgICAgdGhpcy5fb2xkVG9wUmVjSWR4LS07XHJcbiAgICBpZiAodGhpcy5fY3VyclJlY0lkeCA+IHJlY0lkeClcclxuICAgICAgdGhpcy5fY3VyclJlY0lkeC0tO1xyXG4gICAgdGhpcy5fcmVjb3Jkc1RhYi5yZW1vdmVSZWNvcmQocmVjb3JkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gbW92ZSB0byBlbXB0eSBkYXRhdmlldyBpZiBhbGxvd2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBNb3ZlVG9FbXB0eURhdGF2aWV3SWZBbGxvd2VkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCFzdXBlci5pc0VtcHR5RGF0YXZpZXcoKSAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgaWYgKGF3YWl0IHRoaXMuX3Rhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0VNUFRZX0RBVEFWSUVXLCB0cnVlKSlcclxuICAgICAgICBzdXBlci5zZXRFbXB0eURhdGF2aWV3KHRydWUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl90YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgc3VwZXIuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgICAgc3VwZXIuc2V0RW1wdHlEYXRhdmlldyhmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBkaXNwbGF5IGxpbmUgdG8gbW92ZSBhZnRlciBkZWxldGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25EZWxldGVcIj50cnVlIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgcmVjb3JkIGR1ZSB0byBkZWxldGUuIGZhbHNlIGlmIGR1ZSB0byBjYW5jZWwgb24gaW5zZXJ0XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjYWxjTGluZVRvTW92ZShvbkRlbGV0ZTogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBsZXQgbmV3RGlzcGxheUxpbmU6IG51bWJlcjtcclxuXHJcbiAgICAvLyBpZiB0aGUgcmVjb3JkIGlzIHJlbW92ZWQgZHVlIHRvIGl0cyBkZWxldGlvbiwgd2UgbmVlZCB0byBnb3QgdG8gdGhlIG5leHQgcmVjb3JkIGluIHRoZSB2aWV3IC1cclxuICAgIC8vIG5vdyB0aGF0IHdlIGRlbGV0ZWQgdGhlIGN1cnJlbnQgcmVjb3JkLCB0aGUgaW5kZXggb2YgdGhlIG5leHQgcmVjb3JkIGlzIHRoZSBzYW1lIGluZGV4IHRoYXQgd2FzXHJcbiAgICAvLyBvZiB0aGUgcmVjb3JkIHRoYXQgd2FzIGRlbGV0ZWQuXHJcblxyXG4gICAgaWYgKG9uRGVsZXRlKVxyXG4gICAgICBuZXdEaXNwbGF5TGluZSA9IHRoaXMuX2N1cnJSZWNJZHg7XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gIzc1MDE5MCBTaGF5YVxyXG4gICAgICAvLyBtb3ZlIHRvIHRoZSBQUkVWIHJlY29yZCBhZnRlciBjYW5jZWxcclxuICAgICAgaWYgKHRoaXMuX2N1cnJSZWNJZHggPiAwKVxyXG4gICAgICAgIG5ld0Rpc3BsYXlMaW5lID0gdGhpcy5fY3VyclJlY0lkeCAtIDE7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBuZXdEaXNwbGF5TGluZSA9IHRoaXMuX2N1cnJSZWNJZHg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3RGlzcGxheUxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdmFsdWVzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2N1cnJSZWNJZCA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgdGhpcy5fY3VyclJlY0lkeCA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgdGhpcy5DdXJyUmVjID0gbnVsbDtcclxuICAgIHRoaXMuc2V0VG9wUmVjSWR4KEludDMyLk1pblZhbHVlKTtcclxuICAgIHRoaXMuU2V0SW5jbHVkZXNGaXJzdCh0cnVlKTtcclxuICAgIHRoaXMuU2V0SW5jbHVkZXNMYXN0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbmNlbCB0aGUgZWRpdGluZyBvZiB0aGUgY3VycmVudCByZWNvcmQgYW5kIHJlc3RvcmUgdGhlIG9sZCB2YWx1ZXMgb2ZcclxuICAvLy8gICB0aGUgZmllbGRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9ubHlSZWFsXCI+aWYgdHJ1ZSBvbmx5IHJlc3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIHJlYWwgZmllbGRzLiA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjb21wdXRlVW5rbm93bnNcIj5yZS1wZXJmb3JtIHVua25vd24gcmVjb21wdXRlcy4gPC9wYXJhbT5cclxuICBhc3luYyBjYW5jZWxFZGl0KG9ubHlSZWFsOiBib29sZWFuLCByZWNvbXB1dGVVbmtub3duczogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHRlbXBDdXJyUmVjOiBSZWNvcmQgPSBudWxsO1xyXG4gICAgbGV0IHJlY1JlbW92ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBpbkVuZFRhc2s6IGJvb2xlYW4gPSAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkluRW5kVGFzaztcclxuXHJcbiAgICAvLyBRQ1IgIzM2MjkwMyAtIEF0IF90YXNrIHN1ZmZpeCwgd2Ugd2FudCB0byBwcmVzZXJ2ZSB0aGUgbGFzdCB2YWx1ZXMgb2YgdGhlIHZpcnR1YWxzLlxyXG4gICAgaWYgKGluRW5kVGFzaylcclxuICAgICAgb25seVJlYWwgPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLkN1cnJSZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0ICYmIHRoaXMuQ3VyclJlYy5pc05ld1JlYygpKSB7XHJcbiAgICAgIGlmICgodGhpcy5faW5jbHVkZXNGaXJzdCAmJiB0aGlzLl9pbmNsdWRlc0xhc3QgJiYgKHRoaXMuX3JlY29yZHNUYWIgPT09IG51bGwgfHwgdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgPT09IDEpKSB8fCAhdGhpcy5IYXNNYWluVGFibGUpIHtcclxuXHJcbiAgICAgICAgLy8gZGVmZWN0IDEyMTk2OC4gV2hlbiBmcm9tIHRoZSBwYXJlbnQgdGFzayBcIlZpZXdSZWZyZXNoXCIgb3IgXCJDYW5jZWxcIiBhcmUgZG9uZSBhbmQgdGhlIHN1YmZvcm0gaXMgaW4gQ3JlYXRlIG5vZGVcclxuICAgICAgICAvLyBhbmQgdGhlIHN1YmZvcm0gaGFzIG5vIHJlY29yZHMsIF9vcmlnaW5hbCBpcyBudWxsLiBTbyBwYXNzIGl0LlxyXG4gICAgICAgIGlmICh0aGlzLl9vcmlnaW5hbCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5DdXJyUmVjLnNldFNhbWVBcyh0aGlzLl9vcmlnaW5hbCwgb25seVJlYWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUN1cnJSZWMoKTtcclxuICAgICAgICByZWNSZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9vcmlnaW5hbCA9IHRoaXMuQ3VyclJlYy5yZXBsaWNhdGUoKTsgLy8gbXVzdCBjb3B5IGFnYWluIHRvIHByZXZlbnQgYWx0ZXJpbmcgdGhlIG9yaWdpbmFsIHZhbHVlc1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBpZiAoY3VyclJlYy5tb2RpZmllZCgpKVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5DdXJyUmVjLk1vZGlmaWVkKSB7XHJcbiAgICAgICAgbGV0IGN1cnJDdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRoaXMuX3Rhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICBpZiAoY3VyckN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgICBjdXJyQ3RybC5yZXNldFByZXZWYWwoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlY29tcHV0ZVVua25vd25zKVxyXG4gICAgICAgIHRlbXBDdXJyUmVjID0gdGhpcy5DdXJyUmVjLnJlcGxpY2F0ZSgpO1xyXG5cclxuICAgICAgLy8gQVRURU5USU9OICEhIVxyXG4gICAgICAvLyB3ZSBkb24ndCBzdGVwIG92ZXIgdGhlIGN1cnJSZWMgcmVmZXJlbmNlIHdpdGggdGhlIG9yaWdpbmFsIHJlY29yZFxyXG4gICAgICAvLyB0byBhc3N1cmUgdGhhdCBpZiB0aGlzIHJlY29yZCBpcyBib3RoIGluIHRoZSByZWNvcmRzIHRhYmxlIGFuZCBpblxyXG4gICAgICAvLyB0aGUgbW9kaWZpZWQgdGFibGUgdGhlc2UgdGFibGVzIHdpbGwga2VlcCByZWZlcmVuY2luZyB0aGUgc2FtZSBpbnN0YW5jZVxyXG4gICAgICBpZiAodGhpcy5fb3JpZ2luYWwgIT09IG51bGwpXHJcbiAgICAgICAgdGhpcy5DdXJyUmVjLnNldFNhbWVBcyh0aGlzLl9vcmlnaW5hbCwgb25seVJlYWwpO1xyXG5cclxuICAgICAgaWYgKCh0aGlzLl9vcmlnaW5hbCAhPT0gbnVsbCAmJiByZWNvbXB1dGVVbmtub3ducykgJiYgIXRoaXMuQ3VyclJlYy5pc1NhbWVSZWNEYXRhKHRlbXBDdXJyUmVjLCBmYWxzZSwgZmFsc2UpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuZXhlY1Vua25vd25SY21wcyh0aGlzLl9vcmlnaW5hbCk7XHJcblxyXG4gICAgICB0aGlzLnRha2VGbGRWYWxzRnJvbUN1cnJSZWMoKTtcclxuICAgICAgdGhpcy5fb3JpZ2luYWwgPSB0aGlzLkN1cnJSZWMucmVwbGljYXRlKCk7IC8vIG11c3QgY29weSBhZ2FpbiB0byBwcmV2ZW50IGFsdGVyaW5nIHRoZSBvcmlnaW5hbCB2YWx1ZXNcclxuICAgIH1cclxuICAgIHJldHVybiByZWNSZW1vdmVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoZXJlIGFyZSBubyByZWNvcmRzIGluIHRoZSBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNFbXB0eSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlc0ZpcnN0ICYmIHRoaXMuX2luY2x1ZGVzTGFzdCAmJiAodGhpcy5fcmVjb3Jkc1RhYiA9PT0gbnVsbCB8fCB0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKSA9PT0gMCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGRDdXJyVG9Nb2RpZmllZCgpOiBQcm9taXNlPHZvaWQ+IDtcclxuICBhc3luYyBhZGRDdXJyVG9Nb2RpZmllZChzZXRSZWNUb09sZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4gO1xyXG4gIGFzeW5jIGFkZEN1cnJUb01vZGlmaWVkKHNldFJlY1RvT2xkPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHNldFJlY1RvT2xkKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmFkZEN1cnJUb01vZGlmaWVkXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5hZGRDdXJyVG9Nb2RpZmllZF8xKHNldFJlY1RvT2xkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgdGhlIGN1cnJlbnQgcmVjb3JkIHRvIHRoZSBtb2RpZmllZCByZWNvcmRzIHRhYmxlIC0gaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgYWRkQ3VyclRvTW9kaWZpZWRfMCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuYWRkQ3VyclRvTW9kaWZpZWQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIHRoZSBjdXJyZW50IHJlY29yZCB0byB0aGUgbW9kaWZpZWQgcmVjb3JkcyB0YWJsZSAtIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc1NldE9sZFJlY1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBhZGRDdXJyVG9Nb2RpZmllZF8xKHNldFJlY1RvT2xkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuYWRkUmVjb3JkKHRoaXMuQ3VyclJlYyk7XHJcbiAgICBpZiAoc2V0UmVjVG9PbGQpIHtcclxuICAgICAgdGhpcy5DdXJyUmVjLnNldE9sZFJlYygpO1xyXG4gICAgfVxyXG4gICAgbGV0IGNvbW1hbmQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU2V0VHJhbnNhY3Rpb25TdGF0ZURhdGF2aWV3Q29tbWFuZCh0aGlzLmdldFRhc2soKS5nZXRUYXNrVGFnKCksIHRydWUpO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRUYXNrKCkuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNvbW1hbmQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRha2UgdGhlIGZpZWxkIHZhbHVlcyBmcm9tIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgdGFrZUZsZFZhbHNGcm9tQ3VyclJlYygpOiB2b2lkIHtcclxuICAgICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS50YWtlVmFsc0Zyb21SZWMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb21wYXJlIGEgc2VsZWN0ZWQgZmllbGRzIHZhbHVlcyBiZXR3ZWVuIHRoZSBjdXJyZW50IHJlY29yZCBhbmQgdGhlIHByZXZpb3VzIHJlY29yZFxyXG4gIC8vLyAgIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGVpciB2YWx1ZXMgYXJlIGVxdWFsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZExpc3RcIj50aGUgbGlzdCBvZiBmaWVsZCBpbmRleGVzIHRvIGNvbXBhcmVcclxuICAvLy8gPC9wYXJhbT5cclxuICBjdXJyRXF1YWxzUHJldihmbGRMaXN0OiBudW1iZXJbXSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuQ3VyclJlYyAhPT0gbnVsbCAmJiB0aGlzLl9wcmV2Q3VyclJlYyAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAodGhpcy5DdXJyUmVjID09PSB0aGlzLl9wcmV2Q3VyclJlYylcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBmbGRMaXN0Lmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLkN1cnJSZWMuZmxkVmFsc0VxdWFsKHRoaXMuX3ByZXZDdXJyUmVjLCBmbGRMaXN0W2ldKSlcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5DdXJyUmVjICE9PSB0aGlzLl9wcmV2Q3VyclJlYylcclxuICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBfdGFzayBvZiB0aGlzIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUYXNrKCk6IFRhc2tCYXNlIHtcclxuICAgIERlYnVnLkFzc2VydCh0aGlzLl90YXNrIGluc3RhbmNlb2YgVGFza0Jhc2UpO1xyXG4gICAgcmV0dXJuIDxUYXNrQmFzZT50aGlzLl90YXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgZm9ybSBmb3IgX3Rhc2sgb2YgdGhpcyBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Rm9ybSgpOiBNZ0Zvcm0ge1xyXG4gICAgcmV0dXJuIDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgbW9kaWZpZWQgcmVjb3JkcyB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgbW9kaWZpZWRSZWNvcmRzTnVtYmVyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmdldFNpemUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0U2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2xpZW50IGtub3dzIGhvdyB0byBpbml0IGEgbmV3IHJlY29yZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbXB1dGVCeUNsaWVudCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jb21wdXRlQnkgPT09IENPTVBVVEVfTkVXUkVDX09OX0NMSUVOVC8qJ0MnKi87XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaXMgUmVjb3JkIGV4aXN0cyBpbiB0aGUgRGF0YVZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWRcIj5vZiBuZWVkZWQgcmVjb3JkIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoZSByZWNvcmQgZXhpc3RzIDwvcmV0dXJucz5cclxuICByZWNFeGlzdHNCeUlkKGlkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY29yZChpZCkgIT09IG51bGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgUGFyYW1ldGVyc0V4aXN0KGlQb3M6IG51bWJlciwgaUxlbjogbnVtYmVyKTogYm9vbGVhbjtcclxuICBQYXJhbWV0ZXJzRXhpc3QoKTogYm9vbGVhbjtcclxuICBQYXJhbWV0ZXJzRXhpc3QoaVBvcz86IG51bWJlciwgaUxlbj86IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpXHJcbiAgICAgIHJldHVybiB0aGlzLlBhcmFtZXRlcnNFeGlzdF8wKGlQb3MsIGlMZW4pO1xyXG4gICAgcmV0dXJuIHRoaXMuUGFyYW1ldGVyc0V4aXN0XzEoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGVyZSBhcmUgcGFyYW1zIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaVBvc1wiPnBvc2l0aW9uIG9mIGZpcnN0IGZpZWxkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlMZW5cIj5udW1iZXIgb2YgZmllbGRzIGluIHRoZSByYW5nZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlID0gdGhlcmUgYXJlIHBhcmFtZXRlcnMgaW4gdGhlIHJhbmdlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgUGFyYW1ldGVyc0V4aXN0XzAoaVBvczogbnVtYmVyLCBpTGVuOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IGlQb3M7IGkgPCBpUG9zICsgaUxlbjsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGlmICgoPEZpZWxkPnN1cGVyLmdldEZpZWxkKGkpKS5pc1BhcmFtKCkpXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrIGlmIHRoZXJlIGFyZSBwYXJhbXMgaW4gRGF0YXZpZXcgdGFiXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgUGFyYW1ldGVyc0V4aXN0XzEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5QYXJhbWV0ZXJzRXhpc3QodGhpcy5fcm1JZHgsIHRoaXMuX3JtU2l6ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGEgcmVjb3JkIGlzIGluIHRoZSBtb2RpZmllZCByZWNvcmRzIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+dGhlIGlkIG9mIHRoZSByZWNvcmQ8L3BhcmFtPlxyXG4gIHJlY0luTW9kaWZpZWRUYWIoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlY29yZDogUmVjb3JkID0gdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmdldFJlY29yZChpZCk7XHJcbiAgICByZXR1cm4gcmVjb3JkICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgc2V0UHJldkN1cnJSZWMoKTogdm9pZDtcclxuICBzZXRQcmV2Q3VyclJlYyhyZWM6IFJlY29yZCk6IHZvaWQ7XHJcbiAgc2V0UHJldkN1cnJSZWMocmVjPzogUmVjb3JkKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnNldFByZXZDdXJyUmVjXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRQcmV2Q3VyclJlY18xKHJlYyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2F2ZXMgdGhlIGN1cnJlbnQgcmVjb3JkIGFzIHRoZSBwcmV2aW91cyBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRQcmV2Q3VyclJlY18wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldkN1cnJSZWMgPSB0aGlzLkN1cnJSZWM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFByZXZDdXJyUmVjXzEocmVjOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZDdXJyUmVjID0gcmVjO1xyXG4gIH1cclxuXHJcbiAgaXNQcmV2Q3VyclJlY051bGwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJldkN1cnJSZWMgPT09IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVjb21wdXRlIGFsbCB2aXJ0dWFscyB3aXRoIG5vIGluaXQgZXhwcmVzc2lvbiB3aGljaCBoYXZlIHNlcnZlciByZWNvbXB1dGUgZGVmaW5lZCBmb3IgdGhlbS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib3JnUmVjXCI+Y29udGFpbnMgdGhlIHZpcnR1YWwncyBvcmlnaW5hbCB2YWx1ZSA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgZXhlY1Vua25vd25SY21wcyhvcmdSZWM6IFJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgZnJvbTogbnVtYmVyID0gKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmdldFJNSWR4KCk7XHJcbiAgICBsZXQgc2l6ZTogbnVtYmVyID0gKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmdldFJNU2l6ZSgpO1xyXG5cclxuICAgIGxldCByZWM6IFJlY29yZCA9IHRoaXMuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgIC8vIEZpcnN0IHRpbWUgLSBpbml0aWFsaXplIHVua25vd25SY21wIHZhbHVlXHJcbiAgICBpZiAodGhpcy5fdW5rbm93blJjbXAgPT09IFVOS05PV05fUkNNUFNfTk9UX0lOSVRFRCkge1xyXG5cclxuICAgICAgZm9yIChpID0gZnJvbTtcclxuICAgICAgICAgICBpIDwgZnJvbSArIHNpemUgJiYgdGhpcy5fdW5rbm93blJjbXAgPT09IFVOS05PV05fUkNNUFNfTk9UX0lOSVRFRDtcclxuICAgICAgICAgICBpKyspIHtcclxuXHJcbiAgICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD50aGlzLl9maWVsZHNUYWIuZ2V0RmllbGQoaSk7XHJcblxyXG4gICAgICAgIGlmIChmaWVsZC5Jc1ZpcnR1YWwgJiYgIWZpZWxkLmhhc0luaXRFeHAoKSAmJiBmaWVsZC5pc1NlcnZlclJjbXAoKSlcclxuICAgICAgICAgIHRoaXMuX3Vua25vd25SY21wID0gVU5LTk9XTl9SQ01QU19GT1VORC8qJ1knKi87XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3Vua25vd25SY21wID09PSBVTktOT1dOX1JDTVBTX0ZPVU5EIC8qJ1knKi8gJiYgcmVjICE9PSBudWxsKSB7XHJcbiAgICAgIGZvciAoaSA9IGZyb207IGkgPCBmcm9tICsgc2l6ZTsgaSA9IGkgKyAxKSB7XHJcblxyXG4gICAgICAgIGxldCBmaWVsZDogRmllbGQgPSA8RmllbGQ+dGhpcy5fZmllbGRzVGFiLmdldEZpZWxkKGkpO1xyXG4gICAgICAgIGlmIChmaWVsZC5Jc1ZpcnR1YWwgJiYgIWZpZWxkLmhhc0luaXRFeHAoKSAmJiBmaWVsZC5pc1NlcnZlclJjbXAoKSAmJiAhcmVjLmZsZFZhbHNFcXVhbChvcmdSZWMsIGkpKSB7XHJcbiAgICAgICAgICBsZXQgZmllbGRWYWx1ZTogc3RyaW5nID0gcmVjLkdldEZpZWxkVmFsdWUoaSk7XHJcbiAgICAgICAgICBsZXQgaXNOdWxsRmxkOiBib29sZWFuID0gcmVjLklzTnVsbChpKTtcclxuICAgICAgICAgIHJlYy5zZXRGaWVsZFZhbHVlKGksIG9yZ1JlYy5HZXRGaWVsZFZhbHVlKGkpLCBmYWxzZSk7XHJcbiAgICAgICAgICBhd2FpdCBmaWVsZC5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKGZpZWxkVmFsdWUsIGlzTnVsbEZsZCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB0cmFuc0NsZWFyZWQgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0VHJhbnNDbGVhcmVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdHJhbnNDbGVhcmVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwZXJmb3JtIGFueSBkYXRhIGVycm9yIHJlY292ZXJ5IGFjdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGFzeW5jIHByb2Nlc3NSZWNvdmVyeSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5fdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgbGV0IG9yZ0FjdGlvbjogc3RyaW5nID0gdGhpcy5fcGVuZGluZ1JlY292ZXJ5O1xyXG4gICAgICBsZXQgb3JnU3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCk7XHJcblxyXG4gICAgICB0aGlzLl9wZW5kaW5nUmVjb3ZlcnkgPSBSRUNPVkVSWV9BQ1RfTk9ORTtcclxuICAgICAgaWYgKG9yZ1N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcblxyXG4gICAgICBsZXQgdGVtcG9yYXJ5UmVzZXRJbkN0cmxQcmVmaXg6IGJvb2xlYW4gPSAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkluQ3RybFByZWZpeDtcclxuXHJcbiAgICAgIC8vIGlmIHRoZSBlcnJvciBmcm9tIHdoaWNoIHdlIHJlY292ZXIgaGFwcGVuZWQgd2hpbGUgaW4gY3RybCBwcmVmaXgsIHJlc2V0IGl0IGZvciB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkIGhlcmUsXHJcbiAgICAgIC8vIHNvIHRoYXQgZW50ZXJpbmcgYSBuZXcgY29udHJvbCB3aWxsIHdvcmsgKERlZmVjdCAxMjIzODcpLlxyXG4gICAgICBpZiAodGVtcG9yYXJ5UmVzZXRJbkN0cmxQcmVmaXgpXHJcbiAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuXHJcbiAgICAgIHN3aXRjaCAob3JnQWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBSRUNPVkVSWV9BQ1RfQ0FOQ0VMOlxyXG4gICAgICAgICAgKCg8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5yZXNldFVwZGF0ZWQoKTtcclxuXHJcbiAgICAgICAgICAvLyBRQ1IgIzc3Mzk3OSAodXBkYXRlZCByZWNvcmQgY2FudCBiZSBjYW5jZWxlZClcclxuXHJcbiAgICAgICAgICAvLyBjbGVhciB0aGUgY2FjaGVcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLmdldFRhc2tDYWNoZSgpLmNsZWFyQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgICAvLyBxY3IgIzc3Njk1Mi4gY3JlYXRlIG1vZGUgYW5kIG9ubHkgMSByZWMgb24gZHYuIFRoZSBzZXJ2ZXIgaGFzIG9yZGVyZWRcclxuICAgICAgICAgIC8vIGEgcm9sbGJhY2suIEhlcmUsIHdlIHJlc2V0IG9yaWdpbmFsIHJlYyBhbmQgY3VyciByZWMgdG8gaW5zZXJ0IG1vZGUsXHJcbiAgICAgICAgICAvLyBvdGhlcndpc2UsIG5leHQgdGltZSB0aGUgY2xpZW50IHdpbGwgc2V0IHVwZGF0ZSBtb2RlIGZvciB0aGUgcmVjIGluc3RlYWQgb2YgaW5zZXJ0LlxyXG4gICAgICAgICAgaWYgKHRoaXMuZ2V0U2l6ZSgpID09PSAxICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICB0aGlzLkN1cnJSZWMucmVzZXRNb2RpZmllZCgpO1xyXG4gICAgICAgICAgICB0aGlzLkN1cnJSZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuQ3VyclJlYy5zZXRNb2RlKERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpO1xyXG4gICAgICAgICAgICB0aGlzLkN1cnJSZWMuc2V0TmV3UmVjKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsLnNldFNhbWVBcyh0aGlzLkN1cnJSZWMsIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBUaGUgY2FuY2VsIGhhbmRsZWQgaGVyZSB3aWxsIG5vdCBjYXVzZWQgYSByb2xsYmFjayBzaW5jZSBpdCB3YXMgcmFpc2VkIGJ5IHJvbGxiYWNrLiAocm9sbGIgYWxyZWFkeSBkb25lIGluIHNlcnZlcikuXHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRFdmVudFN1YnR5cGUodGhpcy5nZXRUYXNrKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUwsXHJcbiAgICAgICAgICAgIEV2ZW50U3ViVHlwZS5DYW5jZWxXaXRoTm9Sb2xsYmFjayk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBSRUNPVkVSWV9BQ1RfTU9WRV9ESVJFQ1RJT05fQkVHSU46XHJcbiAgICAgICAgICAvLyBEZWZlY3QgMTUyMzIwOiBXaGVuIERhdGFiYXNlIGVycm9yIG9jY3VycyB3ZSBuZWVkIG5vdCBjYWxsIFJlY29yZCBzdWZmaXggYWdhaW4gYXMgdGhpcyBpcyBjYWxsZWQgZnJvbSBSZWNvcmQgc3VmZml4LlxyXG4gICAgICAgICAgLy8gV2UgbmVlZCB0byBhdHRlbXB0IHRvIHBhcmsgb24gbGFzdHBhcmtlZEN0cmwgYW5kIHdhaXQgdGhlcmVcclxuICAgICAgICAgIGxldCBsYXN0UGFya2VkQ29udHJvbDogTWdDb250cm9sID0gPE1nQ29udHJvbD50aGlzLl90YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICBpZihsYXN0UGFya2VkQ29udHJvbCAhPT0gbnVsbClcclxuICAgICAgICAgICAgYXdhaXQgbGFzdFBhcmtlZENvbnRyb2wuaW52b2tlKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBSRUNPVkVSWV9BQ1RfQkVHSU5fU0NSRUVOOlxyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0UHJldmVudFJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1BBR0UpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBSRUNPVkVSWV9BQ1RfQkVHSU5fVEFCTEU6XHJcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGFjdGlvbiBpcyBlbmFibGVkIG5vIG1hdHRlciBvdXIgbG9jYXRpb24gaW4gdGhlIHRhYmxlLiBvdGhlcndpc2UsIHJlYyBwcmVmaXggd2lsbCBub3QgYmUgZXhlY3V0ZWQgYWZ0ZXIgcm9sbGJhY2suXHJcbiAgICAgICAgICB0aGlzLl90YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMLCB0cnVlKTtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCk7XHJcbiAgICAgICAgICAvLyBjbGVhciB0aGUgY2FjaGVcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLmdldFRhc2tDYWNoZSgpLmNsZWFyQ2FjaGUoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFN0b3BFeGVjdXRpb24ob3JnU3RvcEV4ZWN1dGlvbik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBpZiAodGVtcG9yYXJ5UmVzZXRJbkN0cmxQcmVmaXgpXHJcbiAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5JbkN0cmxQcmVmaXggPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKG9yZ0FjdGlvbiAhPT0gUkVDT1ZFUllfQUNUX05PTkUpXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbih0cnVlLCBvcmdBY3Rpb24gIT09IFJFQ09WRVJZX0FDVF9CRUdJTl9UQUJMRSA/IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uLkFMTCA6IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uLlNFUlZFUik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVwbGVjaWF0ZXMgdGhlIGN1cnJlbnQgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlcGxpY2F0ZSgpOiBEYXRhVmlldyB7XHJcbiAgICBsZXQgcmVwOiBEYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzKTtcclxuICAgIHJlcC5fcmVjb3Jkc1RhYiA9IHRoaXMuX3JlY29yZHNUYWIucmVwbGljYXRlKCk7XHJcbiAgICByZXAuX2N1cnJSZWNJZCA9IHJlcC5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCgwKS5nZXRJZCgpO1xyXG4gICAgcmVwLl9jdXJyUmVjSWR4ID0gMDtcclxuICAgIHJlcC5DdXJyUmVjID0gcmVwLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KDApO1xyXG4gICAgcmVwLl9wcmV2Q3VyclJlYyA9IHJlcC5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCgwKTtcclxuICAgIHJlcC5fb3JpZ2luYWwgPSByZXAuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgoMCk7XHJcbiAgICByZXAuc2V0VG9wUmVjSWR4KEludDMyLk1pblZhbHVlKTtcclxuICAgIC8vIHdlIG11c3QgY2hlY2sgZGNWYWxzIGlmIGl0IG5lZWQgdG8gYmUgcmVwbGljYXRlZCBhcyB3ZWxsIGN1cnJlbnR5IHdlIHRoaW5rIG5vdFxyXG4gICAgcmV0dXJuIHJlcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBkdlBvcyB2YWx1ZSBub24gaGFzaGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXREdlBvc1ZhbHVlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZHZQb3NWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpcyBpdCBpcyB0aGUgZmlyc3QgdGltZSB0aGUgZC52IGlzIHBhcnNlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Rmlyc3REdigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9maXJzdER2O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBkLnYgaXMgcGFyc2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBSZXNldEZpcnN0RHYoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9maXJzdER2ID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoaXMgZGF0YXZpZXcgY2FjaGUgdGltZSBzdGFtcFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q2FjaGVMUlUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jYWNoZUxydVRpbWVTdGFtcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSB0aW1lIHN0YW1wIG9mIHRoZSBkYXRhdmlld1xyXG4gIC8vLyAgIHVzZWQgd2hlbiBpbnNlcnRpbmcgZGF0YXZpZXcgaW4gY2FjaGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldENhY2hlTFJVKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FjaGVMcnVUaW1lU3RhbXAgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG5ld3MgdG8gdGFrZSB0aGUgdmFsdWVzIGZyb20gdGhlIGdpdmVuIGR2IGFuZCB0byBzZXQgdGhlbSBhcyB0aGUgY3VycmVudCB2YWx1ZXNcclxuICAvLy8gICB0aGUgZ2l2ZW4gZHYgaXMgdXN1YWxseSBjcmVhdGVkIHZpYSBkYXRhdmlldy5yZXBsaWNhdGUoKVxyXG4gIC8vLyAgIHRoaXMgbWV0aG9kIGRvZXMgbm90IHRha2UgdGhlIHZhbHVlcyBvZiAgbGFzdFNlc3Npb25Db3VudCBhbmQgY2FjaGVMUlVUaW1lU3RhbXBcclxuICAvLy8gICBmcm9tIHRoZSBnaXZlbiBkdiBzaW5jZSB0aGV5IHNob3VsZCBiZSBwcm9wYWdhdGVkIGZyb20gb25lIGN1cnJlbnQgZHYgdG8gdGhlIG90aGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBzZXRTYW1lQXMobmV3RHY6IERhdGFWaWV3KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9ybVNpemUgPSBuZXdEdi5fcm1TaXplO1xyXG4gICAgdGhpcy5fcm1JZHggPSBuZXdEdi5fcm1JZHg7XHJcbiAgICB0aGlzLl9jb21wdXRlQnkgPSBuZXdEdi5fY29tcHV0ZUJ5O1xyXG4gICAgdGhpcy5fZmx1c2hVcGRhdGVzID0gbmV3RHYuX2ZsdXNoVXBkYXRlcztcclxuICAgIHRoaXMuX2N1cnJSZWNJZCA9IG5ld0R2Ll9jdXJyUmVjSWQ7XHJcbiAgICB0aGlzLl9jdXJyUmVjSWR4ID0gbmV3RHYuX2N1cnJSZWNJZHg7XHJcbiAgICB0aGlzLl90b3BSZWNJZCA9IG5ld0R2Ll90b3BSZWNJZDtcclxuICAgIHRoaXMuQ3VyclJlYyA9IG5ld0R2LkN1cnJSZWM7XHJcbiAgICB0aGlzLl9vcmlnaW5hbCA9IG5ld0R2Ll9vcmlnaW5hbDtcclxuICAgIHRoaXMuX3ByZXZDdXJyUmVjID0gbnVsbDtcclxuICAgIHRoaXMuX2ZpZWxkc1RhYiA9IG5ld0R2Ll9maWVsZHNUYWI7XHJcbiAgICB0aGlzLl9yZWNvcmRzVGFiID0gbmV3RHYuX3JlY29yZHNUYWI7XHJcbiAgICB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIgPSBuZXdEdi5fbW9kaWZpZWRSZWNvcmRzVGFiO1xyXG4gICAgdGhpcy5faW5jbHVkZXNGaXJzdCA9IG5ld0R2Ll9pbmNsdWRlc0ZpcnN0O1xyXG4gICAgdGhpcy5faW5jbHVkZXNMYXN0ID0gbmV3RHYuX2luY2x1ZGVzTGFzdDtcclxuICAgIHRoaXMuX2luc2VydEF0ID0gbmV3RHYuX2luc2VydEF0O1xyXG4gICAgdGhpcy5fbGFzdENyZWF0ZWRSZWNJZCA9IG5ld0R2Ll9sYXN0Q3JlYXRlZFJlY0lkO1xyXG4gICAgdGhpcy5fdGFzayA9IG5ld0R2Ll90YXNrO1xyXG4gICAgdGhpcy5fZGNWYWxzQ29sbGVjdGlvbiA9IG5ld0R2Ll9kY1ZhbHNDb2xsZWN0aW9uO1xyXG4gICAgdGhpcy5fcmVjb3ZlcnkgPSBuZXdEdi5fcmVjb3Zlcnk7XHJcbiAgICB0aGlzLl9wZW5kaW5nUmVjb3ZlcnkgPSBuZXdEdi5fcGVuZGluZ1JlY292ZXJ5O1xyXG4gICAgdGhpcy5faGFzTWFpblRhYmxlID0gbmV3RHYuX2hhc01haW5UYWJsZTtcclxuICAgIHRoaXMuX2NodW5rU2l6ZSA9IG5ld0R2Ll9jaHVua1NpemU7XHJcbiAgICB0aGlzLl9maXJzdER2ID0gbmV3RHYuX2ZpcnN0RHY7XHJcbiAgICB0aGlzLl9sYXN0U2Vzc2lvbkNvdW50ZXIgPSBuZXdEdi5fbGFzdFNlc3Npb25Db3VudGVyO1xyXG4gICAgdGhpcy5fc2tpcFBhcnNpbmcgPSBuZXdEdi5fc2tpcFBhcnNpbmc7XHJcbiAgICB0aGlzLl91bmtub3duUmNtcCA9IG5ld0R2Ll91bmtub3duUmNtcDtcclxuICAgIHRoaXMuX3RyYW5zQ2xlYXJlZCA9IG5ld0R2Ll90cmFuc0NsZWFyZWQ7XHJcbiAgICB0aGlzLl9kdlBvc1ZhbHVlID0gbmV3RHYuX2R2UG9zVmFsdWU7XHJcbiAgICB0aGlzLl9jYWNoZUxydVRpbWVTdGFtcCA9IG5ld0R2Ll9jYWNoZUxydVRpbWVTdGFtcDtcclxuICAgIHRoaXMuX2NoYW5nZWQgPSBuZXdEdi5fY2hhbmdlZDtcclxuICAgIHRoaXMuX2xvY2F0ZUZpcnN0UmVjID0gbmV3RHYuX2xvY2F0ZUZpcnN0UmVjO1xyXG4gICAgc3VwZXIuc2V0RW1wdHlEYXRhdmlldyhuZXdEdi5pc0VtcHR5RGF0YXZpZXcoKSk7XHJcbiAgICB0aGlzLl90YXNrLnNldE1vZGUobmV3RHYudGFza01vZGVGcm9tQ2FjaGUpO1xyXG5cclxuICAgIC8vIFVQREFURSBUSEUgVEFCTEUgRElTUExBWVxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLkhhc0xvYWN0ZSgpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjKHRoaXMuX2xvY2F0ZUZpcnN0UmVjLCB0cnVlKTtcclxuICAgICAgICB0aGlzLnNldFRvcFJlY0lkeCh0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0lkeCh0aGlzLl9sb2NhdGVGaXJzdFJlYykpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZ2V0VGFzaygpLnNldFByZXZlbnRSZWNvcmRTdWZmaXgodHJ1ZSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgoSW50MzIuTWluVmFsdWUsIHRydWUsIGZhbHNlLCB0cnVlLCBJbnQzMi5NaW5WYWx1ZSk7XHJcbiAgICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5fdGFzay5nZXRGb3JtKCkuaXNTY3JlZW5Nb2RlKCkpIHtcclxuICAgICAgICBpZiAoKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgICAgICB0aGlzLlRvdGFsUmVjb3Jkc0NvdW50ID0gbmV3RHYuVG90YWxSZWNvcmRzQ291bnQ7XHJcbiAgICAgICAgICB0aGlzLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA9IG5ld0R2LlJlY29yZHNCZWZvcmVDdXJyZW50VmlldztcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgodGhpcy5fdG9wUmVjSWR4LCB0cnVlLCBmYWxzZSwgdHJ1ZSwgSW50MzIuTWluVmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5fdGFzay5nZXRGb3JtKCkgIT09IG51bGwpXHJcbiAgICAgICAgKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZygnd3JvbmcgdG9wIHJlY29yZCBpZHggaW4gRGF0YVZpZXcuc2V0U2FtZUFzJyArIGV4Lk1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBleDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldENoYW5nZWQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jaGFuZ2VkID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2hhbmdlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgZ2V0TG9jYXRlRmlyc3RSZWMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9sb2NhdGVGaXJzdFJlYztcclxuICB9XHJcblxyXG4gIHNldExvY2F0ZUZpcnN0UmVjKG5ld0ZpcnN0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xvY2F0ZUZpcnN0UmVjID0gbmV3Rmlyc3Q7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBhIHJlY29yZCBieSBpdHMgaWR4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRSZWNCeUlkeChpZHg6IG51bWJlcik6IFJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeChpZHgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VydmVyQ3VyclJlYygpOiBSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHNUYWIuZ2V0U2VydmVyQ3VyclJlYygpO1xyXG4gIH1cclxuXHJcbiAgemVyb1NlcnZlckN1cnJSZWMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZWNvcmRzVGFiLnplcm9TZXJ2ZXJDdXJyUmVjKCk7XHJcbiAgfVxyXG5cclxuICBpblJvbGxiYWNrKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGluUm9sbGJhY2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fcmVjb3ZlcnkgPT09IENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JPTExCQUNLIC8qJ1InKi8gJiYgdGhpcy5nZXRUYXNrKCkuaXNUcmFuc2FjdGlvbk93bmVyKCkpIHtcclxuICAgICAgaW5Sb2xsYmFjayA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5Sb2xsYmFjaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWRcIj4gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IDwvcmV0dXJucz5cclxuICBnZXRSZWNJZHgoaWQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNJZHgoaWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJhY2t1cCBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYmFja3VwQ3VycmVudCgpOiBSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuQ3VyclJlYy5yZXBsaWNhdGUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXN0b3JlIGN1cnJlbnQgcmVjb3JkIGZyb20gYmFja3VwXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY0JhY2t1cFwiPmJhY2t1cCBvZiBwcmV2aW91cyBjdXJyZW50IHJlY29yZCA8L3BhcmFtPlxyXG4gIHJlc3RvcmVDdXJyZW50KHJlY0JhY2t1cDogUmVjb3JkKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQocmVjQmFja3VwICE9PSBudWxsKTtcclxuICAgIHRoaXMuX2N1cnJSZWNJZCA9IHJlY0JhY2t1cC5nZXRJZCgpO1xyXG4gICAgdGhpcy5fY3VyclJlY0lkeCA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjSWR4KHRoaXMuX2N1cnJSZWNJZCk7XHJcbiAgICB0aGlzLkN1cnJSZWMgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KHRoaXMuX2N1cnJSZWNJZHgpO1xyXG4gICAgdGhpcy5DdXJyUmVjLnNldFNhbWVBcyhyZWNCYWNrdXAsIGZhbHNlKTtcclxuICAgIHRoaXMudGFrZUZsZFZhbHNGcm9tQ3VyclJlYygpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJuIHRoZSBpZCBvZiB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0Q3VycmVudFJlY0lkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyclJlY0lkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBkYXRhdmlldyBib3VuZGFyaWVzIGFyZSBjaGFuZ2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvcmdJbmNsdWRlc0ZpcnN0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvcmdJbmNsdWRlc0xhc3RcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgRGF0YXZpZXdCb3VuZHJpZXNBcmVDaGFuZ2VkKG9yZ0luY2x1ZGVzRmlyc3Q6IGJvb2xlYW4sIG9yZ0luY2x1ZGVzTGFzdDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIG9yZ0luY2x1ZGVzRmlyc3QgIT09IHRoaXMuSW5jbHVkZXNGaXJzdCgpIHx8IG9yZ0luY2x1ZGVzTGFzdCAhPT0gdGhpcy5JbmNsdWRlc0xhc3QoKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHJvdXRlIHBhcmFtc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgR2V0Um91dGVQYXJhbXMoKTogTGlzdDxhbnk+IHtcclxuICAgIGxldCBwYXJhbXM6IExpc3Q8YW55PiA9IG5ldyBMaXN0KCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2ZpZWxkc1RhYi5nZXRTaXplKCk7IGkrKykge1xyXG5cclxuICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD50aGlzLl9maWVsZHNUYWIuZ2V0RmllbGQoaSk7XHJcbiAgICAgIGxldCB2YWw6IGFueTtcclxuICAgICAgaWYgKGZpZWxkLklzRXhwb3NlZFJvdXRlUGFyYW0gJiYgIWZpZWxkLmlzTnVsbCgpKSB7XHJcbiAgICAgICAgc3dpdGNoIChmaWVsZC5nZXRUeXBlKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6IHtcclxuICAgICAgICAgICAgdmFsID0gZmllbGQuZ2V0RGlzcFZhbHVlKCk7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5pc051bGwoKSlcclxuICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5nZXROdWxsRGlzcGxheSgpO1xyXG4gICAgICAgICAgICB2YWwgPSB2YWwudHJpbSgpO1xyXG4gICAgICAgICAgICBwYXJhbXMucHVzaCgoPHN0cmluZz52YWwpLmxlbmd0aCA9PT0gMCA/ICcgJyA6IHZhbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjoge1xyXG4gICAgICAgICAgICBpZiAoZmllbGQuaXNOdWxsKCkpXHJcbiAgICAgICAgICAgICAgcGFyYW1zLnB1c2goZmFsc2UpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgcGFyYW1zLnB1c2goKGZpZWxkLmdldERpc3BWYWx1ZSgpKS5jaGFyQXQoMCkgPT09ICcxJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOiB7XHJcbiAgICAgICAgICAgIHZhbCA9IGZpZWxkLmdldERpc3BWYWx1ZSgpO1xyXG4gICAgICAgICAgICBpZiAoZmllbGQuaXNOdWxsKCkpXHJcbiAgICAgICAgICAgICAgdmFsID0gZmllbGQuZ2V0TnVsbERpc3BsYXkoKTtcclxuICAgICAgICAgICAgbGV0IHBpYzogUElDID0gbmV3IFBJQyhmaWVsZC5nZXRQaWN0dXJlKCksIGZpZWxkLmdldFR5cGUoKSwgdGhpcy5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgICAgICAgICAgdmFsID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKHZhbCwgJycsIHBpYywgdHJ1ZSwgMCwgZmFsc2UpO1xyXG4gICAgICAgICAgICBwYXJhbXMucHVzaCh2YWwpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAocGFyYW1zLmxlbmd0aCA+IDApID8gcGFyYW1zIDogbnVsbDtcclxuICB9XHJcbn1cclxuIl19
|