@magic-xpa/engine 4.801.0-dev481.239 → 4.801.0-dev481.243

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.
@@ -1,5 +1,5 @@
1
1
  import { __awaiter } from "tslib";
2
- import { Debug, HashUtils, List, NNumber, NString, RefParam, Stack, StringBuilder } from '@magic-xpa/mscorelib';
2
+ import { Debug, HashUtils, List, NNumber, NString, RefParam, Stack, StringBuilder, isNullOrUndefined } from '@magic-xpa/mscorelib';
3
3
  import { Constants, InternalInterface, Logger, Logger_LogLevels, StorageAttribute, StrUtil, WindowType, XMLConstants, XmlParser } from '@magic-xpa/utils';
4
4
  import { Commands, DataModificationTypes, DisplayConvertor, Events, GuiDataCollection, Helps, Manager, NUM_TYPE, PIC, PropInterface, RecordUtils, RuntimeContextBase, Styles, TaskDefinitionId } from '@magic-xpa/gui';
5
5
  import { DataView } from '../data/DataView';
@@ -36,7 +36,6 @@ import { LastFocusedManager } from '../rt/LastFocusedManager';
36
36
  import { GlobalCommandsManager } from '../GlobalCommandsManager';
37
37
  import { EventsAllowedType } from '../event/IEventsManager';
38
38
  import { AccessHelper } from '../AccessHelper';
39
- import { isNullOrUndefined } from 'util';
40
39
  import { MGDataCollection } from './MGDataCollection';
41
40
  import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
42
41
  import { EventHandlerPosition } from '../event/EventHandlerPosition';
@@ -2599,4 +2598,4 @@ export class Task extends TaskBase {
2599
2598
  }
2600
2599
  Task.StartProgLevel = 0;
2601
2600
  Task._idleTimerStarted = false;
2602
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvdGFza3MvVGFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RyxPQUFPLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixPQUFPLEVBRVAsVUFBVSxFQUNWLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsUUFBUSxFQUNSLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsTUFBTSxFQUVOLGlCQUFpQixFQUNqQixLQUFLLEVBRUwsT0FBTyxFQUdQLFFBQVEsRUFDUixHQUFHLEVBRUgsYUFBYSxFQUNiLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsTUFBTSxFQUNOLGdCQUFnQixFQUNqQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFeEMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFDL0UsT0FBTyxFQUF3Qix3Q0FBd0MsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3pHLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVsRCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFDLGNBQWMsRUFB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TUFBTSxDQUFPLG1CQUFtQixDQUFDLGlCQUEwQjs7WUFFakUsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ25FLElBQUksR0FBRyxHQUFXLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV4RCxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLFVBQVU7b0JBQ2hDLFNBQVM7Z0JBRVgsSUFBSSxVQUFVLEdBQVcsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUMzQyxJQUFJLElBQUksR0FBUyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLE1BQU0sR0FBbUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUU1QyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLG1CQUFtQixFQUFFO3dCQUNuRixNQUFNLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO3dCQUNuQyxJQUFJLENBQUMsaUJBQWlCOzRCQUNsQixNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ3RFO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDO0tBQUE7O0FBaHVITSxtQkFBYyxHQUFXLENBQUMsQ0FBQztBQUVuQixzQkFBaUIsR0FBWSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RlYnVnLCBIYXNoVXRpbHMsIExpc3QsIE5OdW1iZXIsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdGFjaywgU3RyaW5nQnVpbGRlcn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTG9nZ2VyX0xvZ0xldmVscyxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgVW5pcXVlVHNrU29ydCxcclxuICBXaW5kb3dUeXBlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBDb21tYW5kcyxcclxuICBEYXRhTW9kaWZpY2F0aW9uVHlwZXMsXHJcbiAgRGlzcGxheUNvbnZlcnRvcixcclxuICBFdmVudHMsXHJcbiAgRmllbGREZWYsXHJcbiAgR3VpRGF0YUNvbGxlY3Rpb24sXHJcbiAgSGVscHMsXHJcbiAgSVRhc2ssXHJcbiAgTWFuYWdlcixcclxuICBNZ0NvbnRyb2xCYXNlLFxyXG4gIE1nRm9ybUJhc2UsXHJcbiAgTlVNX1RZUEUsXHJcbiAgUElDLFxyXG4gIFByb3BlcnR5LFxyXG4gIFByb3BJbnRlcmZhY2UsXHJcbiAgUmVjb3JkVXRpbHMsXHJcbiAgUnVudGltZUNvbnRleHRCYXNlLFxyXG4gIFN0eWxlcyxcclxuICBUYXNrRGVmaW5pdGlvbklkXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge0V2ZW50fSBmcm9tICcuLi9ldmVudC9FdmVudCc7XHJcbmltcG9ydCB7RGF0YVZpZXd9IGZyb20gJy4uL2RhdGEvRGF0YVZpZXcnO1xyXG5pbXBvcnQge0R2Q2FjaGV9IGZyb20gJy4uL2RhdGEvRHZDYWNoZSc7XHJcbmltcG9ydCB7TUdEYXRhfSBmcm9tICcuL01HRGF0YSc7XHJcbmltcG9ydCB7RGF0YVZpZXdDb21tYW5kVHlwZX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvRGF0YXZpZXdDb21tYW5kJztcclxuaW1wb3J0IHtDb21tYW5kc1Byb2Nlc3NvckJhc2UsIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb259IGZyb20gJy4uL0NvbW1hbmRzUHJvY2Vzc29yQmFzZSc7XHJcbmltcG9ydCB7VGFza1NlcnZpY2VCYXNlfSBmcm9tICcuL1Rhc2tTZXJ2aWNlQmFzZSc7XHJcbmltcG9ydCB7QXJndW1lbnRzTGlzdH0gZnJvbSAnLi4vcnQvQXJndW1lbnRzTGlzdCc7XHJcbmltcG9ydCB7VGFza1RyYW5zYWN0aW9uTWFuYWdlcn0gZnJvbSAnLi4vZGF0YS9UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyJztcclxuaW1wb3J0IHtEYXRhdmlld01hbmFnZXJ9IGZyb20gJy4uL2RhdGEvRGF0YXZpZXdNYW5hZ2VyJztcclxuaW1wb3J0IHtTb3J0Q29sbGVjdGlvbn0gZnJvbSAnLi9zb3J0L1NvcnRDb2xsZWN0aW9uJztcclxuaW1wb3J0IHtTb3J0fSBmcm9tICcuL3NvcnQvU29ydCc7XHJcbmltcG9ydCB7TWdGb3JtfSBmcm9tICcuLi9ndWkvTWdGb3JtJztcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gJy4uL2d1aS9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQge1JlbW90ZVRhc2tTZXJ2aWNlfSBmcm9tICcuL1JlbW90ZVRhc2tTZXJ2aWNlJztcclxuaW1wb3J0IHtSZXR1cm5SZXN1bHR9IGZyb20gJy4uL3V0aWwvUmV0dXJuUmVzdWx0JztcclxuaW1wb3J0IHtSdW5UaW1lRXZlbnR9IGZyb20gJy4uL2V2ZW50L1J1blRpbWVFdmVudCc7XHJcbmltcG9ydCB7SUNsaWVudENvbW1hbmR9IGZyb20gJy4uL2NvbW1hbmRzL0lDbGllbnRDb21tYW5kJztcclxuaW1wb3J0IHtDb21tYW5kRmFjdG9yeX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvQ29tbWFuZEZhY3RvcnknO1xyXG5pbXBvcnQge0RhdGF2aWV3SGVhZGVyc30gZnJvbSAnLi4vcnQvRGF0YXZpZXdIZWFkZXJzJztcclxuaW1wb3J0IHtUcmFuc2FjdGlvbn0gZnJvbSAnLi4vcnQvVHJhbnNhY3Rpb24nO1xyXG5pbXBvcnQge1Rhc2tzVGFibGV9IGZyb20gJy4vVGFza3NUYWJsZSc7XHJcbmltcG9ydCB7SUNsaWVudFRhcmdldGVkQ29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvSUNsaWVudFRhcmdldGVkQ29tbWFuZCc7XHJcbmltcG9ydCB7SGFuZGxlcnNUYWJsZX0gZnJvbSAnLi4vcnQvSGFuZGxlcnNUYWJsZSc7XHJcbmltcG9ydCB7UmVjb21wdXRlVGFibGV9IGZyb20gJy4uL3J0L1JlY29tcHV0ZVRhYmxlJztcclxuaW1wb3J0IHtFeHBUYWJsZX0gZnJvbSAnLi4vZXhwL0V4cFRhYmxlJztcclxuaW1wb3J0IHtVc2VyRXZlbnRzVGFibGV9IGZyb20gJy4uL2V2ZW50L1VzZXJFdmVudHNUYWJsZSc7XHJcbmltcG9ydCB7Rm9ybXNUYWJsZX0gZnJvbSAnLi4vZ3VpL0Zvcm1zVGFibGUnO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9yUXVldWV9IGZyb20gJy4uL3V0aWwvRmxvd01vbml0b3JRdWV1ZSc7XHJcbmltcG9ydCB7RmllbGR9IGZyb20gJy4uL2RhdGEvRmllbGQnO1xyXG5pbXBvcnQge0FjdGlvbk1hbmFnZXJ9IGZyb20gJy4uL2V2ZW50L0FjdGlvbk1hbmFnZXInO1xyXG5pbXBvcnQge0NvbnN0SW50ZXJmYWNlfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7RXZlbnRIYW5kbGVyfSBmcm9tICcuLi9ldmVudC9FdmVudEhhbmRsZXInO1xyXG5pbXBvcnQge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cC9FeHByZXNzaW9uJztcclxuaW1wb3J0IHtGaWVsZHNUYWJsZUV4dCBhcyBGaWVsZHNUYWJsZX0gZnJvbSAnLi4vZGF0YS9GaWVsZHNUYWJsZSc7XHJcbmltcG9ydCB7R1VJTWFuYWdlcn0gZnJvbSAnLi4vR1VJTWFuYWdlcic7XHJcbmltcG9ydCB7Q29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyfSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3Nvck1hbmFnZXInO1xyXG5pbXBvcnQge1JlY29yZH0gZnJvbSAnLi4vZGF0YS9SZWNvcmQnO1xyXG5pbXBvcnQge0V2ZW50U3ViVHlwZX0gZnJvbSAnLi4vZW51bXMnO1xyXG5pbXBvcnQge09wZW5pbmdUYXNrRGV0YWlscywgVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLCBUYXNrQmFzZSwgVXNlclJhbmdlfSBmcm9tICcuL1Rhc2tCYXNlJztcclxuaW1wb3J0IHtMYW5ndWFnZURhdGF9IGZyb20gJy4uL2Vudi9MYW5ndWFnZURhdGEnO1xyXG5pbXBvcnQge0Vudmlyb25tZW50fSBmcm9tICcuLi9lbnYvRW52aXJvbm1lbnQnO1xyXG5pbXBvcnQge0xhc3RGb2N1c2VkTWFuYWdlcn0gZnJvbSAnLi4vcnQvTGFzdEZvY3VzZWRNYW5hZ2VyJztcclxuaW1wb3J0IHtHbG9iYWxDb21tYW5kc01hbmFnZXJ9IGZyb20gJy4uL0dsb2JhbENvbW1hbmRzTWFuYWdlcic7XHJcbmltcG9ydCB7RXZlbnRzQWxsb3dlZFR5cGV9IGZyb20gJy4uL2V2ZW50L0lFdmVudHNNYW5hZ2VyJztcclxuaW1wb3J0IHtDcmVhdGVkRm9ybVZlY3Rvcn0gZnJvbSAnLi4vZ3VpL0NyZWF0ZWRGb3JtVmVjdG9yJztcclxuaW1wb3J0IHtBY2Nlc3NIZWxwZXJ9IGZyb20gJy4uL0FjY2Vzc0hlbHBlcic7XHJcbmltcG9ydCB7SU1HRGF0YUNvbGxlY3Rpb259IGZyb20gJy4vSU1HRGF0YUNvbGxlY3Rpb24nO1xyXG5pbXBvcnQge2lzTnVsbE9yVW5kZWZpbmVkfSBmcm9tICd1dGlsJztcclxuaW1wb3J0IHtNR0RhdGFDb2xsZWN0aW9ufSBmcm9tICcuL01HRGF0YUNvbGxlY3Rpb24nO1xyXG5pbXBvcnQge1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yfSBmcm9tIFwiLi4vcmVtb3RlL1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yXCI7XHJcbmltcG9ydCB7RXZlbnRIYW5kbGVyUG9zaXRpb259IGZyb20gJy4uL2V2ZW50L0V2ZW50SGFuZGxlclBvc2l0aW9uJztcclxuXHJcbmV4cG9ydCBlbnVtIFRhc2tfRmxvdyB7XHJcbiAgTk9ORSxcclxuICBTVEVQLFxyXG4gIEZBU1RcclxufVxyXG5cclxuZXhwb3J0IGVudW0gVGFza19EaXJlY3Rpb24ge1xyXG4gIEJBQ0sgPSAtMSxcclxuICBOT05FLFxyXG4gIEZPUkVcclxufVxyXG5cclxuZW51bSBGbG93TW9kZURpciB7XHJcbiAgTk9ORSA9ICcgJyxcclxuICBGQVNUX0JBQ0tXQVJEID0gJ1InLFxyXG4gIEZBU1RfRk9SV0FSRCA9ICdGJyxcclxuICBTVEVQX0JBQ0tXQVJEID0gJ1AnLFxyXG4gIFNURVBfRk9SV0FSRCA9ICdOJ1xyXG59XHJcblxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgVGFzayBleHRlbmRzIFRhc2tCYXNlIHtcclxuICBwcml2YXRlIF9kdkNhY2hlOiBEdkNhY2hlID0gbnVsbDtcclxuICBwcml2YXRlIF9tZ0RhdGE6IE1HRGF0YSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfYWJvcnRpbmc6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSBpZiBhbiBhYm9ydCBjb21tYW5kIHdhcyBleGVjdXRlZCBmb3IgdGhpcyB0YXNrIG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzXHJcbiAgcHJpdmF0ZSBfYkV4ZWNFbmRUYXNrOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNTdGFydGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZXZhbE9sZFZhbHVlczogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgLy8gaW5kaWNhdGVzIGZvciB0aGUgZ2V0IHZhbHVlIHRvIGdldCB0aGUgb2xkIHZhbHVlIG9mIHRoZSBmaWVsZFxyXG4gIHByaXZhdGUgX2luUmVjb3JkU3VmZml4OiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgIC8vIGluZGljYXRlIHdlIGFyZSBpbiByZWNvcmQgc3VmZml4IChoYW5kbGUgYmVmb3JlKVxyXG4gIHByaXZhdGUgX2NhbmNlbFdhc1JhaXNlZDogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgIC8vIHdhcyBjYW5jZWwvcXVpdCBldmVudCByYWlzZWQgP1xyXG4gIHByaXZhdGUgX2NvdW50ZXI6IG51bWJlciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlYXNlcyBvbmx5IGluIG5vbiBpbnRlcnZhbCB0YXNrcy5cclxuICBwcml2YXRlIF9jdXJyU3RhcnRQcm9nTGV2ZWw6IG51bWJlciA9IDA7ICAgICAgICAgICAgICAvLyB0aGUgbGV2ZWwgb2Ygc3RhcnRQcm9nIHJlcXVlc3QgaW4gd2hpY2ggd2UgdGFzayBpcyBzdGFydGVkXHJcbiAgcHJpdmF0ZSBfZGVzdGluYXRpb25TdWJmb3JtOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgLy8gaWYgVFJVRSwgdGhlIHRhc2sgaXMgYSBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2tcclxuICBwcml2YXRlIF9lbmFibGVab29tSGFuZGxlcjogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAvLyBpZiBUUlVFLCB0aGVyZSBpcyBhIHpvb20gaGFuZGxlciBmb3IgdGhpcyBmaWVsZFxyXG4gIHByaXZhdGUgX2ZpcnN0UmVjb3JkQ3ljbGU6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHdlIGFyZSBpbiB0aGUgZmlyc3QgcmVjb3JkIGN5Y2xlXHJcbiAgcHJpdmF0ZSBfb3JpZ2luYWxUYXNrTW9kZTogc3RyaW5nID0gJyAnO1xyXG4gIHByaXZhdGUgX2luQ3JlYXRlTGluZTogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgIC8vIGlzIHRoZSB0YXNrIGludG8gcHJvY2Vzc2luZyBDUkVBVEUgTElORVxyXG4gIHB1YmxpYyBJblNlbGVjdDogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlIHdoZW4gdGhlIHRhc2sgaXMgZXhlY3V0aW5nIGEgU0VMRUNUIGludGVybmFsIGV2ZW50XHJcbiAgcHVibGljIEluU3RhcnRQcm9jZXNzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNEZXN0aW5hdGlvbkNhbGw6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgLy8gaWYgVFJVRSwgdGhlIHRhc2sgaXMgYSBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2sgYnkgY2FsbCBvcGVyYXRpb25cclxuICBwcml2YXRlIF9rbm93blRvU2VydmVyOiBib29sZWFuID0gdHJ1ZTsgICAgICAgICAgICAgICAvLyBGYWxzZSBpZiB0aGUgc2VydmVyIGhhc1xyXG4gIHByaXZhdGUgX2xvb3BTdGFjazogU3RhY2s8bnVtYmVyPiA9IG51bGw7XHJcbiAgcHJpdmF0ZSBhbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbjogYm9vbGVhbjtcclxuICBwdWJsaWMgRGVsYXlDb21tYW5kRXhlY3V0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vLzxzdW1tYXJ5PlxyXG4gIC8vLyBUaGlzIGlzIHRoZSB0YXNrIHdoaWNoIGludm9rZWQgdGhlIGhhbmRsZXIgY29udGFpbmluZyB0aGUgQ2FsbCBvcGVyYXRpb24uXHJcbiAgLy8vIFRoaXMgbWVtYmVyIGlzIHVzZWQgZm9yIHNlYXJjaGluZyB0aGUgdmFyaWFibGVzIGxpa2UgVmFySW5kZXgoKSwgZXRjXHJcbiAgLy8vPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgX3BhcmVudFRhc2s6IFRhc2sgPSBudWxsO1xyXG5cclxuICBwdWJsaWMgZ2V0IFBhcmVudFRhc2soKTogVGFza0Jhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFRhc2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgQ29udGV4dFRhc2s6IFRhc2sgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5kZXIgY29udGV4dCBvZiB3aGljaCB0YXNrIHRoaXMgdGFzayBpcyBjdXJyZW50bHkgcnVubmluZ1xyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVGhpcyBpcyBzYW1lIGFzIF9wYXJlbnRUYXNrIGV4Y2VwdCBmb3IgTW9kYWwgdGFza3MuIEluIGNhc2UsIHRoZSBjdXJyZW50IHRhc2sgaXMgbW9kYWwsIF90cmlnZ2VyaW5nVGFzayByZWZlcnMgdG9cclxuICAvLy8gIHRoZSB0YXNrIHdoaWNoIGludm9rZWQgdGhlIGhhbmRsZXIgb2YgdGhlIF9wYXJlbnRUYXNrLiBUaGlzIG1lbWJlciBpcyB1c2VkIGZvciBhbGwgZ2VuZXJhdGlvbi1iYXNlZCBmdW5jdGlvbnMgYW5kIFByb2coKS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgX3RyaWdnZXJpbmdUYXNrOiBUYXNrID0gbnVsbDsgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSB0byB0aGUgdGFzayB0aGF0IHRyaWdnZXJlZCB0aGUgaGFuZGxlciB3aGljaCBjcmVhdGVkIG1lXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgaXMgdGhlIHRhc2sgd2hpY2ggY29udGFpbmVkIHRoZSBDYWxsIG9wZXJhdGlvbi4gSWYgdGhlIHRhc2sgd2FzIGV4ZWN1dGVkIHdpdGhvdXQgY2FsbFxyXG4gIC8vLyAgIG9wZXJhdGlvbiBlZy4gdGhlIE1QLCB0aGUgc3RhcnR1cCBwcm9ncmFtLCBldGMuLCBpdCByZWZlcnMgdG8gaXRzZWxmLiBUaGlzIG1lbWJlciB1c2VkIHRvIHNlYXJjaCBmb3IgdGhlIGV2ZW50IGhhbmRsZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgUGF0aFBhcmVudFRhc2s6IFRhc2sgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIF9wcmV2ZW50Q29udHJvbENoYW5nZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3ByZXZlbnRSZWNvcmRTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF90YXNrUGF0aDogTGlzdDxUYXNrPiA9IG51bGw7XHJcblxyXG4gIC8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBpcyBjdXJyZW50bHkgdHJ5aW5nIHRvIGNvbW1pdCBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb25cclxuICBwcml2YXRlIF90cnlpbmdUb0NvbW1pdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzZXQgVHJ5aW5nVG9Db21taXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3RyeWluZ1RvQ29tbWl0ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgVHJ5aW5nVG9Db21taXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJ5aW5nVG9Db21taXQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91c2VMb29wU3RhY2s6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZXhwcmVzc2lvbiAoTE9PUENPVU5URVIoKSkgaXMgaW4gdGhlIHNjb3BlIG9mIEJsb2NrIExvb3AuXHJcbiAgcHJpdmF0ZSBfaW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tTYXZlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgSW5IYW5kbGVBY3RDYW5jZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgUnVudGltZVNvcnRzOiBTb3J0Q29sbGVjdGlvbiA9IG51bGw7XHJcbiAgcHVibGljIFZld0ZpcnN0OiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyBkYXRhVmlld0NvbnRlbnQ6IHN0cmluZyA9IG51bGw7ICAgICAgICAgICAgICAgIC8vIGRhdGFWaWV3Q29udGVudCByZXRyaWV2ZWQgYnkgR2V0RGF0YVZpZXdDb250ZW50IGNvbW1hbmQuXHJcbiAgcHVibGljIFBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXg6IGJvb2xlYW4gPSBmYWxzZTsgICAgLy8gSW4gcmVjb3JkIHByZWZpeCAoY29tbW9uSGFuZGxlckJlZm9yZSkgd2UgZXhlY3V0ZSByZWNvcmQgcHJlZml4IG9mIGFsbCBmYXRoZXJzLlxyXG5cclxuICAvLyBCdXQgd2UgZG8gbm90IG5lZWQgaXQgaW4gYWxsIGNhc2VzLlxyXG4gIC8vIFdoZW4gd2UgcmV0dXJuIGZyb20gdGhlIHNlcnZlciB3ZSBkbyBub3QgbmVlZCBpdC5cclxuICAvLyBXaGVuIHdlIGNsaWNrIG9uIHRoZSBuZXN0ZWQgc3ViZm9ybSB3ZSBuZWVkIGl0LlxyXG4gIC8vIGlmIHRydWUsIGRvIHRoZSBwYXJlbnQgc3ViZm9ybSByZWNvcmQgcHJlZml4XHJcblxyXG4gIC8vIC0xIOKAkyBUaGUgdGFzayBpcyBub3QgZXhlY3V0ZWQgYXMgYSBzdWJmb3JtXHJcbiAgLy8gIDAg4oCTIFRoZSB0YXNrIGlzIGV4ZWN1dGVkIGJ5IHNldHRpbmcgdGhlIGZvY3VzIG9uIGl0XHJcbiAgLy8gIDEg4oCTIFRoZSBzdWJ0YXNrIGlzIGV4ZWN1dGVkIGZvciB0aGUgZmlyc3QgdGltZVxyXG4gIC8vICAyIOKAkyBUaGUgdGFzayBpcyBleGVjdXRlZCBiZWNhdXNlIHRoZSBBdXRvbWF0aWMgUmVmcmVzaCBwcm9wZXJ0eVxyXG4gIC8vICAgICAgb3IgdGhlIFN1YmZvcm0gUmVmcmVzaCBldmVudCBoYXMgYmVlbiB0cmlnZ2VyZWRcclxuICBwdWJsaWMgTW9kZUFzUGFyZW50OiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFzayBtb2RlIGlzICdBcyBQYXJlbnQnIHdlIG5lZWQgdG8gY2FyZSBvdXQgaXQgc3BlY2lmaWNhbGx5XHJcbiAgcHVibGljIFRhc2tUcmFuc2FjdGlvbk1hbmFnZXI6IFRhc2tUcmFuc2FjdGlvbk1hbmFnZXIgPSBudWxsO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgc3ViZm9ybSBtdXN0IGJlIHJlZnJlc2hlZCBvbiB0aGUgY2xpZW50LlxyXG4gIC8vLyBSZWxldmFudCBvbmx5IGZvciBub24tb2ZmbGluZSB3aXRoIGxvY2FsIGRhdGEuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgRXhlY3V0ZUNsaWVudFN1YmZvcm1SZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHRhc2sgZXhlY3V0ZXMgQ29tbW9uSGFuZGxlckJlZm9yZSBtZXRob2QuXHJcbiAgLy8vIEZvciBzdWJmb3JtcyB3ZSBkbyBub3QgZXhlY3V0ZSBpdCdzIFJQIGlmIHRoZSBwYXJlbnQgZGlkbid0IGZpbmlzaGVkIHlldFxyXG4gIC8vLyBpdCdzIENvbW1hbmRIYW5kbGVyQmVmb3JlIG1ldGhvZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBJbkNvbW1vbkhhbmRsZXJCZWZvcmVSUDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHJpZXZlIGFuZCByZXR1cm4gYSBzZXJ2aWNlIG9iamVjdCBjb250YWluaW5nIGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyBkaWZmZXJlbnQgaW4gdGhlIHRhc2sgbGV2ZWwgYmV0d2VlbiBjb25uZWN0ZWQgYW5kIG9mZmxpbmUgc3RhdGVzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBfdGFza1NlcnZpY2U6IFRhc2tTZXJ2aWNlQmFzZSA9IG51bGw7XHJcblxyXG4gIGdldCBUYXNrU2VydmljZSgpOiBUYXNrU2VydmljZUJhc2Uge1xyXG4gICAgaWYgKHRoaXMuX3Rhc2tTZXJ2aWNlID09IG51bGwpXHJcbiAgICAgIHRoaXMuX3Rhc2tTZXJ2aWNlID0gbmV3IFJlbW90ZVRhc2tTZXJ2aWNlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tTZXJ2aWNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXRyaWV2ZSBhbmQgcmV0dXJuIGEgY29tbWFuZHMgcHJvY2Vzc29yIGRlcGVuZGluZyBvbiB0YXNrIHR5cGUgYW5kIHN0YXRlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGdldCBDb21tYW5kc1Byb2Nlc3NvcigpOiBDb21tYW5kc1Byb2Nlc3NvckJhc2Uge1xyXG4gICAgcmV0dXJuIENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNMb2NhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHRhc2tEZWZpbml0aW9uSWQ6IFRhc2tEZWZpbml0aW9uSWQgPSBudWxsO1xyXG4gIHB1YmxpYyBBcmd1bWVudHNMaXN0OiBBcmd1bWVudHNMaXN0ID0gbnVsbDsgICAgICAgICAgIC8vIG9mZi1saW5lIGV4ZWN1dGlvbiAtIHRhc2sgYXJndW1lbnQsIHRvIGVuYWJsZSB0aGUgdXBkYXRlIG9mIGZpZWxkIHZhbHVlc1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHBhcmVudCB0YXNrIG9mIHRoZSBzdWJ0YXNrIGJ5IHRvb2xraXQgdHJlZSBpbmNsdWRlIHRoZSBtYWluIHByb2dyYW0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXQgTG9naWNhbFN0dWRpb1BhcmVudFRhc2soKTogVGFzayB7XHJcbiAgICBpZiAodGhpcy5TdHVkaW9QYXJlbnRUYXNrID09PSBudWxsICYmICFzdXBlci5pc01haW5Qcm9nKCkpIHtcclxuICAgICAgcmV0dXJuIDxUYXNrPkd1aURhdGFDb2xsZWN0aW9uLk1HRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgodGhpcy5Db250ZXh0SUQsIHRoaXMuX2N0bElkeCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIDxUYXNrPnRoaXMuU3R1ZGlvUGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIGdldCBLbm93blRvU2VydmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2tub3duVG9TZXJ2ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgQ29uZmlybVVwZGF0ZU5vOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgLy8gb25seSBmb3IgY29uZmlybXMgdXBkYXRlXHJcbiAgcHVibGljIERhdGFTeW5jZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgVW5pcXVlU29ydDogVW5pcXVlVHNrU29ydCA9IG51bGw7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHRoZSB0cmFuc2FjdGlvbiBuZWVkIHRvIGJlIG9uIHRoZSBkYXRhIHZpZXcgbWFuYWdlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0IFRyYW5zYWN0aW9uKHZhbHVlOiBUcmFuc2FjdGlvbikge1xyXG4gICAgdGhpcy5EYXRhdmlld01hbmFnZXIuQ3VycmVudERhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uIHtcclxuICAgIHJldHVybiB0aGlzLkRhdGF2aWV3TWFuYWdlci5DdXJyZW50RGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFJlZnJlc2hPblZhcnM6IG51bWJlcltdID0gbnVsbDtcclxuICBwdWJsaWMgRHZQb3NEZXNjcmlwdG9yOiBMaXN0PHN0cmluZ1tdPiA9IG51bGw7XHJcbiAgcHVibGljIFN1YlRhc2tzOiBUYXNrc1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgRXhwVGFiOiBFeHBUYWJsZSA9IG51bGw7XHJcbiAgcHVibGljIFVzZXJFdnRUYWI6IFVzZXJFdmVudHNUYWJsZSA9IG51bGw7XHJcbiAgcHVibGljIERhdGF2aWV3SGVhZGVyc1RhYmxlOiBEYXRhdmlld0hlYWRlcnMgPSBudWxsO1xyXG4gIHB1YmxpYyBIYW5kbGVyc1RhYjogSGFuZGxlcnNUYWJsZSA9IG51bGw7XHJcbiAgcHVibGljIF9mb3JtczogRm9ybXNUYWJsZSA9IG51bGw7XHJcbiAgcHVibGljIE5hbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHVibGljIFB1YmxpY05hbWU6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRhc2sgc3VmZml4IHdhcyBwZXJmb3JtZWQgZm9yIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIFRhc2tTdWZmaXhFeGVjdXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBnZXQgVGFza0RlZmluaXRpb25JZCgpOiBUYXNrRGVmaW5pdGlvbklkIHtcclxuICAgIGlmICh0aGlzLnRhc2tEZWZpbml0aW9uSWQgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy50YXNrRGVmaW5pdGlvbklkID0gbmV3IFRhc2tEZWZpbml0aW9uSWQodGhpcy5fY3RsSWR4LCB0aGlzLlByb2dyYW1Jc24sIHRoaXMuVGFza0lzbiwgdGhpcy5faXNQcmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudGFza0RlZmluaXRpb25JZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBSZXRydW5WYWx1ZUV4cDogbnVtYmVyID0gMDtcclxuICBwdWJsaWMgU3ViZm9ybUNvbnRyb2w6IE1nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gIHN0YXRpYyBTdGFydFByb2dMZXZlbDogbnVtYmVyID0gMDsgIC8vIHJlY3Vyc2l2ZSBsZXZlbCBvZiBcInN0YXJ0UHJvZ1wiIGludm9jYXRpb25zXHJcblxyXG4gIHByaXZhdGUgc3RhdGljIF9pZGxlVGltZXJTdGFydGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHN0YXRpYyBnZXQgSXNCbG9ja2luZ0JhdGNoKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogVGFzayk7XHJcbiAgY29uc3RydWN0b3IocGFyZW50PzogVGFzaykge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQocGFyZW50KSkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKHBhcmVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIgPSBuZXcgQWN0aW9uTWFuYWdlcih0aGlzKTtcclxuICAgIHRoaXMuRGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcyk7XHJcbiAgICB0aGlzLl9mbG93TW9uaXRvciA9IEZsb3dNb25pdG9yUXVldWUuSW5zdGFuY2U7XHJcbiAgICB0aGlzLkNvbnRleHRUYXNrID0gdGhpcztcclxuICAgIHRoaXMuX2R2Q2FjaGUgPSBuZXcgRHZDYWNoZSh0aGlzKTtcclxuICAgIHRoaXMuUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeCA9IHRydWU7XHJcbiAgICB0aGlzLkRhdGF2aWV3TWFuYWdlciA9IG5ldyBEYXRhdmlld01hbmFnZXIodGhpcyk7XHJcbiAgICB0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgIHRoaXMuVGFza1RyYW5zYWN0aW9uTWFuYWdlciA9IG5ldyBUYXNrVHJhbnNhY3Rpb25NYW5hZ2VyKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLkRhdGFWaWV3LkluaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShwYXJlbnQ6IFRhc2spOiB2b2lkIHtcclxuICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgdGhpcy5QYXRoUGFyZW50VGFzayA9IHBhcmVudDtcclxuICAgIHRoaXMuX3BhcmVudFRhc2sgPSBwYXJlbnQ7XHJcbiAgICB0aGlzLl90cmlnZ2VyaW5nVGFzayA9IG51bGw7XHJcbiAgICB0aGlzLmJ1aWxkVGFza1BhdGgoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBDcmVhdGVUYXNrKCk6IFRhc2tCYXNlIHtcclxuICAgIGxldCB0YXNrID0gIG5ldyBUYXNrKCk7XHJcbiAgICB0YXNrLkluaXQoKTtcclxuICAgIHJldHVybiB0YXNrO1xyXG4gIH1cclxuXHJcbiAgLy8gSVRhc2sgTWVtYmVyc1xyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0ZWxscyB3aGV0aGVyIHRoZSB0YXNrIGlzIGFib3J0aW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0Fib3J0aW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Fib3J0aW5nO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFRhc2tQYXRoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdGFza1BhdGggPSBuZXcgTGlzdDxUYXNrPigpO1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2suX3Rhc2tQYXRoICE9PSBudWxsKVxyXG4gICAgICB0aGlzLl90YXNrUGF0aC5BZGRSYW5nZSh0aGlzLl9wYXJlbnRUYXNrLl90YXNrUGF0aC5HZXRFbnVtZXJhdG9yKCkpO1xyXG4gICAgdGhpcy5fdGFza1BhdGgucHVzaCh0aGlzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHRhc2sgZGF0YSBieSBwYXJzaW5nIHRoZSB4bWwgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nZFwiPnJlZmVyZW5jZSB0byBNR0RhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9wZW5pbmdUYXNrRGV0YWlsc1wiPmFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb2Ygb3BlbmluZyB0YXNrPC9wYXJhbT5cclxuICBhc3luYyBmaWxsRGF0YShtZ2Q6IE1HRGF0YSwgb3BlbmluZ1Rhc2tEZXRhaWxzOiBPcGVuaW5nVGFza0RldGFpbHMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIElmIHRoaXMgdGFzayB3YXMgb3BlbmVkIGJ5IGFuIFwib3BlbiB3aW5kb3dcIiBjb21tYW5kIC0gY29ubmVjdCBoaW0gdG8gaXRzIHBhcmVudFxyXG4gICAgaWYgKCFzdXBlci5pc01haW5Qcm9nKCkpIHtcclxuICAgICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgPT09IG51bGwgJiYgb3BlbmluZ1Rhc2tEZXRhaWxzLkNhbGxpbmdUYXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50VGFzayA9IDxUYXNrPm9wZW5pbmdUYXNrRGV0YWlscy5DYWxsaW5nVGFzaztcclxuICAgICAgICB0aGlzLmJ1aWxkVGFza1BhdGgoKTtcclxuICAgICAgICAoPFRhc2s+b3BlbmluZ1Rhc2tEZXRhaWxzLkNhbGxpbmdUYXNrKS5hZGRTdWJUYXNrKHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLlBhdGhQYXJlbnRUYXNrID09PSBudWxsICYmIG9wZW5pbmdUYXNrRGV0YWlscy5QYXRoUGFyZW50VGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuUGF0aFBhcmVudFRhc2sgPSA8VGFzaz5vcGVuaW5nVGFza0RldGFpbHMuUGF0aFBhcmVudFRhc2s7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGZvciBNR19BQ1RfWk9PTSBhY3Rpb24gZW5hYmxlXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VGFzayAhPT0gbnVsbCAmJiB0aGlzLl9wYXJlbnRUYXNrLmdldEVuYWJsZVpvb21IYW5kbGVyKCkpIHtcclxuICAgICAgdGhpcy5zZXRFbmFibGVab29tSGFuZGxlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX21nRGF0YSA9IG1nZDtcclxuICAgIHRoaXMuZmlsbEF0dHJpYnV0ZXMoKTtcclxuXHJcbiAgICB0aGlzLl9tZ0RhdGEuYWRkVGFzayh0aGlzKTtcclxuXHJcbiAgICBsZXQgcGFyZW50Rm9ybTogTWdGb3JtQmFzZSA9ICh0aGlzLl9wYXJlbnRUYXNrICE9PSBudWxsKSA/IHRoaXMuX3BhcmVudFRhc2suZ2V0Rm9ybSgpIDogbnVsbDtcclxuXHJcbiAgICB3aGlsZSAoYXdhaXQgdGhpcy5pbml0SW5uZXJPYmplY3RzKFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0TmV4dFRhZygpLCBwYXJlbnRGb3JtKSkge1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuVGFza1RyYW5zYWN0aW9uTWFuYWdlci5QcmVwYXJlVHJhbnNhY3Rpb25Qcm9wZXJ0aWVzKHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiwgZmFsc2UpO1xyXG5cclxuICAgIHRoaXMuSGFuZGxlVHJpZ2dlclRhc2soKTtcclxuICAgIHRoaXMuSGFuZGxlUHJldmlvdXNseUFjdGl2ZVRhc2tJZCgpO1xyXG5cclxuICAgIC8vIFNldCBpc1N1YmZvcm0gZmxhZ1xyXG4gICAgdGhpcy5DaGVja0FuZFNldFN1YkZvcm0oKTtcclxuXHJcbiAgICBpZiAodGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgLy8gZ2V0IHRoZSBzdWJmb3JtIGNvbnRyb2wgZnJvbSB0aGUgcGFyZW50IHRhc2tcclxuICAgICAgbGV0IHN1YkZvcm1DdHJsOiBNZ0NvbnRyb2wgPSAoPE1nRm9ybT50aGlzLmdldFBhcmVudCgpLmdldEZvcm0oKSkuZ2V0U3ViRm9ybUN0cmxGb3JUYXNrKHRoaXMuX3Rhc2tUYWcpO1xyXG4gICAgICBpZiAoc3ViRm9ybUN0cmwgIT09IG51bGwpIHtcclxuICAgICAgICBzdWJGb3JtQ3RybC5zZXRTdWJmb3JtVGFza0lkKHRoaXMuX3Rhc2tUYWcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyB1cGRhdGUgdGhlIGZvcm0gd2l0aCB0aGUgc3ViZm9ybSBjb250cm9sIGZyb20gdGhlIHBhcmVudCB0YXNrXHJcbiAgICAgIGlmICh0aGlzLkZvcm0gIT09IG51bGwpIHtcclxuICAgICAgICAoPE1nRm9ybT50aGlzLkZvcm0pLnNldFN1YkZvcm1DdHJsKHN1YkZvcm1DdHJsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIGhhbmRsZSB0aGUgUHJldmlvdXNseUFjdGl2ZVRhc2tJZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgSGFuZGxlUHJldmlvdXNseUFjdGl2ZVRhc2tJZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrICE9PSBudWxsICYmIHRoaXMuX3BhcmVudFRhc2suR2V0Q29udGV4dFRhc2soKSAhPT0gbnVsbCAmJiB0aGlzLl9tZ0RhdGEgIT09IHRoaXMuX3BhcmVudFRhc2suZ2V0TUdEYXRhKCkpXHJcbiAgICAgIHRoaXMuUHJldmlvdXNseUFjdGl2ZVRhc2tJZCA9ICh0aGlzLl9wYXJlbnRUYXNrLkdldENvbnRleHRUYXNrKCkpLmdldFRhc2tUYWcoKTtcclxuICAgIGVsc2UgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT09IG51bGwpXHJcbiAgICAgIHRoaXMuUHJldmlvdXNseUFjdGl2ZVRhc2tJZCA9IHRoaXMuX3BhcmVudFRhc2suZ2V0VGFza1RhZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBoYW5kbGUgdGhlIHRyaWdnZXIgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgSGFuZGxlVHJpZ2dlclRhc2soKTogdm9pZCB7XHJcbiAgICB0aGlzLl90cmlnZ2VyaW5nVGFzayA9IHRoaXMuX3BhcmVudFRhc2s7XHJcbiAgfVxyXG5cclxuICBGaWxsVGFza1RhYmxlcyh0YXNrVGFibGVzRGF0YTogc3RyaW5nKTogdm9pZDtcclxuICBGaWxsVGFza1RhYmxlcygpOiB2b2lkO1xyXG4gIEZpbGxUYXNrVGFibGVzKHRhc2tUYWJsZXNEYXRhPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICB0aGlzLkZpbGxUYXNrVGFibGVzXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5GaWxsVGFza1RhYmxlc18xKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEZpbGxUYXNrVGFibGVzXzAoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSB0YXNrIGF0dHJpYnV0ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGZpbGxBdHRyaWJ1dGVzKCk6IHZvaWQge1xyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlcjtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgc3VwZXIuZmlsbEF0dHJpYnV0ZXMocGFyc2VyKTtcclxuXHJcbiAgICAgIC8vIFFDUiAjNzU5OTExOiBtcHJnIG11c3QgYmVsb25nIHRvIHRoZSBtYWluIGFwcGxpY2F0aW9uJ3MgTUdEYXRhLlxyXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgaXQgd2lsbCBub3QgYmUgZGlzY2FyZGVkIHVudGlsIHRoZSBlbmQgb2YgZXhlY3V0aW9uLlxyXG4gICAgICBpZiAoc3VwZXIuaXNNYWluUHJvZygpKVxyXG4gICAgICAgIHRoaXMuX21nRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoMCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gVGFzay5maWxsQXR0cmlidXRlcygpIG91dCBvZiBzdHJpbmcgYm91bmRzXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdGFzayBhdHRyaWJ1dGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgc2V0QXR0cmlidXRlKGF0dHJpYnV0ZTogc3RyaW5nLCB2YWx1ZVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUYWdQcm9jZXNzZWQ6IGJvb2xlYW47XHJcbiAgICBpc1RhZ1Byb2Nlc3NlZCA9IHN1cGVyLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlU3RyKTtcclxuICAgIGlmICghaXNUYWdQcm9jZXNzZWQpIHtcclxuICAgICAgaXNUYWdQcm9jZXNzZWQgPSB0cnVlO1xyXG4gICAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9SRUZSRVNIT046XHJcbiAgICAgICAgICBpZiAoISh2YWx1ZVN0ci50cmltKCkgPT09IFwiXCIpKVxyXG4gICAgICAgICAgICB0aGlzLlNldFJlZnJlc2hPblZhcnModmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9OQU1FOlxyXG4gICAgICAgICAgdGhpcy5OYW1lID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRFZQT1NfREVDOlxyXG4gICAgICAgICAgaWYgKCEodmFsdWVTdHIudHJpbSgpID09PSBcIlwiKSlcclxuICAgICAgICAgICAgdGhpcy5zZXREZXNjcmlwdG9yKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9IQVNfTE9DQVRFOlxyXG4gICAgICAgICAgdGhpcy5oYXNMb2NhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0FTX1BBUkVOVDpcclxuICAgICAgICAgIHRoaXMuTW9kZUFzUGFyZW50ID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UQVNLX1VOSVFVRV9TT1JUOlxyXG4gICAgICAgICAgdGhpcy5VbmlxdWVTb3J0ID0gPFVuaXF1ZVRza1NvcnQ+dmFsdWVTdHJbMF07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVFJBTlNfSUQ6XHJcbiAgICAgICAgICB0aGlzLnNldFJlbW90ZVRyYW5zYWN0aW9uKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9QVUJMSUM6XHJcbiAgICAgICAgICB0aGlzLlB1YmxpY05hbWUgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JU19PRkZMSU5FOlxyXG4gICAgICAgICAgdGhpcy5Jc09mZmxpbmUgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1JFVFVSTl9WQUxVRV9FWFA6XHJcbiAgICAgICAgICB0aGlzLlJldHJ1blZhbHVlRXhwID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX01FTlVTX0ZJTEVfTkFNRTpcclxuICAgICAgICAgIC8vIFRPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaXNUYWdQcm9jZXNzZWQgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzVGFnUHJvY2Vzc2VkKVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJVbnJlY29nbml6ZWQgYXR0cmlidXRlOiAnezB9J1wiLCBhdHRyaWJ1dGUpKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRvIGFsbG9jYXRlIGFuZCBmaWxsIGlubmVyIG9iamVjdHMgb2YgdGhlIGNsYXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvdW5kVGFnTmFtZVwiPnBvc3NpYmxlIHRhZyBuYW1lICwgbmFtZSBvZiBvYmplY3QsIHdoaWNoIG5lZWQgYmUgYWxsb2NhdGVkPC9wYXJhbT5cclxuICBhc3luYyBpbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZTogc3RyaW5nLCBwYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIGxldCBwYXJzZXI6IFhtbFBhcnNlciA9IFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXI7XHJcbiAgICBzd2l0Y2ggKGZvdW5kVGFnTmFtZSkge1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfSEVMUFRBQkxFOlxyXG4gICAgICAgIGlmICh0aGlzLl9oZWxwVGFiID09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLl9oZWxwVGFiID0gbmV3IEhlbHBzKCk7XHJcblxyXG4gICAgICAgIGlmIChFdmVudHMuU2hvdWxkTG9nKExvZ2dlcl9Mb2dMZXZlbHMuRGV2ZWxvcG1lbnQpKVxyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gLi4uXCIsIGZvdW5kVGFnTmFtZSkpO1xyXG5cclxuICAgICAgICB0aGlzLl9oZWxwVGFiLmZpbGxEYXRhKHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfRFZIRUFERVI6XHJcbiAgICAgICAgaWYgKEV2ZW50cy5TaG91bGRMb2coTG9nZ2VyX0xvZ0xldmVscy5EZXZlbG9wbWVudCkpXHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSAuLi5cIiwgZm91bmRUYWdOYW1lKSk7XHJcblxyXG4gICAgICAgIHRoaXMuRGF0YVZpZXcuZmlsbEhlYWRlckRhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QOlxyXG4gICAgICAgIHRoaXMuX3Byb3BUYWIuZmlsbERhdGEodGhpcywgJ1QnLCBwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX0ZPUk06XHJcbiAgICAgICAgdGhpcy5Gb3JtID0gdGhpcy5Gb3JtSW5pdERhdGEocGFyZW50Rm9ybSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX01FTlVfQ09OVEVOVDpcclxuICAgICAgICAvLyBUT0RPIC0gbm90IHRvIHNlcmlhbGl6ZSBbU3RvcnkgMTU0NTQ3XVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcImFzc2VtYmxpZXNcIjpcclxuICAgICAgICBsZXQgc3RhcnQ6IG51bWJlciA9IHBhcnNlci5nZXRDdXJySW5kZXgoKTtcclxuICAgICAgICBsZXQgZW5kQ29udGV4dCA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZignL2Fzc2VtYmxpZXMnLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCk7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX0ZPUk1TOlxyXG4gICAgICAgIHRoaXMuX2Zvcm1zID0gbmV3IEZvcm1zVGFibGUodGhpcywgcGFyZW50Rm9ybSk7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gLi4uXCIsIGZvdW5kVGFnTmFtZSkpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2Zvcm1zLmZpbGxEYXRhKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19UQVNLOlxyXG4gICAgICAgIGlmICh0aGlzLlN1YlRhc2tzID09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLlN1YlRhc2tzID0gbmV3IFRhc2tzVGFibGUoKTtcclxuICAgICAgICBsZXQgc3VidGFzayA9IG5ldyBUYXNrKHRoaXMpO1xyXG4gICAgICAgIHN1YnRhc2suSW5pdCgpO1xyXG4gICAgICAgIHRoaXMuU3ViVGFza3MuYWRkVGFzayhzdWJ0YXNrKTtcclxuICAgICAgICBsZXQgbWdkOiBNR0RhdGEgPSB0aGlzLl9tZ0RhdGE7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNNYWluUHJvZygpKVxyXG4gICAgICAgICAgbWdkID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldE1HRGF0YUZvclN0YXJ0dXBQcm9ncmFtKCk7XHJcbiAgICAgICAgYXdhaXQgc3VidGFzay5maWxsRGF0YShtZ2QsIG5ldyBPcGVuaW5nVGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkw6XHJcbiAgICAgICAgYXdhaXQgVGFzay5Qcm9jZXNzVGFza1VSTCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19FWFBUQUJMRTpcclxuICAgICAgICBpZiAodGhpcy5FeHBUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuRXhwVGFiID0gbmV3IEV4cFRhYmxlKCk7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIGV4cFwiKTtcclxuICAgICAgICB0aGlzLkV4cFRhYi5maWxsRGF0YSh0aGlzLCBwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19VU0VSX0VWRU5UUzpcclxuICAgICAgICBpZiAodGhpcy5Vc2VyRXZ0VGFiID09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLlVzZXJFdnRUYWIgPSBuZXcgVXNlckV2ZW50c1RhYmxlKCk7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIHVzZXIgZXZlbnQgdGFiXCIpO1xyXG4gICAgICAgIHRoaXMuVXNlckV2dFRhYi5maWxsRGF0YSh0aGlzLCBwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19MSU5LUzpcclxuICAgICAgICB0aGlzLkRhdGF2aWV3SGVhZGVyc1RhYmxlID0gbmV3IERhdGF2aWV3SGVhZGVycyh0aGlzKTtcclxuICAgICAgICB0aGlzLkRhdGF2aWV3SGVhZGVyc1RhYmxlLmZpbGxEYXRhKHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1NPUlRTOlxyXG4gICAgICAgIHRoaXMuUnVudGltZVNvcnRzID0gbmV3IFNvcnRDb2xsZWN0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5SdW50aW1lU29ydHMuZmlsbERhdGEoIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tfVEFCTEVTOlxyXG4gICAgICAgIHRoaXMuRmlsbFRhc2tUYWJsZXMoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX1JFQ09NUFVURTpcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gcmVjb21wdXRlXCIpO1xyXG4gICAgICAgIHRoaXMuUmVjb21wdXRlRmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfRVZFTlRIQU5ETEVSUzpcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gZXZlbnRoYW5kbGVyc1wiKTtcclxuICAgICAgICBpZiAodGhpcy5IYW5kbGVyc1RhYiA9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5IYW5kbGVyc1RhYiA9IG5ldyBIYW5kbGVyc1RhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5IYW5kbGVyc1RhYi5maWxsRGF0YSh0aGlzLCBwYXJzZXIpO1xyXG4gICAgICAgIHRoaXMuYWRkRXhwSGFuZGxlcnNUb01HRGF0YSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IChcIi9cIiArIFhNTENvbnN0YW50cy5NR19UQUdfVEFTSykpIHtcclxuICAgICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiBUYXNrLmluaXRJbm5lck9iamVjdHMgLiBFbnRlciBjYXNlIGZvciBcIiArIGZvdW5kVGFnTmFtZSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBSZWNvbXB1dGVGaWxsRGF0YShwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IHJlY29tcHV0ZVRhYmxlOiBSZWNvbXB1dGVUYWJsZSA9IG5ldyBSZWNvbXB1dGVUYWJsZSgpO1xyXG4gICAgcmVjb21wdXRlVGFibGUuZmlsbERhdGFfMSg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldywgdGhpcywgcGFyc2VyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgRmlsbFRhc2tUYWJsZXNfMSgpOiB2b2lkIHtcclxuICAgIGxldCBwYXJzZXI6IFhtbFBhcnNlciA9IFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXI7XHJcbiAgICAvLyBHZXQgdGhlIGVuZCBvZiB0aGUgdGFzayB0YWJsZSBlbGVtZW50XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLX1RBQkxFU19FTkQsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBlbmRDb250ZXh0ID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIGVuZENvbnRleHQpICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRS5sZW5ndGg7XHJcbiAgICAvLyBnZXQgdGhlIHRhc2sgdGFibGUgeG1sIHN0cmluZ1xyXG4gICAgbGV0IHRhc2tUYWJsZXNEYXRhOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgdGhpcy5GaWxsVGFza1RhYmxlcyh0YXNrVGFibGVzRGF0YSk7XHJcbiAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgaGFuZGxlcnMgdHJpZ2dlcmVkIGJ5IGV4cHJlc3Npb25zIHRvIG1nZGF0YVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhZGRFeHBIYW5kbGVyc1RvTUdEYXRhKCk6IHZvaWQge1xyXG4gICAgbGV0IGlkeDogbnVtYmVyID0gMDtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IHRoaXMuSGFuZGxlcnNUYWIuZ2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IHRoaXMuSGFuZGxlcnNUYWIuZ2V0SGFuZGxlcihpKTtcclxuICAgICAgbGV0IGV2dDogRXZlbnQgPSBoYW5kbGVyLmdldEV2ZW50KCk7XHJcbiAgICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04gfHxcclxuICAgICAgICAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSICYmIGV2dC5nZXRVc2VyRXZlbnRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTikpIHtcclxuICAgICAgICB0aGlzLl9tZ0RhdGEuYWRkRXhwSGFuZGxlcihoYW5kbGVyLCBpZHgpO1xyXG4gICAgICAgIGlkeCsrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSByZWZyZXNoIG9uIHZhcmlhYmxlIGxpc3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBTZXRSZWZyZXNoT25WYXJzKHZhcmlhYmxlczogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgc3RyVG9rOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUodmFyaWFibGVzLCBcIixcIik7XHJcbiAgICBsZXQgZmxkTnVtOiBudW1iZXI7XHJcbiAgICBsZXQgaW50VmFscyA9IG5ldyBMaXN0PG51bWJlcj4oKTtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RyVG9rLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZsZE51bSA9IE5OdW1iZXIuUGFyc2Uoc3RyVG9rW2ldKTtcclxuICAgICAgaW50VmFscy5wdXNoKGZsZE51bSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLlJlZnJlc2hPblZhcnMgPSBuZXcgQXJyYXkoaW50VmFscy5sZW5ndGgpO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IGludFZhbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZmxkTnVtID0gaW50VmFscy5nZXRfSXRlbShpKTtcclxuICAgICAgdGhpcy5SZWZyZXNoT25WYXJzW2ldID0gZmxkTnVtO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgRGF0YVN5bmNlZCBwcm9wZXJ0eSBvZiB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXREYXRhU3luY2VkKHN5bmNlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5EYXRhU3luY2VkID0gc3luY2VkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIGZpZWxkIGJ5IGl0cyBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZE5hbWVcIj5vZiB0aGUgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGZpZWxkIGJ5IGl0cyBuYW1lPC9yZXR1cm5zPlxyXG4gIGdldEZpZWxkKGZsZE5hbWU6IHN0cmluZyk6IEZpZWxkIHtcclxuICAgIHJldHVybiAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldEZpZWxkQnlOYW1lKGZsZE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBhbiBleHByZXNzaW9uIGJ5IGl0cyBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPmlkIG9mIHRoZSBleHByZXNzaW9uPC9wYXJhbT5cclxuICBnZXRFeHBCeUlkKGlkOiBudW1iZXIpOiBFeHByZXNzaW9uIHtcclxuICAgIGlmICh0aGlzLkV4cFRhYiAhPT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuRXhwVGFiLmdldEV4cEJ5SWQoaWQpO1xyXG4gICAgZWxzZVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBUYXNrLkdldEV4cEJ5SWQoKTogbm8gZXhwcmVzc2lvbiB0YWJsZVwiKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0RXhwT2JqZWN0QnlJZChpZDogbnVtYmVyKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmdldEV4cEJ5SWQoaWQpO1xyXG4gIH1cclxuXHJcbiAgR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQ6IG51bWJlcik6IGFueSB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgaWYgKGV4cElkID4gMCkge1xyXG4gICAgICBsZXQgZXhwQnlJZDogRXhwcmVzc2lvbiA9IHRoaXMuZ2V0RXhwQnlJZChleHBJZCk7XHJcbiAgICAgIERlYnVnLkFzc2VydChleHBCeUlkICE9PSBudWxsKTtcclxuICAgICAgcmVzdWx0ID0gZXhwQnlJZC5HZXRTdG9yYWdlQXR0cmlidXRlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDYWxjdWxhdGUgZXhwcmVzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleHBJZFwiPlRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNUeXBlXCI+VGhlIGV4cGVjdGVkIHJlc3VsdCB0eXBlLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGVuZ3RoXCI+VGhlIGV4cGVjdGVkIGxlbmd0aCBvZiB0aGUgcmVzdWx0LjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGVudFR5cGVVbmljb2RlXCI+RGVub3RlcyB3aGV0aGVyIHRoZSByZXN1bHQgaXMgZXhwZWN0ZWQgdG8gYmUgYSB1bmljb2RlIHN0cmluZy48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc0NlbGxUeXBlXCI+Tm90IHVzZWQuPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIENhbGN1bGF0ZUV4cHJlc3Npb24oZXhwSWQ6IG51bWJlciwgcmVzVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgbGVuZ3RoOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gbnVsbDtcclxuICAgIGlmIChleHBJZCA+IDApIHtcclxuICAgICAgbGV0IGV4cEJ5SWQ6IEV4cHJlc3Npb24gPSB0aGlzLmdldEV4cEJ5SWQoZXhwSWQpO1xyXG4gICAgICBEZWJ1Zy5Bc3NlcnQoZXhwQnlJZCAhPT0gbnVsbCk7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGV4cEJ5SWQuZXZhbHVhdGVXaXRoUmVzdWx0VHlwZUFuZExlbmd0aChyZXNUeXBlLCBsZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBJbnNlcnQgUmVjb3JkIFRhYmxlIHRvIGRhdGF2aWV3IG9mIHRoZSB0YXNrIGlmIGl0IGNhbWUgYWZ0ZXIgY2xvc2luZyB0YXNrIHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgaW5zZXJ0UmVjb3JkVGFibGUoaW52YWxpZGF0ZTogYm9vbGVhbiwgcGFyc2VyOiBYbWxQYXJzZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGNoZWNrIGNhY2hlIGxvZ2ljIG9ubHkgZm9yIHN1Yi1mb3Jtc1xyXG4gICAgaWYgKGF3YWl0IHRoaXMuaXNDYWNoZWQoKSkge1xyXG4gICAgICBsZXQgZmlyc3RUaW1lOiBib29sZWFuID0gKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRGaXJzdER2KCk7XHJcbiAgICAgIC8vIGlmIGl0IGlzIHRoZSBmaXJzdCB0aW1lIHRoZSB0YXNrIGdldCBkdiBvciB0aGUgb2xkIGR2IGlzIG5vdCBpbnZhbGlkYXRlZCBvclxyXG4gICAgICAvLyB0aGUgb2xkIGR2IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZpcnN0IHJlY29yZCBkbyBub3QgcHV0IGluIGNhY2hlXHJcbiAgICAgIGlmICghZmlyc3RUaW1lICYmIGludmFsaWRhdGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzTG9jYXRlKSB7XHJcbiAgICAgICAgICAvLyB0aGUgb2xkIGQudiB3YXMgbm90IHVwZGF0ZWQgcHV0IGl0IGluIGNhY2hlIChpdHMgcmVwbGljYXRlKVxyXG4gICAgICAgICAgaWYgKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuSW5jbHVkZXNGaXJzdCgpKSB7XHJcbiAgICAgICAgICAgIGlmICghKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRDaGFuZ2VkKCkpXHJcbiAgICAgICAgICAgICAgdGhpcy5fZHZDYWNoZS5wdXRJbkNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykucmVwbGljYXRlKCkpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdGhpcy5fZHZDYWNoZS5yZW1vdmVEdkZyb21DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSwgdHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgdGhpcy5sb2NhdGVQdXRJbkNhY2hlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHBhcnNlIHRoZSBuZXcgZGF0YXZpZXdcclxuICAgIGF3YWl0ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZmlsbERhdGEocGFyc2VyKTtcclxuXHJcbiAgICBpZiAoaW52YWxpZGF0ZSlcclxuICAgICAgKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5zZXRDaGFuZ2VkKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGhhbmRsZXJzIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRIYW5kbGVyc1RhYigpOiBIYW5kbGVyc1RhYmxlIHtcclxuICAgIHJldHVybiB0aGlzLkhhbmRsZXJzVGFiO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBYTUwgc3RyaW5nIGZvciB0aGUgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGJ1aWxkWE1MKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuSXNBZnRlclJldHJ5QmVmb3JlQnVpbGRYTUwgPSB0aGlzLmdldEFmdGVyUmV0cnkoKTtcclxuICAgIGlmICh0aGlzLktub3duVG9TZXJ2ZXIgJiYgIXRoaXMuSXNPZmZsaW5lKSB7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0spO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19BVFRSX1RBU0tJRCArIFwiPVxcXCJcIiArIHRoaXMuZ2V0VGFza1RhZygpICsgXCJcXFwiXCIpO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVEFTS19NQUlOTEVWRUwgKyBcIj1cXFwiXCIgKyB0aGlzLmdldE1haW5MZXZlbCgpICsgXCJcXFwiXCIpO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgICAgYXdhaXQgKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5idWlsZFhNTChtZXNzYWdlKTtcclxuICAgICAgaWYgKHRoaXMuRm9ybSAhPSBudWxsICYmIHRoaXMuRm9ybS5PcGVuZWQpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5HZXRIaWRkZW5Db250cm9sTGlzdFhNTCgpKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCJcXG4gICA8L1wiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19UQVNLICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIFhNTCBzdHJpbmcgZm9yIHRoZSByYW5nZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGJ1aWxkWE1MRm9yUm5ncyhtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBVc2VyUmFuZ2VzOiBMaXN0PFVzZXJSYW5nZT4sIGxvY2F0ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBmbGQ6IEZpZWxkO1xyXG4gICAgbGV0IGNlbGxBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gU3RvcmFnZUF0dHJpYnV0ZS5TS0lQO1xyXG4gICAgbGV0IHRvQmFzZTY0OiBib29sZWFuID0gKEVudmlyb25tZW50Lkluc3RhbmNlLkdldERlYnVnTGV2ZWwoKSA8PSAxKTtcclxuXHJcbiAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgIGZvciAoaSA9IDA7IGkgPCBVc2VyUmFuZ2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5VU0VSX1JORyk7XHJcblxyXG4gICAgICBsZXQgcm5nOiBVc2VyUmFuZ2UgPSBVc2VyUmFuZ2VzLmdldF9JdGVtKGkpO1xyXG5cclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX0ZMRCArIFwiPVxcXCJcIiArIHJuZy52ZWVJZHggKyBcIlxcXCJcIik7XHJcblxyXG4gICAgICBmbGQgPSA8RmllbGQ+dGhpcy5EYXRhVmlldy5nZXRGaWVsZCg8bnVtYmVyPnJuZy52ZWVJZHggLSAxKTtcclxuICAgICAgbGV0IGZsZEF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBmbGQuZ2V0VHlwZSgpO1xyXG5cclxuICAgICAgaWYgKHJuZy5udWxsTWluKVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTlVMTF9NSU5fUk5HICsgXCI9XFxcIjFcXFwiXCIpO1xyXG5cclxuICAgICAgaWYgKCFybmcuZGlzY2FyZE1pbiAmJiBybmcubWluICE9IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsOiBzdHJpbmcgPSBSZWNvcmRVdGlscy5pdGVtVmFsVG9YTUwocm5nLm1pbiwgZmxkQXR0ciwgY2VsbEF0dHIsIHRvQmFzZTY0KTtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1JTl9STkcgKyBcIj1cXFwiXCIgKyB2YWwgKyBcIlxcXCJcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChybmcubnVsbE1heClcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk5VTExfTUFYX1JORyArIFwiPVxcXCIxXFxcIlwiKTtcclxuXHJcbiAgICAgIGlmICghcm5nLmRpc2NhcmRNYXggJiYgcm5nLm1heCAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHZhbDogc3RyaW5nID0gUmVjb3JkVXRpbHMuaXRlbVZhbFRvWE1MKHJuZy5tYXgsIGZsZEF0dHIsIGNlbGxBdHRyLCB0b0Jhc2U2NCk7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NQVhfUk5HICsgXCI9XFxcIlwiICsgdmFsICsgXCJcXFwiXCIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG4gICAgfVxyXG4gICAgaWYgKGxvY2F0ZSlcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLkVORF9UQUcgKyBDb25zdEludGVyZmFjZS5VU0VSX0xPQ0FURVMgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgIGVsc2VcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLkVORF9UQUcgKyBDb25zdEludGVyZmFjZS5VU0VSX1JBTkdFUyArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBYTUwgc3RyaW5nIGZvciB0aGUgdXNlciBhZGRlZCBzb3J0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYnVpbGRYTUxGb3JTb3J0cyhtZXNzYWdlOiBTdHJpbmdCdWlsZGVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5Vc2VyU29ydHMgIT0gbnVsbCAmJiB0aGlzLlVzZXJTb3J0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLlVzZXJTb3J0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgICAgIGxldCBzcnQ6IFNvcnQgPSB0aGlzLlVzZXJTb3J0cy5nZXRfSXRlbShpKTtcclxuXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIENvbnN0SW50ZXJmYWNlLlNPUlQpO1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19GTEQgKyBcIj1cXFwiXCIgKyBzcnQuZmxkSWR4ICsgXCJcXFwiXCIpO1xyXG4gICAgICAgIGlmIChzcnQuZGlyKVxyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0RJUiArIFwiPVxcXCIxXFxcIlwiKTtcclxuXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLlVzZXJTb3J0cy5DbGVhcigpO1xyXG4gICAgICB0aGlzLlVzZXJTb3J0cyA9IG51bGw7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5FTkRfVEFHICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1NPUlRTICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBhIHVzZXIgZXZlbnQgYnkgaXRzIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPnRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdGVkIGV2ZW50PC9wYXJhbT5cclxuICBnZXRVc2VyRXZlbnQoaWR4OiBudW1iZXIpOiBFdmVudCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5Vc2VyRXZ0VGFiICE9PSBudWxsKTtcclxuICAgIGxldCByZXRFdmVudDogRXZlbnQgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuVXNlckV2dFRhYiAhPT0gbnVsbClcclxuICAgICAgcmV0RXZlbnQgPSB0aGlzLlVzZXJFdnRUYWIuZ2V0RXZlbnQoaWR4KTtcclxuICAgIHJldHVybiByZXRFdmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gU2V0IHRoZSBNb3ZlVG9GaXJzdENvbnRyb2wgZmxhZyBvbiB0aGUgZm9ybS4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vdmVUb0ZpcnN0Q29udHJvbFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBTZXRNb3ZlVG9GaXJzdENvbnRyb2wobW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAobW92ZVRvRmlyc3RDb250cm9sIHx8ICF0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICBpZiAodGhpcy5Gb3JtICE9PSBudWxsKSB7XHJcbiAgICAgICAgLy8gdGhpcyBpcyBhIGNhbGwgZGVzdGluYXRpb24vIHN1YmZvcm0gY2FsbFxyXG4gICAgICAgIC8vIFdlIHBlcmZvcm0gbW92ZSB0byBmaXJzdCBjb250cm9sIG9ubHkgdG8gb25lIGNvbnRyb2wgZm9ybSBwZXIgcmVxdWVzdCAtIHRoZSBmaXJzdCBvbmUgdGhhdCB3ZSByZWNlaXZlXHJcbiAgICAgICAgbGV0IGFscmVhZHlNb3ZlZDogYm9vbGVhbiA9ICg8TWdGb3JtPnRoaXMuRm9ybSkuYWxyZWFkeU1vdmVkVG9GaXJzdENvbnRyb2woKTtcclxuICAgICAgICBpZiAoIWFscmVhZHlNb3ZlZClcclxuICAgICAgICAgICg8TWdGb3JtPnRoaXMuRm9ybSkuTW92ZWRUb0ZpcnN0Q29udHJvbCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzdGFydCB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIGFuZCBpdHMgc3ViVGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIFN0YXJ0KG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbiwgY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4pOiBQcm9taXNlPElUYXNrPiB7XHJcbiAgICBsZXQgbm9uSW50ZXJhY3RpdmVUYXNrOiBUYXNrID0gbnVsbDtcclxuXHJcbiAgICBpZiAoIXRoaXMuX2lzU3RhcnRlZCkge1xyXG4gICAgICB0aGlzLl9pc1N0YXJ0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgdGhpcy5Jbml0aWFsaXplRXhlY3V0aW9uKCk7XHJcblxyXG4gICAgICB0aGlzLkluU3RhcnRQcm9jZXNzID0gdHJ1ZTtcclxuICAgICAgbGV0IHJlc3VsdDogUmV0dXJuUmVzdWx0ID0gYXdhaXQgdGhpcy5TZXR1cCgpO1xyXG5cclxuICAgICAgLy8gdGFzayBpbml0aWFsaXphdGlvbiBmYWlsZWQgLSBjbG9zZSB0aGUgdGFza1xyXG4gICAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgdGhpcy5faW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tTYXZlZCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldFByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzaygpO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soZmFsc2UpO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5FbmFibGVBY3Rpb25zKCk7XHJcblxyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkluaXRpYWxpemVGb3JtKG1vdmVUb0ZpcnN0Q29udHJvbCk7XHJcblxyXG4gICAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLklzSW50ZXJhY3RpdmUgJiYgIXRoaXMuX2lzTWFpblByZylcclxuICAgICAgICBub25JbnRlcmFjdGl2ZVRhc2sgPSB0aGlzO1xyXG5cclxuICAgICAgdGhpcy5EYXRhVmlld1dhc1JldHJpZXZlZCA9IHRydWU7XHJcblxyXG4gICAgICAvLyBRQ1IgIyAxNjczMzIgOlxyXG4gICAgICAvLyBJZiB3ZSBzdGFydCBwb3JncmFtIFAxLCBmb3Igd2hpY2ggTVAgaXMgc3RhcnRlZC4gTVAgaXMgY2FsbGluZyBQMiBmcm9tIGl0J3MgVFAuIFNvLCB3aGVuIGl0IGNhbGxzIFAyXHJcbiAgICAgIC8vIGFnYWluIGl0IHN0YXJ0cyBNUCwgYnV0IGZyb20gTVAgaXQgYWdhaW4gc3RhcnRzIFAxLiBhcyBQMSBpcyBpbiBpdCdzIHN1YnRhc2sgYW5kIGl0IGlzIG5vdCB5ZXQgc3RhcnRlZC5cclxuICAgICAgLy8gU28sIGl0J3Mgd3JvbmcgdG8gc3RhcnQgUDEgd2hpbGUgZXhlY3V0aW5nIFRQIG9mIE1QLiBJdCBzaG91bGQgZXhlY3V0ZSBvbmx5IFAyLlxyXG4gICAgICAvLyBTbywgaW4gb3JkZXIgdG8gYXZvaWQgdGhpcywgc2V0IE1QJ3Mgc3VidGFza3MgdG8gbnVsbCBiZWZvcmUgZW50ZXJpbmcgVFAuIGFuZCBhZ2FpbiByZXN0b3JlIGl0IGJhY2ssIGluIG9yZGVyIHRvXHJcbiAgICAgIC8vIHN0YXJ0IFAxIHByb3Blcmx5LlxyXG4gICAgICBsZXQgc3ViVGFza3M6IFRhc2tzVGFibGUgPSB0aGlzLlN1YlRhc2tzO1xyXG4gICAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgdGhpcy5TdWJUYXNrcyA9IG51bGw7XHJcbiAgICAgIGlmICh0aGlzLmlzTWFpblByb2coKSlcclxuICAgICAgICB0aGlzLlN1YlRhc2tzID0gc3ViVGFza3M7XHJcblxyXG4gICAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBpZiAodGhpcy5fYWJvcnRpbmcpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBsZXQgZGF0YVZpZXdDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5GaXJzdENodW5rKTtcclxuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShkYXRhVmlld0NvbW1hbmQpO1xyXG5cclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgbm9uSW50ZXJhY3RpdmVUYXNrID0gYXdhaXQgdGhpcy5TdGFydFN1YlRhc2tzKG1vdmVUb0ZpcnN0Q29udHJvbCwgbm9uSW50ZXJhY3RpdmVUYXNrLCBjYWxsQnlEZXN0U3ViRm9ybSk7XHJcbiAgICB0aGlzLkluU3RhcnRQcm9jZXNzID0gZmFsc2U7XHJcbiAgICByZXR1cm4gbm9uSW50ZXJhY3RpdmVUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbml0aWFsaXplIGV4ZWN1dGlvbi1yZWxhdGVkIHN0dWZmLlxyXG4gIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIE9OTFkgZnJvbSBUYXNrLlN0YXJ0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIEluaXRpYWxpemVFeGVjdXRpb24oKTogdm9pZCB7XHJcbiAgICAvLyBjdXJyZW50bHkgdGhlIGlzIG5vIGNvbnRyb2wgZXhlY3V0aW5nIHRoZXJlIGZvciB0aGVcclxuICAgIC8vIGN1cnJlbnQgZXhlY3V0aW5nIGNvbnRyb2wgaW5kZXggaXMgc2V0IHRvIC0xXHJcbiAgICBzdXBlci5zZXRCcmtMZXZlbChDb25zdEludGVyZmFjZS5CUktfTEVWRUxfUkVDX01BSU4sIC0xKTtcclxuICAgIHRoaXMuX2ZpcnN0UmVjb3JkQ3ljbGUgPSB0cnVlOyAgICAgIC8vIFdoaWxlIHN0YXJ0aW5nIGEgVGFzaywgc2V0IGZpcnN0UmVjb3JkQ3ljbGUgPSBUUlVFXHJcblxyXG4gICAgdGhpcy5fY3VyclN0YXJ0UHJvZ0xldmVsID0gKCh0aGlzLklzU3ViRm9ybSAmJiAoPE1nRm9ybT50aGlzLmdldFBhcmVudCgpLmdldEZvcm0oKSkuYWxyZWFkeU1vdmVkVG9GaXJzdENvbnRyb2woKSlcclxuICAgICAgPyAoPFRhc2s+dGhpcy5nZXRQYXJlbnQoKSkuX2N1cnJTdGFydFByb2dMZXZlbFxyXG4gICAgICA6IFRhc2suU3RhcnRQcm9nTGV2ZWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0aWFsaXplIGZvcm0tcmVsYXRlZCBzdHVmZlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW92ZVRvRmlyc3RDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgSW5pdGlhbGl6ZUZvcm0obW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuKTogUHJvbWlzZTxSZXR1cm5SZXN1bHQ+IHtcclxuICAgIGlmICh0aGlzLkZvcm0gIT09IG51bGwpIHtcclxuICAgICAgLy8gc2V0IE1vdmVUb0ZpcnN0Q29udHJvbCBmbGFnIG9uIHRoZSBmb3JtLlxyXG4gICAgICB0aGlzLlNldE1vdmVUb0ZpcnN0Q29udHJvbChtb3ZlVG9GaXJzdENvbnRyb2wpO1xyXG5cclxuICAgICAgLy8gdGhlIEluaXRGb3JtIG1pZ2h0IGNhdXNlIGV4ZWN1dGlvbiBvZiBjb2RlICh2YXJpYWJsZSBjaGFuZ2UpIHNvIHdlIHNob3VsZCBkbyBpdCB3aXRoIGEgbmV3IHNlcnZlciBleGVjdXRpb24gc3RhY2tcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICAgIHRoaXMucm91dGVQYXJhbXMgPSAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLkdldFJvdXRlUGFyYW1zKCk7XHJcblxyXG4gICAgICAvLyBpbml0aWFsaXplIHRoZSBjdXJyZW50IHRhc2sncyBmb3JtLlxyXG4gICAgICBhd2FpdCB0aGlzLkluaXRGb3JtKCk7XHJcblxyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcblxyXG4gICAgICB0aGlzLmdldE1HRGF0YSgpLlN0YXJ0VGltZXJzKCk7XHJcbiAgICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBSZXR1cm5SZXN1bHQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc3RhcnQgc3ViIHRhc2tzIG9mIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW92ZVRvRmlyc3RDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJub25JbnRlcmFjdGl2ZVRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBTdGFydFN1YlRhc2tzKG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbiwgbm9uSW50ZXJhY3RpdmVUYXNrOiBUYXNrLCBjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbik6IFByb21pc2U8VGFzaz4ge1xyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIGxldCB0bXBOb25JbnRlcmFjdGl2ZVRhc2s6IFRhc2sgPSAgPFRhc2s+IGF3YWl0IHRhc2suU3RhcnQobW92ZVRvRmlyc3RDb250cm9sLCBjYWxsQnlEZXN0U3ViRm9ybSk7XHJcbiAgICAgICAgaWYgKG5vbkludGVyYWN0aXZlVGFzayA9PT0gbnVsbClcclxuICAgICAgICAgIG5vbkludGVyYWN0aXZlVGFzayA9IHRtcE5vbkludGVyYWN0aXZlVGFzaztcclxuICAgICAgICBlbHNlIGlmICh0bXBOb25JbnRlcmFjdGl2ZVRhc2sgIT09IG51bGwpXHJcbiAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoZmFsc2UsIFwibW9yZSB0aGFuIDEgbm9uIGludGVyYWN0aXZlIGluIHRhc2suc3RhcnRcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbm9uSW50ZXJhY3RpdmVUYXNrO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBFbmFibGVBY3Rpb25zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGFjdExpc3Q6IG51bWJlcltdID0gQWN0aW9uTWFuYWdlci5hY3RFbmFibGVkO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZUxpc3QoYWN0TGlzdCwgdHJ1ZSwgZmFsc2UpO1xyXG5cclxuICAgIGlmICh0aGlzLklzU3ViRm9ybSlcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUE9TVF9SRUZSRVNIX0JZX1BBUkVOVCwgdHJ1ZSk7XHJcblxyXG5cclxuICAgIC8vIGVuYWJsZSBhY3Rpb25zIGRlcGVuZGluZyBvbiB0YXNrIHByb3BlcnRpZXNcclxuICAgIGF3YWl0IHRoaXMuZW5hYmxlTW9kZXMoKTtcclxuICAgIGlmIChhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT04sIGZhbHNlKSkge1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1QsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBlbmFibGVQcmludGRhdGE6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QUklOVF9EQVRBLCBmYWxzZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9QUklOVF9EQVRBLCBlbmFibGVQcmludGRhdGEpO1xyXG5cclxuXHJcbiAgICBpZiAodGhpcy5nZXRFbmFibGVab29tSGFuZGxlcigpKVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2hvdyBlcnJvciBvbiB0YXNrJ3MgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGV4dFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgU2hvd0Vycm9yKHRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1sc1RyYW5zVGV4dDogc3RyaW5nID0gTGFuZ3VhZ2VEYXRhLkluc3RhbmNlLnRyYW5zbGF0ZSh0ZXh0KTtcclxuICAgIGxldCBtbHNUcmFuc1RpdGxlOiBzdHJpbmcgPSBMYW5ndWFnZURhdGEuSW5zdGFuY2UudHJhbnNsYXRlKENvbnN0SW50ZXJmYWNlLkVSUk9SX1NUUklORyk7XHJcbiAgICAvLyBtbHMgPz8/XHJcbiAgICBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLk1lc3NhZ2VCb3gobWxzVHJhbnNUaXRsZSwgbWxzVHJhbnNUZXh0LCBTdHlsZXMuTVNHQk9YX0lDT05fRVJST1IgfCBTdHlsZXMuTVNHQk9YX0JVVFRPTl9PSyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrIHRoZSByZXN1bHQuIElmIGZhaWxlZCAtIGRpc3BsYXkgdGhlIGVycm9yIG1lc3NhZ2Vib3ggYW5kIGVuZCB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzdWx0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEVuZFRhc2tPbkVycm9yKHJlc3VsdDogUmV0dXJuUmVzdWx0LCBkaXNwbGF5RXJyb3I6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MgJiYgIXRoaXMuaXNBYm9ydGluZygpKSB7XHJcbiAgICAgIGlmICh0aGlzLkluU3RhcnRQcm9jZXNzKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbmRUYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIGlmIChkaXNwbGF5RXJyb3IpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlNob3dFcnJvcihyZXN1bHQuRXJyb3JEZXNjcmlwdGlvbik7XHJcbiAgICAgICAgdGhpcy5JblN0YXJ0UHJvY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChkaXNwbGF5RXJyb3IpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlNob3dFcnJvcihyZXN1bHQuRXJyb3JEZXNjcmlwdGlvbik7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBTZXR1cCgpOiBQcm9taXNlPFJldHVyblJlc3VsdD4ge1xyXG4gICAgbGV0IHJlc3VsdDogUmV0dXJuUmVzdWx0O1xyXG4gICAgdGhpcy5UYXNrU2VydmljZS5Jbml0VGFza1ByZWZpeEV4ZWN1dGVkRmxhZyh0aGlzKTtcclxuICAgIHRoaXMuVGFza1N1ZmZpeEV4ZWN1dGVkID0gZmFsc2U7XHJcblxyXG4gICAgVGFza1NlcnZpY2VCYXNlLkNyZWF0ZUZpcnN0UmVjb3JkKHRoaXMpO1xyXG5cclxuICAgIC8vIGluaXQgZGF0YSB2aWV3XHJcbiAgICAvLyBOb3RlOiBFdmVuIGlmIHRoZSByZXN1bHRJbml0TW9kZSBpcyBmYWxzZSB3ZSBNVVNUIGluaXQgdGhlIGRhdGEgdmlld1xyXG4gICAgbGV0IGRhdGFWaWV3Q29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuSW5pdCk7XHJcbiAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcblxyXG4gICAgLy8gbmVlZCB0byBjaGVjayByZXN1bHQob2YgdGhlIGRhdGEgdmlldyBpbml0IGFuZCBpZiBub3Qgc3VjY2VzcyB0aGVuIHJldHVybiB0aGlzIGVycm9yXHJcbiAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG5cclxuICAgIGlmIChyZXN1bHQuU3VjY2Vzcykge1xyXG4gICAgICAvLyBFeGVjdXRlIHRoZSBjb21tYW5kLCB3aG9zZSBleGVjdXRpb24gd2FzIGRlbGF5ZWQgYmVjdWFzZSB0YXNrIHdhcyBub3Qgc3RhcnRlZC4gU28gRXhjdXRlIHRob3NlIGNvbW1hbmRzIGFmdGVyIHRhc2sgc3RhcnRlZC5cclxuICAgICAgbGV0IGNvbW1hbmRzOiBMaXN0PElDbGllbnRUYXJnZXRlZENvbW1hbmQ+ID0gR2xvYmFsQ29tbWFuZHNNYW5hZ2VyLkluc3RhbmNlLmdldENvbW1hbmRzRXhlY3V0ZWRBZnRlclRhc2tTdGFydGVkKCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBjbWRJZHg6IG51bWJlciA9IDA7IGNtZElkeCA8IGNvbW1hbmRzLmxlbmd0aDsgY21kSWR4KyspIHtcclxuICAgICAgICBsZXQgY29tbWFuZDogSUNsaWVudFRhcmdldGVkQ29tbWFuZCA9IChjb21tYW5kcy5nZXRfSXRlbShjbWRJZHgpKTtcclxuICAgICAgICBpZiAoY29tbWFuZC5UYXNrVGFnID09PSB0aGlzLmdldFRhc2tUYWcoKSkge1xyXG4gICAgICAgICAgYXdhaXQgY29tbWFuZC5FeGVjdXRlKG51bGwpO1xyXG4gICAgICAgICAgR2xvYmFsQ29tbWFuZHNNYW5hZ2VyLkluc3RhbmNlLnJlbW92ZUNvbW1hbmRzRXhlY3V0ZWRBZnRlclRhc2tTdGFydGVkKGNvbW1hbmQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZGF0YVZpZXdDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRGF0YVZpZXdDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBEYXRhVmlld0NvbW1hbmRUeXBlLlByZXBhcmUpO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdC5TdWNjZXNzKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuVGFza1NlcnZpY2UuUHJlcGFyZVRhc2sodGhpcyk7XHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5FbmRUYXNrT25FcnJvcihyZXN1bHQsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXN1bHQuU3VjY2Vzcykge1xyXG4gICAgICBkYXRhVmlld0NvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuSW5pdERhdGFDb250cm9sVmlld3MpO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZG8gZmlyc3QgcmVjb3JkIHByZWZpeCAmIHN1ZmZpeFxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgb25seSBmb3IgY29ubmVjdGVkIHRhc2suXHJcbiAgLy8vICAgRm9yIG9mZmxpbmUgdGFzayB3ZSBydW4gRW50ZXJGaXJzdFJlY29yZCBmdW5jdGlvbi4gVGhlcmUgd2UgZXhlY3V0ZSBSUCBhbmQgb3BlbiBzdWJmb3Jtcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGRvRmlyc3RSZWNvcmRDeWNsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5faXNNYWluUHJnKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIHRoaXMuU3ViZm9ybUV4ZWNNb2RlID0gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLkZJUlNUX1RJTUU7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYLCB0aGlzLklzU3ViRm9ybSk7XHJcblxyXG4gICAgICBpZiAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBpZiAodGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpXHJcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHN1YlRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgICAgICAgaWYgKHN1YlRhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgICAgICAgICAoPE1nRm9ybT5zdWJUYXNrLmdldEZvcm0oKSkuSWdub3JlRmlyc3RSZWNvcmRDeWNsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzdWJUYXNrLmRvRmlyc3RSZWNvcmRDeWNsZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuU3ViZm9ybUV4ZWNNb2RlID0gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLlNFVF9GT0NVUztcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGlzIHRhc2sgaXMgYSBzdWIgZm9ybSBieSBpdHMgbWdkIGRlZmluaXRpb24gKHVzZWQgb25seSB3aGlsZSBpbml0aWF0aW5nIHRhc2sgZm9yIHNldHRpbmcgaXNTdWJmb3JtKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBDaGVja0FuZFNldFN1YkZvcm0oKTogdm9pZCB7XHJcbiAgICB0aGlzLklzU3ViRm9ybSA9ICghc3VwZXIuaXNNYWluUHJvZygpICYmIHRoaXMgIT09IHRoaXMuX21nRGF0YS5nZXRGaXJzdFRhc2soKSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgSXNSb3V0ZSgpIHtcclxuICAgIHJldHVybiAodGhpcy5Sb3V0ZXJQYXRoICE9IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN0b3AgdGhlIGV4ZWN1dGlvbiBvZiBhIHByb2dyYW1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzaztcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm1CYXNlID0gdGhpcy5nZXRGb3JtKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2Fib3J0aW5nKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICB3aGlsZSAoKHRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soMCkpICE9IG51bGwpIHtcclxuICAgICAgICB0YXNrLnNldERlc3RpbmF0aW9uU3ViZm9ybSh0aGlzLl9kZXN0aW5hdGlvblN1YmZvcm0pO1xyXG4gICAgICAgIGF3YWl0IHRhc2suc3RvcCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pc01haW5QcmcpXHJcbiAgICAgIHRoaXMuX2Fib3J0aW5nID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBpZiB0aGlzIHRhc2sgYW5kIGl0cyBwYXJlbnQgYXJlIGZyb20gZGlmZmVyZW50IE1HREFUQSBvYmplY3RzIHRoZW4gZGlzY29ubmVjdFxyXG4gICAgLy8gdGhlbSBieSByZW1vdmluZyB0aGUgcmVmZXJlbmNlIHRvIHRoaXMgdGFzayBmcm9tIGl0cyBwYXJlbnRcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5fcGFyZW50VGFzay5yZW1vdmVTdWJUYXNrKHRoaXMpO1xyXG4gICAgICBpZiAodGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgICBsZXQgb2xkVGltZXJzOiBMaXN0PG51bWJlcj4gPSBuZXcgTGlzdDxudW1iZXI+KCksIG5ld1RpbWVycyA9IG5ldyBMaXN0PG51bWJlcj4oKTtcclxuICAgICAgICBsZXQgbWdkID0gdGhpcy5nZXRNR0RhdGEoKTtcclxuXHJcbiAgICAgICAgaWYgKG1nZC5nZXRUaW1lckhhbmRsZXJzKCkgIT0gbnVsbClcclxuICAgICAgICAgIG9sZFRpbWVycyA9IG1nZC5nZXRUaW1lckhhbmRsZXJzKCkuZ2V0VGltZXJzVmVjdG9yKCk7XHJcbiAgICAgICAgbWdkLnJlbW92ZVRpbWVySGFuZGxlcih0aGlzKTtcclxuICAgICAgICBtZ2QucmVtb3ZlRXhwcmVzc2lvbkhhbmRsZXIodGhpcyk7XHJcbiAgICAgICAgaWYgKG1nZC5nZXRUaW1lckhhbmRsZXJzKCkgIT0gbnVsbClcclxuICAgICAgICAgIG5ld1RpbWVycyA9IG1nZC5nZXRUaW1lckhhbmRsZXJzKCkuZ2V0VGltZXJzVmVjdG9yKCk7XHJcbiAgICAgICAgbWdkLmNoYW5nZVRpbWVycyhvbGRUaW1lcnMsIG5ld1RpbWVycyk7XHJcblxyXG4gICAgICAgIG1nZC5yZW1vdmVUYXNrKHRoaXMpO1xyXG4gICAgICAgIEdVSU1hbmFnZXIuSW5zdGFuY2UuYWJvcnQoPE1nRm9ybT50aGlzLmdldEZvcm0oKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkFib3J0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgdGFzayBnb3QgY2xvc2VkIGR1ZSB0byBhIGNsaWNrIG9uIHNhbWUgdGFzaywgdGhlbiBzZXQgQ3VycmVudENsaWNrZWRDdHJsIHRvIG51bGxcclxuICAgIGlmICh0aGlzLmdldENsaWNrZWRDb250cm9sKCkgIT0gbnVsbClcclxuICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkQ3RybCA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5Gb3JtICE9IG51bGwpXHJcbiAgICAgICg8TWdGb3JtPnRoaXMuRm9ybSkucmVtb3ZlUmVmc1RvQ3RybHMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgbGV0IHN1YkZvcm0gPSA8TWdDb250cm9sPnRoaXMuRm9ybS5nZXRTdWJGb3JtQ3RybCgpO1xyXG5cclxuICAgICAgc3ViRm9ybS5zZXRTdWJmb3JtVGFza0lkKG51bGwpO1xyXG4gICAgICBzdWJGb3JtLmluaXRTdWJmb3JtVGFzaygpO1xyXG5cclxuICAgICAgaWYgKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSA9PT0gdGhpcylcclxuICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2Uuc2V0TGFzdEZvY3VzZWRUYXNrKHRoaXMuX3BhcmVudFRhc2spO1xyXG5cclxuICAgICAgLy8gUUNSICMzMTAxMTMuIElmIHRoZSBzdWJmb3JtIHRhc2sgZm9yIHdhcyBub3QgbG9hZGVkIHlldCwgZG8gbm90IHJlZnJlc2ggaXQuXHJcbiAgICAgIGlmIChzdWJGb3JtLlN1YmZvcm1Mb2FkZWQpXHJcbiAgICAgICAgYXdhaXQgKHN1YkZvcm0uZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFKSkuUmVmcmVzaERpc3BsYXkodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGNsZWFyRGF0YVZpZXdDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5DbGVhcik7XHJcbiAgICBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNsZWFyRGF0YVZpZXdDb21tYW5kKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gYWJvcnQgdGhlIE1nRGF0YSB0byB3aGljaCB0aGUgdGFzayBiZWxvbmdzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhYm9ydCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2V0TUdEYXRhKCkuYWJvcnQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgaGFzIHN1Yi10YXNrc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaGFzU3ViVGFza3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5TdWJUYXNrcyAhPT0gbnVsbCAmJiB0aGlzLlN1YlRhc2tzLmdldFNpemUoKSA+IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQSBudW1iZXIsIDEtMjQsIHRoZSBjdXJyZW50IHRhc2sncyBkZXB0aCBpbiB0aGUgdGFzayBleGVjdXRpb24gaGllcmFyY2h5LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJieVBhcmVudE9yZGVyXCI+aWYgdHJ1ZSwgd2UgdHJhdmVsIHRoZSBwYXJlbnRzLCBvdGhlcndpc2Ugd2UgdHJhdmVsIHRoZSB0cmlnZ2VyaW5nIHRhc2tzPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGRlcHRoIG9mIHRoZSB0YXNrLCAxIGlmIGNhbGxlZCBmcm9tIHRoZSByb290IHRhc2s8L3JldHVybnM+XHJcbiAgZ2V0VGFza0RlcHRoKGJ5UGFyZW50T3JkZXI6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgaWYgKGJ5UGFyZW50T3JkZXIpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcblxyXG5cclxuICAgIGxldCBkZXB0aDogbnVtYmVyID0gKDxUYXNrPiB0aGlzLkdldENvbnRleHRUYXNrKCkpLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcblxyXG4gICAgLy8gUUNSIDM2Njc0OCBpZiB3ZSBhcmUgaW4gYSBjb21wb25lbnQgaGFuZGxlciBhZGQgaXQgdG8gdGhlIHBhdGhcclxuICAgIGlmICh0aGlzLmlzTWFpblByb2coKSAmJiB0aGlzLmdldEN0bElkeCgpICE9PSBDb25zdEludGVyZmFjZS5UT1BfTEVWRUxfQ09OVEFJTkVSKVxyXG4gICAgICBkZXB0aCA9IGRlcHRoICsgMTtcclxuXHJcbiAgICByZXR1cm4gZGVwdGg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIGltcGxlbWVudHMgdGhlIGdldFRhc2tEZXB0aCByZWN1cnNpb24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ5UGFyZW50T3JkZXJcIj5pZiB0cnVlLCB3ZSB0cmF2ZWwgdGhlIHBhcmVudHMsIG90aGVyd2lzZSB3ZSB0cmF2ZWwgdGhlIHRyaWdnZXJpbmcgdGFza3M8L3BhcmFtPlxyXG4gIHByaXZhdGUgZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCB0bXBUYXNrOiBUYXNrID0gdGhpcy5nZXRUcmlnZ2VyaW5nVGFzaygpO1xyXG4gICAgaWYgKHRtcFRhc2sgPT0gbnVsbCB8fCBieVBhcmVudE9yZGVyKVxyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VGFzayA9PSBudWxsKVxyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvKiBpZiB0aGUgY3RsSWR4IG9mIHRoZSBjdXJyZW50IHRhc2sgYW5kIHRoZSBwYXJlbnQgYXJlIGRpZmZlcmVudCwgICAqL1xyXG4gICAgICAgIC8qIHRoYXQgaXMgdGhlIGN1cnJlbnQgdGFzayBpcyBmcm9tIGEgY29tcG9uZW50LCBhZGQgdGhlIGNvbXBvbmVudCdzICovXHJcbiAgICAgICAgLyogTWFpbiBQcmcgYXMgd2VsbC4gKi9cclxuICAgICAgICBpZiAoYnlQYXJlbnRPcmRlciAmJiB0aGlzLmdldEN0bElkeCgpICE9PSB0aGlzLl9wYXJlbnRUYXNrLmdldEN0bElkeCgpKVxyXG4gICAgICAgICAgcmV0dXJuIDIgKyB0aGlzLl9wYXJlbnRUYXNrLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcbiAgICAgICAgcmV0dXJuIDEgKyB0aGlzLl9wYXJlbnRUYXNrLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcbiAgICAgIH1cclxuICAgIHJldHVybiAxICsgKHRtcFRhc2spLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBhbmNlc3RvciBvZiB0aGUgVGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJnZW5lcmF0aW9uXCI+b2YgdGhlIGFuY2VzdG9yIHRhc2s8L3BhcmFtPlxyXG4gIEdldFRhc2tBbmNlc3RvcihnZW5lcmF0aW9uOiBudW1iZXIpOiBJVGFzayB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRUYXNrQW5jZXN0b3JfKGdlbmVyYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRUYXNrQW5jZXN0b3JfKGdlbmVyYXRpb246IG51bWJlcik6IElUYXNrIHtcclxuICAgIGxldCByZXRUYXNrOiBJVGFzayA9IG51bGw7XHJcblxyXG4gICAgaWYgKGdlbmVyYXRpb24gPT09IDApXHJcbiAgICAgIHJldFRhc2sgPSB0aGlzO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCB0bXBUYXNrOiBUYXNrID0gdGhpcy5nZXRUcmlnZ2VyaW5nVGFzaygpO1xyXG4gICAgICBpZiAodG1wVGFzayA9PT0gbnVsbClcclxuICAgICAgICB0bXBUYXNrID0gdGhpcy5fcGFyZW50VGFzaztcclxuICAgICAgaWYgKHRtcFRhc2sgIT09IG51bGwpXHJcbiAgICAgICAgcmV0VGFzayA9IHRtcFRhc2suZ2V0VGFza0FuY2VzdG9yXygtLWdlbmVyYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXRUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRhc2sgZGVwdGhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0VGFza0RlcHRoKCk6IG51bWJlcntcclxuICAgIHJldHVybiB0aGlzLmdldFRhc2tEZXB0aChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZSBpZmYgdGhlIHBhdGggb2YgdGhlIGN1cnJlbnQgdGFzayBjb250YWlucyB0aGUgdGFzayBwYXNzZWQgYXMgcGFyYW1ldGVyPC9yZXR1cm5zPlxyXG4gIHBhdGhDb250YWlucyh0YXNrOiBUYXNrQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tQYXRoLkNvbnRhaW5zKDxUYXNrPnRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIGNvbnRleHQgdGFzayBvZiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29udGV4dFwiPnRoZSBuZXcgY29udGV4dCB0YXNrIG9mIHRoZSBjdXJyZW50IHRhc2s8L3BhcmFtPlxyXG4gIFNldENvbnRleHRUYXNrKGNvbnRleHQ6IFRhc2tCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLkNvbnRleHRUYXNrID0gPFRhc2s+Y29udGV4dDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB0YXNrIHdoaWNoIGlzIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGhhbmRsZXIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRDb250ZXh0VGFzaygpOiBJVGFzayB7XHJcbiAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Q3VyclJlYygpKTtcclxuXHJcbiAgICBpZiAodGhpcy5JblN0YXJ0UHJvY2Vzc1xyXG4gICAgICB8fCBjdXJyUmVjICE9PSBudWxsICYmIChjdXJyUmVjLkluQ29tcHV0ZSB8fCBjdXJyUmVjLkluUmVjb21wdXRlKVxyXG4gICAgICB8fCB0aGlzLkZvcm0gIT09IG51bGwgJiYgdGhpcy5Gb3JtLmluUmVmcmVzaERpc3BsYXkoKSlcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuQ29udGV4dFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYW5kbGVyIHdoaWNoIGNyZWF0ZWQgbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRyaWdnZXJpbmdUYXNrKCk6IFRhc2sge1xyXG4gICAgLy8gVGhpcyBpcyBhIHNlbWkgcGF0Y2ggd2hpY2ggZml4ZXMgcHJvYmxlbXMgc3VjaCBhcyB0aGUgb25lcyBpbiBRQ1IgIzI5NjQyOFxyXG4gICAgLy8gV2hlbiBhIG1vZGFsIHRhc2sgZ2V0cyBvcGVuZWQsIGl0IG1pZ2h0IHNldCBpdHMgdHJpZ2dlcmluZyB0YXNrIHRvIGEgdGFza1xyXG4gICAgLy8gd2hvc2UgJ2Fib3J0JyBjb21tYW5kIGFycml2ZWQgYW5kIGlzIHBlbmRpbmcgZm9yIGV4ZWN1dGlvbi4gVW5kZXIgdGhlc2VcclxuICAgIC8vIGNpcmN1bXN0YW5jZXMsIHdlIG11c3QgY2hlY2sgZXZlcnkgYWNjZXNzIHRvIHRyaWdnZXJpbmdUYXNrIGFuZCBtYWtlIHN1cmVcclxuICAgIC8vIGl0IHBvaW50cyB0byBhIHZhbGlkIHRhc2suXHJcbiAgICBpZiAodGhpcy5fdHJpZ2dlcmluZ1Rhc2sgIT09IG51bGwgJiYgdGhpcy5fdHJpZ2dlcmluZ1Rhc2suZ2V0TUdEYXRhKCkuSXNBYm9ydGluZylcclxuICAgICAgdGhpcy5fdHJpZ2dlcmluZ1Rhc2sgPSB0aGlzLl9wYXJlbnRUYXNrO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl90cmlnZ2VyaW5nVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGxhc3QgcGFya2VkIGNvbnRyb2wgaW4gdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5sYXN0IGZvY3VzZWQgY29udHJvbDwvcGFyYW0+XHJcbiAgc2V0TGFzdFBhcmtlZEN0cmwoY3RybDogTWdDb250cm9sQmFzZSk6IHZvaWQge1xyXG4gICAgc3VwZXIuc2V0TGFzdFBhcmtlZEN0cmwoY3RybCk7XHJcbiAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuc2V0TGFzdEZvY3VzZWRDb250cm9sKHRoaXMsIGN0cmwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFF1ZXJ5IFRhc2sgUGF0aCBSZXR1cm5zIHRoZSB0YXNrIHBhdGggdGhhdCBsZWFkcyB0byB0aGUgY3VycmVudCB0YXNrLiBUaGUgcmVzdWx0aW5nIGFscGhhIHN0cmluZ1xyXG4gIC8vLyAgIGNvbnRhaW5zIHRoZSB0YXNrIG5hbWVzLCBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IG5hbWUgb2YgdGhlIHRhc2suIE5hbWVzIGFyZSBzZXBhcmF0ZWQgYnkgdGhlICc7J1xyXG4gIC8vLyAgIGNoYXJhY3Rlci4gRm9yIFBST0coKSB1c2luZy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHF1ZXJ5VGFza1BhdGgoKTogU3RyaW5nQnVpbGRlciB7XHJcbiAgICBsZXQgaW5zZXJ0ZWROYW1lczogbnVtYmVyID0gMDsgICAgICAgIC8vIGhvdyBtYWNoIG5hbWVzIGluc2VydGVkIHRvIHRoZSBvdXRwdXQgc3RyaW5nXHJcbiAgICBsZXQgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoNzkzNik7IC8vIDMxICogMjU2ICovXHJcbiAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KHRoaXMuZ2V0VGFza0RlcHRoKGZhbHNlKSk7XHJcbiAgICB0aGlzLnBhdGhUb1Jvb3QodHJlZVJvdXRlLCBmYWxzZSk7XHJcbiAgICBmb3IgKGxldCB0c2s6IG51bWJlciA9IHRyZWVSb3V0ZS5sZW5ndGggLSAxOyB0c2sgPj0gMDsgdHNrLS0pIHtcclxuICAgICAgbGV0IGN1cnJUc2s6IFRhc2sgPSB0cmVlUm91dGVbdHNrXTtcclxuICAgICAgaWYgKGN1cnJUc2suaXNNYWluUHJvZygpKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICBsZXQgbmFtZVByb3A6IFByb3BlcnR5ID0gY3VyclRzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpO1xyXG4gICAgICBpZiAobmFtZVByb3AgPT0gbnVsbClcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IG5hbWVQcm9wLkdldENvbXB1dGVkVmFsdWUoKTtcclxuICAgICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkobmFtZSkpIHtcclxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBvbmx5IDEgbmFtZSAtPiBkb24ndCBpbnNlcnQgJzsnXHJcbiAgICAgICAgLy8gYWZ0ZXIgbGFzdCBuYW1lIGRvbid0IGluc2VydCAnOycgdG9vLlxyXG4gICAgICAgIGlmIChpbnNlcnRlZE5hbWVzKysgIT09IDApXHJcbiAgICAgICAgICByZXN1bHQuQXBwZW5kKCc7Jyk7XHJcbiAgICAgICAgcmVzdWx0LkFwcGVuZChuYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgRmllbGQgd2hpY2ggY29udGFpbiBpdGVtIG51bWJlciBpdG1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGN0bF9pdG1fMl9wYXJlbnRfdmVlKGl0bTogbnVtYmVyKTogRmllbGQge1xyXG4gICAgbGV0IGN1cnJUc2s6IFRhc2s7XHJcbiAgICBsZXQgY3Vyckl0bTogbnVtYmVyID0gMDtcclxuICAgIGxldCBsYXN0SXRtOiBudW1iZXIgPSAwOyAgICAgIC8vIHN0YXJ0IG9mIHRoZSBmaWVsZCBpbiBmaWVsZGVUYWIgbnVtYmVyIGZvciBjaGVja2VkIHRhc2tcclxuICAgIC8vIHNhdmUgdGhlIHJvdXRlIHRvIHRoZSByb290IGluIHRoZSB0cmVlUm91dGUgYXJyYXlcclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkodGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSkpO1xyXG4gICAgLy8gdGhlIHJvdXRlIHVwLCB0aGUgaW5zZXJ0IChvdXIgdGFzaykgaXMgWzBdLCBhbmQgZXhpdCAocm9vdCkgaXMgW3RyZWVSb3V0ZS5sZW5ndGgtMV1cclxuICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG5cclxuICAgIGZvciAobGV0IHRzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRzayA+PSAwOyB0c2stLSkge1xyXG4gICAgICBjdXJyVHNrID0gdHJlZVJvdXRlW3Rza107XHJcblxyXG4gICAgICBjdXJySXRtICs9IGN1cnJUc2suRGF0YVZpZXcuR2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgLy8gZm91bmQgdGFzayB3aGljaCBjb250YWlucyB0aGUgbmVlZGVkIGZpZWxkXHJcbiAgICAgIGlmIChpdG0gPCBjdXJySXRtKSB7XHJcbiAgICAgICAgLy8gbnVtYmVyIG9mIEZpZWxkIGluIGZvdW5kIHRhc2tcclxuICAgICAgICBpdG0gLT0gbGFzdEl0bTtcclxuICAgICAgICByZXR1cm4gPEZpZWxkPmN1cnJUc2suRGF0YVZpZXcuZ2V0RmllbGQoaXRtKTtcclxuICAgICAgfVxyXG4gICAgICBsYXN0SXRtID0gY3Vyckl0bTtcclxuICAgIH1cclxuICAgIC8vIG5vdCBmb3VuZCB0aGUgZmllbGRcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGNvbnRyb2wgaWQgd2hpY2ggY29udGFpbiBmaWVsZCBhdHRhY2hlZCB0byBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpdGVtXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldENvbnRyb2xJREZyb21WYXJJdGVtKGl0ZW06IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2s7XHJcbiAgICBsZXQgY3Vyckl0ZW06IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbGFzdEl0ZW06IG51bWJlciA9IDA7ICAgLy8gc3RhcnQgb2YgdGhlIGZpZWxkIGluIGZpZWxkZVRhYiBudW1iZXIgZm9yIGNoZWNrZWQgdGFza1xyXG4gICAgbGV0IG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIHNhdmUgdGhlIHJvdXRlIHRvIHRoZSByb290IGluIHRoZSB0cmVlUm91dGUgYXJyYXlcclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkodGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSkpO1xyXG4gICAgLy8gdGhlIHJvdXRlIHVwLCB0aGUgaW5zZXJ0IChvdXIgdGFzaykgaXMgWzBdLCBhbmQgZXhpdCAocm9vdCkgaXMgW3RyZWVSb3V0ZS5sZW5ndGggLSAxXVxyXG4gICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgZm9yIChsZXQgdGFzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRhc2sgPj0gMDsgdGFzay0tKSB7XHJcbiAgICAgIGN1cnJUYXNrID0gdHJlZVJvdXRlW3Rhc2tdO1xyXG4gICAgICBjdXJySXRlbSArPSBjdXJyVGFzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAvLyBGb3VuZCB0aGUgdGFzayB3aGljaCBjb250YWlucyB0aGUgbmVlZGVkIGNvbnRyb2wgJiBmaWVsZFxyXG4gICAgICBpZiAoaXRlbSA8IGN1cnJJdGVtKSB7XHJcbiAgICAgICAgLy8gTnVtYmVyIG9mIGZpZWxkcyBpbiBmb3VuZCB0YXNrXHJcbiAgICAgICAgaXRlbSAtPSBsYXN0SXRlbTtcclxuXHJcbiAgICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD5jdXJyVGFzay5EYXRhVmlldy5nZXRGaWVsZChpdGVtKTtcclxuICAgICAgICBpZiAoZmllbGQuZ2V0Q3RybCgpICE9IG51bGwpXHJcbiAgICAgICAgICByZXR1cm4gbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgPSBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArIGN1cnJUYXNrLkZvcm0uZ2V0Q29udHJvbElkeChmaWVsZC5nZXRDdHJsKCkpICsgMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjdXJyVGFzay5Gb3JtICE9IG51bGwpXHJcbiAgICAgICAgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgKz0gY3VyclRhc2suRm9ybS5nZXRDdHJsQ291bnQoKTtcclxuXHJcbiAgICAgIGxhc3RJdGVtID0gY3Vyckl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udHJvbCBhdHRhY2hlZCB0byB0aGUgdmFyaWFibGUgaW4gc2FtZSB0YXNrIG5vdCBmb3VuZFxyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgY29udHJvbCBmcm9tIGNvbnRyb2xJRFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udHJvbElEXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldENvbnRyb2xGcm9tQ29udHJvbElEKGNvbnRyb2xJRDogbnVtYmVyLCBwYXJlbnQ6IFJlZlBhcmFtPG51bWJlcj4pOiBNZ0NvbnRyb2wge1xyXG4gICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgICBwYXJlbnQudmFsdWUgPSAtMTtcclxuXHJcbiAgICBpZiAoY29udHJvbElEID49IDApIHtcclxuICAgICAgbGV0IGN1cnJUYXNrOiBUYXNrID0gbnVsbDtcclxuICAgICAgbGV0IGNhbGxlclRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICBsZXQgbm9PZkNvbnRyb2xzSW5DdXJydGFzazogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgY29udHJvbElkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgIC8vIHNhdmUgdGhlIHJvdXRlIHRvIHRoZSByb290IGluIHRoZSB0cmVlUm91dGUgYXJyYXlcclxuICAgICAgbGV0IHRyZWVSb3V0ZSA9IG5ldyBBcnJheSh0aGlzLmdldFRhc2tEZXB0aCh0cnVlKSk7XHJcblxyXG4gICAgICAvLyB0aGUgcm91dGUgdXAsIHRoZSBpbnNlcnQgKG91ciB0YXNrKSBpcyBbMF0sIGFuZCBleGl0IChyb290KSBpcyBbdHJlZVJvdXRlLmxlbmd0aCAtIDFdXHJcbiAgICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG5cclxuICAgICAgZm9yIChsZXQgdGFzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRhc2sgPj0gMDsgdGFzay0tKSB7XHJcblxyXG4gICAgICAgIGN1cnJUYXNrID0gdHJlZVJvdXRlW3Rhc2tdO1xyXG5cclxuICAgICAgICBpZiAoY3VyclRhc2suRm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBub09mQ29udHJvbHNJbkN1cnJ0YXNrID0gY3VyclRhc2suRm9ybS5nZXRDdHJsQ291bnQoKTtcclxuXHJcbiAgICAgICAgICAvLyBGb3VuZCB0aGUgdGFzayB3aGljaCBjb250YWlucyB0aGUgbmVlZGVkIGNvbnRyb2xcclxuICAgICAgICAgIGlmIChjb250cm9sSUQgPCAobm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgKyBub09mQ29udHJvbHNJbkN1cnJ0YXNrKSkge1xyXG4gICAgICAgICAgICAvLyBJZHggb2YgdGhlIGNvbnRyb2wgaW4gY3VycmVudCB0YXNrXHJcbiAgICAgICAgICAgIGNvbnRyb2xJZHggPSBjb250cm9sSUQgLSBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzaztcclxuICAgICAgICAgICAgY29udHJvbCA9IDxNZ0NvbnRyb2w+Y3VyclRhc2suRm9ybS5DdHJsVGFiLmdldEN0cmwoY29udHJvbElkeCk7XHJcbiAgICAgICAgICAgIGNhbGxlclRhc2sgPSBjdXJyVGFzaztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgKz0gbm9PZkNvbnRyb2xzSW5DdXJydGFzaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEdldCBwYXJlbnRcclxuICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICAgIHBhcmVudC52YWx1ZSA9IDA7XHJcbiAgICAgICAgbGV0IHByZXZDdGxJZHg6IG51bWJlciA9IHRyZWVSb3V0ZVswXS5UYXNrRGVmaW5pdGlvbklkLkN0bEluZGV4O1xyXG5cclxuICAgICAgICBmb3IgKGxldCB0YXNrOiBudW1iZXIgPSAwOyB0YXNrIDwgdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRhc2srKykge1xyXG4gICAgICAgICAgY3VyclRhc2sgPSB0cmVlUm91dGVbdGFza107XHJcblxyXG4gICAgICAgICAgaWYgKHByZXZDdGxJZHggIT09IGN1cnJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXgpXHJcbiAgICAgICAgICAgIHBhcmVudC52YWx1ZSsrO1xyXG5cclxuICAgICAgICAgIGlmIChjYWxsZXJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXggPT09IGN1cnJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXgpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIHByZXZDdGxJZHggPSBjdXJyVGFzay5UYXNrRGVmaW5pdGlvbklkLkN0bEluZGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbnRyb2wgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIENvbnRyb2xJRFxyXG4gICAgcmV0dXJuIGNvbnRyb2w7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjdGxfaXRtXzRfcGFyZW50X3ZlZShwYXJlbnQ6IG51bWJlciwgdmVlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHRzazogVGFzaztcclxuICAgIGxldCBkZXB0aDogbnVtYmVyID0gdGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSk7XHJcblxyXG4gICAgaWYgKHBhcmVudCAhPT0gVGFza0Jhc2UuTUFJTl9QUkdfUEFSRU5UX0lEICYmIGRlcHRoIDw9IHBhcmVudClcclxuICAgICAgcmV0dXJuIHZlZTtcclxuXHJcbiAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KGRlcHRoKTtcclxuXHJcbiAgICBpZiAodmVlICE9PSAwKSB7XHJcbiAgICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG5cclxuICAgICAgLy8gZ2V0IHRoZSBpbmRleCBvZiBwYXJlbnQgaW4gdGhlIHRhc2sgdHJlZVxyXG4gICAgICBsZXQgaW5kT2ZQYXJlbnRJblRhc2tUcmVlOiBudW1iZXIgPSB0aGlzLmdldEluZE9mUGFyZW50SW5UYXNrVHJlZShwYXJlbnQsIHRyZWVSb3V0ZSk7XHJcblxyXG4gICAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgICBmb3IgKGkgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgaSA+IGluZE9mUGFyZW50SW5UYXNrVHJlZTsgaS0tKSB7XHJcbiAgICAgICAgdHNrID0gdHJlZVJvdXRlW2ldO1xyXG4gICAgICAgIHZlZSArPSB0c2suRGF0YVZpZXcuR2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1RyZWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0SW5kT2ZQYXJlbnRJblRhc2tUcmVlKHBhcmVudDogbnVtYmVyLCB0YXNrVHJlZTogVGFza1tdKTogbnVtYmVyIHtcclxuICAgIGxldCBpbmRPZlBhcmVudEluVGFza1RyZWU6IG51bWJlciA9IDA7XHJcbiAgICBpZiAocGFyZW50ID09PSBUYXNrQmFzZS5NQUlOX1BSR19QQVJFTlRfSUQpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8IHRhc2tUcmVlLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgaWYgKHRhc2tUcmVlW2ldLmlzTWFpblByb2coKSAmJiB0aGlzLl9jdGxJZHggPT09IHRhc2tUcmVlW2ldLmdldEN0bElkeCgpKSB7XHJcbiAgICAgICAgICBpbmRPZlBhcmVudEluVGFza1RyZWUgPSBpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIGluZE9mUGFyZW50SW5UYXNrVHJlZSA9IHBhcmVudDtcclxuXHJcbiAgICByZXR1cm4gaW5kT2ZQYXJlbnRJblRhc2tUcmVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGVudHJ5IHBvaW50IHRvIHRoZSByZWN1cnNpb24gaW5kdWNlZCBieSBnZXRGaWVsZEJ5TmFtZV8uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGEgZmllbGQgd2hpY2ggYmVsb25ncyB0byBtZSBvciB0byBteSBwYXJlbnRzIHdpdGggdGhlIG1hdGNoaW5nIG5hbWU8L3JldHVybnM+XHJcbiAgZ2V0RmllbGRCeU5hbWUoZmxkTmFtZTogc3RyaW5nKTogRmllbGQge1xyXG4gICAgcmV0dXJuICg8VGFzaz4gKHRoaXMuR2V0Q29udGV4dFRhc2soKSkpLmdldEZpZWxkQnlOYW1lXyhmbGROYW1lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmaW5kIGZpZWxkIHdpdGggdGhlIG5hbWUgaW4gdGFzayBvciBpdHMgYW5jZXN0b3JzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZE5hbWVcIj5uYW1lLCB0aGUgbmFtZSBjYW4gYmUgZW1wdHkgc3RyaW5nIHRvbzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBJZiB0aGUgdmFyaWFibGUgbmFtZSBpcyBub3QgZm91bmQgdGhlbiB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gTlVMTC48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRGaWVsZEJ5TmFtZV8oZmxkTmFtZTogc3RyaW5nKTogRmllbGR7XHJcbiAgICBsZXQgdG1wVGFzazogVGFzaztcclxuXHJcbiAgICBpZiAoZmxkTmFtZSA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIGxldCBmbGQ6IEZpZWxkID0gdGhpcy5nZXRGaWVsZChmbGROYW1lKTtcclxuXHJcbiAgICAvLyBpZiB0aGUgZmllbGQgaXMgbm90IG91cnMgLSByZWN1cnNpdmUgY2hlY2sgdGhlIGFuY2VzdG9yc1xyXG4gICAgaWYgKGZsZCA9PSBudWxsKSB7XHJcbiAgICAgIHRtcFRhc2sgPSB0aGlzLmdldFRyaWdnZXJpbmdUYXNrKCkgIT0gbnVsbCA/IHRoaXMuZ2V0VHJpZ2dlcmluZ1Rhc2soKSA6IHRoaXMuX3BhcmVudFRhc2s7XHJcblxyXG4gICAgICBpZiAodG1wVGFzayAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTWFpblByb2coKSAmJiB0aGlzLmdldEN0bElkeCgpICE9PSB0bXBUYXNrLmdldEN0bElkeCgpKSB7XHJcbiAgICAgICAgICBsZXQgbWFpblByZzogVGFzayA9IDxUYXNrPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCB0aGlzLmdldEN0bElkeCgpKTtcclxuICAgICAgICAgIGZsZCA9IG1haW5QcmcuZ2V0RmllbGRCeU5hbWVfKGZsZE5hbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZsZCA9PSBudWxsKVxyXG4gICAgICAgICAgZmxkID0gdG1wVGFzay5nZXRGaWVsZEJ5TmFtZV8oZmxkTmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmbGQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGluZGV4IG9mIHRoZSBmaWVsZCBpbiB0aGUgdGFzayBvciBpdHMgYW5jZXN0b3JzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZE5hbWVcIj5uYW1lPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IElmIHRoZSB2YXJpYWJsZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVuIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gWmVyby48L3JldHVybnM+XHJcbiAgZ2V0SW5kZXhPZkZpZWxkQnlOYW1lKGZsZE5hbWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgZGVwdGg6IG51bWJlciA9IHRoaXMuZ2V0VGFza0RlcHRoKHRydWUpO1xyXG4gICAgbGV0IGluZGV4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGZsZDogRmllbGQgPSB0aGlzLmdldEZpZWxkQnlOYW1lKGZsZE5hbWUpO1xyXG4gICAgbGV0IGZsZFRhYjogRmllbGRzVGFibGU7XHJcblxyXG4gICAgaWYgKGZsZCA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gMDtcclxuXHJcbiAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KGRlcHRoKTtcclxuICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG4gICAgZm9yIChsZXQgY3VycjogbnVtYmVyID0gZGVwdGggLSAxOyBjdXJyID49IDA7IGN1cnItLSkge1xyXG4gICAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSB0cmVlUm91dGVbY3Vycl07XHJcbiAgICAgIGlmIChjdXJyVGFzayA9PT0gZmxkLmdldFRhc2soKSkge1xyXG4gICAgICAgIGN1cnIgPSBmbGQuZ2V0SWQoKTtcclxuICAgICAgICBpbmRleCArPSArK2N1cnI7ICAgICAgICAgLy8gc3RhcnQgaW5kZXggaW4gTWFnaWMgZnJvbSAxIGFuZCBub3QgZnJvbSAwXHJcbiAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgIC8vIGdldCBvdXQgb2YgdGhlIHRhc2sgdHJlZSAtIHRoZSBpbmRleCBpcyBmb3VuZFxyXG4gICAgICB9XHJcbiAgICAgIGZsZFRhYiA9IDxGaWVsZHNUYWJsZT5jdXJyVGFzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKTtcclxuICAgICAgaW5kZXggKz0gZmxkVGFiLmdldFNpemUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpbmRleDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxjdWxhdGUgdGhlIHBhdGggZnJvbSB0aGlzIHRhc2sgdG8gdGhlIHJvb3Qgb2YgdGhlIHRhc2tzIHRyZWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGF0aFwiPmFycmF5IG9mIHRhc2tzLCB0aGUgcm91dGUgdXAuIFRoZSAwIGl0ZW0gaXMgc3RhcnQgcG9pbnQgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJieVBhcmVudE9yZGVyXCI+aWYgdHJ1ZSwgd2UgdHJhdmVsIHRoZSBwYXJlbnRzLCBvdGhlcndpc2Ugd2UgdHJhdmVsIHRoZSB0cmlnZ2VyaW5nIHRhc2tzPC9wYXJhbT5cclxuICBwYXRoVG9Sb290KHBhdGg6IFRhc2tbXSwgYnlQYXJlbnRPcmRlcjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSAoYnlQYXJlbnRPcmRlciA/IHRoaXMgOiA8VGFzaz4gdGhpcy5HZXRDb250ZXh0VGFzaygpKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBwYXRoW2ldID0gdGFzaztcclxuICAgICAgbGV0IGN0bElkeDogbnVtYmVyID0gdGFzay5nZXRDdGxJZHgoKTtcclxuXHJcbiAgICAgIGxldCB0bXBUYXNrOiBUYXNrID0gYnlQYXJlbnRPcmRlciA/IG51bGwgOiB0YXNrLmdldFRyaWdnZXJpbmdUYXNrKCk7XHJcblxyXG4gICAgICBpZiAodG1wVGFzayAhPSBudWxsKVxyXG4gICAgICAgIHRhc2sgPSB0bXBUYXNrO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0YXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2sgPT0gbnVsbCkge1xyXG4gICAgICAgICAgLy8gUUNSIDM2Njc0OCBpZiB3ZSBhcmUgaW4gYSBjb21wb25lbnQgZ2xvYmFsIGhhbmRsZXIgYWRkIGl0IHRvIHRoZSBwYXRoXHJcbiAgICAgICAgICBpZiAoIWJ5UGFyZW50T3JkZXIgJiYgdGhpcy5pc01haW5Qcm9nKCkgJiYgdGhpcy5nZXRDdGxJZHgoKSAhPT0gQ29uc3RJbnRlcmZhY2UuVE9QX0xFVkVMX0NPTlRBSU5FUilcclxuICAgICAgICAgICAgcGF0aFtpICsgMV0gPSB0aGlzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYnlQYXJlbnRPcmRlciAmJiBjdGxJZHggIT09IHRhc2suZ2V0Q3RsSWR4KCkpXHJcbiAgICAgICAgICBwYXRoWysraV0gPSA8VGFzaz5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCgtMSwgY3RsSWR4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoaXMgdGFzayBzaG91bGQgYmUgcmVmcmVzaGVkIC0gY29tcGFyZSB0aGUgXCJyZWZyZXNoIG9uXCIgZmllbGRzIG9mIHRoZSBjdXJyZW50IHJlY29yZCB0byB0aGVcclxuICAvLy8gICBwcmV2aW91cyByZWNvcmQgYW5kIGlmIGRpZmZlcmVudCB2YWx1ZXMgYXJlIGZvdW5kIHJldHVybnMgdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzaG91bGRCZVJlZnJlc2hlZCgpOiBib29sZWFuIHtcclxuICAgIGxldCBkYXRhVmlldzogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5fcGFyZW50VGFzay5EYXRhVmlldztcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBwcmV2Q3VyclJlYyBpcyBudWxsIG9ubHkgaWYgaXQgaXMgdGhlIGZpcnN0IHRpbWUgb3IgYWZ0ZXIgQ2FuY2VsLlxyXG4gICAgLy8gQWZ0ZXIgQ2FuY2VsIGluIHRoZSBwYXJlbnQgdGFzayBTdWJmb3JtIHJlZnJlc2ggbXVzdCBiZSBkb25lIGFsd2F5c1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgPT09IG51bGwgfHwgZGF0YVZpZXcuaXNQcmV2Q3VyclJlY051bGwoKSB8fFxyXG4gICAgICAodGhpcy5SZWZyZXNoT25WYXJzICE9PSBudWxsICYmICFkYXRhVmlldy5jdXJyRXF1YWxzUHJldih0aGlzLlJlZnJlc2hPblZhcnMpKSlcclxuICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3ViVGFza3MgKHN1YmZvcm1zKSBzaG91bGQgYmUgcmVmcmVzaGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBDaGVja1JlZnJlc2hTdWJUYXNrcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBkbyBub3QgcmVmcmVzaCBzdWJmb3JtcyBiZWZvcmUgdGhlIGZpcnN0IHJlY29yZCBwcmVmaXguIFRoZSBzZXJ2ZXIgc2VudCB1cyB0aGVpciBkYXRhdmlldyFcclxuICAgIGlmICh0aGlzLl9lbnRlcmVkUmVjTGV2ZWwpIHtcclxuICAgICAgbGV0IHN1YmZvcm1zVG9SZWZyZXNoOiBMaXN0PFRhc2s+ID0gYXdhaXQgdGhpcy5HZXRTdWJmb3Jtc1RvUmVmcmVzaCgpO1xyXG5cclxuICAgICAgaWYgKHN1YmZvcm1zVG9SZWZyZXNoLmxlbmd0aCA+IDApXHJcbiAgICAgICAgcmV0ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldHMgYSBsaXN0IG9mIHN1YnRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+YSBsaXN0IG9mIHN1YnRhc2tzPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgR2V0U3ViVGFza3MoKTogTGlzdDxUYXNrPiB7XHJcbiAgICBsZXQgc3ViVGFza3M6IExpc3Q8VGFzaz4gPSBuZXcgTGlzdDxUYXNrPigpO1xyXG5cclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpID0gaSArIDEpXHJcbiAgICAgICAgc3ViVGFza3MucHVzaCg8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdWJUYXNrcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyBhIGxpc3Qgb2YgdGhvc2Ugc3ViZm9ybXMgdGhhdCBtdXN0IGJlIHJlZnJlc2hlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5saXN0IG9mIHN1YmZvcm1zIHRvIHJlZnJlc2g8L3JldHVybnM+XHJcbiAgYXN5bmMgR2V0U3ViZm9ybXNUb1JlZnJlc2goKTogUHJvbWlzZTxMaXN0PFRhc2s+PiB7XHJcbiAgICBsZXQgc3ViVGFza3M6IExpc3Q8VGFzaz4gPSB0aGlzLkdldFN1YlRhc2tzKCk7XHJcbiAgICBsZXQgc3ViVGFza3NUb1JlZnJlc2g6IExpc3Q8VGFzaz4gPSBuZXcgTGlzdDxUYXNrPigpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdWJUYXNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgc3ViVGFzazogVGFzayA9IHN1YlRhc2tzLmdldF9JdGVtKGkpO1xyXG4gICAgICBpZiAoYXdhaXQgdGhpcy5TaG91bGRSZWZyZXNoU3ViZm9ybVRhc2soc3ViVGFzaykpXHJcbiAgICAgICAgc3ViVGFza3NUb1JlZnJlc2gucHVzaChzdWJUYXNrKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdWJUYXNrc1RvUmVmcmVzaDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrIGlmIHRoZSBzcGVjaWZpYyBzdWJmb3JtIG11c3QgYmUgcmVmcmVzaGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIFNob3VsZFJlZnJlc2hTdWJmb3JtVGFzayhzdWJUYXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnN1YlRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcblxyXG4gICAgc3ViVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuICAgIC8vIERlZmVjdCA3Njk3OS4gU3ViZm9ybSBjYW4gZXhlY3V0ZSByZWZyZXNoIG9ubHkgYWZ0ZXIgaXQgaGFzIFRhc2tWaWV3LlxyXG4gICAgaWYgKHN1YmZvcm1DdHJsICE9IG51bGwgJiYgIXN1YlRhc2suSW5TZWxlY3QgJiYgc3ViVGFzay5BZnRlckZpcnN0UmVjb3JkUHJlZml4KSB7XHJcbiAgICAgIGxldCBwYXJlbnRNb2RlOiBzdHJpbmcgPSB0aGlzLmdldE1vZGUoKTtcclxuICAgICAgbGV0IG1vZGVQcm9wZXJ0eTogbnVtYmVyID0gKHBhcmVudE1vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgPyBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19RVUVSWVxyXG4gICAgICAgIDogcGFyZW50TW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRllcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRllcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUpO1xyXG5cclxuICAgICAgLy8gRm9yIGEgc3ViZm9ybSB3aXRoICdBc1BhcmVudCcgbW9kZSB3ZSBhbHNvIG11c3QgcmVmcmVzaCB0aGUgc3ViZm9ybVxyXG4gICAgICAvLyBhZnRlciB0aGUgcGFyZW50IHJlY29yZCBwcmVmaXguIElmIHRoZSBzcGVjaWZpYyBtb2RlIGlzIG5vdCBhbGxvd2VkXHJcbiAgICAgIC8vIHRoZSBzdWJmb3JtIGNvbnRpbnVlcyBpbiB0aGUgb2xkIG1vZGUuXHJcbiAgICAgIGlmIChzdWJUYXNrLk1vZGVBc1BhcmVudCAmJiBwYXJlbnRNb2RlICE9PSBzdWJUYXNrLmdldE1vZGUoKSAmJlxyXG4gICAgICAgIHRoaXMuZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEICYmXHJcbiAgICAgICAgYXdhaXQgKHN1YlRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSAmJlxyXG4gICAgICAgIGF3YWl0IHN1YlRhc2suY2hlY2tQcm9wKG1vZGVQcm9wZXJ0eSwgdHJ1ZSkpIHtcclxuICAgICAgICBpZiAoIXN1YmZvcm1DdHJsLmlzVmlzaWJsZSgpICYmXHJcbiAgICAgICAgICAhYXdhaXQgc3ViZm9ybUN0cmwuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFRlJFU0hfV0hFTl9ISURERU4sIGZhbHNlKSkge1xyXG4gICAgICAgICAgc3ViZm9ybUN0cmwuUmVmcmVzaE9uVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICByZWZyZXNoID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHJlZnJlc2ggPSB0cnVlO1xyXG5cclxuICAgICAgICBhd2FpdCBzdWJUYXNrLlNldE1vZGVBc1BhcmVudChwYXJlbnRNb2RlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZWZyZXNoID0gYXdhaXQgc3ViZm9ybUN0cmwuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fUkVGUkVTSCwgdHJ1ZSkgJiYgc3ViVGFzay5zaG91bGRCZVJlZnJlc2hlZCgpO1xyXG5cclxuICAgICAgICBpZiAocmVmcmVzaCkge1xyXG4gICAgICAgICAgaWYgKCFzdWJmb3JtQ3RybC5pc1Zpc2libGUoKSAmJlxyXG4gICAgICAgICAgICAhYXdhaXQgc3ViZm9ybUN0cmwuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFRlJFU0hfV0hFTl9ISURERU4sIGZhbHNlKSkge1xyXG4gICAgICAgICAgICBzdWJmb3JtQ3RybC5SZWZyZXNoT25WaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmVmcmVzaCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlZnJlc2gpXHJcbiAgICAgICAgc3ViVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlZnJlc2g7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldHMgdGhlIHRhc2sgbW9kZSBhcyBwYXJlbnQgbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyZW50TW9kZVwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgU2V0TW9kZUFzUGFyZW50KHBhcmVudE1vZGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5lbmFibGVNb2RlcygpO1xyXG5cclxuICAgIGlmIChwYXJlbnRNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19DUkVBVEUpO1xyXG4gICAgICBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgdGhpcy5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICB0aGlzLnNldFByZXZlbnRDb250cm9sQ2hhbmdlKHRydWUpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVyk7XHJcbiAgICAgIHRoaXMuc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgIHRoaXMuc2V0UHJldmVudENvbnRyb2xDaGFuZ2UoZmFsc2UpO1xyXG4gICAgICBsZXQgc3ViVGFza0R2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLkRhdGFWaWV3O1xyXG4gICAgICBpZiAoIXN1YlRhc2tEdi5pc0VtcHR5KCkgJiYgKHN1YlRhc2tEdi5nZXRDdXJyUmVjKCkpLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgICB0aGlzLnNldE1vZGUocGFyZW50TW9kZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICBhd2FpdCAoPE1nRm9ybT50aGlzLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuc2V0TW9kZShwYXJlbnRNb2RlKTtcclxuXHJcbiAgICB0aGlzLnNldE9yaWdpbmFsVGFza01vZGUocGFyZW50TW9kZSk7XHJcbiAgICBhd2FpdCB0aGlzLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gYWZ0ZXIgY29tcHV0ZSBkbyBzdWJmb3JtIHRhc2sgcmVjb3JkIHByZWZpeCAmIHN1ZmZpeFxyXG4gIGFzeW5jIGRvU3ViZm9ybVJlY1ByZWZpeFN1ZmZpeCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IHRoaXMuR2V0U3ViVGFza3MoKTtcclxuXHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN1YlRhc2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gc3ViVGFza3MuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIGlmIChzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCkge1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHN1YlRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYLCB0cnVlKTtcclxuICAgICAgICBpZiAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soc3ViVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENsZWFuIGZsYWcgZm9yIFN1YmZvcm0gcmVjb3JkIGN5Y2xlIDwvc3VtbWFyeT5cclxuICBDbGVhbkRvU3ViZm9ybVByZWZpeFN1ZmZpeCgpOiB2b2lkIHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IHRoaXMuR2V0U3ViVGFza3MoKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3ViVGFza3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHN1YlRhc2s6IFRhc2sgPSBzdWJUYXNrcy5nZXRfSXRlbShpKTtcclxuICAgICAgc3ViVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgbXVzdCBkaXNwbGF5IGNvbmZpcm1hdGlvbiB3aW5kb3cgcHJpb3IgdG8gZGVsZXRpbmcgYSByZWNvcmQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBtdXN0Q29uZmlybUluRGVsZXRlTW9kZSgpOiBib29sZWFuIHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX1VQREFURSk7XHJcblxyXG4gICAgLy8gQXMgc3RyYW5nZSBhcyBpdCBzb3VuZHMsIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbiBleHByZXNzaW9uIHdoaWNoIGV2YWx1YXRlcyB0b1xyXG4gICAgLy8gRmFsc2UsIHRoZW4gbm8gbmVlZCB0byBkaXNwbGF5IGNvbmZpcm1hdGlvbi4uLlxyXG4gICAgcmV0dXJuICFwcm9wLmlzRXhwcmVzc2lvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhIHN1Yi10YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1YlRhc2tcIj50aGUgc3ViIHRhc2sgdG8gYWRkPC9wYXJhbT5cclxuICBhZGRTdWJUYXNrKHN1YlRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLlN1YlRhc2tzID09PSBudWxsKVxyXG4gICAgICB0aGlzLlN1YlRhc2tzID0gbmV3IFRhc2tzVGFibGUoKTtcclxuICAgIHRoaXMuU3ViVGFza3MuYWRkVGFzayhzdWJUYXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1vdmUgb25lIG9mIHRoaXMgdGFza3Mgc3ViLXRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3ViVGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSBzdWItdGFzayB0byByZW1vdmU8L3BhcmFtPlxyXG4gIHJlbW92ZVN1YlRhc2soc3ViVGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuU3ViVGFza3MgIT09IG51bGwpXHJcbiAgICAgIHRoaXMuU3ViVGFza3MucmVtb3ZlVGFzayhzdWJUYXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBmYWlsZWQgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmbGFnPC9wYXJhbT5cclxuICBzZXRUcmFuc2FjdGlvbkZhaWxlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3RyYW5zYWN0aW9uRmFpbGVkID0gdmFsO1xyXG5cclxuICAgIGlmICghdmFsKVxyXG4gICAgICB0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFwiZHluYW1pY0RlZi50cmFuc2FjdGlvbiBmYWlsZWRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxldmVsXCI+aXMgdGhlIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gbGV2ZWwgd2UgYXJlIGludGVyZXN0ZWQgaW4gY2hlY2tpbmcuIFRSQU5TX05PTkUgLS0+IGNoZWNrIGZvciBhbnlcclxuICAvLy8gICBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGxldmVsIGZhaWx1cmUgVFJBTlNfUkVDT1JEL1RBU0tfUFJFRklYIC0tPiBjaGVjayBmb3IgYSBmYWlsdXJlIGluIHRoYXQgc3BlY2lmaWNcclxuICAvLy8gICBsZXZlbDwvcGFyYW0+XHJcbiAgdHJhbnNhY3Rpb25GYWlsZWQobGV2ZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGxldmVsID09PSBDb25zdEludGVyZmFjZS5UUkFOU19OT05FIHx8XHJcbiAgICAgICh0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbi5nZXRMZXZlbCgpID09PSBsZXZlbCkpXHJcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbkZhaWxlZDtcclxuICAgIGVsc2UgaWYgKGxldmVsID09PSBDb25zdEludGVyZmFjZS5UUkFOU19OT05FIHx8XHJcbiAgICAgICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5LmdldExldmVsKCkgPT09IGxldmVsKSlcclxuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uRmFpbGVkO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgZmxhZyBvZiBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gcmV0cnkgb24gdGhlIHRhc2sncyBkeW5hbWljRGVmLnRyYW5zYWN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnZhbHVlIG9mIGZsYWc8L3BhcmFtPlxyXG4gIHNldEFmdGVyUmV0cnkodmFsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwpXHJcbiAgICAgIHRoaXMuVHJhbnNhY3Rpb24uc2V0QWZ0ZXJSZXRyeSh2YWwpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkgIT0gbnVsbCkge1xyXG4gICAgICBpZiAodmFsID09PSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FKVxyXG4gICAgICAgIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ID0gbnVsbDtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5LnNldEFmdGVyUmV0cnkodmFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEFmdGVyUmV0cnkoKTogYm9vbGVhbjtcclxuICBnZXRBZnRlclJldHJ5KHJlY292ZXJ5OiBzdHJpbmcpOiBib29sZWFuO1xyXG4gIGdldEFmdGVyUmV0cnkocmVjb3Zlcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEFmdGVyUmV0cnlfMCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZ2V0QWZ0ZXJSZXRyeV8xKHJlY292ZXJ5KTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiB0aGlzIHRhc2sgaXMgcGFydCBvZiBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gY3VycmVudGx5IGJlaW5nIHJldHJpZWQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRBZnRlclJldHJ5XzAoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbi5nZXRBZnRlclJldHJ5KCk7XHJcbiAgICBlbHNlIGlmICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuZ2V0QWZ0ZXJSZXRyeSgpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoaXMgdGFzayBpcyBwYXJ0IG9mIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBjdXJyZW50bHkgYmVpbmcgcmV0cmllZCB3aXRoIGEgc3BlY2lmaWMgcmVjb3Zlcnk8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRBZnRlclJldHJ5XzEocmVjb3Zlcnk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuVHJhbnNhY3Rpb24uZ2V0QWZ0ZXJSZXRyeShyZWNvdmVyeSk7XHJcbiAgICBlbHNlIGlmICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuZ2V0QWZ0ZXJSZXRyeShyZWNvdmVyeSk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBFeGVjRW5kVGFzayBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBfYkV4ZWNFbmRUYXNrIHZhbHVlPC9yZXR1cm5zPlxyXG4gIGdldEV4ZWNFbmRUYXNrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2JFeGVjRW5kVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNldCB0aGUgXCJleGVjdXRlIGVuZCB0YXNrXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRFeGVjRW5kVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2JFeGVjRW5kVGFzayA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSBcImV4ZWN1dGUgZW5kIHRhc2tcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRFeGVjRW5kVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2JFeGVjRW5kVGFzayA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRXZhbHVhdGUgdGhlIGVuZCBjb25kaXRpb24gcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibW9kZVwiPnRoZSBtb2RlIHRvIGNvbXBhcmUgdG88L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gc2hvdWxkIHdlIGV2YWx1YXRlIHRoZSBlbmQgY29uZGl0aW9uPzwvcmV0dXJucz5cclxuICBhc3luYyBldmFsRW5kQ29uZChtb2RlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBlbmRUYXNrQ29uZFByb3A6IFByb3BlcnR5O1xyXG4gICAgbGV0IGV2YWxFbmRDb25kUHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVZBTF9FTkRfQ09ORElUSU9OKTtcclxuXHJcbiAgICAvLyBEb250IGV2YWx1YXRlIGVuZCBjb25kaXRpb24gaWYgd2UgYXJlIGFscmVhZHkgY2xvc2luZyB0aGUgdGFza1xyXG4gICAgaWYgKHRoaXMuSW5FbmRUYXNrKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX2JFeGVjRW5kVGFzaylcclxuICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgaWYgKGV2YWxFbmRDb25kUHJvcCAhPSBudWxsICYmICggTlN0cmluZy5Db21wYXJlKGF3YWl0IGV2YWxFbmRDb25kUHJvcC5nZXRWYWx1ZSgpLCBDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0lNTUlESUFURSxcclxuICAgICAgICB0cnVlKSA9PT0gMCB8fCAoKGF3YWl0IGV2YWxFbmRDb25kUHJvcC5nZXRWYWx1ZSgpKS50b0xvd2VyQ2FzZSgpID09PSBtb2RlLnRvTG93ZXJDYXNlKCkpKSkge1xyXG4gICAgICAvLyBjaGVjayB0aGUgZW5kIGNvbmRpdGlvblxyXG4gICAgICBlbmRUYXNrQ29uZFByb3AgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5EX0NPTkRJVElPTik7XHJcbiAgICAgIGlmIChlbmRUYXNrQ29uZFByb3AgPT0gbnVsbClcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGxldCBlbmRUYXNrOiBzdHJpbmcgPSBhd2FpdCBlbmRUYXNrQ29uZFByb3AuZ2V0VmFsdWUoKTtcclxuICAgICAgLy8gc2lnbmFsIHdlIG5lZWQgdG8gcGVyZm9ybSBhbiBlbmQgdGFzayBhZnRlciB3ZSBnZXQgb3V0IG9mIHRoZSBsb29wXHJcbiAgICAgIGlmIChEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihlbmRUYXNrKSkge1xyXG4gICAgICAgIHRoaXMuX2JFeGVjRW5kVGFzayA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJ0cnlpbmcgdG8gc3RvcFwiIGZsYWcgZm9yIHRoZSB0YXNrIGFuZCBpdCdzIHN1YlRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSBmbGFnPC9wYXJhbT5cclxuICBzZXRUcnlpbmdUb1N0b3AodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgdGFzay5zZXRUcnlpbmdUb1N0b3AodmFsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5Jc1RyeWluZ1RvU3RvcCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGJJblJlY29yZFN1ZmZpeFxyXG4gIC8vLyA8L3N1bW1hcnlcclxuICBnZXRJblJlY29yZFN1ZmZpeCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pblJlY29yZFN1ZmZpeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGJJblJlY29yZFN1ZmZpeFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SW5SZWNvcmRTdWZmaXgoYlZhbHVlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYlZhbHVlICE9PSB0aGlzLl9pblJlY29yZFN1ZmZpeCkge1xyXG4gICAgICB0aGlzLl9pblJlY29yZFN1ZmZpeCA9IGJWYWx1ZTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBiRXZhbE9sZFZhbHVlcyBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJGbGFnXCI+dHJ1ZS9mYWxzZSB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlL2ZsYXNlIC0gdmFsdWUgdXBkYXRlZDwvcmV0dXJucz5cclxuICBzZXRFdmFsT2xkVmFsdWVzKGJGbGFnOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYkZsYWcgIT09IHRoaXMuX2V2YWxPbGRWYWx1ZXMpIHtcclxuICAgICAgdGhpcy5fZXZhbE9sZFZhbHVlcyA9IGJGbGFnO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGJFdmFsT2xkVmFsdWVzIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUvZmFsc2UgLSBsb29rIGF0IG9sZCB2YWx1ZXMgd2hlbiBnZXR0aW5nIHRoZSBmaWVsZCB2YWx1ZTwvcmV0dXJucz5cclxuICBnZXRFdmFsT2xkVmFsdWVzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2YWxPbGRWYWx1ZXM7XHJcbiAgfVxyXG5cclxuICAgYXN5bmMgZW5kVGFzayhyZXZlcnNpYmxlRXhpdDogYm9vbGVhbiwgb25seURlc2NzOiBib29sZWFuLCBkdWVUb1ZlcmlmeUVycm9yOiBib29sZWFuLCBzdWJmb3JtRGVzdGluYXRpb24/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoc3ViZm9ybURlc3RpbmF0aW9uKSlcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZW5kVGFza18xKHJldmVyc2libGVFeGl0LCBvbmx5RGVzY3MsIGZhbHNlLCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZW5kVGFza18xKHJldmVyc2libGVFeGl0LCBvbmx5RGVzY3MsIHN1YmZvcm1EZXN0aW5hdGlvbiwgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHN1Y2NlZWRlZCBpbiBlbmRpbmcgdGhlIHRhc2sgYW5kIGl0cyBzdWIgdGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmV2ZXJzaWJsZUV4aXRcIj5pZiB0cnVlIHRoZW4gdGhlIGV4aXQgaXMgcmV2ZXJzaWJsZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbmx5RGVzY3NcIj5pZiB0cnVlIHRoZW4gZW5kIG9ubHkgdGhlIHN1YiB0YXNrcyBhbmQgaGFuZGxlIHJlYyBzdWZmaXggZm9yIHRoaXMgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJmb3JtRGVzdGluYXRpb25cIj5pZiB0cnVlIHRoZW4gZW5kIG9ubHkgdGhpcyB0YXNrPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGVuZFRhc2tfMShyZXZlcnNpYmxlRXhpdDogYm9vbGVhbiwgb25seURlc2NzOiBib29sZWFuLCBzdWJmb3JtRGVzdGluYXRpb246IGJvb2xlYW4sIGR1ZVRvVmVyaWZ5RXJyb3I6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzdWNjZWVkZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IGNsb3NlZFN1YkZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBzdWJUYXNrOiBUYXNrO1xyXG4gICAgbGV0IG1nZFRhYjogSU1HRGF0YUNvbGxlY3Rpb24gPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGU7XHJcblxyXG4gICAgaWYgKCh0aGlzLklzU3ViRm9ybSAmJiAhc3ViZm9ybURlc3RpbmF0aW9uKSAmJiAhdGhpcy5fcGFyZW50VGFzay5JbkVuZFRhc2spIHtcclxuICAgICAgLy8gaWYgdGhpcyB0YXNrIGlzIGEgc3ViZm9ybSBhbmQgaXRzIHBhcmVudCBpcyBub3QgdHJ5aW5nIHRvIHN0b3AgdGhlblxyXG4gICAgICAvLyBzdGFydCBzdG9wcGluZyB0aGUgdGFza3Mgc3ViIHRyZWUgZnJvbSB0aGUgcGFyZW50IGZvcm1cclxuICAgICAgc3VjY2VlZGVkID0gYXdhaXQgdGhpcy5fcGFyZW50VGFzay5lbmRUYXNrKHJldmVyc2libGVFeGl0LCBvbmx5RGVzY3MsIGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoIXRoaXMuaXNBYm9ydGluZygpICYmICF0aGlzLkluRW5kVGFzaykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuSW5FbmRUYXNrID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBlcnJvciBhbmQgYnJvd3NlciBjbG9zZSwgaW50aW1hdGUgc2VydmVyIGFib3V0IGJyb3dzZXIgY2xvc2VcclxuICAgICAgICBpZigoTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkluRW5kVGFzayAmJiBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuQ2xvc2luZ0Zvcm1VSSkgJiYgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVVubG9hZENvbW1hbmQoKTtcclxuICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKDApLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICAgIGF3YWl0IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLklzVHJ5aW5nVG9TdG9wKVxyXG4gICAgICAgICAgdGhpcy5zZXRUcnlpbmdUb1N0b3AodHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIGV4aXQgZnJvbSBzdWJUYXNrcyBpbiBhIHByZWZpeCBtYW5uZXJcclxuICAgICAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCkge1xyXG4gICAgICAgICAgLy8gZXhpdCBmcm9tIHRoZSBzdWIgdGFza3NcclxuICAgICAgICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICghUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgICBsZXQgcGVuZGluZ1RyYW5zYWN0aW9uczogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgbGV0IGNsaWVudE9wZXJFeGlzdDogYm9vbGVhbiA9IGF3YWl0IHRoaXMuQ2hlY2tJZkNsaWVudE9wZXJhdGlvbkV4aXN0c0luU3ViZm9ybVRhc2tzKHRoaXMsXHJcbiAgICAgICAgICAgICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgpO1xyXG4gICAgICAgICAgICAgIGlmICghY2xpZW50T3BlckV4aXN0KSB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRPcGVyRXhpc3QgPSBhd2FpdCB0aGlzLkNoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcyh0aGlzLFxyXG4gICAgICAgICAgICAgICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgICAgaWYgKCFjbGllbnRPcGVyRXhpc3QpXHJcbiAgICAgICAgICAgICAgICAgIHBlbmRpbmdUcmFuc2FjdGlvbnMgPSB0aGlzLkNoZWNrSWZQZW5kaW5nVHJhbnNhY3Rpb25zKHRoaXMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoIWNsaWVudE9wZXJFeGlzdCAmJiAhcGVuZGluZ1RyYW5zYWN0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TZXRTZXJ2ZXJTaWRlVGFza1N1ZmZpeCh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICB0aGlzLlNldFNlcnZlclNpZGVUYXNrU3VmZml4KHRoaXMpO1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCkgJiYgc3VjY2VlZGVkOyBpKyspIHtcclxuICAgICAgICAgICAgICBzdWJUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgICAgICAgIGNsb3NlZFN1YkZvcm0gPSBjbG9zZWRTdWJGb3JtIHx8IHN1YlRhc2suSXNTdWJGb3JtO1xyXG4gICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbilcclxuICAgICAgICAgICAgICB0aGlzLlNldFNlcnZlclNpZGVUYXNrU3VmZml4KHRoaXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gZXhpdCBmb3IgdGhlIGZpcnN0IHRhc2sgbXVzdCBlbmQgYWxsIHRhc2tzXHJcbiAgICAgICAgICBpZiAodGhpcyA9PT0gbWdkVGFiLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkpIHtcclxuICAgICAgICAgICAgZm9yIChpID0gbWdkVGFiLmdldFNpemUoKSAtIDE7IGkgPiAwICYmIHN1Y2NlZWRlZDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG1nZFRhYi5nZXRNR0RhdGEoaSkgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKG1nZFRhYi5nZXRNR0RhdGEoaSkuZ2V0Rmlyc3RUYXNrKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHN1Y2NlZWRlZCkge1xyXG4gICAgICAgICAgLy8gaWYgY2xvc2luZyB0aGUgc3ViIHRhc2tzIHdhcyBzdWNjZXNzZnVsIHRoZW4gZXhlY3V0ZSByZWNvcmQgc3VmZml4XHJcbiAgICAgICAgICBpZiAocmV2ZXJzaWJsZUV4aXQgJiYgIWR1ZVRvVmVyaWZ5RXJyb3IpIHtcclxuICAgICAgICAgICAgbGV0IGZvcmNlU3VmZml4OiBib29sZWFuID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIC8vIGZvciBub24gaW50ZXJhY3RpdmUsIHR1cm4gb2ZmIHRoZSBmb3JjZSByZWNvcmQgc3VmZml4LFxyXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UgYW4gdW53YW50ZWQgdXBkYXRlIG1pZ2h0IGJlIHNlbnQgd2hlbiB0YXNrIGVuZHMuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5Jc0ludGVyYWN0aXZlICYmIGZvcmNlU3VmZml4ID09PSB0cnVlICYmIHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICB0aGlzLnNldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBcIjBcIik7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVzdG9yZSB0aGUgZm9yY2Ugc3VmZml4LCBmb3IganVzdCBpbiBjYXNlLlxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuSXNJbnRlcmFjdGl2ZSAmJiBmb3JjZVN1ZmZpeCA9PT0gdHJ1ZSAmJiB0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgXCIxXCIpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHN1Y2NlZWRlZCA9ICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSB8fCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuXHJcbiAgICAgICAgICBpZiAoc3VjY2VlZGVkICYmICFvbmx5RGVzY3MpXHJcbiAgICAgICAgICAgIHRoaXMuSGFuZGxlVHJhbnNhY3Rpb25JbmZvKCk7XHJcblxyXG4gICAgICAgICAgbGV0IHByZVRza1N1ZmZpeDogYm9vbGVhbiA9IHN1Y2NlZWRlZDtcclxuXHJcbiAgICAgICAgICAvLyBub3cgcGVyZm9ybSB0YXNrIHN1ZmZpeFxyXG4gICAgICAgICAgaWYgKHN1Y2NlZWRlZCAmJiAhb25seURlc2NzICYmIHJldmVyc2libGVFeGl0ICYmICFkdWVUb1ZlcmlmeUVycm9yICYmXHJcbiAgICAgICAgICAgICghdGhpcy5Jc1N1YkZvcm0gfHwgc3ViZm9ybURlc3RpbmF0aW9uKSAmJlxyXG4gICAgICAgICAgICB0aGlzLlRhc2tQcmVmaXhFeGVjdXRlZCAmJiAhdGhpcy5UYXNrU3VmZml4RXhlY3V0ZWQpXHJcbiAgICAgICAgICAgIHN1Y2NlZWRlZCA9IGF3YWl0IHRoaXMuaGFuZGxlVGFza1N1ZmZpeCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAvLyBEb24ndCBmb3JnZXQgdG8gZXhpdCBmcm9tIGFueSBzdWJUYXNrcyBvcGVuZWQgZHVyaW5nIHRoZSBsYXN0IHJlYy1zdWZmaXggb3IgdGFzayBzdWZmaXhcclxuICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCAmJiB0aGlzLmhhc1N1YlRhc2tzKCkpXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSsrKSB7XHJcblxyXG4gICAgICAgICAgICAgIHN1YlRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICghc3ViVGFzay5Jc1N1YkZvcm0pXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVOb25SZXZlcnNpYmxlRXZlbnQoc3ViVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gZG9udCBjb250aW51ZSB3aXRoIHRhc2sgZXhpdCBpZiBhIGRhdGEgZXJyb3Igb2NjdXJlZCBkdXJpbmcgdGFzayBzdWZmaXggKGUuZy4gcm9sbGJhY2soKSlcclxuICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdClcclxuICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG5cclxuICAgICAgICAgIC8vIHRhc2sgc3VmZml4IG9ubHkgc3RvcHMgZXhlY3V0aW9uIGZvciBjdXJyZW50IHRhc2ssIHdoaWNoIGlzIGJlaW5nIGNsb3NlZFxyXG4gICAgICAgICAgaWYgKHByZVRza1N1ZmZpeClcclxuICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5zZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpO1xyXG5cclxuICAgICAgICAgIGlmICghdGhpcy5pc0Fib3J0aW5nKCkgJiYgc3VjY2VlZGVkICYmICFvbmx5RGVzY3MpIHtcclxuICAgICAgICAgICAgLy8gVHJ5IGNsb3NpbmcgYW55IHRhc2sgbGV2ZWwgZHluYW1pY0RlZi50cmFuc2FjdGlvblxyXG4gICAgICAgICAgICBpZiAocmV2ZXJzaWJsZUV4aXQpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uRmFpbGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLlRhc2tUcmFuc2FjdGlvbk1hbmFnZXIuY2hlY2tBbmRDb21taXQoZmFsc2UsIENvbnN0SW50ZXJmYWNlLlRSQU5TX1RBU0tfUFJFRklYLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpICYmICF0aGlzLmlzQWJvcnRpbmcoKSAmJiAhdGhpcy50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19UQVNLX1BSRUZJWCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdWNjZWVkZWQpIHtcclxuXHJcblxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbil7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgbGV0IGJhc2VNZ2Q6IE1HRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5TdGFydHVwTWdEYXRhO1xyXG4gICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBjbG9zaW5nIHRoZSB0b3Btb3N0IHRhc2sgLSBkb250IGxvb3NlIGFueSBldmVudHMsIGxlZnQgaW4gdGhlIHF1ZXVlXHJcbiAgICAgICAgICAgICAgaWYgKHJldmVyc2libGVFeGl0ICYmIGJhc2VNZ2QuZ2V0Rmlyc3RUYXNrKCkuZ2V0VGFza1RhZygpID09PSB0aGlzLmdldFRhc2tUYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlRXZlbnRzKGJhc2VNZ2QsIDApO1xyXG4gICAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgc3QgPSBuZXcgU2Vzc2lvblN0YXRpc3RpY3NGb3JtKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBzdC5Xcml0ZVRvRmxvd01vbml0b3IoKEZsb3dNb25pdG9yUXVldWUpX2Zsb3dNb25pdG9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICAgICAgICAgICAgLy9hYm9ydGluZyB0YXNrIGNsb3N1cmVcclxuICAgICAgICAgICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgYXdhaXQgVGFza1NlcnZpY2VCYXNlLkV4aXQodGhpcywgcmV2ZXJzaWJsZUV4aXQsIHN1YmZvcm1EZXN0aW5hdGlvbik7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFdoZW4gY2xvc2luZyBhIHRhc2sgd2hvc2UgcGFyZW50IGlzIGEgbWFpbiBwcm9ncmFtLCBjaGVjayB0aGUgbWFpbiBwcm9ncmFtJ3MgZW5kXHJcbiAgICAgICAgICAgICAgLy8gY29uZGl0aW9uXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT0gbnVsbCAmJiB0aGlzLl9wYXJlbnRUYXNrLmlzTWFpblByb2coKSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKTtcclxuICAgICAgICAgICAgICAgIGxldCBtYWluUHJnVGFzazogVGFzayA9IG1nZC5nZXRNYWluUHJvZygwKTtcclxuICAgICAgICAgICAgICAgIGxldCByb290VGFzazogVGFzayA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGVuZE1haW5Qcmc6IGJvb2xlYW4gPSBhd2FpdCBtYWluUHJnVGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5EX0NPTkRJVElPTiwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZW5kIHRoZSByb290IHRhc2sgaWYgd2UgYXJlIGFscmVhZHkgZG9pbmcgaXQuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcyAhPT0gcm9vdFRhc2sgJiYgZW5kTWFpblByZykge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KHJvb3RUYXNrKTtcclxuICAgICAgICAgICAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NMT1NFKTtcclxuICAgICAgICAgICAgICAgICAgcnRFdnQuc2V0Q3RybChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgcnRFdnQuc2V0QXJnTGlzdChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgTWdGb3JtLkNyZWF0ZWRGb3Jtcy5yZW1vdmUoPE1nRm9ybT50aGlzLkZvcm0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBmaW5hbGx5IHtcclxuICAgICAgICBpZiAoIXRoaXMuSXNTdWJGb3JtIHx8IHN1YmZvcm1EZXN0aW5hdGlvbilcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRmluYWxseUVuZFRhc2soc3VjY2VlZGVkLCByZXZlcnNpYmxlRXhpdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBRY3IgIzkxNDY0NSA6IHJldHVybiBmYWxzZSBpbiBhIHJlY3Vyc2l2ZSBjYWxsLlxyXG4gICAgLy8gb3RoZXJ3aXNlIGNvbW1vbkhhbmRsZXJBZnRlcihldmVudE1hbmFnZXIpIHdpbGwgbm90IGJlIGV4ZWN1dGVkIGlmIHRoZSBjYWxsIGlzIHJlY3Vyc2l2ZWx5IG1hZGUgZnJvbSBoYW5kbGVFdmVudC5cclxuICAgIC8vIGZvciBleGFtcGxlIDogdGFzayBjb25kIGZ1bGZpbGxlZC4gaGFuZGxlSW50ZXJuYWxFdmVudCh0aGlzLCBNR19BQ1RfUkVDX1NVRkZJWCkgaXMgY2FsbGVkLlxyXG4gICAgLy8gd2hpbGUgaW4gcmVjIHN1ZiBoYW5kbGVyLCBlbmRUYXNrIGlzIGNhbGxlZCBhZ2Fpbi4uaWYgd2UgcmV0dXJuIHRydWUgdGhlbiB0aGUgY29tbW9uSGFuZGxlckFmdGVyIGlzIG5vdCBleGVjdXRlZC5cclxuICAgIC8vIGlmIHRoZSByZWMgc3VmZml4IGhhbmRsZXIgZGlkIG5vdCBleGlzdCwgdGhlcmUgd2lsbCBiZSBubyBjYWxsIHRvIGVuZFRhc2sgYW5kIHRoZSBjb21tb25IYW5kbGVyQWZ0ZXIgd2lsbCBiZSBleGVjdXRlZC5cclxuICAgIC8vIFRoZSBuYW1lICdzdWNjZWVkZWQnIGlzIGEgYml0IG1pc2xlYWRpbmcuLml0cyBtb3JlIGxpa2UgJ2V4ZWN1dGVkJy4uYnV0IHdlIGRlY2lkZWQgdG8ga2VlcCBpdC5cclxuICAgIGVsc2UgaWYgKHRoaXMuSW5FbmRUYXNrKVxyXG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyByZXN0b3JlIHRoZSBmbGFnLlxyXG4gICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKHRoaXMuX2luUHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrU2F2ZWQpO1xyXG5cclxuICAgIHJldHVybiBzdWNjZWVkZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldFNlcnZlclNpZGVUYXNrU3VmZml4KClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0U2VydmVyU2lkZVRhc2tTdWZmaXggKHRhc2sgOiBUYXNrKSA6IHZvaWRcclxuICB7XHJcbiAgICBsZXQgY2xpZW50T3BlcmF0aW9uRXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHZhciBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgpO1xyXG5cclxuICAgIGxldCAgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gbnVsbDtcclxuICAgIC8vIGZpbmQgaWYgTUdfQUNUX1RBU0tfU1VGRklYIGhhbmRsZXIgZXhpc3RzP1xyXG4gICAgdmFyIGV2dEhhblBvcyA9IG5ldyBFdmVudEhhbmRsZXJQb3NpdGlvbigpO1xyXG4gICAgZXZ0SGFuUG9zLmluaXQocnRFdnQpO1xyXG4gICAgaGFuZGxlciA9IGV2dEhhblBvcy5nZXROZXh0KCk7XHJcblxyXG4gICAgaWYgKGhhbmRsZXIgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChsZXQgIGkgPSAwOyBpIDwgaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRTaXplKCk7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBvcGVyID0gaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRPcGVyYXRpb24oaSk7XHJcbiAgICAgICAgb3Blci5zZXRFeGVjT25TZXJ2ZXIodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXNrLmhhc1N1YlRhc2tzKCkpICAge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2suR2V0U3ViVGFza3MoKS5sZW5ndGg7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gPFRhc2s+dGFzay5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIHRoaXMuU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgoc3ViVGFzayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcygpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIENoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcyAodGFzazogVGFzaywgZXZlbnRDb2RlOiBudW1iZXIpOiBQcm9taXNlIDxib29sZWFuPiB7XHJcbiAgICBsZXQgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSBmYWxzZTtcclxuICAgIHZhciBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChldmVudENvZGUpO1xyXG5cclxuICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSBudWxsO1xyXG4gICAgLy8gZmluZCBpZiBNR19BQ1RfVEFTS19TVUZGSVggLyBNR19BQ1RfUkVDX1NVRkZJWCBoYW5kbGVyIGV4aXN0cz9cclxuICAgIHZhciBldnRIYW5Qb3MgPSBuZXcgRXZlbnRIYW5kbGVyUG9zaXRpb24oKTtcclxuICAgIGV2dEhhblBvcy5pbml0KHJ0RXZ0KTtcclxuICAgIGhhbmRsZXIgPSBldnRIYW5Qb3MuZ2V0TmV4dCgpO1xyXG5cclxuICAgIGlmIChldmVudENvZGUgPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpIHtcclxuICAgICAgbGV0IGN1cnJSZWNvcmQgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgICAgaWYgKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykubW9kaWZpZWRSZWNvcmRzTnVtYmVyKCkgPiAwIHx8IChjdXJyUmVjb3JkICE9IG51bGwgJiYgY3VyclJlY29yZC5Nb2RpZmllZCkpXHJcbiAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKCFjbGllbnRPcGVyYXRpb25FeGlzdCkge1xyXG4gICAgICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbiA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpO1xyXG4gICAgICAgIC8vIGZvciBub24gaW50ZXJhY3RpdmUsIGNyZWF0ZSBtb2RlIHRhc2suICBmb3JjZSByZWNvcmQgc3VmZml4IGlzIGNhbmNlbGxlZFxyXG5cclxuICAgICAgICBpZiAoZm9yY2VTdWZmaXggPT09IHRydWUpXHJcbiAgICAgICAgaWYgKHRhc2suSXNJbnRlcmFjdGl2ZSB8fCAgdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSB0cnVlO1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChoYW5kbGVyICE9IG51bGwgJiYgIWNsaWVudE9wZXJhdGlvbkV4aXN0KSB7XHJcbiAgICAgICAgbGV0IGNudCA9IGhhbmRsZXIuZ2V0T3BlcmF0aW9uVGFiKCkuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNudDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgb3BlciA9IGhhbmRsZXIuZ2V0T3BlcmF0aW9uVGFiKCkuZ2V0T3BlcmF0aW9uKGkpO1xyXG4gICAgICAgICAgaWYgKG9wZXIuZ2V0RXhlY09uQ2xpZW50KCkpIHtcclxuICAgICAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAob3Blci5nZXRUeXBlKCkgPT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9SQUlTRV9FVkVOVCl7XHJcbiAgICAgICAgICAgICAgaWYgKG9wZXIuR2V0UnVudGltZUV2ZW50KCkuZ2V0VHlwZSgpID09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiZcclxuICAgICAgICAgICAgICBvcGVyLkdldFJ1bnRpbWVFdmVudCgpLmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKSB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRPcGVyYXRpb25FeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghY2xpZW50T3BlcmF0aW9uRXhpc3QgJiYgdGFzay5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICghY2xpZW50T3BlcmF0aW9uRXhpc3QgJiYgaSA8IHRhc2suZ2V0U3ViVGFza3MoKS5nZXRTaXplKCkpOyBpKyspIHtcclxuICAgICAgICAgIGxldCBzdWJUYXNrID0gPFRhc2s+dGFzay5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSBhd2FpdCB0aGlzLkNoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcyhzdWJUYXNrLCBldmVudENvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGNsaWVudE9wZXJhdGlvbkV4aXN0O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2tJZlBlbmRpbmdUcmFuc2FjdGlvbnMoKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBDaGVja0lmUGVuZGluZ1RyYW5zYWN0aW9ucyh0YXNrIDogVGFzayk6IGJvb2xlYW5cclxuICB7XHJcbiAgICBsZXQgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IGZhbHNlO1xyXG4gICAgbGV0IGN1cnJSZWNvcmQgPSAgKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICBpZiAoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5tb2RpZmllZFJlY29yZHNOdW1iZXIoKSA+IDAgfHwgKGN1cnJSZWNvcmQgIT0gbnVsbCAmJiBjdXJyUmVjb3JkLk1vZGlmaWVkKSlcclxuICAgICAgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IHRydWU7XHJcblxyXG4gICAgaWYgKCFwZW5kaW5nVHJhbnNhY3Rpb25zICYmIHRhc2suaGFzU3ViVGFza3MoKSlcclxuICAgIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7ICghcGVuZGluZ1RyYW5zYWN0aW9ucyAmJiBpIDwgdGFzay5nZXRTdWJUYXNrcygpLmdldFNpemUoKSk7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBzdWJUYXNrID0gPFRhc2s+dGFzay5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIHBlbmRpbmdUcmFuc2FjdGlvbnMgPSB0aGlzLkNoZWNrSWZQZW5kaW5nVHJhbnNhY3Rpb25zKHN1YlRhc2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBlbmRpbmdUcmFuc2FjdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbmx5RGVzY3NcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1Y2NlZWRlZFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBIYW5kbGVUcmFuc2FjdGlvbkluZm8oKTogdm9pZCB7XHJcbiAgICAvLyB3aGlsZSByZW1vdGUgdGFzayB3aXRob3V0IGxvY2FsIGRhdGEsIGhhcyBzdWJmb3JtIHRoYXQgaGFzIGxvY2FsIGRhdGEgOiBSZW1vdGUgdHJhbnNhY3Rpb24gaXMgc2V0IG9uIHRoZSBwYXJlbnQgdGFzayBhbmQgbG9jYWwgVHJhbnNhY3Rpb24gaXMgc2V0IG9uIHN1YmZvcm0uXHJcbiAgICAvLyBUaGUgbWVtYmVyIHRhc2suVHJhbnNhY3Rpb24gaXMgZ2V0IHRoZSBEYXRhdmlld01hbmFnZXIuQ3VycmVudERhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvblxyXG4gICAgLy8gZm9yIHN1YmZvcm0gOiAgdGhlIEN1cnJlbnREYXRhdmlld01hbmFnZXIgaXMgdGhlIGxvY2FsRGF0YXZpZXcgc28gdGhlIHRyYW5zYWN0aW9uIGlzIHRoZSBsb2NhbCB0cmFuc2FjdGlvbiB0aGF0IHRoZSBzdWJmb3JtIGlzIHRoZSBvd25lciBidXQgbm90IHRoZSBvd25lciBvZiB0aGUgcmVtb3RlIHRyYW5zYWN0aW9uXHJcbiAgICAvLyBUaGUgbWV0aG9kIHNldFRyYW5zQ2xlYXJlZCgpIG5lZWQgdG8gYmUgY2FsbGVkIG9ubHkgZm9yIHJlbW90ZSB0cmFuc2FjdGlvbiB0aGF0IGlzIHRoZSBvd25lciB0YXNrIC4gKF90cmFuc0NsZWFyZWQgaXMgc2VuZCB0byB0aGUgc2VydmVyIClcclxuXHJcbiAgICAvLyBjaGVjayB0aGUgcmVtb3RlIHRyYW5zYWN0aW9uXHJcbiAgICBsZXQgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uID0gdGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uO1xyXG4gICAgaWYgKHRyYW5zYWN0aW9uICE9PSBudWxsICYmIHRyYW5zYWN0aW9uLmlzT3duZXIodGhpcykgJiYgdHJhbnNhY3Rpb24uZ2V0TGV2ZWwoKSA9PT0gJ1AnKSB7XHJcbiAgICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA9IG51bGw7XHJcbiAgICAgICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuc2V0VHJhbnNDbGVhcmVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENyZWF0ZXMgZXhpdCBjb21tYW5kLCBhZGRzIGl0IHRvIGNvbW1hbmRzIGZvciBleGVjdXRpb24gYW5kIGV4ZWN1dGUgaXQgaWYgaXQncyBuZWVkZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJldmVyc2libGVFeGl0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtRGVzdGluYXRpb25cIj48L3BhcmFtPlxyXG4gIGFzeW5jIEV4aXQocmV2ZXJzaWJsZUV4aXQ6IGJvb2xlYW4sIHN1YmZvcm1EZXN0aW5hdGlvbjogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gaWYgcmVjb3JkIHN1ZmZpeCB3YXMgc3VjY2Vzc2Z1bCBhbmQgdGhpcyB0YXNrIGlzIG5vdCBhIHN1YiBmb3JtXHJcbiAgICAvLyB0aGVuIGVuZCB0aGUgdGFzayBhdCB0aGUgc2VydmVyIHNpZGVcclxuXHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IHJldmVyc2libGVFeGl0ID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElDbGllbnRDb21tYW5kPkNvbW1hbmRGYWN0b3J5LkNyZWF0ZUJyb3dzZXJFc2NFdmVudENvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIHN1YmZvcm1EZXN0aW5hdGlvbikgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SUNsaWVudENvbW1hbmQ+Q29tbWFuZEZhY3RvcnkuQ3JlYXRlTm9uUmV2ZXJzaWJsZUV4aXRDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBzdWJmb3JtRGVzdGluYXRpb24pO1xyXG5cclxuICAgIHRoaXMuX21nRGF0YS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICBpZiAoIXN1YmZvcm1EZXN0aW5hdGlvbikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIEJyb3dlckVzY0NvbW1hbmQgaW1tZWRpYXRlbHkgb25seSBpZlxyXG4gICAgICAgIC8vIDEuIElmIHdlIGFyZSB0cnlpbmcgdG8gY2xvc2UgdGhlIGJyb3dzZXIgYW5kIHRoZSB0b3Btb3N0IHRhc2sgaXMgY2xvc2luZ1xyXG4gICAgICAgIC8vIDIuIElmIHVzZXIgZXhwbGljaXRseSBjbG9zZXMgdGhlIGN1cnJlbnQgdGFzayAobGlrZSBjbG9zaW5nIG92ZXJsYXkpXHJcbiAgICAgICAgLy8gRm9yIGFsbCBvdGhlciBFeGl0KCkgY29tbWFuZHMsIGp1c3QgYWRkIHRoZSBCcm93c2VyRXNjQ29tbWFuZCB0byBDbWRzVG9TZXJ2ZXIuXHJcbiAgICAgICAgaWYodGhpcy5nZXRUYXNrVGFnKCkgPT0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLmdldFRhc2tUYWcoKSB8fFxyXG4gICAgICAgICAgICEoTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkluRW5kVGFzayAmJiBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuQ2xvc2luZ0Zvcm1VSSkpXHJcbiAgICAgICAgICBhd2FpdCBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAvLyBJZiB0aGUgY2xvc2luZyBvZiBNYWluIFByb2dyYW0gZGlkbid0IHN1Y2NlZWQgb24gc2VydmVyLCBjbG9zZSBpdCBoZXJlIC0tLSBvZmNvdXJzZSBpdFxyXG4gICAgICAgIC8vIGluY2x1ZGVzIHRoZSBleGVjdXRpb24gb2YgVFMgYXMgd2VsbC5cclxuICAgICAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkpIHtcclxuICAgICAgICAgIHRoaXMuX21nRGF0YS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZWN1cnNpdmUgZnVuY3Rpb24gZm9yIGZpbmFsbHkgb3BlcmF0aW9uIG9mIGVuZFRhc2sgZnVuY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3VjY2VlZGVkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldmVyc2libGVFeGl0XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBoYW5kbGVGaW5hbGx5RW5kVGFzayhzdWNjZWVkZWQ6IGJvb2xlYW4sIHJldmVyc2libGVFeGl0OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgc3ViVGFzazogVGFzaztcclxuXHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgc3ViVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICBzdWJUYXNrLmhhbmRsZUZpbmFsbHlFbmRUYXNrKHN1Y2NlZWRlZCwgcmV2ZXJzaWJsZUV4aXQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5JbkVuZFRhc2sgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoc3VjY2VlZGVkKVxyXG4gICAgICB0aGlzLl9pc1N0YXJ0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIXN1Y2NlZWRlZCAmJiByZXZlcnNpYmxlRXhpdCAmJiB0aGlzLklzVHJ5aW5nVG9TdG9wKVxyXG4gICAgICB0aGlzLnNldFRyeWluZ1RvU3RvcChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmVjdXJzaXZlIGZ1bmN0aW9uIGZvciBUYXNrIFByZWZpeCBleGVjdXRpb24gZm9yIGFsbCBzdWJmb3Jtc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBoYW5kbGVUYXNrU3VmZml4KHdpdGhTdWJUYXNrczogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHN1Y2NlZWRlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgc3ViVGFzazogVGFzaztcclxuXHJcbiAgICBpZiAod2l0aFN1YlRhc2tzKSB7XHJcbiAgICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCkgJiYgc3VjY2VlZGVkOyBpKyspIHtcclxuICAgICAgICAgIHN1YlRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgICBzdWNjZWVkZWQgPSBhd2FpdCBzdWJUYXNrLmhhbmRsZVRhc2tTdWZmaXgod2l0aFN1YlRhc2tzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3VjY2VlZGVkKVxyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYKTtcclxuICAgIHN1Y2NlZWRlZCA9ICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpO1xyXG4gICAgdGhpcy5UYXNrU3VmZml4RXhlY3V0ZWQgPSB0cnVlO1xyXG4gICAgcmV0dXJuIHN1Y2NlZWRlZDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGlmIHRoZSB0YXNrIGludG8gY3JlYXRlIGxpbmUgcHJvY2Vzc2luZyBvciBub3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEluQ3JlYXRlTGluZShpbkNyZWF0ZUxpbmU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2luQ3JlYXRlTGluZSA9IGluQ3JlYXRlTGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgaWYgdGhlIHRhc2sgaXMgaW50byBDcmVhdGUgbGluZSBwcm9jZXNzaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRJbkNyZWF0ZUxpbmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5DcmVhdGVMaW5lO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYW5kbGUgYW4gaW50ZXJuYWwgZXZlbnQgb24gdGhpcyB0YXNrcyBzbGF2ZSB0YXNrcy4gU2xhdmUgdGFza3MgYXJlOiAoMSkgSWYgdGhpcyB0YXNrIGlzIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvblxyXG4gIC8vLyAgIG93bmVyIC0gYWxsIHRhc2tzIHBhcnRpY2lwYXRpbmcgaW4gdGhlIHRyYW5zYWN0aW9ucyBhcmUgaXRzIHNsYXZlcy4gKDIpIElmIHRoaXMgdGFzayBpcyBub3QgYW4gb3duZXIgLVxyXG4gIC8vLyAgIGFsbCBpdHMgc3ViZm9ybXMgYXJlIGNvbnNpZGVyZWQgc2xhdmVzLiBpZiBvbmUgb2YgdGhlIHN1YiB0YXNrcyBmYWlsZWQgaGFuZGxpbmcgdGhlIGV2ZW50IHRoZW4gYVxyXG4gIC8vLyAgIHJlZmVyZW5jZSB0byB0aGF0IHRhc2sgaXMgcmV0dXJuZWQgb3RoZXJ3aXNlIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBudWxsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImludGVybmFsRXZ0Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBpbnRlcm5hbCBldmVudCB0byBoYW5kbGU8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUV2ZW50T25TbGF2ZVRhc2tzKGludGVybmFsRXZ0Q29kZTogbnVtYmVyKTogUHJvbWlzZTxUYXNrPiB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgbGV0IGZhaWx1cmVUYXNrOiBUYXNrID0gbnVsbDtcclxuICAgIGxldCBtZ2RUYWI6IElNR0RhdGFDb2xsZWN0aW9uID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlO1xyXG4gICAgbGV0IHRyaWdnZXJlZFRhc2tzOiBMaXN0PFRhc2tCYXNlPiA9IG1nZFRhYi5nZXRUcmlnZ2VyZWRUYXNrcyh0aGlzKTtcclxuICAgIGxldCBvcnBoYW5zOiBMaXN0PFRhc2s+ID0gbnVsbDtcclxuICAgIGxldCBzYW1lVHJhbnM6IGJvb2xlYW47XHJcbiAgICBsZXQgaGFzU2xhdmVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgaXNPd25lcjogYm9vbGVhbiA9IHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmlzT3duZXIodGhpcyk7XHJcblxyXG4gICAgLy8gZXZlbnQgb24gdHJhbnMtb3duZXIgc2hvdWxkIGJlIHByb3BvZ2F0ZWQgdG8gYWxsIG90aGVyIHRhc2tzIGluIHRoZSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uLlxyXG4gICAgaWYgKGlzT3duZXIpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0RXZlbnRTY29wZVRyYW5zKCk7XHJcbiAgICAgIG9ycGhhbnMgPSBuZXcgTGlzdDxUYXNrPigpO1xyXG5cclxuICAgICAgLy8gSW4gY2FzZSBhIGNoYW5nZSBvZiB0cmFucy1vd25lcnNoaXAgcHJldmlvdXNseSB0b29rIHBsYWNlLCB0aGVyZSBtaWdodCBiZSB0YXNrc1xyXG4gICAgICAvLyB3aGljaCBiZWxvbmcgdG8gdGhlIGN1cnJlbnQgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBidXQgdGhlaXIgcGFyZW50IGlzIGdvbmUuIFRoZXNlIGFyZSBvcnBoYW4gdGFza3NcclxuICAgICAgLy8gYW5kIHdlIG5lZWQgdG8gcHJvcG9nYXRlIHRoZSBldmVudCB0byB0aGVtIHRvby5cclxuICAgICAgbWdkVGFiLnN0YXJ0VGFza3NJdGVyYXRpb24oKTtcclxuICAgICAgd2hpbGUgKCh0YXNrID0gPFRhc2s+bWdkVGFiLmdldE5leHRUYXNrKCkpICE9IG51bGwpIHtcclxuICAgICAgICBzYW1lVHJhbnMgPSB0YXNrLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCkgPT09IHRhc2suVHJhbnNhY3Rpb24uZ2V0VHJhbnNJZCgpO1xyXG4gICAgICAgIGlmICh0YXNrICE9PSB0aGlzICYmIHNhbWVUcmFucyAmJiB0YXNrLlByZXZpb3VzbHlBY3RpdmVUYXNrSWQgIT0gbnVsbCAmJiBtZ2RUYWIuR2V0VGFza0J5SUQodGFzay5QcmV2aW91c2x5QWN0aXZlVGFza0lkKSA9PSBudWxsKVxyXG4gICAgICAgICAgb3JwaGFucy5wdXNoKHRhc2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHNjb3BlVHJhbnM6IGJvb2xlYW4gPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5pc0V2ZW50U2NvcGVUcmFucygpO1xyXG5cclxuICAgIC8vIFByb3BhZ2F0ZSB0aGUgZXZlbnQgYWNjb3JkaW5nIHRvIHRoZSBzY29wZSwgb24gYWxsIHRhc2tzIHRyaWdnZXJlZCBieSBtZVxyXG4gICAgZm9yIChpID0gMDsgaSA8IHRyaWdnZXJlZFRhc2tzLmxlbmd0aCAmJiAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTsgaSsrKSB7XHJcbiAgICAgIHRhc2sgPSA8VGFzaz50cmlnZ2VyZWRUYXNrcy5nZXRfSXRlbShpKTtcclxuICAgICAgc2FtZVRyYW5zID0gdGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRhc2suVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmdldFRyYW5zSWQoKSA9PT0gdGFzay5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCk7XHJcblxyXG4gICAgICBpZiAoIXRhc2suSXNTdWJGb3JtICYmIChzY29wZVRyYW5zICYmIHNhbWVUcmFucykgJiYgdGFzay5pc1N0YXJ0ZWQoKSkge1xyXG4gICAgICAgIC8vIFFDUiA0Mzg1MzAgR3VhcmFudGVlIHRoYXQgYmVmb3JlIHByZWZpeCBjb21wdXRlIHdpbGwgYmUgZXhlY3V0ZWRcclxuICAgICAgICBpZiAodGFzay5nZXRGb3JtKCkuRm9ybVJlZnJlc2hlZCAmJiBpbnRlcm5hbEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuY3VyclJlY0NvbXB1dGUoZmFsc2UpO1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBpbnRlcm5hbEV2dENvZGUpO1xyXG4gICAgICAgIGhhc1NsYXZlcyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBQcm9wYWdhdGUgdGhlIGV2ZW50IG9uIG9ycGhhbnMgdG9vLlxyXG4gICAgZm9yICg7IGlzT3duZXIgJiYgaSA8IG9ycGhhbnMubGVuZ3RoICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpOyBpKyspIHtcclxuICAgICAgdGFzayA9IG9ycGhhbnMuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICAvLyBRQ1IgNDM4NTMwIEd1YXJhbnRlZSB0aGF0IGJlZm9yZSBwcmVmaXggY29tcHV0ZSB3aWxsIGJlIGV4ZWN1dGVkXHJcbiAgICAgIGlmICh0YXNrLmdldEZvcm0oKS5Gb3JtUmVmcmVzaGVkICYmIGludGVybmFsRXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVggJiYgdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuY3VyclJlY0NvbXB1dGUoZmFsc2UpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgaW50ZXJuYWxFdnRDb2RlKTtcclxuICAgICAgaGFzU2xhdmVzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGFzU2xhdmVzICYmIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIGZhaWx1cmVUYXNrID0gdGFzaztcclxuXHJcbiAgICBpZiAoaXNPd25lcilcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuY2xlYXJFdmVudFNjb3BlKCk7XHJcblxyXG4gICAgcmV0dXJuIGZhaWx1cmVUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGVuYWJsZS1kaXNhYmxlIGFjdGlvbnMgZm9yIGEgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBlbmFibGVSZWNvcmRBY3Rpb25zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGRhdGF2aWV3OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLkRhdGFWaWV3O1xyXG5cclxuICAgIGF3YWl0IHRoaXMuc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcblxyXG4gICAgaWYgKGRhdGF2aWV3LkluY2x1ZGVzRmlyc3QoKSB8fCBkYXRhdmlldy5Jc09uZVdheUtleSkge1xyXG4gICAgICBpZiAoZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkgfHwgZGF0YXZpZXcuZ2V0Q3VyclJlY0lkeCgpID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVkxJTkUsIGZhbHNlKTtcclxuICAgICAgICBpZiAoZGF0YXZpZXcuSXNPbmVXYXlLZXkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMLCB0cnVlKTtcclxuICAgICAgICBlbHNlIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkwsIGZhbHNlKTtcclxuICAgICAgICBpZiAodGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWTElORSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICBpZiAoZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkgfHwgKGRhdGF2aWV3LmdldEN1cnJSZWNJZHgoKSA9PT0gMCkgfHwgKGRhdGF2aWV3LmdldFRvcFJlY0lkeCgpID09PSAwKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCBmYWxzZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCB0cnVlKTtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVkxJTkUsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRhdmlldy5JbmNsdWRlc0xhc3QoKSkge1xyXG4gICAgICBpZiAoKCh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSkgfHwgZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkgfHxcclxuICAgICAgICAgICgodGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKSAmJlxyXG4gICAgICAgICAgICAoIUVudmlyb25tZW50Lkluc3RhbmNlLmFsbG93Q3JlYXRlSW5Nb2RpZnlNb2RlKHRoaXMuZ2V0Q29tcElkeCgpKSB8fFxyXG4gICAgICAgICAgICAgICFhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUsIHRydWUpKSkpICYmIChkYXRhdmlldy5nZXRDdXJyUmVjSWR4KCkgKyAxKSA9PT0gZGF0YXZpZXcuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVExJTkUsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EVEJMLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVExJTkUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRUQkwsIHRydWUpO1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUUEFHRSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKSB7XHJcbiAgICAgICAgaWYgKGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpIHx8ICgoZGF0YXZpZXcuZ2V0U2l6ZSgpIC0gZGF0YXZpZXcuZ2V0VG9wUmVjSWR4KCkpIDw9IHRoaXMuRm9ybS5nZXRSb3dzSW5QYWdlKCkpKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0UsIGZhbHNlKTtcclxuICAgICAgICBlbHNlIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRMSU5FLCB0cnVlKTtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0UsIHRydWUpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EVEJMLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCwgZmFsc2UpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUwsIHRydWUpO1xyXG5cclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VOVEVSX1JPV19FRElUSU5HLCB0cnVlKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9OT19QUk9HX0VYRV9SSUdIVFMsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBpcyBzdGFydGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1N0YXJ0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNTdGFydGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHN1YiB0YXNrcyB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0U3ViVGFza3MoKTogVGFza3NUYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5TdWJUYXNrcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyB0YXNrcyByZWZyZXNoZXMgb24gYSBjaGFuZ2Ugb2Ygb25lIG9mIGl0cyBwYXJlbnQgZmllbGRzIHdpdGggdGhlIGdpdmVuIGlkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkXCI+dGhlIGlkIG9mIHRoZSBwYXJlbnQgZmllbGQ8L3BhcmFtPlxyXG4gIHJlZnJlc2hlc09uKGZsZElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyAhcmVzdWx0ICYmIHRoaXMuUmVmcmVzaE9uVmFycyAhPT0gbnVsbCAmJiBpIDwgdGhpcy5SZWZyZXNoT25WYXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHJlc3VsdCA9ICh0aGlzLlJlZnJlc2hPblZhcnNbaV0gPT09IGZsZElkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNsZWFyIHRoaXMgdGFzayBmcm9tIHRoZSBhY3RpdmUgdHJhbnNhY3Rpb25zIGFjY291bnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgQWJvcnRUcmFuc2FjdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHZhbHVlIG9mIHByZXZlbnRSZWNvcmRTdWZmaXggdG8gdmFsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRydWUgaWYgd2UgYWxyZWFkeSBwZXJmb3JtZWQgcmVjb3JkIHN1ZmZpeDwvcGFyYW0+XHJcbiAgc2V0UHJldmVudFJlY29yZFN1ZmZpeCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZlbnRSZWNvcmRTdWZmaXggPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHZhbHVlIG9mIHByZXZlbnRSZWNvcmRTdWZmaXhcclxuICAvLy8gPC9zdW1tYXJ5XHJcbiAgZ2V0UHJldmVudFJlY29yZFN1ZmZpeCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2ZW50UmVjb3JkU3VmZml4O1xyXG4gIH1cclxuXHJcbiAgc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2ZW50Q29udHJvbENoYW5nZSA9IHZhbDtcclxuICB9XHJcblxyXG4gIGdldFByZXZlbnRDb250cm9sQ2hhbmdlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXZlbnRDb250cm9sQ2hhbmdlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNpZ25hbCB0aGUgc2VydmVyIGNsb3NlZCB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0S25vd25Ub1NlcnZlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2tub3duVG9TZXJ2ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBkdlBvcyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCItXCI+ZXZhbHVhdGVzIHRoZSBkZXJjcmlwdG9yIGFuZCByZXR1cm4gdGhlIG5vbi1oYXZlIGR2UG9zIHZhbHVlPC9wYXJhbT5cclxuICBldmFsdWF0ZURlc2NyaXB0b3IoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgcmVzOiBOVU1fVFlQRTtcclxuICAgIGlmICh0aGlzLkR2UG9zRGVzY3JpcHRvciA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gSGFzaFV0aWxzLkdldEhhc2hDb2RlKHJlc3VsdCk7XHJcblxyXG4gICAgbGV0IGZpcnN0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBnbyBvdmVyIHRoZSBsaXN0IG9mIHRoZSBkZXNjcmlwdG9yXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5EdlBvc0Rlc2NyaXB0b3IubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKCFmaXJzdClcclxuICAgICAgICByZXN1bHQgKz0gXCI7XCI7XHJcblxyXG4gICAgICBsZXQgY3VycmVudENlbGw6IHN0cmluZ1tdID0gdGhpcy5EdlBvc0Rlc2NyaXB0b3IuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICAvLyBwYXJzZSB0aGUgY3VycmVudCB0YXNrIGFuZCBmaWVsZCBudW1iZXJcclxuICAgICAgbGV0IGN1cnJlbnRUYWc6IHN0cmluZyA9IGN1cnJlbnRDZWxsWzBdO1xyXG4gICAgICBsZXQgY3VycmVudFZlZUlkeDogbnVtYmVyID0gTk51bWJlci5QYXJzZShjdXJyZW50Q2VsbFsxXSk7XHJcbiAgICAgIGxldCBjdXJyZW50VGFzayA9IDxUYXNrPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRUYXNrQnlJRChjdXJyZW50VGFnKTtcclxuICAgICAgbGV0IGN1cnJlbnRGaWVsZCA9IDxGaWVsZD5jdXJyZW50VGFzay5EYXRhVmlldy5nZXRGaWVsZChjdXJyZW50VmVlSWR4KTtcclxuICAgICAgbGV0IGRpc3BWYWw6IHN0cmluZyA9IGN1cnJlbnRGaWVsZC5nZXREaXNwVmFsdWUoKTtcclxuXHJcbiAgICAgIC8vIFFDUiA5Nzg1NjZcclxuICAgICAgaWYgKGN1cnJlbnRGaWVsZC5pc051bGwoKSlcclxuICAgICAgICBkaXNwVmFsID0gXCJcIjtcclxuXHJcbiAgICAgIC8vIFFDUiA3NDMyOTBcclxuICAgICAgbGV0IHBpYzogUElDO1xyXG4gICAgICBzd2l0Y2ggKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkpIHtcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICAvLyBib29sZWFuIGlzIHN0b3JlZCBhcyBcIm9cIiBvciBcIjFcIiBzbyB3ZSBqdXN0IGFkZCB0aGVtIGFzIHdlXHJcbiAgICAgICAgLy8gZG8gaW4gdGhlIHNlcnZlclxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgICAgICByZXN1bHQgKz0gZGlzcFZhbDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICAgIC8vIFFDUiA3NDI5NjYgZGF0ZSBhbmQgdGltZSBzcGVjaWFsIHRyZWF0bWVudFxyXG4gICAgICAgICAgaWYgKGRpc3BWYWwgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgcGljID0gbmV3IFBJQyhjdXJyZW50RmllbGQuZ2V0UGljdHVyZSgpLCBjdXJyZW50RmllbGQuZ2V0VHlwZSgpLCAwKTtcclxuICAgICAgICAgICAgbGV0IGNvbnY6IERpc3BsYXlDb252ZXJ0b3IgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlO1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gY29udi5tZzJkaXNwKGRpc3BWYWwsIFwiXCIsIHBpYywgZmFsc2UsIHRoaXMuZ2V0Q29tcElkeCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgICAvLyBRQ1IgNTQzMjA0IHdoZW4gdGhlcmUgaXMgYW4gZW1wdHkgc3RyaW5nIChhbHBoYSlhcHBlbmQgbm90aGluZ1xyXG4gICAgICAgICAgaWYgKGRpc3BWYWwgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgcmVzID0gbmV3IE5VTV9UWVBFKGRpc3BWYWwpO1xyXG4gICAgICAgICAgICBwaWMgPSBuZXcgUElDKGN1cnJlbnRGaWVsZC5nZXRQaWN0dXJlKCksIGN1cnJlbnRGaWVsZC5nZXRUeXBlKCksIDApO1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gcmVzLnRvX2EocGljKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmaXJzdCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0bXBTdHIyOiBzdHJpbmcgPSBTdHJVdGlsLnN0cmluZ1RvSGV4YUR1bXAocmVzdWx0LCA0KTtcclxuXHJcbiAgICByZXR1cm4gSGFzaFV0aWxzLkdldEhhc2hDb2RlKHRtcFN0cjIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkcyB0aGUgZHZQb3MgZGVzY3JpcHRvciB2ZWN0b3IgZWFjaCBvZiB0aGUgZHZQb3NEZXNjcmlwdG9yIHZlY3RvciBlbGVtZW50cyBpcyBhIFN0cmluZyBhcnJheSBvZiBzaXplXHJcbiAgLy8vICAgMiBpbiB0aGUgZmlyc3QgY2VsbCBvZiBlYWNoIGFycmF5IHdlIGhhdmUgdGhlIHRhZyBhbmQgaW4gdGhlIHNlY29uZCB3ZSBoYXZlIHRoZSB2ZWUgaWluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXREZXNjcmlwdG9yKG5ld0Rlc2M6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCEobmV3RGVzYy50cmltKCkgPT09IFwiXCIpKSB7XHJcbiAgICAgIGxldCBkZXNjOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUobmV3RGVzYywgXCI7XCIpO1xyXG4gICAgICB0aGlzLkR2UG9zRGVzY3JpcHRvciA9IG5ldyBMaXN0PHN0cmluZ1tdPigpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRlc2MubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgY2VsbDogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigyKTtcclxuICAgICAgICBsZXQgdGFnVmVlUGFpcjogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKGRlc2NbaV0sIFwiLFwiKTtcclxuICAgICAgICBjZWxsWzBdID0gdGFnVmVlUGFpclswXTtcclxuICAgICAgICBjZWxsWzFdID0gdGFnVmVlUGFpclsxXTtcclxuXHJcbiAgICAgICAgLy8gcHV0IHRoZSBjZWxsIHZhbHVlIGludG8gdGhlIHZlY3RvclxyXG4gICAgICAgIHRoaXMuRHZQb3NEZXNjcmlwdG9yLnB1c2goY2VsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjYWNoZSBvYmplY3Qgb2YgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUYXNrQ2FjaGUoKTogRHZDYWNoZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZHZDYWNoZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcmVwYXJlIGFsbCBzdWItZm9ybSB0cmVlJ3MgdG8gZWl0aGVyIGdvIHRvIHNlcnZlciAoYWZ0ZXIgZGVsZXRpbmcgcmVsZXZhbnQgZW50cmllcykgb3IgdG8gdGFrZSBkLnYgZnJvbVxyXG4gIC8vLyAgIGNhY2hlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgYWxsIHN1YmZvcm0gY2FuIGRvIG5lZWQgdG8gZ28gdG8gdGhlIHNlcnZlciBiZWNhdXNlIG9mIHVwZGF0ZXM8L3JldHVybnM+XHJcbiAgYXN5bmMgcHJlcGFyZUNhY2hlKGlnbm9yZUN1cnI6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzdWNjZXNzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBjaGVja2luZyBteXNlbGYgaWYgaSBhbSBhIHN1YmZvcm1cclxuICAgIGlmICghaWdub3JlQ3Vycikge1xyXG4gICAgICBpZiAoYXdhaXQgdGhpcy5pc0NhY2hlZCgpKSB7XHJcbiAgICAgICAgaWYgKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Q2hhbmdlZCgpKSB7XHJcbiAgICAgICAgICAvLyBpcyB0aGUgY3VycmVudCB1cGRhdGUgZGF0YXZpZXcgd2VyZSBwcmV2aW91c2x5IHRha2VuIGZyb20gY2FjaGVcclxuICAgICAgICAgIHRoaXMuX2R2Q2FjaGUucmVtb3ZlRHZGcm9tQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCksIHRydWUpO1xyXG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBjaGVja3MgdGhhdCBpIGFtIGEgc3ViIGZvcm0gYnV0IGkgYW0gbm90IGNhY2hlZFxyXG4gICAgICAgIGlmICh0aGlzLklzU3ViRm9ybSAmJiAhIGF3YWl0IHRoaXMuaXNDYWNoZWQoKSkge1xyXG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBjdXJyZXRUYXNrOiBUYXNrO1xyXG5cclxuICAgIC8vIGNoZWNrIGFsbCBteSBzdWIgZm9ybXNcclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgLy8gdGhpcyBsb29wIG11c3QgcnVuIHRvIGl0cyBlbmQgc28gYWxsIHVwZGF0ZWQgZC52IHdpbGwgYmUgZGVsZXRlZFxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGN1cnJldFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgLy8gaWYgb25lIG9mIG15IHN1Yi1mb3JtcyBuZWVkcyB0byBnbyB0byB0aGUgc2VydmVyIC0gc28gZG8gaVxyXG4gICAgICAgIGlmICghIGF3YWl0IGN1cnJldFRhc2sucHJlcGFyZUNhY2hlKGZhbHNlKSkge1xyXG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIGlmIHdlIGNhbiB0YWtlIHRoZSBkLnYgb2YgdGhlIHRhc2sgYW5kIGFsbCBoaXMgc3ViLWZvcm1zIGZyb20gY2FjaGUgaXMgd2UgY2FuIC0gdGFrZSB0aGVtIGFuZFxyXG4gIC8vLyAgIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBjdXJyZW50IGQudiBvZiBlYWNoIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiBhbGwgZC52J3Mgd2VyZSBmb3VuZCBhbmQgc2V0PC9yZXR1cm5zPlxyXG4gIGFzeW5jIHRlc3RBbmRTZXQoaWdub3JlQ3VycjogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgLy8gY2hlY2sgY3VycmVudCB0YXNrXHJcbiAgICBpZiAoIWlnbm9yZUN1cnIgJiYgYXdhaXQgdGhpcy5pc0NhY2hlZCgpKSB7XHJcbiAgICAgIGxldCByZXF1ZXN0ZWREdjogbnVtYmVyID0gdGhpcy5ldmFsdWF0ZURlc2NyaXB0b3IoKTtcclxuXHJcbiAgICAgIC8vIHRyeSB0byB0YWtlIGZyb20gY2FjaGUgb25seSBpZiByZXF1ZXN0ZWQgaXMgbm90IGN1cnJlbnRcclxuICAgICAgaWYgKHJlcXVlc3RlZER2ICE9PSAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSkge1xyXG4gICAgICAgIGxldCBmcm9tQ2FjaGU6IERhdGFWaWV3ID0gdGhpcy5fZHZDYWNoZS5nZXRDYWNoZWREYXRhVmlldyhyZXF1ZXN0ZWREdik7XHJcbiAgICAgICAgaWYgKGZyb21DYWNoZSA9PSBudWxsKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY2hhbmdlRHYoZnJvbUNhY2hlKTsgICAgIC8vIGNoYW5nZXMgdGhlIGN1cnJlbnQgZC52IHdpdGggdGhlIG9uZSB0YWtlbiBmcm9tIGNhY2hlIGRvIG5vdCBmb3JnZXQgdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCBuZWVkcyB0byBiZSBpbnNlcnRlZCB0byB0aGUgY2FjaGVcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUUNSICM0MzAwNDUuIEluZGljYXRlIHRoYXQgUlAgbXVzdCBiZSBleGVjdXRlZCBhZnRlciBnZXQgZnJvbSB0aGUgY2FjaGUuXHJcbiAgICAgIHRoaXMuRG9TdWJmb3JtUHJlZml4U3VmZml4ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVjayBhbGwgc3ViLWZvcm1zIHRhc2tzZFxyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICAvLyB0aGlzIGxvb3AgZG9lcyBub3QgbmVlZCB0byByZWFjaCBpdHMgZW5kXHJcbiAgICAgIC8vIHRoZSBtb21lbnQgb25lIHRoYXQgbmVlZCB0byBnbyB0byB0aGUgc2VydmVyIGlzIGRpc2NvdmVyZWQgYWxsIG5lZWQgdG8gZ28gYWxzb1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgIC8vIGRvZXMgdGhlIGktdGggc29uIG5lZWQgdG8gZ28gdG8gdGhlIHNlcnZlclxyXG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpLnRlc3RBbmRTZXQoZmFsc2UpKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hhbmdlcyB0aGUgY3VycmVudCBkLnYgd2l0aCBvbmUgdGFrZW4gZnJvbSBjYWNoZSBpbiB0aGlzIG1ldGhvZCB3ZSBkbyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCB1cGRhdGVzXHJcbiAgLy8vICAgb2YgdGhlIGN1cnJlbnQgZGF0YXZpZXcgc2luY2UgdGhlIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCBmcm9tIHRlc3RBbmRTZXQgdGhhdCBpbiB0dXJuIGlzIG9ubHkgdXNlZCBhZnRlclxyXG4gIC8vLyAgIGEgU3VjY2Vzc2Z1bCBydW4gcHJhcHJlQ2FjaGUgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIGZvciB1cGRhdGVzIGluIHRoZSBjdXJyZW50IGRhdGF2aWV3IG9mXHJcbiAgLy8vICAgZWFjaCByZWxhdGVkIHRhc2suIGhvd2V2ZXIgdG8gYmUgb24gdGhlIHNhZmUgc2lkZSB3ZSBjaGVjayBpdCBhbnl3YXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZnJvbUNhY2hlXCI+dGhlIG5ldyBkLnY8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgY2hhbmdlRHYoZnJvbUNhY2hlOiBEYXRhVmlldyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGRhdGF2aWV3OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLkRhdGFWaWV3O1xyXG4gICAgLy8gdGhlIGRhdGEgdmlldyB3ZSByZWNlaXZlIGlzIENlcnRhaW5seSBmcm9tIHRoZSBjYWNoZVxyXG5cclxuICAgIGlmICghdGhpcy5oYXNMb2NhdGUpIHtcclxuICAgICAgaWYgKCFkYXRhdmlldy5nZXRDaGFuZ2VkKCkgJiYgZGF0YXZpZXcuSW5jbHVkZXNGaXJzdCgpKVxyXG4gICAgICAgIHRoaXMuX2R2Q2FjaGUucHV0SW5DYWNoZShkYXRhdmlldy5yZXBsaWNhdGUoKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMubG9jYXRlUHV0SW5DYWNoZSgpO1xyXG5cclxuICAgIC8vIHNldCB0aGUgZGF0YSB2aWV3IGZyb20gdGhlIGNhY2hlIGFzIHRoZSBjdXJyZW50XHJcbiAgICBhd2FpdCBkYXRhdmlldy5zZXRTYW1lQXMoZnJvbUNhY2hlKTtcclxuICAgIGRhdGF2aWV3LnRha2VGbGRWYWxzRnJvbUN1cnJSZWMoKTtcclxuXHJcbiAgICB0aGlzLkZvcm0uU2V0VGFibGVJdGVtc0NvdW50KDAsIHRydWUpO1xyXG4gICAgKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG5cclxuICAgIGF3YWl0ICg8TWdGb3JtPnRoaXMuRm9ybSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuXHJcbiAgICAvLyBRQ1IgOTI0ODA5NFxyXG4gICAgdGhpcy5zZXRPcmlnaW5hbFRhc2tNb2RlKHRoaXMuZ2V0TW9kZSgpKTtcclxuICB9XHJcblxyXG4gIHNldE9yaWdpbmFsVGFza01vZGUob3JpZ2luYWxUYXNrTW9kZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vcmlnaW5hbFRhc2tNb2RlID0gb3JpZ2luYWxUYXNrTW9kZS5jaGFyQXQoMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBtb2RlIG9mIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE9yaWdpbmFsVGFza01vZGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbFRhc2tNb2RlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGlzIENhY2hlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBzdWIgZm9ybSBjb250cm9sIHRoaXMgdGFzayBDb3JyZWxhdGVzIHdpdGggdGhpcyBtZXRob2RcclxuICAvLy8gICBhY3R1YWxseSBjb21iaW5lcyB0d28gdGVzdCBmaXJzdCB0aGF0IHRoZSB0YXNrIGlzIGEgc3ViIGZvcm0gc2Vjb25kIHRoYXQgdGhlIHN1YiB0aGF0IHRoZSBzdWIgZm9ybSBoYXNcclxuICAvLy8gICB0aGUgaXMgY2FjaGVkIHByb3BlcnR5IHNldCB0byB5ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGlzQ2FjaGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuSXNTdWJGb3JtICYmIGF3YWl0ICg8TWdDb250cm9sQmFzZT50aGlzLkZvcm0uZ2V0U3ViRm9ybUN0cmwoKSkuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lTX0NBQ0hFRCwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRvZXMgdGhlIGluc2VydCBpbiBjYWNoZSBsb2dpYyBpbiBjYXNlIHRoZSB0YXNrIGhhcyBsb2NhdGUgZXhwcmVzc2lvbnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgbG9jYXRlUHV0SW5DYWNoZSgpOiB2b2lkIHtcclxuICAgIGxldCBjYWNoZWQ6IERhdGFWaWV3ID0gdGhpcy5fZHZDYWNoZS5nZXRDYWNoZWREYXRhVmlldygoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSk7XHJcblxyXG4gICAgLy8gaWYgdGhpcyBkYXRhIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgdG8gdGhlIGNhY2hlIGJlZm9yZVxyXG4gICAgaWYgKGNhY2hlZCAhPSBudWxsKSB7XHJcbiAgICAgIGlmICgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmNoZWNrRmlyc3QoY2FjaGVkLmdldExvY2F0ZUZpcnN0UmVjKCkpICYmICEoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldENoYW5nZWQoKSkge1xyXG4gICAgICAgICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuc2V0TG9jYXRlRmlyc3RSZWMoY2FjaGVkLmdldExvY2F0ZUZpcnN0UmVjKCkpO1xyXG4gICAgICAgIHRoaXMuX2R2Q2FjaGUucHV0SW5DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnJlcGxpY2F0ZSgpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5fZHZDYWNoZS5yZW1vdmVEdkZyb21DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICAvLyBwdXQgaXQgaW4gdGhlIGNhY2hlIGlmIGl0IGlzIG5vdCB1cGRhdGVkXHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCEoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldENoYW5nZWQoKSlcclxuICAgICAgICB0aGlzLl9kdkNhY2hlLnB1dEluQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5yZXBsaWNhdGUoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgaGFzTG9jYXRlIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEhhc0xvYWN0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0xvY2F0ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBvcGVucyBhIG5ldyBUcmFuc2FjdGlvbiBvciBzZXQgcmVmZXJlbmNlIHRvIHRoZSBleGlzdGluZyBUcmFuc2FjdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRSZW1vdGVUcmFuc2FjdGlvbih0cmFuc0lkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBtZ2RUYWI6IElNR0RhdGFDb2xsZWN0aW9uID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlO1xyXG4gICAgbGV0IHRyYW5zVGFzazogVGFzaztcclxuICAgIGxldCBpc0ZpbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBtZ2RUYWIuc3RhcnRUYXNrc0l0ZXJhdGlvbigpO1xyXG4gICAgd2hpbGUgKCh0cmFuc1Rhc2sgPSA8VGFzaz5tZ2RUYWIuZ2V0TmV4dFRhc2soKSkgIT0gbnVsbCkge1xyXG4gICAgICAvLyB0cmFuc2FjdGlvbiBtaWdodCBiZSBudWxsIHdoZW4gdGFzayBpcyBhYm9ydGluZyBidXQgbm90IHlldCB1bmxvYWRlZC5cclxuICAgICAgaWYgKHRyYW5zVGFzay5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uICE9IG51bGwgJiZcclxuICAgICAgICB0cmFuc1Rhc2suRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCkgPT09IHRyYW5zSWQpIHtcclxuICAgICAgICBpc0ZpbmQgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uID0gKGlzRmluZCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNUYXNrLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24gOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmFuc2FjdGlvbih0aGlzLCB0cmFuc0lkKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgbmV3IFRyYW5zYWN0aW9uIE93bmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRUcmFuc093bmVyVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuVHJhbnNhY3Rpb24uc2V0T3duZXJUYXNrKHRoaXMpO1xyXG4gICAgdGhpcy5UcmFuc2FjdGlvbi5zZXRUcmFuc0JlZ2luKCdUJykvKidUJyovO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGNvdW50ZXIgYWNjb3JkaW5nIHRvIHRoZSB0b3Btb3N0IHZhbHVlIGluIHRoZSBzdGFjayBhbmQgdGhlIHN0YXR1cyBvZiB0aGVcclxuICAvLy8gICBcInVzZUxvb3BTdGFja1wiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExvb3BDb3VudGVyKCk6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKHRoaXMuX3VzZUxvb3BTdGFjayAmJiB0aGlzLl9sb29wU3RhY2sgIT09IG51bGwgJiYgISh0aGlzLl9sb29wU3RhY2suY291bnQoKSA9PT0gMCkpIHtcclxuICAgICAgcmVzdWx0ID0gPG51bWJlcj50aGlzLl9sb29wU3RhY2sucGVlaygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwdXNoZXMgdGhlIHZhbHVlIDAgb24gdGhlIHRvcCBvZiB0aGUgbG9vcCBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZW50ZXJMb29wKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2xvb3BTdGFjayA9PT0gbnVsbClcclxuICAgICAgdGhpcy5fbG9vcFN0YWNrID0gbmV3IFN0YWNrKCk7XHJcblxyXG4gICAgdGhpcy5fbG9vcFN0YWNrLnB1c2goMCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcG9wcyB0aGUgdG9wbW9zdCBlbnRyeSBmcm9tIHRoZSBsb29wIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBsZWF2ZUxvb3AoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBvcExvb3BDb3VudGVyKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcG9wcyB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgY291bnRlciBmcm9tIHRoZSBzdGFjayBhbmQgcmV0dXJucyBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcG9wTG9vcENvdW50ZXIoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKHRoaXMuX2xvb3BTdGFjayAhPT0gbnVsbCAmJiAhKHRoaXMuX2xvb3BTdGFjay5jb3VudCgpID09PSAwKSlcclxuICAgICAgcmVzdWx0ID0gPG51bWJlcj50aGlzLl9sb29wU3RhY2sucG9wKCk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbmNyZWFzZXMgdGhlIHZhbHVlIGF0IHRoZSB0b3Agb2YgdGhlIGxvb3Agc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGluY3JlYXNlTG9vcENvdW50ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9sb29wU3RhY2sucHVzaCh0aGlzLnBvcExvb3BDb3VudGVyKCkgKyAxKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbG9vcCBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TG9vcFN0YWNrU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuX2xvb3BTdGFjayAhPT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuX2xvb3BTdGFjay5jb3VudCgpO1xyXG5cclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIFwidXNlIGxvb3Agc3RhY2tcIiB2YXJpYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIHRvIHNldDwvcGFyYW0+XHJcbiAgc2V0VXNlTG9vcFN0YWNrKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fdXNlTG9vcFN0YWNrID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgbGlua3MgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERhdGF2aWV3SGVhZGVycygpOiBEYXRhdmlld0hlYWRlcnMge1xyXG4gICAgcmV0dXJuIHRoaXMuRGF0YXZpZXdIZWFkZXJzVGFibGU7XHJcbiAgfVxyXG5cclxuICBpc0ZpcnN0UmVjb3JkQ3ljbGUoVmFsdWVfPzogYm9vbGVhbik6IGFueSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pc0ZpcnN0UmVjb3JkQ3ljbGVfMCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaXNGaXJzdFJlY29yZEN5Y2xlXzEoVmFsdWVfKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNGaXJzdFJlY29yZEN5Y2xlXzAoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlyc3RSZWNvcmRDeWNsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNGaXJzdFJlY29yZEN5Y2xlXzEoVmFsdWVfOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9maXJzdFJlY29yZEN5Y2xlID0gVmFsdWVfO1xyXG4gIH1cclxuXHJcbiAgLy8vPHN1bW1hcnk+Z2V0IHRoZSBpbnRlcm5hbCBuYW1lPC9zdW1tYXJ5PlxyXG4gIGdldFB1YmxpY05hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLlB1YmxpY05hbWU7XHJcbiAgfVxyXG5cclxuICAvLy88c3VtbWFyeT5nZXQgdGhlIEFsbG93RXZlbnRzPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGlzQWxsb3dFdmVudHMoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0FMTE9XX0VWRU5UUyk7XHJcbiAgICByZXR1cm4gYXdhaXQgcHJvcC5nZXRWYWx1ZUJvb2xlYW4oKTtcclxuICB9XHJcblxyXG4gIC8vLzxzdW1tYXJ5PmdldCB0aGUgdGFzayBpZDwvc3VtbWFyeT5cclxuICBnZXRFeHRlcm5hbFRhc2tJZCgpOiBzdHJpbmcge1xyXG4gICAgbGV0IHRhc2tJZDogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX0lEKTtcclxuXHJcbiAgICBpZiAocHJvcCAhPSBudWxsKVxyXG4gICAgICB0YXNrSWQgPSBwcm9wLkdldENvbXB1dGVkVmFsdWUoKTtcclxuXHJcbiAgICByZXR1cm4gdGFza0lkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIFRSVUUgaWYgdGhpcyB0YXNrIG93bnMgYSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1RyYW5zYWN0aW9uT3duZXIoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUcmFuc093bmVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmlzT3duZXIodGhpcykpXHJcbiAgICAgIGlzVHJhbnNPd25lciA9IHRydWU7XHJcblxyXG4gICAgcmV0dXJuIGlzVHJhbnNPd25lcjtcclxuICB9XHJcblxyXG4gIGlzVHJhbnNhY3Rpb25PbkxldmVsKGxldmVsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzVHJhbnNhY3Rpb25Pd25lcigpICYmIHRoaXMuVHJhbnNhY3Rpb24uZ2V0TGV2ZWwoKSA9PT0gbGV2ZWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHdoZXRoZXIgdGhlIHRhc2sgaXMgdGhlIFByb2dyYW0gKGkuZS4gbm90IGEgc3VidGFzaylcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzUHJvZ3JhbSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1ByZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBlbmFibGUtZGlzYWJsZSBhY3Rpb25zIGZvciB0YXNrIG1vZGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBlbmFibGVNb2RlcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBlbmFibGU6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlksIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX01PRElGWSwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX0NSRUFURSwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19RVUVSWSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fUVVFUlksIGVuYWJsZSk7XHJcblxyXG4gICAgZW5hYmxlID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfUkFOR0UsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1JBTkdFLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0xPQ0FURSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fTE9DQVRFLCBlbmFibGUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1NFQVJDSCwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19TT1JULCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NPUlRfUkVDT1JEUywgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfSU5ERVgsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVklFV19CWV9LRVksIGVuYWJsZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGhhc1pvb21IYW5kbGVyIHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEVuYWJsZVpvb21IYW5kbGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZW5hYmxlWm9vbUhhbmRsZXIgPSB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGhhc1pvb21IYW5kbGVyXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBnZXRFbmFibGVab29tSGFuZGxlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9lbmFibGVab29tSGFuZGxlcjtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gaXMgdGhlIHRhc2sgaXMgYSBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2s8L3JldHVybnM+XHJcbiAgaXNEZXN0aW5hdGlvblN1YmZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVzdGluYXRpb25TdWJmb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBmb3IgRGVzdGluYXRpb24gU3ViZm9ybSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlc3RpbmF0aW9uU3ViZm9ybVwiPjwvcGFyYW0+XHJcbiAgc2V0RGVzdGluYXRpb25TdWJmb3JtKGRlc3RpbmF0aW9uU3ViZm9ybTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fZGVzdGluYXRpb25TdWJmb3JtID0gZGVzdGluYXRpb25TdWJmb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBpcyB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFzazwvcmV0dXJucz5cclxuICBnZXRJc0Rlc3RpbmF0aW9uQ2FsbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0Rlc3RpbmF0aW9uQ2FsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgZm9yIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0Rlc3RpbmF0aW9uQ2FsbFwiPjwvcGFyYW0+XHJcbiAgc2V0SXNEZXN0aW5hdGlvbkNhbGwoaXNEZXN0aW5hdGlvbkNhbGw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2lzRGVzdGluYXRpb25DYWxsID0gaXNEZXN0aW5hdGlvbkNhbGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICBzZXRDYW5jZWxXYXNSYWlzZWQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYW5jZWxXYXNSYWlzZWQgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBjYW5jZWxXYXNSYWlzZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FuY2VsV2FzUmFpc2VkO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlQ3JlYXRlQWN0cyh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUsIHZhbCk7XHJcblxyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRSwgICh0aGlzLmdldEZvcm0oKS5IYXNUYWJsZSgpICkgPyB2YWwgOiBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyBlbmFibGUvZGlzYWJsZSBzdGF0dXMgb2YgY3JlYXRlIGFuZCBkZWxldGUgYWN0aW9uc1xyXG4gIC8vLyA8L3N1bW1hcnlcclxuICBhc3luYyBzZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoISh0aGlzLkRhdGFWaWV3KS5pc0VtcHR5RGF0YXZpZXcoKSAmJiBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19ERUxFVEUsIHRydWUpICYmXHJcbiAgICAgIHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSAmJiAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLkhhc01haW5UYWJsZSlcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORSwgdHJ1ZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RFTExJTkUsIGZhbHNlKTtcclxuXHJcbiAgICBpZiAoKGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSwgdHJ1ZSkpICYmXHJcbiAgICAgICgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLkhhc01haW5UYWJsZSAmJlxyXG4gICAgICAgICh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkgJiYgRW52aXJvbm1lbnQuSW5zdGFuY2UuYWxsb3dDcmVhdGVJbk1vZGlmeU1vZGUodGhpcy5nZXRDb21wSWR4KCkpKSB8fFxyXG4gICAgICAgICh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpKSlcclxuICAgICAgdGhpcy5lbmFibGVDcmVhdGVBY3RzKHRydWUpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmVuYWJsZUNyZWF0ZUFjdHMoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbXB0eURhdGF2aWV3XCI+dGhlIGVtcHR5RGF0YXZpZXcgdG8gc2V0IDwvcGFyYW0+XHJcbiAgc2V0RW1wdHlEYXRhdmlldyhlbXB0eURhdGF2aWV3OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLkRhdGFWaWV3LnNldEVtcHR5RGF0YXZpZXcoZW1wdHlEYXRhdmlldyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IDwvcmV0dXJucz5cclxuICBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5OYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2hlbiB0YXNrIHN0YXJ0cyBpdHMgZXhlY3V0aW9uIGluIEVtcHR5IERhdGF2aWV3IG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGVtcHR5RGF0YXZpZXdPcGVuKHN1YmZvcm1SZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyB0byBwcmV2ZW50IGRvdWJsZSBwcmVmaXggb24gdGhlIHNhbWUgcmVjb3JkXHJcbiAgICBpZiAodGhpcy5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKSB7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXLCB0cnVlKTtcclxuICAgICAgLy8gaWYgdGhlIHRhc2sgaXMgYSBzdWJmb3JtIGFuZCBzdWJmb3JtIHJlZnJlc2ggaXMgZG9uZSwgc28gZXhlY3V0ZSB0aGUgZW1wdHkgZGF0YXR2aWV3IGhhbmRsZXIsXHJcbiAgICAgIC8vIGlmIHRoZSB0YXNrIGlzIG5vdCBhIHN1YmZvcm0sIHB1dCB0aGUgZW1wdHkgZGF0YXZpZXcgZXZlbnQgb24gdGhlIHF1ZXVlXHJcbiAgICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAgIGxldCBydEV2bnQgPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpO1xyXG4gICAgICAgIGlmICgocnRFdm50ICE9IG51bGwgJiYgcnRFdm50LmdldEludGVybmFsQ29kZSgpID09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpIHx8IHN1YmZvcm1SZWZyZXNoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0aGlzKTtcclxuICAgICAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTVBUWV9EQVRBVklFVyk7XHJcbiAgICAgICAgICBydEV2dC5TZXRFdmVudFN1YlR5cGUoRXZlbnRTdWJUeXBlLk5vcm1hbCk7XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuYWRkSW50ZXJuYWxFdmVudFdpdGhJdGFza0FuZENvZGUodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXKTtcclxuXHJcbiAgICAgIHRoaXMuc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuXHJcbiAgICAgIC8vIGZvciBzdWJmb3JtIG1vZGUgJ0FzUGFyZW50Jy4gSWYgdGhlIHBhcmVudCB0YXNrIHRoYXQgaW4gJ0VtcHR5IERhdGF2aWV3JyBzdGF0ZSBjaGFuZ2VzIGl0cyBtb2RlXHJcbiAgICAgIC8vIHRoZSBzdWJmb3JtIGFsc28gbXVzdCBjaGFuZ2UgbW9kZS5cclxuICAgICAgLy8gUUNSICMyODE4NjIuIElmIHRoZSBzdWJmb3JtIHRhc2sgaXMgb3BlbmVkIGluIHRoZSBmaXJzdCB0aW1lIGRvIG5vdCByZWZyZXNoIGl0J3Mgc3ViZm9ybXMsXHJcbiAgICAgIC8vIGJlY2F1c2UgdGhleSd2ZSByZWNlaXZlZCB0aGVpciBkYXRhdmlld3MgYWxyZWFkeS5cclxuICAgICAgLy8gV2UgbXVzdCByZWZyZXNoIHRoZW0gd2hlbiB0aGUgc3ViZm9ybSB0YXNrIHBhc3NlcyB0byBlbXB0eSBEVi5cclxuICAgICAgaWYgKHRoaXMuU3ViZm9ybUV4ZWNNb2RlICE9PSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uRklSU1RfVElNRSAmJiBzdWJmb3JtUmVmcmVzaCAmJiBhd2FpdCB0aGlzLkNoZWNrUmVmcmVzaFN1YlRhc2tzKCkpIHtcclxuICAgICAgICBhd2FpdCAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmNvbXB1dGVTdWJGb3JtcygpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZG9TdWJmb3JtUmVjUHJlZml4U3VmZml4KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuZW5hYmxlUmVjb3JkQWN0aW9ucygpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCwgZmFsc2UpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTiwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2hlbiB0YXNrIGVuZHMgaXRzIGV4ZWN1dGlvbiBpbiBFbXB0eSBEYXRhdmlldyBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBlbXB0eURhdGF2aWV3Q2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTVBUWV9EQVRBVklFVywgZmFsc2UpO1xyXG4gICAgdGhpcy5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTiwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtVGFza1wiPjwvcGFyYW0+XHJcbiAgYXN5bmMgU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2s6IFRhc2tCYXNlLCBleHBsaWNpdFN1YmZvcm1SZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICBsZXQgaXNJbnNpZGU6IGJvb2xlYW4gPSBhd2FpdCAoPFRhc2s+c3ViZm9ybVRhc2spLkV4ZWN1dGVOZXN0ZWRSUyhjdXJyVGFzayk7XHJcblxyXG4gICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBRQ1IgIzQzNDQ2Ny4gRXhlY3V0ZSBSUyBvZiB0aGUgY3VycmVudCBzdWJmb3JtIGlmIGl0J3MgdGhlIGN1cnJlbnQgKGxhc3QgZm9jdXNlZCkgdGFzay5cclxuICAgIGlmIChzdWJmb3JtVGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHN1YmZvcm1UYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCwgdHJ1ZSk7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgaXNJbnNpZGUgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gRGVmZWN0IDc3NDgzLiBEbyBub3QgY29udGludWUgaWYgdGhlIHJlY29yZCBzdWZmaXggZXhlY3V0aW9uIGlzIGZhaWxlZC5cclxuICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNyZWF0ZSBjb21tYW5kIGZvciB0aGUgc2VydmVyXHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVN1YmZvcm1SZWZyZXNoQ29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgc3ViZm9ybVRhc2suZ2V0VGFza1RhZygpLCBleHBsaWNpdFN1YmZvcm1SZWZyZXNoKTtcclxuICAgIGF3YWl0IHN1YmZvcm1UYXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgICBpZiAoc3ViZm9ybVRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGV4cGxpY2l0U3ViZm9ybVJlZnJlc2gpIHtcclxuICAgICAgLy8gUUNSICM0MjkxMTIuIFB1c2ggZXhlY3V0aW9uIHN0YWNrIGJlZm9yZSBSUCBleGVjdXRpb24uXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcblxyXG4gICAgICAvLyBEZWZlY3QgIzc3MDQ5LiBEbyBub3QgZXhlY3V0ZSBwYXJlbnQgUlAuIFdlIG5lZWQgaXQgb25seSB3aGVuIGNsaWNrIG9uIHN1YmZvcm13YXMgZG9uZS5cclxuICAgICAgbGV0IHBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXhPcmc6IGJvb2xlYW4gPSAoPFRhc2s+c3ViZm9ybVRhc2spLlBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXg7XHJcbiAgICAgICg8VGFzaz5zdWJmb3JtVGFzaykuUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRTdWJmb3JtUmVmcmVzaChzdWJmb3JtVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIHRydWUpO1xyXG4gICAgICAoPFRhc2s+c3ViZm9ybVRhc2spLlBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXggPSBwZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4T3JnO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiBTdWJmb3JtUmVmcmVzaCBldmVudCB0byBpdHNlbGYgc28gdGhlIGN1cnNvciBtdXN0IGJlIG9uIHRoZSBmaXJzdCBjb250cm9sIG9mIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gICAgLy8gYXMgZm9yIFZpZXdSZWZyZXNoIGV2ZW50LlxyXG4gICAgaWYgKGlzSW5zaWRlKSB7XHJcbiAgICAgIC8vIERlZmVjdCAxMTU3OTMuIGN1cnJUYXNrIGNhbid0IGJlIG51bGwuXHJcbiAgICAgIC8vIGlmICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiAhc3ViZm9ybVRhc2suZ2V0UHJldmVudENvbnRyb2xDaGFuZ2UoKSAmJiBjdXJyVGFzayAhPSBudWxsKVxyXG4gICAgICAvLyAgIGN1cnJUYXNrLm1vdmVUb0ZpcnN0Q3RybChmYWxzZSk7XHJcbiAgICAgIC8vIFRPRE86IFRhYmJpbmcgJiBGb2N1c2luZzogSGFuZGxlIHRoaXMgc2l0dWF0aW9uXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgaWYgKGV4cGxpY2l0U3ViZm9ybVJlZnJlc2gpIHtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJmb3JtVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgaWYgKGN1cnJUYXNrICE9IG51bGwpXHJcbiAgICAgICAgICAgICg8RGF0YVZpZXc+Y3VyclRhc2suRGF0YVZpZXcpLnNldFByZXZDdXJyUmVjKCk7XHJcbiAgICAgICAgICBzdWJmb3JtVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRXhlY3V0ZXMgUmVjb3JkIFN1ZmZpeGVzIG9mIGFsbCBuZXN0ZWQgc3ViZm9ybXMgZnJvbSBib3R0b20gdG8gdG9wLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybVRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEV4ZWN1dGVOZXN0ZWRSUyhsYXN0VGFzazogVGFzayk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGlzRXhlY3V0ZU5lc3RlZFJTOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gUUNSICMxNjgzNDIuIEEgbmV3IHRhc2sgaXMgc2V0IGFzIGZvY3VzZWQgdGFzayBhZnRlciB0aGUgZmlyc3QgQ1AuXHJcbiAgICAvLyBTbyBpZiBpbiBDUCBVcGRhdGUgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkIGN1cnJUYXNrIGlzIG51bGwuIEJ1dCB3ZSBtdXN0IHJlZnJlc2ggdGhlIHN1YmZvcm0uXHJcbiAgICBpZiAobGFzdFRhc2sgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGlzRXhlY3V0ZU5lc3RlZFJTO1xyXG5cclxuICAgIC8vIERvIG5vdCBleGVjdXRlIHN1YmZvcm0gcmVmcmVzaCB3aGVuIHRoZSBmb2N1c2VkIHRhc2sgaXMgbm90IG9wZW5lZCBhcyBhIHN1YmZvcm0gKGl0IHdhcyBvcGVuZWQgZnJvbSBjYWxsIG9wZXJhdGlvbiksXHJcbiAgICAvLyBidXQgdGhlIGZvY3VzZWQgdGFzayBpcyBhIGNoaWxkIG9mIHRoZSBzdWJmb3JtIHRhc2suIFNlZSBmb3IgZXhhbXBsZSBRQ1IgIzQzMTg1MC5cclxuICAgIGlmICh0aGlzLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0sgJiYgbGFzdFRhc2suZ2V0TWdkSUQoKSAhPT0gdGhpcy5nZXRNZ2RJRCgpKVxyXG4gICAgICByZXR1cm4gaXNFeGVjdXRlTmVzdGVkUlM7XHJcblxyXG4gICAgZm9yIChsZXQgdGFzazogVGFzayA9IGxhc3RUYXNrOyB0YXNrICE9PSB0aGlzICYmIHRhc2sucGF0aENvbnRhaW5zKHRoaXMpICYmIHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSzsgdGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICBpc0V4ZWN1dGVOZXN0ZWRSUyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzRXhlY3V0ZU5lc3RlZFJTO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBleGVjdXRlIFJlYyBzdWZmaXggZm9yIGFsbCBuZXN0ZWQgc3ViZm9ybXMgdW50aWxsIHN1YmZvcm0gdGFzayB0aGF0IGNvbnRhaW5zIHRoZXNlIDIgc3ViZm9ybXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBleGVjU3ViZm9ybVJlY1N1ZmZpeChuZXdUYXNrOiBUYXNrKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGxldCBzdWJmVGFzazogVGFzaztcclxuICAgIGxldCBpOiBudW1iZXIsIGlkeCA9IDA7XHJcbiAgICBmb3IgKGkgPSB0aGlzLl90YXNrUGF0aC5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcclxuICAgICAgc3ViZlRhc2sgPSB0aGlzLl90YXNrUGF0aC5nZXRfSXRlbShpIC0gMSk7XHJcbiAgICAgIGlmICghbmV3VGFzay5fdGFza1BhdGguQ29udGFpbnMoc3ViZlRhc2spKSB7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YmZUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgLy8gQ2hhbmdlIHRoZSBDcmVhdGUgbW9kZSB0byBNb2RpZnkgaWYgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIG5vdCBhIG5ldyByZWNvcmQuXHJcbiAgICAgICAgLy8gU28gdGhlIG1vZGUgaXMgY2hhbmdlZCBvbmx5IGZvciB0aGUgZmlyc3QgcmVjb3JkIHRoYXQgd2FzIG5vdCBjaGFuZ2VkLlxyXG4gICAgICAgIGlmIChzdWJmVGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICEoKDxEYXRhVmlldz5zdWJmVGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5pc05ld1JlYygpKVxyXG4gICAgICAgICAgc3ViZlRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWR4ID0gbmV3VGFzay5fdGFza1BhdGguaW5kZXhPZihzdWJmVGFzayk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIERlYnVnLkFzc2VydChpID4gMCk7XHJcbiAgICByZXR1cm4gaWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgY291bnRlciBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmNvdW50ZXI8L3JldHVybnM+XHJcbiAgZ2V0Q291bnRlcigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvdW50ZXI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5jcmVhc2UgdGhlIHRhc2tzIGNvdW50ZXIgYnkgMS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5jb3VudGVyPC9yZXR1cm5zPlxyXG4gIGluY3JlYXNlQ291bnRlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvdW50ZXIgPSB0aGlzLl9jb3VudGVyICsgMTtcclxuICB9XHJcblxyXG4gIHNldENvdW50ZXIoY250OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvdW50ZXIgPSBjbnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgISFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyclN0YXJ0UHJvZ0xldmVsID09PSBUYXNrLlN0YXJ0UHJvZ0xldmVsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDaGVjayBpZiByZWZlcmVuY2UgdG8gbWFpbiBwcm9ncmFtIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZpZWxkU3RyXCI+YSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBpc01haW5Qcm9ncmFtRmllbGQoZmllbGRTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IEZpZWxkOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKGZpZWxkU3RyLCAnLCcpO1xyXG4gICAgbGV0IG1haW5Qcm9nRmllbGQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoRmllbGQubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgIGxldCBwYXJlbnQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoRmllbGQuZ2V0X0l0ZW0oMCkpO1xyXG4gICAgICBpZiAocGFyZW50ID09PSBUYXNrQmFzZS5NQUlOX1BSR19QQVJFTlRfSUQpXHJcbiAgICAgICAgbWFpblByb2dGaWVsZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1haW5Qcm9nRmllbGQ7XHJcbiAgfVxyXG5cclxuICBnZXRUYXNrSW5mbygpOiBzdHJpbmcge1xyXG4gICAgLy8gR2V0IHRoZSB0YXNrIG5hbWUgdXNpbmcgdGhlIGdldFByb3AoKSBhcyBuYW1lIGlzIG9ubHkgc2VyaWFsaXplZCBmb3IgZGVidWdcclxuICAgIGxldCB0YXNrTmFtZTogc3RyaW5nID0gKHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG4gICAgcmV0dXJuIE5TdHJpbmcuRm9ybWF0KCd7MH0gezF9Jyx0aGlzLmlzUHJvZ3JhbSgpID8gJ1Byb2dyYW0nOiAnU3VidGFzaycsIHRhc2tOYW1lKTtcclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoXCIodGFzayB7MH0tXFxcInsxfVxcXCJ7Mn0pXCIsIHRoaXMuX3Rhc2tUYWcsIHRoaXMuTmFtZSwgc3VwZXIuaXNNYWluUHJvZygpID8gKFwiIGN0bCBcIiArIHRoaXMuX2N0bElkeCkgOiBcIlwiKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIENvbnN0cnVjdE1nRm9ybShhbHJlYWR5U2V0UGFyZW50Rm9ybTogUmVmUGFyYW08Ym9vbGVhbj4pOiBNZ0Zvcm1CYXNlIHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSBuZXcgTWdGb3JtKCk7XHJcbiAgICBsZXQgcGFyZW50Rm9ybTogTWdGb3JtQmFzZSA9ICh0aGlzLlBhcmVudFRhc2sgIT0gbnVsbCA/IHRoaXMuUGFyZW50VGFzay5nZXRGb3JtKCkgOiBudWxsKTtcclxuXHJcbiAgICAvLyBQYXJlbnRGb3JtIG9mIGFueSBmb3JtIHNob3VsZCBiZSBhIHZpc2libGUgb25lLiBJdCBtaWdodCBoYXBwZW4gdGhhdCB0aGUgUGFyZW50VGFza1xyXG4gICAgLy8gaXMgYSBub24taW50ZXJhY3RpdmUgdGFzayB3aXRoIE9wZW5XaW5kb3c9Tm8uIEluIHRoaXMgY2FzZSwgdGhlIFBhcmVudCBvZiB0aGUgbm9uLWludGVyYWN0aXZlXHJcbiAgICAvLyB0YXNrLCBzaG91bGQgYmUgdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBmb3JtLlxyXG4gICAgd2hpbGUgKHBhcmVudEZvcm0gIT0gbnVsbCAmJiAhcGFyZW50Rm9ybS5nZXRUYXNrKCkuaXNPcGVuV2luKCkpIHtcclxuICAgICAgcGFyZW50Rm9ybSA9IHBhcmVudEZvcm0uUGFyZW50Rm9ybTtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtLlBhcmVudEZvcm0gPSBwYXJlbnRGb3JtO1xyXG4gICAgYWxyZWFkeVNldFBhcmVudEZvcm0udmFsdWUgPSB0cnVlO1xyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgbWdkYXRhIElEIHRvIHdoaWNoIHRhc2sgYmVsb25nc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TWdkSUQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tZ0RhdGEuR2V0SWQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgcmVmZXJlbmNlIHRvIGN1cnJlbnQgTUdEYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRNR0RhdGEoKTogTUdEYXRhIHtcclxuICAgIHJldHVybiB0aGlzLl9tZ0RhdGE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJlZnJlc2ggdGhlIGRpc3BsYXksIHBhaW50IHRoZSBjb250cm9scyBhbmQgdGhlaXIgcHJvcGVydGllcyBhZ2FpbiA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgUmVmcmVzaERpc3BsYXkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5Gb3JtICE9PSBudWxsICYmICF0aGlzLmlzQWJvcnRpbmcoKSAmJiB0aGlzLmlzU3RhcnRlZCgpKSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiU3RhcnQgdGFzay5SZWZyZXNoRGlzcGxheSgpXCIpO1xyXG5cclxuICAgICAgLy8gcmVjb3JkcyBmcm9tIHRoZSBEYXRhVmlldyBhbmQgcmVmcmVzaGVzIHRoZSByb3dzLlxyXG4gICAgICAvLyBOb3csIFRhc2suUmVmcmVzaERpc3BsYXkoKSBpcyBjYWxsZWQgZnJvbSAyIHBsYWNlczpcclxuICAgICAgLy8gMS4gd2hpbGUgaW5pdGluZyB0aGUgZm9ybVxyXG4gICAgICAvLyAyLiB3aGVuIGNvbWluZyBiYWNrIGZyb20gc2VydmVyXHJcbiAgICAgIC8vIEluIGNhc2UgIzEsIHdlIGRvIG5vdCBuZWVkIHRvIHJlZnJlc2ggdGhlIHRhYmxlIGFzIGl0IGlzIGRvbmUgZnJvbSBmaXJzdFRhYmxlUmVmcmVzaCgpLlxyXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGNhbiBiZSBlbGltaW5hdGVkLlxyXG4gICAgICBpZiAodGhpcy5fcmVmcmVzaFR5cGUgIT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfTk9ORSkge1xyXG4gICAgICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRoaXMuRm9ybTtcclxuICAgICAgICBsZXQgd2FzUmVmcmVzaGVkOiBib29sZWFuID0gYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgIGlmICh3YXNSZWZyZXNoZWQpIHtcclxuICAgICAgICAgIHRoaXMuX3JlZnJlc2hUeXBlID0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9OT05FO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIkVuZCB0YXNrLlJlZnJlc2hEaXNwbGF5KClcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGdldCB0aGUgdmFsdWUgb2YgYSBmaWVsZC4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkRGVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICAvLyBUT0RPIHNhZGhhbiByZW1vdmUgdW51c2VkXHJcbiAgLy8gYXN5bmMgZ2V0RmllbGRWYWx1ZShmaWVsZERlZjogRmllbGREZWYsIHZhbHVlOiBSZWZQYXJhbTxzdHJpbmc+LCBpc051bGw6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgLy8gICB2YWx1ZS52YWx1ZSA9IGF3YWl0ICg8RmllbGQ+ZmllbGREZWYpLmdldFZhbHVlKGZhbHNlKTtcclxuICAvLyAgIGlzTnVsbC52YWx1ZSA9IGF3YWl0ICg8RmllbGQ+ZmllbGREZWYpLmlzTnVsbCgpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBnZXQgdGhlIGRpc3BsYXkgdmFsdWUgb2YgYSBmaWVsZC4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkRGVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICBnZXRGaWVsZERpc3BsYXlWYWx1ZShmaWVsZERlZjogRmllbGREZWYsIHZhbHVlOiBSZWZQYXJhbTxzdHJpbmc+LCBpc051bGw6IFJlZlBhcmFtPGJvb2xlYW4+KTogdm9pZCB7XHJcbiAgICB2YWx1ZS52YWx1ZSA9ICg8RmllbGQ+ZmllbGREZWYpLmdldERpc3BWYWx1ZSgpO1xyXG4gICAgaXNOdWxsLnZhbHVlID0gKDxGaWVsZD5maWVsZERlZikuaXNOdWxsKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHVwZGF0ZXMgdGhlIGZpZWxkJ3MgdmFsdWUgYW5kIHN0YXJ0cyByZWNvbXB1dGUuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWVsZERlZlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgVXBkYXRlRmllbGRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKGZpZWxkRGVmOiBGaWVsZERlZiwgdmFsdWU6IHN0cmluZywgaXNOdWxsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5UYXNrUHJlZml4RXhlY3V0ZWQpIHtcclxuICAgICAgYXdhaXQgKDxGaWVsZD5maWVsZERlZikuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZSh2YWx1ZSwgaXNOdWxsLCB0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBGb3IgYSByaWNoY2xpZW50IHRhc2tzLCBjaGVjayBpZiBOb24tSW50ZXJhY3RpdmUgdGFzayBjaGlsZCBzaG91bGQgYmUgTW9kYWwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZTwvcmV0dXJucz5cclxuICBTaG91bGROb25JbnRlcmFjdGl2ZUNoaWxkQmVNb2RhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlNob3VsZENoaWxkQmVNb2RhbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVjayBpZiBhIHRhc2tzIGNoaWxkIHNob3VsZCBiZSBtb2RhbFxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIFNob3VsZENoaWxkQmVNb2RhbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBjaGlsZFNob3VsZEJlaGF2ZUFzTW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyB3aW5kb3cgaXMgb3BlbmVkIGFuZCBvZiBtb2RhbCB0eXBlIChkb2Vzbid0IG1hdHRlciBpZiBpbnRlcmFjdGl2ZSBvciBub3QpXHJcbiAgICBpZiAoKHRoaXMuRm9ybS5Db25jcmV0ZVdpbmRvd1R5cGUgPT09IFdpbmRvd1R5cGUuT3ZlcmxheSkgJiYgdGhpcy5nZXRGb3JtKCkuT3BlbmVkKVxyXG4gICAgICBjaGlsZFNob3VsZEJlaGF2ZUFzTW9kYWwgPSB0cnVlO1xyXG4gICAgZWxzZSBpZiAoIXRoaXMuSXNJbnRlcmFjdGl2ZSkge1xyXG4gICAgICAgIGNoaWxkU2hvdWxkQmVoYXZlQXNNb2RhbCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hpbGRTaG91bGRCZWhhdmVBc01vZGFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgcGFyZW50IHRhc2sgb2YgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRQYXJlbnQoKTogVGFza0Jhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgdGFzayBpcyB0aGUgY2hlY2tlZCB0YXNrIG9yIGEgZGVzY2VuZGFudCBvZiBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNEZXNjZW5kZW50T2YoY2hrVGFzazogVGFza0Jhc2UpOiBib29sZWFuIHtcclxuICAgIGlmIChjaGtUYXNrID09PSB0aGlzKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIGVsc2UgaWYgKGNoa1Rhc2sgPT09IG51bGwgfHwgdGhpcy5fcGFyZW50VGFzayA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9wYXJlbnRUYXNrLmlzRGVzY2VuZGVudE9mKGNoa1Rhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgc3ViZm9ybUN0cmwgd2hpY2ggaXMgTW9kYWwgaW4gY3VycmVudCBydW50aW1lIHRyZWUgaWYgdGhlcmUgaXMgYW55Py5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBHZXRTdWJmb3JtTW9kYWxQYXJlbnRUYXNrKCk6IE1nQ29udHJvbCB7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSB0aGlzO1xyXG4gICAgd2hpbGUgKGN1cnJUYXNrLl9wYXJlbnRUYXNrICE9IG51bGwgJiYgY3VyclRhc2suX3BhcmVudFRhc2suZ2V0SXNEZXN0aW5hdGlvbkNhbGwoKSkge1xyXG4gICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+KGN1cnJUYXNrLl9wYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpKTtcclxuICAgICAgaWYgKHN1YmZvcm1DdHJsLklzTW9kYWwoKSlcclxuICAgICAge1xyXG4gICAgICAgIHJldHVybiBzdWJmb3JtQ3RybDtcclxuICAgICAgfVxyXG4gICAgICBjdXJyVGFzayA9IGN1cnJUYXNrLl9wYXJlbnRUYXNrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdHJ1ZSBmb3IgcmVtb3RlIHRhc2sgZm9yIGV4cHJlc3Npb24gdGhhdCB3YXMgY29tcHV0ZWQgb25jZSBvbiBzZXJ2ZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgU2hvdWxkRXZhbHVhdGVQcm9wZXJ0eUxvY2FsbHkocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlRhc2tTZXJ2aWNlLlNob3VsZEV2YWx1YXRlUHJvcGVydHlMb2NhbGx5KHByb3BJZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFRoaXMgbWV0aG9kIHJ1bnMgYWN0aW9ucyBhZnRlciB0aGUgJ2Zvcm0nIHRhZyBpcyBoYW5kbGVkLlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgRW5zdXJlVmFsaWRGb3JtKCk6IHZvaWQge1xyXG4gICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWV0aG9kOlxyXG4gICAgLy8gSWYgdGhpcyB0YXNrIGlzIHRoZSBtYWluIHByb2dyYW0gYW5kIF9vcGVuV2luIGV2YWx1YXRlcyB0byAnZmFsc2UnLCB0aGVuXHJcbiAgICAvLyBwcmV2ZW50IHRoZSBkaXNwbGF5IG9mIHRoZSBmb3JtLCBieSBzZXR0aW5nIGl0IHRvICdudWxsJy5cclxuICAgIGlmICh0aGlzLl9pc01haW5QcmcgJiYgdGhpcy5Gb3JtICE9PSBudWxsKSB7XHJcbiAgICAgIGlmICghdGhpcy5fb3BlbldpbiB8fCAhdGhpcy5Gb3JtLmlzTGVnYWxGb3JtKSB7ICAgLy8gVGhpcyBjYW4gYmUgbWRpIGZyYW1lXHJcbiAgICAgICAgdGhpcy5Gb3JtID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjb21wdXRlIHRoZSBtYWluIGRpc3BsYXkgb25jZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBDb21wdXRlTWFpbkRpc3BsYXkoKTogdm9pZCB7XHJcbiAgICBsZXQgcHJvcE1haW5EaXNwbGF5OiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NQUlOX0RJU1BMQVkpO1xyXG4gICAgbGV0IG1haW5EaXNwbGF5SW5kZXg6IG51bWJlciA9IHByb3BNYWluRGlzcGxheS5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpO1xyXG5cclxuICAgIG1haW5EaXNwbGF5SW5kZXggPSB0aGlzLkdldFJlYWxNYWluRGlzcGxheUluZGV4T25DdXJyZW50VGFzayhtYWluRGlzcGxheUluZGV4KTtcclxuXHJcbiAgICB0aGlzLl9mb3Jtcy5Jbml0Rm9ybUZyb21YbWxTdHJpbmcobWFpbkRpc3BsYXlJbmRleCk7XHJcbiAgICB0aGlzLkVuc3VyZVZhbGlkRm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBwcmVwYXJlIHRhc2sgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgUHJlcGFyZVRhc2tGb3JtKCk6IFByb21pc2U8UmV0dXJuUmVzdWx0PiB7XHJcbiAgICBhd2FpdCBUYXNrU2VydmljZUJhc2UuUHJlcGFyZVByb3BPcGVuVGFza1dpbmRvdyh0aGlzKTtcclxuICAgIHJldHVybiBSZW1vdGVUYXNrU2VydmljZS5QcmVwYXJlUHJvcE1haW5EaXNwbGF5KHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdHJ1ZSBpZiBmb3JtIGlzIGxlZ2FsXHJcbiAgLy8vIHdlIGFyZSBub3QgZ2V0IHRvIHRoYXQgbWV0aG9kIGZvciBtYWluIGRpc3BsYXkgdGhhdCBvcGVuIHdpbmRvdyBpcyBmYWxzZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBGb3JtSXNMZWdhbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBpc0Zvcm1Jc0xlZ2FsOiBib29sZWFuID0gc3VwZXIuaXNNYWluUHJvZygpO1xyXG4gICAgcmV0dXJuIGlzRm9ybUlzTGVnYWwgfHwgc3VwZXIuZ2V0Rm9ybSgpLmlzTGVnYWxGb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIG1haW4gZGlzcGxheSBvbiBzdHVkaW8gZGVwdGhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1haW5Ec3BJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0UmVhbE1haW5EaXNwbGF5SW5kZXhPbkRlcHRoKG1haW5Ec3BJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IHRoaXMuTG9naWNhbFN0dWRpb1BhcmVudFRhc2s7XHJcblxyXG4gICAgd2hpbGUgKHRhc2sgIT0gbnVsbCkge1xyXG4gICAgICBtYWluRHNwSWR4ICs9IHRhc2suX2Zvcm1zLkNvdW50O1xyXG4gICAgICB0YXNrID0gdGFzay5Mb2dpY2FsU3R1ZGlvUGFyZW50VGFzaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWFpbkRzcElkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IHRoZSBtYWluIGRpc3BsYXkgb24gc3R1ZGlvIGRlcHRoXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtYWluRHNwSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldFJlYWxNYWluRGlzcGxheUluZGV4T25DdXJyZW50VGFzayhtYWluRHNwSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgaWYgKG1haW5Ec3BJZHggPiAxKSB7XHJcblxyXG4gICAgICBsZXQgdGFzazogVGFzayA9IHRoaXMuTG9naWNhbFN0dWRpb1BhcmVudFRhc2s7XHJcblxyXG4gICAgICB3aGlsZSAodGFzayAhPSBudWxsKSB7XHJcbiAgICAgICAgbWFpbkRzcElkeCAtPSB0YXNrLl9mb3Jtcy5Db3VudDtcclxuICAgICAgICB0YXNrID0gdGFzay5Mb2dpY2FsU3R1ZGlvUGFyZW50VGFzaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtYWluRHNwSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgQW5jZXN0b3IgdGFzayAob24gcnVudGltZSB0cmVlKSBvZiB0aGUgc2VuZCB0YXNrIGRlZmluaXRpb24gaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpbmRUYXNrRGVmaW5pdGlvbklkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldEFuY2VzdG9yVGFza0J5VGFza0RlZmluaXRpb25JZChmaW5kVGFza0RlZmluaXRpb25JZDogVGFza0RlZmluaXRpb25JZCk6IFRhc2sge1xyXG4gICAgbGV0IGN1cnJlbnRUYXNrOiBUYXNrID0gdGhpcztcclxuXHJcbiAgICAvLyBGaXhlZCBidWcgIzoxNzI5NTlcclxuICAgIC8vIGlmIHRoZSBmaW5kVGFza0RlZmluaXRpb25JZCBpcyBtYWluIHByb2dyYW0gKGNhbiBiZSBvZiBjb21wb25lbnQpIHdlIHdpbGwgbm90IGZvdW5kIGl0IGluIHRoZSBfcGFyZW50VGFza1xyXG4gICAgLy8gc28gd2Ugd2lsbCB0YWtlIHRoZSB0YXNrIGZyb20gdGhlIE1HRGF0YVRhYmxlXHJcbiAgICBpZiAoZmluZFRhc2tEZWZpbml0aW9uSWQuSXNNYWluUHJvZ3JhbSgpKVxyXG4gICAgICByZXR1cm4gPFRhc2s+R3VpRGF0YUNvbGxlY3Rpb24uTUdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCh0aGlzLkNvbnRleHRJRCwgZmluZFRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXgpO1xyXG5cclxuICAgIHdoaWxlIChjdXJyZW50VGFzayAhPSBudWxsKSB7XHJcbiAgICAgIGlmIChjdXJyZW50VGFzay5UYXNrRGVmaW5pdGlvbklkLkVxdWFscyhmaW5kVGFza0RlZmluaXRpb25JZCkpXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRUYXNrO1xyXG5cclxuICAgICAgY3VycmVudFRhc2sgPSBjdXJyZW50VGFzay5fcGFyZW50VGFzaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIFNldERhdGFDb250cm9sVmFsdWVzUmVmZXJlbmNlKGNvbnRyb2xJZDogbnVtYmVyLCBkY1ZhbHVlc0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gc3VwZXIuZ2V0Rm9ybSgpLmdldEN0cmwoY29udHJvbElkKTtcclxuICAgIGN0cmwuc2V0RGNWYWxJZChkY1ZhbHVlc0lkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZGlzcGxheSB0ZXN0IG9uIHN0YXR1cyBiYXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRleHRcIj48L3BhcmFtPlxyXG4gIERpc3BsYXlNZXNzYWdlVG9TdGF0dXNCYXIodGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyBRY3IgIzc5ODMxMS4gaWYgc2VydmVyIHNpZGUgaGFkIE1QIGRvaW5nIHZlcmlmeSB0byBwYW5lIGFuZCBNUCBoYXMgbm8gZm9ybVxyXG4gICAgLy8gd2Ugd2lsbCBnZXQgYW4gZXhjZXB0aW9uLiBzbyBpbiBjYXNlIG9mIG5vIGZvcm0sIGdldCBpdCBmcm9tIGxhc3QgZm9jdXNlZCB0YXNrLlxyXG4gICAgbGV0IHRhc2tUb1ZlcmlmeU9uOiBUYXNrID0gPFRhc2s+IHRoaXMuR2V0Q29udGV4dFRhc2soKTtcclxuICAgIGlmICh0YXNrVG9WZXJpZnlPbi5nZXRGb3JtKCkgPT0gbnVsbClcclxuICAgICAgdGFza1RvVmVyaWZ5T24gPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcblxyXG4gICAgdGFza1RvVmVyaWZ5T24uV3JpdGVUb01lc3NhZ2VQYW5lKHRleHQpO1xyXG4gIH1cclxuXHJcblxyXG4gIGlzVGFibGVXaXRoQWJzb2x1dGVzU2Nyb2xsYmFyKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVGFibGVXaXRoQWJzb2x1dGVzU2Nyb2xsYmFyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuZ2V0Rm9ybSgpICE9IG51bGwpXHJcbiAgICAgIGlzVGFibGVXaXRoQWJzb2x1dGVzU2Nyb2xsYmFyID0gKDxNZ0Zvcm0+dGhpcy5nZXRGb3JtKCkpLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKTtcclxuXHJcbiAgICByZXR1cm4gaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXI7XHJcbiAgfVxyXG5cclxuICBHZXRUYXNrRGV0YWlscygpOiBzdHJpbmcge1xyXG4gICAgbGV0IG5hbWVzID0gICh0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkpLkdldENvbXB1dGVkVmFsdWUoKTtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gdGhpcztcclxuICAgIHdoaWxlICh0YXNrLlBhcmVudFRhc2sgIT09IG51bGwgJiYgIXRhc2suUGFyZW50VGFzay5pc01haW5Qcm9nKCkpIHtcclxuICAgICAgdGFzayA9IDxUYXNrPnRhc2suUGFyZW50VGFzaztcclxuICAgICAgbmFtZXMgPSAgKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpICsgXCIuXCIgKyBuYW1lcztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmFtZXM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBwYXJzZXMgdGhlIHRhc2tVUkwgdGFnXHJcbiAgLy8vIGV2ZXJ5IHRhc2tVUkwgdGFnIGlzIHJlcGxhY2VkIGJ5IHRoZSBkYXRhIG9mIHRoZSB4bWwgaXNsYW5kIGl0IHJlZmVycyB0bzwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgUHJvY2Vzc1Rhc2tVUkwoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgeG1sRGF0YTogc3RyaW5nID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRYTUxkYXRhKCk7XHJcbiAgICBsZXQgZW5kVGFza1VybElkeDogbnVtYmVyID0geG1sRGF0YS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgRGVidWcuQXNzZXJ0KGVuZFRhc2tVcmxJZHggIT09IC0xICYmIGVuZFRhc2tVcmxJZHggPCB4bWxEYXRhLmxlbmd0aCk7XHJcblxyXG4gICAgLy8gZXh0cmFjdCB0aGUgdGFzayB1cmwgYW5kIHRoZSByZWYgbGlzdFxyXG4gICAgbGV0IHRhZzogc3RyaW5nID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kVGFza1VybElkeCk7XHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkwpICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkwubGVuZ3RoKTtcclxuXHJcbiAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZFRhc2tVcmxJZHgpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG4gICAgbGV0IHRhc2tDYWNoZVVSTDogc3RyaW5nID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKDEpO1xyXG4gICAgbGV0IHJlZkxpc3RTdHI6IHN0cmluZyA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbSgzKTtcclxuXHJcbiAgICAvLyBicmluZyB0aGUgZGF0YVxyXG4gICAgbGV0IHRhc2tDb250ZW50T3JpZ2luYWw6IHN0cmluZyA9IGF3YWl0IFRhc2suQ29tbWFuZHNQcm9jZXNzb3IuR2V0Q29udGVudCh0YXNrQ2FjaGVVUkwsIHRydWUpO1xyXG5cclxuICAgIC8vIHByZWZpeCB0aGUgb3JpZ2luYWwgZGF0YSB0aWxsIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCA8dGFza1VSTD5cclxuICAgIGxldCB0YXNrQ29udGVudEZpbmFsOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoeG1sRGF0YS5zdWJzdHIoMCwgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRDdXJySW5kZXgoKSAtIChDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTC5sZW5ndGggKyAxKSksIHRhc2tDb250ZW50T3JpZ2luYWwubGVuZ3RoKTtcclxuICAgIC8vIHRoZSBudW1iZXIgb2YgdG9rZW5zIGluIHJlZkxpc3QgYW5kIHRoZSBudW1iZXIgb2YgbG9jYXRpb24gaW4gdGhlIHhtbCB0byBiZSByZXBsYWNlZCAoaS5lLiB0aGUgcGxhY2VzIHdpdGggWzopIHNob3VsZCBiZSBlcXVhbFxyXG4gICAgbGV0IHJlZmxpc3Q6IExpc3Q8c3RyaW5nPiA9IHRoaXMuZ2V0UmVmbGlzdChyZWZMaXN0U3RyLCAnOycsIHRydWUsIC0xKTtcclxuICAgIGxldCByZWZMaXN0SWR4ID0gMDtcclxuXHJcbiAgICBsZXQgY3VycklkeDogbnVtYmVyID0gdGFza0NvbnRlbnRPcmlnaW5hbC5pbmRleE9mKFwiWzpcIik7XHJcbiAgICBsZXQgcHJldklkeDogbnVtYmVyID0gMDtcclxuICAgIHdoaWxlIChjdXJySWR4ICE9PSAtMSkge1xyXG4gICAgICB0YXNrQ29udGVudEZpbmFsLkFwcGVuZCh0YXNrQ29udGVudE9yaWdpbmFsLnN1YnN0cihwcmV2SWR4LCBjdXJySWR4IC0gcHJldklkeCkpO1xyXG4gICAgICB0YXNrQ29udGVudEZpbmFsLkFwcGVuZChyZWZsaXN0LmdldF9JdGVtKHJlZkxpc3RJZHgrKykpO1xyXG4gICAgICBjdXJySWR4ICs9IDI7XHJcbiAgICAgIHByZXZJZHggPSBjdXJySWR4O1xyXG4gICAgICBjdXJySWR4ID0gdGFza0NvbnRlbnRPcmlnaW5hbC5pbmRleE9mKFwiWzpcIiwgcHJldklkeCk7XHJcbiAgICB9XHJcbiAgICB0YXNrQ29udGVudEZpbmFsLkFwcGVuZCh0YXNrQ29udGVudE9yaWdpbmFsLnN1YnN0cihwcmV2SWR4KSk7XHJcblxyXG4gICAgLy8gc3VmZml4IHRoZSByZXN0IG9mIHRoZSBvcmlnaW5hbCB4bWwgZnJvbSB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IDwvdGFza1VSTD5cclxuICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHhtbERhdGEuc3Vic3RyKHhtbERhdGEuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBlbmRUYXNrVXJsSWR4ICsgMSkgKyAxKSk7XHJcbiAgICB4bWxEYXRhID0gdGFza0NvbnRlbnRGaW5hbC5Ub1N0cmluZygpO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiezB9IC0tLS0tLS0+IHsxfVwiLCB0YXNrQ2FjaGVVUkwsIHhtbERhdGEpKTtcclxuXHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnNldFhNTGRhdGEoeG1sRGF0YSk7XHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnNldEN1cnJJbmRleChSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldEN1cnJJbmRleCgpIC0gKENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLVVJMLmxlbmd0aCArIDEpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcGFyc2VzIHRoZSBkYXRhIGFjb3JkaW5nIHRvIHRoZSBkZWxpbWV0ZXIgYW5kIHRoZSByZWZsaXN0IGRlbGltZXRlcnMgbG9naWM8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVsaW1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRydW5jXCI+aWYgdHJ1ZSB0cnVjYXRlIGZpcnN0ICdcXFxcJyAoaW4gdXNlIGZvciBpc2xhbmQgZGF0YSBwYXJzaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtYXhUb2tlbnNcIj5pZiAtMSBhbGwgdG9rZW5zIGF2aWFsYWJsZSBlbHNlIHRoZSBudW1iZXIgb2YgdG9rZW5zIHRvIHNlYXJjaDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGF0YVwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVmbGlzdChkYXRhOiBzdHJpbmcsIGRlbGltOiBzdHJpbmcsIHRydW5jOiBib29sZWFuLCBtYXhUb2tlbnM6IG51bWJlcik6IExpc3Q8c3RyaW5nPiB7XHJcbiAgICBsZXQgY3VyclN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBsZXQgbGlzdDogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3Q8c3RyaW5nPigpO1xyXG4gICAgbGV0IHRva2Vuc0NudDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBzaW5jZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGFsd2F5cyAnOycgd2Ugc3RhcnQgZnJvbSAxXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgY3Vycjogc3RyaW5nID0gZGF0YS5jaGFyQXQoaSk7XHJcblxyXG4gICAgICBpZiAoY3VyciAhPT0gJ1xcXFwnICYmIGN1cnIgIT09IGRlbGltKVxyXG4gICAgICAgIGN1cnJTdHIuQXBwZW5kKGN1cnIpO1xyXG4gICAgICBlbHNlIGlmIChjdXJyID09PSBkZWxpbSkge1xyXG4gICAgICAgIGxpc3QucHVzaChjdXJyU3RyLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGN1cnJTdHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICAgIHRva2Vuc0NudCsrO1xyXG5cclxuICAgICAgICBpZiAodG9rZW5zQ250ID09PSBtYXhUb2tlbnMpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChjdXJyID09PSAnXFxcXCcpIHtcclxuICAgICAgICAvLyB0aGUgZm9ybWF0ICdcXFxcZGVsaW1pdGVyJyBpcyBhbHdheXMgdHJ1bmNhdGVkXHJcbiAgICAgICAgaWYgKCF0cnVuYyAmJiBkYXRhLmNoYXJBdChpICsgMSkgIT09IGRlbGltKVxyXG4gICAgICAgICAgY3VyclN0ci5BcHBlbmQoZGF0YS5jaGFyQXQoaSkpO1xyXG5cclxuICAgICAgICBpKys7XHJcbiAgICAgICAgY3VyclN0ci5BcHBlbmQoZGF0YS5jaGFyQXQoaSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYXBwZW5kIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIHJlZiBsaXN0XHJcbiAgICBsaXN0LnB1c2goY3VyclN0ci5Ub1N0cmluZygpKTtcclxuXHJcbiAgICByZXR1cm4gbGlzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc3RhcnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSBhbmQgc2V0IGZvY3VzIHRvIHRoZSBmaXJzdCBjb250cm9sLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGFzeW5jIFN0YXJ0UHJvZ3JhbShjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbiwgbW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuKTogUHJvbWlzZTxUYXNrPiB7XHJcbiAgICBsZXQgb3JnU3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCk7XHJcbiAgICBsZXQgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkOiBUYXNrID0gbnVsbDtcclxuICAgIGxldCBhbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUgPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRBbGxvd0V2ZW50cygpO1xyXG4gICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0QWxsb3dFdmVudHMoRXZlbnRzQWxsb3dlZFR5cGUuQUxMKTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIlN0YXJ0IFxcXCJzdGFydFByb2dcXFwiXCIpO1xyXG4gICAgVGFzay5TdGFydFByb2dMZXZlbCsrO1xyXG4gICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7IC8vIFFDUiAjNzY5NzM0IC0gbm90aGluZyBjYW4gc3RvcCBhIHRhc2sgZnJvbSBzdGFydGluZyB1cC5cclxuXHJcbiAgICAvLyBGaXhlZCBidWcgIzI4MzY0NyBleGVjdXRlIGNvbXBvbmVudHMgbWFpbiBwcm9ncmFtcyAtICBpbiB0aGUgc2VydmVyIHdlIGV4ZWN1dGUgdGhlIHNhbWUgc2VlIGluaS5jcHAgbWV0aG9kIGV4ZWN1dGVfbWFpbl9wcm9ncygpXHJcbiAgICBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQgPSBhd2FpdCB0aGlzLkV4ZWN1dGVDb21wb25lbnRNYWluUHJvZ3JhbXMoY2FsbEJ5RGVzdFN1YkZvcm0sIG1vdmVUb0ZpcnN0Q29udHJvbCk7XHJcblxyXG4gICAgLy8gZXhlY3V0ZSBpbnRlcm5hbCBtYWluIHByb2dyYW1zXHJcbiAgICBsZXQgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkUmVmOiBSZWZQYXJhbTxUYXNrPiA9IG5ldyBSZWZQYXJhbShub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQpO1xyXG4gICAgbGV0IGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2tSZWY6IFJlZlBhcmFtPFRhc2s+ID0gbmV3IFJlZlBhcmFtKG51bGwpO1xyXG4gICAgYXdhaXQgVGFzay5FeGVjdXRlTWFpblByb2dyYW0oMCwgY2FsbEJ5RGVzdFN1YkZvcm0sIG1vdmVUb0ZpcnN0Q29udHJvbCwgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkUmVmLCBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrUmVmLCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUpO1xyXG4gICAgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkID0gbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkUmVmLnZhbHVlO1xyXG5cclxuICAgIGlmICghVGFzay5faWRsZVRpbWVyU3RhcnRlZCkge1xyXG4gICAgICBHVUlNYW5hZ2VyLkluc3RhbmNlLnN0YXJ0VGltZXIoQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKSwgRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0SWRsZVRpbWUoMCksIHRydWUpO1xyXG4gICAgICBUYXNrLl9pZGxlVGltZXJTdGFydGVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLk9wZW5Gb3JtcyhjYWxsQnlEZXN0U3ViRm9ybSk7XHJcbiAgICBhd2FpdCB0aGlzLkRvRmlyc3RSZWNvcmRDeWNsZSgpO1xyXG4gICAgYXdhaXQgdGhpcy5Nb3ZlVG9GaXJzdENvbnRyb2xzKGNhbGxCeURlc3RTdWJGb3JtKTtcclxuXHJcblxyXG4gICAgLy8gSGFuZGxlIHRoZSBldmVudHMgb25seSB3aGVuIGFsbCB0aGUgdGFza3MgYW5kIHRoZWlyIGZvcm1zIGFyZSBvcGVuZWQuXHJcbiAgICBpZiAoVGFzay5TdGFydFByb2dMZXZlbCA9PT0gMSkge1xyXG4gICAgICBsZXQgcmVzZXRBbGxvd0V2ZW50czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICBsZXQgY2FuRXhlY3V0ZUV2ZW50czogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgICAvLyBzZXQgdGhlIHdpdGhpbiBub24gaW50ZXJhY3RpdmUgc2luY2UgdGhlIGhhbmRsZUV2ZW50cyBtaWdodCB0cnkgdG8gZXhlY3V0ZSBhbiBldmVudFxyXG4gICAgICAvLyB0aGF0IHdhcyByYWlzZWQgaW4gdGhlIDFzdCByZWMgcHJlZiAoYWRkZWQgaW4gbW92ZVRvRmlyc3Rjb250cm9scykuXHJcbiAgICAgIGlmIChub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQgIT09IG51bGwgJiYgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLmlzU3RhcnRlZCgpKSB7XHJcbiAgICAgICAgcmVzZXRBbGxvd0V2ZW50cyA9IHRydWU7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0Tm9uSW50ZXJhY3RpdmVBbGxvd0V2ZW50cyhhd2FpdCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQuaXNBbGxvd0V2ZW50cygpKTtcclxuXHJcbiAgICAgICAgLy8gbm9uIGludGVyYWN0aXZlIHRhc2sgd2l0aCBhbGxvdyBldmVudHMgPSBOTyBpcyBhYm91dCB0byBydW4uXHJcbiAgICAgICAgLy8gZG9uJ3QgdHJ5IHRvIGV4ZWN1dGUgdGhlIGV2ZW50cyBiZWZvcmUgaXQgc3RhcnRzIGJlY2F1c2UgdGhleSB3aWxsIGJlIGxvc3QuICgjMTM4NDkzKVxyXG4gICAgICAgIGNhbkV4ZWN1dGVFdmVudHMgPSBhd2FpdCAgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLmlzQWxsb3dFdmVudHMoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgdGhlIGl0IGlzIGEgc3ViZm9ybSB3aXRoIHZpc2liaWxpdHkgZXhwcmVzc2lvbiBldmFsdWF0ZWQgdG8gVFJVRSxcclxuICAgICAgLy8gc28gYWZ0ZXIgcmV0dXJuIGZyb20gdGhlIHNlcnZlciBkbyBub3QgZXhlY3V0ZSBldmVudHMgZnJvbSB0aGUgcXVldWUuXHJcbiAgICAgIC8vIFRoZXNlIGV2ZW50cyB3aWxsIGJlIGV4ZWN1dGVkIGZyb20gdGhlICdzdGFydFByb2cnIG9mIHRoZSBwYXJlbnQgdGFzay5cclxuICAgICAgaWYgKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSAhPT0gbnVsbCAmJiBjYW5FeGVjdXRlRXZlbnRzKSB7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVFdmVudHMoQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldEN1cnJNR0RhdGEoKSwgMCk7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyByZXN0b3JlLiBqdXN0IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUuIGl0IHdpbGwgYmUgc2V0IGFnYWluIG9uY2UgaW4gdGhlIGNvcnJlY3QgZXZlbnRzTG9vcC5cclxuICAgICAgaWYgKHJlc2V0QWxsb3dFdmVudHMpXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0QWxsb3dFdmVudHMoYWxsb3dFdmVudHMpO1xyXG4gICAgfVxyXG5cclxuICAgIFRhc2suU3RhcnRQcm9nTGV2ZWwtLTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIkVuZCBcXFwic3RhcnRQcm9nXFxcIlwiKTtcclxuXHJcbiAgICAvLyBJZiBvcmlnaW5hbGx5IHdlIHdlcmUgaW5zdHJ1Y3RlZCB0byBzdG9wIGV2ZW50cyBleGVjdXRpb24sIHRoZW4gcmVzdG9yZSB0aGlzXHJcbiAgICBpZiAob3JnU3RvcEV4ZWN1dGlvbiAmJiAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgaWYgKG9yZ1N0b3BFeGVjdXRpb24gJiYgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbihvcmdTdG9wRXhlY3V0aW9uKTtcclxuXHJcbiAgICByZXR1cm4gbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZXhlY3V0ZSBjb21wb25lbnQncyBtYWluIHByb2dyYW1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNhbGxCeURlc3RTdWJGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50aGUgbm9uIGludGVyYWN0aXZlIHRhc2sgaWYgYW55IHRoYXQgZXhlY3V0ZWQ8L3JldHVybnM+XHJcbiAgc3RhdGljIGFzeW5jIEV4ZWN1dGVDb21wb25lbnRNYWluUHJvZ3JhbXMoY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4sIG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbik6IFByb21pc2U8VGFzaz4geyAvLyBnbyB3aXRoIFN0YXJ0UHJvZ3JhbVxyXG4gICAgbGV0IGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2s6IFJlZlBhcmFtPFRhc2s+ID0gbmV3IFJlZlBhcmFtKG51bGwpO1xyXG4gICAgbGV0IG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZDogUmVmUGFyYW08VGFzaz4gPSBuZXcgUmVmUGFyYW0obnVsbCk7XHJcblxyXG4gICAgbGV0IG1heEN0bElkeDogbnVtYmVyID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKS5nZXRNYXhDdGxJZHgoKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDw9IG1heEN0bElkeDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBjb21wb25lbnRNYWluUHJvZ3JhbTogVGFzayA9IDxUYXNrPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCBpKTtcclxuXHJcbiAgICAgIGlmIChjb21wb25lbnRNYWluUHJvZ3JhbSAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCBUYXNrLkV4ZWN1dGVNYWluUHJvZ3JhbShpLCBjYWxsQnlEZXN0U3ViRm9ybSwgbW92ZVRvRmlyc3RDb250cm9sLCBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrLCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQsIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC52YWx1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGV4ZWN1dGUgbWFpbiBwcm9ncmFtIG9mIEN0bEluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJDdGxJbmRleFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY2FsbEJ5RGVzdFN1YkZvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vdmVUb0ZpcnN0Q29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3VycmVudE5vbkludGVyYWN0aXZlVGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBFeGVjdXRlTWFpblByb2dyYW0oQ3RsSW5kZXg6IG51bWJlciwgY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4sIG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbiwgY3VycmVudE5vbkludGVyYWN0aXZlVGFzazogUmVmUGFyYW08VGFzaz4sIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZDogUmVmUGFyYW08VGFzaz4sIG1nRGF0YVRhYmxlOiBJTUdEYXRhQ29sbGVjdGlvbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1haW5Qcm9ncmFtVGFzazogVGFzayA9IDxUYXNrPm1nRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgoLTEsIEN0bEluZGV4KTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcIiAgQ2xpZW50TWFuYWdlci5zdGFydFByb2c6IGN0bElkeD17MH0sIHRhc2s9ezF9XCIsIEN0bEluZGV4LCBtYWluUHJvZ3JhbVRhc2spKTtcclxuXHJcbiAgICBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrLnZhbHVlID0gIDxUYXNrPihhd2FpdCBtYWluUHJvZ3JhbVRhc2suU3RhcnQobW92ZVRvRmlyc3RDb250cm9sLCBjYWxsQnlEZXN0U3ViRm9ybSkpO1xyXG4gICAgaWYgKG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC52YWx1ZSA9PT0gbnVsbClcclxuICAgICAgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLnZhbHVlID0gY3VycmVudE5vbkludGVyYWN0aXZlVGFzay52YWx1ZTtcclxuICAgIGVsc2UgaWYgKGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2sudmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgRGVidWcuQXNzZXJ0KGZhbHNlLCBcIm1vcmUgdGhhbiAxIG5vbiBpbnRlcmFjdGl2ZSB0YXNrcyBpbiBzdGFydFByb2dcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IE9wZW4gYWxsIHRoZSBmb3JtIHRoYXQgYXJlIHBlbmRpbmcgaW4gQ3JlYXRlZEZvcm1zIHZlY3Rvci4gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBhc3luYyBPcGVuRm9ybXMoY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjcmVhdGVkRm9ybXM6IENyZWF0ZWRGb3JtVmVjdG9yID0gTWdGb3JtLkNyZWF0ZWRGb3JtcztcclxuICAgIGxldCBvdXRNb3N0Rm9ybTogTWdGb3JtQmFzZSA9IG51bGw7XHJcblxyXG4gICAgaWYgKGNyZWF0ZWRGb3Jtcy5Db3VudCgpID4gMCkge1xyXG4gICAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgICAgd2hpbGUgKGkgPCBjcmVhdGVkRm9ybXMuQ291bnQoKSkge1xyXG4gICAgICAgIGxldCBtZ0Zvcm06IE1nRm9ybSA9IGNyZWF0ZWRGb3Jtcy5nZXQoaSk7XHJcbiAgICAgICAgbGV0IGNhbk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLy8gT3BlbiBhIHN1YmZvcm0gb25seSBpZiBpdHMgY29udGFpbmVyIGZvcm0gaXMgT3BlbmVkLlxyXG4gICAgICAgIC8vIGlzQ3VycmVudFN0YXJ0UHJvZ0xldmVsKCkgZG9lc24ndCBnbyB3ZWxsIGZvciBzdWJmb3JtcyAoUUNSICM5MTkxMTkpLlxyXG4gICAgICAgIGlmIChtZ0Zvcm0uaXNTdWJGb3JtKCkpIHtcclxuICAgICAgICAgIGxldCBvcGVuZWQ6IGJvb2xlYW4gPSAoPE1nRm9ybUJhc2U+bWdGb3JtLmdldFN1YkZvcm1DdHJsKCkuZ2V0Rm9ybSgpKS5PcGVuZWQ7XHJcbiAgICAgICAgICBpZiAob3BlbmVkKSB7XHJcbiAgICAgICAgICAgIGNhbk9wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmICgoPFRhc2s+bWdGb3JtLmdldFRhc2soKSkuaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKSkge1xyXG4gICAgICAgICAgICBjYW5PcGVuID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYW5PcGVuKSB7XHJcbiAgICAgICAgICBNYW5hZ2VyLk9wZW5Gb3JtKG1nRm9ybSk7XHJcbiAgICAgICAgICBhd2FpdCBNYW5hZ2VyLkRvRmlyc3RSZWZyZXNoVGFibGUobWdGb3JtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtZ0Zvcm0uT3BlbmVkKSB7XHJcbiAgICAgICAgICBpZiAoY2FsbEJ5RGVzdFN1YkZvcm0gJiYgbWdGb3JtLmlzU3ViRm9ybSgpKVxyXG4gICAgICAgICAgICBvdXRNb3N0Rm9ybSA9IG1nRm9ybS5nZXRUb3BNb3N0Rm9ybSgpO1xyXG5cclxuICAgICAgICAgIGNyZWF0ZWRGb3Jtcy5yZW1vdmUobWdGb3JtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEdvZXMgb3ZlciBmb3JtcyBpcyBjcmVhdGVkRm9ybVZlYyBhbmQgcGVyZm9ybXMgbW92ZSB0byBmaXJzdCByZWNvcmQgY3ljbGUgY29udHJvbDwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgRG9GaXJzdFJlY29yZEN5Y2xlKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YShpKTtcclxuICAgICAgaWYgKG1nZCA9PT0gbnVsbCB8fCBtZ2QuSXNBYm9ydGluZylcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBtZ2QuZ2V0VGFza3NDb3VudCgpOyBqKyspIHtcclxuICAgICAgICBsZXQgdGFzazogVGFzayA9IG1nZC5nZXRUYXNrKGopO1xyXG5cclxuICAgICAgICBpZiAodGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IG1nRm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuXHJcbiAgICAgICAgICBpZiAobWdGb3JtICE9PSBudWxsICYmIHRhc2suaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKSAmJiAhbWdGb3JtLklnbm9yZUZpcnN0UmVjb3JkQ3ljbGUpIHtcclxuICAgICAgICAgICAgbWdGb3JtLklnbm9yZUZpcnN0UmVjb3JkQ3ljbGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmRvRmlyc3RSZWNvcmRDeWNsZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBGb3IgZXZlcnkgbWdkYXRhIHBlcmZvcm0gbW92ZSB0byBmaXJzdCBjb250cm9sIHRvIHRoZSBmb3JtXHJcbiAgLy8vIHRoYXQgd2UgbWFya2VkIGJlZm9yZSB3aXRoIE1vdmVUb0ZpcnN0Q29udHJvbCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBNb3ZlVG9GaXJzdENvbnRyb2xzKGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICBsZXQgbWdkOiBNR0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKGkpO1xyXG5cclxuICAgICAgaWYgKG1nZCA9PT0gbnVsbCB8fCBtZ2QuSXNBYm9ydGluZylcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGxldCB0YXNrc0NvdW50OiBudW1iZXIgPSBtZ2QuZ2V0VGFza3NDb3VudCgpO1xyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdGFza3NDb3VudDsgaisrKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSBtZ2QuZ2V0VGFzayhqKTtcclxuICAgICAgICBsZXQgbWdGb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG5cclxuICAgICAgICBpZiAodGFzay5pc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpICYmIG1nRm9ybSAhPT0gbnVsbCAmJiBtZ0Zvcm0uTW92ZWRUb0ZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgbWdGb3JtLk1vdmVkVG9GaXJzdENvbnRyb2wgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICghY2FsbEJ5RGVzdFN1YkZvcm0pXHJcbiAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyh0YXNrKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcblxyXG5cclxuIl19
2601
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvdGFza3MvVGFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNqSSxPQUFPLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixPQUFPLEVBRVAsVUFBVSxFQUNWLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsUUFBUSxFQUNSLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsTUFBTSxFQUVOLGlCQUFpQixFQUNqQixLQUFLLEVBRUwsT0FBTyxFQUdQLFFBQVEsRUFDUixHQUFHLEVBRUgsYUFBYSxFQUNiLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsTUFBTSxFQUNOLGdCQUFnQixFQUNqQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFeEMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFDL0UsT0FBTyxFQUF3Qix3Q0FBd0MsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3pHLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVsRCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXJELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFckMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFDekUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDN0MsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFMUQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUlqRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRXJFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDdEMsT0FBTyxFQUFDLGtCQUFrQixFQUFFLHdCQUF3QixFQUFFLFFBQVEsRUFBWSxNQUFNLFlBQVksQ0FBQztBQUM3RixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRTFELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUU3QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUVuRSxNQUFNLENBQU4sSUFBWSxTQUlYO0FBSkQsV0FBWSxTQUFTO0lBQ25CLHlDQUFJLENBQUE7SUFDSix5Q0FBSSxDQUFBO0lBQ0oseUNBQUksQ0FBQTtBQUNOLENBQUMsRUFKVyxTQUFTLEtBQVQsU0FBUyxRQUlwQjtBQUVELE1BQU0sQ0FBTixJQUFZLGNBSVg7QUFKRCxXQUFZLGNBQWM7SUFDeEIsb0RBQVMsQ0FBQTtJQUNULG1EQUFJLENBQUE7SUFDSixtREFBSSxDQUFBO0FBQ04sQ0FBQyxFQUpXLGNBQWMsS0FBZCxjQUFjLFFBSXpCO0FBRUQsSUFBSyxXQU1KO0FBTkQsV0FBSyxXQUFXO0lBQ2QseUJBQVUsQ0FBQTtJQUNWLGtDQUFtQixDQUFBO0lBQ25CLGlDQUFrQixDQUFBO0lBQ2xCLGtDQUFtQixDQUFBO0lBQ25CLGlDQUFrQixDQUFBO0FBQ3BCLENBQUMsRUFOSSxXQUFXLEtBQVgsV0FBVyxRQU1mO0FBR0QsTUFBTSxPQUFPLElBQUssU0FBUSxRQUFRO0lBK0xoQyxZQUFZLE1BQWE7UUFDdkIsS0FBSyxFQUFFLENBQUM7UUEvTEYsYUFBUSxHQUFZLElBQUksQ0FBQztRQUN6QixZQUFPLEdBQVcsSUFBSSxDQUFDO1FBQ3ZCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0Isa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQyxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsYUFBUSxHQUFXLENBQUMsQ0FBQztRQUNyQix3QkFBbUIsR0FBVyxDQUFDLENBQUM7UUFDaEMsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQ3JDLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUNwQyxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsc0JBQWlCLEdBQVcsR0FBRyxDQUFDO1FBQ2hDLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQ2hDLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDL0IsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3BDLG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBQy9CLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBRWxDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQU10QyxnQkFBVyxHQUFTLElBQUksQ0FBQztRQU0xQixnQkFBVyxHQUFTLElBQUksQ0FBQztRQUt4QixvQkFBZSxHQUFTLElBQUksQ0FBQztRQUs5QixtQkFBYyxHQUFTLElBQUksQ0FBQztRQUUzQiwwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFDdkMseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBQ3RDLGNBQVMsR0FBZSxJQUFJLENBQUM7UUFHN0Isb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFVakMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IscUNBQWdDLEdBQVksS0FBSyxDQUFDO1FBRW5ELHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNuQyxpQkFBWSxHQUFtQixJQUFJLENBQUM7UUFDcEMsYUFBUSxHQUFXLENBQUMsQ0FBQztRQUNyQixvQkFBZSxHQUFXLElBQUksQ0FBQztRQUMvQiw4QkFBeUIsR0FBWSxLQUFLLENBQUM7UUFZM0MsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsMkJBQXNCLEdBQTJCLElBQUksQ0FBQztRQU90RCxnQ0FBMkIsR0FBWSxLQUFLLENBQUM7UUFPN0MsNEJBQXVCLEdBQVksS0FBSyxDQUFDO1FBS3hDLGlCQUFZLEdBQW9CLElBQUksQ0FBQztRQWdCckMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixxQkFBZ0IsR0FBcUIsSUFBSSxDQUFDO1FBQzNDLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQWlCcEMsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixlQUFVLEdBQWtCLElBQUksQ0FBQztRQWNqQyxrQkFBYSxHQUFhLElBQUksQ0FBQztRQUMvQixvQkFBZSxHQUFtQixJQUFJLENBQUM7UUFDdkMsYUFBUSxHQUFlLElBQUksQ0FBQztRQUM1QixXQUFNLEdBQWEsSUFBSSxDQUFDO1FBQ3hCLGVBQVUsR0FBb0IsSUFBSSxDQUFDO1FBQ25DLHlCQUFvQixHQUFvQixJQUFJLENBQUM7UUFDN0MsZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO1FBQ2xDLFdBQU0sR0FBZSxJQUFJLENBQUM7UUFDMUIsU0FBSSxHQUFXLElBQUksQ0FBQztRQUNwQixlQUFVLEdBQVcsSUFBSSxDQUFDO1FBSzFCLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQVNwQyxtQkFBYyxHQUFXLENBQUMsQ0FBQztRQUMzQixtQkFBYyxHQUFjLElBQUksQ0FBQztRQW1CdEMsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM3QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBektELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQXFCRCxJQUFJLGNBQWMsQ0FBQyxLQUFjO1FBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUEyQ0QsSUFBSSxXQUFXO1FBQ2IsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUk7WUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFFOUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFLRCxNQUFNLEtBQUssaUJBQWlCO1FBQzFCLE9BQU8sd0JBQXdCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBU0QsSUFBSSx1QkFBdUI7UUFDekIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ3pELE9BQWEsaUJBQWlCLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlGO1FBRUQsT0FBYSxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBVUQsSUFBSSxXQUFXLENBQUMsS0FBa0I7UUFDaEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDO0lBQ2pFLENBQUM7SUFrQkQsSUFBSSxnQkFBZ0I7UUFDbEIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4RztRQUNELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFTRCxNQUFNLEtBQUssZUFBZTtRQUN4QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFrQk8sYUFBYTtRQUNuQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7UUFDOUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQztRQUNwQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU0sSUFBSTtRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVPLGFBQWEsQ0FBQyxNQUFZO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUMxQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVO1FBQ2YsSUFBSSxJQUFJLEdBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFNRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQVEsQ0FBQztRQUNsQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLElBQUk7WUFDckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBT0ssUUFBUSxDQUFDLEdBQVcsRUFBRSxrQkFBc0M7Ozs7O1lBRWhFLElBQUksQ0FBQyxPQUFNLFVBQVUsV0FBRSxFQUFFO2dCQUN2QixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxJQUFJLGtCQUFrQixDQUFDLFdBQVcsS0FBSyxJQUFJLEVBQUU7b0JBQ3hFLElBQUksQ0FBQyxXQUFXLEdBQVMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO29CQUN4RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ2Qsa0JBQWtCLENBQUMsV0FBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDekQ7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksSUFBSSxrQkFBa0IsQ0FBQyxjQUFjLEtBQUssSUFBSSxFQUFFO29CQUM5RSxJQUFJLENBQUMsY0FBYyxHQUFTLGtCQUFrQixDQUFDLGNBQWMsQ0FBQztpQkFDL0Q7YUFDRjtZQUVELElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO2dCQUN4RSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzthQUM3QjtZQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1lBQ25CLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUV0QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUUzQixJQUFJLFVBQVUsR0FBZSxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUU3RixPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUU7YUFDaEc7WUFFRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFeEgsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7WUFHcEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFFMUIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUVsQixJQUFJLFdBQVcsR0FBdUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkcsSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFO29CQUN4QixXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUM3QztnQkFHRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO29CQUNiLElBQUksQ0FBQyxJQUFLLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUNqRDthQUNGO1FBQ0gsQ0FBQztLQUFBO0lBSUQsNEJBQTRCO1FBQzFCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRTtZQUMxSCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDNUUsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUk7WUFDaEMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDaEUsQ0FBQztJQUtELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQyxDQUFDO0lBSUQsY0FBYyxDQUFDLGNBQXVCO1FBQ3BDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLGdCQUFnQjtJQUN4QixDQUFDO0lBS0QsY0FBYztRQUNaLElBQUksTUFBTSxHQUFjLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDM0QsSUFBSSxVQUFVLEdBQVcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFO1lBQ2hFLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7WUFJN0IsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO2dCQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3hEO2FBQ0k7WUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLCtDQUErQyxDQUFDLENBQUM7U0FDN0Y7SUFDSCxDQUFDO0lBS00sWUFBWSxDQUFDLFNBQWlCLEVBQUUsUUFBZ0I7UUFDckQsSUFBSSxjQUF1QixDQUFDO1FBQzVCLGNBQWMsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ25CLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDdEIsUUFBUSxTQUFTLEVBQUU7Z0JBQ2pCLEtBQUssY0FBYyxDQUFDLGlCQUFpQjtvQkFDbkMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNsQyxNQUFNO2dCQUNSLEtBQUssWUFBWSxDQUFDLFlBQVk7b0JBQzVCLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO29CQUNyQixNQUFNO2dCQUNSLEtBQUssY0FBYyxDQUFDLGlCQUFpQjtvQkFDbkMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDL0IsTUFBTTtnQkFDUixLQUFLLGNBQWMsQ0FBQyxrQkFBa0I7b0JBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO29CQUN0QixNQUFNO2dCQUNSLEtBQUssY0FBYyxDQUFDLGlCQUFpQjtvQkFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7b0JBQ3pCLE1BQU07Z0JBQ1IsS0FBSyxjQUFjLENBQUMsd0JBQXdCO29CQUMxQyxJQUFJLENBQUMsVUFBVSxHQUFrQixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzdDLE1BQU07Z0JBQ1IsS0FBSyxjQUFjLENBQUMsZ0JBQWdCO29CQUNsQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3BDLE1BQU07Z0JBQ1IsS0FBSyxjQUFjLENBQUMsY0FBYztvQkFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUMvQyxNQUFNO2dCQUNSLEtBQUssWUFBWSxDQUFDLGtCQUFrQjtvQkFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNoRCxNQUFNO2dCQUNSLEtBQUssWUFBWSxDQUFDLHdCQUF3QjtvQkFDeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNqRCxNQUFNO2dCQUNSLEtBQUssWUFBWSxDQUFDLHVCQUF1QjtvQkFFdkMsTUFBTTtnQkFDUjtvQkFDRSxjQUFjLEdBQUcsS0FBSyxDQUFDO29CQUN2QixNQUFNO2FBQ1Q7U0FDRjtRQUNELElBQUksQ0FBQyxjQUFjO1lBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQU1LLGdCQUFnQixDQUFDLFlBQW9CLEVBQUUsVUFBc0I7O1lBQ2pFLElBQUksWUFBWSxJQUFJLElBQUk7Z0JBQ3RCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsSUFBSSxNQUFNLEdBQWMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUMzRCxRQUFRLFlBQVksRUFBRTtnQkFDcEIsS0FBSyxZQUFZLENBQUMsZ0JBQWdCO29CQUNoQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSTt3QkFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUU5QixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDO3dCQUNoRCxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7b0JBRWhFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMvQixNQUFNO2dCQUVSLEtBQUssWUFBWSxDQUFDLGVBQWU7b0JBQy9CLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7d0JBQ2hELE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztvQkFFaEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3JDLE1BQU07Z0JBRVIsS0FBSyxZQUFZLENBQUMsV0FBVztvQkFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDMUMsTUFBTTtnQkFFUixLQUFLLFlBQVksQ0FBQyxXQUFXO29CQUMzQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQzFDLE1BQU07Z0JBRVIsS0FBSyxZQUFZLENBQUMsb0JBQW9CO29CQUVwQyxNQUFNO2dCQUVSLEtBQUssWUFBWTtvQkFDZixJQUFJLEtBQUssR0FBVyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQzFDLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO29CQUNuRixNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUNoQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQztvQkFDL0IsTUFBTTtnQkFFUixLQUFLLFlBQVksQ0FBQyxZQUFZO29CQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDL0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztvQkFDdkUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUM3QixNQUFNO2dCQUNSLEtBQUssWUFBWSxDQUFDLFdBQVc7b0JBQzNCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJO3dCQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7b0JBQ25DLElBQUksT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM3QixPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQy9CLElBQUksR0FBRyxHQUFXLElBQUksQ0FBQyxPQUFPLENBQUM7b0JBQy9CLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTt3QkFDbkIsR0FBRyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztvQkFDOUQsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLGtCQUFrQixFQUFFLENBQUMsQ0FBQztvQkFDdEQsTUFBTTtnQkFDUixLQUFLLGNBQWMsQ0FBQyxjQUFjO29CQUNoQyxNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDNUIsTUFBTTtnQkFDUixLQUFLLGNBQWMsQ0FBQyxlQUFlO29CQUNqQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSTt3QkFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUMvQixNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssY0FBYyxDQUFDLGtCQUFrQjtvQkFDcEMsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUk7d0JBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDMUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsQ0FBQztvQkFDeEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUN2QyxNQUFNO2dCQUNSLEtBQUssY0FBYyxDQUFDLFlBQVk7b0JBQzlCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdEQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDM0MsTUFBTTtnQkFDUixLQUFLLGNBQWMsQ0FBQyxZQUFZO29CQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUNwQyxNQUFNO2dCQUNSLEtBQUssY0FBYyxDQUFDLGtCQUFrQjtvQkFDcEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN0QixNQUFNO2dCQUNSLEtBQUssWUFBWSxDQUFDLGdCQUFnQjtvQkFDaEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQztvQkFDbkQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMvQixNQUFNO2dCQUNSLEtBQUssY0FBYyxDQUFDLG9CQUFvQjtvQkFDdEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsQ0FBQztvQkFDdkQsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUk7d0JBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztvQkFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUN4QyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztvQkFDOUIsTUFBTTtnQkFDUjtvQkFDRSxJQUFJLFlBQVksS0FBSyxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUU7d0JBQ3JELGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQzt3QkFDM0QsT0FBTyxLQUFLLENBQUM7cUJBQ2Q7eUJBQ0k7d0JBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsaUVBQWlFLEdBQUcsWUFBWSxDQUFDLENBQUM7d0JBQ2hILE9BQU8sS0FBSyxDQUFDO3FCQUNkO2FBQ0o7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FBQTtJQUVELGlCQUFpQixDQUFDLE1BQWlCO1FBQ2pDLElBQUksY0FBYyxHQUFtQixJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQzFELGNBQWMsQ0FBQyxVQUFVLENBQVcsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixJQUFJLE1BQU0sR0FBYyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBRTNELElBQUksVUFBVSxHQUFXLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLHNCQUFzQixFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ25ILFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFFN0csSUFBSSxjQUFjLEdBQVcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQU1PLHNCQUFzQjtRQUM1QixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUM7UUFDcEIsS0FBSyxJQUFJLENBQUMsR0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2hFLElBQUksT0FBTyxHQUFpQixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxJQUFJLEdBQUcsR0FBVSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEMsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLHFCQUFxQjtnQkFDeEQsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLGVBQWUsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxjQUFjLENBQUMscUJBQXFCLENBQUMsRUFBRTtnQkFDdkgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QyxHQUFHLEVBQUUsQ0FBQzthQUNQO1NBQ0Y7SUFDSCxDQUFDO0lBS00sZ0JBQWdCLENBQUMsU0FBaUI7UUFDdkMsSUFBSSxNQUFNLEdBQWEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEQsSUFBSSxNQUFjLENBQUM7UUFDbkIsSUFBSSxPQUFPLEdBQUcsSUFBSSxJQUFJLEVBQVUsQ0FBQztRQUNqQyxJQUFJLENBQVMsQ0FBQztRQUNkLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25DLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQztJQUtELGFBQWEsQ0FBQyxNQUFlO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO0lBQzNCLENBQUM7SUFPRCxRQUFRLENBQUMsT0FBZTtRQUN0QixPQUFrQixJQUFJLENBQUMsUUFBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBTUQsVUFBVSxDQUFDLEVBQVU7UUFDbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUk7WUFDdEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7WUFFbEMsTUFBTSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQzFGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQVU7UUFDekIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFhO1FBQ2hDLElBQUksTUFBTSxHQUFXLElBQUksQ0FBQztRQUMxQixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDYixJQUFJLE9BQU8sR0FBZSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pELEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQy9CLE1BQU0sR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUN4QztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFXSyxtQkFBbUIsQ0FBQyxLQUFhLEVBQUUsT0FBeUIsRUFBRSxNQUFjOztZQUNoRixJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUM7WUFDMUIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dCQUNiLElBQUksT0FBTyxHQUFlLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pELEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDO2dCQUMvQixNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsK0JBQStCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ3pFO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUFBO0lBS0ssaUJBQWlCLENBQUMsVUFBbUIsRUFBRSxNQUFpQjs7WUFFNUQsSUFBSSxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDekIsSUFBSSxTQUFTLEdBQXVCLElBQUksQ0FBQyxRQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBR2hFLElBQUksQ0FBQyxTQUFTLElBQUksVUFBVSxFQUFFO29CQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTt3QkFFbkIsSUFBZSxJQUFJLENBQUMsUUFBUyxDQUFDLGFBQWEsRUFBRSxFQUFFOzRCQUM3QyxJQUFJLENBQVksSUFBSSxDQUFDLFFBQVMsQ0FBQyxVQUFVLEVBQUU7Z0NBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFZLElBQUksQ0FBQyxRQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQzs7Z0NBRWhFLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQVksSUFBSSxDQUFDLFFBQVMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzt5QkFDcEY7cUJBQ0Y7O3dCQUNJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2lCQUM5QjthQUNGO1lBRUQsTUFBaUIsSUFBSSxDQUFDLFFBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFakQsSUFBSSxVQUFVO2dCQUNELElBQUksQ0FBQyxRQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELENBQUM7S0FBQTtJQUtELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUtLLFFBQVEsQ0FBQyxPQUFzQjs7WUFDbkMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2RCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUN6QyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNsRSxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsY0FBYyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ3JGLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUNqRyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdkMsTUFBaUIsSUFBSSxDQUFDLFFBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2xELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO29CQUN2QyxPQUFPLENBQUMsTUFBTSxDQUFVLElBQUksQ0FBQyxJQUFLLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUMvRTtRQUNILENBQUM7S0FBQTtJQUtELGVBQWUsQ0FBQyxPQUFzQixFQUFFLFVBQTJCLEVBQUUsTUFBZTtRQUNsRixJQUFJLENBQVMsQ0FBQztRQUNkLElBQUksR0FBVSxDQUFDO1FBQ2YsSUFBSSxRQUFRLEdBQXFCLGdCQUFnQixDQUFDLElBQUksQ0FBQztRQUN2RCxJQUFJLFFBQVEsR0FBWSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFcEUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RDLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFakUsSUFBSSxHQUFHLEdBQWMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU1QyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsVUFBVSxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBRTFFLEdBQUcsR0FBVSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBUyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVELElBQUksT0FBTyxHQUFxQixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFOUMsSUFBSSxHQUFHLENBQUMsT0FBTztnQkFDYixPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxDQUFDO1lBRS9ELElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUN0QyxJQUFJLEdBQUcsR0FBVyxXQUFXLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDakYsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLE9BQU8sR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO2FBQ25FO1lBRUQsSUFBSSxHQUFHLENBQUMsT0FBTztnQkFDYixPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxDQUFDO1lBRS9ELElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUN0QyxJQUFJLEdBQUcsR0FBVyxXQUFXLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDakYsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLE9BQU8sR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO2FBQ25FO1lBRUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdkM7UUFDRCxJQUFJLE1BQU07WUFDUixPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7O1lBRTVGLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBS0QsZ0JBQWdCLENBQUMsT0FBc0I7UUFDckMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkQsSUFBSSxDQUFTLENBQUM7WUFDZCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxHQUFHLEdBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTNDLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdELE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxVQUFVLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQzFFLElBQUksR0FBRyxDQUFDLEdBQUc7b0JBQ1QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsQ0FBQztnQkFFOUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDdkM7WUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM3RjtJQUNILENBQUM7SUFNRCxZQUFZLENBQUMsR0FBVztRQUN0QixLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxRQUFRLEdBQVUsSUFBSSxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJO1lBQzFCLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBSU8scUJBQXFCLENBQUMsa0JBQTJCO1FBQ3ZELElBQUksa0JBQWtCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3pDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBR3RCLElBQUksWUFBWSxHQUFxQixJQUFJLENBQUMsSUFBSyxDQUFDLDBCQUEwQixFQUFFLENBQUM7Z0JBQzdFLElBQUksQ0FBQyxZQUFZO29CQUNOLElBQUksQ0FBQyxJQUFLLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO2FBQ2xEO1NBQ0Y7SUFDSCxDQUFDO0lBS0ssS0FBSyxDQUFDLGtCQUEyQixFQUFFLGlCQUEwQjs7WUFDakUsSUFBSSxrQkFBa0IsR0FBUyxJQUFJLENBQUM7WUFFcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUV2QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFFM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQzNCLElBQUksTUFBTSxHQUFpQixNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFHOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPO29CQUNqQixPQUFPLElBQUksQ0FBQztnQkFFZCxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2dCQUNqRyxZQUFZLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUU5RCxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFFM0IsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUV2RCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87b0JBQ2pCLE9BQU8sSUFBSSxDQUFDO2dCQUVkLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7b0JBQ3pDLGtCQUFrQixHQUFHLElBQUksQ0FBQztnQkFFNUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztnQkFRakMsSUFBSSxRQUFRLEdBQWUsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDekMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDdkIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztnQkFFM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPO29CQUNqQixPQUFPLElBQUksQ0FBQztnQkFDZCxJQUFJLElBQUksQ0FBQyxTQUFTO29CQUNoQixPQUFPLElBQUksQ0FBQztnQkFFZCxJQUFJLGVBQWUsR0FBbUIsY0FBYyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDOUgsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBRTdELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztvQkFDakIsT0FBTyxJQUFJLENBQUM7YUFFZjtZQUVELGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3pHLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQzVCLE9BQU8sa0JBQWtCLENBQUM7UUFDNUIsQ0FBQztLQUFBO0lBTU8sbUJBQW1CO1FBR3pCLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUU5QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQWEsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRyxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDL0csQ0FBQyxDQUFRLElBQUksQ0FBQyxTQUFTLEVBQUcsQ0FBQyxtQkFBbUI7WUFDOUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBT2EsY0FBYyxDQUFDLGtCQUEyQjs7WUFDdEQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtnQkFFdEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBRy9DLFlBQVksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFFL0MsSUFBSSxDQUFDLFdBQVcsR0FBYyxJQUFJLENBQUMsUUFBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUc5RCxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFFdEIsWUFBWSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUU5QyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQy9CLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUN4QjtZQUVELE9BQU8sSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM1QixDQUFDO0tBQUE7SUFRYSxhQUFhLENBQUMsa0JBQTJCLEVBQUUsa0JBQXdCLEVBQUUsaUJBQTBCOztZQUMzRyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDdEIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzlELElBQUksSUFBSSxHQUFlLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoRCxJQUFJLHFCQUFxQixHQUFpQixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztvQkFDbEcsSUFBSSxrQkFBa0IsS0FBSyxJQUFJO3dCQUM3QixrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQzt5QkFDeEMsSUFBSSxxQkFBcUIsS0FBSyxJQUFJO3dCQUNyQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSwyQ0FBMkMsQ0FBQyxDQUFDO2lCQUNwRTthQUNGO1lBRUQsT0FBTyxrQkFBa0IsQ0FBQztRQUM1QixDQUFDO0tBQUE7SUFFYSxhQUFhOztZQUN6QixJQUFJLE9BQU8sR0FBYSxhQUFhLENBQUMsVUFBVSxDQUFDO1lBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFcEQsSUFBSSxJQUFJLENBQUMsU0FBUztnQkFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsNkJBQTZCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFJbkYsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekIsSUFBSSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUNsRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDbEU7WUFFRCxJQUFJLGVBQWUsR0FBWSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9GLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBR2hGLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO2dCQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkUsQ0FBQztLQUFBO0lBTUssU0FBUyxDQUFDLElBQVk7O1lBQzFCLElBQUksWUFBWSxHQUFXLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pFLElBQUksYUFBYSxHQUFXLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUV6RixNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hILENBQUM7S0FBQTtJQU9LLGNBQWMsQ0FBQyxNQUFvQixFQUFFLFlBQXFCOztZQUM5RCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDekMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUN2QixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDeEMsSUFBSSxZQUFZO3dCQUNkLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDaEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7b0JBQzVCLE9BQU8sSUFBSSxDQUFDO2lCQUNiO3FCQUNJO29CQUNILElBQUksWUFBWTt3QkFDZCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7b0JBQ2hELE1BQU0sWUFBWSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ25HO2FBQ0Y7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7S0FBQTtJQU1hLEtBQUs7O1lBQ2pCLElBQUksTUFBb0IsQ0FBQztZQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFFaEMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBSXhDLElBQUksZUFBZSxHQUFtQixjQUFjLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hILE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRzdELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztnQkFDakIsT0FBTyxNQUFNLENBQUM7WUFFaEIsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO2dCQUVsQixJQUFJLFFBQVEsR0FBaUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLG1DQUFtQyxFQUFFLENBQUM7Z0JBRWxILEtBQUssSUFBSSxNQUFNLEdBQVcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFO29CQUMvRCxJQUFJLE9BQU8sR0FBMkIsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQ2xFLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUU7d0JBQ3pDLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDNUIscUJBQXFCLENBQUMsUUFBUSxDQUFDLHNDQUFzQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUNoRjtpQkFDRjtnQkFFRCxlQUFlLEdBQUcsY0FBYyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkcsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDOUQ7WUFFRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7Z0JBQ2xCLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPO29CQUNqQixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzNDO1lBRUQsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO2dCQUNsQixlQUFlLEdBQUcsY0FBYyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUNwSCxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUM5RDtZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7S0FBQTtJQVNLLGtCQUFrQjs7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLFlBQVksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLGVBQWUsR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUM7Z0JBQzNELE1BQU0sWUFBWSxDQUFDLGFBQWEsQ0FBQyw0Q0FBNEMsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUV6SSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO29CQUN0RCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7d0JBQ2xCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTs0QkFDcEIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0NBQ3hELElBQUksT0FBTyxHQUFlLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUNuRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7b0NBQ1osT0FBTyxDQUFDLE9BQU8sRUFBRyxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztvQ0FDMUQsTUFBTSxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztpQ0FDcEM7NkJBQ0Y7d0JBQ0gsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3FCQUN6RztpQkFDRjtnQkFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLHdCQUF3QixDQUFDLFNBQVMsQ0FBQztnQkFDMUQsWUFBWSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2FBQy9DO1FBQ0gsQ0FBQztLQUFBO0lBS08sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFHRCxPQUFPO1FBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUtLLElBQUk7O1lBQ1IsSUFBSSxJQUFVLENBQUM7WUFDZixJQUFJLElBQUksR0FBZSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFdEMsSUFBSSxJQUFJLENBQUMsU0FBUztnQkFDaEIsT0FBTztZQUVULElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUN0QixPQUFPLENBQUMsSUFBSSxHQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO29CQUN0RCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7b0JBQ3JELE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUNuQjthQUNGO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO2dCQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUl4QixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxFQUFFO2dCQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUNsQixJQUFJLFNBQVMsR0FBaUIsSUFBSSxJQUFJLEVBQVUsRUFBRSxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQVUsQ0FBQztvQkFDakYsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUUzQixJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLElBQUk7d0JBQ2hDLFNBQVMsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDdkQsR0FBRyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM3QixHQUFHLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2xDLElBQUksR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksSUFBSTt3QkFDaEMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN2RCxHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFFdkMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDckIsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQVMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7aUJBQ25EO2FBQ0Y7WUFFRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUd4QixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLElBQUk7Z0JBQ2xDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7WUFDeEQsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUk7Z0JBQ1YsSUFBSSxDQUFDLElBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRTFDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsSUFBSSxPQUFPLEdBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFFcEQsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMvQixPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBRTFCLElBQUksa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEtBQUssSUFBSTtvQkFDM0Qsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFHbkUsSUFBSSxPQUFPLENBQUMsYUFBYTtvQkFDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDakY7WUFFRCxJQUFJLG9CQUFvQixHQUFtQixjQUFjLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlILE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUMzRCxDQUFDO0tBQUE7SUFLRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFLRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBT0QsWUFBWSxDQUFDLGFBQXNCO1FBQ2pDLElBQUksYUFBYTtZQUNmLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUczQyxJQUFJLEtBQUssR0FBbUIsSUFBSSxDQUFDLGNBQWMsRUFBRyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUdoRixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssY0FBYyxDQUFDLG1CQUFtQjtZQUM5RSxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUVwQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFNTyxhQUFhLENBQUMsYUFBc0I7UUFDMUMsSUFBSSxPQUFPLEdBQVMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0MsSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLGFBQWE7WUFDbEMsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUk7Z0JBQzFCLE9BQU8sQ0FBQyxDQUFDO2lCQUNOO2dCQUlILElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRTtvQkFDcEUsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzNELE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQzFEO1FBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQU1ELGVBQWUsQ0FBQyxVQUFrQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBS08sZ0JBQWdCLENBQUMsVUFBa0I7UUFDekMsSUFBSSxPQUFPLEdBQVUsSUFBSSxDQUFDO1FBRTFCLElBQUksVUFBVSxLQUFLLENBQUM7WUFDbEIsT0FBTyxHQUFHLElBQUksQ0FBQzthQUNaO1lBQ0gsSUFBSSxPQUFPLEdBQVMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDN0MsSUFBSSxPQUFPLEtBQUssSUFBSTtnQkFDbEIsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDN0IsSUFBSSxPQUFPLEtBQUssSUFBSTtnQkFDbEIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3BEO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQU1ELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUlELFlBQVksQ0FBQyxJQUFjO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQU8sSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQU1ELGNBQWMsQ0FBQyxPQUFpQjtRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFTLE9BQU8sQ0FBQztJQUNuQyxDQUFDO0lBS0QsY0FBYztRQUNaLElBQUksT0FBTyxHQUFXLENBQVksSUFBSSxDQUFDLFFBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRS9ELElBQUksSUFBSSxDQUFDLGNBQWM7ZUFDbEIsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQztlQUM5RCxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3JELE9BQU8sSUFBSSxDQUFDO1FBRWQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFLRCxpQkFBaUI7UUFNZixJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVTtZQUM5RSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFFMUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFNRCxpQkFBaUIsQ0FBQyxJQUFtQjtRQUNuQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsa0JBQWtCLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFPRCxhQUFhO1FBQ1gsSUFBSSxhQUFhLEdBQVcsQ0FBQyxDQUFDO1FBQzlCLElBQUksTUFBTSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsQyxLQUFLLElBQUksR0FBRyxHQUFXLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDNUQsSUFBSSxPQUFPLEdBQVMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRTtnQkFDdEIsU0FBUztZQUNYLElBQUksUUFBUSxHQUFhLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksUUFBUSxJQUFJLElBQUk7Z0JBQ2xCLFNBQVM7WUFDWCxJQUFJLElBQUksR0FBVyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFHaEMsSUFBSSxhQUFhLEVBQUUsS0FBSyxDQUFDO29CQUN2QixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3JCO1NBQ0Y7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBS0Qsb0JBQW9CLENBQUMsR0FBVztRQUM5QixJQUFJLE9BQWEsQ0FBQztRQUNsQixJQUFJLE9BQU8sR0FBVyxDQUFDLENBQUM7UUFDeEIsSUFBSSxPQUFPLEdBQVcsQ0FBQyxDQUFDO1FBRXhCLElBQUksU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVqQyxLQUFLLElBQUksR0FBRyxHQUFXLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDNUQsT0FBTyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV6QixPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUdyRCxJQUFJLEdBQUcsR0FBRyxPQUFPLEVBQUU7Z0JBRWpCLEdBQUcsSUFBSSxPQUFPLENBQUM7Z0JBQ2YsT0FBYyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUM5QztZQUNELE9BQU8sR0FBRyxPQUFPLENBQUM7U0FDbkI7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFPRCx1QkFBdUIsQ0FBQyxJQUFZO1FBQ2xDLElBQUksUUFBYyxDQUFDO1FBQ25CLElBQUksUUFBUSxHQUFXLENBQUMsQ0FBQztRQUN6QixJQUFJLFFBQVEsR0FBVyxDQUFDLENBQUM7UUFDekIsSUFBSSwwQkFBMEIsR0FBVyxDQUFDLENBQUM7UUFHM0MsSUFBSSxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWpDLEtBQUssSUFBSSxJQUFJLEdBQVcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUMvRCxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBR3ZELElBQUksSUFBSSxHQUFHLFFBQVEsRUFBRTtnQkFFbkIsSUFBSSxJQUFJLFFBQVEsQ0FBQztnQkFFakIsSUFBSSxLQUFLLEdBQWlCLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJO29CQUN6QixPQUFPLDBCQUEwQixHQUFHLDBCQUEwQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFcEgsT0FBTyxDQUFDLENBQUM7YUFDVjtZQUVELElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxJQUFJO2dCQUN2QiwwQkFBMEIsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRTdELFFBQVEsR0FBRyxRQUFRLENBQUM7U0FDckI7UUFHRCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFPRCx1QkFBdUIsQ0FBQyxTQUFpQixFQUFFLE1BQXdCO1FBQ2pFLElBQUksT0FBTyxHQUFjLElBQUksQ0FBQztRQUM5QixNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWxCLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRTtZQUNsQixJQUFJLFFBQVEsR0FBUyxJQUFJLENBQUM7WUFDMUIsSUFBSSxVQUFVLEdBQVMsSUFBSSxDQUFDO1lBQzVCLElBQUksc0JBQXNCLEdBQVcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksMEJBQTBCLEdBQVcsQ0FBQyxDQUFDO1lBQzNDLElBQUksVUFBVSxHQUFXLENBQUMsQ0FBQztZQUczQixJQUFJLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFHbkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFakMsS0FBSyxJQUFJLElBQUksR0FBVyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUUvRCxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUUzQixJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFO29CQUN6QixzQkFBc0IsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUd0RCxJQUFJLFNBQVMsR0FBRyxDQUFDLDBCQUEwQixHQUFHLHNCQUFzQixDQUFDLEVBQUU7d0JBRXJFLFVBQVUsR0FBRyxTQUFTLEdBQUcsMEJBQTBCLENBQUM7d0JBQ3BELE9BQU8sR0FBYyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQy9ELFVBQVUsR0FBRyxRQUFRLENBQUM7d0JBQ3RCLE1BQU07cUJBQ1A7b0JBRUQsMEJBQTBCLElBQUksc0JBQXNCLENBQUM7aUJBQ3REO2FBQ0Y7WUFHRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7Z0JBQ25CLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQixJQUFJLFVBQVUsR0FBVyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO2dCQUVoRSxLQUFLLElBQUksSUFBSSxHQUFXLENBQUMsRUFBRSxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUU7b0JBQzlELFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBRTNCLElBQUksVUFBVSxLQUFLLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRO3dCQUNuRCxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBRWpCLElBQUksVUFBVSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsUUFBUTt3QkFDN0UsTUFBTTtvQkFFUixVQUFVLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztpQkFDakQ7YUFDRjtTQUNGO1FBR0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUlELG9CQUFvQixDQUFDLE1BQWMsRUFBRSxHQUFXO1FBQzlDLElBQUksR0FBUyxDQUFDO1FBQ2QsSUFBSSxLQUFLLEdBQVcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1QyxJQUFJLE1BQU0sS0FBSyxRQUFRLENBQUMsa0JBQWtCLElBQUksS0FBSyxJQUFJLE1BQU07WUFDM0QsT0FBTyxHQUFHLENBQUM7UUFFYixJQUFJLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVqQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7WUFDYixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUdqQyxJQUFJLHFCQUFxQixHQUFXLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFckYsSUFBSSxDQUFTLENBQUM7WUFDZCxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcscUJBQXFCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdELEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQzlDO1NBQ0Y7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFPRCx3QkFBd0IsQ0FBQyxNQUFjLEVBQUUsUUFBZ0I7UUFDdkQsSUFBSSxxQkFBcUIsR0FBVyxDQUFDLENBQUM7UUFDdEMsSUFBSSxNQUFNLEtBQUssUUFBUSxDQUFDLGtCQUFrQixFQUFFO1lBQzFDLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN0RCxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQkFDeEUscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO29CQUMxQixNQUFNO2lCQUNQO2FBQ0Y7U0FDRjs7WUFFQyxxQkFBcUIsR0FBRyxNQUFNLENBQUM7UUFFakMsT0FBTyxxQkFBcUIsQ0FBQztJQUMvQixDQUFDO0lBTUQsY0FBYyxDQUFDLE9BQWU7UUFDNUIsT0FBZSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBRSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBT08sZUFBZSxDQUFDLE9BQWU7UUFDckMsSUFBSSxPQUFhLENBQUM7UUFFbEIsSUFBSSxPQUFPLElBQUksSUFBSTtZQUNqQixPQUFPLElBQUksQ0FBQztRQUNkLElBQUksR0FBRyxHQUFVLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFHeEMsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ2YsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7WUFFekYsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO2dCQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUU7b0JBQ2xFLElBQUksT0FBTyxHQUFlLFlBQVksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7b0JBQzdGLEdBQUcsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN4QztnQkFFRCxJQUFJLEdBQUcsSUFBSSxJQUFJO29CQUNiLEdBQUcsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzFDO1NBQ0Y7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFPRCxxQkFBcUIsQ0FBQyxPQUFlO1FBQ25DLElBQUksS0FBSyxHQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsSUFBSSxLQUFLLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksR0FBRyxHQUFVLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsSUFBSSxNQUFtQixDQUFDO1FBRXhCLElBQUksR0FBRyxJQUFJLElBQUk7WUFDYixPQUFPLENBQUMsQ0FBQztRQUVYLElBQUksU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pDLEtBQUssSUFBSSxJQUFJLEdBQVcsS0FBSyxHQUFHLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3BELElBQUksUUFBUSxHQUFTLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxJQUFJLFFBQVEsS0FBSyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQzlCLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ25CLEtBQUssSUFBSSxFQUFFLElBQUksQ0FBQztnQkFDaEIsTUFBTTthQUNQO1lBQ0QsTUFBTSxHQUFnQixRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZELEtBQUssSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDM0I7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFPRCxVQUFVLENBQUMsSUFBWSxFQUFFLGFBQXNCO1FBQzdDLElBQUksSUFBSSxHQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFRLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBRXZFLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDZixJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFdEMsSUFBSSxPQUFPLEdBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRXBFLElBQUksT0FBTyxJQUFJLElBQUk7Z0JBQ2pCLElBQUksR0FBRyxPQUFPLENBQUM7aUJBQ1o7Z0JBQ0gsSUFBSSxHQUFTLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFFOUIsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO29CQUVoQixJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssY0FBYyxDQUFDLG1CQUFtQjt3QkFDaEcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7b0JBQ3JCLE1BQU07aUJBQ1A7Z0JBRUQsSUFBSSxhQUFhLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUU7b0JBQzlDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFTLFlBQVksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDOUU7U0FDRjtJQUNILENBQUM7SUFNTyxpQkFBaUI7UUFDdkIsSUFBSSxRQUFRLEdBQXVCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO1FBQzdELElBQUksTUFBTSxHQUFZLEtBQUssQ0FBQztRQUk1QixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxJQUFJLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtZQUMzRCxDQUFDLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0UsTUFBTSxHQUFHLElBQUksQ0FBQztRQUVoQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBS0ssb0JBQW9COztZQUN4QixJQUFJLEdBQUcsR0FBWSxLQUFLLENBQUM7WUFHekIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3pCLElBQUksaUJBQWlCLEdBQWUsTUFBTSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFFdEUsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDOUIsR0FBRyxHQUFHLElBQUksQ0FBQzthQUNkO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO0tBQUE7SUFNTyxXQUFXO1FBQ2pCLElBQUksUUFBUSxHQUFlLElBQUksSUFBSSxFQUFRLENBQUM7UUFFNUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO2dCQUM1RCxRQUFRLENBQUMsSUFBSSxDQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDakQ7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBTUssb0JBQW9COztZQUN4QixJQUFJLFFBQVEsR0FBZSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDOUMsSUFBSSxpQkFBaUIsR0FBZSxJQUFJLElBQUksRUFBUSxDQUFDO1lBRXJELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoRCxJQUFJLE9BQU8sR0FBUyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQztvQkFDOUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2FBQ2xDO1lBRUQsT0FBTyxpQkFBaUIsQ0FBQztRQUMzQixDQUFDO0tBQUE7SUFRSyx3QkFBd0IsQ0FBQyxPQUFhOztZQUMxQyxJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUM7WUFDN0IsSUFBSSxXQUFXLEdBQXlCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUUzRSxPQUFPLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1lBRXRDLElBQUksV0FBVyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLHNCQUFzQixFQUFFO2dCQUM5RSxJQUFJLFVBQVUsR0FBVyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3hDLElBQUksWUFBWSxHQUFXLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUI7b0JBQ3hHLENBQUMsQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLGdCQUFnQjt3QkFDZixDQUFDLENBQUMsYUFBYSxDQUFDLHNCQUFzQjt3QkFDdEMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUt0RSxJQUFJLE9BQU8sQ0FBQyxZQUFZLElBQUksVUFBVSxLQUFLLE9BQU8sQ0FBQyxPQUFPLEVBQUU7b0JBQzFELElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUMsaUJBQWlCO3FCQUMvQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFBO3FCQUMvRSxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFBLEVBQUU7b0JBQzdDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFO3dCQUMxQixDQUFDLENBQUEsTUFBTSxXQUFXLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLENBQUMsQ0FBQSxFQUFFO3dCQUNsRixXQUFXLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO3dCQUNwQyxPQUFPLEdBQUcsS0FBSyxDQUFDO3FCQUNqQjs7d0JBRUMsT0FBTyxHQUFHLElBQUksQ0FBQztvQkFFakIsTUFBTSxPQUFPLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUMzQztxQkFDSTtvQkFDSCxPQUFPLEdBQUcsQ0FBQSxNQUFNLFdBQVcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxLQUFJLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUVqSCxJQUFJLE9BQU8sRUFBRTt3QkFDWCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRTs0QkFDMUIsQ0FBQyxDQUFBLE1BQU0sV0FBVyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxDQUFDLENBQUEsRUFBRTs0QkFDbEYsV0FBVyxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQzs0QkFDcEMsT0FBTyxHQUFHLEtBQUssQ0FBQzt5QkFDakI7cUJBQ0Y7aUJBQ0Y7Z0JBRUQsSUFBSSxPQUFPO29CQUNULE9BQU8sQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7YUFDeEM7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO0tBQUE7SUFNSyxlQUFlLENBQUMsVUFBa0I7O1lBQ3RDLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRXpCLElBQUksVUFBVSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDN0MsSUFBSSxHQUFHLEdBQW1CLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDcEgsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN6QztpQkFDSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3RELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuQyxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0JBQzdHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLFNBQVMsR0FBdUIsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLHFCQUFxQixDQUFDLE1BQU07b0JBQzdGLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7O29CQUV6QixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzQyxNQUFlLElBQUksQ0FBQyxPQUFPLEVBQUcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQUM7YUFDaEY7O2dCQUVDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFM0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFDOUMsQ0FBQztLQUFBO0lBR0ssd0JBQXdCOztZQUM1QixJQUFJLFFBQVEsR0FBZSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFHOUMsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2hELElBQUksT0FBTyxHQUFTLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksT0FBTyxDQUFDLHFCQUFxQixFQUFFO29CQUNqQyxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsNENBQTRDLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNsSSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRTt3QkFDcEQsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2lCQUM5RzthQUNGO1FBQ0gsQ0FBQztLQUFBO0lBR0QsMEJBQTBCO1FBQ3hCLElBQUksUUFBUSxHQUFlLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUU5QyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoRCxJQUFJLE9BQU8sR0FBUyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLE9BQU8sQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBS0QsdUJBQXVCO1FBQ3JCLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFJMUUsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBTUQsVUFBVSxDQUFDLE9BQWE7UUFDdEIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUk7WUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFNRCxhQUFhLENBQUMsT0FBYTtRQUN6QixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSTtZQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBTUQsb0JBQW9CLENBQUMsR0FBWTtRQUMvQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDO1FBRTlCLElBQUksQ0FBQyxHQUFHO1lBQ04sSUFBSSxDQUFDLDhCQUE4QixHQUFHLElBQUksQ0FBQztJQUMvQyxDQUFDO0lBUUQsaUJBQWlCLENBQUMsS0FBYTtRQUM3QixJQUFJLEtBQUssS0FBSyxjQUFjLENBQUMsVUFBVTtZQUNyQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLEtBQUssS0FBSyxDQUFDO1lBQ25FLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO2FBQzVCLElBQUksS0FBSyxLQUFLLGNBQWMsQ0FBQyxVQUFVO1lBQzFDLENBQUMsSUFBSSxDQUFDLDhCQUE4QixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsOEJBQThCLENBQUMsUUFBUSxFQUFFLEtBQUssS0FBSyxDQUFDO1lBQ3pHLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ2pDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQU1ELGFBQWEsQ0FBQyxHQUFXO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJO1lBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2pDLElBQUksSUFBSSxDQUFDLDhCQUE4QixJQUFJLElBQUksRUFBRTtZQUNwRCxJQUFJLEdBQUcsS0FBSyxjQUFjLENBQUMsYUFBYTtnQkFDdEMsSUFBSSxDQUFDLDhCQUE4QixHQUFHLElBQUksQ0FBQzs7Z0JBRTNDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDMUQ7SUFDSCxDQUFDO0lBSUQsYUFBYSxDQUFDLFFBQWlCO1FBQzdCLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUIsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDL0I7UUFDRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUdPLGVBQWU7UUFDckIsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUk7WUFDMUIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQ3JDLElBQUksSUFBSSxDQUFDLDhCQUE4QixJQUFJLElBQUk7WUFDbEQsT0FBTyxJQUFJLENBQUMsOEJBQThCLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDN0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBR08sZUFBZSxDQUFDLFFBQWdCO1FBQ3RDLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJO1lBQzFCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDN0MsSUFBSSxJQUFJLENBQUMsOEJBQThCLElBQUksSUFBSTtZQUNsRCxPQUFPLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBTUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBS0QsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUtELGNBQWM7UUFDWixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUM1QixDQUFDO0lBT0ssV0FBVyxDQUFDLElBQVk7O1lBQzVCLElBQUksZUFBeUIsQ0FBQztZQUM5QixJQUFJLGVBQWUsR0FBYSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBR3pGLElBQUksSUFBSSxDQUFDLFNBQVM7Z0JBQ2hCLE9BQU8sS0FBSyxDQUFDO1lBRWYsSUFBSSxJQUFJLENBQUMsYUFBYTtnQkFDcEIsT0FBTyxJQUFJLENBQUM7WUFFZCxJQUFJLGVBQWUsSUFBSSxJQUFJLElBQUksQ0FBRSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sZUFBZSxDQUFDLFFBQVEsRUFBRSxFQUFFLGNBQWMsQ0FBQyx1QkFBdUIsRUFDckgsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBRTdGLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLGVBQWUsSUFBSSxJQUFJO29CQUN6QixPQUFPLEtBQUssQ0FBQztnQkFDZixJQUFJLE9BQU8sR0FBVyxNQUFNLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFFdkQsSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ3ZDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUMxQixPQUFPLElBQUksQ0FBQztpQkFDYjtnQkFDRCxPQUFPLEtBQUssQ0FBQzthQUNkO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0tBQUE7SUFNRCxlQUFlLENBQUMsR0FBWTtRQUMxQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUN0QixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDOUQsSUFBSSxJQUFJLEdBQWUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDM0I7U0FDRjtRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDO0lBQzVCLENBQUM7SUFLRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUtELGlCQUFpQixDQUFDLE1BQWU7UUFDL0IsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBT0QsZ0JBQWdCLENBQUMsS0FBYztRQUM3QixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQzVCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFNRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVNLE9BQU8sQ0FBQyxjQUF1QixFQUFFLFNBQWtCLEVBQUUsZ0JBQXlCLEVBQUUsa0JBQTRCOztZQUNqSCxJQUFJLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDO2dCQUN2QyxPQUFPLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDOztnQkFFaEYsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2pHLENBQUM7S0FBQTtJQVFhLFNBQVMsQ0FBQyxjQUF1QixFQUFFLFNBQWtCLEVBQUUsa0JBQTJCLEVBQUUsZ0JBQXlCOztZQUN6SCxJQUFJLFNBQVMsR0FBWSxJQUFJLENBQUM7WUFDOUIsSUFBSSxhQUFhLEdBQVksS0FBSyxDQUFDO1lBQ25DLElBQUksT0FBYSxDQUFDO1lBQ2xCLElBQUksTUFBTSxHQUFzQixZQUFZLENBQUMsV0FBVyxDQUFDO1lBRXpELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFO2dCQUcxRSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUM7YUFDekY7aUJBQ0ksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQzlDLElBQUk7b0JBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7b0JBR3RCLElBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsRUFDbE07d0JBQ0UsSUFBSSxHQUFHLEdBQW1CLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO3dCQUMvRCxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQzdELE1BQU0sd0JBQXdCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxPQUFPLENBQUMsd0NBQXdDLENBQUMsa0JBQWtCLENBQUMsQ0FBQzt3QkFDM0gsT0FBTztxQkFDUjtvQkFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWM7d0JBQ3RCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBRzdCLElBQUksQ0FBUyxDQUFDO29CQUNkLElBQUksY0FBYyxFQUFFO3dCQUVsQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTs0QkFFdEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDLHFCQUFxQixFQUFFO2dDQUNoRSxJQUFJLG1CQUFtQixHQUFZLElBQUksQ0FBQztnQ0FDeEMsSUFBSSxlQUFlLEdBQVksTUFBTSxJQUFJLENBQUMsMENBQTBDLENBQUMsSUFBSSxFQUN2RixpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dDQUN4QyxJQUFJLENBQUMsZUFBZSxFQUFFO29DQUNwQixlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsMENBQTBDLENBQUMsSUFBSSxFQUMxRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29DQUN6QyxJQUFJLENBQUMsZUFBZTt3Q0FDaEIsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO2lDQUMvRDtnQ0FDRCxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7b0NBQzVDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7b0NBQ3JDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQ0FFbkMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO2lDQUNwRTs2QkFDRjs7Z0NBRUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUNyQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO2dDQUN6RCxPQUFPLEdBQVMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ3pDLGFBQWEsR0FBRyxhQUFhLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQztnQ0FDbkQsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQ0FDckcsU0FBUyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLElBQUksZ0JBQWdCLENBQUMsQ0FBQzs2QkFDdEY7eUJBQ0Y7NkJBRUQ7NEJBQ0UsSUFBSSx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxxQkFBcUI7Z0NBQzdELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFDdEM7d0JBRUQsSUFBSSxJQUFJLEtBQUssTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsRUFBRTs0QkFDaEQsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQ0FDdEQsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRTtvQ0FDL0IsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQ3hDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO29DQUN0RixTQUFTLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDO2lDQUN0Rjs2QkFDRjt5QkFDRjtxQkFDRjtvQkFFRCxJQUFJLFNBQVMsRUFBRTt3QkFFYixJQUFJLGNBQWMsSUFBSSxDQUFDLGdCQUFnQixFQUFFOzRCQUN2QyxJQUFJLFdBQVcsR0FBWSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDOzRCQUc3RixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxXQUFXLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCO2dDQUM5RixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFFMUQsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDOzRCQUd4RyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxXQUFXLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCO2dDQUM5RixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQzt5QkFDM0Q7d0JBRUQsU0FBUyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLElBQUksZ0JBQWdCLENBQUMsQ0FBQzt3QkFFckYsSUFBSSxTQUFTLElBQUksQ0FBQyxTQUFTOzRCQUN6QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQzt3QkFFL0IsSUFBSSxZQUFZLEdBQVksU0FBUyxDQUFDO3dCQUd0QyxJQUFJLFNBQVMsSUFBSSxDQUFDLFNBQVMsSUFBSSxjQUFjLElBQUksQ0FBQyxnQkFBZ0I7NEJBQ2hFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLGtCQUFrQixDQUFDOzRCQUN2QyxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCOzRCQUNuRCxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBR2hELElBQUksY0FBYyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7NEJBQ3RDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQ0FFNUMsT0FBTyxHQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUV6QyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7b0NBQ3BCLE1BQU0sWUFBWSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7NkJBQ3JHO3dCQUdILElBQUksY0FBYzs0QkFDaEIsU0FBUyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLElBQUksZ0JBQWdCLENBQUMsQ0FBQzt3QkFHdkYsSUFBSSxZQUFZOzRCQUNkLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBRXJELElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUVqRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLFNBQVMsSUFBSSxDQUFDLFNBQVMsRUFBRTs0QkFFakQsSUFBSSxjQUFjLEVBQUU7Z0NBQ2xCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDakMsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0NBQ2pHLFNBQVMsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUM7NkJBQ3pLOzRCQUVELElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDOzRCQUVqRCxJQUFJLFNBQVMsRUFBRTtnQ0FHYixJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFO29DQUNqQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO29DQUNwQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7aUNBQ3JFO3FDQUNJLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFDO29DQUNsQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO29DQUNuQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7aUNBQ3BFO2dDQUVELElBQUksT0FBTyxHQUFXLFlBQVksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDO2dDQUU3RCxJQUFJLGNBQWMsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBVSxFQUFFLEtBQUssSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO29DQUMvRSxZQUFZLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO29DQUM3RCxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztvQ0FDMUQsWUFBWSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQ0FLOUQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUU7d0NBRXJCLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQzt3Q0FDcEUsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQzt3Q0FDbkMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQzt3Q0FDcEMsT0FBTyxJQUFJLENBQUM7cUNBQ2I7aUNBQ0Y7Z0NBRUQsTUFBTSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztnQ0FJckUsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxFQUFFO29DQUM3RCxJQUFJLEdBQUcsR0FBVyxZQUFZLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQ0FDeEQsSUFBSSxXQUFXLEdBQVMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQ0FDM0MsSUFBSSxRQUFRLEdBQVMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7b0NBQzNFLElBQUksVUFBVSxHQUFZLE1BQU0sV0FBVyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLENBQUM7b0NBR3BHLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxVQUFVLEVBQUU7d0NBQ25DLElBQUksS0FBSyxHQUFHLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dDQUN2QyxLQUFLLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO3dDQUNsRCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO3dDQUNwQixLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO3dDQUN2QixZQUFZLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQ0FDN0M7aUNBQ0Y7Z0NBQ0QsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUMvQzt5QkFDRjtxQkFDRjtpQkFDRjt3QkFFTztvQkFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxrQkFBa0I7d0JBQ3ZDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7aUJBQ3hEO2FBQ0Y7aUJBUUksSUFBSSxJQUFJLENBQUMsU0FBUztnQkFDckIsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUdwQixZQUFZLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBRTlGLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7S0FBQTtJQU1PLHVCQUF1QixDQUFFLElBQVc7UUFFMUMsSUFBSSxvQkFBb0IsR0FBWSxLQUFLLENBQUM7UUFDMUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXhELElBQUssT0FBTyxHQUFpQixJQUFJLENBQUM7UUFFbEMsSUFBSSxTQUFTLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQzNDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU5QixJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQ25CO1lBQ0UsS0FBSyxJQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFDN0Q7Z0JBQ0UsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM1QjtTQUNGO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUk7WUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQ2xEO2dCQUNFLElBQUksT0FBTyxHQUFlLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDdkM7U0FDRjtJQUVILENBQUM7SUFNYSwwQ0FBMEMsQ0FBRSxJQUFVLEVBQUUsU0FBaUI7O1lBQ3JGLElBQUksb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1lBQ2pDLElBQUksS0FBSyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25DLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFN0IsSUFBSSxPQUFPLEdBQWlCLElBQUksQ0FBQztZQUVqQyxJQUFJLFNBQVMsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDM0MsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRTlCLElBQUksU0FBUyxJQUFJLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFO2dCQUNwRCxJQUFJLFVBQVUsR0FBYyxJQUFJLENBQUMsUUFBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN4RCxJQUFlLElBQUksQ0FBQyxRQUFTLENBQUMscUJBQXFCLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUM7b0JBQ3RHLG9CQUFvQixHQUFHLElBQUksQ0FBQztnQkFFOUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFO29CQUN6QixJQUFJLFdBQVcsR0FBWSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUc3RixJQUFJLFdBQVcsS0FBSyxJQUFJO3dCQUN4QixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0I7NEJBQ3RFLG9CQUFvQixHQUFHLElBQUksQ0FBQztpQkFFL0I7YUFDRjtZQUVELElBQUksT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO2dCQUMxQyxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBRTlDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzVCLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3JELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFO3dCQUMxQixvQkFBb0IsR0FBRyxJQUFJLENBQUM7d0JBQzVCLE1BQU07cUJBQ1A7eUJBQ0k7d0JBQ0gsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksY0FBYyxDQUFDLG1CQUFtQixFQUFDOzRCQUN2RCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxjQUFjLENBQUMsbUJBQW1CO2dDQUMxRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLEtBQUssaUJBQWlCLENBQUMsc0JBQXNCLEVBQUU7Z0NBQ3JGLG9CQUFvQixHQUFHLElBQUksQ0FBQztnQ0FDNUIsTUFBTTs2QkFDUDt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1lBRUQsSUFBSSxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDaEYsSUFBSSxPQUFPLEdBQVMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzdDLG9CQUFvQixHQUFHLE1BQU0sSUFBSSxDQUFDLDBDQUEwQyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztpQkFDbEc7YUFDRjtZQUVELE9BQU8sb0JBQW9CLENBQUM7UUFDaEMsQ0FBQztLQUFBO0lBT08sMEJBQTBCLENBQUMsSUFBVztRQUU1QyxJQUFJLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLFVBQVUsR0FBZSxJQUFJLENBQUMsUUFBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pELElBQWUsSUFBSSxDQUFDLFFBQVMsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUN0RyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFFN0IsSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFDOUM7WUFDRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsbUJBQW1CLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUMvRTtnQkFDRSxJQUFJLE9BQU8sR0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0MsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ2hFO1NBQ0Y7UUFFRCxPQUFPLG1CQUFtQixDQUFDO0lBQzdCLENBQUM7SUFPTyxxQkFBcUI7UUFPM0IsSUFBSSxXQUFXLEdBQWdCLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDO1FBQ3RGLElBQUksV0FBVyxLQUFLLElBQUksSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxHQUFHLEVBQUU7WUFDdkYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ25ELElBQUksQ0FBQyxRQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDN0M7SUFDSCxDQUFDO0lBT0ssSUFBSSxDQUFDLGNBQXVCLEVBQUUsa0JBQTJCOztZQUk3RCxJQUFJLEdBQUcsR0FBbUIsY0FBYyxDQUFDLENBQUM7Z0JBQ0EsY0FBYyxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BGLGNBQWMsQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUUvSCxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUN2QixJQUFJO29CQUtGLElBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBVSxFQUFFO3dCQUN4RixDQUFDLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxTQUFTLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxhQUFhLENBQUM7d0JBQzVJLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2lCQUNyRztnQkFDRCxPQUFPLEdBQUcsRUFBRTtvQkFHVixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRTt3QkFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUNwQzs7d0JBRUMsTUFBTSxHQUFHLENBQUM7aUJBQ2I7YUFFRjtRQUNILENBQUM7S0FBQTtJQVFPLG9CQUFvQixDQUFDLFNBQWtCLEVBQUUsY0FBdUI7UUFDdEUsSUFBSSxPQUFhLENBQUM7UUFFbEIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hELE9BQU8sR0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQzthQUN6RDtTQUNGO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFFdkIsSUFBSSxTQUFTO1lBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFFMUIsSUFBSSxDQUFDLFNBQVMsSUFBSSxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWM7WUFDckQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBTUssZ0JBQWdCLENBQUMsWUFBcUI7O1lBQzFDLElBQUksU0FBUyxHQUFZLElBQUksQ0FBQztZQUM5QixJQUFJLE9BQWEsQ0FBQztZQUVsQixJQUFJLFlBQVksRUFBRTtnQkFDaEIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7b0JBQ3RCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDckUsT0FBTyxHQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN6QyxTQUFTLEdBQUcsTUFBTSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7cUJBQzFEO2lCQUNGO2FBQ0Y7WUFFRCxJQUFJLFNBQVM7Z0JBQ1gsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzNHLFNBQVMsR0FBRyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMvRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1lBQy9CLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7S0FBQTtJQU1ELGVBQWUsQ0FBQyxZQUFxQjtRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztJQUNwQyxDQUFDO0lBS0QsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBVUssdUJBQXVCLENBQUMsZUFBdUI7O1lBQ25ELElBQUksQ0FBUyxDQUFDO1lBQ2QsSUFBSSxJQUFJLEdBQVMsSUFBSSxDQUFDO1lBQ3RCLElBQUksV0FBVyxHQUFTLElBQUksQ0FBQztZQUM3QixJQUFJLE1BQU0sR0FBc0IsWUFBWSxDQUFDLFdBQVcsQ0FBQztZQUN6RCxJQUFJLGNBQWMsR0FBbUIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BFLElBQUksT0FBTyxHQUFlLElBQUksQ0FBQztZQUMvQixJQUFJLFNBQWtCLENBQUM7WUFDdkIsSUFBSSxTQUFTLEdBQVksS0FBSyxDQUFDO1lBQy9CLElBQUksT0FBTyxHQUFZLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBR2xGLElBQUksT0FBTyxFQUFFO2dCQUNYLFlBQVksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDaEQsT0FBTyxHQUFHLElBQUksSUFBSSxFQUFRLENBQUM7Z0JBSzNCLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUM3QixPQUFPLENBQUMsSUFBSSxHQUFTLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRTtvQkFDbEQsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDeEcsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsc0JBQXNCLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksSUFBSTt3QkFDOUgsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDdEI7YUFDRjtZQUVELElBQUksVUFBVSxHQUFZLFlBQVksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUd6RSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2hHLElBQUksR0FBUyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUVwSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFVBQVUsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7b0JBRXBFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLGFBQWEsSUFBSSxlQUFlLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxlQUFlO3dCQUMxSSxNQUFpQixJQUFJLENBQUMsUUFBUyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDeEQsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztvQkFDcEYsU0FBUyxHQUFHLElBQUksQ0FBQztpQkFDbEI7YUFDRjtZQUdELE9BQU8sT0FBTyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMvRixJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFHM0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxJQUFJLGVBQWUsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWU7b0JBQzFJLE1BQWlCLElBQUksQ0FBQyxRQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUNwRixTQUFTLEdBQUcsSUFBSSxDQUFDO2FBQ2xCO1lBRUQsSUFBSSxTQUFTLElBQUksWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRTtnQkFDaEUsV0FBVyxHQUFHLElBQUksQ0FBQztZQUVyQixJQUFJLE9BQU87Z0JBQ1QsWUFBWSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUUvQyxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO0tBQUE7SUFLSyxtQkFBbUI7O1lBQ3ZCLElBQUksUUFBUSxHQUF1QixJQUFJLENBQUMsUUFBUSxDQUFDO1lBRWpELE1BQU0sSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7WUFFNUMsSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRTtnQkFDcEQsSUFBSSxRQUFRLENBQUMsZUFBZSxFQUFFLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBRTtvQkFDaEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3ZFLElBQUksUUFBUSxDQUFDLFdBQVc7d0JBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDOzt3QkFDbEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQzNFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7d0JBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUMxRTtxQkFDSTtvQkFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDdEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3JFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7d0JBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUN6RTtnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7b0JBQzNCLElBQUksUUFBUSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDbkcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7O3dCQUNwRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM5RTtpQkFDSTtnQkFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDckUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3RFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3ZFO1lBRUQsSUFBSSxRQUFRLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZUFBZSxDQUFDLElBQUksUUFBUSxDQUFDLGVBQWUsRUFBRTtvQkFDN0UsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLENBQUM7d0JBQzlDLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzs0QkFDL0QsQ0FBQyxDQUFBLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ3JJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUN2RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDdEUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTt3QkFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQzFFO3FCQUNJO29CQUNILElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO29CQUN0RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDckUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTt3QkFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ3pFO2dCQUVELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO29CQUM3QixJQUFJLFFBQVEsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQzdHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDOzt3QkFDcEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQzVFO2FBQ0Y7aUJBQ0k7Z0JBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3RFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN0RTtZQUVELElBQUksUUFBUSxDQUFDLGVBQWUsRUFBRTtnQkFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDOztnQkFFbEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRW5FLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxDQUFDO1lBRTVFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9FLENBQUM7S0FBQTtJQUtELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUtELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQU1ELFdBQVcsQ0FBQyxLQUFhO1FBQ3ZCLElBQUksTUFBTSxHQUFZLEtBQUssQ0FBQztRQUU1QixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEcsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQztTQUM1QztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFLTyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQ2hFLENBQUM7SUFNRCxzQkFBc0IsQ0FBQyxHQUFZO1FBQ2pDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxHQUFHLENBQUM7SUFDbEMsQ0FBQztJQUtELHNCQUFzQjtRQUNwQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0lBRUQsdUJBQXVCLENBQUMsR0FBWTtRQUNsQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsR0FBRyxDQUFDO0lBQ25DLENBQUM7SUFFRCx1QkFBdUI7UUFDckIsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUM7SUFDcEMsQ0FBQztJQUtELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBTUQsa0JBQWtCO1FBQ2hCLElBQUksTUFBTSxHQUFXLEVBQUUsQ0FBQztRQUN4QixJQUFJLEdBQWEsQ0FBQztRQUNsQixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSTtZQUM5QixPQUFPLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdkMsSUFBSSxLQUFLLEdBQVksSUFBSSxDQUFDO1FBRzFCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1RCxJQUFJLENBQUMsS0FBSztnQkFDUixNQUFNLElBQUksR0FBRyxDQUFDO1lBRWhCLElBQUksV0FBVyxHQUFhLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRzdELElBQUksVUFBVSxHQUFXLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxJQUFJLGFBQWEsR0FBVyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFELElBQUksV0FBVyxHQUFTLFlBQVksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pFLElBQUksWUFBWSxHQUFVLFdBQVcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksT0FBTyxHQUFXLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUdsRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZCLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFHZixJQUFJLEdBQVEsQ0FBQztZQUNiLFFBQVEsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUM5QixLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztnQkFHOUIsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7Z0JBQzVCLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxDQUFDO2dCQUM5QixLQUFLLGdCQUFnQixDQUFDLElBQUksQ0FBQztnQkFDM0IsS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXO29CQUMvQixNQUFNLElBQUksT0FBTyxDQUFDO29CQUNsQixNQUFNO2dCQUVSLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDO2dCQUMzQixLQUFLLGdCQUFnQixDQUFDLElBQUk7b0JBRXhCLElBQUksT0FBTyxLQUFLLEVBQUUsRUFBRTt3QkFDbEIsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3BFLElBQUksSUFBSSxHQUFxQixnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7d0JBQ3ZELE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBQzNFO29CQUNELE1BQU07Z0JBRVIsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPO29CQUUzQixJQUFJLE9BQU8sS0FBSyxFQUFFLEVBQUU7d0JBQ2xCLEdBQUcsR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDNUIsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3BFLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUN6QjtvQkFDRCxNQUFNO2FBQ1Q7WUFFRCxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ2Y7UUFFRCxJQUFJLE9BQU8sR0FBVyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTFELE9BQU8sU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBTUQsYUFBYSxDQUFDLE9BQWU7UUFDM0IsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQzVCLElBQUksSUFBSSxHQUFhLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxJQUFJLEVBQVksQ0FBQztZQUU1QyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbEQsSUFBSSxJQUFJLEdBQWEsSUFBSSxLQUFLLENBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLElBQUksVUFBVSxHQUFhLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUd4QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNqQztTQUNGO0lBQ0gsQ0FBQztJQUtELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQU9LLFlBQVksQ0FBQyxVQUFtQjs7WUFDcEMsSUFBSSxPQUFPLEdBQVksSUFBSSxDQUFDO1lBRzVCLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2YsSUFBSSxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRTtvQkFDekIsSUFBZSxJQUFJLENBQUMsUUFBUyxDQUFDLFVBQVUsRUFBRSxFQUFFO3dCQUUxQyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFZLElBQUksQ0FBQyxRQUFTLENBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7d0JBQ2pGLE9BQU8sR0FBRyxLQUFLLENBQUM7cUJBQ2pCO2lCQUNGO3FCQUNJO29CQUVILElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFFLENBQUEsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUEsRUFBRTt3QkFDN0MsT0FBTyxHQUFHLEtBQUssQ0FBQztxQkFDakI7aUJBQ0Y7YUFDRjtZQUVELElBQUksVUFBZ0IsQ0FBQztZQUdyQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFFdEIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzlELFVBQVUsR0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFFNUMsSUFBSSxDQUFFLENBQUEsTUFBTSxVQUFVLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBLEVBQUU7d0JBQzFDLE9BQU8sR0FBRyxLQUFLLENBQUM7cUJBQ2pCO2lCQUNGO2FBQ0Y7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO0tBQUE7SUFPSyxVQUFVLENBQUMsVUFBbUI7O1lBRWxDLElBQUksQ0FBQyxVQUFVLEtBQUksTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUEsRUFBRTtnQkFDeEMsSUFBSSxXQUFXLEdBQVcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBR3BELElBQUksV0FBVyxLQUFnQixJQUFJLENBQUMsUUFBUyxDQUFDLGFBQWEsRUFBRSxFQUFFO29CQUM3RCxJQUFJLFNBQVMsR0FBYSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN2RSxJQUFJLFNBQVMsSUFBSSxJQUFJO3dCQUNuQixPQUFPLEtBQUssQ0FBQztvQkFDZixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBRWhDO2dCQUdELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7YUFDbkM7WUFHRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFHdEIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBRXhELElBQUksQ0FBQyxDQUFBLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFBO3dCQUNuRCxPQUFPLEtBQUssQ0FBQztpQkFDaEI7YUFDRjtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztLQUFBO0lBVWEsUUFBUSxDQUFDLFNBQW1COztZQUN4QyxJQUFJLFFBQVEsR0FBdUIsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUdqRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFO29CQUNwRCxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQzthQUNsRDs7Z0JBRUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFHMUIsTUFBTSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBRWxDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxJQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFOUMsTUFBZSxJQUFJLENBQUMsSUFBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUd0RSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQztLQUFBO0lBRUQsbUJBQW1CLENBQUMsZ0JBQXdCO1FBQzFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQU1ELG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBT0ssUUFBUTs7WUFDWixPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUksTUFBc0IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFBLENBQUM7UUFDakksQ0FBQztLQUFBO0lBS08sZ0JBQWdCO1FBQ3RCLElBQUksTUFBTSxHQUFhLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQVksSUFBSSxDQUFDLFFBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBR2xHLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtZQUNsQixJQUFlLElBQUksQ0FBQyxRQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLElBQUksQ0FBWSxJQUFJLENBQUMsUUFBUyxDQUFDLFVBQVUsRUFBRSxFQUFFO2dCQUNwRyxJQUFJLENBQUMsUUFBUyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFZLElBQUksQ0FBQyxRQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQzthQUNqRTs7Z0JBRUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBWSxJQUFJLENBQUMsUUFBUyxDQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3BGO2FBRUk7WUFDSCxJQUFJLENBQVksSUFBSSxDQUFDLFFBQVMsQ0FBQyxVQUFVLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFZLElBQUksQ0FBQyxRQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztTQUNuRTtJQUNILENBQUM7SUFLRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFLTyxvQkFBb0IsQ0FBQyxPQUFlO1FBQzFDLElBQUksTUFBTSxHQUFzQixZQUFZLENBQUMsV0FBVyxDQUFDO1FBQ3pELElBQUksU0FBZSxDQUFDO1FBQ3BCLElBQUksTUFBTSxHQUFZLEtBQUssQ0FBQztRQUU1QixNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsU0FBUyxHQUFTLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRTtZQUV2RCxJQUFJLFNBQVMsQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsV0FBVyxJQUFJLElBQUk7Z0JBQ3JFLFNBQVMsQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxLQUFLLE9BQU8sRUFBRTtnQkFDdEYsTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDZCxNQUFNO2FBQ1A7U0FDRjtRQUVELElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsV0FBVyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDUixTQUFTLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdELElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFLRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBUTtJQUM3QyxDQUFDO0lBTUQsY0FBYztRQUNaLElBQUksTUFBTSxHQUFXLENBQUMsQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDdEYsTUFBTSxHQUFXLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDekM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBS0QsU0FBUztRQUNQLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJO1lBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUVoQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBS0QsU0FBUztRQUNQLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBS0QsY0FBYztRQUNaLElBQUksTUFBTSxHQUFXLENBQUMsQ0FBQztRQUV2QixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM5RCxNQUFNLEdBQVcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUV6QyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBS0QsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBS0QsZ0JBQWdCO1FBQ2QsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUk7WUFDMUIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWpDLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQU1ELGVBQWUsQ0FBQyxHQUFZO1FBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO0lBQzNCLENBQUM7SUFLRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUVELGtCQUFrQixDQUFDLE1BQWdCO1FBQ2pDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztTQUNwQztRQUNELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztJQUVPLG9CQUFvQixDQUFDLE1BQWU7UUFDMUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBR0QsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBR0ssYUFBYTs7WUFDakIsSUFBSSxJQUFJLEdBQWEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUN4RixPQUFPLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3RDLENBQUM7S0FBQTtJQUdELGlCQUFpQjtRQUNmLElBQUksTUFBTSxHQUFXLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksR0FBYSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRW5FLElBQUksSUFBSSxJQUFJLElBQUk7WUFDZCxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFbkMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQU1ELGtCQUFrQjtRQUNoQixJQUFJLFlBQVksR0FBWSxLQUFLLENBQUM7UUFFbEMsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDNUQsWUFBWSxHQUFHLElBQUksQ0FBQztRQUV0QixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBYTtRQUNoQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLEtBQUssS0FBSyxDQUFDO0lBQzVFLENBQUM7SUFLRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFLSyxXQUFXOztZQUNmLElBQUksTUFBTSxHQUFZLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFdkUsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFdkUsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFdEUsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFdEUsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFdkUsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFekUsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMscUNBQXFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUUsQ0FBQztLQUFBO0lBS0Qsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFDakMsQ0FBQztJQUtELG9CQUFvQjtRQUNsQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBR0Qsb0JBQW9CO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFNRCxxQkFBcUIsQ0FBQyxrQkFBMkI7UUFDL0MsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDO0lBQ2hELENBQUM7SUFHRCxvQkFBb0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQU1ELG9CQUFvQixDQUFDLGlCQUEwQjtRQUM3QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsaUJBQWlCLENBQUM7SUFDOUMsQ0FBQztJQUtELGtCQUFrQixDQUFDLEdBQVk7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztJQUM5QixDQUFDO0lBSUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxHQUFZO1FBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsRUFBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pILENBQUM7SUFLSyw4QkFBOEI7O1lBQ2xDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxlQUFlLEVBQUUsS0FBSSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFBO2dCQUN4RyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixJQUFlLElBQUksQ0FBQyxRQUFTLENBQUMsWUFBWTtnQkFDdkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDOztnQkFFbEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXJFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNwRSxDQUFZLElBQUksQ0FBQyxRQUFTLENBQUMsWUFBWTtvQkFDckMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7b0JBQ2xILENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7O2dCQUU1QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQztLQUFBO0lBR0QsZ0JBQWdCLENBQUMsYUFBc0I7UUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBR0QsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBS0ssaUJBQWlCLENBQUMsY0FBdUI7O1lBRTdDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxlQUFlLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUd6RSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7b0JBQ2xCLElBQUksTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3pELElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUUsSUFBSSxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLGNBQWMsRUFDOUc7d0JBQ0UsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNqRCxLQUFLLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLENBQUM7d0JBQzNELEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUMzQyxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztxQkFDNUQ7aUJBQ0Y7O29CQUVDLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBRTdHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBTzNDLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyx3QkFBd0IsQ0FBQyxVQUFVLElBQUksY0FBYyxLQUFJLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUEsRUFBRTtvQkFDdkgsTUFBaUIsSUFBSSxDQUFDLFFBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDbEQsTUFBTSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztpQkFDdkM7Z0JBRUQsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzdFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzlFO1FBQ0gsQ0FBQztLQUFBO0lBS0Qsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXpDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFNSyxjQUFjLENBQUMsV0FBcUIsRUFBRSxzQkFBK0I7O1lBQ3pFLElBQUksUUFBUSxHQUFTLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3RFLElBQUksUUFBUSxHQUFZLE1BQWEsV0FBWSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUU1RSxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUU7Z0JBQ25ELE9BQU87WUFHVCxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUMsZUFBZSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO2dCQUM5RyxZQUFZLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQy9DLE1BQU0sWUFBWSxDQUFDLGFBQWEsQ0FBQyw0Q0FBNEMsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3RJLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDOUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFHaEIsSUFBSSxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFO29CQUNuRCxPQUFPO2FBQ1Y7WUFHRCxJQUFJLEdBQUcsR0FBbUIsY0FBYyxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztZQUMxSSxNQUFNLFdBQVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRTtnQkFDMUIsT0FBTztZQUVULElBQUksc0JBQXNCLEVBQUU7Z0JBRTFCLFlBQVksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFHL0MsSUFBSSw0QkFBNEIsR0FBbUIsV0FBWSxDQUFDLHlCQUF5QixDQUFDO2dCQUNuRixXQUFZLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO2dCQUN0RCxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsNENBQTRDLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMvSCxXQUFZLENBQUMseUJBQXlCLEdBQUcsNEJBQTRCLENBQUM7Z0JBQzdFLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFO29CQUNuRCxPQUFPO2FBQ1Y7WUFJRCxJQUFJLFFBQVEsRUFBRTthQUtiO2lCQUNJO2dCQUNILElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLEVBQUU7b0JBQ3RELElBQUksc0JBQXNCLEVBQUU7d0JBQzFCLE1BQU0sWUFBWSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQzt3QkFDL0csSUFBSSxRQUFRLElBQUksSUFBSTs0QkFDUCxRQUFRLENBQUMsUUFBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUNqRCxXQUFXLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO3FCQUMzQztpQkFDRjthQUNGO1FBQ0gsQ0FBQztLQUFBO0lBUUssZUFBZSxDQUFDLFFBQWM7O1lBQ2xDLElBQUksaUJBQWlCLEdBQVksS0FBSyxDQUFDO1lBSXZDLElBQUksUUFBUSxJQUFJLElBQUk7Z0JBQ2xCLE9BQU8saUJBQWlCLENBQUM7WUFJM0IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWUsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDMUYsT0FBTyxpQkFBaUIsQ0FBQztZQUUzQixLQUFLLElBQUksSUFBSSxHQUFTLFFBQVEsRUFBRSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxlQUFlLEVBQUUsSUFBSSxHQUFTLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDeEosWUFBWSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3hHLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDOUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2FBQzFCO1lBRUQsT0FBTyxpQkFBaUIsQ0FBQztRQUMzQixDQUFDO0tBQUE7SUFRSyxvQkFBb0IsQ0FBQyxPQUFhOztZQUN0QyxJQUFJLFFBQWMsQ0FBQztZQUNuQixJQUFJLENBQVMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDekMsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUM1RyxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUU7d0JBQ25ELE1BQU07b0JBSVIsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixJQUFJLENBQUMsQ0FBWSxRQUFRLENBQUMsUUFBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFO3dCQUMvRyxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2lCQUNoRDtxQkFDSTtvQkFDSCxHQUFHLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzFDLE1BQU07aUJBQ1A7YUFDRjtZQUNELEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztLQUFBO0lBTUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBTUQsZUFBZTtRQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFXO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0lBQ3RCLENBQUM7SUFNRCx1QkFBdUI7UUFDckIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMxRCxDQUFDO0lBUUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQWdCO1FBQ3hDLElBQUksS0FBSyxHQUFpQixTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM3RCxJQUFJLGFBQWEsR0FBWSxLQUFLLENBQUM7UUFFbkMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN0QixJQUFJLE1BQU0sR0FBVyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RCxJQUFJLE1BQU0sS0FBSyxRQUFRLENBQUMsa0JBQWtCO2dCQUN4QyxhQUFhLEdBQUcsSUFBSSxDQUFDO1NBQ3hCO1FBRUQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVELFdBQVc7UUFFVCxJQUFJLFFBQVEsR0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN2RixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvSCxDQUFDO0lBT0QsZUFBZSxDQUFDLG9CQUF1QztRQUNyRCxJQUFJLElBQUksR0FBVyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ2hDLElBQUksVUFBVSxHQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBSzFGLE9BQU8sVUFBVSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUM5RCxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQztTQUNwQztRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLG9CQUFvQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBS0QsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBS0QsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBR0ssY0FBYzs7WUFDbEIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQ2hFLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLENBQUM7Z0JBUTdELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLENBQUMsaUJBQWlCLEVBQUU7b0JBQ3JELElBQUksSUFBSSxHQUFtQixJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNyQyxJQUFJLFlBQVksR0FBWSxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7b0JBQ25GLElBQUksWUFBWSxFQUFFO3dCQUNoQixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztxQkFDakQ7aUJBQ0Y7Z0JBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsQ0FBQzthQUM1RDtRQUNILENBQUM7S0FBQTtJQWdCRCxvQkFBb0IsQ0FBQyxRQUFrQixFQUFFLEtBQXVCLEVBQUUsTUFBeUI7UUFDekYsS0FBSyxDQUFDLEtBQUssR0FBVyxRQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDL0MsTUFBTSxDQUFDLEtBQUssR0FBVyxRQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQU1LLGlDQUFpQyxDQUFDLFFBQWtCLEVBQUUsS0FBYSxFQUFFLE1BQWU7O1lBQ3hGLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUMzQixNQUFjLFFBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDdEY7UUFDSCxDQUFDO0tBQUE7SUFNRCxnQ0FBZ0M7UUFDOUIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBT08sa0JBQWtCO1FBQ3hCLElBQUksd0JBQXdCLEdBQVksS0FBSyxDQUFDO1FBRzlDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixLQUFLLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTTtZQUNoRix3QkFBd0IsR0FBRyxJQUFJLENBQUM7YUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDMUIsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1NBQ25DO1FBQ0QsT0FBTyx3QkFBd0IsQ0FBQztJQUNsQyxDQUFDO0lBS0QsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBS0QsY0FBYyxDQUFDLE9BQWlCO1FBQzlCLElBQUksT0FBTyxLQUFLLElBQUk7WUFDbEIsT0FBTyxJQUFJLENBQUM7YUFDVCxJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJO1lBQ3BELE9BQU8sS0FBSyxDQUFDO1FBRWYsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBS00seUJBQXlCO1FBQzlCLElBQUksUUFBUSxHQUFTLElBQUksQ0FBQztRQUMxQixPQUFPLFFBQVEsQ0FBQyxXQUFXLElBQUksSUFBSSxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsRUFBRTtZQUNsRixJQUFJLFdBQVcsR0FBeUIsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDMUYsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQ3pCO2dCQUNFLE9BQU8sV0FBVyxDQUFDO2FBQ3BCO1lBQ0QsUUFBUSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7U0FDakM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFNRCw2QkFBNkIsQ0FBQyxNQUFjO1FBQzFDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBTUQsZUFBZTtRQUliLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtZQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUM1QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzthQUNsQjtTQUNGO0lBQ0gsQ0FBQztJQU1ELGtCQUFrQjtRQUNoQixJQUFJLGVBQWUsR0FBYSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ25GLElBQUksZ0JBQWdCLEdBQVcsZUFBZSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFFekUsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFL0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBS0ssZUFBZTs7WUFDbkIsTUFBTSxlQUFlLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEQsT0FBTyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxDQUFDO0tBQUE7SUFPRCxXQUFXO1FBQ1QsSUFBSSxhQUFhLEdBQVksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hELE9BQU8sYUFBYSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxXQUFXLENBQUM7SUFDdEQsQ0FBQztJQU9ELDhCQUE4QixDQUFDLFVBQWtCO1FBQy9DLElBQUksSUFBSSxHQUFTLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUU5QyxPQUFPLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDbkIsVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ2hDLElBQUksR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7U0FDckM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBT0Qsb0NBQW9DLENBQUMsVUFBa0I7UUFDckQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFO1lBRWxCLElBQUksSUFBSSxHQUFTLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztZQUU5QyxPQUFPLElBQUksSUFBSSxJQUFJLEVBQUU7Z0JBQ25CLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDaEMsSUFBSSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQzthQUNyQztTQUNGO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQU9ELGlDQUFpQyxDQUFDLG9CQUFzQztRQUN0RSxJQUFJLFdBQVcsR0FBUyxJQUFJLENBQUM7UUFLN0IsSUFBSSxvQkFBb0IsQ0FBQyxhQUFhLEVBQUU7WUFDdEMsT0FBYSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVoSCxPQUFPLFdBQVcsSUFBSSxJQUFJLEVBQUU7WUFDMUIsSUFBSSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDO2dCQUMzRCxPQUFPLFdBQVcsQ0FBQztZQUVyQixXQUFXLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQztTQUN2QztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDZCQUE2QixDQUFDLFNBQWlCLEVBQUUsVUFBa0I7UUFDakUsSUFBSSxJQUFJLEdBQWtCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBT0QseUJBQXlCLENBQUMsSUFBWTtRQUdwQyxJQUFJLGNBQWMsR0FBZ0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hELElBQUksY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUk7WUFDbEMsY0FBYyxHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRXBFLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBR0QsNkJBQTZCO1FBQzNCLElBQUksNkJBQTZCLEdBQVksS0FBSyxDQUFDO1FBRW5ELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUk7WUFDeEIsNkJBQTZCLEdBQVksSUFBSSxDQUFDLE9BQU8sRUFBRyxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFFMUYsT0FBTyw2QkFBNkIsQ0FBQztJQUN2QyxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksS0FBSyxHQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzdFLElBQUksSUFBSSxHQUFTLElBQUksQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNoRSxJQUFJLEdBQVMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUM3QixLQUFLLEdBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztTQUN4RjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUtELE1BQU0sQ0FBTyxjQUFjOztZQUN6QixJQUFJLE9BQU8sR0FBVyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3RFLElBQUksYUFBYSxHQUFXLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDdkgsS0FBSyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEtBQUssQ0FBQyxDQUFDLElBQUksYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUdyRSxJQUFJLEdBQUcsR0FBVyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNwRixrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXBJLElBQUksWUFBWSxHQUFpQixTQUFTLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxFQUFFLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNySixJQUFJLFlBQVksR0FBVyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUksVUFBVSxHQUFXLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFHbEQsSUFBSSxtQkFBbUIsR0FBVyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRzlGLElBQUksZ0JBQWdCLEdBQWtCLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXZNLElBQUksT0FBTyxHQUFpQixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkUsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBRW5CLElBQUksT0FBTyxHQUFXLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxJQUFJLE9BQU8sR0FBVyxDQUFDLENBQUM7WUFDeEIsT0FBTyxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ3JCLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNoRixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELE9BQU8sSUFBSSxDQUFDLENBQUM7Z0JBQ2IsT0FBTyxHQUFHLE9BQU8sQ0FBQztnQkFDbEIsT0FBTyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDdEQ7WUFDRCxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFHN0QsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLGFBQWEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hHLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUV0QyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBRXpGLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZELGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xKLENBQUM7S0FBQTtJQU9PLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBWSxFQUFFLEtBQWEsRUFBRSxLQUFjLEVBQUUsU0FBaUI7UUFDdEYsSUFBSSxPQUFPLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7UUFDakQsSUFBSSxJQUFJLEdBQWlCLElBQUksSUFBSSxFQUFVLENBQUM7UUFDNUMsSUFBSSxTQUFTLEdBQVcsQ0FBQyxDQUFDO1FBRzFCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVDLElBQUksSUFBSSxHQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFbEMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxLQUFLO2dCQUNqQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNsQixJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQzlCLE9BQU8sR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUM5QixTQUFTLEVBQUUsQ0FBQztnQkFFWixJQUFJLFNBQVMsS0FBSyxTQUFTO29CQUN6QixNQUFNO2FBQ1Q7aUJBQ0ksSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO2dCQUV0QixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUs7b0JBQ3hDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVqQyxDQUFDLEVBQUUsQ0FBQztnQkFDSixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoQztTQUNGO1FBR0QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUU5QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFLRCxNQUFNLENBQU8sWUFBWSxDQUFDLGlCQUEwQixFQUFFLGtCQUEyQjs7WUFDL0UsSUFBSSxnQkFBZ0IsR0FBWSxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDbEYsSUFBSSxpQ0FBaUMsR0FBUyxJQUFJLENBQUM7WUFDbkQsSUFBSSxXQUFXLEdBQXNCLFlBQVksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDakYsWUFBWSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFakUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsWUFBWSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUduRCxpQ0FBaUMsR0FBRyxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1lBR25ILElBQUksb0NBQW9DLEdBQW1CLElBQUksUUFBUSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDM0csSUFBSSw0QkFBNEIsR0FBbUIsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEUsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLG9DQUFvQyxFQUFFLDRCQUE0QixFQUFFLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN0SyxpQ0FBaUMsR0FBRyxvQ0FBb0MsQ0FBQyxLQUFLLENBQUM7WUFFL0UsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDM0IsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2pILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7YUFDL0I7WUFFRCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUN4QyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFJbEQsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLENBQUMsRUFBRTtnQkFDN0IsSUFBSSxnQkFBZ0IsR0FBWSxLQUFLLENBQUM7Z0JBQ3RDLElBQUksZ0JBQWdCLEdBQVksSUFBSSxDQUFDO2dCQUlyQyxJQUFJLGlDQUFpQyxLQUFLLElBQUksSUFBSSxpQ0FBaUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQkFDL0YsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO29CQUN4QixZQUFZLENBQUMsYUFBYSxDQUFDLDRCQUE0QixDQUFDLE1BQU0saUNBQWlDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztvQkFJakgsZ0JBQWdCLEdBQUcsTUFBTyxpQ0FBaUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztpQkFDN0U7Z0JBS0QsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxJQUFJLElBQUksZ0JBQWdCLEVBQUU7b0JBQ2pGLFlBQVksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDL0MsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMzRixZQUFZLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUM7aUJBQy9DO2dCQUdELElBQUksZ0JBQWdCO29CQUNsQixZQUFZLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUMxRDtZQUVELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUV0QixNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBR25ELElBQUksZ0JBQWdCLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFO2dCQUN4RSxJQUFJLGdCQUFnQixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRTtvQkFDeEUsWUFBWSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBRWxFLE9BQU8saUNBQWlDLENBQUM7UUFDM0MsQ0FBQztLQUFBO0lBU0QsTUFBTSxDQUFPLDRCQUE0QixDQUFDLGlCQUEwQixFQUFFLGtCQUEyQjs7WUFDL0YsSUFBSSx5QkFBeUIsR0FBbUIsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkUsSUFBSSxpQ0FBaUMsR0FBbUIsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFM0UsSUFBSSxTQUFTLEdBQVcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFN0UsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDakQsSUFBSSxvQkFBb0IsR0FBZSxZQUFZLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUUzRixJQUFJLG9CQUFvQixLQUFLLElBQUk7b0JBQy9CLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSx5QkFBeUIsRUFBRSxpQ0FBaUMsRUFBRSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDbks7WUFFRCxPQUFPLGlDQUFpQyxDQUFDLEtBQUssQ0FBQztRQUNqRCxDQUFDO0tBQUE7SUFXTyxNQUFNLENBQU8sa0JBQWtCLENBQUMsUUFBZ0IsRUFBRSxpQkFBMEIsRUFBRSxrQkFBMkIsRUFBRSx5QkFBeUMsRUFBRSxpQ0FBaUQsRUFBRSxXQUE4Qjs7WUFDN08sSUFBSSxlQUFlLEdBQWUsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRWhGLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsaURBQWlELEVBQUUsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7WUFFNUgseUJBQXlCLENBQUMsS0FBSyxHQUFVLENBQUMsTUFBTSxlQUFlLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUM5RyxJQUFJLGlDQUFpQyxDQUFDLEtBQUssS0FBSyxJQUFJO2dCQUNsRCxpQ0FBaUMsQ0FBQyxLQUFLLEdBQUcseUJBQXlCLENBQUMsS0FBSyxDQUFDO2lCQUN2RSxJQUFJLHlCQUF5QixDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUU7Z0JBQ2pELEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGdEQUFnRCxDQUFDLENBQUM7YUFDdkU7UUFDSCxDQUFDO0tBQUE7SUFHRCxNQUFNLENBQU8sU0FBUyxDQUFDLGlCQUEwQjs7WUFDL0MsSUFBSSxZQUFZLEdBQXNCLE1BQU0sQ0FBQyxZQUFZLENBQUM7WUFDMUQsSUFBSSxXQUFXLEdBQWUsSUFBSSxDQUFDO1lBRW5DLElBQUksWUFBWSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDNUIsSUFBSSxDQUFDLEdBQVcsQ0FBQyxDQUFDO2dCQUNsQixPQUFPLENBQUMsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQy9CLElBQUksTUFBTSxHQUFXLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pDLElBQUksT0FBTyxHQUFZLEtBQUssQ0FBQztvQkFJN0IsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUU7d0JBQ3RCLElBQUksTUFBTSxHQUF5QixNQUFNLENBQUMsY0FBYyxFQUFFLENBQUMsT0FBTyxFQUFHLENBQUMsTUFBTSxDQUFDO3dCQUM3RSxJQUFJLE1BQU0sRUFBRTs0QkFDVixPQUFPLEdBQUcsSUFBSSxDQUFDO3lCQUNoQjtxQkFDRjt5QkFDSTt3QkFDSCxJQUFXLE1BQU0sQ0FBQyxPQUFPLEVBQUcsQ0FBQyx1QkFBdUIsRUFBRSxFQUFFOzRCQUN0RCxPQUFPLEdBQUcsSUFBSSxDQUFDO3lCQUNoQjtxQkFDRjtvQkFFRCxJQUFJLE9BQU8sRUFBRTt3QkFDWCxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUN6QixNQUFNLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDM0M7b0JBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO3dCQUNqQixJQUFJLGlCQUFpQixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7NEJBQ3pDLFdBQVcsR0FBRyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7d0JBRXhDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQzdCOzt3QkFFQyxDQUFDLEVBQUUsQ0FBQztpQkFDUDthQUNGO1FBQ0gsQ0FBQztLQUFBO0lBR0QsTUFBTSxDQUFPLGtCQUFrQjs7WUFFN0IsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ25FLElBQUksR0FBRyxHQUFXLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLFVBQVU7b0JBQ2hDLFNBQVM7Z0JBRVgsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDcEQsSUFBSSxJQUFJLEdBQVMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFFaEMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO3dCQUNqQixJQUFJLE1BQU0sR0FBbUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUU1QyxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUU7NEJBQ3ZGLE1BQU0sQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7NEJBQ3JDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7eUJBQ2pDO3FCQUNGO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDO0tBQUE7SUFNTyxNQUFNLENBQU8sbUJBQW1CLENBQUMsaUJBQTBCOztZQUVqRSxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbkUsSUFBSSxHQUFHLEdBQVcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRXhELElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsVUFBVTtvQkFDaEMsU0FBUztnQkFFWCxJQUFJLFVBQVUsR0FBVyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzdDLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzNDLElBQUksSUFBSSxHQUFTLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hDLElBQUksTUFBTSxHQUFtQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBRTVDLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsbUJBQW1CLEVBQUU7d0JBQ25GLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7d0JBQ25DLElBQUksQ0FBQyxpQkFBaUI7NEJBQ2xCLE1BQU0sWUFBWSxDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDdEU7aUJBQ0Y7YUFDRjtRQUNILENBQUM7S0FBQTs7QUFodUhNLG1CQUFjLEdBQVcsQ0FBQyxDQUFDO0FBRW5CLHNCQUFpQixHQUFZLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGVidWcsIEhhc2hVdGlscywgTGlzdCwgTk51bWJlciwgTlN0cmluZywgUmVmUGFyYW0sIFN0YWNrLCBTdHJpbmdCdWlsZGVyLCBpc051bGxPclVuZGVmaW5lZH0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTG9nZ2VyX0xvZ0xldmVscyxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgVW5pcXVlVHNrU29ydCxcclxuICBXaW5kb3dUeXBlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBDb21tYW5kcyxcclxuICBEYXRhTW9kaWZpY2F0aW9uVHlwZXMsXHJcbiAgRGlzcGxheUNvbnZlcnRvcixcclxuICBFdmVudHMsXHJcbiAgRmllbGREZWYsXHJcbiAgR3VpRGF0YUNvbGxlY3Rpb24sXHJcbiAgSGVscHMsXHJcbiAgSVRhc2ssXHJcbiAgTWFuYWdlcixcclxuICBNZ0NvbnRyb2xCYXNlLFxyXG4gIE1nRm9ybUJhc2UsXHJcbiAgTlVNX1RZUEUsXHJcbiAgUElDLFxyXG4gIFByb3BlcnR5LFxyXG4gIFByb3BJbnRlcmZhY2UsXHJcbiAgUmVjb3JkVXRpbHMsXHJcbiAgUnVudGltZUNvbnRleHRCYXNlLFxyXG4gIFN0eWxlcyxcclxuICBUYXNrRGVmaW5pdGlvbklkXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge0V2ZW50fSBmcm9tICcuLi9ldmVudC9FdmVudCc7XHJcbmltcG9ydCB7RGF0YVZpZXd9IGZyb20gJy4uL2RhdGEvRGF0YVZpZXcnO1xyXG5pbXBvcnQge0R2Q2FjaGV9IGZyb20gJy4uL2RhdGEvRHZDYWNoZSc7XHJcbmltcG9ydCB7TUdEYXRhfSBmcm9tICcuL01HRGF0YSc7XHJcbmltcG9ydCB7RGF0YVZpZXdDb21tYW5kVHlwZX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvRGF0YXZpZXdDb21tYW5kJztcclxuaW1wb3J0IHtDb21tYW5kc1Byb2Nlc3NvckJhc2UsIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb259IGZyb20gJy4uL0NvbW1hbmRzUHJvY2Vzc29yQmFzZSc7XHJcbmltcG9ydCB7VGFza1NlcnZpY2VCYXNlfSBmcm9tICcuL1Rhc2tTZXJ2aWNlQmFzZSc7XHJcbmltcG9ydCB7QXJndW1lbnRzTGlzdH0gZnJvbSAnLi4vcnQvQXJndW1lbnRzTGlzdCc7XHJcbmltcG9ydCB7VGFza1RyYW5zYWN0aW9uTWFuYWdlcn0gZnJvbSAnLi4vZGF0YS9UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyJztcclxuaW1wb3J0IHtEYXRhdmlld01hbmFnZXJ9IGZyb20gJy4uL2RhdGEvRGF0YXZpZXdNYW5hZ2VyJztcclxuaW1wb3J0IHtTb3J0Q29sbGVjdGlvbn0gZnJvbSAnLi9zb3J0L1NvcnRDb2xsZWN0aW9uJztcclxuaW1wb3J0IHtTb3J0fSBmcm9tICcuL3NvcnQvU29ydCc7XHJcbmltcG9ydCB7TWdGb3JtfSBmcm9tICcuLi9ndWkvTWdGb3JtJztcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gJy4uL2d1aS9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQge1JlbW90ZVRhc2tTZXJ2aWNlfSBmcm9tICcuL1JlbW90ZVRhc2tTZXJ2aWNlJztcclxuaW1wb3J0IHtSZXR1cm5SZXN1bHR9IGZyb20gJy4uL3V0aWwvUmV0dXJuUmVzdWx0JztcclxuaW1wb3J0IHtSdW5UaW1lRXZlbnR9IGZyb20gJy4uL2V2ZW50L1J1blRpbWVFdmVudCc7XHJcbmltcG9ydCB7SUNsaWVudENvbW1hbmR9IGZyb20gJy4uL2NvbW1hbmRzL0lDbGllbnRDb21tYW5kJztcclxuaW1wb3J0IHtDb21tYW5kRmFjdG9yeX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvQ29tbWFuZEZhY3RvcnknO1xyXG5pbXBvcnQge0RhdGF2aWV3SGVhZGVyc30gZnJvbSAnLi4vcnQvRGF0YXZpZXdIZWFkZXJzJztcclxuaW1wb3J0IHtUcmFuc2FjdGlvbn0gZnJvbSAnLi4vcnQvVHJhbnNhY3Rpb24nO1xyXG5pbXBvcnQge1Rhc2tzVGFibGV9IGZyb20gJy4vVGFza3NUYWJsZSc7XHJcbmltcG9ydCB7SUNsaWVudFRhcmdldGVkQ29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvSUNsaWVudFRhcmdldGVkQ29tbWFuZCc7XHJcbmltcG9ydCB7SGFuZGxlcnNUYWJsZX0gZnJvbSAnLi4vcnQvSGFuZGxlcnNUYWJsZSc7XHJcbmltcG9ydCB7UmVjb21wdXRlVGFibGV9IGZyb20gJy4uL3J0L1JlY29tcHV0ZVRhYmxlJztcclxuaW1wb3J0IHtFeHBUYWJsZX0gZnJvbSAnLi4vZXhwL0V4cFRhYmxlJztcclxuaW1wb3J0IHtVc2VyRXZlbnRzVGFibGV9IGZyb20gJy4uL2V2ZW50L1VzZXJFdmVudHNUYWJsZSc7XHJcbmltcG9ydCB7Rm9ybXNUYWJsZX0gZnJvbSAnLi4vZ3VpL0Zvcm1zVGFibGUnO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9yUXVldWV9IGZyb20gJy4uL3V0aWwvRmxvd01vbml0b3JRdWV1ZSc7XHJcbmltcG9ydCB7RmllbGR9IGZyb20gJy4uL2RhdGEvRmllbGQnO1xyXG5pbXBvcnQge0FjdGlvbk1hbmFnZXJ9IGZyb20gJy4uL2V2ZW50L0FjdGlvbk1hbmFnZXInO1xyXG5pbXBvcnQge0NvbnN0SW50ZXJmYWNlfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7RXZlbnRIYW5kbGVyfSBmcm9tICcuLi9ldmVudC9FdmVudEhhbmRsZXInO1xyXG5pbXBvcnQge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cC9FeHByZXNzaW9uJztcclxuaW1wb3J0IHtGaWVsZHNUYWJsZUV4dCBhcyBGaWVsZHNUYWJsZX0gZnJvbSAnLi4vZGF0YS9GaWVsZHNUYWJsZSc7XHJcbmltcG9ydCB7R1VJTWFuYWdlcn0gZnJvbSAnLi4vR1VJTWFuYWdlcic7XHJcbmltcG9ydCB7Q29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyfSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3Nvck1hbmFnZXInO1xyXG5pbXBvcnQge1JlY29yZH0gZnJvbSAnLi4vZGF0YS9SZWNvcmQnO1xyXG5pbXBvcnQge0V2ZW50U3ViVHlwZX0gZnJvbSAnLi4vZW51bXMnO1xyXG5pbXBvcnQge09wZW5pbmdUYXNrRGV0YWlscywgVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLCBUYXNrQmFzZSwgVXNlclJhbmdlfSBmcm9tICcuL1Rhc2tCYXNlJztcclxuaW1wb3J0IHtMYW5ndWFnZURhdGF9IGZyb20gJy4uL2Vudi9MYW5ndWFnZURhdGEnO1xyXG5pbXBvcnQge0Vudmlyb25tZW50fSBmcm9tICcuLi9lbnYvRW52aXJvbm1lbnQnO1xyXG5pbXBvcnQge0xhc3RGb2N1c2VkTWFuYWdlcn0gZnJvbSAnLi4vcnQvTGFzdEZvY3VzZWRNYW5hZ2VyJztcclxuaW1wb3J0IHtHbG9iYWxDb21tYW5kc01hbmFnZXJ9IGZyb20gJy4uL0dsb2JhbENvbW1hbmRzTWFuYWdlcic7XHJcbmltcG9ydCB7RXZlbnRzQWxsb3dlZFR5cGV9IGZyb20gJy4uL2V2ZW50L0lFdmVudHNNYW5hZ2VyJztcclxuaW1wb3J0IHtDcmVhdGVkRm9ybVZlY3Rvcn0gZnJvbSAnLi4vZ3VpL0NyZWF0ZWRGb3JtVmVjdG9yJztcclxuaW1wb3J0IHtBY2Nlc3NIZWxwZXJ9IGZyb20gJy4uL0FjY2Vzc0hlbHBlcic7XHJcbmltcG9ydCB7SU1HRGF0YUNvbGxlY3Rpb259IGZyb20gJy4vSU1HRGF0YUNvbGxlY3Rpb24nO1xyXG5pbXBvcnQge01HRGF0YUNvbGxlY3Rpb259IGZyb20gJy4vTUdEYXRhQ29sbGVjdGlvbic7XHJcbmltcG9ydCB7UmVtb3RlQ29tbWFuZHNQcm9jZXNzb3J9IGZyb20gXCIuLi9yZW1vdGUvUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3JcIjtcclxuaW1wb3J0IHtFdmVudEhhbmRsZXJQb3NpdGlvbn0gZnJvbSAnLi4vZXZlbnQvRXZlbnRIYW5kbGVyUG9zaXRpb24nO1xyXG5cclxuZXhwb3J0IGVudW0gVGFza19GbG93IHtcclxuICBOT05FLFxyXG4gIFNURVAsXHJcbiAgRkFTVFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBUYXNrX0RpcmVjdGlvbiB7XHJcbiAgQkFDSyA9IC0xLFxyXG4gIE5PTkUsXHJcbiAgRk9SRVxyXG59XHJcblxyXG5lbnVtIEZsb3dNb2RlRGlyIHtcclxuICBOT05FID0gJyAnLFxyXG4gIEZBU1RfQkFDS1dBUkQgPSAnUicsXHJcbiAgRkFTVF9GT1JXQVJEID0gJ0YnLFxyXG4gIFNURVBfQkFDS1dBUkQgPSAnUCcsXHJcbiAgU1RFUF9GT1JXQVJEID0gJ04nXHJcbn1cclxuXHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBUYXNrIGV4dGVuZHMgVGFza0Jhc2Uge1xyXG4gIHByaXZhdGUgX2R2Q2FjaGU6IER2Q2FjaGUgPSBudWxsO1xyXG4gIHByaXZhdGUgX21nRGF0YTogTUdEYXRhID0gbnVsbDtcclxuICBwcml2YXRlIF9hYm9ydGluZzogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGlmIGFuIGFib3J0IGNvbW1hbmQgd2FzIGV4ZWN1dGVkIGZvciB0aGlzIHRhc2sgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnNcclxuICBwcml2YXRlIF9iRXhlY0VuZFRhc2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc1N0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9ldmFsT2xkVmFsdWVzOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgZm9yIHRoZSBnZXQgdmFsdWUgdG8gZ2V0IHRoZSBvbGQgdmFsdWUgb2YgdGhlIGZpZWxkXHJcbiAgcHJpdmF0ZSBfaW5SZWNvcmRTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgLy8gaW5kaWNhdGUgd2UgYXJlIGluIHJlY29yZCBzdWZmaXggKGhhbmRsZSBiZWZvcmUpXHJcbiAgcHJpdmF0ZSBfY2FuY2VsV2FzUmFpc2VkOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgLy8gd2FzIGNhbmNlbC9xdWl0IGV2ZW50IHJhaXNlZCA/XHJcbiAgcHJpdmF0ZSBfY291bnRlcjogbnVtYmVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVhc2VzIG9ubHkgaW4gbm9uIGludGVydmFsIHRhc2tzLlxyXG4gIHByaXZhdGUgX2N1cnJTdGFydFByb2dMZXZlbDogbnVtYmVyID0gMDsgICAgICAgICAgICAgIC8vIHRoZSBsZXZlbCBvZiBzdGFydFByb2cgcmVxdWVzdCBpbiB3aGljaCB3ZSB0YXNrIGlzIHN0YXJ0ZWRcclxuICBwcml2YXRlIF9kZXN0aW5hdGlvblN1YmZvcm06IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAvLyBpZiBUUlVFLCB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFza1xyXG4gIHByaXZhdGUgX2VuYWJsZVpvb21IYW5kbGVyOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgIC8vIGlmIFRSVUUsIHRoZXJlIGlzIGEgem9vbSBoYW5kbGVyIGZvciB0aGlzIGZpZWxkXHJcbiAgcHJpdmF0ZSBfZmlyc3RSZWNvcmRDeWNsZTogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGluIHRoZSBmaXJzdCByZWNvcmQgY3ljbGVcclxuICBwcml2YXRlIF9vcmlnaW5hbFRhc2tNb2RlOiBzdHJpbmcgPSAnICc7XHJcbiAgcHJpdmF0ZSBfaW5DcmVhdGVMaW5lOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgLy8gaXMgdGhlIHRhc2sgaW50byBwcm9jZXNzaW5nIENSRUFURSBMSU5FXHJcbiAgcHVibGljIEluU2VsZWN0OiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWUgd2hlbiB0aGUgdGFzayBpcyBleGVjdXRpbmcgYSBTRUxFQ1QgaW50ZXJuYWwgZXZlbnRcclxuICBwdWJsaWMgSW5TdGFydFByb2Nlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0Rlc3RpbmF0aW9uQ2FsbDogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAvLyBpZiBUUlVFLCB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFzayBieSBjYWxsIG9wZXJhdGlvblxyXG4gIHByaXZhdGUgX2tub3duVG9TZXJ2ZXI6IGJvb2xlYW4gPSB0cnVlOyAgICAgICAgICAgICAgIC8vIEZhbHNlIGlmIHRoZSBzZXJ2ZXIgaGFzXHJcbiAgcHJpdmF0ZSBfbG9vcFN0YWNrOiBTdGFjazxudW1iZXI+ID0gbnVsbDtcclxuICBwcml2YXRlIGFsbG93UmVtb3RlQ21kRXhlY3V0aW9uOiBib29sZWFuO1xyXG4gIHB1YmxpYyBEZWxheUNvbW1hbmRFeGVjdXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8vPHN1bW1hcnk+XHJcbiAgLy8vIFRoaXMgaXMgdGhlIHRhc2sgd2hpY2ggaW52b2tlZCB0aGUgaGFuZGxlciBjb250YWluaW5nIHRoZSBDYWxsIG9wZXJhdGlvbi5cclxuICAvLy8gVGhpcyBtZW1iZXIgaXMgdXNlZCBmb3Igc2VhcmNoaW5nIHRoZSB2YXJpYWJsZXMgbGlrZSBWYXJJbmRleCgpLCBldGNcclxuICAvLy88L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBfcGFyZW50VGFzazogVGFzayA9IG51bGw7XHJcblxyXG4gIHB1YmxpYyBnZXQgUGFyZW50VGFzaygpOiBUYXNrQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBDb250ZXh0VGFzazogVGFzayA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlciBjb250ZXh0IG9mIHdoaWNoIHRhc2sgdGhpcyB0YXNrIGlzIGN1cnJlbnRseSBydW5uaW5nXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBUaGlzIGlzIHNhbWUgYXMgX3BhcmVudFRhc2sgZXhjZXB0IGZvciBNb2RhbCB0YXNrcy4gSW4gY2FzZSwgdGhlIGN1cnJlbnQgdGFzayBpcyBtb2RhbCwgX3RyaWdnZXJpbmdUYXNrIHJlZmVycyB0b1xyXG4gIC8vLyAgdGhlIHRhc2sgd2hpY2ggaW52b2tlZCB0aGUgaGFuZGxlciBvZiB0aGUgX3BhcmVudFRhc2suIFRoaXMgbWVtYmVyIGlzIHVzZWQgZm9yIGFsbCBnZW5lcmF0aW9uLWJhc2VkIGZ1bmN0aW9ucyBhbmQgUHJvZygpLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBfdHJpZ2dlcmluZ1Rhc2s6IFRhc2sgPSBudWxsOyAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSB0YXNrIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYW5kbGVyIHdoaWNoIGNyZWF0ZWQgbWVcclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBpcyB0aGUgdGFzayB3aGljaCBjb250YWluZWQgdGhlIENhbGwgb3BlcmF0aW9uLiBJZiB0aGUgdGFzayB3YXMgZXhlY3V0ZWQgd2l0aG91dCBjYWxsXHJcbiAgLy8vICAgb3BlcmF0aW9uIGVnLiB0aGUgTVAsIHRoZSBzdGFydHVwIHByb2dyYW0sIGV0Yy4sIGl0IHJlZmVycyB0byBpdHNlbGYuIFRoaXMgbWVtYmVyIHVzZWQgdG8gc2VhcmNoIGZvciB0aGUgZXZlbnQgaGFuZGxlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBQYXRoUGFyZW50VGFzazogVGFzayA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgX3ByZXZlbnRDb250cm9sQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcHJldmVudFJlY29yZFN1ZmZpeDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3Rhc2tQYXRoOiBMaXN0PFRhc2s+ID0gbnVsbDtcclxuXHJcbiAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIGlzIGN1cnJlbnRseSB0cnlpbmcgdG8gY29tbWl0IGEgZHluYW1pY0RlZi50cmFuc2FjdGlvblxyXG4gIHByaXZhdGUgX3RyeWluZ1RvQ29tbWl0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHNldCBUcnlpbmdUb0NvbW1pdCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fdHJ5aW5nVG9Db21taXQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBUcnlpbmdUb0NvbW1pdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl90cnlpbmdUb0NvbW1pdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VzZUxvb3BTdGFjazogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIChMT09QQ09VTlRFUigpKSBpcyBpbiB0aGUgc2NvcGUgb2YgQmxvY2sgTG9vcC5cclxuICBwcml2YXRlIF9pblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFza1NhdmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBJbkhhbmRsZUFjdENhbmNlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBSdW50aW1lU29ydHM6IFNvcnRDb2xsZWN0aW9uID0gbnVsbDtcclxuICBwdWJsaWMgVmV3Rmlyc3Q6IG51bWJlciA9IDA7XHJcbiAgcHVibGljIGRhdGFWaWV3Q29udGVudDogc3RyaW5nID0gbnVsbDsgICAgICAgICAgICAgICAgLy8gZGF0YVZpZXdDb250ZW50IHJldHJpZXZlZCBieSBHZXREYXRhVmlld0NvbnRlbnQgY29tbWFuZC5cclxuICBwdWJsaWMgUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeDogYm9vbGVhbiA9IGZhbHNlOyAgICAvLyBJbiByZWNvcmQgcHJlZml4IChjb21tb25IYW5kbGVyQmVmb3JlKSB3ZSBleGVjdXRlIHJlY29yZCBwcmVmaXggb2YgYWxsIGZhdGhlcnMuXHJcblxyXG4gIC8vIEJ1dCB3ZSBkbyBub3QgbmVlZCBpdCBpbiBhbGwgY2FzZXMuXHJcbiAgLy8gV2hlbiB3ZSByZXR1cm4gZnJvbSB0aGUgc2VydmVyIHdlIGRvIG5vdCBuZWVkIGl0LlxyXG4gIC8vIFdoZW4gd2UgY2xpY2sgb24gdGhlIG5lc3RlZCBzdWJmb3JtIHdlIG5lZWQgaXQuXHJcbiAgLy8gaWYgdHJ1ZSwgZG8gdGhlIHBhcmVudCBzdWJmb3JtIHJlY29yZCBwcmVmaXhcclxuXHJcbiAgLy8gLTEg4oCTIFRoZSB0YXNrIGlzIG5vdCBleGVjdXRlZCBhcyBhIHN1YmZvcm1cclxuICAvLyAgMCDigJMgVGhlIHRhc2sgaXMgZXhlY3V0ZWQgYnkgc2V0dGluZyB0aGUgZm9jdXMgb24gaXRcclxuICAvLyAgMSDigJMgVGhlIHN1YnRhc2sgaXMgZXhlY3V0ZWQgZm9yIHRoZSBmaXJzdCB0aW1lXHJcbiAgLy8gIDIg4oCTIFRoZSB0YXNrIGlzIGV4ZWN1dGVkIGJlY2F1c2UgdGhlIEF1dG9tYXRpYyBSZWZyZXNoIHByb3BlcnR5XHJcbiAgLy8gICAgICBvciB0aGUgU3ViZm9ybSBSZWZyZXNoIGV2ZW50IGhhcyBiZWVuIHRyaWdnZXJlZFxyXG4gIHB1YmxpYyBNb2RlQXNQYXJlbnQ6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0YXNrIG1vZGUgaXMgJ0FzIFBhcmVudCcgd2UgbmVlZCB0byBjYXJlIG91dCBpdCBzcGVjaWZpY2FsbHlcclxuICBwdWJsaWMgVGFza1RyYW5zYWN0aW9uTWFuYWdlcjogVGFza1RyYW5zYWN0aW9uTWFuYWdlciA9IG51bGw7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBzdWJmb3JtIG11c3QgYmUgcmVmcmVzaGVkIG9uIHRoZSBjbGllbnQuXHJcbiAgLy8vIFJlbGV2YW50IG9ubHkgZm9yIG5vbi1vZmZsaW5lIHdpdGggbG9jYWwgZGF0YS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBFeGVjdXRlQ2xpZW50U3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBleGVjdXRlcyBDb21tb25IYW5kbGVyQmVmb3JlIG1ldGhvZC5cclxuICAvLy8gRm9yIHN1YmZvcm1zIHdlIGRvIG5vdCBleGVjdXRlIGl0J3MgUlAgaWYgdGhlIHBhcmVudCBkaWRuJ3QgZmluaXNoZWQgeWV0XHJcbiAgLy8vIGl0J3MgQ29tbWFuZEhhbmRsZXJCZWZvcmUgbWV0aG9kLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIEluQ29tbW9uSGFuZGxlckJlZm9yZVJQOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0cmlldmUgYW5kIHJldHVybiBhIHNlcnZpY2Ugb2JqZWN0IGNvbnRhaW5pbmcgZnVuY3Rpb25hbGl0eSB0aGF0IGlzIGRpZmZlcmVudCBpbiB0aGUgdGFzayBsZXZlbCBiZXR3ZWVuIGNvbm5lY3RlZCBhbmQgb2ZmbGluZSBzdGF0ZXMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIF90YXNrU2VydmljZTogVGFza1NlcnZpY2VCYXNlID0gbnVsbDtcclxuXHJcbiAgZ2V0IFRhc2tTZXJ2aWNlKCk6IFRhc2tTZXJ2aWNlQmFzZSB7XHJcbiAgICBpZiAodGhpcy5fdGFza1NlcnZpY2UgPT0gbnVsbClcclxuICAgICAgdGhpcy5fdGFza1NlcnZpY2UgPSBuZXcgUmVtb3RlVGFza1NlcnZpY2UoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fdGFza1NlcnZpY2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHJpZXZlIGFuZCByZXR1cm4gYSBjb21tYW5kcyBwcm9jZXNzb3IgZGVwZW5kaW5nIG9uIHRhc2sgdHlwZSBhbmQgc3RhdGUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgZ2V0IENvbW1hbmRzUHJvY2Vzc29yKCk6IENvbW1hbmRzUHJvY2Vzc29yQmFzZSB7XHJcbiAgICByZXR1cm4gQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc0xvY2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgdGFza0RlZmluaXRpb25JZDogVGFza0RlZmluaXRpb25JZCA9IG51bGw7XHJcbiAgcHVibGljIEFyZ3VtZW50c0xpc3Q6IEFyZ3VtZW50c0xpc3QgPSBudWxsOyAgICAgICAgICAgLy8gb2ZmLWxpbmUgZXhlY3V0aW9uIC0gdGFzayBhcmd1bWVudCwgdG8gZW5hYmxlIHRoZSB1cGRhdGUgb2YgZmllbGQgdmFsdWVzXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcGFyZW50IHRhc2sgb2YgdGhlIHN1YnRhc2sgYnkgdG9vbGtpdCB0cmVlIGluY2x1ZGUgdGhlIG1haW4gcHJvZ3JhbS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBMb2dpY2FsU3R1ZGlvUGFyZW50VGFzaygpOiBUYXNrIHtcclxuICAgIGlmICh0aGlzLlN0dWRpb1BhcmVudFRhc2sgPT09IG51bGwgJiYgIXN1cGVyLmlzTWFpblByb2coKSkge1xyXG4gICAgICByZXR1cm4gPFRhc2s+R3VpRGF0YUNvbGxlY3Rpb24uTUdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCh0aGlzLkNvbnRleHRJRCwgdGhpcy5fY3RsSWR4KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gPFRhc2s+dGhpcy5TdHVkaW9QYXJlbnRUYXNrO1xyXG4gIH1cclxuXHJcbiAgZ2V0IEtub3duVG9TZXJ2ZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fa25vd25Ub1NlcnZlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBDb25maXJtVXBkYXRlTm86IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAgICAvLyBvbmx5IGZvciBjb25maXJtcyB1cGRhdGVcclxuICBwdWJsaWMgRGF0YVN5bmNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBVbmlxdWVTb3J0OiBVbmlxdWVUc2tTb3J0ID0gbnVsbDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdGhlIHRyYW5zYWN0aW9uIG5lZWQgdG8gYmUgb24gdGhlIGRhdGEgdmlldyBtYW5hZ2VyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXQgVHJhbnNhY3Rpb24odmFsdWU6IFRyYW5zYWN0aW9uKSB7XHJcbiAgICB0aGlzLkRhdGF2aWV3TWFuYWdlci5DdXJyZW50RGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xyXG4gICAgcmV0dXJuIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkN1cnJlbnREYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgUmVmcmVzaE9uVmFyczogbnVtYmVyW10gPSBudWxsO1xyXG4gIHB1YmxpYyBEdlBvc0Rlc2NyaXB0b3I6IExpc3Q8c3RyaW5nW10+ID0gbnVsbDtcclxuICBwdWJsaWMgU3ViVGFza3M6IFRhc2tzVGFibGUgPSBudWxsO1xyXG4gIHB1YmxpYyBFeHBUYWI6IEV4cFRhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgVXNlckV2dFRhYjogVXNlckV2ZW50c1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgRGF0YXZpZXdIZWFkZXJzVGFibGU6IERhdGF2aWV3SGVhZGVycyA9IG51bGw7XHJcbiAgcHVibGljIEhhbmRsZXJzVGFiOiBIYW5kbGVyc1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgX2Zvcm1zOiBGb3Jtc1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBwdWJsaWMgUHVibGljTmFtZTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFzayBzdWZmaXggd2FzIHBlcmZvcm1lZCBmb3IgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgVGFza1N1ZmZpeEV4ZWN1dGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGdldCBUYXNrRGVmaW5pdGlvbklkKCk6IFRhc2tEZWZpbml0aW9uSWQge1xyXG4gICAgaWYgKHRoaXMudGFza0RlZmluaXRpb25JZCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnRhc2tEZWZpbml0aW9uSWQgPSBuZXcgVGFza0RlZmluaXRpb25JZCh0aGlzLl9jdGxJZHgsIHRoaXMuUHJvZ3JhbUlzbiwgdGhpcy5UYXNrSXNuLCB0aGlzLl9pc1ByZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50YXNrRGVmaW5pdGlvbklkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFJldHJ1blZhbHVlRXhwOiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyBTdWJmb3JtQ29udHJvbDogTWdDb250cm9sID0gbnVsbDtcclxuXHJcbiAgc3RhdGljIFN0YXJ0UHJvZ0xldmVsOiBudW1iZXIgPSAwOyAgLy8gcmVjdXJzaXZlIGxldmVsIG9mIFwic3RhcnRQcm9nXCIgaW52b2NhdGlvbnNcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2lkbGVUaW1lclN0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgc3RhdGljIGdldCBJc0Jsb2NraW5nQmF0Y2goKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENUT1JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IocGFyZW50OiBUYXNrKTtcclxuICBjb25zdHJ1Y3RvcihwYXJlbnQ/OiBUYXNrKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChwYXJlbnQpKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEocGFyZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlciA9IG5ldyBBY3Rpb25NYW5hZ2VyKHRoaXMpO1xyXG4gICAgdGhpcy5EYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzKTtcclxuICAgIHRoaXMuX2Zsb3dNb25pdG9yID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuICAgIHRoaXMuQ29udGV4dFRhc2sgPSB0aGlzO1xyXG4gICAgdGhpcy5fZHZDYWNoZSA9IG5ldyBEdkNhY2hlKHRoaXMpO1xyXG4gICAgdGhpcy5QZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4ID0gdHJ1ZTtcclxuICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyID0gbmV3IERhdGF2aWV3TWFuYWdlcih0aGlzKTtcclxuICAgIHRoaXMuYWxsb3dSZW1vdGVDbWRFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgdGhpcy5UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyID0gbmV3IFRhc2tUcmFuc2FjdGlvbk1hbmFnZXIodGhpcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YVZpZXcuSW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKHBhcmVudDogVGFzayk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICB0aGlzLlBhdGhQYXJlbnRUYXNrID0gcGFyZW50O1xyXG4gICAgdGhpcy5fcGFyZW50VGFzayA9IHBhcmVudDtcclxuICAgIHRoaXMuX3RyaWdnZXJpbmdUYXNrID0gbnVsbDtcclxuICAgIHRoaXMuYnVpbGRUYXNrUGF0aCgpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIENyZWF0ZVRhc2soKTogVGFza0Jhc2Uge1xyXG4gICAgbGV0IHRhc2sgPSAgbmV3IFRhc2soKTtcclxuICAgIHRhc2suSW5pdCgpO1xyXG4gICAgcmV0dXJuIHRhc2s7XHJcbiAgfVxyXG5cclxuICAvLyBJVGFzayBNZW1iZXJzXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRlbGxzIHdoZXRoZXIgdGhlIHRhc2sgaXMgYWJvcnRpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzQWJvcnRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWJvcnRpbmc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkVGFza1BhdGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLl90YXNrUGF0aCA9IG5ldyBMaXN0PFRhc2s+KCk7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VGFzay5fdGFza1BhdGggIT09IG51bGwpXHJcbiAgICAgIHRoaXMuX3Rhc2tQYXRoLkFkZFJhbmdlKHRoaXMuX3BhcmVudFRhc2suX3Rhc2tQYXRoLkdldEVudW1lcmF0b3IoKSk7XHJcbiAgICB0aGlzLl90YXNrUGF0aC5wdXNoKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgdGFzayBkYXRhIGJ5IHBhcnNpbmcgdGhlIHhtbCBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdkXCI+cmVmZXJlbmNlIHRvIE1HRGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib3BlbmluZ1Rhc2tEZXRhaWxzXCI+YWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiBvcGVuaW5nIHRhc2s8L3BhcmFtPlxyXG4gIGFzeW5jIGZpbGxEYXRhKG1nZDogTUdEYXRhLCBvcGVuaW5nVGFza0RldGFpbHM6IE9wZW5pbmdUYXNrRGV0YWlscyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gSWYgdGhpcyB0YXNrIHdhcyBvcGVuZWQgYnkgYW4gXCJvcGVuIHdpbmRvd1wiIGNvbW1hbmQgLSBjb25uZWN0IGhpbSB0byBpdHMgcGFyZW50XHJcbiAgICBpZiAoIXN1cGVyLmlzTWFpblByb2coKSkge1xyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VGFzayA9PT0gbnVsbCAmJiBvcGVuaW5nVGFza0RldGFpbHMuQ2FsbGluZ1Rhc2sgIT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9wYXJlbnRUYXNrID0gPFRhc2s+b3BlbmluZ1Rhc2tEZXRhaWxzLkNhbGxpbmdUYXNrO1xyXG4gICAgICAgIHRoaXMuYnVpbGRUYXNrUGF0aCgpO1xyXG4gICAgICAgICg8VGFzaz5vcGVuaW5nVGFza0RldGFpbHMuQ2FsbGluZ1Rhc2spLmFkZFN1YlRhc2sodGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuUGF0aFBhcmVudFRhc2sgPT09IG51bGwgJiYgb3BlbmluZ1Rhc2tEZXRhaWxzLlBhdGhQYXJlbnRUYXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5QYXRoUGFyZW50VGFzayA9IDxUYXNrPm9wZW5pbmdUYXNrRGV0YWlscy5QYXRoUGFyZW50VGFzaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gZm9yIE1HX0FDVF9aT09NIGFjdGlvbiBlbmFibGVcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrICE9PSBudWxsICYmIHRoaXMuX3BhcmVudFRhc2suZ2V0RW5hYmxlWm9vbUhhbmRsZXIoKSkge1xyXG4gICAgICB0aGlzLnNldEVuYWJsZVpvb21IYW5kbGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fbWdEYXRhID0gbWdkO1xyXG4gICAgdGhpcy5maWxsQXR0cmlidXRlcygpO1xyXG5cclxuICAgIHRoaXMuX21nRGF0YS5hZGRUYXNrKHRoaXMpO1xyXG5cclxuICAgIGxldCBwYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlID0gKHRoaXMuX3BhcmVudFRhc2sgIT09IG51bGwpID8gdGhpcy5fcGFyZW50VGFzay5nZXRGb3JtKCkgOiBudWxsO1xyXG5cclxuICAgIHdoaWxlIChhd2FpdCB0aGlzLmluaXRJbm5lck9iamVjdHMoUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXROZXh0VGFnKCksIHBhcmVudEZvcm0pKSB7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyLlByZXBhcmVUcmFuc2FjdGlvblByb3BlcnRpZXModGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uLCBmYWxzZSk7XHJcblxyXG4gICAgdGhpcy5IYW5kbGVUcmlnZ2VyVGFzaygpO1xyXG4gICAgdGhpcy5IYW5kbGVQcmV2aW91c2x5QWN0aXZlVGFza0lkKCk7XHJcblxyXG4gICAgLy8gU2V0IGlzU3ViZm9ybSBmbGFnXHJcbiAgICB0aGlzLkNoZWNrQW5kU2V0U3ViRm9ybSgpO1xyXG5cclxuICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAvLyBnZXQgdGhlIHN1YmZvcm0gY29udHJvbCBmcm9tIHRoZSBwYXJlbnQgdGFza1xyXG4gICAgICBsZXQgc3ViRm9ybUN0cmw6IE1nQ29udHJvbCA9ICg8TWdGb3JtPnRoaXMuZ2V0UGFyZW50KCkuZ2V0Rm9ybSgpKS5nZXRTdWJGb3JtQ3RybEZvclRhc2sodGhpcy5fdGFza1RhZyk7XHJcbiAgICAgIGlmIChzdWJGb3JtQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHN1YkZvcm1DdHJsLnNldFN1YmZvcm1UYXNrSWQodGhpcy5fdGFza1RhZyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHVwZGF0ZSB0aGUgZm9ybSB3aXRoIHRoZSBzdWJmb3JtIGNvbnRyb2wgZnJvbSB0aGUgcGFyZW50IHRhc2tcclxuICAgICAgaWYgKHRoaXMuRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgICg8TWdGb3JtPnRoaXMuRm9ybSkuc2V0U3ViRm9ybUN0cmwoc3ViRm9ybUN0cmwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gaGFuZGxlIHRoZSBQcmV2aW91c2x5QWN0aXZlVGFza0lkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBIYW5kbGVQcmV2aW91c2x5QWN0aXZlVGFza0lkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT09IG51bGwgJiYgdGhpcy5fcGFyZW50VGFzay5HZXRDb250ZXh0VGFzaygpICE9PSBudWxsICYmIHRoaXMuX21nRGF0YSAhPT0gdGhpcy5fcGFyZW50VGFzay5nZXRNR0RhdGEoKSlcclxuICAgICAgdGhpcy5QcmV2aW91c2x5QWN0aXZlVGFza0lkID0gKHRoaXMuX3BhcmVudFRhc2suR2V0Q29udGV4dFRhc2soKSkuZ2V0VGFza1RhZygpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5fcGFyZW50VGFzayAhPT0gbnVsbClcclxuICAgICAgdGhpcy5QcmV2aW91c2x5QWN0aXZlVGFza0lkID0gdGhpcy5fcGFyZW50VGFzay5nZXRUYXNrVGFnKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGhhbmRsZSB0aGUgdHJpZ2dlciB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBIYW5kbGVUcmlnZ2VyVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RyaWdnZXJpbmdUYXNrID0gdGhpcy5fcGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIEZpbGxUYXNrVGFibGVzKHRhc2tUYWJsZXNEYXRhOiBzdHJpbmcpOiB2b2lkO1xyXG4gIEZpbGxUYXNrVGFibGVzKCk6IHZvaWQ7XHJcbiAgRmlsbFRhc2tUYWJsZXModGFza1RhYmxlc0RhdGE/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHRoaXMuRmlsbFRhc2tUYWJsZXNfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLkZpbGxUYXNrVGFibGVzXzEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgRmlsbFRhc2tUYWJsZXNfMCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHRhc2sgYXR0cmlidXRlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZmlsbEF0dHJpYnV0ZXMoKTogdm9pZCB7XHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICBzdXBlci5maWxsQXR0cmlidXRlcyhwYXJzZXIpO1xyXG5cclxuICAgICAgLy8gUUNSICM3NTk5MTE6IG1wcmcgbXVzdCBiZWxvbmcgdG8gdGhlIG1haW4gYXBwbGljYXRpb24ncyBNR0RhdGEuXHJcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBpdCB3aWxsIG5vdCBiZSBkaXNjYXJkZWQgdW50aWwgdGhlIGVuZCBvZiBleGVjdXRpb24uXHJcbiAgICAgIGlmIChzdXBlci5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgdGhpcy5fbWdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBUYXNrLmZpbGxBdHRyaWJ1dGVzKCkgb3V0IG9mIHN0cmluZyBib3VuZHNcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB0YXNrIGF0dHJpYnV0ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBzZXRBdHRyaWJ1dGUoYXR0cmlidXRlOiBzdHJpbmcsIHZhbHVlU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RhZ1Byb2Nlc3NlZDogYm9vbGVhbjtcclxuICAgIGlzVGFnUHJvY2Vzc2VkID0gc3VwZXIuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWVTdHIpO1xyXG4gICAgaWYgKCFpc1RhZ1Byb2Nlc3NlZCkge1xyXG4gICAgICBpc1RhZ1Byb2Nlc3NlZCA9IHRydWU7XHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFRlJFU0hPTjpcclxuICAgICAgICAgIGlmICghKHZhbHVlU3RyLnRyaW0oKSA9PT0gXCJcIikpXHJcbiAgICAgICAgICAgIHRoaXMuU2V0UmVmcmVzaE9uVmFycyh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX05BTUU6XHJcbiAgICAgICAgICB0aGlzLk5hbWUgPSB2YWx1ZVN0cjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EVlBPU19ERUM6XHJcbiAgICAgICAgICBpZiAoISh2YWx1ZVN0ci50cmltKCkgPT09IFwiXCIpKVxyXG4gICAgICAgICAgICB0aGlzLnNldERlc2NyaXB0b3IodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0hBU19MT0NBVEU6XHJcbiAgICAgICAgICB0aGlzLmhhc0xvY2F0ZSA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQVNfUEFSRU5UOlxyXG4gICAgICAgICAgdGhpcy5Nb2RlQXNQYXJlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tfVU5JUVVFX1NPUlQ6XHJcbiAgICAgICAgICB0aGlzLlVuaXF1ZVNvcnQgPSA8VW5pcXVlVHNrU29ydD52YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UUkFOU19JRDpcclxuICAgICAgICAgIHRoaXMuc2V0UmVtb3RlVHJhbnNhY3Rpb24odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1BVQkxJQzpcclxuICAgICAgICAgIHRoaXMuUHVibGljTmFtZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lTX09GRkxJTkU6XHJcbiAgICAgICAgICB0aGlzLklzT2ZmbGluZSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfUkVUVVJOX1ZBTFVFX0VYUDpcclxuICAgICAgICAgIHRoaXMuUmV0cnVuVmFsdWVFeHAgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTUVOVVNfRklMRV9OQU1FOlxyXG4gICAgICAgICAgLy8gVE9ETyAtIG5vdCB0byBzZXJpYWxpemUgW1N0b3J5IDE1NDU0N11cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpc1RhZ1Byb2Nlc3NlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghaXNUYWdQcm9jZXNzZWQpXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcIlVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICd7MH0nXCIsIGF0dHJpYnV0ZSkpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVG8gYWxsb2NhdGUgYW5kIGZpbGwgaW5uZXIgb2JqZWN0cyBvZiB0aGUgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm91bmRUYWdOYW1lXCI+cG9zc2libGUgdGFnIG5hbWUgLCBuYW1lIG9mIG9iamVjdCwgd2hpY2ggbmVlZCBiZSBhbGxvY2F0ZWQ8L3BhcmFtPlxyXG4gIGFzeW5jIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcsIHBhcmVudEZvcm06IE1nRm9ybUJhc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlcjtcclxuICAgIHN3aXRjaCAoZm91bmRUYWdOYW1lKSB7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19IRUxQVEFCTEU6XHJcbiAgICAgICAgaWYgKHRoaXMuX2hlbHBUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuX2hlbHBUYWIgPSBuZXcgSGVscHMoKTtcclxuXHJcbiAgICAgICAgaWYgKEV2ZW50cy5TaG91bGRMb2coTG9nZ2VyX0xvZ0xldmVscy5EZXZlbG9wbWVudCkpXHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSAuLi5cIiwgZm91bmRUYWdOYW1lKSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2hlbHBUYWIuZmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19EVkhFQURFUjpcclxuICAgICAgICBpZiAoRXZlbnRzLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLkRldmVsb3BtZW50KSlcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiezB9IC4uLlwiLCBmb3VuZFRhZ05hbWUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5EYXRhVmlldy5maWxsSGVhZGVyRGF0YShwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1A6XHJcbiAgICAgICAgdGhpcy5fcHJvcFRhYi5maWxsRGF0YSh0aGlzLCAnVCcsIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfRk9STTpcclxuICAgICAgICB0aGlzLkZvcm0gPSB0aGlzLkZvcm1Jbml0RGF0YShwYXJlbnRGb3JtKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTUVOVV9DT05URU5UOlxyXG4gICAgICAgIC8vIFRPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiYXNzZW1ibGllc1wiOlxyXG4gICAgICAgIGxldCBzdGFydDogbnVtYmVyID0gcGFyc2VyLmdldEN1cnJJbmRleCgpO1xyXG4gICAgICAgIGxldCBlbmRDb250ZXh0ID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKCcvYXNzZW1ibGllcycsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0KTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfRk9STVM6XHJcbiAgICAgICAgdGhpcy5fZm9ybXMgPSBuZXcgRm9ybXNUYWJsZSh0aGlzLCBwYXJlbnRGb3JtKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSAuLi5cIiwgZm91bmRUYWdOYW1lKSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fZm9ybXMuZmlsbERhdGEoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0s6XHJcbiAgICAgICAgaWYgKHRoaXMuU3ViVGFza3MgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuU3ViVGFza3MgPSBuZXcgVGFza3NUYWJsZSgpO1xyXG4gICAgICAgIGxldCBzdWJ0YXNrID0gbmV3IFRhc2sodGhpcyk7XHJcbiAgICAgICAgc3VidGFzay5Jbml0KCk7XHJcbiAgICAgICAgdGhpcy5TdWJUYXNrcy5hZGRUYXNrKHN1YnRhc2spO1xyXG4gICAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IHRoaXMuX21nRGF0YTtcclxuICAgICAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgICBtZ2QgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0TUdEYXRhRm9yU3RhcnR1cFByb2dyYW0oKTtcclxuICAgICAgICBhd2FpdCBzdWJ0YXNrLmZpbGxEYXRhKG1nZCwgbmV3IE9wZW5pbmdUYXNrRGV0YWlscygpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTDpcclxuICAgICAgICBhd2FpdCBUYXNrLlByb2Nlc3NUYXNrVVJMKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VYUFRBQkxFOlxyXG4gICAgICAgIGlmICh0aGlzLkV4cFRhYiA9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5FeHBUYWIgPSBuZXcgRXhwVGFibGUoKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gZXhwXCIpO1xyXG4gICAgICAgIHRoaXMuRXhwVGFiLmZpbGxEYXRhKHRoaXMsIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1VTRVJfRVZFTlRTOlxyXG4gICAgICAgIGlmICh0aGlzLlVzZXJFdnRUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuVXNlckV2dFRhYiA9IG5ldyBVc2VyRXZlbnRzVGFibGUoKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gdXNlciBldmVudCB0YWJcIik7XHJcbiAgICAgICAgdGhpcy5Vc2VyRXZ0VGFiLmZpbGxEYXRhKHRoaXMsIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0xJTktTOlxyXG4gICAgICAgIHRoaXMuRGF0YXZpZXdIZWFkZXJzVGFibGUgPSBuZXcgRGF0YXZpZXdIZWFkZXJzKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuRGF0YXZpZXdIZWFkZXJzVGFibGUuZmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfU09SVFM6XHJcbiAgICAgICAgdGhpcy5SdW50aW1lU29ydHMgPSBuZXcgU29ydENvbGxlY3Rpb24oKTtcclxuICAgICAgICB0aGlzLlJ1bnRpbWVTb3J0cy5maWxsRGF0YSggcGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS19UQUJMRVM6XHJcbiAgICAgICAgdGhpcy5GaWxsVGFza1RhYmxlcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfUkVDT01QVVRFOlxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiZ29lcyB0byByZWNvbXB1dGVcIik7XHJcbiAgICAgICAgdGhpcy5SZWNvbXB1dGVGaWxsRGF0YShwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19FVkVOVEhBTkRMRVJTOlxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiZ29lcyB0byBldmVudGhhbmRsZXJzXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLkhhbmRsZXJzVGFiID09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLkhhbmRsZXJzVGFiID0gbmV3IEhhbmRsZXJzVGFibGUoKTtcclxuICAgICAgICB0aGlzLkhhbmRsZXJzVGFiLmZpbGxEYXRhKHRoaXMsIHBhcnNlcik7XHJcbiAgICAgICAgdGhpcy5hZGRFeHBIYW5kbGVyc1RvTUdEYXRhKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gKFwiL1wiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19UQVNLKSkge1xyXG4gICAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIFRhc2suaW5pdElubmVyT2JqZWN0cyAuIEVudGVyIGNhc2UgZm9yIFwiICsgZm91bmRUYWdOYW1lKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIFJlY29tcHV0ZUZpbGxEYXRhKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBsZXQgcmVjb21wdXRlVGFibGU6IFJlY29tcHV0ZVRhYmxlID0gbmV3IFJlY29tcHV0ZVRhYmxlKCk7XHJcbiAgICByZWNvbXB1dGVUYWJsZS5maWxsRGF0YV8xKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3LCB0aGlzLCBwYXJzZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBGaWxsVGFza1RhYmxlc18xKCk6IHZvaWQge1xyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlcjtcclxuICAgIC8vIEdldCB0aGUgZW5kIG9mIHRoZSB0YXNrIHRhYmxlIGVsZW1lbnRcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tfVEFCTEVTX0VORCwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGVuZENvbnRleHQgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgZW5kQ29udGV4dCkgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFLmxlbmd0aDtcclxuICAgIC8vIGdldCB0aGUgdGFzayB0YWJsZSB4bWwgc3RyaW5nXHJcbiAgICBsZXQgdGFza1RhYmxlc0RhdGE6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICB0aGlzLkZpbGxUYXNrVGFibGVzKHRhc2tUYWJsZXNEYXRhKTtcclxuICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBoYW5kbGVycyB0cmlnZ2VyZWQgYnkgZXhwcmVzc2lvbnMgdG8gbWdkYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFkZEV4cEhhbmRsZXJzVG9NR0RhdGEoKTogdm9pZCB7XHJcbiAgICBsZXQgaWR4OiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gdGhpcy5IYW5kbGVyc1RhYi5nZXRTaXplKCkgLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICBsZXQgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gdGhpcy5IYW5kbGVyc1RhYi5nZXRIYW5kbGVyKGkpO1xyXG4gICAgICBsZXQgZXZ0OiBFdmVudCA9IGhhbmRsZXIuZ2V0RXZlbnQoKTtcclxuICAgICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTiB8fFxyXG4gICAgICAgIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgZXZ0LmdldFVzZXJFdmVudFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OKSkge1xyXG4gICAgICAgIHRoaXMuX21nRGF0YS5hZGRFeHBIYW5kbGVyKGhhbmRsZXIsIGlkeCk7XHJcbiAgICAgICAgaWR4Kys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHJlZnJlc2ggb24gdmFyaWFibGUgbGlzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIFNldFJlZnJlc2hPblZhcnModmFyaWFibGVzOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBzdHJUb2s6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZSh2YXJpYWJsZXMsIFwiLFwiKTtcclxuICAgIGxldCBmbGROdW06IG51bWJlcjtcclxuICAgIGxldCBpbnRWYWxzID0gbmV3IExpc3Q8bnVtYmVyPigpO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGZvciAoaSA9IDA7IGkgPCBzdHJUb2subGVuZ3RoOyBpKyspIHtcclxuICAgICAgZmxkTnVtID0gTk51bWJlci5QYXJzZShzdHJUb2tbaV0pO1xyXG4gICAgICBpbnRWYWxzLnB1c2goZmxkTnVtKTtcclxuICAgIH1cclxuICAgIHRoaXMuUmVmcmVzaE9uVmFycyA9IG5ldyBBcnJheShpbnRWYWxzLmxlbmd0aCk7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgaW50VmFscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmbGROdW0gPSBpbnRWYWxzLmdldF9JdGVtKGkpO1xyXG4gICAgICB0aGlzLlJlZnJlc2hPblZhcnNbaV0gPSBmbGROdW07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBEYXRhU3luY2VkIHByb3BlcnR5IG9mIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldERhdGFTeW5jZWQoc3luY2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLkRhdGFTeW5jZWQgPSBzeW5jZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgZmllbGQgYnkgaXRzIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkTmFtZVwiPm9mIHRoZSBmaWVsZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgZmllbGQgYnkgaXRzIG5hbWU8L3JldHVybnM+XHJcbiAgZ2V0RmllbGQoZmxkTmFtZTogc3RyaW5nKTogRmllbGQge1xyXG4gICAgcmV0dXJuICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0RmllbGRCeU5hbWUoZmxkTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIGFuIGV4cHJlc3Npb24gYnkgaXRzIGlkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+aWQgb2YgdGhlIGV4cHJlc3Npb248L3BhcmFtPlxyXG4gIGdldEV4cEJ5SWQoaWQ6IG51bWJlcik6IEV4cHJlc3Npb24ge1xyXG4gICAgaWYgKHRoaXMuRXhwVGFiICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5FeHBUYWIuZ2V0RXhwQnlJZChpZCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIFRhc2suR2V0RXhwQnlJZCgpOiBubyBleHByZXNzaW9uIHRhYmxlXCIpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRFeHBPYmplY3RCeUlkKGlkOiBudW1iZXIpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RXhwQnlJZChpZCk7XHJcbiAgfVxyXG5cclxuICBHZXRFeHByZXNzaW9uU3RvcmFnZShleHBJZDogbnVtYmVyKTogYW55IHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBpZiAoZXhwSWQgPiAwKSB7XHJcbiAgICAgIGxldCBleHBCeUlkOiBFeHByZXNzaW9uID0gdGhpcy5nZXRFeHBCeUlkKGV4cElkKTtcclxuICAgICAgRGVidWcuQXNzZXJ0KGV4cEJ5SWQgIT09IG51bGwpO1xyXG4gICAgICByZXN1bHQgPSBleHBCeUlkLkdldFN0b3JhZ2VBdHRyaWJ1dGUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENhbGN1bGF0ZSBleHByZXNpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV4cElkXCI+VGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc1R5cGVcIj5UaGUgZXhwZWN0ZWQgcmVzdWx0IHR5cGUuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZW5ndGhcIj5UaGUgZXhwZWN0ZWQgbGVuZ3RoIG9mIHRoZSByZXN1bHQuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZW50VHlwZVVuaWNvZGVcIj5EZW5vdGVzIHdoZXRoZXIgdGhlIHJlc3VsdCBpcyBleHBlY3RlZCB0byBiZSBhIHVuaWNvZGUgc3RyaW5nLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzQ2VsbFR5cGVcIj5Ob3QgdXNlZC48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgQ2FsY3VsYXRlRXhwcmVzc2lvbihleHBJZDogbnVtYmVyLCByZXNUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCBsZW5ndGg6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgaWYgKGV4cElkID4gMCkge1xyXG4gICAgICBsZXQgZXhwQnlJZDogRXhwcmVzc2lvbiA9IHRoaXMuZ2V0RXhwQnlJZChleHBJZCk7XHJcbiAgICAgIERlYnVnLkFzc2VydChleHBCeUlkICE9PSBudWxsKTtcclxuICAgICAgcmVzdWx0ID0gYXdhaXQgZXhwQnlJZC5ldmFsdWF0ZVdpdGhSZXN1bHRUeXBlQW5kTGVuZ3RoKHJlc1R5cGUsIGxlbmd0aCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEluc2VydCBSZWNvcmQgVGFibGUgdG8gZGF0YXZpZXcgb2YgdGhlIHRhc2sgaWYgaXQgY2FtZSBhZnRlciBjbG9zaW5nIHRhc2sgdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBpbnNlcnRSZWNvcmRUYWJsZShpbnZhbGlkYXRlOiBib29sZWFuLCBwYXJzZXI6IFhtbFBhcnNlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gY2hlY2sgY2FjaGUgbG9naWMgb25seSBmb3Igc3ViLWZvcm1zXHJcbiAgICBpZiAoYXdhaXQgdGhpcy5pc0NhY2hlZCgpKSB7XHJcbiAgICAgIGxldCBmaXJzdFRpbWU6IGJvb2xlYW4gPSAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldEZpcnN0RHYoKTtcclxuICAgICAgLy8gaWYgaXQgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIHRhc2sgZ2V0IGR2IG9yIHRoZSBvbGQgZHYgaXMgbm90IGludmFsaWRhdGVkIG9yXHJcbiAgICAgIC8vIHRoZSBvbGQgZHYgZG9lcyBub3QgaW5jbHVkZSB0aGUgZmlyc3QgcmVjb3JkIGRvIG5vdCBwdXQgaW4gY2FjaGVcclxuICAgICAgaWYgKCFmaXJzdFRpbWUgJiYgaW52YWxpZGF0ZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5oYXNMb2NhdGUpIHtcclxuICAgICAgICAgIC8vIHRoZSBvbGQgZC52IHdhcyBub3QgdXBkYXRlZCBwdXQgaXQgaW4gY2FjaGUgKGl0cyByZXBsaWNhdGUpXHJcbiAgICAgICAgICBpZiAoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5JbmNsdWRlc0ZpcnN0KCkpIHtcclxuICAgICAgICAgICAgaWYgKCEoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldENoYW5nZWQoKSlcclxuICAgICAgICAgICAgICB0aGlzLl9kdkNhY2hlLnB1dEluQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5yZXBsaWNhdGUoKSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICB0aGlzLl9kdkNhY2hlLnJlbW92ZUR2RnJvbUNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0RHZQb3NWYWx1ZSgpLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB0aGlzLmxvY2F0ZVB1dEluQ2FjaGUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gcGFyc2UgdGhlIG5ldyBkYXRhdmlld1xyXG4gICAgYXdhaXQgKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5maWxsRGF0YShwYXJzZXIpO1xyXG5cclxuICAgIGlmIChpbnZhbGlkYXRlKVxyXG4gICAgICAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnNldENoYW5nZWQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgaGFuZGxlcnMgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEhhbmRsZXJzVGFiKCk6IEhhbmRsZXJzVGFibGUge1xyXG4gICAgcmV0dXJuIHRoaXMuSGFuZGxlcnNUYWI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIFhNTCBzdHJpbmcgZm9yIHRoZSBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgYnVpbGRYTUwobWVzc2FnZTogU3RyaW5nQnVpbGRlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5Jc0FmdGVyUmV0cnlCZWZvcmVCdWlsZFhNTCA9IHRoaXMuZ2V0QWZ0ZXJSZXRyeSgpO1xyXG4gICAgaWYgKHRoaXMuS25vd25Ub1NlcnZlciAmJiAhdGhpcy5Jc09mZmxpbmUpIHtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIFhNTENvbnN0YW50cy5NR19UQUdfVEFTSyk7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVEFTS0lEICsgXCI9XFxcIlwiICsgdGhpcy5nZXRUYXNrVGFnKCkgKyBcIlxcXCJcIik7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UQVNLX01BSU5MRVZFTCArIFwiPVxcXCJcIiArIHRoaXMuZ2V0TWFpbkxldmVsKCkgKyBcIlxcXCJcIik7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgICBhd2FpdCAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmJ1aWxkWE1MKG1lc3NhZ2UpO1xyXG4gICAgICBpZiAodGhpcy5Gb3JtICE9IG51bGwgJiYgdGhpcy5Gb3JtLk9wZW5lZClcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZCgoPE1nRm9ybT50aGlzLkZvcm0pLkdldEhpZGRlbkNvbnRyb2xMaXN0WE1MKCkpO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIlxcbiAgIDwvXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0sgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCB0aGUgWE1MIHN0cmluZyBmb3IgdGhlIHJhbmdlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYnVpbGRYTUxGb3JSbmdzKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIsIFVzZXJSYW5nZXM6IExpc3Q8VXNlclJhbmdlPiwgbG9jYXRlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IGZsZDogRmllbGQ7XHJcbiAgICBsZXQgY2VsbEF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBTdG9yYWdlQXR0cmlidXRlLlNLSVA7XHJcbiAgICBsZXQgdG9CYXNlNjQ6IGJvb2xlYW4gPSAoRW52aXJvbm1lbnQuSW5zdGFuY2UuR2V0RGVidWdMZXZlbCgpIDw9IDEpO1xyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IFVzZXJSYW5nZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIENvbnN0SW50ZXJmYWNlLlVTRVJfUk5HKTtcclxuXHJcbiAgICAgIGxldCBybmc6IFVzZXJSYW5nZSA9IFVzZXJSYW5nZXMuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19UQUdfRkxEICsgXCI9XFxcIlwiICsgcm5nLnZlZUlkeCArIFwiXFxcIlwiKTtcclxuXHJcbiAgICAgIGZsZCA9IDxGaWVsZD50aGlzLkRhdGFWaWV3LmdldEZpZWxkKDxudW1iZXI+cm5nLnZlZUlkeCAtIDEpO1xyXG4gICAgICBsZXQgZmxkQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IGZsZC5nZXRUeXBlKCk7XHJcblxyXG4gICAgICBpZiAocm5nLm51bGxNaW4pXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5OVUxMX01JTl9STkcgKyBcIj1cXFwiMVxcXCJcIik7XHJcblxyXG4gICAgICBpZiAoIXJuZy5kaXNjYXJkTWluICYmIHJuZy5taW4gIT0gbnVsbCkge1xyXG4gICAgICAgIGxldCB2YWw6IHN0cmluZyA9IFJlY29yZFV0aWxzLml0ZW1WYWxUb1hNTChybmcubWluLCBmbGRBdHRyLCBjZWxsQXR0ciwgdG9CYXNlNjQpO1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUlOX1JORyArIFwiPVxcXCJcIiArIHZhbCArIFwiXFxcIlwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJuZy5udWxsTWF4KVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTlVMTF9NQVhfUk5HICsgXCI9XFxcIjFcXFwiXCIpO1xyXG5cclxuICAgICAgaWYgKCFybmcuZGlzY2FyZE1heCAmJiBybmcubWF4ICE9IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsOiBzdHJpbmcgPSBSZWNvcmRVdGlscy5pdGVtVmFsVG9YTUwocm5nLm1heCwgZmxkQXR0ciwgY2VsbEF0dHIsIHRvQmFzZTY0KTtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1BWF9STkcgKyBcIj1cXFwiXCIgKyB2YWwgKyBcIlxcXCJcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcbiAgICB9XHJcbiAgICBpZiAobG9jYXRlKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuRU5EX1RBRyArIENvbnN0SW50ZXJmYWNlLlVTRVJfTE9DQVRFUyArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgZWxzZVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuRU5EX1RBRyArIENvbnN0SW50ZXJmYWNlLlVTRVJfUkFOR0VTICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIFhNTCBzdHJpbmcgZm9yIHRoZSB1c2VyIGFkZGVkIHNvcnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBidWlsZFhNTEZvclNvcnRzKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLlVzZXJTb3J0cyAhPSBudWxsICYmIHRoaXMuVXNlclNvcnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IGk6IG51bWJlcjtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuVXNlclNvcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICAgICAgbGV0IHNydDogU29ydCA9IHRoaXMuVXNlclNvcnRzLmdldF9JdGVtKGkpO1xyXG5cclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuU09SVCk7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX0ZMRCArIFwiPVxcXCJcIiArIHNydC5mbGRJZHggKyBcIlxcXCJcIik7XHJcbiAgICAgICAgaWYgKHNydC5kaXIpXHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRElSICsgXCI9XFxcIjFcXFwiXCIpO1xyXG5cclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuVXNlclNvcnRzLkNsZWFyKCk7XHJcbiAgICAgIHRoaXMuVXNlclNvcnRzID0gbnVsbDtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLkVORF9UQUcgKyBDb25zdEludGVyZmFjZS5NR19UQUdfU09SVFMgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGEgdXNlciBldmVudCBieSBpdHMgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+dGhlIGluZGV4IG9mIHRoZSByZXF1ZXN0ZWQgZXZlbnQ8L3BhcmFtPlxyXG4gIGdldFVzZXJFdmVudChpZHg6IG51bWJlcik6IEV2ZW50IHtcclxuICAgIERlYnVnLkFzc2VydCh0aGlzLlVzZXJFdnRUYWIgIT09IG51bGwpO1xyXG4gICAgbGV0IHJldEV2ZW50OiBFdmVudCA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5Vc2VyRXZ0VGFiICE9PSBudWxsKVxyXG4gICAgICByZXRFdmVudCA9IHRoaXMuVXNlckV2dFRhYi5nZXRFdmVudChpZHgpO1xyXG4gICAgcmV0dXJuIHJldEV2ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBTZXQgdGhlIE1vdmVUb0ZpcnN0Q29udHJvbCBmbGFnIG9uIHRoZSBmb3JtLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW92ZVRvRmlyc3RDb250cm9sXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIFNldE1vdmVUb0ZpcnN0Q29udHJvbChtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChtb3ZlVG9GaXJzdENvbnRyb2wgfHwgIXRoaXMuSXNTdWJGb3JtKSB7XHJcbiAgICAgIGlmICh0aGlzLkZvcm0gIT09IG51bGwpIHtcclxuICAgICAgICAvLyB0aGlzIGlzIGEgY2FsbCBkZXN0aW5hdGlvbi8gc3ViZm9ybSBjYWxsXHJcbiAgICAgICAgLy8gV2UgcGVyZm9ybSBtb3ZlIHRvIGZpcnN0IGNvbnRyb2wgb25seSB0byBvbmUgY29udHJvbCBmb3JtIHBlciByZXF1ZXN0IC0gdGhlIGZpcnN0IG9uZSB0aGF0IHdlIHJlY2VpdmVcclxuICAgICAgICBsZXQgYWxyZWFkeU1vdmVkOiBib29sZWFuID0gKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5hbHJlYWR5TW92ZWRUb0ZpcnN0Q29udHJvbCgpO1xyXG4gICAgICAgIGlmICghYWxyZWFkeU1vdmVkKVxyXG4gICAgICAgICAgKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5Nb3ZlZFRvRmlyc3RDb250cm9sID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN0YXJ0IHRoZSBleGVjdXRpb24gb2YgdGhlIHRhc2sgYW5kIGl0cyBzdWJUYXNrc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgU3RhcnQobW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuLCBjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbik6IFByb21pc2U8SVRhc2s+IHtcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2s6IFRhc2sgPSBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5faXNTdGFydGVkKSB7XHJcbiAgICAgIHRoaXMuX2lzU3RhcnRlZCA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLkluaXRpYWxpemVFeGVjdXRpb24oKTtcclxuXHJcbiAgICAgIHRoaXMuSW5TdGFydFByb2Nlc3MgPSB0cnVlO1xyXG4gICAgICBsZXQgcmVzdWx0OiBSZXR1cm5SZXN1bHQgPSBhd2FpdCB0aGlzLlNldHVwKCk7XHJcblxyXG4gICAgICAvLyB0YXNrIGluaXRpYWxpemF0aW9uIGZhaWxlZCAtIGNsb3NlIHRoZSB0YXNrXHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICB0aGlzLl9pblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFza1NhdmVkID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKCk7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzayhmYWxzZSk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLkVuYWJsZUFjdGlvbnMoKTtcclxuXHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuSW5pdGlhbGl6ZUZvcm0obW92ZVRvRmlyc3RDb250cm9sKTtcclxuXHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuSXNJbnRlcmFjdGl2ZSAmJiAhdGhpcy5faXNNYWluUHJnKVxyXG4gICAgICAgIG5vbkludGVyYWN0aXZlVGFzayA9IHRoaXM7XHJcblxyXG4gICAgICB0aGlzLkRhdGFWaWV3V2FzUmV0cmlldmVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIFFDUiAjIDE2NzMzMiA6XHJcbiAgICAgIC8vIElmIHdlIHN0YXJ0IHBvcmdyYW0gUDEsIGZvciB3aGljaCBNUCBpcyBzdGFydGVkLiBNUCBpcyBjYWxsaW5nIFAyIGZyb20gaXQncyBUUC4gU28sIHdoZW4gaXQgY2FsbHMgUDJcclxuICAgICAgLy8gYWdhaW4gaXQgc3RhcnRzIE1QLCBidXQgZnJvbSBNUCBpdCBhZ2FpbiBzdGFydHMgUDEuIGFzIFAxIGlzIGluIGl0J3Mgc3VidGFzayBhbmQgaXQgaXMgbm90IHlldCBzdGFydGVkLlxyXG4gICAgICAvLyBTbywgaXQncyB3cm9uZyB0byBzdGFydCBQMSB3aGlsZSBleGVjdXRpbmcgVFAgb2YgTVAuIEl0IHNob3VsZCBleGVjdXRlIG9ubHkgUDIuXHJcbiAgICAgIC8vIFNvLCBpbiBvcmRlciB0byBhdm9pZCB0aGlzLCBzZXQgTVAncyBzdWJ0YXNrcyB0byBudWxsIGJlZm9yZSBlbnRlcmluZyBUUC4gYW5kIGFnYWluIHJlc3RvcmUgaXQgYmFjaywgaW4gb3JkZXIgdG9cclxuICAgICAgLy8gc3RhcnQgUDEgcHJvcGVybHkuXHJcbiAgICAgIGxldCBzdWJUYXNrczogVGFza3NUYWJsZSA9IHRoaXMuU3ViVGFza3M7XHJcbiAgICAgIGlmICh0aGlzLmlzTWFpblByb2coKSlcclxuICAgICAgICB0aGlzLlN1YlRhc2tzID0gbnVsbDtcclxuICAgICAgaWYgKHRoaXMuaXNNYWluUHJvZygpKVxyXG4gICAgICAgIHRoaXMuU3ViVGFza3MgPSBzdWJUYXNrcztcclxuXHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIGlmICh0aGlzLl9hYm9ydGluZylcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGxldCBkYXRhVmlld0NvbW1hbmQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRGF0YVZpZXdDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBEYXRhVmlld0NvbW1hbmRUeXBlLkZpcnN0Q2h1bmspO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcblxyXG4gICAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBub25JbnRlcmFjdGl2ZVRhc2sgPSBhd2FpdCB0aGlzLlN0YXJ0U3ViVGFza3MobW92ZVRvRmlyc3RDb250cm9sLCBub25JbnRlcmFjdGl2ZVRhc2ssIGNhbGxCeURlc3RTdWJGb3JtKTtcclxuICAgIHRoaXMuSW5TdGFydFByb2Nlc3MgPSBmYWxzZTtcclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluaXRpYWxpemUgZXhlY3V0aW9uLXJlbGF0ZWQgc3R1ZmYuXHJcbiAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgT05MWSBmcm9tIFRhc2suU3RhcnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdGlhbGl6ZUV4ZWN1dGlvbigpOiB2b2lkIHtcclxuICAgIC8vIGN1cnJlbnRseSB0aGUgaXMgbm8gY29udHJvbCBleGVjdXRpbmcgdGhlcmUgZm9yIHRoZVxyXG4gICAgLy8gY3VycmVudCBleGVjdXRpbmcgY29udHJvbCBpbmRleCBpcyBzZXQgdG8gLTFcclxuICAgIHN1cGVyLnNldEJya0xldmVsKENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9SRUNfTUFJTiwgLTEpO1xyXG4gICAgdGhpcy5fZmlyc3RSZWNvcmRDeWNsZSA9IHRydWU7ICAgICAgLy8gV2hpbGUgc3RhcnRpbmcgYSBUYXNrLCBzZXQgZmlyc3RSZWNvcmRDeWNsZSA9IFRSVUVcclxuXHJcbiAgICB0aGlzLl9jdXJyU3RhcnRQcm9nTGV2ZWwgPSAoKHRoaXMuSXNTdWJGb3JtICYmICg8TWdGb3JtPnRoaXMuZ2V0UGFyZW50KCkuZ2V0Rm9ybSgpKS5hbHJlYWR5TW92ZWRUb0ZpcnN0Q29udHJvbCgpKVxyXG4gICAgICA/ICg8VGFzaz50aGlzLmdldFBhcmVudCgpKS5fY3VyclN0YXJ0UHJvZ0xldmVsXHJcbiAgICAgIDogVGFzay5TdGFydFByb2dMZXZlbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXRpYWxpemUgZm9ybS1yZWxhdGVkIHN0dWZmXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBJbml0aWFsaXplRm9ybShtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4pOiBQcm9taXNlPFJldHVyblJlc3VsdD4ge1xyXG4gICAgaWYgKHRoaXMuRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBzZXQgTW92ZVRvRmlyc3RDb250cm9sIGZsYWcgb24gdGhlIGZvcm0uXHJcbiAgICAgIHRoaXMuU2V0TW92ZVRvRmlyc3RDb250cm9sKG1vdmVUb0ZpcnN0Q29udHJvbCk7XHJcblxyXG4gICAgICAvLyB0aGUgSW5pdEZvcm0gbWlnaHQgY2F1c2UgZXhlY3V0aW9uIG9mIGNvZGUgKHZhcmlhYmxlIGNoYW5nZSkgc28gd2Ugc2hvdWxkIGRvIGl0IHdpdGggYSBuZXcgc2VydmVyIGV4ZWN1dGlvbiBzdGFja1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG5cclxuICAgICAgdGhpcy5yb3V0ZVBhcmFtcyA9ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuR2V0Um91dGVQYXJhbXMoKTtcclxuXHJcbiAgICAgIC8vIGluaXRpYWxpemUgdGhlIGN1cnJlbnQgdGFzaydzIGZvcm0uXHJcbiAgICAgIGF3YWl0IHRoaXMuSW5pdEZvcm0oKTtcclxuXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICAgIHRoaXMuZ2V0TUdEYXRhKCkuU3RhcnRUaW1lcnMoKTtcclxuICAgICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFJldHVyblJlc3VsdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzdGFydCBzdWIgdGFza3Mgb2YgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5vbkludGVyYWN0aXZlVGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIFN0YXJ0U3ViVGFza3MobW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuLCBub25JbnRlcmFjdGl2ZVRhc2s6IFRhc2ssIGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuKTogUHJvbWlzZTxUYXNrPiB7XHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgbGV0IHRtcE5vbkludGVyYWN0aXZlVGFzazogVGFzayA9ICA8VGFzaz4gYXdhaXQgdGFzay5TdGFydChtb3ZlVG9GaXJzdENvbnRyb2wsIGNhbGxCeURlc3RTdWJGb3JtKTtcclxuICAgICAgICBpZiAobm9uSW50ZXJhY3RpdmVUYXNrID09PSBudWxsKVxyXG4gICAgICAgICAgbm9uSW50ZXJhY3RpdmVUYXNrID0gdG1wTm9uSW50ZXJhY3RpdmVUYXNrO1xyXG4gICAgICAgIGVsc2UgaWYgKHRtcE5vbkludGVyYWN0aXZlVGFzayAhPT0gbnVsbClcclxuICAgICAgICAgIERlYnVnLkFzc2VydChmYWxzZSwgXCJtb3JlIHRoYW4gMSBub24gaW50ZXJhY3RpdmUgaW4gdGFzay5zdGFydFwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2s7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIEVuYWJsZUFjdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgYWN0TGlzdDogbnVtYmVyW10gPSBBY3Rpb25NYW5hZ2VyLmFjdEVuYWJsZWQ7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlTGlzdChhY3RMaXN0LCB0cnVlLCBmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuSXNTdWJGb3JtKVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9QT1NUX1JFRlJFU0hfQllfUEFSRU5ULCB0cnVlKTtcclxuXHJcblxyXG4gICAgLy8gZW5hYmxlIGFjdGlvbnMgZGVwZW5kaW5nIG9uIHRhc2sgcHJvcGVydGllc1xyXG4gICAgYXdhaXQgdGhpcy5lbmFibGVNb2RlcygpO1xyXG4gICAgaWYgKGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTiwgZmFsc2UpKSB7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGVuYWJsZVByaW50ZGF0YTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSSU5UX0RBVEEsIGZhbHNlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BSSU5UX0RBVEEsIGVuYWJsZVByaW50ZGF0YSk7XHJcblxyXG5cclxuICAgIGlmICh0aGlzLmdldEVuYWJsZVpvb21IYW5kbGVyKCkpXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzaG93IGVycm9yIG9uIHRhc2sncyBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0ZXh0XCI+PC9wYXJhbT5cclxuICBhc3luYyBTaG93RXJyb3IodGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbWxzVHJhbnNUZXh0OiBzdHJpbmcgPSBMYW5ndWFnZURhdGEuSW5zdGFuY2UudHJhbnNsYXRlKHRleHQpO1xyXG4gICAgbGV0IG1sc1RyYW5zVGl0bGU6IHN0cmluZyA9IExhbmd1YWdlRGF0YS5JbnN0YW5jZS50cmFuc2xhdGUoQ29uc3RJbnRlcmZhY2UuRVJST1JfU1RSSU5HKTtcclxuICAgIC8vIG1scyA/Pz9cclxuICAgIGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuTWVzc2FnZUJveChtbHNUcmFuc1RpdGxlLCBtbHNUcmFuc1RleHQsIFN0eWxlcy5NU0dCT1hfSUNPTl9FUlJPUiB8IFN0eWxlcy5NU0dCT1hfQlVUVE9OX09LKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2sgdGhlIHJlc3VsdC4gSWYgZmFpbGVkIC0gZGlzcGxheSB0aGUgZXJyb3IgbWVzc2FnZWJveCBhbmQgZW5kIHRoZSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXN1bHRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgRW5kVGFza09uRXJyb3IocmVzdWx0OiBSZXR1cm5SZXN1bHQsIGRpc3BsYXlFcnJvcjogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFyZXN1bHQuU3VjY2VzcyAmJiAhdGhpcy5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgaWYgKHRoaXMuSW5TdGFydFByb2Nlc3MpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmVuZFRhc2soZmFsc2UsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKGRpc3BsYXlFcnJvcilcclxuICAgICAgICAgIGF3YWl0IHRoaXMuU2hvd0Vycm9yKHJlc3VsdC5FcnJvckRlc2NyaXB0aW9uKTtcclxuICAgICAgICB0aGlzLkluU3RhcnRQcm9jZXNzID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGRpc3BsYXlFcnJvcilcclxuICAgICAgICAgIGF3YWl0IHRoaXMuU2hvd0Vycm9yKHJlc3VsdC5FcnJvckRlc2NyaXB0aW9uKTtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIFNldHVwKCk6IFByb21pc2U8UmV0dXJuUmVzdWx0PiB7XHJcbiAgICBsZXQgcmVzdWx0OiBSZXR1cm5SZXN1bHQ7XHJcbiAgICB0aGlzLlRhc2tTZXJ2aWNlLkluaXRUYXNrUHJlZml4RXhlY3V0ZWRGbGFnKHRoaXMpO1xyXG4gICAgdGhpcy5UYXNrU3VmZml4RXhlY3V0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBUYXNrU2VydmljZUJhc2UuQ3JlYXRlRmlyc3RSZWNvcmQodGhpcyk7XHJcblxyXG4gICAgLy8gaW5pdCBkYXRhIHZpZXdcclxuICAgIC8vIE5vdGU6IEV2ZW4gaWYgdGhlIHJlc3VsdEluaXRNb2RlIGlzIGZhbHNlIHdlIE1VU1QgaW5pdCB0aGUgZGF0YSB2aWV3XHJcbiAgICBsZXQgZGF0YVZpZXdDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5Jbml0KTtcclxuICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuXHJcbiAgICAvLyBuZWVkIHRvIGNoZWNrIHJlc3VsdChvZiB0aGUgZGF0YSB2aWV3IGluaXQgYW5kIGlmIG5vdCBzdWNjZXNzIHRoZW4gcmV0dXJuIHRoaXMgZXJyb3JcclxuICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcblxyXG4gICAgaWYgKHJlc3VsdC5TdWNjZXNzKSB7XHJcbiAgICAgIC8vIEV4ZWN1dGUgdGhlIGNvbW1hbmQsIHdob3NlIGV4ZWN1dGlvbiB3YXMgZGVsYXllZCBiZWN1YXNlIHRhc2sgd2FzIG5vdCBzdGFydGVkLiBTbyBFeGN1dGUgdGhvc2UgY29tbWFuZHMgYWZ0ZXIgdGFzayBzdGFydGVkLlxyXG4gICAgICBsZXQgY29tbWFuZHM6IExpc3Q8SUNsaWVudFRhcmdldGVkQ29tbWFuZD4gPSBHbG9iYWxDb21tYW5kc01hbmFnZXIuSW5zdGFuY2UuZ2V0Q29tbWFuZHNFeGVjdXRlZEFmdGVyVGFza1N0YXJ0ZWQoKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGNtZElkeDogbnVtYmVyID0gMDsgY21kSWR4IDwgY29tbWFuZHMubGVuZ3RoOyBjbWRJZHgrKykge1xyXG4gICAgICAgIGxldCBjb21tYW5kOiBJQ2xpZW50VGFyZ2V0ZWRDb21tYW5kID0gKGNvbW1hbmRzLmdldF9JdGVtKGNtZElkeCkpO1xyXG4gICAgICAgIGlmIChjb21tYW5kLlRhc2tUYWcgPT09IHRoaXMuZ2V0VGFza1RhZygpKSB7XHJcbiAgICAgICAgICBhd2FpdCBjb21tYW5kLkV4ZWN1dGUobnVsbCk7XHJcbiAgICAgICAgICBHbG9iYWxDb21tYW5kc01hbmFnZXIuSW5zdGFuY2UucmVtb3ZlQ29tbWFuZHNFeGVjdXRlZEFmdGVyVGFza1N0YXJ0ZWQoY29tbWFuZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBkYXRhVmlld0NvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuUHJlcGFyZSk7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzdWx0LlN1Y2Nlc3MpIHtcclxuICAgICAgcmVzdWx0ID0gdGhpcy5UYXNrU2VydmljZS5QcmVwYXJlVGFzayh0aGlzKTtcclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICBhd2FpdCB0aGlzLkVuZFRhc2tPbkVycm9yKHJlc3VsdCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdC5TdWNjZXNzKSB7XHJcbiAgICAgIGRhdGFWaWV3Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5Jbml0RGF0YUNvbnRyb2xWaWV3cyk7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyBmaXJzdCByZWNvcmQgcHJlZml4ICYgc3VmZml4XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCBvbmx5IGZvciBjb25uZWN0ZWQgdGFzay5cclxuICAvLy8gICBGb3Igb2ZmbGluZSB0YXNrIHdlIHJ1biBFbnRlckZpcnN0UmVjb3JkIGZ1bmN0aW9uLiBUaGVyZSB3ZSBleGVjdXRlIFJQIGFuZCBvcGVuIHN1YmZvcm1zLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZG9GaXJzdFJlY29yZEN5Y2xlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLl9pc01haW5QcmcpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgdGhpcy5TdWJmb3JtRXhlY01vZGUgPSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uRklSU1RfVElNRTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2godGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIHRoaXMuSXNTdWJGb3JtKTtcclxuXHJcbiAgICAgIGlmICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSlcclxuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICAgICAgICBsZXQgc3ViVGFzazogVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICAgICAgICBpZiAoc3ViVGFzay5Jc1N1YkZvcm0pIHtcclxuICAgICAgICAgICAgICAgICg8TWdGb3JtPnN1YlRhc2suZ2V0Rm9ybSgpKS5JZ25vcmVGaXJzdFJlY29yZEN5Y2xlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHN1YlRhc2suZG9GaXJzdFJlY29yZEN5Y2xlKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5TdWJmb3JtRXhlY01vZGUgPSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uU0VUX0ZPQ1VTO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgdGFzayBpcyBhIHN1YiBmb3JtIGJ5IGl0cyBtZ2QgZGVmaW5pdGlvbiAodXNlZCBvbmx5IHdoaWxlIGluaXRpYXRpbmcgdGFzayBmb3Igc2V0dGluZyBpc1N1YmZvcm0pXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIENoZWNrQW5kU2V0U3ViRm9ybSgpOiB2b2lkIHtcclxuICAgIHRoaXMuSXNTdWJGb3JtID0gKCFzdXBlci5pc01haW5Qcm9nKCkgJiYgdGhpcyAhPT0gdGhpcy5fbWdEYXRhLmdldEZpcnN0VGFzaygpKTtcclxuICB9XHJcblxyXG5cclxuICBJc1JvdXRlKCkge1xyXG4gICAgcmV0dXJuICh0aGlzLlJvdXRlclBhdGggIT0gbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc3RvcCB0aGUgZXhlY3V0aW9uIG9mIGEgcHJvZ3JhbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrO1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybUJhc2UgPSB0aGlzLmdldEZvcm0oKTtcclxuXHJcbiAgICBpZiAodGhpcy5fYWJvcnRpbmcpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIHdoaWxlICgodGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzaygwKSkgIT0gbnVsbCkge1xyXG4gICAgICAgIHRhc2suc2V0RGVzdGluYXRpb25TdWJmb3JtKHRoaXMuX2Rlc3RpbmF0aW9uU3ViZm9ybSk7XHJcbiAgICAgICAgYXdhaXQgdGFzay5zdG9wKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuX2lzTWFpblByZylcclxuICAgICAgdGhpcy5fYWJvcnRpbmcgPSB0cnVlO1xyXG5cclxuICAgIC8vIGlmIHRoaXMgdGFzayBhbmQgaXRzIHBhcmVudCBhcmUgZnJvbSBkaWZmZXJlbnQgTUdEQVRBIG9iamVjdHMgdGhlbiBkaXNjb25uZWN0XHJcbiAgICAvLyB0aGVtIGJ5IHJlbW92aW5nIHRoZSByZWZlcmVuY2UgdG8gdGhpcyB0YXNrIGZyb20gaXRzIHBhcmVudFxyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9wYXJlbnRUYXNrLnJlbW92ZVN1YlRhc2sodGhpcyk7XHJcbiAgICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAgIGxldCBvbGRUaW1lcnM6IExpc3Q8bnVtYmVyPiA9IG5ldyBMaXN0PG51bWJlcj4oKSwgbmV3VGltZXJzID0gbmV3IExpc3Q8bnVtYmVyPigpO1xyXG4gICAgICAgIGxldCBtZ2QgPSB0aGlzLmdldE1HRGF0YSgpO1xyXG5cclxuICAgICAgICBpZiAobWdkLmdldFRpbWVySGFuZGxlcnMoKSAhPSBudWxsKVxyXG4gICAgICAgICAgb2xkVGltZXJzID0gbWdkLmdldFRpbWVySGFuZGxlcnMoKS5nZXRUaW1lcnNWZWN0b3IoKTtcclxuICAgICAgICBtZ2QucmVtb3ZlVGltZXJIYW5kbGVyKHRoaXMpO1xyXG4gICAgICAgIG1nZC5yZW1vdmVFeHByZXNzaW9uSGFuZGxlcih0aGlzKTtcclxuICAgICAgICBpZiAobWdkLmdldFRpbWVySGFuZGxlcnMoKSAhPSBudWxsKVxyXG4gICAgICAgICAgbmV3VGltZXJzID0gbWdkLmdldFRpbWVySGFuZGxlcnMoKS5nZXRUaW1lcnNWZWN0b3IoKTtcclxuICAgICAgICBtZ2QuY2hhbmdlVGltZXJzKG9sZFRpbWVycywgbmV3VGltZXJzKTtcclxuXHJcbiAgICAgICAgbWdkLnJlbW92ZVRhc2sodGhpcyk7XHJcbiAgICAgICAgR1VJTWFuYWdlci5JbnN0YW5jZS5hYm9ydCg8TWdGb3JtPnRoaXMuZ2V0Rm9ybSgpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuQWJvcnRUcmFuc2FjdGlvbigpO1xyXG5cclxuICAgIC8vIElmIHRoZSB0YXNrIGdvdCBjbG9zZWQgZHVlIHRvIGEgY2xpY2sgb24gc2FtZSB0YXNrLCB0aGVuIHNldCBDdXJyZW50Q2xpY2tlZEN0cmwgdG8gbnVsbFxyXG4gICAgaWYgKHRoaXMuZ2V0Q2xpY2tlZENvbnRyb2woKSAhPSBudWxsKVxyXG4gICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gbnVsbDtcclxuICAgIGlmICh0aGlzLkZvcm0gIT0gbnVsbClcclxuICAgICAgKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5yZW1vdmVSZWZzVG9DdHJscygpO1xyXG5cclxuICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICBsZXQgc3ViRm9ybSA9IDxNZ0NvbnRyb2w+dGhpcy5Gb3JtLmdldFN1YkZvcm1DdHJsKCk7XHJcblxyXG4gICAgICBzdWJGb3JtLnNldFN1YmZvcm1UYXNrSWQobnVsbCk7XHJcbiAgICAgIHN1YkZvcm0uaW5pdFN1YmZvcm1UYXNrKCk7XHJcblxyXG4gICAgICBpZiAoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpID09PSB0aGlzKVxyXG4gICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5zZXRMYXN0Rm9jdXNlZFRhc2sodGhpcy5fcGFyZW50VGFzayk7XHJcblxyXG4gICAgICAvLyBRQ1IgIzMxMDExMy4gSWYgdGhlIHN1YmZvcm0gdGFzayBmb3Igd2FzIG5vdCBsb2FkZWQgeWV0LCBkbyBub3QgcmVmcmVzaCBpdC5cclxuICAgICAgaWYgKHN1YkZvcm0uU3ViZm9ybUxvYWRlZClcclxuICAgICAgICBhd2FpdCAoc3ViRm9ybS5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUpKS5SZWZyZXNoRGlzcGxheSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY2xlYXJEYXRhVmlld0NvbW1hbmQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRGF0YVZpZXdDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBEYXRhVmlld0NvbW1hbmRUeXBlLkNsZWFyKTtcclxuICAgIGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY2xlYXJEYXRhVmlld0NvbW1hbmQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBhYm9ydCB0aGUgTWdEYXRhIHRvIHdoaWNoIHRoZSB0YXNrIGJlbG9uZ3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFib3J0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5nZXRNR0RhdGEoKS5hYm9ydCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBoYXMgc3ViLXRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBoYXNTdWJUYXNrcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlN1YlRhc2tzICE9PSBudWxsICYmIHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpID4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBIG51bWJlciwgMS0yNCwgdGhlIGN1cnJlbnQgdGFzaydzIGRlcHRoIGluIHRoZSB0YXNrIGV4ZWN1dGlvbiBoaWVyYXJjaHkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ5UGFyZW50T3JkZXJcIj5pZiB0cnVlLCB3ZSB0cmF2ZWwgdGhlIHBhcmVudHMsIG90aGVyd2lzZSB3ZSB0cmF2ZWwgdGhlIHRyaWdnZXJpbmcgdGFza3M8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gZGVwdGggb2YgdGhlIHRhc2ssIDEgaWYgY2FsbGVkIGZyb20gdGhlIHJvb3QgdGFzazwvcmV0dXJucz5cclxuICBnZXRUYXNrRGVwdGgoYnlQYXJlbnRPcmRlcjogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBpZiAoYnlQYXJlbnRPcmRlcilcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuXHJcblxyXG4gICAgbGV0IGRlcHRoOiBudW1iZXIgPSAoPFRhc2s+IHRoaXMuR2V0Q29udGV4dFRhc2soKSkuZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuXHJcbiAgICAvLyBRQ1IgMzY2NzQ4IGlmIHdlIGFyZSBpbiBhIGNvbXBvbmVudCBoYW5kbGVyIGFkZCBpdCB0byB0aGUgcGF0aFxyXG4gICAgaWYgKHRoaXMuaXNNYWluUHJvZygpICYmIHRoaXMuZ2V0Q3RsSWR4KCkgIT09IENvbnN0SW50ZXJmYWNlLlRPUF9MRVZFTF9DT05UQUlORVIpXHJcbiAgICAgIGRlcHRoID0gZGVwdGggKyAxO1xyXG5cclxuICAgIHJldHVybiBkZXB0aDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggaW1wbGVtZW50cyB0aGUgZ2V0VGFza0RlcHRoIHJlY3Vyc2lvbi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYnlQYXJlbnRPcmRlclwiPmlmIHRydWUsIHdlIHRyYXZlbCB0aGUgcGFyZW50cywgb3RoZXJ3aXNlIHdlIHRyYXZlbCB0aGUgdHJpZ2dlcmluZyB0YXNrczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBnZXRUYXNrRGVwdGhfKGJ5UGFyZW50T3JkZXI6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgbGV0IHRtcFRhc2s6IFRhc2sgPSB0aGlzLmdldFRyaWdnZXJpbmdUYXNrKCk7XHJcbiAgICBpZiAodG1wVGFzayA9PSBudWxsIHx8IGJ5UGFyZW50T3JkZXIpXHJcbiAgICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrID09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8qIGlmIHRoZSBjdGxJZHggb2YgdGhlIGN1cnJlbnQgdGFzayBhbmQgdGhlIHBhcmVudCBhcmUgZGlmZmVyZW50LCAgICovXHJcbiAgICAgICAgLyogdGhhdCBpcyB0aGUgY3VycmVudCB0YXNrIGlzIGZyb20gYSBjb21wb25lbnQsIGFkZCB0aGUgY29tcG9uZW50J3MgKi9cclxuICAgICAgICAvKiBNYWluIFByZyBhcyB3ZWxsLiAqL1xyXG4gICAgICAgIGlmIChieVBhcmVudE9yZGVyICYmIHRoaXMuZ2V0Q3RsSWR4KCkgIT09IHRoaXMuX3BhcmVudFRhc2suZ2V0Q3RsSWR4KCkpXHJcbiAgICAgICAgICByZXR1cm4gMiArIHRoaXMuX3BhcmVudFRhc2suZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuICAgICAgICByZXR1cm4gMSArIHRoaXMuX3BhcmVudFRhc2suZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuICAgICAgfVxyXG4gICAgcmV0dXJuIDEgKyAodG1wVGFzaykuZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGFuY2VzdG9yIG9mIHRoZSBUYXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImdlbmVyYXRpb25cIj5vZiB0aGUgYW5jZXN0b3IgdGFzazwvcGFyYW0+XHJcbiAgR2V0VGFza0FuY2VzdG9yKGdlbmVyYXRpb246IG51bWJlcik6IElUYXNrIHtcclxuICAgIHJldHVybiB0aGlzLmdldFRhc2tBbmNlc3Rvcl8oZ2VuZXJhdGlvbik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldFRhc2tBbmNlc3Rvcl8oZ2VuZXJhdGlvbjogbnVtYmVyKTogSVRhc2sge1xyXG4gICAgbGV0IHJldFRhc2s6IElUYXNrID0gbnVsbDtcclxuXHJcbiAgICBpZiAoZ2VuZXJhdGlvbiA9PT0gMClcclxuICAgICAgcmV0VGFzayA9IHRoaXM7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHRtcFRhc2s6IFRhc2sgPSB0aGlzLmdldFRyaWdnZXJpbmdUYXNrKCk7XHJcbiAgICAgIGlmICh0bXBUYXNrID09PSBudWxsKVxyXG4gICAgICAgIHRtcFRhc2sgPSB0aGlzLl9wYXJlbnRUYXNrO1xyXG4gICAgICBpZiAodG1wVGFzayAhPT0gbnVsbClcclxuICAgICAgICByZXRUYXNrID0gdG1wVGFzay5nZXRUYXNrQW5jZXN0b3JfKC0tZ2VuZXJhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJldFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdGFzayBkZXB0aFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRUYXNrRGVwdGgoKTogbnVtYmVye1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VGFza0RlcHRoKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50cnVlIGlmZiB0aGUgcGF0aCBvZiB0aGUgY3VycmVudCB0YXNrIGNvbnRhaW5zIHRoZSB0YXNrIHBhc3NlZCBhcyBwYXJhbWV0ZXI8L3JldHVybnM+XHJcbiAgcGF0aENvbnRhaW5zKHRhc2s6IFRhc2tCYXNlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFza1BhdGguQ29udGFpbnMoPFRhc2s+dGFzayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgY29udGV4dCB0YXNrIG9mIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb250ZXh0XCI+dGhlIG5ldyBjb250ZXh0IHRhc2sgb2YgdGhlIGN1cnJlbnQgdGFzazwvcGFyYW0+XHJcbiAgU2V0Q29udGV4dFRhc2soY29udGV4dDogVGFza0Jhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuQ29udGV4dFRhc2sgPSA8VGFzaz5jb250ZXh0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHRhc2sgd2hpY2ggaXMgdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaGFuZGxlci5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEdldENvbnRleHRUYXNrKCk6IElUYXNrIHtcclxuICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSAoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCkpO1xyXG5cclxuICAgIGlmICh0aGlzLkluU3RhcnRQcm9jZXNzXHJcbiAgICAgIHx8IGN1cnJSZWMgIT09IG51bGwgJiYgKGN1cnJSZWMuSW5Db21wdXRlIHx8IGN1cnJSZWMuSW5SZWNvbXB1dGUpXHJcbiAgICAgIHx8IHRoaXMuRm9ybSAhPT0gbnVsbCAmJiB0aGlzLkZvcm0uaW5SZWZyZXNoRGlzcGxheSgpKVxyXG4gICAgICByZXR1cm4gdGhpcztcclxuXHJcbiAgICByZXR1cm4gdGhpcy5Db250ZXh0VGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2sgdGhhdCB0cmlnZ2VyZWQgdGhlIGhhbmRsZXIgd2hpY2ggY3JlYXRlZCBtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VHJpZ2dlcmluZ1Rhc2soKTogVGFzayB7XHJcbiAgICAvLyBUaGlzIGlzIGEgc2VtaSBwYXRjaCB3aGljaCBmaXhlcyBwcm9ibGVtcyBzdWNoIGFzIHRoZSBvbmVzIGluIFFDUiAjMjk2NDI4XHJcbiAgICAvLyBXaGVuIGEgbW9kYWwgdGFzayBnZXRzIG9wZW5lZCwgaXQgbWlnaHQgc2V0IGl0cyB0cmlnZ2VyaW5nIHRhc2sgdG8gYSB0YXNrXHJcbiAgICAvLyB3aG9zZSAnYWJvcnQnIGNvbW1hbmQgYXJyaXZlZCBhbmQgaXMgcGVuZGluZyBmb3IgZXhlY3V0aW9uLiBVbmRlciB0aGVzZVxyXG4gICAgLy8gY2lyY3Vtc3RhbmNlcywgd2UgbXVzdCBjaGVjayBldmVyeSBhY2Nlc3MgdG8gdHJpZ2dlcmluZ1Rhc2sgYW5kIG1ha2Ugc3VyZVxyXG4gICAgLy8gaXQgcG9pbnRzIHRvIGEgdmFsaWQgdGFzay5cclxuICAgIGlmICh0aGlzLl90cmlnZ2VyaW5nVGFzayAhPT0gbnVsbCAmJiB0aGlzLl90cmlnZ2VyaW5nVGFzay5nZXRNR0RhdGEoKS5Jc0Fib3J0aW5nKVxyXG4gICAgICB0aGlzLl90cmlnZ2VyaW5nVGFzayA9IHRoaXMuX3BhcmVudFRhc2s7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3RyaWdnZXJpbmdUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgbGFzdCBwYXJrZWQgY29udHJvbCBpbiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmxhc3QgZm9jdXNlZCBjb250cm9sPC9wYXJhbT5cclxuICBzZXRMYXN0UGFya2VkQ3RybChjdHJsOiBNZ0NvbnRyb2xCYXNlKTogdm9pZCB7XHJcbiAgICBzdXBlci5zZXRMYXN0UGFya2VkQ3RybChjdHJsKTtcclxuICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2wodGhpcywgY3RybCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUXVlcnkgVGFzayBQYXRoIFJldHVybnMgdGhlIHRhc2sgcGF0aCB0aGF0IGxlYWRzIHRvIHRoZSBjdXJyZW50IHRhc2suIFRoZSByZXN1bHRpbmcgYWxwaGEgc3RyaW5nXHJcbiAgLy8vICAgY29udGFpbnMgdGhlIHRhc2sgbmFtZXMsIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgbmFtZSBvZiB0aGUgdGFzay4gTmFtZXMgYXJlIHNlcGFyYXRlZCBieSB0aGUgJzsnXHJcbiAgLy8vICAgY2hhcmFjdGVyLiBGb3IgUFJPRygpIHVzaW5nLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcXVlcnlUYXNrUGF0aCgpOiBTdHJpbmdCdWlsZGVyIHtcclxuICAgIGxldCBpbnNlcnRlZE5hbWVzOiBudW1iZXIgPSAwOyAgICAgICAgLy8gaG93IG1hY2ggbmFtZXMgaW5zZXJ0ZWQgdG8gdGhlIG91dHB1dCBzdHJpbmdcclxuICAgIGxldCByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcig3OTM2KTsgLy8gMzEgKiAyNTYgKi9cclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkodGhpcy5nZXRUYXNrRGVwdGgoZmFsc2UpKTtcclxuICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIGZhbHNlKTtcclxuICAgIGZvciAobGV0IHRzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRzayA+PSAwOyB0c2stLSkge1xyXG4gICAgICBsZXQgY3VyclRzazogVGFzayA9IHRyZWVSb3V0ZVt0c2tdO1xyXG4gICAgICBpZiAoY3VyclRzay5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIGxldCBuYW1lUHJvcDogUHJvcGVydHkgPSBjdXJyVHNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSk7XHJcbiAgICAgIGlmIChuYW1lUHJvcCA9PSBudWxsKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICBsZXQgbmFtZTogc3RyaW5nID0gbmFtZVByb3AuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG4gICAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShuYW1lKSkge1xyXG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG9ubHkgMSBuYW1lIC0+IGRvbid0IGluc2VydCAnOydcclxuICAgICAgICAvLyBhZnRlciBsYXN0IG5hbWUgZG9uJ3QgaW5zZXJ0ICc7JyB0b28uXHJcbiAgICAgICAgaWYgKGluc2VydGVkTmFtZXMrKyAhPT0gMClcclxuICAgICAgICAgIHJlc3VsdC5BcHBlbmQoJzsnKTtcclxuICAgICAgICByZXN1bHQuQXBwZW5kKG5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCBGaWVsZCB3aGljaCBjb250YWluIGl0ZW0gbnVtYmVyIGl0bVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY3RsX2l0bV8yX3BhcmVudF92ZWUoaXRtOiBudW1iZXIpOiBGaWVsZCB7XHJcbiAgICBsZXQgY3VyclRzazogVGFzaztcclxuICAgIGxldCBjdXJySXRtOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGxhc3RJdG06IG51bWJlciA9IDA7ICAgICAgLy8gc3RhcnQgb2YgdGhlIGZpZWxkIGluIGZpZWxkZVRhYiBudW1iZXIgZm9yIGNoZWNrZWQgdGFza1xyXG4gICAgLy8gc2F2ZSB0aGUgcm91dGUgdG8gdGhlIHJvb3QgaW4gdGhlIHRyZWVSb3V0ZSBhcnJheVxyXG4gICAgbGV0IHRyZWVSb3V0ZSA9IG5ldyBBcnJheSh0aGlzLmdldFRhc2tEZXB0aCh0cnVlKSk7XHJcbiAgICAvLyB0aGUgcm91dGUgdXAsIHRoZSBpbnNlcnQgKG91ciB0YXNrKSBpcyBbMF0sIGFuZCBleGl0IChyb290KSBpcyBbdHJlZVJvdXRlLmxlbmd0aC0xXVxyXG4gICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgZm9yIChsZXQgdHNrOiBudW1iZXIgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdHNrID49IDA7IHRzay0tKSB7XHJcbiAgICAgIGN1cnJUc2sgPSB0cmVlUm91dGVbdHNrXTtcclxuXHJcbiAgICAgIGN1cnJJdG0gKz0gY3VyclRzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAvLyBmb3VuZCB0YXNrIHdoaWNoIGNvbnRhaW5zIHRoZSBuZWVkZWQgZmllbGRcclxuICAgICAgaWYgKGl0bSA8IGN1cnJJdG0pIHtcclxuICAgICAgICAvLyBudW1iZXIgb2YgRmllbGQgaW4gZm91bmQgdGFza1xyXG4gICAgICAgIGl0bSAtPSBsYXN0SXRtO1xyXG4gICAgICAgIHJldHVybiA8RmllbGQ+Y3VyclRzay5EYXRhVmlldy5nZXRGaWVsZChpdG0pO1xyXG4gICAgICB9XHJcbiAgICAgIGxhc3RJdG0gPSBjdXJySXRtO1xyXG4gICAgfVxyXG4gICAgLy8gbm90IGZvdW5kIHRoZSBmaWVsZFxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgY29udHJvbCBpZCB3aGljaCBjb250YWluIGZpZWxkIGF0dGFjaGVkIHRvIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIml0ZW1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0Q29udHJvbElERnJvbVZhckl0ZW0oaXRlbTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBjdXJyVGFzazogVGFzaztcclxuICAgIGxldCBjdXJySXRlbTogbnVtYmVyID0gMDtcclxuICAgIGxldCBsYXN0SXRlbTogbnVtYmVyID0gMDsgICAvLyBzdGFydCBvZiB0aGUgZmllbGQgaW4gZmllbGRlVGFiIG51bWJlciBmb3IgY2hlY2tlZCB0YXNrXHJcbiAgICBsZXQgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2s6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gc2F2ZSB0aGUgcm91dGUgdG8gdGhlIHJvb3QgaW4gdGhlIHRyZWVSb3V0ZSBhcnJheVxyXG4gICAgbGV0IHRyZWVSb3V0ZSA9IG5ldyBBcnJheSh0aGlzLmdldFRhc2tEZXB0aCh0cnVlKSk7XHJcbiAgICAvLyB0aGUgcm91dGUgdXAsIHRoZSBpbnNlcnQgKG91ciB0YXNrKSBpcyBbMF0sIGFuZCBleGl0IChyb290KSBpcyBbdHJlZVJvdXRlLmxlbmd0aCAtIDFdXHJcbiAgICB0aGlzLnBhdGhUb1Jvb3QodHJlZVJvdXRlLCB0cnVlKTtcclxuXHJcbiAgICBmb3IgKGxldCB0YXNrOiBudW1iZXIgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdGFzayA+PSAwOyB0YXNrLS0pIHtcclxuICAgICAgY3VyclRhc2sgPSB0cmVlUm91dGVbdGFza107XHJcbiAgICAgIGN1cnJJdGVtICs9IGN1cnJUYXNrLkRhdGFWaWV3LkdldEZpZWxkc1RhYigpLmdldFNpemUoKTtcclxuXHJcbiAgICAgIC8vIEZvdW5kIHRoZSB0YXNrIHdoaWNoIGNvbnRhaW5zIHRoZSBuZWVkZWQgY29udHJvbCAmIGZpZWxkXHJcbiAgICAgIGlmIChpdGVtIDwgY3Vyckl0ZW0pIHtcclxuICAgICAgICAvLyBOdW1iZXIgb2YgZmllbGRzIGluIGZvdW5kIHRhc2tcclxuICAgICAgICBpdGVtIC09IGxhc3RJdGVtO1xyXG5cclxuICAgICAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPmN1cnJUYXNrLkRhdGFWaWV3LmdldEZpZWxkKGl0ZW0pO1xyXG4gICAgICAgIGlmIChmaWVsZC5nZXRDdHJsKCkgIT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayA9IG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrICsgY3VyclRhc2suRm9ybS5nZXRDb250cm9sSWR4KGZpZWxkLmdldEN0cmwoKSkgKyAxO1xyXG5cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGN1cnJUYXNrLkZvcm0gIT0gbnVsbClcclxuICAgICAgICBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArPSBjdXJyVGFzay5Gb3JtLmdldEN0cmxDb3VudCgpO1xyXG5cclxuICAgICAgbGFzdEl0ZW0gPSBjdXJySXRlbTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb250cm9sIGF0dGFjaGVkIHRvIHRoZSB2YXJpYWJsZSBpbiBzYW1lIHRhc2sgbm90IGZvdW5kXHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBjb250cm9sIGZyb20gY29udHJvbElEXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sSURcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0Q29udHJvbEZyb21Db250cm9sSUQoY29udHJvbElEOiBudW1iZXIsIHBhcmVudDogUmVmUGFyYW08bnVtYmVyPik6IE1nQ29udHJvbCB7XHJcbiAgICBsZXQgY29udHJvbDogTWdDb250cm9sID0gbnVsbDtcclxuICAgIHBhcmVudC52YWx1ZSA9IC0xO1xyXG5cclxuICAgIGlmIChjb250cm9sSUQgPj0gMCkge1xyXG4gICAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICBsZXQgY2FsbGVyVGFzazogVGFzayA9IG51bGw7XHJcbiAgICAgIGxldCBub09mQ29udHJvbHNJbkN1cnJ0YXNrOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2s6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBjb250cm9sSWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgLy8gc2F2ZSB0aGUgcm91dGUgdG8gdGhlIHJvb3QgaW4gdGhlIHRyZWVSb3V0ZSBhcnJheVxyXG4gICAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KHRoaXMuZ2V0VGFza0RlcHRoKHRydWUpKTtcclxuXHJcbiAgICAgIC8vIHRoZSByb3V0ZSB1cCwgdGhlIGluc2VydCAob3VyIHRhc2spIGlzIFswXSwgYW5kIGV4aXQgKHJvb3QpIGlzIFt0cmVlUm91dGUubGVuZ3RoIC0gMV1cclxuICAgICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgICBmb3IgKGxldCB0YXNrOiBudW1iZXIgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdGFzayA+PSAwOyB0YXNrLS0pIHtcclxuXHJcbiAgICAgICAgY3VyclRhc2sgPSB0cmVlUm91dGVbdGFza107XHJcblxyXG4gICAgICAgIGlmIChjdXJyVGFzay5Gb3JtICE9IG51bGwpIHtcclxuICAgICAgICAgIG5vT2ZDb250cm9sc0luQ3VycnRhc2sgPSBjdXJyVGFzay5Gb3JtLmdldEN0cmxDb3VudCgpO1xyXG5cclxuICAgICAgICAgIC8vIEZvdW5kIHRoZSB0YXNrIHdoaWNoIGNvbnRhaW5zIHRoZSBuZWVkZWQgY29udHJvbFxyXG4gICAgICAgICAgaWYgKGNvbnRyb2xJRCA8IChub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArIG5vT2ZDb250cm9sc0luQ3VycnRhc2spKSB7XHJcbiAgICAgICAgICAgIC8vIElkeCBvZiB0aGUgY29udHJvbCBpbiBjdXJyZW50IHRhc2tcclxuICAgICAgICAgICAgY29udHJvbElkeCA9IGNvbnRyb2xJRCAtIG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrO1xyXG4gICAgICAgICAgICBjb250cm9sID0gPE1nQ29udHJvbD5jdXJyVGFzay5Gb3JtLkN0cmxUYWIuZ2V0Q3RybChjb250cm9sSWR4KTtcclxuICAgICAgICAgICAgY2FsbGVyVGFzayA9IGN1cnJUYXNrO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArPSBub09mQ29udHJvbHNJbkN1cnJ0YXNrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gR2V0IHBhcmVudFxyXG4gICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgcGFyZW50LnZhbHVlID0gMDtcclxuICAgICAgICBsZXQgcHJldkN0bElkeDogbnVtYmVyID0gdHJlZVJvdXRlWzBdLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXg7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHRhc2s6IG51bWJlciA9IDA7IHRhc2sgPCB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdGFzaysrKSB7XHJcbiAgICAgICAgICBjdXJyVGFzayA9IHRyZWVSb3V0ZVt0YXNrXTtcclxuXHJcbiAgICAgICAgICBpZiAocHJldkN0bElkeCAhPT0gY3VyclRhc2suVGFza0RlZmluaXRpb25JZC5DdGxJbmRleClcclxuICAgICAgICAgICAgcGFyZW50LnZhbHVlKys7XHJcblxyXG4gICAgICAgICAgaWYgKGNhbGxlclRhc2suVGFza0RlZmluaXRpb25JZC5DdGxJbmRleCA9PT0gY3VyclRhc2suVGFza0RlZmluaXRpb25JZC5DdGxJbmRleClcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgcHJldkN0bElkeCA9IGN1cnJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udHJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgQ29udHJvbElEXHJcbiAgICByZXR1cm4gY29udHJvbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGN0bF9pdG1fNF9wYXJlbnRfdmVlKHBhcmVudDogbnVtYmVyLCB2ZWU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgdHNrOiBUYXNrO1xyXG4gICAgbGV0IGRlcHRoOiBudW1iZXIgPSB0aGlzLmdldFRhc2tEZXB0aCh0cnVlKTtcclxuXHJcbiAgICBpZiAocGFyZW50ICE9PSBUYXNrQmFzZS5NQUlOX1BSR19QQVJFTlRfSUQgJiYgZGVwdGggPD0gcGFyZW50KVxyXG4gICAgICByZXR1cm4gdmVlO1xyXG5cclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkoZGVwdGgpO1xyXG5cclxuICAgIGlmICh2ZWUgIT09IDApIHtcclxuICAgICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgICAvLyBnZXQgdGhlIGluZGV4IG9mIHBhcmVudCBpbiB0aGUgdGFzayB0cmVlXHJcbiAgICAgIGxldCBpbmRPZlBhcmVudEluVGFza1RyZWU6IG51bWJlciA9IHRoaXMuZ2V0SW5kT2ZQYXJlbnRJblRhc2tUcmVlKHBhcmVudCwgdHJlZVJvdXRlKTtcclxuXHJcbiAgICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICAgIGZvciAoaSA9IHRyZWVSb3V0ZS5sZW5ndGggLSAxOyBpID4gaW5kT2ZQYXJlbnRJblRhc2tUcmVlOyBpLS0pIHtcclxuICAgICAgICB0c2sgPSB0cmVlUm91dGVbaV07XHJcbiAgICAgICAgdmVlICs9IHRzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2ZWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrVHJlZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRJbmRPZlBhcmVudEluVGFza1RyZWUocGFyZW50OiBudW1iZXIsIHRhc2tUcmVlOiBUYXNrW10pOiBudW1iZXIge1xyXG4gICAgbGV0IGluZE9mUGFyZW50SW5UYXNrVHJlZTogbnVtYmVyID0gMDtcclxuICAgIGlmIChwYXJlbnQgPT09IFRhc2tCYXNlLk1BSU5fUFJHX1BBUkVOVF9JRCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDwgdGFza1RyZWUubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBpZiAodGFza1RyZWVbaV0uaXNNYWluUHJvZygpICYmIHRoaXMuX2N0bElkeCA9PT0gdGFza1RyZWVbaV0uZ2V0Q3RsSWR4KCkpIHtcclxuICAgICAgICAgIGluZE9mUGFyZW50SW5UYXNrVHJlZSA9IGk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgaW5kT2ZQYXJlbnRJblRhc2tUcmVlID0gcGFyZW50O1xyXG5cclxuICAgIHJldHVybiBpbmRPZlBhcmVudEluVGFza1RyZWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZW50cnkgcG9pbnQgdG8gdGhlIHJlY3Vyc2lvbiBpbmR1Y2VkIGJ5IGdldEZpZWxkQnlOYW1lXy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gYSBmaWVsZCB3aGljaCBiZWxvbmdzIHRvIG1lIG9yIHRvIG15IHBhcmVudHMgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZTwvcmV0dXJucz5cclxuICBnZXRGaWVsZEJ5TmFtZShmbGROYW1lOiBzdHJpbmcpOiBGaWVsZCB7XHJcbiAgICByZXR1cm4gKDxUYXNrPiAodGhpcy5HZXRDb250ZXh0VGFzaygpKSkuZ2V0RmllbGRCeU5hbWVfKGZsZE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZpbmQgZmllbGQgd2l0aCB0aGUgbmFtZSBpbiB0YXNrIG9yIGl0cyBhbmNlc3RvcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkTmFtZVwiPm5hbWUsIHRoZSBuYW1lIGNhbiBiZSBlbXB0eSBzdHJpbmcgdG9vPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IElmIHRoZSB2YXJpYWJsZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVuIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBOVUxMLjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEZpZWxkQnlOYW1lXyhmbGROYW1lOiBzdHJpbmcpOiBGaWVsZHtcclxuICAgIGxldCB0bXBUYXNrOiBUYXNrO1xyXG5cclxuICAgIGlmIChmbGROYW1lID09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgbGV0IGZsZDogRmllbGQgPSB0aGlzLmdldEZpZWxkKGZsZE5hbWUpO1xyXG5cclxuICAgIC8vIGlmIHRoZSBmaWVsZCBpcyBub3Qgb3VycyAtIHJlY3Vyc2l2ZSBjaGVjayB0aGUgYW5jZXN0b3JzXHJcbiAgICBpZiAoZmxkID09IG51bGwpIHtcclxuICAgICAgdG1wVGFzayA9IHRoaXMuZ2V0VHJpZ2dlcmluZ1Rhc2soKSAhPSBudWxsID8gdGhpcy5nZXRUcmlnZ2VyaW5nVGFzaygpIDogdGhpcy5fcGFyZW50VGFzaztcclxuXHJcbiAgICAgIGlmICh0bXBUYXNrICE9IG51bGwpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNNYWluUHJvZygpICYmIHRoaXMuZ2V0Q3RsSWR4KCkgIT09IHRtcFRhc2suZ2V0Q3RsSWR4KCkpIHtcclxuICAgICAgICAgIGxldCBtYWluUHJnOiBUYXNrID0gPFRhc2s+QWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgoLTEsIHRoaXMuZ2V0Q3RsSWR4KCkpO1xyXG4gICAgICAgICAgZmxkID0gbWFpblByZy5nZXRGaWVsZEJ5TmFtZV8oZmxkTmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZmxkID09IG51bGwpXHJcbiAgICAgICAgICBmbGQgPSB0bXBUYXNrLmdldEZpZWxkQnlOYW1lXyhmbGROYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgaW5kZXggb2YgdGhlIGZpZWxkIGluIHRoZSB0YXNrIG9yIGl0cyBhbmNlc3RvcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkTmFtZVwiPm5hbWU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gSWYgdGhlIHZhcmlhYmxlIG5hbWUgaXMgbm90IGZvdW5kIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBaZXJvLjwvcmV0dXJucz5cclxuICBnZXRJbmRleE9mRmllbGRCeU5hbWUoZmxkTmFtZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBkZXB0aDogbnVtYmVyID0gdGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSk7XHJcbiAgICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZmxkOiBGaWVsZCA9IHRoaXMuZ2V0RmllbGRCeU5hbWUoZmxkTmFtZSk7XHJcbiAgICBsZXQgZmxkVGFiOiBGaWVsZHNUYWJsZTtcclxuXHJcbiAgICBpZiAoZmxkID09IG51bGwpXHJcbiAgICAgIHJldHVybiAwO1xyXG5cclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkoZGVwdGgpO1xyXG4gICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcbiAgICBmb3IgKGxldCBjdXJyOiBudW1iZXIgPSBkZXB0aCAtIDE7IGN1cnIgPj0gMDsgY3Vyci0tKSB7XHJcbiAgICAgIGxldCBjdXJyVGFzazogVGFzayA9IHRyZWVSb3V0ZVtjdXJyXTtcclxuICAgICAgaWYgKGN1cnJUYXNrID09PSBmbGQuZ2V0VGFzaygpKSB7XHJcbiAgICAgICAgY3VyciA9IGZsZC5nZXRJZCgpO1xyXG4gICAgICAgIGluZGV4ICs9ICsrY3VycjsgICAgICAgICAvLyBzdGFydCBpbmRleCBpbiBNYWdpYyBmcm9tIDEgYW5kIG5vdCBmcm9tIDBcclxuICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgLy8gZ2V0IG91dCBvZiB0aGUgdGFzayB0cmVlIC0gdGhlIGluZGV4IGlzIGZvdW5kXHJcbiAgICAgIH1cclxuICAgICAgZmxkVGFiID0gPEZpZWxkc1RhYmxlPmN1cnJUYXNrLkRhdGFWaWV3LkdldEZpZWxkc1RhYigpO1xyXG4gICAgICBpbmRleCArPSBmbGRUYWIuZ2V0U2l6ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGluZGV4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGN1bGF0ZSB0aGUgcGF0aCBmcm9tIHRoaXMgdGFzayB0byB0aGUgcm9vdCBvZiB0aGUgdGFza3MgdHJlZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXRoXCI+YXJyYXkgb2YgdGFza3MsIHRoZSByb3V0ZSB1cC4gVGhlIDAgaXRlbSBpcyBzdGFydCBwb2ludCB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ5UGFyZW50T3JkZXJcIj5pZiB0cnVlLCB3ZSB0cmF2ZWwgdGhlIHBhcmVudHMsIG90aGVyd2lzZSB3ZSB0cmF2ZWwgdGhlIHRyaWdnZXJpbmcgdGFza3M8L3BhcmFtPlxyXG4gIHBhdGhUb1Jvb3QocGF0aDogVGFza1tdLCBieVBhcmVudE9yZGVyOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IChieVBhcmVudE9yZGVyID8gdGhpcyA6IDxUYXNrPiB0aGlzLkdldENvbnRleHRUYXNrKCkpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHBhdGhbaV0gPSB0YXNrO1xyXG4gICAgICBsZXQgY3RsSWR4OiBudW1iZXIgPSB0YXNrLmdldEN0bElkeCgpO1xyXG5cclxuICAgICAgbGV0IHRtcFRhc2s6IFRhc2sgPSBieVBhcmVudE9yZGVyID8gbnVsbCA6IHRhc2suZ2V0VHJpZ2dlcmluZ1Rhc2soKTtcclxuXHJcbiAgICAgIGlmICh0bXBUYXNrICE9IG51bGwpXHJcbiAgICAgICAgdGFzayA9IHRtcFRhc2s7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpO1xyXG5cclxuICAgICAgICBpZiAodGFzayA9PSBudWxsKSB7XHJcbiAgICAgICAgICAvLyBRQ1IgMzY2NzQ4IGlmIHdlIGFyZSBpbiBhIGNvbXBvbmVudCBnbG9iYWwgaGFuZGxlciBhZGQgaXQgdG8gdGhlIHBhdGhcclxuICAgICAgICAgIGlmICghYnlQYXJlbnRPcmRlciAmJiB0aGlzLmlzTWFpblByb2coKSAmJiB0aGlzLmdldEN0bElkeCgpICE9PSBDb25zdEludGVyZmFjZS5UT1BfTEVWRUxfQ09OVEFJTkVSKVxyXG4gICAgICAgICAgICBwYXRoW2kgKyAxXSA9IHRoaXM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChieVBhcmVudE9yZGVyICYmIGN0bElkeCAhPT0gdGFzay5nZXRDdGxJZHgoKSlcclxuICAgICAgICAgIHBhdGhbKytpXSA9IDxUYXNrPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCBjdGxJZHgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhpcyB0YXNrIHNob3VsZCBiZSByZWZyZXNoZWQgLSBjb21wYXJlIHRoZSBcInJlZnJlc2ggb25cIiBmaWVsZHMgb2YgdGhlIGN1cnJlbnQgcmVjb3JkIHRvIHRoZVxyXG4gIC8vLyAgIHByZXZpb3VzIHJlY29yZCBhbmQgaWYgZGlmZmVyZW50IHZhbHVlcyBhcmUgZm91bmQgcmV0dXJucyB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNob3VsZEJlUmVmcmVzaGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGRhdGFWaWV3OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLl9wYXJlbnRUYXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIHByZXZDdXJyUmVjIGlzIG51bGwgb25seSBpZiBpdCBpcyB0aGUgZmlyc3QgdGltZSBvciBhZnRlciBDYW5jZWwuXHJcbiAgICAvLyBBZnRlciBDYW5jZWwgaW4gdGhlIHBhcmVudCB0YXNrIFN1YmZvcm0gcmVmcmVzaCBtdXN0IGJlIGRvbmUgYWx3YXlzXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VGFzayA9PT0gbnVsbCB8fCBkYXRhVmlldy5pc1ByZXZDdXJyUmVjTnVsbCgpIHx8XHJcbiAgICAgICh0aGlzLlJlZnJlc2hPblZhcnMgIT09IG51bGwgJiYgIWRhdGFWaWV3LmN1cnJFcXVhbHNQcmV2KHRoaXMuUmVmcmVzaE9uVmFycykpKVxyXG4gICAgICByZXN1bHQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBzdWJUYXNrcyAoc3ViZm9ybXMpIHNob3VsZCBiZSByZWZyZXNoZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIENoZWNrUmVmcmVzaFN1YlRhc2tzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHJldDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGRvIG5vdCByZWZyZXNoIHN1YmZvcm1zIGJlZm9yZSB0aGUgZmlyc3QgcmVjb3JkIHByZWZpeC4gVGhlIHNlcnZlciBzZW50IHVzIHRoZWlyIGRhdGF2aWV3IVxyXG4gICAgaWYgKHRoaXMuX2VudGVyZWRSZWNMZXZlbCkge1xyXG4gICAgICBsZXQgc3ViZm9ybXNUb1JlZnJlc2g6IExpc3Q8VGFzaz4gPSBhd2FpdCB0aGlzLkdldFN1YmZvcm1zVG9SZWZyZXNoKCk7XHJcblxyXG4gICAgICBpZiAoc3ViZm9ybXNUb1JlZnJlc2gubGVuZ3RoID4gMClcclxuICAgICAgICByZXQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyBhIGxpc3Qgb2Ygc3VidGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5hIGxpc3Qgb2Ygc3VidGFza3M8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBHZXRTdWJUYXNrcygpOiBMaXN0PFRhc2s+IHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IG5ldyBMaXN0PFRhc2s+KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkgPSBpICsgMSlcclxuICAgICAgICBzdWJUYXNrcy5wdXNoKDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN1YlRhc2tzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXRzIGEgbGlzdCBvZiB0aG9zZSBzdWJmb3JtcyB0aGF0IG11c3QgYmUgcmVmcmVzaGVkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmxpc3Qgb2Ygc3ViZm9ybXMgdG8gcmVmcmVzaDwvcmV0dXJucz5cclxuICBhc3luYyBHZXRTdWJmb3Jtc1RvUmVmcmVzaCgpOiBQcm9taXNlPExpc3Q8VGFzaz4+IHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IHRoaXMuR2V0U3ViVGFza3MoKTtcclxuICAgIGxldCBzdWJUYXNrc1RvUmVmcmVzaDogTGlzdDxUYXNrPiA9IG5ldyBMaXN0PFRhc2s+KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN1YlRhc2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gc3ViVGFza3MuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIGlmIChhd2FpdCB0aGlzLlNob3VsZFJlZnJlc2hTdWJmb3JtVGFzayhzdWJUYXNrKSlcclxuICAgICAgICBzdWJUYXNrc1RvUmVmcmVzaC5wdXNoKHN1YlRhc2spXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN1YlRhc2tzVG9SZWZyZXNoO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2sgaWYgdGhlIHNwZWNpZmljIHN1YmZvcm0gbXVzdCBiZSByZWZyZXNoZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YlRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgU2hvdWxkUmVmcmVzaFN1YmZvcm1UYXNrKHN1YlRhc2s6IFRhc2spOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+c3ViVGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKTtcclxuXHJcbiAgICBzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IGZhbHNlO1xyXG4gICAgLy8gRGVmZWN0IDc2OTc5LiBTdWJmb3JtIGNhbiBleGVjdXRlIHJlZnJlc2ggb25seSBhZnRlciBpdCBoYXMgVGFza1ZpZXcuXHJcbiAgICBpZiAoc3ViZm9ybUN0cmwgIT0gbnVsbCAmJiAhc3ViVGFzay5JblNlbGVjdCAmJiBzdWJUYXNrLkFmdGVyRmlyc3RSZWNvcmRQcmVmaXgpIHtcclxuICAgICAgbGV0IHBhcmVudE1vZGU6IHN0cmluZyA9IHRoaXMuZ2V0TW9kZSgpO1xyXG4gICAgICBsZXQgbW9kZVByb3BlcnR5OiBudW1iZXIgPSAocGFyZW50TW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSA/IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1FVRVJZXHJcbiAgICAgICAgOiBwYXJlbnRNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX01PRElGWVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSk7XHJcblxyXG4gICAgICAvLyBGb3IgYSBzdWJmb3JtIHdpdGggJ0FzUGFyZW50JyBtb2RlIHdlIGFsc28gbXVzdCByZWZyZXNoIHRoZSBzdWJmb3JtXHJcbiAgICAgIC8vIGFmdGVyIHRoZSBwYXJlbnQgcmVjb3JkIHByZWZpeC4gSWYgdGhlIHNwZWNpZmljIG1vZGUgaXMgbm90IGFsbG93ZWRcclxuICAgICAgLy8gdGhlIHN1YmZvcm0gY29udGludWVzIGluIHRoZSBvbGQgbW9kZS5cclxuICAgICAgaWYgKHN1YlRhc2suTW9kZUFzUGFyZW50ICYmIHBhcmVudE1vZGUgIT09IHN1YlRhc2suZ2V0TW9kZSgpICYmXHJcbiAgICAgICAgdGhpcy5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQgJiZcclxuICAgICAgICBhd2FpdCAoc3ViVGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX09QVElPTikpLmdldFZhbHVlQm9vbGVhbigpICYmXHJcbiAgICAgICAgYXdhaXQgc3ViVGFzay5jaGVja1Byb3AobW9kZVByb3BlcnR5LCB0cnVlKSkge1xyXG4gICAgICAgIGlmICghc3ViZm9ybUN0cmwuaXNWaXNpYmxlKCkgJiZcclxuICAgICAgICAgICFhd2FpdCBzdWJmb3JtQ3RybC5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTiwgZmFsc2UpKSB7XHJcbiAgICAgICAgICBzdWJmb3JtQ3RybC5SZWZyZXNoT25WaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgIHJlZnJlc2ggPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmVmcmVzaCA9IHRydWU7XHJcblxyXG4gICAgICAgIGF3YWl0IHN1YlRhc2suU2V0TW9kZUFzUGFyZW50KHBhcmVudE1vZGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJlZnJlc2ggPSBhd2FpdCBzdWJmb3JtQ3RybC5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVVUT19SRUZSRVNILCB0cnVlKSAmJiBzdWJUYXNrLnNob3VsZEJlUmVmcmVzaGVkKCk7XHJcblxyXG4gICAgICAgIGlmIChyZWZyZXNoKSB7XHJcbiAgICAgICAgICBpZiAoIXN1YmZvcm1DdHJsLmlzVmlzaWJsZSgpICYmXHJcbiAgICAgICAgICAgICFhd2FpdCBzdWJmb3JtQ3RybC5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTiwgZmFsc2UpKSB7XHJcbiAgICAgICAgICAgIHN1YmZvcm1DdHJsLlJlZnJlc2hPblZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICByZWZyZXNoID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVmcmVzaClcclxuICAgICAgICBzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVmcmVzaDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0cyB0aGUgdGFzayBtb2RlIGFzIHBhcmVudCBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJlbnRNb2RlXCI+PC9wYXJhbT5cclxuICBhc3luYyBTZXRNb2RlQXNQYXJlbnQocGFyZW50TW9kZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmVuYWJsZU1vZGVzKCk7XHJcblxyXG4gICAgaWYgKHBhcmVudE1vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX0NSRUFURSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICB0aGlzLnNldFByZXZlbnRSZWNvcmRTdWZmaXgodHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodHJ1ZSk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKTtcclxuICAgICAgdGhpcy5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgdGhpcy5zZXRQcmV2ZW50Q29udHJvbENoYW5nZShmYWxzZSk7XHJcbiAgICAgIGxldCBzdWJUYXNrRHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuRGF0YVZpZXc7XHJcbiAgICAgIGlmICghc3ViVGFza0R2LmlzRW1wdHkoKSAmJiAoc3ViVGFza0R2LmdldEN1cnJSZWMoKSkuZ2V0TW9kZSgpICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICAgIHRoaXMuc2V0TW9kZShwYXJlbnRNb2RlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgIGF3YWl0ICg8TWdGb3JtPnRoaXMuZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5zZXRNb2RlKHBhcmVudE1vZGUpO1xyXG5cclxuICAgIHRoaXMuc2V0T3JpZ2luYWxUYXNrTW9kZShwYXJlbnRNb2RlKTtcclxuICAgIGF3YWl0IHRoaXMuc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBhZnRlciBjb21wdXRlIGRvIHN1YmZvcm0gdGFzayByZWNvcmQgcHJlZml4ICYgc3VmZml4XHJcbiAgYXN5bmMgZG9TdWJmb3JtUmVjUHJlZml4U3VmZml4KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHN1YlRhc2tzOiBMaXN0PFRhc2s+ID0gdGhpcy5HZXRTdWJUYXNrcygpO1xyXG5cclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3ViVGFza3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHN1YlRhc2s6IFRhc2sgPSBzdWJUYXNrcy5nZXRfSXRlbShpKTtcclxuICAgICAgaWYgKHN1YlRhc2suRG9TdWJmb3JtUHJlZml4U3VmZml4KSB7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2goc3ViVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIHRydWUpO1xyXG4gICAgICAgIGlmICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ2xlYW4gZmxhZyBmb3IgU3ViZm9ybSByZWNvcmQgY3ljbGUgPC9zdW1tYXJ5PlxyXG4gIENsZWFuRG9TdWJmb3JtUHJlZml4U3VmZml4KCk6IHZvaWQge1xyXG4gICAgbGV0IHN1YlRhc2tzOiBMaXN0PFRhc2s+ID0gdGhpcy5HZXRTdWJUYXNrcygpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdWJUYXNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgc3ViVGFzazogVGFzayA9IHN1YlRhc2tzLmdldF9JdGVtKGkpO1xyXG4gICAgICBzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBtdXN0IGRpc3BsYXkgY29uZmlybWF0aW9uIHdpbmRvdyBwcmlvciB0byBkZWxldGluZyBhIHJlY29yZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIG11c3RDb25maXJtSW5EZWxldGVNb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fVVBEQVRFKTtcclxuXHJcbiAgICAvLyBBcyBzdHJhbmdlIGFzIGl0IHNvdW5kcywgaWYgdGhlIHByb3BlcnR5IGlzIGFuIGV4cHJlc3Npb24gd2hpY2ggZXZhbHVhdGVzIHRvXHJcbiAgICAvLyBGYWxzZSwgdGhlbiBubyBuZWVkIHRvIGRpc3BsYXkgY29uZmlybWF0aW9uLi4uXHJcbiAgICByZXR1cm4gIXByb3AuaXNFeHByZXNzaW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGEgc3ViLXRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3ViVGFza1wiPnRoZSBzdWIgdGFzayB0byBhZGQ8L3BhcmFtPlxyXG4gIGFkZFN1YlRhc2soc3ViVGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuU3ViVGFza3MgPT09IG51bGwpXHJcbiAgICAgIHRoaXMuU3ViVGFza3MgPSBuZXcgVGFza3NUYWJsZSgpO1xyXG4gICAgdGhpcy5TdWJUYXNrcy5hZGRUYXNrKHN1YlRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZSBvbmUgb2YgdGhpcyB0YXNrcyBzdWItdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJUYXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHN1Yi10YXNrIHRvIHJlbW92ZTwvcGFyYW0+XHJcbiAgcmVtb3ZlU3ViVGFzayhzdWJUYXNrOiBUYXNrKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5TdWJUYXNrcyAhPT0gbnVsbClcclxuICAgICAgdGhpcy5TdWJUYXNrcy5yZW1vdmVUYXNrKHN1YlRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGZhaWxlZCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgb2YgdGhlIGZsYWc8L3BhcmFtPlxyXG4gIHNldFRyYW5zYWN0aW9uRmFpbGVkKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fdHJhbnNhY3Rpb25GYWlsZWQgPSB2YWw7XHJcblxyXG4gICAgaWYgKCF2YWwpXHJcbiAgICAgIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgXCJkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGZhaWxlZFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGV2ZWxcIj5pcyB0aGUgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBsZXZlbCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBjaGVja2luZy4gVFJBTlNfTk9ORSAtLT4gY2hlY2sgZm9yIGFueVxyXG4gIC8vLyAgIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gbGV2ZWwgZmFpbHVyZSBUUkFOU19SRUNPUkQvVEFTS19QUkVGSVggLS0+IGNoZWNrIGZvciBhIGZhaWx1cmUgaW4gdGhhdCBzcGVjaWZpY1xyXG4gIC8vLyAgIGxldmVsPC9wYXJhbT5cclxuICB0cmFuc2FjdGlvbkZhaWxlZChsZXZlbDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAobGV2ZWwgPT09IENvbnN0SW50ZXJmYWNlLlRSQU5TX05PTkUgfHxcclxuICAgICAgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmdldExldmVsKCkgPT09IGxldmVsKSlcclxuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uRmFpbGVkO1xyXG4gICAgZWxzZSBpZiAobGV2ZWwgPT09IENvbnN0SW50ZXJmYWNlLlRSQU5TX05PTkUgfHxcclxuICAgICAgKHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuZ2V0TGV2ZWwoKSA9PT0gbGV2ZWwpKVxyXG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb25GYWlsZWQ7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBmbGFnIG9mIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvbiByZXRyeSBvbiB0aGUgdGFzaydzIGR5bmFtaWNEZWYudHJhbnNhY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dmFsdWUgb2YgZmxhZzwvcGFyYW0+XHJcbiAgc2V0QWZ0ZXJSZXRyeSh2YWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbClcclxuICAgICAgdGhpcy5UcmFuc2FjdGlvbi5zZXRBZnRlclJldHJ5KHZhbCk7XHJcbiAgICBlbHNlIGlmICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsKSB7XHJcbiAgICAgIGlmICh2YWwgPT09IENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpXHJcbiAgICAgICAgdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkgPSBudWxsO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuc2V0QWZ0ZXJSZXRyeSh2YWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0QWZ0ZXJSZXRyeSgpOiBib29sZWFuO1xyXG4gIGdldEFmdGVyUmV0cnkocmVjb3Zlcnk6IHN0cmluZyk6IGJvb2xlYW47XHJcbiAgZ2V0QWZ0ZXJSZXRyeShyZWNvdmVyeT86IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0QWZ0ZXJSZXRyeV8wKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5nZXRBZnRlclJldHJ5XzEocmVjb3ZlcnkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoaXMgdGFzayBpcyBwYXJ0IG9mIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBjdXJyZW50bHkgYmVpbmcgcmV0cmllZDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEFmdGVyUmV0cnlfMCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLlRyYW5zYWN0aW9uLmdldEFmdGVyUmV0cnkoKTtcclxuICAgIGVsc2UgaWYgKHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeS5nZXRBZnRlclJldHJ5KCk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgdGhpcyB0YXNrIGlzIHBhcnQgb2YgYSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGN1cnJlbnRseSBiZWluZyByZXRyaWVkIHdpdGggYSBzcGVjaWZpYyByZWNvdmVyeTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEFmdGVyUmV0cnlfMShyZWNvdmVyeTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbi5nZXRBZnRlclJldHJ5KHJlY292ZXJ5KTtcclxuICAgIGVsc2UgaWYgKHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeS5nZXRBZnRlclJldHJ5KHJlY292ZXJ5KTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIEV4ZWNFbmRUYXNrIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIF9iRXhlY0VuZFRhc2sgdmFsdWU8L3JldHVybnM+XHJcbiAgZ2V0RXhlY0VuZFRhc2soKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYkV4ZWNFbmRUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSBcImV4ZWN1dGUgZW5kIHRhc2tcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldEV4ZWNFbmRUYXNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYkV4ZWNFbmRUYXNrID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdGhlIFwiZXhlY3V0ZSBlbmQgdGFza1wiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEV4ZWNFbmRUYXNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYkV4ZWNFbmRUYXNrID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBFdmFsdWF0ZSB0aGUgZW5kIGNvbmRpdGlvbiBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtb2RlXCI+dGhlIG1vZGUgdG8gY29tcGFyZSB0bzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzaG91bGQgd2UgZXZhbHVhdGUgdGhlIGVuZCBjb25kaXRpb24/PC9yZXR1cm5zPlxyXG4gIGFzeW5jIGV2YWxFbmRDb25kKG1vZGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGVuZFRhc2tDb25kUHJvcDogUHJvcGVydHk7XHJcbiAgICBsZXQgZXZhbEVuZENvbmRQcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FVkFMX0VORF9DT05ESVRJT04pO1xyXG5cclxuICAgIC8vIERvbnQgZXZhbHVhdGUgZW5kIGNvbmRpdGlvbiBpZiB3ZSBhcmUgYWxyZWFkeSBjbG9zaW5nIHRoZSB0YXNrXHJcbiAgICBpZiAodGhpcy5JbkVuZFRhc2spXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fYkV4ZWNFbmRUYXNrKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBpZiAoZXZhbEVuZENvbmRQcm9wICE9IG51bGwgJiYgKCBOU3RyaW5nLkNvbXBhcmUoYXdhaXQgZXZhbEVuZENvbmRQcm9wLmdldFZhbHVlKCksIENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfSU1NSURJQVRFLFxyXG4gICAgICAgIHRydWUpID09PSAwIHx8ICgoYXdhaXQgZXZhbEVuZENvbmRQcm9wLmdldFZhbHVlKCkpLnRvTG93ZXJDYXNlKCkgPT09IG1vZGUudG9Mb3dlckNhc2UoKSkpKSB7XHJcbiAgICAgIC8vIGNoZWNrIHRoZSBlbmQgY29uZGl0aW9uXHJcbiAgICAgIGVuZFRhc2tDb25kUHJvcCA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkRfQ09ORElUSU9OKTtcclxuICAgICAgaWYgKGVuZFRhc2tDb25kUHJvcCA9PSBudWxsKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgbGV0IGVuZFRhc2s6IHN0cmluZyA9IGF3YWl0IGVuZFRhc2tDb25kUHJvcC5nZXRWYWx1ZSgpO1xyXG4gICAgICAvLyBzaWduYWwgd2UgbmVlZCB0byBwZXJmb3JtIGFuIGVuZCB0YXNrIGFmdGVyIHdlIGdldCBvdXQgb2YgdGhlIGxvb3BcclxuICAgICAgaWYgKERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKGVuZFRhc2spKSB7XHJcbiAgICAgICAgdGhpcy5fYkV4ZWNFbmRUYXNrID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBcInRyeWluZyB0byBzdG9wXCIgZmxhZyBmb3IgdGhlIHRhc2sgYW5kIGl0J3Mgc3ViVGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIGZsYWc8L3BhcmFtPlxyXG4gIHNldFRyeWluZ1RvU3RvcCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICB0YXNrLnNldFRyeWluZ1RvU3RvcCh2YWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLklzVHJ5aW5nVG9TdG9wID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgYkluUmVjb3JkU3VmZml4XHJcbiAgLy8vIDwvc3VtbWFyeVxyXG4gIGdldEluUmVjb3JkU3VmZml4KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luUmVjb3JkU3VmZml4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgYkluUmVjb3JkU3VmZml4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRJblJlY29yZFN1ZmZpeChiVmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGlmIChiVmFsdWUgIT09IHRoaXMuX2luUmVjb3JkU3VmZml4KSB7XHJcbiAgICAgIHRoaXMuX2luUmVjb3JkU3VmZml4ID0gYlZhbHVlO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGJFdmFsT2xkVmFsdWVzIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYkZsYWdcIj50cnVlL2ZhbHNlIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUvZmxhc2UgLSB2YWx1ZSB1cGRhdGVkPC9yZXR1cm5zPlxyXG4gIHNldEV2YWxPbGRWYWx1ZXMoYkZsYWc6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGlmIChiRmxhZyAhPT0gdGhpcy5fZXZhbE9sZFZhbHVlcykge1xyXG4gICAgICB0aGlzLl9ldmFsT2xkVmFsdWVzID0gYkZsYWc7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgYkV2YWxPbGRWYWx1ZXMgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZS9mYWxzZSAtIGxvb2sgYXQgb2xkIHZhbHVlcyB3aGVuIGdldHRpbmcgdGhlIGZpZWxkIHZhbHVlPC9yZXR1cm5zPlxyXG4gIGdldEV2YWxPbGRWYWx1ZXMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXZhbE9sZFZhbHVlcztcclxuICB9XHJcblxyXG4gICBhc3luYyBlbmRUYXNrKHJldmVyc2libGVFeGl0OiBib29sZWFuLCBvbmx5RGVzY3M6IGJvb2xlYW4sIGR1ZVRvVmVyaWZ5RXJyb3I6IGJvb2xlYW4sIHN1YmZvcm1EZXN0aW5hdGlvbj86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChzdWJmb3JtRGVzdGluYXRpb24pKVxyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5lbmRUYXNrXzEocmV2ZXJzaWJsZUV4aXQsIG9ubHlEZXNjcywgZmFsc2UsIGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5lbmRUYXNrXzEocmV2ZXJzaWJsZUV4aXQsIG9ubHlEZXNjcywgc3ViZm9ybURlc3RpbmF0aW9uLCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgc3VjY2VlZGVkIGluIGVuZGluZyB0aGUgdGFzayBhbmQgaXRzIHN1YiB0YXNrc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXZlcnNpYmxlRXhpdFwiPmlmIHRydWUgdGhlbiB0aGUgZXhpdCBpcyByZXZlcnNpYmxlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9ubHlEZXNjc1wiPmlmIHRydWUgdGhlbiBlbmQgb25seSB0aGUgc3ViIHRhc2tzIGFuZCBoYW5kbGUgcmVjIHN1ZmZpeCBmb3IgdGhpcyB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1YmZvcm1EZXN0aW5hdGlvblwiPmlmIHRydWUgdGhlbiBlbmQgb25seSB0aGlzIHRhc2s8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgZW5kVGFza18xKHJldmVyc2libGVFeGl0OiBib29sZWFuLCBvbmx5RGVzY3M6IGJvb2xlYW4sIHN1YmZvcm1EZXN0aW5hdGlvbjogYm9vbGVhbiwgZHVlVG9WZXJpZnlFcnJvcjogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHN1Y2NlZWRlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgY2xvc2VkU3ViRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHN1YlRhc2s6IFRhc2s7XHJcbiAgICBsZXQgbWdkVGFiOiBJTUdEYXRhQ29sbGVjdGlvbiA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZTtcclxuXHJcbiAgICBpZiAoKHRoaXMuSXNTdWJGb3JtICYmICFzdWJmb3JtRGVzdGluYXRpb24pICYmICF0aGlzLl9wYXJlbnRUYXNrLkluRW5kVGFzaykge1xyXG4gICAgICAvLyBpZiB0aGlzIHRhc2sgaXMgYSBzdWJmb3JtIGFuZCBpdHMgcGFyZW50IGlzIG5vdCB0cnlpbmcgdG8gc3RvcCB0aGVuXHJcbiAgICAgIC8vIHN0YXJ0IHN0b3BwaW5nIHRoZSB0YXNrcyBzdWIgdHJlZSBmcm9tIHRoZSBwYXJlbnQgZm9ybVxyXG4gICAgICBzdWNjZWVkZWQgPSBhd2FpdCB0aGlzLl9wYXJlbnRUYXNrLmVuZFRhc2socmV2ZXJzaWJsZUV4aXQsIG9ubHlEZXNjcywgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghdGhpcy5pc0Fib3J0aW5nKCkgJiYgIXRoaXMuSW5FbmRUYXNrKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5JbkVuZFRhc2sgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBJbiBjYXNlIG9mIGVycm9yIGFuZCBicm93c2VyIGNsb3NlLCBpbnRpbWF0ZSBzZXJ2ZXIgYWJvdXQgYnJvd3NlciBjbG9zZVxyXG4gICAgICAgIGlmKChNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuSW5FbmRUYXNrICYmIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5DbG9zaW5nRm9ybVVJKSAmJiBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlVW5sb2FkQ29tbWFuZCgpO1xyXG4gICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNR0RhdGEoMCkuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgICAgYXdhaXQgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuSXNUcnlpbmdUb1N0b3ApXHJcbiAgICAgICAgICB0aGlzLnNldFRyeWluZ1RvU3RvcCh0cnVlKTtcclxuXHJcbiAgICAgICAgLy8gZXhpdCBmcm9tIHN1YlRhc2tzIGluIGEgcHJlZml4IG1hbm5lclxyXG4gICAgICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHJldmVyc2libGVFeGl0KSB7XHJcbiAgICAgICAgICAvLyBleGl0IGZyb20gdGhlIHN1YiB0YXNrc1xyXG4gICAgICAgICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKCFSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAgIGxldCBwZW5kaW5nVHJhbnNhY3Rpb25zOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBsZXQgY2xpZW50T3BlckV4aXN0OiBib29sZWFuID0gYXdhaXQgdGhpcy5DaGVja0lmQ2xpZW50T3BlcmF0aW9uRXhpc3RzSW5TdWJmb3JtVGFza3ModGhpcyxcclxuICAgICAgICAgICAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWCk7XHJcbiAgICAgICAgICAgICAgaWYgKCFjbGllbnRPcGVyRXhpc3QpIHtcclxuICAgICAgICAgICAgICAgIGNsaWVudE9wZXJFeGlzdCA9IGF3YWl0IHRoaXMuQ2hlY2tJZkNsaWVudE9wZXJhdGlvbkV4aXN0c0luU3ViZm9ybVRhc2tzKHRoaXMsXHJcbiAgICAgICAgICAgICAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgICBpZiAoIWNsaWVudE9wZXJFeGlzdClcclxuICAgICAgICAgICAgICAgICAgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IHRoaXMuQ2hlY2tJZlBlbmRpbmdUcmFuc2FjdGlvbnModGhpcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICghY2xpZW50T3BlckV4aXN0ICYmICFwZW5kaW5nVHJhbnNhY3Rpb25zKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNldFNlcnZlclNpZGVUYXNrU3VmZml4KHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgodGhpcyk7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKSAmJiBzdWNjZWVkZWQ7IGkrKykge1xyXG4gICAgICAgICAgICAgIHN1YlRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgICAgICAgY2xvc2VkU3ViRm9ybSA9IGNsb3NlZFN1YkZvcm0gfHwgc3ViVGFzay5Jc1N1YkZvcm07XHJcbiAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YlRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICAgIHRoaXMuU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgodGhpcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBleGl0IGZvciB0aGUgZmlyc3QgdGFzayBtdXN0IGVuZCBhbGwgdGFza3NcclxuICAgICAgICAgIGlmICh0aGlzID09PSBtZ2RUYWIuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKSkge1xyXG4gICAgICAgICAgICBmb3IgKGkgPSBtZ2RUYWIuZ2V0U2l6ZSgpIC0gMTsgaSA+IDAgJiYgc3VjY2VlZGVkOyBpLS0pIHtcclxuICAgICAgICAgICAgICBpZiAobWdkVGFiLmdldE1HRGF0YShpKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sobWdkVGFiLmdldE1HRGF0YShpKS5nZXRGaXJzdFRhc2soKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3VjY2VlZGVkKSB7XHJcbiAgICAgICAgICAvLyBpZiBjbG9zaW5nIHRoZSBzdWIgdGFza3Mgd2FzIHN1Y2Nlc3NmdWwgdGhlbiBleGVjdXRlIHJlY29yZCBzdWZmaXhcclxuICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCAmJiAhZHVlVG9WZXJpZnlFcnJvcikge1xyXG4gICAgICAgICAgICBsZXQgZm9yY2VTdWZmaXg6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gZm9yIG5vbiBpbnRlcmFjdGl2ZSwgdHVybiBvZmYgdGhlIGZvcmNlIHJlY29yZCBzdWZmaXgsXHJcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBhbiB1bndhbnRlZCB1cGRhdGUgbWlnaHQgYmUgc2VudCB3aGVuIHRhc2sgZW5kcy5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLklzSW50ZXJhY3RpdmUgJiYgZm9yY2VTdWZmaXggPT09IHRydWUgJiYgdGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIFwiMFwiKTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcblxyXG4gICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBmb3JjZSBzdWZmaXgsIGZvciBqdXN0IGluIGNhc2UuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5Jc0ludGVyYWN0aXZlICYmIGZvcmNlU3VmZml4ID09PSB0cnVlICYmIHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICB0aGlzLnNldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBcIjFcIik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG5cclxuICAgICAgICAgIGlmIChzdWNjZWVkZWQgJiYgIW9ubHlEZXNjcylcclxuICAgICAgICAgICAgdGhpcy5IYW5kbGVUcmFuc2FjdGlvbkluZm8oKTtcclxuXHJcbiAgICAgICAgICBsZXQgcHJlVHNrU3VmZml4OiBib29sZWFuID0gc3VjY2VlZGVkO1xyXG5cclxuICAgICAgICAgIC8vIG5vdyBwZXJmb3JtIHRhc2sgc3VmZml4XHJcbiAgICAgICAgICBpZiAoc3VjY2VlZGVkICYmICFvbmx5RGVzY3MgJiYgcmV2ZXJzaWJsZUV4aXQgJiYgIWR1ZVRvVmVyaWZ5RXJyb3IgJiZcclxuICAgICAgICAgICAgKCF0aGlzLklzU3ViRm9ybSB8fCBzdWJmb3JtRGVzdGluYXRpb24pICYmXHJcbiAgICAgICAgICAgIHRoaXMuVGFza1ByZWZpeEV4ZWN1dGVkICYmICF0aGlzLlRhc2tTdWZmaXhFeGVjdXRlZClcclxuICAgICAgICAgICAgc3VjY2VlZGVkID0gYXdhaXQgdGhpcy5oYW5kbGVUYXNrU3VmZml4KHRydWUpO1xyXG5cclxuICAgICAgICAgIC8vIERvbid0IGZvcmdldCB0byBleGl0IGZyb20gYW55IHN1YlRhc2tzIG9wZW5lZCBkdXJpbmcgdGhlIGxhc3QgcmVjLXN1ZmZpeCBvciB0YXNrIHN1ZmZpeFxyXG4gICAgICAgICAgaWYgKHJldmVyc2libGVFeGl0ICYmIHRoaXMuaGFzU3ViVGFza3MoKSlcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpKyspIHtcclxuXHJcbiAgICAgICAgICAgICAgc3ViVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCFzdWJUYXNrLklzU3ViRm9ybSlcclxuICAgICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZU5vblJldmVyc2libGVFdmVudChzdWJUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBkb250IGNvbnRpbnVlIHdpdGggdGFzayBleGl0IGlmIGEgZGF0YSBlcnJvciBvY2N1cmVkIGR1cmluZyB0YXNrIHN1ZmZpeCAoZS5nLiByb2xsYmFjaygpKVxyXG4gICAgICAgICAgaWYgKHJldmVyc2libGVFeGl0KVxyXG4gICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcik7XHJcblxyXG4gICAgICAgICAgLy8gdGFzayBzdWZmaXggb25seSBzdG9wcyBleGVjdXRpb24gZm9yIGN1cnJlbnQgdGFzaywgd2hpY2ggaXMgYmVpbmcgY2xvc2VkXHJcbiAgICAgICAgICBpZiAocHJlVHNrU3VmZml4KVxyXG4gICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNldEFmdGVyUmV0cnkoQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSk7XHJcblxyXG4gICAgICAgICAgaWYgKCF0aGlzLmlzQWJvcnRpbmcoKSAmJiBzdWNjZWVkZWQgJiYgIW9ubHlEZXNjcykge1xyXG4gICAgICAgICAgICAvLyBUcnkgY2xvc2luZyBhbnkgdGFzayBsZXZlbCBkeW5hbWljRGVmLnRyYW5zYWN0aW9uXHJcbiAgICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25GYWlsZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuVGFza1RyYW5zYWN0aW9uTWFuYWdlci5jaGVja0FuZENvbW1pdChmYWxzZSwgQ29uc3RJbnRlcmZhY2UuVFJBTlNfVEFTS19QUkVGSVgsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcikgJiYgIXRoaXMuaXNBYm9ydGluZygpICYmICF0aGlzLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1RBU0tfUFJFRklYKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN1Y2NlZWRlZCkge1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuRGVsYXlDb21tYW5kRXhlY3V0aW9uKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBsZXQgYmFzZU1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLlN0YXJ0dXBNZ0RhdGE7XHJcbiAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGNsb3NpbmcgdGhlIHRvcG1vc3QgdGFzayAtIGRvbnQgbG9vc2UgYW55IGV2ZW50cywgbGVmdCBpbiB0aGUgcXVldWVcclxuICAgICAgICAgICAgICBpZiAocmV2ZXJzaWJsZUV4aXQgJiYgYmFzZU1nZC5nZXRGaXJzdFRhc2soKS5nZXRUYXNrVGFnKCkgPT09IHRoaXMuZ2V0VGFza1RhZygpKSB7XHJcbiAgICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2sodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVFdmVudHMoYmFzZU1nZCwgMCk7XHJcbiAgICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHZhciBzdCA9IG5ldyBTZXNzaW9uU3RhdGlzdGljc0Zvcm0oKTtcclxuICAgICAgICAgICAgICAgIC8vIHN0LldyaXRlVG9GbG93TW9uaXRvcigoRmxvd01vbml0b3JRdWV1ZSlfZmxvd01vbml0b3IpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAvL2Fib3J0aW5nIHRhc2sgY2xvc3VyZVxyXG4gICAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBhd2FpdCBUYXNrU2VydmljZUJhc2UuRXhpdCh0aGlzLCByZXZlcnNpYmxlRXhpdCwgc3ViZm9ybURlc3RpbmF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gV2hlbiBjbG9zaW5nIGEgdGFzayB3aG9zZSBwYXJlbnQgaXMgYSBtYWluIHByb2dyYW0sIGNoZWNrIHRoZSBtYWluIHByb2dyYW0ncyBlbmRcclxuICAgICAgICAgICAgICAvLyBjb25kaXRpb25cclxuICAgICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50VGFzayAhPSBudWxsICYmIHRoaXMuX3BhcmVudFRhc2suaXNNYWluUHJvZygpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWdkOiBNR0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKDApO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1haW5QcmdUYXNrOiBUYXNrID0gbWdkLmdldE1haW5Qcm9nKDApO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJvb3RUYXNrOiBUYXNrID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZW5kTWFpblByZzogYm9vbGVhbiA9IGF3YWl0IG1haW5QcmdUYXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkRfQ09ORElUSU9OLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBlbmQgdGhlIHJvb3QgdGFzayBpZiB3ZSBhcmUgYWxyZWFkeSBkb2luZyBpdC5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzICE9PSByb290VGFzayAmJiBlbmRNYWluUHJnKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQocm9vdFRhc2spO1xyXG4gICAgICAgICAgICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xPU0UpO1xyXG4gICAgICAgICAgICAgICAgICBydEV2dC5zZXRDdHJsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICBydEV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5hZGRUb1RhaWwocnRFdnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBNZ0Zvcm0uQ3JlYXRlZEZvcm1zLnJlbW92ZSg8TWdGb3JtPnRoaXMuRm9ybSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgIGlmICghdGhpcy5Jc1N1YkZvcm0gfHwgc3ViZm9ybURlc3RpbmF0aW9uKVxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVGaW5hbGx5RW5kVGFzayhzdWNjZWVkZWQsIHJldmVyc2libGVFeGl0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFjciAjOTE0NjQ1IDogcmV0dXJuIGZhbHNlIGluIGEgcmVjdXJzaXZlIGNhbGwuXHJcbiAgICAvLyBvdGhlcndpc2UgY29tbW9uSGFuZGxlckFmdGVyKGV2ZW50TWFuYWdlcikgd2lsbCBub3QgYmUgZXhlY3V0ZWQgaWYgdGhlIGNhbGwgaXMgcmVjdXJzaXZlbHkgbWFkZSBmcm9tIGhhbmRsZUV2ZW50LlxyXG4gICAgLy8gZm9yIGV4YW1wbGUgOiB0YXNrIGNvbmQgZnVsZmlsbGVkLiBoYW5kbGVJbnRlcm5hbEV2ZW50KHRoaXMsIE1HX0FDVF9SRUNfU1VGRklYKSBpcyBjYWxsZWQuXHJcbiAgICAvLyB3aGlsZSBpbiByZWMgc3VmIGhhbmRsZXIsIGVuZFRhc2sgaXMgY2FsbGVkIGFnYWluLi5pZiB3ZSByZXR1cm4gdHJ1ZSB0aGVuIHRoZSBjb21tb25IYW5kbGVyQWZ0ZXIgaXMgbm90IGV4ZWN1dGVkLlxyXG4gICAgLy8gaWYgdGhlIHJlYyBzdWZmaXggaGFuZGxlciBkaWQgbm90IGV4aXN0LCB0aGVyZSB3aWxsIGJlIG5vIGNhbGwgdG8gZW5kVGFzayBhbmQgdGhlIGNvbW1vbkhhbmRsZXJBZnRlciB3aWxsIGJlIGV4ZWN1dGVkLlxyXG4gICAgLy8gVGhlIG5hbWUgJ3N1Y2NlZWRlZCcgaXMgYSBiaXQgbWlzbGVhZGluZy4uaXRzIG1vcmUgbGlrZSAnZXhlY3V0ZWQnLi5idXQgd2UgZGVjaWRlZCB0byBrZWVwIGl0LlxyXG4gICAgZWxzZSBpZiAodGhpcy5JbkVuZFRhc2spXHJcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIHJlc3RvcmUgdGhlIGZsYWcuXHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2sodGhpcy5faW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tTYXZlZCk7XHJcblxyXG4gICAgcmV0dXJuIHN1Y2NlZWRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgoKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBTZXRTZXJ2ZXJTaWRlVGFza1N1ZmZpeCAodGFzayA6IFRhc2spIDogdm9pZFxyXG4gIHtcclxuICAgIGxldCBjbGllbnRPcGVyYXRpb25FeGlzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgdmFyIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWCk7XHJcblxyXG4gICAgbGV0ICBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSBudWxsO1xyXG4gICAgLy8gZmluZCBpZiBNR19BQ1RfVEFTS19TVUZGSVggaGFuZGxlciBleGlzdHM/XHJcbiAgICB2YXIgZXZ0SGFuUG9zID0gbmV3IEV2ZW50SGFuZGxlclBvc2l0aW9uKCk7XHJcbiAgICBldnRIYW5Qb3MuaW5pdChydEV2dCk7XHJcbiAgICBoYW5kbGVyID0gZXZ0SGFuUG9zLmdldE5leHQoKTtcclxuXHJcbiAgICBpZiAoaGFuZGxlciAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBmb3IgKGxldCAgaSA9IDA7IGkgPCBoYW5kbGVyLmdldE9wZXJhdGlvblRhYigpLmdldFNpemUoKTsgaSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IG9wZXIgPSBoYW5kbGVyLmdldE9wZXJhdGlvblRhYigpLmdldE9wZXJhdGlvbihpKTtcclxuICAgICAgICBvcGVyLnNldEV4ZWNPblNlcnZlcih0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRhc2suaGFzU3ViVGFza3MoKSkgICB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFzay5HZXRTdWJUYXNrcygpLmxlbmd0aDsgaSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IHN1YlRhc2s6IFRhc2sgPSA8VGFzaz50YXNrLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgdGhpcy5TZXRTZXJ2ZXJTaWRlVGFza1N1ZmZpeChzdWJUYXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2tJZkNsaWVudE9wZXJhdGlvbkV4aXN0c0luU3ViZm9ybVRhc2tzKClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgQ2hlY2tJZkNsaWVudE9wZXJhdGlvbkV4aXN0c0luU3ViZm9ybVRhc2tzICh0YXNrOiBUYXNrLCBldmVudENvZGU6IG51bWJlcik6IFByb21pc2UgPGJvb2xlYW4+IHtcclxuICAgIGxldCBjbGllbnRPcGVyYXRpb25FeGlzdCA9IGZhbHNlO1xyXG4gICAgdmFyIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcblxyXG4gICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IG51bGw7XHJcbiAgICAvLyBmaW5kIGlmIE1HX0FDVF9UQVNLX1NVRkZJWCAvIE1HX0FDVF9SRUNfU1VGRklYIGhhbmRsZXIgZXhpc3RzP1xyXG4gICAgdmFyIGV2dEhhblBvcyA9IG5ldyBFdmVudEhhbmRsZXJQb3NpdGlvbigpO1xyXG4gICAgZXZ0SGFuUG9zLmluaXQocnRFdnQpO1xyXG4gICAgaGFuZGxlciA9IGV2dEhhblBvcy5nZXROZXh0KCk7XHJcblxyXG4gICAgaWYgKGV2ZW50Q29kZSA9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCkge1xyXG4gICAgICBsZXQgY3VyclJlY29yZCA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgICBpZiAoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5tb2RpZmllZFJlY29yZHNOdW1iZXIoKSA+IDAgfHwgKGN1cnJSZWNvcmQgIT0gbnVsbCAmJiBjdXJyUmVjb3JkLk1vZGlmaWVkKSlcclxuICAgICAgICBjbGllbnRPcGVyYXRpb25FeGlzdCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoIWNsaWVudE9wZXJhdGlvbkV4aXN0KSB7XHJcbiAgICAgICAgbGV0IGZvcmNlU3VmZml4OiBib29sZWFuID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSk7XHJcbiAgICAgICAgLy8gZm9yIG5vbiBpbnRlcmFjdGl2ZSwgY3JlYXRlIG1vZGUgdGFzay4gIGZvcmNlIHJlY29yZCBzdWZmaXggaXMgY2FuY2VsbGVkXHJcblxyXG4gICAgICAgIGlmIChmb3JjZVN1ZmZpeCA9PT0gdHJ1ZSlcclxuICAgICAgICBpZiAodGFzay5Jc0ludGVyYWN0aXZlIHx8ICB0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICBjbGllbnRPcGVyYXRpb25FeGlzdCA9IHRydWU7XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhbmRsZXIgIT0gbnVsbCAmJiAhY2xpZW50T3BlcmF0aW9uRXhpc3QpIHtcclxuICAgICAgICBsZXQgY250ID0gaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY250OyBpKyspIHtcclxuICAgICAgICAgIGxldCBvcGVyID0gaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRPcGVyYXRpb24oaSk7XHJcbiAgICAgICAgICBpZiAob3Blci5nZXRFeGVjT25DbGllbnQoKSkge1xyXG4gICAgICAgICAgICBjbGllbnRPcGVyYXRpb25FeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChvcGVyLmdldFR5cGUoKSA9PSBDb25zdEludGVyZmFjZS5NR19PUEVSX1JBSVNFX0VWRU5UKXtcclxuICAgICAgICAgICAgICBpZiAob3Blci5HZXRSdW50aW1lRXZlbnQoKS5nZXRUeXBlKCkgPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJlxyXG4gICAgICAgICAgICAgIG9wZXIuR2V0UnVudGltZUV2ZW50KCkuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpIHtcclxuICAgICAgICAgICAgICAgIGNsaWVudE9wZXJhdGlvbkV4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFjbGllbnRPcGVyYXRpb25FeGlzdCAmJiB0YXNrLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgKCFjbGllbnRPcGVyYXRpb25FeGlzdCAmJiBpIDwgdGFzay5nZXRTdWJUYXNrcygpLmdldFNpemUoKSk7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHN1YlRhc2sgPSA8VGFzaz50YXNrLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgICBjbGllbnRPcGVyYXRpb25FeGlzdCA9IGF3YWl0IHRoaXMuQ2hlY2tJZkNsaWVudE9wZXJhdGlvbkV4aXN0c0luU3ViZm9ybVRhc2tzKHN1YlRhc2ssIGV2ZW50Q29kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gY2xpZW50T3BlcmF0aW9uRXhpc3Q7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVja0lmUGVuZGluZ1RyYW5zYWN0aW9ucygpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIENoZWNrSWZQZW5kaW5nVHJhbnNhY3Rpb25zKHRhc2sgOiBUYXNrKTogYm9vbGVhblxyXG4gIHtcclxuICAgIGxldCBwZW5kaW5nVHJhbnNhY3Rpb25zID0gZmFsc2U7XHJcbiAgICBsZXQgY3VyclJlY29yZCA9ICAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgIGlmICgoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLm1vZGlmaWVkUmVjb3Jkc051bWJlcigpID4gMCB8fCAoY3VyclJlY29yZCAhPSBudWxsICYmIGN1cnJSZWNvcmQuTW9kaWZpZWQpKVxyXG4gICAgICBwZW5kaW5nVHJhbnNhY3Rpb25zID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAoIXBlbmRpbmdUcmFuc2FjdGlvbnMgJiYgdGFzay5oYXNTdWJUYXNrcygpKVxyXG4gICAge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgKCFwZW5kaW5nVHJhbnNhY3Rpb25zICYmIGkgPCB0YXNrLmdldFN1YlRhc2tzKCkuZ2V0U2l6ZSgpKTsgaSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IHN1YlRhc2sgPSA8VGFzaz50YXNrLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IHRoaXMuQ2hlY2tJZlBlbmRpbmdUcmFuc2FjdGlvbnMoc3ViVGFzayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGVuZGluZ1RyYW5zYWN0aW9ucztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9ubHlEZXNjc1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3VjY2VlZGVkXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIEhhbmRsZVRyYW5zYWN0aW9uSW5mbygpOiB2b2lkIHtcclxuICAgIC8vIHdoaWxlIHJlbW90ZSB0YXNrIHdpdGhvdXQgbG9jYWwgZGF0YSwgaGFzIHN1YmZvcm0gdGhhdCBoYXMgbG9jYWwgZGF0YSA6IFJlbW90ZSB0cmFuc2FjdGlvbiBpcyBzZXQgb24gdGhlIHBhcmVudCB0YXNrIGFuZCBsb2NhbCBUcmFuc2FjdGlvbiBpcyBzZXQgb24gc3ViZm9ybS5cclxuICAgIC8vIFRoZSBtZW1iZXIgdGFzay5UcmFuc2FjdGlvbiBpcyBnZXQgdGhlIERhdGF2aWV3TWFuYWdlci5DdXJyZW50RGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uXHJcbiAgICAvLyBmb3Igc3ViZm9ybSA6ICB0aGUgQ3VycmVudERhdGF2aWV3TWFuYWdlciBpcyB0aGUgbG9jYWxEYXRhdmlldyBzbyB0aGUgdHJhbnNhY3Rpb24gaXMgdGhlIGxvY2FsIHRyYW5zYWN0aW9uIHRoYXQgdGhlIHN1YmZvcm0gaXMgdGhlIG93bmVyIGJ1dCBub3QgdGhlIG93bmVyIG9mIHRoZSByZW1vdGUgdHJhbnNhY3Rpb25cclxuICAgIC8vIFRoZSBtZXRob2Qgc2V0VHJhbnNDbGVhcmVkKCkgbmVlZCB0byBiZSBjYWxsZWQgb25seSBmb3IgcmVtb3RlIHRyYW5zYWN0aW9uIHRoYXQgaXMgdGhlIG93bmVyIHRhc2sgLiAoX3RyYW5zQ2xlYXJlZCBpcyBzZW5kIHRvIHRoZSBzZXJ2ZXIgKVxyXG5cclxuICAgIC8vIGNoZWNrIHRoZSByZW1vdGUgdHJhbnNhY3Rpb25cclxuICAgIGxldCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24gPSB0aGlzLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb247XHJcbiAgICBpZiAodHJhbnNhY3Rpb24gIT09IG51bGwgJiYgdHJhbnNhY3Rpb24uaXNPd25lcih0aGlzKSAmJiB0cmFuc2FjdGlvbi5nZXRMZXZlbCgpID09PSAnUCcpIHtcclxuICAgICAgdGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uID0gbnVsbDtcclxuICAgICAgKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5zZXRUcmFuc0NsZWFyZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ3JlYXRlcyBleGl0IGNvbW1hbmQsIGFkZHMgaXQgdG8gY29tbWFuZHMgZm9yIGV4ZWN1dGlvbiBhbmQgZXhlY3V0ZSBpdCBpZiBpdCdzIG5lZWRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmV2ZXJzaWJsZUV4aXRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YmZvcm1EZXN0aW5hdGlvblwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgRXhpdChyZXZlcnNpYmxlRXhpdDogYm9vbGVhbiwgc3ViZm9ybURlc3RpbmF0aW9uOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBpZiByZWNvcmQgc3VmZml4IHdhcyBzdWNjZXNzZnVsIGFuZCB0aGlzIHRhc2sgaXMgbm90IGEgc3ViIGZvcm1cclxuICAgIC8vIHRoZW4gZW5kIHRoZSB0YXNrIGF0IHRoZSBzZXJ2ZXIgc2lkZVxyXG5cclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gcmV2ZXJzaWJsZUV4aXQgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SUNsaWVudENvbW1hbmQ+Q29tbWFuZEZhY3RvcnkuQ3JlYXRlQnJvd3NlckVzY0V2ZW50Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgc3ViZm9ybURlc3RpbmF0aW9uKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJQ2xpZW50Q29tbWFuZD5Db21tYW5kRmFjdG9yeS5DcmVhdGVOb25SZXZlcnNpYmxlRXhpdENvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIHN1YmZvcm1EZXN0aW5hdGlvbik7XHJcblxyXG4gICAgdGhpcy5fbWdEYXRhLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgIGlmICghc3ViZm9ybURlc3RpbmF0aW9uKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgQnJvd2VyRXNjQ29tbWFuZCBpbW1lZGlhdGVseSBvbmx5IGlmXHJcbiAgICAgICAgLy8gMS4gSWYgd2UgYXJlIHRyeWluZyB0byBjbG9zZSB0aGUgYnJvd3NlciBhbmQgdGhlIHRvcG1vc3QgdGFzayBpcyBjbG9zaW5nXHJcbiAgICAgICAgLy8gMi4gSWYgdXNlciBleHBsaWNpdGx5IGNsb3NlcyB0aGUgY3VycmVudCB0YXNrIChsaWtlIGNsb3Npbmcgb3ZlcmxheSlcclxuICAgICAgICAvLyBGb3IgYWxsIG90aGVyIEV4aXQoKSBjb21tYW5kcywganVzdCBhZGQgdGhlIEJyb3dzZXJFc2NDb21tYW5kIHRvIENtZHNUb1NlcnZlci5cclxuICAgICAgICBpZih0aGlzLmdldFRhc2tUYWcoKSA9PSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuZ2V0VGFza1RhZygpIHx8XHJcbiAgICAgICAgICAgIShNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuSW5FbmRUYXNrICYmIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5DbG9zaW5nRm9ybVVJKSlcclxuICAgICAgICAgIGF3YWl0IFRhc2suQ29tbWFuZHNQcm9jZXNzb3IuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgIC8vIElmIHRoZSBjbG9zaW5nIG9mIE1haW4gUHJvZ3JhbSBkaWRuJ3Qgc3VjY2VlZCBvbiBzZXJ2ZXIsIGNsb3NlIGl0IGhlcmUgLS0tIG9mY291cnNlIGl0XHJcbiAgICAgICAgLy8gaW5jbHVkZXMgdGhlIGV4ZWN1dGlvbiBvZiBUUyBhcyB3ZWxsLlxyXG4gICAgICAgIGlmICh0aGlzLmlzTWFpblByb2coKSkge1xyXG4gICAgICAgICAgdGhpcy5fbWdEYXRhLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJlY3Vyc2l2ZSBmdW5jdGlvbiBmb3IgZmluYWxseSBvcGVyYXRpb24gb2YgZW5kVGFzayBmdW5jdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWNjZWVkZWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmV2ZXJzaWJsZUV4aXRcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGhhbmRsZUZpbmFsbHlFbmRUYXNrKHN1Y2NlZWRlZDogYm9vbGVhbiwgcmV2ZXJzaWJsZUV4aXQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBzdWJUYXNrOiBUYXNrO1xyXG5cclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICBzdWJUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIHN1YlRhc2suaGFuZGxlRmluYWxseUVuZFRhc2soc3VjY2VlZGVkLCByZXZlcnNpYmxlRXhpdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkluRW5kVGFzayA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChzdWNjZWVkZWQpXHJcbiAgICAgIHRoaXMuX2lzU3RhcnRlZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmICghc3VjY2VlZGVkICYmIHJldmVyc2libGVFeGl0ICYmIHRoaXMuSXNUcnlpbmdUb1N0b3ApXHJcbiAgICAgIHRoaXMuc2V0VHJ5aW5nVG9TdG9wKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZWN1cnNpdmUgZnVuY3Rpb24gZm9yIFRhc2sgUHJlZml4IGV4ZWN1dGlvbiBmb3IgYWxsIHN1YmZvcm1zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIGhhbmRsZVRhc2tTdWZmaXgod2l0aFN1YlRhc2tzOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgc3VjY2VlZGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBzdWJUYXNrOiBUYXNrO1xyXG5cclxuICAgIGlmICh3aXRoU3ViVGFza3MpIHtcclxuICAgICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKSAmJiBzdWNjZWVkZWQ7IGkrKykge1xyXG4gICAgICAgICAgc3ViVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICAgIHN1Y2NlZWRlZCA9IGF3YWl0IHN1YlRhc2suaGFuZGxlVGFza1N1ZmZpeCh3aXRoU3ViVGFza3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdWNjZWVkZWQpXHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgpO1xyXG4gICAgc3VjY2VlZGVkID0gIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCk7XHJcbiAgICB0aGlzLlRhc2tTdWZmaXhFeGVjdXRlZCA9IHRydWU7XHJcbiAgICByZXR1cm4gc3VjY2VlZGVkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgaWYgdGhlIHRhc2sgaW50byBjcmVhdGUgbGluZSBwcm9jZXNzaW5nIG9yIG5vdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SW5DcmVhdGVMaW5lKGluQ3JlYXRlTGluZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5faW5DcmVhdGVMaW5lID0gaW5DcmVhdGVMaW5lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBpZiB0aGUgdGFzayBpcyBpbnRvIENyZWF0ZSBsaW5lIHByb2Nlc3NpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEluQ3JlYXRlTGluZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbkNyZWF0ZUxpbmU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGhhbmRsZSBhbiBpbnRlcm5hbCBldmVudCBvbiB0aGlzIHRhc2tzIHNsYXZlIHRhc2tzLiBTbGF2ZSB0YXNrcyBhcmU6ICgxKSBJZiB0aGlzIHRhc2sgaXMgYSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uXHJcbiAgLy8vICAgb3duZXIgLSBhbGwgdGFza3MgcGFydGljaXBhdGluZyBpbiB0aGUgdHJhbnNhY3Rpb25zIGFyZSBpdHMgc2xhdmVzLiAoMikgSWYgdGhpcyB0YXNrIGlzIG5vdCBhbiBvd25lciAtXHJcbiAgLy8vICAgYWxsIGl0cyBzdWJmb3JtcyBhcmUgY29uc2lkZXJlZCBzbGF2ZXMuIGlmIG9uZSBvZiB0aGUgc3ViIHRhc2tzIGZhaWxlZCBoYW5kbGluZyB0aGUgZXZlbnQgdGhlbiBhXHJcbiAgLy8vICAgcmVmZXJlbmNlIHRvIHRoYXQgdGFzayBpcyByZXR1cm5lZCBvdGhlcndpc2UgdGhlIHJldHVybmVkIHZhbHVlIGlzIG51bGxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW50ZXJuYWxFdnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGludGVybmFsIGV2ZW50IHRvIGhhbmRsZTwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlRXZlbnRPblNsYXZlVGFza3MoaW50ZXJuYWxFdnRDb2RlOiBudW1iZXIpOiBQcm9taXNlPFRhc2s+IHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IG51bGw7XHJcbiAgICBsZXQgZmFpbHVyZVRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgbGV0IG1nZFRhYjogSU1HRGF0YUNvbGxlY3Rpb24gPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGU7XHJcbiAgICBsZXQgdHJpZ2dlcmVkVGFza3M6IExpc3Q8VGFza0Jhc2U+ID0gbWdkVGFiLmdldFRyaWdnZXJlZFRhc2tzKHRoaXMpO1xyXG4gICAgbGV0IG9ycGhhbnM6IExpc3Q8VGFzaz4gPSBudWxsO1xyXG4gICAgbGV0IHNhbWVUcmFuczogYm9vbGVhbjtcclxuICAgIGxldCBoYXNTbGF2ZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBpc093bmVyOiBib29sZWFuID0gdGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb24uaXNPd25lcih0aGlzKTtcclxuXHJcbiAgICAvLyBldmVudCBvbiB0cmFucy1vd25lciBzaG91bGQgYmUgcHJvcG9nYXRlZCB0byBhbGwgb3RoZXIgdGFza3MgaW4gdGhlIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24uXHJcbiAgICBpZiAoaXNPd25lcikge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRFdmVudFNjb3BlVHJhbnMoKTtcclxuICAgICAgb3JwaGFucyA9IG5ldyBMaXN0PFRhc2s+KCk7XHJcblxyXG4gICAgICAvLyBJbiBjYXNlIGEgY2hhbmdlIG9mIHRyYW5zLW93bmVyc2hpcCBwcmV2aW91c2x5IHRvb2sgcGxhY2UsIHRoZXJlIG1pZ2h0IGJlIHRhc2tzXHJcbiAgICAgIC8vIHdoaWNoIGJlbG9uZyB0byB0aGUgY3VycmVudCBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGJ1dCB0aGVpciBwYXJlbnQgaXMgZ29uZS4gVGhlc2UgYXJlIG9ycGhhbiB0YXNrc1xyXG4gICAgICAvLyBhbmQgd2UgbmVlZCB0byBwcm9wb2dhdGUgdGhlIGV2ZW50IHRvIHRoZW0gdG9vLlxyXG4gICAgICBtZ2RUYWIuc3RhcnRUYXNrc0l0ZXJhdGlvbigpO1xyXG4gICAgICB3aGlsZSAoKHRhc2sgPSA8VGFzaz5tZ2RUYWIuZ2V0TmV4dFRhc2soKSkgIT0gbnVsbCkge1xyXG4gICAgICAgIHNhbWVUcmFucyA9IHRhc2suVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmdldFRyYW5zSWQoKSA9PT0gdGFzay5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCk7XHJcbiAgICAgICAgaWYgKHRhc2sgIT09IHRoaXMgJiYgc2FtZVRyYW5zICYmIHRhc2suUHJldmlvdXNseUFjdGl2ZVRhc2tJZCAhPSBudWxsICYmIG1nZFRhYi5HZXRUYXNrQnlJRCh0YXNrLlByZXZpb3VzbHlBY3RpdmVUYXNrSWQpID09IG51bGwpXHJcbiAgICAgICAgICBvcnBoYW5zLnB1c2godGFzayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgc2NvcGVUcmFuczogYm9vbGVhbiA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmlzRXZlbnRTY29wZVRyYW5zKCk7XHJcblxyXG4gICAgLy8gUHJvcGFnYXRlIHRoZSBldmVudCBhY2NvcmRpbmcgdG8gdGhlIHNjb3BlLCBvbiBhbGwgdGFza3MgdHJpZ2dlcmVkIGJ5IG1lXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdHJpZ2dlcmVkVGFza3MubGVuZ3RoICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpOyBpKyspIHtcclxuICAgICAgdGFzayA9IDxUYXNrPnRyaWdnZXJlZFRhc2tzLmdldF9JdGVtKGkpO1xyXG4gICAgICBzYW1lVHJhbnMgPSB0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGFzay5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb24uZ2V0VHJhbnNJZCgpID09PSB0YXNrLlRyYW5zYWN0aW9uLmdldFRyYW5zSWQoKTtcclxuXHJcbiAgICAgIGlmICghdGFzay5Jc1N1YkZvcm0gJiYgKHNjb3BlVHJhbnMgJiYgc2FtZVRyYW5zKSAmJiB0YXNrLmlzU3RhcnRlZCgpKSB7XHJcbiAgICAgICAgLy8gUUNSIDQzODUzMCBHdWFyYW50ZWUgdGhhdCBiZWZvcmUgcHJlZml4IGNvbXB1dGUgd2lsbCBiZSBleGVjdXRlZFxyXG4gICAgICAgIGlmICh0YXNrLmdldEZvcm0oKS5Gb3JtUmVmcmVzaGVkICYmIGludGVybmFsRXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVggJiYgdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgYXdhaXQgKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5jdXJyUmVjQ29tcHV0ZShmYWxzZSk7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIGludGVybmFsRXZ0Q29kZSk7XHJcbiAgICAgICAgaGFzU2xhdmVzID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFByb3BhZ2F0ZSB0aGUgZXZlbnQgb24gb3JwaGFucyB0b28uXHJcbiAgICBmb3IgKDsgaXNPd25lciAmJiBpIDwgb3JwaGFucy5sZW5ndGggJiYgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCk7IGkrKykge1xyXG4gICAgICB0YXNrID0gb3JwaGFucy5nZXRfSXRlbShpKTtcclxuXHJcbiAgICAgIC8vIFFDUiA0Mzg1MzAgR3VhcmFudGVlIHRoYXQgYmVmb3JlIHByZWZpeCBjb21wdXRlIHdpbGwgYmUgZXhlY3V0ZWRcclxuICAgICAgaWYgKHRhc2suZ2V0Rm9ybSgpLkZvcm1SZWZyZXNoZWQgJiYgaW50ZXJuYWxFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCAmJiB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgYXdhaXQgKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5jdXJyUmVjQ29tcHV0ZShmYWxzZSk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBpbnRlcm5hbEV2dENvZGUpO1xyXG4gICAgICBoYXNTbGF2ZXMgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChoYXNTbGF2ZXMgJiYgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgZmFpbHVyZVRhc2sgPSB0YXNrO1xyXG5cclxuICAgIGlmIChpc093bmVyKVxyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5jbGVhckV2ZW50U2NvcGUoKTtcclxuXHJcbiAgICByZXR1cm4gZmFpbHVyZVRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZW5hYmxlLWRpc2FibGUgYWN0aW9ucyBmb3IgYSByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGVuYWJsZVJlY29yZEFjdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZGF0YXZpZXc6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuRGF0YVZpZXc7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5zZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTtcclxuXHJcbiAgICBpZiAoZGF0YXZpZXcuSW5jbHVkZXNGaXJzdCgpIHx8IGRhdGF2aWV3LklzT25lV2F5S2V5KSB7XHJcbiAgICAgIGlmIChkYXRhdmlldy5pc0VtcHR5RGF0YXZpZXcoKSB8fCBkYXRhdmlldy5nZXRDdXJyUmVjSWR4KCkgPT09IDApIHtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWTElORSwgZmFsc2UpO1xyXG4gICAgICAgIGlmIChkYXRhdmlldy5Jc09uZVdheUtleSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkwsIHRydWUpO1xyXG4gICAgICAgIGVsc2UgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCwgZmFsc2UpO1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZMSU5FLCB0cnVlKTtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMLCB0cnVlKTtcclxuICAgICAgICBpZiAodGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0UsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgIGlmIChkYXRhdmlldy5pc0VtcHR5RGF0YXZpZXcoKSB8fCAoZGF0YXZpZXcuZ2V0Q3VyclJlY0lkeCgpID09PSAwKSB8fCAoZGF0YXZpZXcuZ2V0VG9wUmVjSWR4KCkgPT09IDApKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0UsIGZhbHNlKTtcclxuICAgICAgICBlbHNlIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMLCB0cnVlKTtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0UsIHRydWUpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWTElORSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGF2aWV3LkluY2x1ZGVzTGFzdCgpKSB7XHJcbiAgICAgIGlmICgoKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKSB8fCBkYXRhdmlldy5pc0VtcHR5RGF0YXZpZXcoKSB8fFxyXG4gICAgICAgICAgKCh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpICYmXHJcbiAgICAgICAgICAgICghRW52aXJvbm1lbnQuSW5zdGFuY2UuYWxsb3dDcmVhdGVJbk1vZGlmeU1vZGUodGhpcy5nZXRDb21wSWR4KCkpIHx8XHJcbiAgICAgICAgICAgICAgIWF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSwgdHJ1ZSkpKSkgJiYgKGRhdGF2aWV3LmdldEN1cnJSZWNJZHgoKSArIDEpID09PSBkYXRhdmlldy5nZXRTaXplKCkpIHtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUTElORSwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRUQkwsIGZhbHNlKTtcclxuICAgICAgICBpZiAodGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUTElORSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0VORFRCTCwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCB0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpIHtcclxuICAgICAgICBpZiAoZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkgfHwgKChkYXRhdmlldy5nZXRTaXplKCkgLSBkYXRhdmlldy5nZXRUb3BSZWNJZHgoKSkgPD0gdGhpcy5Gb3JtLmdldFJvd3NJblBhZ2UoKSkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUUEFHRSwgZmFsc2UpO1xyXG4gICAgICAgIGVsc2UgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0UsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVExJTkUsIHRydWUpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUUEFHRSwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRUQkwsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRhdmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLCBmYWxzZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCwgdHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU5URVJfUk9XX0VESVRJTkcsIHRydWUpO1xyXG5cclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX05PX1BST0dfRVhFX1JJR0hUUywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIGlzIHN0YXJ0ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzU3RhcnRlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1N0YXJ0ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgc3ViIHRhc2tzIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRTdWJUYXNrcygpOiBUYXNrc1RhYmxlIHtcclxuICAgIHJldHVybiB0aGlzLlN1YlRhc2tzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGlzIHRhc2tzIHJlZnJlc2hlcyBvbiBhIGNoYW5nZSBvZiBvbmUgb2YgaXRzIHBhcmVudCBmaWVsZHMgd2l0aCB0aGUgZ2l2ZW4gaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWRcIj50aGUgaWQgb2YgdGhlIHBhcmVudCBmaWVsZDwvcGFyYW0+XHJcbiAgcmVmcmVzaGVzT24oZmxkSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7ICFyZXN1bHQgJiYgdGhpcy5SZWZyZXNoT25WYXJzICE9PSBudWxsICYmIGkgPCB0aGlzLlJlZnJlc2hPblZhcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgcmVzdWx0ID0gKHRoaXMuUmVmcmVzaE9uVmFyc1tpXSA9PT0gZmxkSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2xlYXIgdGhpcyB0YXNrIGZyb20gdGhlIGFjdGl2ZSB0cmFuc2FjdGlvbnMgYWNjb3VudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBBYm9ydFRyYW5zYWN0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdmFsdWUgb2YgcHJldmVudFJlY29yZFN1ZmZpeCB0byB2YWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dHJ1ZSBpZiB3ZSBhbHJlYWR5IHBlcmZvcm1lZCByZWNvcmQgc3VmZml4PC9wYXJhbT5cclxuICBzZXRQcmV2ZW50UmVjb3JkU3VmZml4KHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldmVudFJlY29yZFN1ZmZpeCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdmFsdWUgb2YgcHJldmVudFJlY29yZFN1ZmZpeFxyXG4gIC8vLyA8L3N1bW1hcnlcclxuICBnZXRQcmV2ZW50UmVjb3JkU3VmZml4KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXZlbnRSZWNvcmRTdWZmaXg7XHJcbiAgfVxyXG5cclxuICBzZXRQcmV2ZW50Q29udHJvbENoYW5nZSh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZlbnRDb250cm9sQ2hhbmdlID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgZ2V0UHJldmVudENvbnRyb2xDaGFuZ2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJldmVudENvbnRyb2xDaGFuZ2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2lnbmFsIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRLbm93blRvU2VydmVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fa25vd25Ub1NlcnZlciA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGR2UG9zIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIi1cIj5ldmFsdWF0ZXMgdGhlIGRlcmNyaXB0b3IgYW5kIHJldHVybiB0aGUgbm9uLWhhdmUgZHZQb3MgdmFsdWU8L3BhcmFtPlxyXG4gIGV2YWx1YXRlRGVzY3JpcHRvcigpOiBudW1iZXIge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCByZXM6IE5VTV9UWVBFO1xyXG4gICAgaWYgKHRoaXMuRHZQb3NEZXNjcmlwdG9yID09IG51bGwpXHJcbiAgICAgIHJldHVybiBIYXNoVXRpbHMuR2V0SGFzaENvZGUocmVzdWx0KTtcclxuXHJcbiAgICBsZXQgZmlyc3Q6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8vIGdvIG92ZXIgdGhlIGxpc3Qgb2YgdGhlIGRlc2NyaXB0b3JcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkR2UG9zRGVzY3JpcHRvci5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoIWZpcnN0KVxyXG4gICAgICAgIHJlc3VsdCArPSBcIjtcIjtcclxuXHJcbiAgICAgIGxldCBjdXJyZW50Q2VsbDogc3RyaW5nW10gPSB0aGlzLkR2UG9zRGVzY3JpcHRvci5nZXRfSXRlbShpKTtcclxuXHJcbiAgICAgIC8vIHBhcnNlIHRoZSBjdXJyZW50IHRhc2sgYW5kIGZpZWxkIG51bWJlclxyXG4gICAgICBsZXQgY3VycmVudFRhZzogc3RyaW5nID0gY3VycmVudENlbGxbMF07XHJcbiAgICAgIGxldCBjdXJyZW50VmVlSWR4OiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGN1cnJlbnRDZWxsWzFdKTtcclxuICAgICAgbGV0IGN1cnJlbnRUYXNrID0gPFRhc2s+QWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldFRhc2tCeUlEKGN1cnJlbnRUYWcpO1xyXG4gICAgICBsZXQgY3VycmVudEZpZWxkID0gPEZpZWxkPmN1cnJlbnRUYXNrLkRhdGFWaWV3LmdldEZpZWxkKGN1cnJlbnRWZWVJZHgpO1xyXG4gICAgICBsZXQgZGlzcFZhbDogc3RyaW5nID0gY3VycmVudEZpZWxkLmdldERpc3BWYWx1ZSgpO1xyXG5cclxuICAgICAgLy8gUUNSIDk3ODU2NlxyXG4gICAgICBpZiAoY3VycmVudEZpZWxkLmlzTnVsbCgpKVxyXG4gICAgICAgIGRpc3BWYWwgPSBcIlwiO1xyXG5cclxuICAgICAgLy8gUUNSIDc0MzI5MFxyXG4gICAgICBsZXQgcGljOiBQSUM7XHJcbiAgICAgIHN3aXRjaCAoY3VycmVudEZpZWxkLmdldFR5cGUoKSkge1xyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgIC8vIGJvb2xlYW4gaXMgc3RvcmVkIGFzIFwib1wiIG9yIFwiMVwiIHNvIHdlIGp1c3QgYWRkIHRoZW0gYXMgd2VcclxuICAgICAgICAvLyBkbyBpbiB0aGUgc2VydmVyXHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUjpcclxuICAgICAgICAgIHJlc3VsdCArPSBkaXNwVmFsO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgICAgLy8gUUNSIDc0Mjk2NiBkYXRlIGFuZCB0aW1lIHNwZWNpYWwgdHJlYXRtZW50XHJcbiAgICAgICAgICBpZiAoZGlzcFZhbCAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICBwaWMgPSBuZXcgUElDKGN1cnJlbnRGaWVsZC5nZXRQaWN0dXJlKCksIGN1cnJlbnRGaWVsZC5nZXRUeXBlKCksIDApO1xyXG4gICAgICAgICAgICBsZXQgY29udjogRGlzcGxheUNvbnZlcnRvciA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2U7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSBjb252Lm1nMmRpc3AoZGlzcFZhbCwgXCJcIiwgcGljLCBmYWxzZSwgdGhpcy5nZXRDb21wSWR4KCksIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgICAgIC8vIFFDUiA1NDMyMDQgd2hlbiB0aGVyZSBpcyBhbiBlbXB0eSBzdHJpbmcgKGFscGhhKWFwcGVuZCBub3RoaW5nXHJcbiAgICAgICAgICBpZiAoZGlzcFZhbCAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICByZXMgPSBuZXcgTlVNX1RZUEUoZGlzcFZhbCk7XHJcbiAgICAgICAgICAgIHBpYyA9IG5ldyBQSUMoY3VycmVudEZpZWxkLmdldFBpY3R1cmUoKSwgY3VycmVudEZpZWxkLmdldFR5cGUoKSwgMCk7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSByZXMudG9fYShwaWMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZpcnN0ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHRtcFN0cjI6IHN0cmluZyA9IFN0clV0aWwuc3RyaW5nVG9IZXhhRHVtcChyZXN1bHQsIDQpO1xyXG5cclxuICAgIHJldHVybiBIYXNoVXRpbHMuR2V0SGFzaENvZGUodG1wU3RyMik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGRzIHRoZSBkdlBvcyBkZXNjcmlwdG9yIHZlY3RvciBlYWNoIG9mIHRoZSBkdlBvc0Rlc2NyaXB0b3IgdmVjdG9yIGVsZW1lbnRzIGlzIGEgU3RyaW5nIGFycmF5IG9mIHNpemVcclxuICAvLy8gICAyIGluIHRoZSBmaXJzdCBjZWxsIG9mIGVhY2ggYXJyYXkgd2UgaGF2ZSB0aGUgdGFnIGFuZCBpbiB0aGUgc2Vjb25kIHdlIGhhdmUgdGhlIHZlZSBpaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldERlc2NyaXB0b3IobmV3RGVzYzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIShuZXdEZXNjLnRyaW0oKSA9PT0gXCJcIikpIHtcclxuICAgICAgbGV0IGRlc2M6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShuZXdEZXNjLCBcIjtcIik7XHJcbiAgICAgIHRoaXMuRHZQb3NEZXNjcmlwdG9yID0gbmV3IExpc3Q8c3RyaW5nW10+KCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZGVzYy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCBjZWxsOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KDIpO1xyXG4gICAgICAgIGxldCB0YWdWZWVQYWlyOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUoZGVzY1tpXSwgXCIsXCIpO1xyXG4gICAgICAgIGNlbGxbMF0gPSB0YWdWZWVQYWlyWzBdO1xyXG4gICAgICAgIGNlbGxbMV0gPSB0YWdWZWVQYWlyWzFdO1xyXG5cclxuICAgICAgICAvLyBwdXQgdGhlIGNlbGwgdmFsdWUgaW50byB0aGUgdmVjdG9yXHJcbiAgICAgICAgdGhpcy5EdlBvc0Rlc2NyaXB0b3IucHVzaChjZWxsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGNhY2hlIG9iamVjdCBvZiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRhc2tDYWNoZSgpOiBEdkNhY2hlIHtcclxuICAgIHJldHVybiB0aGlzLl9kdkNhY2hlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHByZXBhcmUgYWxsIHN1Yi1mb3JtIHRyZWUncyB0byBlaXRoZXIgZ28gdG8gc2VydmVyIChhZnRlciBkZWxldGluZyByZWxldmFudCBlbnRyaWVzKSBvciB0byB0YWtlIGQudiBmcm9tXHJcbiAgLy8vICAgY2FjaGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiBhbGwgc3ViZm9ybSBjYW4gZG8gbmVlZCB0byBnbyB0byB0aGUgc2VydmVyIGJlY2F1c2Ugb2YgdXBkYXRlczwvcmV0dXJucz5cclxuICBhc3luYyBwcmVwYXJlQ2FjaGUoaWdub3JlQ3VycjogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHN1Y2Nlc3M6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8vIGNoZWNraW5nIG15c2VsZiBpZiBpIGFtIGEgc3ViZm9ybVxyXG4gICAgaWYgKCFpZ25vcmVDdXJyKSB7XHJcbiAgICAgIGlmIChhd2FpdCB0aGlzLmlzQ2FjaGVkKCkpIHtcclxuICAgICAgICBpZiAoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRDaGFuZ2VkKCkpIHtcclxuICAgICAgICAgIC8vIGlzIHRoZSBjdXJyZW50IHVwZGF0ZSBkYXRhdmlldyB3ZXJlIHByZXZpb3VzbHkgdGFrZW4gZnJvbSBjYWNoZVxyXG4gICAgICAgICAgdGhpcy5fZHZDYWNoZS5yZW1vdmVEdkZyb21DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSwgdHJ1ZSk7XHJcbiAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIGNoZWNrcyB0aGF0IGkgYW0gYSBzdWIgZm9ybSBidXQgaSBhbSBub3QgY2FjaGVkXHJcbiAgICAgICAgaWYgKHRoaXMuSXNTdWJGb3JtICYmICEgYXdhaXQgdGhpcy5pc0NhY2hlZCgpKSB7XHJcbiAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGN1cnJldFRhc2s6IFRhc2s7XHJcblxyXG4gICAgLy8gY2hlY2sgYWxsIG15IHN1YiBmb3Jtc1xyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICAvLyB0aGlzIGxvb3AgbXVzdCBydW4gdG8gaXRzIGVuZCBzbyBhbGwgdXBkYXRlZCBkLnYgd2lsbCBiZSBkZWxldGVkXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgY3VycmV0VGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICAvLyBpZiBvbmUgb2YgbXkgc3ViLWZvcm1zIG5lZWRzIHRvIGdvIHRvIHRoZSBzZXJ2ZXIgLSBzbyBkbyBpXHJcbiAgICAgICAgaWYgKCEgYXdhaXQgY3VycmV0VGFzay5wcmVwYXJlQ2FjaGUoZmFsc2UpKSB7XHJcbiAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VjY2VzcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVja3MgaWYgd2UgY2FuIHRha2UgdGhlIGQudiBvZiB0aGUgdGFzayBhbmQgYWxsIGhpcyBzdWItZm9ybXMgZnJvbSBjYWNoZSBpcyB3ZSBjYW4gLSB0YWtlIHRoZW0gYW5kXHJcbiAgLy8vICAgcmVwbGFjZSB0aGVtIHdpdGggdGhlIGN1cnJlbnQgZC52IG9mIGVhY2ggdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIGFsbCBkLnYncyB3ZXJlIGZvdW5kIGFuZCBzZXQ8L3JldHVybnM+XHJcbiAgYXN5bmMgdGVzdEFuZFNldChpZ25vcmVDdXJyOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAvLyBjaGVjayBjdXJyZW50IHRhc2tcclxuICAgIGlmICghaWdub3JlQ3VyciAmJiBhd2FpdCB0aGlzLmlzQ2FjaGVkKCkpIHtcclxuICAgICAgbGV0IHJlcXVlc3RlZER2OiBudW1iZXIgPSB0aGlzLmV2YWx1YXRlRGVzY3JpcHRvcigpO1xyXG5cclxuICAgICAgLy8gdHJ5IHRvIHRha2UgZnJvbSBjYWNoZSBvbmx5IGlmIHJlcXVlc3RlZCBpcyBub3QgY3VycmVudFxyXG4gICAgICBpZiAocmVxdWVzdGVkRHYgIT09ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0RHZQb3NWYWx1ZSgpKSB7XHJcbiAgICAgICAgbGV0IGZyb21DYWNoZTogRGF0YVZpZXcgPSB0aGlzLl9kdkNhY2hlLmdldENhY2hlZERhdGFWaWV3KHJlcXVlc3RlZER2KTtcclxuICAgICAgICBpZiAoZnJvbUNhY2hlID09IG51bGwpXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jaGFuZ2VEdihmcm9tQ2FjaGUpOyAgICAgLy8gY2hhbmdlcyB0aGUgY3VycmVudCBkLnYgd2l0aCB0aGUgb25lIHRha2VuIGZyb20gY2FjaGUgZG8gbm90IGZvcmdldCB0b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjdXJyZW50IG5lZWRzIHRvIGJlIGluc2VydGVkIHRvIHRoZSBjYWNoZVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBRQ1IgIzQzMDA0NS4gSW5kaWNhdGUgdGhhdCBSUCBtdXN0IGJlIGV4ZWN1dGVkIGFmdGVyIGdldCBmcm9tIHRoZSBjYWNoZS5cclxuICAgICAgdGhpcy5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNoZWNrIGFsbCBzdWItZm9ybXMgdGFza3NkXHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIC8vIHRoaXMgbG9vcCBkb2VzIG5vdCBuZWVkIHRvIHJlYWNoIGl0cyBlbmRcclxuICAgICAgLy8gdGhlIG1vbWVudCBvbmUgdGhhdCBuZWVkIHRvIGdvIHRvIHRoZSBzZXJ2ZXIgaXMgZGlzY292ZXJlZCBhbGwgbmVlZCB0byBnbyBhbHNvXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgLy8gZG9lcyB0aGUgaS10aCBzb24gbmVlZCB0byBnbyB0byB0aGUgc2VydmVyXHJcbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLlN1YlRhc2tzLmdldFRhc2soaSkudGVzdEFuZFNldChmYWxzZSkpXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGFuZ2VzIHRoZSBjdXJyZW50IGQudiB3aXRoIG9uZSB0YWtlbiBmcm9tIGNhY2hlIGluIHRoaXMgbWV0aG9kIHdlIGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHVwZGF0ZXNcclxuICAvLy8gICBvZiB0aGUgY3VycmVudCBkYXRhdmlldyBzaW5jZSB0aGUgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIGZyb20gdGVzdEFuZFNldCB0aGF0IGluIHR1cm4gaXMgb25seSB1c2VkIGFmdGVyXHJcbiAgLy8vICAgYSBTdWNjZXNzZnVsIHJ1biBwcmFwcmVDYWNoZSB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgZm9yIHVwZGF0ZXMgaW4gdGhlIGN1cnJlbnQgZGF0YXZpZXcgb2ZcclxuICAvLy8gICBlYWNoIHJlbGF0ZWQgdGFzay4gaG93ZXZlciB0byBiZSBvbiB0aGUgc2FmZSBzaWRlIHdlIGNoZWNrIGl0IGFueXdheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmcm9tQ2FjaGVcIj50aGUgbmV3IGQudjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBjaGFuZ2VEdihmcm9tQ2FjaGU6IERhdGFWaWV3KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZGF0YXZpZXc6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuRGF0YVZpZXc7XHJcbiAgICAvLyB0aGUgZGF0YSB2aWV3IHdlIHJlY2VpdmUgaXMgQ2VydGFpbmx5IGZyb20gdGhlIGNhY2hlXHJcblxyXG4gICAgaWYgKCF0aGlzLmhhc0xvY2F0ZSkge1xyXG4gICAgICBpZiAoIWRhdGF2aWV3LmdldENoYW5nZWQoKSAmJiBkYXRhdmlldy5JbmNsdWRlc0ZpcnN0KCkpXHJcbiAgICAgICAgdGhpcy5fZHZDYWNoZS5wdXRJbkNhY2hlKGRhdGF2aWV3LnJlcGxpY2F0ZSgpKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5sb2NhdGVQdXRJbkNhY2hlKCk7XHJcblxyXG4gICAgLy8gc2V0IHRoZSBkYXRhIHZpZXcgZnJvbSB0aGUgY2FjaGUgYXMgdGhlIGN1cnJlbnRcclxuICAgIGF3YWl0IGRhdGF2aWV3LnNldFNhbWVBcyhmcm9tQ2FjaGUpO1xyXG4gICAgZGF0YXZpZXcudGFrZUZsZFZhbHNGcm9tQ3VyclJlYygpO1xyXG5cclxuICAgIHRoaXMuRm9ybS5TZXRUYWJsZUl0ZW1zQ291bnQoMCwgdHJ1ZSk7XHJcbiAgICAoPE1nRm9ybT50aGlzLkZvcm0pLnNldFRhYmxlSXRlbXNDb3VudChmYWxzZSk7XHJcblxyXG4gICAgYXdhaXQgKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG5cclxuICAgIC8vIFFDUiA5MjQ4MDk0XHJcbiAgICB0aGlzLnNldE9yaWdpbmFsVGFza01vZGUodGhpcy5nZXRNb2RlKCkpO1xyXG4gIH1cclxuXHJcbiAgc2V0T3JpZ2luYWxUYXNrTW9kZShvcmlnaW5hbFRhc2tNb2RlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX29yaWdpbmFsVGFza01vZGUgPSBvcmlnaW5hbFRhc2tNb2RlLmNoYXJBdCgwKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IG1vZGUgb2YgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0T3JpZ2luYWxUYXNrTW9kZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsVGFza01vZGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgaXMgQ2FjaGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIHN1YiBmb3JtIGNvbnRyb2wgdGhpcyB0YXNrIENvcnJlbGF0ZXMgd2l0aCB0aGlzIG1ldGhvZFxyXG4gIC8vLyAgIGFjdHVhbGx5IGNvbWJpbmVzIHR3byB0ZXN0IGZpcnN0IHRoYXQgdGhlIHRhc2sgaXMgYSBzdWIgZm9ybSBzZWNvbmQgdGhhdCB0aGUgc3ViIHRoYXQgdGhlIHN1YiBmb3JtIGhhc1xyXG4gIC8vLyAgIHRoZSBpcyBjYWNoZWQgcHJvcGVydHkgc2V0IHRvIHllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgaXNDYWNoZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5Jc1N1YkZvcm0gJiYgYXdhaXQgKDxNZ0NvbnRyb2xCYXNlPnRoaXMuRm9ybS5nZXRTdWJGb3JtQ3RybCgpKS5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSVNfQ0FDSEVELCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZG9lcyB0aGUgaW5zZXJ0IGluIGNhY2hlIGxvZ2ljIGluIGNhc2UgdGhlIHRhc2sgaGFzIGxvY2F0ZSBleHByZXNzaW9uc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBsb2NhdGVQdXRJbkNhY2hlKCk6IHZvaWQge1xyXG4gICAgbGV0IGNhY2hlZDogRGF0YVZpZXcgPSB0aGlzLl9kdkNhY2hlLmdldENhY2hlZERhdGFWaWV3KCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0RHZQb3NWYWx1ZSgpKTtcclxuXHJcbiAgICAvLyBpZiB0aGlzIGRhdGEgdmlldyBoYXMgYmVlbiBpbnNlcnRlZCB0byB0aGUgY2FjaGUgYmVmb3JlXHJcbiAgICBpZiAoY2FjaGVkICE9IG51bGwpIHtcclxuICAgICAgaWYgKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuY2hlY2tGaXJzdChjYWNoZWQuZ2V0TG9jYXRlRmlyc3RSZWMoKSkgJiYgISg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Q2hhbmdlZCgpKSB7XHJcbiAgICAgICAgKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5zZXRMb2NhdGVGaXJzdFJlYyhjYWNoZWQuZ2V0TG9jYXRlRmlyc3RSZWMoKSk7XHJcbiAgICAgICAgdGhpcy5fZHZDYWNoZS5wdXRJbkNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykucmVwbGljYXRlKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLl9kdkNhY2hlLnJlbW92ZUR2RnJvbUNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0RHZQb3NWYWx1ZSgpLCB0cnVlKTtcclxuICAgIH1cclxuICAgIC8vIHB1dCBpdCBpbiB0aGUgY2FjaGUgaWYgaXQgaXMgbm90IHVwZGF0ZWRcclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoISg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Q2hhbmdlZCgpKVxyXG4gICAgICAgIHRoaXMuX2R2Q2FjaGUucHV0SW5DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnJlcGxpY2F0ZSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBoYXNMb2NhdGUgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgSGFzTG9hY3RlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFzTG9jYXRlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG9wZW5zIGEgbmV3IFRyYW5zYWN0aW9uIG9yIHNldCByZWZlcmVuY2UgdG8gdGhlIGV4aXN0aW5nIFRyYW5zYWN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldFJlbW90ZVRyYW5zYWN0aW9uKHRyYW5zSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IG1nZFRhYjogSU1HRGF0YUNvbGxlY3Rpb24gPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGU7XHJcbiAgICBsZXQgdHJhbnNUYXNrOiBUYXNrO1xyXG4gICAgbGV0IGlzRmluZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIG1nZFRhYi5zdGFydFRhc2tzSXRlcmF0aW9uKCk7XHJcbiAgICB3aGlsZSAoKHRyYW5zVGFzayA9IDxUYXNrPm1nZFRhYi5nZXROZXh0VGFzaygpKSAhPSBudWxsKSB7XHJcbiAgICAgIC8vIHRyYW5zYWN0aW9uIG1pZ2h0IGJlIG51bGwgd2hlbiB0YXNrIGlzIGFib3J0aW5nIGJ1dCBub3QgeWV0IHVubG9hZGVkLlxyXG4gICAgICBpZiAodHJhbnNUYXNrLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJlxyXG4gICAgICAgIHRyYW5zVGFzay5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uLmdldFRyYW5zSWQoKSA9PT0gdHJhbnNJZCkge1xyXG4gICAgICAgIGlzRmluZCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24gPSAoaXNGaW5kID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1Rhc2suRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRyYW5zYWN0aW9uKHRoaXMsIHRyYW5zSWQpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSBuZXcgVHJhbnNhY3Rpb24gT3duZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFRyYW5zT3duZXJUYXNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5UcmFuc2FjdGlvbi5zZXRPd25lclRhc2sodGhpcyk7XHJcbiAgICB0aGlzLlRyYW5zYWN0aW9uLnNldFRyYW5zQmVnaW4oJ1QnKS8qJ1QnKi87XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgY291bnRlciBhY2NvcmRpbmcgdG8gdGhlIHRvcG1vc3QgdmFsdWUgaW4gdGhlIHN0YWNrIGFuZCB0aGUgc3RhdHVzIG9mIHRoZVxyXG4gIC8vLyAgIFwidXNlTG9vcFN0YWNrXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TG9vcENvdW50ZXIoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5fdXNlTG9vcFN0YWNrICYmIHRoaXMuX2xvb3BTdGFjayAhPT0gbnVsbCAmJiAhKHRoaXMuX2xvb3BTdGFjay5jb3VudCgpID09PSAwKSkge1xyXG4gICAgICByZXN1bHQgPSA8bnVtYmVyPnRoaXMuX2xvb3BTdGFjay5wZWVrKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2hlcyB0aGUgdmFsdWUgMCBvbiB0aGUgdG9wIG9mIHRoZSBsb29wIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBlbnRlckxvb3AoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fbG9vcFN0YWNrID09PSBudWxsKVxyXG4gICAgICB0aGlzLl9sb29wU3RhY2sgPSBuZXcgU3RhY2soKTtcclxuXHJcbiAgICB0aGlzLl9sb29wU3RhY2sucHVzaCgwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3BzIHRoZSB0b3Btb3N0IGVudHJ5IGZyb20gdGhlIGxvb3Agc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGxlYXZlTG9vcCgpOiB2b2lkIHtcclxuICAgIHRoaXMucG9wTG9vcENvdW50ZXIoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3BzIHRoZSB2YWx1ZSBvZiB0aGUgbG9vcCBjb3VudGVyIGZyb20gdGhlIHN0YWNrIGFuZCByZXR1cm5zIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwb3BMb29wQ291bnRlcigpOiBudW1iZXIge1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAodGhpcy5fbG9vcFN0YWNrICE9PSBudWxsICYmICEodGhpcy5fbG9vcFN0YWNrLmNvdW50KCkgPT09IDApKVxyXG4gICAgICByZXN1bHQgPSA8bnVtYmVyPnRoaXMuX2xvb3BTdGFjay5wb3AoKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluY3JlYXNlcyB0aGUgdmFsdWUgYXQgdGhlIHRvcCBvZiB0aGUgbG9vcCBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5jcmVhc2VMb29wQ291bnRlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xvb3BTdGFjay5wdXNoKHRoaXMucG9wTG9vcENvdW50ZXIoKSArIDEpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBsb29wIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMb29wU3RhY2tTaXplKCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5fbG9vcFN0YWNrICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5fbG9vcFN0YWNrLmNvdW50KCk7XHJcblxyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgXCJ1c2UgbG9vcCBzdGFja1wiIHZhcmlhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgdG8gc2V0PC9wYXJhbT5cclxuICBzZXRVc2VMb29wU3RhY2sodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl91c2VMb29wU3RhY2sgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBsaW5rcyB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RGF0YXZpZXdIZWFkZXJzKCk6IERhdGF2aWV3SGVhZGVycyB7XHJcbiAgICByZXR1cm4gdGhpcy5EYXRhdmlld0hlYWRlcnNUYWJsZTtcclxuICB9XHJcblxyXG4gIGlzRmlyc3RSZWNvcmRDeWNsZShWYWx1ZV8/OiBib29sZWFuKTogYW55IHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzRmlyc3RSZWNvcmRDeWNsZV8wKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5pc0ZpcnN0UmVjb3JkQ3ljbGVfMShWYWx1ZV8pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0ZpcnN0UmVjb3JkQ3ljbGVfMCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9maXJzdFJlY29yZEN5Y2xlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0ZpcnN0UmVjb3JkQ3ljbGVfMShWYWx1ZV86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZpcnN0UmVjb3JkQ3ljbGUgPSBWYWx1ZV87XHJcbiAgfVxyXG5cclxuICAvLy88c3VtbWFyeT5nZXQgdGhlIGludGVybmFsIG5hbWU8L3N1bW1hcnk+XHJcbiAgZ2V0UHVibGljTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuUHVibGljTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLzxzdW1tYXJ5PmdldCB0aGUgQWxsb3dFdmVudHM8L3N1bW1hcnk+XHJcbiAgYXN5bmMgaXNBbGxvd0V2ZW50cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfRVZFTlRTKTtcclxuICAgIHJldHVybiBhd2FpdCBwcm9wLmdldFZhbHVlQm9vbGVhbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vPHN1bW1hcnk+Z2V0IHRoZSB0YXNrIGlkPC9zdW1tYXJ5PlxyXG4gIGdldEV4dGVybmFsVGFza0lkKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgdGFza0lkOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfSUQpO1xyXG5cclxuICAgIGlmIChwcm9wICE9IG51bGwpXHJcbiAgICAgIHRhc2tJZCA9IHByb3AuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG5cclxuICAgIHJldHVybiB0YXNrSWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgVFJVRSBpZiB0aGlzIHRhc2sgb3ducyBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzVHJhbnNhY3Rpb25Pd25lcigpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RyYW5zT3duZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb24uaXNPd25lcih0aGlzKSlcclxuICAgICAgaXNUcmFuc093bmVyID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4gaXNUcmFuc093bmVyO1xyXG4gIH1cclxuXHJcbiAgaXNUcmFuc2FjdGlvbk9uTGV2ZWwobGV2ZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2FjdGlvbk93bmVyKCkgJiYgdGhpcy5UcmFuc2FjdGlvbi5nZXRMZXZlbCgpID09PSBsZXZlbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgd2hldGhlciB0aGUgdGFzayBpcyB0aGUgUHJvZ3JhbSAoaS5lLiBub3QgYSBzdWJ0YXNrKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNQcm9ncmFtKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzUHJnO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGVuYWJsZS1kaXNhYmxlIGFjdGlvbnMgZm9yIHRhc2sgbW9kZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGVuYWJsZU1vZGVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGVuYWJsZTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX01PRElGWSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fTU9ESUZZLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fQ1JFQVRFLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1FVRVJZLCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19RVUVSWSwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19SQU5HRSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fUkFOR0UsIGVuYWJsZSk7XHJcblxyXG4gICAgZW5hYmxlID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFLCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19MT0NBVEUsIGVuYWJsZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fU0VBUkNILCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1NPUlQsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU09SVF9SRUNPUkRTLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19JTkRFWCwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WSUVXX0JZX0tFWSwgZW5hYmxlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgaGFzWm9vbUhhbmRsZXIgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0RW5hYmxlWm9vbUhhbmRsZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9lbmFibGVab29tSGFuZGxlciA9IHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgaGFzWm9vbUhhbmRsZXJcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldEVuYWJsZVpvb21IYW5kbGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZVpvb21IYW5kbGVyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBpcyB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFzazwvcmV0dXJucz5cclxuICBpc0Rlc3RpbmF0aW9uU3ViZm9ybSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kZXN0aW5hdGlvblN1YmZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGZvciBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVzdGluYXRpb25TdWJmb3JtXCI+PC9wYXJhbT5cclxuICBzZXREZXN0aW5hdGlvblN1YmZvcm0oZGVzdGluYXRpb25TdWJmb3JtOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kZXN0aW5hdGlvblN1YmZvcm0gPSBkZXN0aW5hdGlvblN1YmZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IGlzIHRoZSB0YXNrIGlzIGEgRGVzdGluYXRpb24gU3ViZm9ybSB0YXNrPC9yZXR1cm5zPlxyXG4gIGdldElzRGVzdGluYXRpb25DYWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzRGVzdGluYXRpb25DYWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBmb3IgRGVzdGluYXRpb24gU3ViZm9ybSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzRGVzdGluYXRpb25DYWxsXCI+PC9wYXJhbT5cclxuICBzZXRJc0Rlc3RpbmF0aW9uQ2FsbChpc0Rlc3RpbmF0aW9uQ2FsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5faXNEZXN0aW5hdGlvbkNhbGwgPSBpc0Rlc3RpbmF0aW9uQ2FsbDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHNldENhbmNlbFdhc1JhaXNlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhbmNlbFdhc1JhaXNlZCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGNhbmNlbFdhc1JhaXNlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jYW5jZWxXYXNSYWlzZWQ7XHJcbiAgfVxyXG5cclxuICBlbmFibGVDcmVhdGVBY3RzKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSwgdmFsKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FX0FCT1ZFLCAgKHRoaXMuZ2V0Rm9ybSgpLkhhc1RhYmxlKCkgKSA/IHZhbCA6IGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIGVuYWJsZS9kaXNhYmxlIHN0YXR1cyBvZiBjcmVhdGUgYW5kIGRlbGV0ZSBhY3Rpb25zXHJcbiAgLy8vIDwvc3VtbWFyeVxyXG4gIGFzeW5jIHNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghKHRoaXMuRGF0YVZpZXcpLmlzRW1wdHlEYXRhdmlldygpICYmIGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0RFTEVURSwgdHJ1ZSkgJiZcclxuICAgICAgdGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZICYmICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuSGFzTWFpblRhYmxlKVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ERUxMSU5FLCB0cnVlKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORSwgZmFsc2UpO1xyXG5cclxuICAgIGlmICgoYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFLCB0cnVlKSkgJiZcclxuICAgICAgKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuSGFzTWFpblRhYmxlICYmXHJcbiAgICAgICAgKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSAmJiBFbnZpcm9ubWVudC5JbnN0YW5jZS5hbGxvd0NyZWF0ZUluTW9kaWZ5TW9kZSh0aGlzLmdldENvbXBJZHgoKSkpIHx8XHJcbiAgICAgICAgKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkpKVxyXG4gICAgICB0aGlzLmVuYWJsZUNyZWF0ZUFjdHModHJ1ZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuZW5hYmxlQ3JlYXRlQWN0cyhmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVtcHR5RGF0YXZpZXdcIj50aGUgZW1wdHlEYXRhdmlldyB0byBzZXQgPC9wYXJhbT5cclxuICBzZXRFbXB0eURhdGF2aWV3KGVtcHR5RGF0YXZpZXc6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YVZpZXcuc2V0RW1wdHlEYXRhdmlldyhlbXB0eURhdGF2aWV3KTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gPC9yZXR1cm5zPlxyXG4gIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLk5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCB3aGVuIHRhc2sgc3RhcnRzIGl0cyBleGVjdXRpb24gaW4gRW1wdHkgRGF0YXZpZXcgbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZW1wdHlEYXRhdmlld09wZW4oc3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIHRvIHByZXZlbnQgZG91YmxlIHByZWZpeCBvbiB0aGUgc2FtZSByZWNvcmRcclxuICAgIGlmICh0aGlzLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spIHtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU1QVFlfREFUQVZJRVcsIHRydWUpO1xyXG4gICAgICAvLyBpZiB0aGUgdGFzayBpcyBhIHN1YmZvcm0gYW5kIHN1YmZvcm0gcmVmcmVzaCBpcyBkb25lLCBzbyBleGVjdXRlIHRoZSBlbXB0eSBkYXRhdHZpZXcgaGFuZGxlcixcclxuICAgICAgLy8gaWYgdGhlIHRhc2sgaXMgbm90IGEgc3ViZm9ybSwgcHV0IHRoZSBlbXB0eSBkYXRhdmlldyBldmVudCBvbiB0aGUgcXVldWVcclxuICAgICAgaWYgKHRoaXMuSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgbGV0IHJ0RXZudCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICAgICAgaWYgKChydEV2bnQgIT0gbnVsbCAmJiBydEV2bnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVykgfHwgc3ViZm9ybVJlZnJlc2gpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRoaXMpO1xyXG4gICAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXKTtcclxuICAgICAgICAgIHJ0RXZ0LlNldEV2ZW50U3ViVHlwZShFdmVudFN1YlR5cGUuTm9ybWFsKTtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5hZGRJbnRlcm5hbEV2ZW50V2l0aEl0YXNrQW5kQ29kZSh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU1QVFlfREFUQVZJRVcpO1xyXG5cclxuICAgICAgdGhpcy5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG5cclxuICAgICAgLy8gZm9yIHN1YmZvcm0gbW9kZSAnQXNQYXJlbnQnLiBJZiB0aGUgcGFyZW50IHRhc2sgdGhhdCBpbiAnRW1wdHkgRGF0YXZpZXcnIHN0YXRlIGNoYW5nZXMgaXRzIG1vZGVcclxuICAgICAgLy8gdGhlIHN1YmZvcm0gYWxzbyBtdXN0IGNoYW5nZSBtb2RlLlxyXG4gICAgICAvLyBRQ1IgIzI4MTg2Mi4gSWYgdGhlIHN1YmZvcm0gdGFzayBpcyBvcGVuZWQgaW4gdGhlIGZpcnN0IHRpbWUgZG8gbm90IHJlZnJlc2ggaXQncyBzdWJmb3JtcyxcclxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3ZlIHJlY2VpdmVkIHRoZWlyIGRhdGF2aWV3cyBhbHJlYWR5LlxyXG4gICAgICAvLyBXZSBtdXN0IHJlZnJlc2ggdGhlbSB3aGVuIHRoZSBzdWJmb3JtIHRhc2sgcGFzc2VzIHRvIGVtcHR5IERWLlxyXG4gICAgICBpZiAodGhpcy5TdWJmb3JtRXhlY01vZGUgIT09IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5GSVJTVF9USU1FICYmIHN1YmZvcm1SZWZyZXNoICYmIGF3YWl0IHRoaXMuQ2hlY2tSZWZyZXNoU3ViVGFza3MoKSkge1xyXG4gICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuY29tcHV0ZVN1YkZvcm1zKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5kb1N1YmZvcm1SZWNQcmVmaXhTdWZmaXgoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgdGhpcy5lbmFibGVSZWNvcmRBY3Rpb25zKCk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JELCBmYWxzZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCB3aGVuIHRhc2sgZW5kcyBpdHMgZXhlY3V0aW9uIGluIEVtcHR5IERhdGF2aWV3IG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGVtcHR5RGF0YXZpZXdDbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXLCBmYWxzZSk7XHJcbiAgICB0aGlzLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JELCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YmZvcm1UYXNrXCI+PC9wYXJhbT5cclxuICBhc3luYyBTdWJmb3JtUmVmcmVzaChzdWJmb3JtVGFzazogVGFza0Jhc2UsIGV4cGxpY2l0U3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgIGxldCBpc0luc2lkZTogYm9vbGVhbiA9IGF3YWl0ICg8VGFzaz5zdWJmb3JtVGFzaykuRXhlY3V0ZU5lc3RlZFJTKGN1cnJUYXNrKTtcclxuXHJcbiAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIFFDUiAjNDM0NDY3LiBFeGVjdXRlIFJTIG9mIHRoZSBjdXJyZW50IHN1YmZvcm0gaWYgaXQncyB0aGUgY3VycmVudCAobGFzdCBmb2N1c2VkKSB0YXNrLlxyXG4gICAgaWYgKHN1YmZvcm1UYXNrLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0sgJiYgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYLCB0cnVlKTtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICBpc0luc2lkZSA9IHRydWU7XHJcblxyXG4gICAgICAvLyBEZWZlY3QgNzc0ODMuIERvIG5vdCBjb250aW51ZSBpZiB0aGUgcmVjb3JkIHN1ZmZpeCBleGVjdXRpb24gaXMgZmFpbGVkLlxyXG4gICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY3JlYXRlIGNvbW1hbmQgZm9yIHRoZSBzZXJ2ZXJcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU3ViZm9ybVJlZnJlc2hDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBzdWJmb3JtVGFzay5nZXRUYXNrVGFnKCksIGV4cGxpY2l0U3ViZm9ybVJlZnJlc2gpO1xyXG4gICAgYXdhaXQgc3ViZm9ybVRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICAgIGlmIChzdWJmb3JtVGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoZXhwbGljaXRTdWJmb3JtUmVmcmVzaCkge1xyXG4gICAgICAvLyBRQ1IgIzQyOTExMi4gUHVzaCBleGVjdXRpb24gc3RhY2sgYmVmb3JlIFJQIGV4ZWN1dGlvbi5cclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICAgIC8vIERlZmVjdCAjNzcwNDkuIERvIG5vdCBleGVjdXRlIHBhcmVudCBSUC4gV2UgbmVlZCBpdCBvbmx5IHdoZW4gY2xpY2sgb24gc3ViZm9ybXdhcyBkb25lLlxyXG4gICAgICBsZXQgcGVyZm9ybVBhcmVudFJlY29yZFByZWZpeE9yZzogYm9vbGVhbiA9ICg8VGFzaz5zdWJmb3JtVGFzaykuUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeDtcclxuICAgICAgKDxUYXNrPnN1YmZvcm1UYXNrKS5QZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHN1YmZvcm1UYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCwgdHJ1ZSk7XHJcbiAgICAgICg8VGFzaz5zdWJmb3JtVGFzaykuUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeCA9IHBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXhPcmc7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIFN1YmZvcm1SZWZyZXNoIGV2ZW50IHRvIGl0c2VsZiBzbyB0aGUgY3Vyc29yIG11c3QgYmUgb24gdGhlIGZpcnN0IGNvbnRyb2wgb2YgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgICAvLyBhcyBmb3IgVmlld1JlZnJlc2ggZXZlbnQuXHJcbiAgICBpZiAoaXNJbnNpZGUpIHtcclxuICAgICAgLy8gRGVmZWN0IDExNTc5My4gY3VyclRhc2sgY2FuJ3QgYmUgbnVsbC5cclxuICAgICAgLy8gaWYgKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICFzdWJmb3JtVGFzay5nZXRQcmV2ZW50Q29udHJvbENoYW5nZSgpICYmIGN1cnJUYXNrICE9IG51bGwpXHJcbiAgICAgIC8vICAgY3VyclRhc2subW92ZVRvRmlyc3RDdHJsKGZhbHNlKTtcclxuICAgICAgLy8gVE9ETzogVGFiYmluZyAmIEZvY3VzaW5nOiBIYW5kbGUgdGhpcyBzaXR1YXRpb25cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBpZiAoZXhwbGljaXRTdWJmb3JtUmVmcmVzaCkge1xyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YmZvcm1UYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICBpZiAoY3VyclRhc2sgIT0gbnVsbClcclxuICAgICAgICAgICAgKDxEYXRhVmlldz5jdXJyVGFzay5EYXRhVmlldykuc2V0UHJldkN1cnJSZWMoKTtcclxuICAgICAgICAgIHN1YmZvcm1UYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBFeGVjdXRlcyBSZWNvcmQgU3VmZml4ZXMgb2YgYWxsIG5lc3RlZCBzdWJmb3JtcyBmcm9tIGJvdHRvbSB0byB0b3AuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtVGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3VyclRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgRXhlY3V0ZU5lc3RlZFJTKGxhc3RUYXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgaXNFeGVjdXRlTmVzdGVkUlM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBRQ1IgIzE2ODM0Mi4gQSBuZXcgdGFzayBpcyBzZXQgYXMgZm9jdXNlZCB0YXNrIGFmdGVyIHRoZSBmaXJzdCBDUC5cclxuICAgIC8vIFNvIGlmIGluIENQIFVwZGF0ZSBvcGVyYXRpb24gaXMgZXhlY3V0ZWQgY3VyclRhc2sgaXMgbnVsbC4gQnV0IHdlIG11c3QgcmVmcmVzaCB0aGUgc3ViZm9ybS5cclxuICAgIGlmIChsYXN0VGFzayA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gaXNFeGVjdXRlTmVzdGVkUlM7XHJcblxyXG4gICAgLy8gRG8gbm90IGV4ZWN1dGUgc3ViZm9ybSByZWZyZXNoIHdoZW4gdGhlIGZvY3VzZWQgdGFzayBpcyBub3Qgb3BlbmVkIGFzIGEgc3ViZm9ybSAoaXQgd2FzIG9wZW5lZCBmcm9tIGNhbGwgb3BlcmF0aW9uKSxcclxuICAgIC8vIGJ1dCB0aGUgZm9jdXNlZCB0YXNrIGlzIGEgY2hpbGQgb2YgdGhlIHN1YmZvcm0gdGFzay4gU2VlIGZvciBleGFtcGxlIFFDUiAjNDMxODUwLlxyXG4gICAgaWYgKHRoaXMuZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyAmJiBsYXN0VGFzay5nZXRNZ2RJRCgpICE9PSB0aGlzLmdldE1nZElEKCkpXHJcbiAgICAgIHJldHVybiBpc0V4ZWN1dGVOZXN0ZWRSUztcclxuXHJcbiAgICBmb3IgKGxldCB0YXNrOiBUYXNrID0gbGFzdFRhc2s7IHRhc2sgIT09IHRoaXMgJiYgdGFzay5wYXRoQ29udGFpbnModGhpcykgJiYgdGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLOyB0YXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIGlzRXhlY3V0ZU5lc3RlZFJTID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNFeGVjdXRlTmVzdGVkUlM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgUmVjIHN1ZmZpeCBmb3IgYWxsIG5lc3RlZCBzdWJmb3JtcyB1bnRpbGwgc3ViZm9ybSB0YXNrIHRoYXQgY29udGFpbnMgdGhlc2UgMiBzdWJmb3Jtc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIGV4ZWNTdWJmb3JtUmVjU3VmZml4KG5ld1Rhc2s6IFRhc2spOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgbGV0IHN1YmZUYXNrOiBUYXNrO1xyXG4gICAgbGV0IGk6IG51bWJlciwgaWR4ID0gMDtcclxuICAgIGZvciAoaSA9IHRoaXMuX3Rhc2tQYXRoLmxlbmd0aDsgaSA+IDA7IGktLSkge1xyXG4gICAgICBzdWJmVGFzayA9IHRoaXMuX3Rhc2tQYXRoLmdldF9JdGVtKGkgLSAxKTtcclxuICAgICAgaWYgKCFuZXdUYXNrLl90YXNrUGF0aC5Db250YWlucyhzdWJmVGFzaykpIHtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soc3ViZlRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAvLyBDaGFuZ2UgdGhlIENyZWF0ZSBtb2RlIHRvIE1vZGlmeSBpZiB0aGUgY3VycmVudCByZWNvcmQgaXMgbm90IGEgbmV3IHJlY29yZC5cclxuICAgICAgICAvLyBTbyB0aGUgbW9kZSBpcyBjaGFuZ2VkIG9ubHkgZm9yIHRoZSBmaXJzdCByZWNvcmQgdGhhdCB3YXMgbm90IGNoYW5nZWQuXHJcbiAgICAgICAgaWYgKHN1YmZUYXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgISgoPERhdGFWaWV3PnN1YmZUYXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCkpLmlzTmV3UmVjKCkpXHJcbiAgICAgICAgICBzdWJmVGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZHggPSBuZXdUYXNrLl90YXNrUGF0aC5pbmRleE9mKHN1YmZUYXNrKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgRGVidWcuQXNzZXJ0KGkgPiAwKTtcclxuICAgIHJldHVybiBpZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBjb3VudGVyIG9mIHRoZSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+Y291bnRlcjwvcmV0dXJucz5cclxuICBnZXRDb3VudGVyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY291bnRlcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbmNyZWFzZSB0aGUgdGFza3MgY291bnRlciBieSAxLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmNvdW50ZXI8L3JldHVybnM+XHJcbiAgaW5jcmVhc2VDb3VudGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY291bnRlciA9IHRoaXMuX2NvdW50ZXIgKyAxO1xyXG4gIH1cclxuXHJcbiAgc2V0Q291bnRlcihjbnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fY291bnRlciA9IGNudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICAhIVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyU3RhcnRQcm9nTGV2ZWwgPT09IFRhc2suU3RhcnRQcm9nTGV2ZWw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENoZWNrIGlmIHJlZmVyZW5jZSB0byBtYWluIHByb2dyYW0gZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmllbGRTdHJcIj5hIHJlZmVyZW5jZSB0byB0aGUgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIGlzTWFpblByb2dyYW1GaWVsZChmaWVsZFN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgRmllbGQ6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMoZmllbGRTdHIsICcsJyk7XHJcbiAgICBsZXQgbWFpblByb2dGaWVsZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChGaWVsZC5sZW5ndGggPT09IDIpIHtcclxuICAgICAgbGV0IHBhcmVudDogbnVtYmVyID0gTk51bWJlci5QYXJzZShGaWVsZC5nZXRfSXRlbSgwKSk7XHJcbiAgICAgIGlmIChwYXJlbnQgPT09IFRhc2tCYXNlLk1BSU5fUFJHX1BBUkVOVF9JRClcclxuICAgICAgICBtYWluUHJvZ0ZpZWxkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWFpblByb2dGaWVsZDtcclxuICB9XHJcblxyXG4gIGdldFRhc2tJbmZvKCk6IHN0cmluZyB7XHJcbiAgICAvLyBHZXQgdGhlIHRhc2sgbmFtZSB1c2luZyB0aGUgZ2V0UHJvcCgpIGFzIG5hbWUgaXMgb25seSBzZXJpYWxpemVkIGZvciBkZWJ1Z1xyXG4gICAgbGV0IHRhc2tOYW1lOiBzdHJpbmcgPSAodGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpKS5HZXRDb21wdXRlZFZhbHVlKCk7XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoJ3swfSB7MX0nLHRoaXMuaXNQcm9ncmFtKCkgPyAnUHJvZ3JhbSc6ICdTdWJ0YXNrJywgdGFza05hbWUpO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBOU3RyaW5nLkZvcm1hdChcIih0YXNrIHswfS1cXFwiezF9XFxcInsyfSlcIiwgdGhpcy5fdGFza1RhZywgdGhpcy5OYW1lLCBzdXBlci5pc01haW5Qcm9nKCkgPyAoXCIgY3RsIFwiICsgdGhpcy5fY3RsSWR4KSA6IFwiXCIpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgQ29uc3RydWN0TWdGb3JtKGFscmVhZHlTZXRQYXJlbnRGb3JtOiBSZWZQYXJhbTxib29sZWFuPik6IE1nRm9ybUJhc2Uge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IG5ldyBNZ0Zvcm0oKTtcclxuICAgIGxldCBwYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlID0gKHRoaXMuUGFyZW50VGFzayAhPSBudWxsID8gdGhpcy5QYXJlbnRUYXNrLmdldEZvcm0oKSA6IG51bGwpO1xyXG5cclxuICAgIC8vIFBhcmVudEZvcm0gb2YgYW55IGZvcm0gc2hvdWxkIGJlIGEgdmlzaWJsZSBvbmUuIEl0IG1pZ2h0IGhhcHBlbiB0aGF0IHRoZSBQYXJlbnRUYXNrXHJcbiAgICAvLyBpcyBhIG5vbi1pbnRlcmFjdGl2ZSB0YXNrIHdpdGggT3BlbldpbmRvdz1Oby4gSW4gdGhpcyBjYXNlLCB0aGUgUGFyZW50IG9mIHRoZSBub24taW50ZXJhY3RpdmVcclxuICAgIC8vIHRhc2ssIHNob3VsZCBiZSB0aGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IGZvcm0uXHJcbiAgICB3aGlsZSAocGFyZW50Rm9ybSAhPSBudWxsICYmICFwYXJlbnRGb3JtLmdldFRhc2soKS5pc09wZW5XaW4oKSkge1xyXG4gICAgICBwYXJlbnRGb3JtID0gcGFyZW50Rm9ybS5QYXJlbnRGb3JtO1xyXG4gICAgfVxyXG5cclxuICAgIGZvcm0uUGFyZW50Rm9ybSA9IHBhcmVudEZvcm07XHJcbiAgICBhbHJlYWR5U2V0UGFyZW50Rm9ybS52YWx1ZSA9IHRydWU7XHJcbiAgICByZXR1cm4gZm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBtZ2RhdGEgSUQgdG8gd2hpY2ggdGFzayBiZWxvbmdzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRNZ2RJRCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX21nRGF0YS5HZXRJZCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCByZWZlcmVuY2UgdG8gY3VycmVudCBNR0RhdGFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE1HRGF0YSgpOiBNR0RhdGEge1xyXG4gICAgcmV0dXJuIHRoaXMuX21nRGF0YTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcmVmcmVzaCB0aGUgZGlzcGxheSwgcGFpbnQgdGhlIGNvbnRyb2xzIGFuZCB0aGVpciBwcm9wZXJ0aWVzIGFnYWluIDwvc3VtbWFyeT5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLkZvcm0gIT09IG51bGwgJiYgIXRoaXMuaXNBYm9ydGluZygpICYmIHRoaXMuaXNTdGFydGVkKCkpIHtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJTdGFydCB0YXNrLlJlZnJlc2hEaXNwbGF5KClcIik7XHJcblxyXG4gICAgICAvLyByZWNvcmRzIGZyb20gdGhlIERhdGFWaWV3IGFuZCByZWZyZXNoZXMgdGhlIHJvd3MuXHJcbiAgICAgIC8vIE5vdywgVGFzay5SZWZyZXNoRGlzcGxheSgpIGlzIGNhbGxlZCBmcm9tIDIgcGxhY2VzOlxyXG4gICAgICAvLyAxLiB3aGlsZSBpbml0aW5nIHRoZSBmb3JtXHJcbiAgICAgIC8vIDIuIHdoZW4gY29taW5nIGJhY2sgZnJvbSBzZXJ2ZXJcclxuICAgICAgLy8gSW4gY2FzZSAjMSwgd2UgZG8gbm90IG5lZWQgdG8gcmVmcmVzaCB0aGUgdGFibGUgYXMgaXQgaXMgZG9uZSBmcm9tIGZpcnN0VGFibGVSZWZyZXNoKCkuXHJcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgY2FuIGJlIGVsaW1pbmF0ZWQuXHJcbiAgICAgIGlmICh0aGlzLl9yZWZyZXNoVHlwZSAhPT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9OT05FKSB7XHJcbiAgICAgICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5Gb3JtO1xyXG4gICAgICAgIGxldCB3YXNSZWZyZXNoZWQ6IGJvb2xlYW4gPSBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgaWYgKHdhc1JlZnJlc2hlZCkge1xyXG4gICAgICAgICAgdGhpcy5fcmVmcmVzaFR5cGUgPSBDb25zdGFudHMuVEFTS19SRUZSRVNIX05PTkU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiRW5kIHRhc2suUmVmcmVzaERpc3BsYXkoKVwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZ2V0IHRoZSB2YWx1ZSBvZiBhIGZpZWxkLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmllbGREZWZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxcIj48L3BhcmFtPlxyXG4gIC8vIFRPRE8gc2FkaGFuIHJlbW92ZSB1bnVzZWRcclxuICAvLyBhc3luYyBnZXRGaWVsZFZhbHVlKGZpZWxkRGVmOiBGaWVsZERlZiwgdmFsdWU6IFJlZlBhcmFtPHN0cmluZz4sIGlzTnVsbDogUmVmUGFyYW08Ym9vbGVhbj4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAvLyAgIHZhbHVlLnZhbHVlID0gYXdhaXQgKDxGaWVsZD5maWVsZERlZikuZ2V0VmFsdWUoZmFsc2UpO1xyXG4gIC8vICAgaXNOdWxsLnZhbHVlID0gYXdhaXQgKDxGaWVsZD5maWVsZERlZikuaXNOdWxsKCk7XHJcbiAgLy8gfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGdldCB0aGUgZGlzcGxheSB2YWx1ZSBvZiBhIGZpZWxkLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmllbGREZWZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxcIj48L3BhcmFtPlxyXG4gIGdldEZpZWxkRGlzcGxheVZhbHVlKGZpZWxkRGVmOiBGaWVsZERlZiwgdmFsdWU6IFJlZlBhcmFtPHN0cmluZz4sIGlzTnVsbDogUmVmUGFyYW08Ym9vbGVhbj4pOiB2b2lkIHtcclxuICAgIHZhbHVlLnZhbHVlID0gKDxGaWVsZD5maWVsZERlZikuZ2V0RGlzcFZhbHVlKCk7XHJcbiAgICBpc051bGwudmFsdWUgPSAoPEZpZWxkPmZpZWxkRGVmKS5pc051bGwoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gdXBkYXRlcyB0aGUgZmllbGQncyB2YWx1ZSBhbmQgc3RhcnRzIHJlY29tcHV0ZS4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkRGVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICBhc3luYyBVcGRhdGVGaWVsZFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUoZmllbGREZWY6IEZpZWxkRGVmLCB2YWx1ZTogc3RyaW5nLCBpc051bGw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLlRhc2tQcmVmaXhFeGVjdXRlZCkge1xyXG4gICAgICBhd2FpdCAoPEZpZWxkPmZpZWxkRGVmKS5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHZhbHVlLCBpc051bGwsIHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEZvciBhIHJpY2hjbGllbnQgdGFza3MsIGNoZWNrIGlmIE5vbi1JbnRlcmFjdGl2ZSB0YXNrIGNoaWxkIHNob3VsZCBiZSBNb2RhbC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz50cnVlPC9yZXR1cm5zPlxyXG4gIFNob3VsZE5vbkludGVyYWN0aXZlQ2hpbGRCZU1vZGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuU2hvdWxkQ2hpbGRCZU1vZGFsKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrIGlmIGEgdGFza3MgY2hpbGQgc2hvdWxkIGJlIG1vZGFsXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgU2hvdWxkQ2hpbGRCZU1vZGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGNoaWxkU2hvdWxkQmVoYXZlQXNNb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIHdpbmRvdyBpcyBvcGVuZWQgYW5kIG9mIG1vZGFsIHR5cGUgKGRvZXNuJ3QgbWF0dGVyIGlmIGludGVyYWN0aXZlIG9yIG5vdClcclxuICAgIGlmICgodGhpcy5Gb3JtLkNvbmNyZXRlV2luZG93VHlwZSA9PT0gV2luZG93VHlwZS5PdmVybGF5KSAmJiB0aGlzLmdldEZvcm0oKS5PcGVuZWQpXHJcbiAgICAgIGNoaWxkU2hvdWxkQmVoYXZlQXNNb2RhbCA9IHRydWU7XHJcbiAgICBlbHNlIGlmICghdGhpcy5Jc0ludGVyYWN0aXZlKSB7XHJcbiAgICAgICAgY2hpbGRTaG91bGRCZWhhdmVBc01vZGFsID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGlsZFNob3VsZEJlaGF2ZUFzTW9kYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBwYXJlbnQgdGFzayBvZiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFBhcmVudCgpOiBUYXNrQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyB0YXNrIGlzIHRoZSBjaGVja2VkIHRhc2sgb3IgYSBkZXNjZW5kYW50IG9mIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0Rlc2NlbmRlbnRPZihjaGtUYXNrOiBUYXNrQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGNoa1Rhc2sgPT09IHRoaXMpXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgZWxzZSBpZiAoY2hrVGFzayA9PT0gbnVsbCB8fCB0aGlzLl9wYXJlbnRUYXNrID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFRhc2suaXNEZXNjZW5kZW50T2YoY2hrVGFzayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBzdWJmb3JtQ3RybCB3aGljaCBpcyBNb2RhbCBpbiBjdXJyZW50IHJ1bnRpbWUgdHJlZSBpZiB0aGVyZSBpcyBhbnk/LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIEdldFN1YmZvcm1Nb2RhbFBhcmVudFRhc2soKTogTWdDb250cm9sIHtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IHRoaXM7XHJcbiAgICB3aGlsZSAoY3VyclRhc2suX3BhcmVudFRhc2sgIT0gbnVsbCAmJiBjdXJyVGFzay5fcGFyZW50VGFzay5nZXRJc0Rlc3RpbmF0aW9uQ2FsbCgpKSB7XHJcbiAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD4oY3VyclRhc2suX3BhcmVudFRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCkpO1xyXG4gICAgICBpZiAoc3ViZm9ybUN0cmwuSXNNb2RhbCgpKVxyXG4gICAgICB7XHJcbiAgICAgICAgcmV0dXJuIHN1YmZvcm1DdHJsO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnJUYXNrID0gY3VyclRhc2suX3BhcmVudFRhc2s7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0cnVlIGZvciByZW1vdGUgdGFzayBmb3IgZXhwcmVzc2lvbiB0aGF0IHdhcyBjb21wdXRlZCBvbmNlIG9uIHNlcnZlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBTaG91bGRFdmFsdWF0ZVByb3BlcnR5TG9jYWxseShwcm9wSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuVGFza1NlcnZpY2UuU2hvdWxkRXZhbHVhdGVQcm9wZXJ0eUxvY2FsbHkocHJvcElkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVGhpcyBtZXRob2QgcnVucyBhY3Rpb25zIGFmdGVyIHRoZSAnZm9ybScgdGFnIGlzIGhhbmRsZWQuXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBFbnN1cmVWYWxpZEZvcm0oKTogdm9pZCB7XHJcbiAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2Q6XHJcbiAgICAvLyBJZiB0aGlzIHRhc2sgaXMgdGhlIG1haW4gcHJvZ3JhbSBhbmQgX29wZW5XaW4gZXZhbHVhdGVzIHRvICdmYWxzZScsIHRoZW5cclxuICAgIC8vIHByZXZlbnQgdGhlIGRpc3BsYXkgb2YgdGhlIGZvcm0sIGJ5IHNldHRpbmcgaXQgdG8gJ251bGwnLlxyXG4gICAgaWYgKHRoaXMuX2lzTWFpblByZyAmJiB0aGlzLkZvcm0gIT09IG51bGwpIHtcclxuICAgICAgaWYgKCF0aGlzLl9vcGVuV2luIHx8ICF0aGlzLkZvcm0uaXNMZWdhbEZvcm0pIHsgICAvLyBUaGlzIGNhbiBiZSBtZGkgZnJhbWVcclxuICAgICAgICB0aGlzLkZvcm0gPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNvbXB1dGUgdGhlIG1haW4gZGlzcGxheSBvbmNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIENvbXB1dGVNYWluRGlzcGxheSgpOiB2b2lkIHtcclxuICAgIGxldCBwcm9wTWFpbkRpc3BsYXk6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01BSU5fRElTUExBWSk7XHJcbiAgICBsZXQgbWFpbkRpc3BsYXlJbmRleDogbnVtYmVyID0gcHJvcE1haW5EaXNwbGF5LkdldENvbXB1dGVkVmFsdWVJbnRlZ2VyKCk7XHJcblxyXG4gICAgbWFpbkRpc3BsYXlJbmRleCA9IHRoaXMuR2V0UmVhbE1haW5EaXNwbGF5SW5kZXhPbkN1cnJlbnRUYXNrKG1haW5EaXNwbGF5SW5kZXgpO1xyXG5cclxuICAgIHRoaXMuX2Zvcm1zLkluaXRGb3JtRnJvbVhtbFN0cmluZyhtYWluRGlzcGxheUluZGV4KTtcclxuICAgIHRoaXMuRW5zdXJlVmFsaWRGb3JtKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHByZXBhcmUgdGFzayBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBQcmVwYXJlVGFza0Zvcm0oKTogUHJvbWlzZTxSZXR1cm5SZXN1bHQ+IHtcclxuICAgIGF3YWl0IFRhc2tTZXJ2aWNlQmFzZS5QcmVwYXJlUHJvcE9wZW5UYXNrV2luZG93KHRoaXMpO1xyXG4gICAgcmV0dXJuIFJlbW90ZVRhc2tTZXJ2aWNlLlByZXBhcmVQcm9wTWFpbkRpc3BsYXkodGhpcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0cnVlIGlmIGZvcm0gaXMgbGVnYWxcclxuICAvLy8gd2UgYXJlIG5vdCBnZXQgdG8gdGhhdCBtZXRob2QgZm9yIG1haW4gZGlzcGxheSB0aGF0IG9wZW4gd2luZG93IGlzIGZhbHNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEZvcm1Jc0xlZ2FsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzRm9ybUlzTGVnYWw6IGJvb2xlYW4gPSBzdXBlci5pc01haW5Qcm9nKCk7XHJcbiAgICByZXR1cm4gaXNGb3JtSXNMZWdhbCB8fCBzdXBlci5nZXRGb3JtKCkuaXNMZWdhbEZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCB0aGUgbWFpbiBkaXNwbGF5IG9uIHN0dWRpbyBkZXB0aFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWFpbkRzcElkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRSZWFsTWFpbkRpc3BsYXlJbmRleE9uRGVwdGgobWFpbkRzcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gdGhpcy5Mb2dpY2FsU3R1ZGlvUGFyZW50VGFzaztcclxuXHJcbiAgICB3aGlsZSAodGFzayAhPSBudWxsKSB7XHJcbiAgICAgIG1haW5Ec3BJZHggKz0gdGFzay5fZm9ybXMuQ291bnQ7XHJcbiAgICAgIHRhc2sgPSB0YXNrLkxvZ2ljYWxTdHVkaW9QYXJlbnRUYXNrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtYWluRHNwSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIG1haW4gZGlzcGxheSBvbiBzdHVkaW8gZGVwdGhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1haW5Ec3BJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0UmVhbE1haW5EaXNwbGF5SW5kZXhPbkN1cnJlbnRUYXNrKG1haW5Ec3BJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAobWFpbkRzcElkeCA+IDEpIHtcclxuXHJcbiAgICAgIGxldCB0YXNrOiBUYXNrID0gdGhpcy5Mb2dpY2FsU3R1ZGlvUGFyZW50VGFzaztcclxuXHJcbiAgICAgIHdoaWxlICh0YXNrICE9IG51bGwpIHtcclxuICAgICAgICBtYWluRHNwSWR4IC09IHRhc2suX2Zvcm1zLkNvdW50O1xyXG4gICAgICAgIHRhc2sgPSB0YXNrLkxvZ2ljYWxTdHVkaW9QYXJlbnRUYXNrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1haW5Ec3BJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCBBbmNlc3RvciB0YXNrIChvbiBydW50aW1lIHRyZWUpIG9mIHRoZSBzZW5kIHRhc2sgZGVmaW5pdGlvbiBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmluZFRhc2tEZWZpbml0aW9uSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0QW5jZXN0b3JUYXNrQnlUYXNrRGVmaW5pdGlvbklkKGZpbmRUYXNrRGVmaW5pdGlvbklkOiBUYXNrRGVmaW5pdGlvbklkKTogVGFzayB7XHJcbiAgICBsZXQgY3VycmVudFRhc2s6IFRhc2sgPSB0aGlzO1xyXG5cclxuICAgIC8vIEZpeGVkIGJ1ZyAjOjE3Mjk1OVxyXG4gICAgLy8gaWYgdGhlIGZpbmRUYXNrRGVmaW5pdGlvbklkIGlzIG1haW4gcHJvZ3JhbSAoY2FuIGJlIG9mIGNvbXBvbmVudCkgd2Ugd2lsbCBub3QgZm91bmQgaXQgaW4gdGhlIF9wYXJlbnRUYXNrXHJcbiAgICAvLyBzbyB3ZSB3aWxsIHRha2UgdGhlIHRhc2sgZnJvbSB0aGUgTUdEYXRhVGFibGVcclxuICAgIGlmIChmaW5kVGFza0RlZmluaXRpb25JZC5Jc01haW5Qcm9ncmFtKCkpXHJcbiAgICAgIHJldHVybiA8VGFzaz5HdWlEYXRhQ29sbGVjdGlvbi5NR0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KHRoaXMuQ29udGV4dElELCBmaW5kVGFza0RlZmluaXRpb25JZC5DdGxJbmRleCk7XHJcblxyXG4gICAgd2hpbGUgKGN1cnJlbnRUYXNrICE9IG51bGwpIHtcclxuICAgICAgaWYgKGN1cnJlbnRUYXNrLlRhc2tEZWZpbml0aW9uSWQuRXF1YWxzKGZpbmRUYXNrRGVmaW5pdGlvbklkKSlcclxuICAgICAgICByZXR1cm4gY3VycmVudFRhc2s7XHJcblxyXG4gICAgICBjdXJyZW50VGFzayA9IGN1cnJlbnRUYXNrLl9wYXJlbnRUYXNrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgU2V0RGF0YUNvbnRyb2xWYWx1ZXNSZWZlcmVuY2UoY29udHJvbElkOiBudW1iZXIsIGRjVmFsdWVzSWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2UgPSBzdXBlci5nZXRGb3JtKCkuZ2V0Q3RybChjb250cm9sSWQpO1xyXG4gICAgY3RybC5zZXREY1ZhbElkKGRjVmFsdWVzSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBkaXNwbGF5IHRlc3Qgb24gc3RhdHVzIGJhclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGV4dFwiPjwvcGFyYW0+XHJcbiAgRGlzcGxheU1lc3NhZ2VUb1N0YXR1c0Jhcih0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIFFjciAjNzk4MzExLiBpZiBzZXJ2ZXIgc2lkZSBoYWQgTVAgZG9pbmcgdmVyaWZ5IHRvIHBhbmUgYW5kIE1QIGhhcyBubyBmb3JtXHJcbiAgICAvLyB3ZSB3aWxsIGdldCBhbiBleGNlcHRpb24uIHNvIGluIGNhc2Ugb2Ygbm8gZm9ybSwgZ2V0IGl0IGZyb20gbGFzdCBmb2N1c2VkIHRhc2suXHJcbiAgICBsZXQgdGFza1RvVmVyaWZ5T246IFRhc2sgPSA8VGFzaz4gdGhpcy5HZXRDb250ZXh0VGFzaygpO1xyXG4gICAgaWYgKHRhc2tUb1ZlcmlmeU9uLmdldEZvcm0oKSA9PSBudWxsKVxyXG4gICAgICB0YXNrVG9WZXJpZnlPbiA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuXHJcbiAgICB0YXNrVG9WZXJpZnlPbi5Xcml0ZVRvTWVzc2FnZVBhbmUodGV4dCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXIoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5nZXRGb3JtKCkgIT0gbnVsbClcclxuICAgICAgaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXIgPSAoPE1nRm9ybT50aGlzLmdldEZvcm0oKSkuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpO1xyXG5cclxuICAgIHJldHVybiBpc1RhYmxlV2l0aEFic29sdXRlc1Njcm9sbGJhcjtcclxuICB9XHJcblxyXG4gIEdldFRhc2tEZXRhaWxzKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgbmFtZXMgPSAgKHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSB0aGlzO1xyXG4gICAgd2hpbGUgKHRhc2suUGFyZW50VGFzayAhPT0gbnVsbCAmJiAhdGFzay5QYXJlbnRUYXNrLmlzTWFpblByb2coKSkge1xyXG4gICAgICB0YXNrID0gPFRhc2s+dGFzay5QYXJlbnRUYXNrO1xyXG4gICAgICBuYW1lcyA9ICAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpKS5HZXRDb21wdXRlZFZhbHVlKCkgKyBcIi5cIiArIG5hbWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuYW1lcztcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHBhcnNlcyB0aGUgdGFza1VSTCB0YWdcclxuICAvLy8gZXZlcnkgdGFza1VSTCB0YWcgaXMgcmVwbGFjZWQgYnkgdGhlIGRhdGEgb2YgdGhlIHhtbCBpc2xhbmQgaXQgcmVmZXJzIHRvPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBhc3luYyBQcm9jZXNzVGFza1VSTCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB4bWxEYXRhOiBzdHJpbmcgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldFhNTGRhdGEoKTtcclxuICAgIGxldCBlbmRUYXNrVXJsSWR4OiBudW1iZXIgPSB4bWxEYXRhLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoZW5kVGFza1VybElkeCAhPT0gLTEgJiYgZW5kVGFza1VybElkeCA8IHhtbERhdGEubGVuZ3RoKTtcclxuXHJcbiAgICAvLyBleHRyYWN0IHRoZSB0YXNrIHVybCBhbmQgdGhlIHJlZiBsaXN0XHJcbiAgICBsZXQgdGFnOiBzdHJpbmcgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRUYXNrVXJsSWR4KTtcclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTCkgKyBDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTC5sZW5ndGgpO1xyXG5cclxuICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMoUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kVGFza1VybElkeCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICBsZXQgdGFza0NhY2hlVVJMOiBzdHJpbmcgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oMSk7XHJcbiAgICBsZXQgcmVmTGlzdFN0cjogc3RyaW5nID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKDMpO1xyXG5cclxuICAgIC8vIGJyaW5nIHRoZSBkYXRhXHJcbiAgICBsZXQgdGFza0NvbnRlbnRPcmlnaW5hbDogc3RyaW5nID0gYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5HZXRDb250ZW50KHRhc2tDYWNoZVVSTCwgdHJ1ZSk7XHJcblxyXG4gICAgLy8gcHJlZml4IHRoZSBvcmlnaW5hbCBkYXRhIHRpbGwgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IDx0YXNrVVJMPlxyXG4gICAgbGV0IHRhc2tDb250ZW50RmluYWw6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih4bWxEYXRhLnN1YnN0cigwLCBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldEN1cnJJbmRleCgpIC0gKENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLVVJMLmxlbmd0aCArIDEpKSwgdGFza0NvbnRlbnRPcmlnaW5hbC5sZW5ndGgpO1xyXG4gICAgLy8gdGhlIG51bWJlciBvZiB0b2tlbnMgaW4gcmVmTGlzdCBhbmQgdGhlIG51bWJlciBvZiBsb2NhdGlvbiBpbiB0aGUgeG1sIHRvIGJlIHJlcGxhY2VkIChpLmUuIHRoZSBwbGFjZXMgd2l0aCBbOikgc2hvdWxkIGJlIGVxdWFsXHJcbiAgICBsZXQgcmVmbGlzdDogTGlzdDxzdHJpbmc+ID0gdGhpcy5nZXRSZWZsaXN0KHJlZkxpc3RTdHIsICc7JywgdHJ1ZSwgLTEpO1xyXG4gICAgbGV0IHJlZkxpc3RJZHggPSAwO1xyXG5cclxuICAgIGxldCBjdXJySWR4OiBudW1iZXIgPSB0YXNrQ29udGVudE9yaWdpbmFsLmluZGV4T2YoXCJbOlwiKTtcclxuICAgIGxldCBwcmV2SWR4OiBudW1iZXIgPSAwO1xyXG4gICAgd2hpbGUgKGN1cnJJZHggIT09IC0xKSB7XHJcbiAgICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHRhc2tDb250ZW50T3JpZ2luYWwuc3Vic3RyKHByZXZJZHgsIGN1cnJJZHggLSBwcmV2SWR4KSk7XHJcbiAgICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHJlZmxpc3QuZ2V0X0l0ZW0ocmVmTGlzdElkeCsrKSk7XHJcbiAgICAgIGN1cnJJZHggKz0gMjtcclxuICAgICAgcHJldklkeCA9IGN1cnJJZHg7XHJcbiAgICAgIGN1cnJJZHggPSB0YXNrQ29udGVudE9yaWdpbmFsLmluZGV4T2YoXCJbOlwiLCBwcmV2SWR4KTtcclxuICAgIH1cclxuICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHRhc2tDb250ZW50T3JpZ2luYWwuc3Vic3RyKHByZXZJZHgpKTtcclxuXHJcbiAgICAvLyBzdWZmaXggdGhlIHJlc3Qgb2YgdGhlIG9yaWdpbmFsIHhtbCBmcm9tIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgPC90YXNrVVJMPlxyXG4gICAgdGFza0NvbnRlbnRGaW5hbC5BcHBlbmQoeG1sRGF0YS5zdWJzdHIoeG1sRGF0YS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIGVuZFRhc2tVcmxJZHggKyAxKSArIDEpKTtcclxuICAgIHhtbERhdGEgPSB0YXNrQ29udGVudEZpbmFsLlRvU3RyaW5nKCk7XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gLS0tLS0tLT4gezF9XCIsIHRhc2tDYWNoZVVSTCwgeG1sRGF0YSkpO1xyXG5cclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0WE1MZGF0YSh4bWxEYXRhKTtcclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0Q3VyckluZGV4KFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0Q3VyckluZGV4KCkgLSAoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkwubGVuZ3RoICsgMSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBwYXJzZXMgdGhlIGRhdGEgYWNvcmRpbmcgdG8gdGhlIGRlbGltZXRlciBhbmQgdGhlIHJlZmxpc3QgZGVsaW1ldGVycyBsb2dpYzwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHJ1bmNcIj5pZiB0cnVlIHRydWNhdGUgZmlyc3QgJ1xcXFwnIChpbiB1c2UgZm9yIGlzbGFuZCBkYXRhIHBhcnNpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1heFRva2Vuc1wiPmlmIC0xIGFsbCB0b2tlbnMgYXZpYWxhYmxlIGVsc2UgdGhlIG51bWJlciBvZiB0b2tlbnMgdG8gc2VhcmNoPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRhXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRSZWZsaXN0KGRhdGE6IHN0cmluZywgZGVsaW06IHN0cmluZywgdHJ1bmM6IGJvb2xlYW4sIG1heFRva2VuczogbnVtYmVyKTogTGlzdDxzdHJpbmc+IHtcclxuICAgIGxldCBjdXJyU3RyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBsaXN0OiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcbiAgICBsZXQgdG9rZW5zQ250OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIHNpbmNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYWx3YXlzICc7JyB3ZSBzdGFydCBmcm9tIDFcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBjdXJyOiBzdHJpbmcgPSBkYXRhLmNoYXJBdChpKTtcclxuXHJcbiAgICAgIGlmIChjdXJyICE9PSAnXFxcXCcgJiYgY3VyciAhPT0gZGVsaW0pXHJcbiAgICAgICAgY3VyclN0ci5BcHBlbmQoY3Vycik7XHJcbiAgICAgIGVsc2UgaWYgKGN1cnIgPT09IGRlbGltKSB7XHJcbiAgICAgICAgbGlzdC5wdXNoKGN1cnJTdHIuVG9TdHJpbmcoKSk7XHJcbiAgICAgICAgY3VyclN0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgdG9rZW5zQ250Kys7XHJcblxyXG4gICAgICAgIGlmICh0b2tlbnNDbnQgPT09IG1heFRva2VucylcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGN1cnIgPT09ICdcXFxcJykge1xyXG4gICAgICAgIC8vIHRoZSBmb3JtYXQgJ1xcXFxkZWxpbWl0ZXInIGlzIGFsd2F5cyB0cnVuY2F0ZWRcclxuICAgICAgICBpZiAoIXRydW5jICYmIGRhdGEuY2hhckF0KGkgKyAxKSAhPT0gZGVsaW0pXHJcbiAgICAgICAgICBjdXJyU3RyLkFwcGVuZChkYXRhLmNoYXJBdChpKSk7XHJcblxyXG4gICAgICAgIGkrKztcclxuICAgICAgICBjdXJyU3RyLkFwcGVuZChkYXRhLmNoYXJBdChpKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBhcHBlbmQgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgcmVmIGxpc3RcclxuICAgIGxpc3QucHVzaChjdXJyU3RyLlRvU3RyaW5nKCkpO1xyXG5cclxuICAgIHJldHVybiBsaXN0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzdGFydCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtIGFuZCBzZXQgZm9jdXMgdG8gdGhlIGZpcnN0IGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgU3RhcnRQcm9ncmFtKGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuLCBtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4pOiBQcm9taXNlPFRhc2s+IHtcclxuICAgIGxldCBvcmdTdG9wRXhlY3V0aW9uOiBib29sZWFuID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTtcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQ6IFRhc2sgPSBudWxsO1xyXG4gICAgbGV0IGFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldEFsbG93RXZlbnRzKCk7XHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRBbGxvd0V2ZW50cyhFdmVudHNBbGxvd2VkVHlwZS5BTEwpO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiU3RhcnQgXFxcInN0YXJ0UHJvZ1xcXCJcIik7XHJcbiAgICBUYXNrLlN0YXJ0UHJvZ0xldmVsKys7XHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTsgLy8gUUNSICM3Njk3MzQgLSBub3RoaW5nIGNhbiBzdG9wIGEgdGFzayBmcm9tIHN0YXJ0aW5nIHVwLlxyXG5cclxuICAgIC8vIEZpeGVkIGJ1ZyAjMjgzNjQ3IGV4ZWN1dGUgY29tcG9uZW50cyBtYWluIHByb2dyYW1zIC0gIGluIHRoZSBzZXJ2ZXIgd2UgZXhlY3V0ZSB0aGUgc2FtZSBzZWUgaW5pLmNwcCBtZXRob2QgZXhlY3V0ZV9tYWluX3Byb2dzKClcclxuICAgIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCA9IGF3YWl0IHRoaXMuRXhlY3V0ZUNvbXBvbmVudE1haW5Qcm9ncmFtcyhjYWxsQnlEZXN0U3ViRm9ybSwgbW92ZVRvRmlyc3RDb250cm9sKTtcclxuXHJcbiAgICAvLyBleGVjdXRlIGludGVybmFsIG1haW4gcHJvZ3JhbXNcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRSZWY6IFJlZlBhcmFtPFRhc2s+ID0gbmV3IFJlZlBhcmFtKG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCk7XHJcbiAgICBsZXQgY3VycmVudE5vbkludGVyYWN0aXZlVGFza1JlZjogUmVmUGFyYW08VGFzaz4gPSBuZXcgUmVmUGFyYW0obnVsbCk7XHJcbiAgICBhd2FpdCBUYXNrLkV4ZWN1dGVNYWluUHJvZ3JhbSgwLCBjYWxsQnlEZXN0U3ViRm9ybSwgbW92ZVRvRmlyc3RDb250cm9sLCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRSZWYsIGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2tSZWYsIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZSk7XHJcbiAgICBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQgPSBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRSZWYudmFsdWU7XHJcblxyXG4gICAgaWYgKCFUYXNrLl9pZGxlVGltZXJTdGFydGVkKSB7XHJcbiAgICAgIEdVSU1hbmFnZXIuSW5zdGFuY2Uuc3RhcnRUaW1lcihBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKDApLCBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRJZGxlVGltZSgwKSwgdHJ1ZSk7XHJcbiAgICAgIFRhc2suX2lkbGVUaW1lclN0YXJ0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMuT3BlbkZvcm1zKGNhbGxCeURlc3RTdWJGb3JtKTtcclxuICAgIGF3YWl0IHRoaXMuRG9GaXJzdFJlY29yZEN5Y2xlKCk7XHJcbiAgICBhd2FpdCB0aGlzLk1vdmVUb0ZpcnN0Q29udHJvbHMoY2FsbEJ5RGVzdFN1YkZvcm0pO1xyXG5cclxuXHJcbiAgICAvLyBIYW5kbGUgdGhlIGV2ZW50cyBvbmx5IHdoZW4gYWxsIHRoZSB0YXNrcyBhbmQgdGhlaXIgZm9ybXMgYXJlIG9wZW5lZC5cclxuICAgIGlmIChUYXNrLlN0YXJ0UHJvZ0xldmVsID09PSAxKSB7XHJcbiAgICAgIGxldCByZXNldEFsbG93RXZlbnRzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGxldCBjYW5FeGVjdXRlRXZlbnRzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIHNldCB0aGUgd2l0aGluIG5vbiBpbnRlcmFjdGl2ZSBzaW5jZSB0aGUgaGFuZGxlRXZlbnRzIG1pZ2h0IHRyeSB0byBleGVjdXRlIGFuIGV2ZW50XHJcbiAgICAgIC8vIHRoYXQgd2FzIHJhaXNlZCBpbiB0aGUgMXN0IHJlYyBwcmVmIChhZGRlZCBpbiBtb3ZlVG9GaXJzdGNvbnRyb2xzKS5cclxuICAgICAgaWYgKG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCAhPT0gbnVsbCAmJiBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQuaXNTdGFydGVkKCkpIHtcclxuICAgICAgICByZXNldEFsbG93RXZlbnRzID0gdHJ1ZTtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXROb25JbnRlcmFjdGl2ZUFsbG93RXZlbnRzKGF3YWl0IG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC5pc0FsbG93RXZlbnRzKCkpO1xyXG5cclxuICAgICAgICAvLyBub24gaW50ZXJhY3RpdmUgdGFzayB3aXRoIGFsbG93IGV2ZW50cyA9IE5PIGlzIGFib3V0IHRvIHJ1bi5cclxuICAgICAgICAvLyBkb24ndCB0cnkgdG8gZXhlY3V0ZSB0aGUgZXZlbnRzIGJlZm9yZSBpdCBzdGFydHMgYmVjYXVzZSB0aGV5IHdpbGwgYmUgbG9zdC4gKCMxMzg0OTMpXHJcbiAgICAgICAgY2FuRXhlY3V0ZUV2ZW50cyA9IGF3YWl0ICBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQuaXNBbGxvd0V2ZW50cygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBpZiB0aGUgaXQgaXMgYSBzdWJmb3JtIHdpdGggdmlzaWJpbGl0eSBleHByZXNzaW9uIGV2YWx1YXRlZCB0byBUUlVFLFxyXG4gICAgICAvLyBzbyBhZnRlciByZXR1cm4gZnJvbSB0aGUgc2VydmVyIGRvIG5vdCBleGVjdXRlIGV2ZW50cyBmcm9tIHRoZSBxdWV1ZS5cclxuICAgICAgLy8gVGhlc2UgZXZlbnRzIHdpbGwgYmUgZXhlY3V0ZWQgZnJvbSB0aGUgJ3N0YXJ0UHJvZycgb2YgdGhlIHBhcmVudCB0YXNrLlxyXG4gICAgICBpZiAoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpICE9PSBudWxsICYmIGNhbkV4ZWN1dGVFdmVudHMpIHtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUV2ZW50cyhBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0Q3Vyck1HRGF0YSgpLCAwKTtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlc3RvcmUuIGp1c3QgdG8gYmUgb24gdGhlIHNhZmUgc2lkZS4gaXQgd2lsbCBiZSBzZXQgYWdhaW4gb25jZSBpbiB0aGUgY29ycmVjdCBldmVudHNMb29wLlxyXG4gICAgICBpZiAocmVzZXRBbGxvd0V2ZW50cylcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRBbGxvd0V2ZW50cyhhbGxvd0V2ZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgVGFzay5TdGFydFByb2dMZXZlbC0tO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiRW5kIFxcXCJzdGFydFByb2dcXFwiXCIpO1xyXG5cclxuICAgIC8vIElmIG9yaWdpbmFsbHkgd2Ugd2VyZSBpbnN0cnVjdGVkIHRvIHN0b3AgZXZlbnRzIGV4ZWN1dGlvbiwgdGhlbiByZXN0b3JlIHRoaXNcclxuICAgIGlmIChvcmdTdG9wRXhlY3V0aW9uICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICBpZiAob3JnU3RvcEV4ZWN1dGlvbiAmJiAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKG9yZ1N0b3BFeGVjdXRpb24pO1xyXG5cclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBleGVjdXRlIGNvbXBvbmVudCdzIG1haW4gcHJvZ3JhbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY2FsbEJ5RGVzdFN1YkZvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vdmVUb0ZpcnN0Q29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnRoZSBub24gaW50ZXJhY3RpdmUgdGFzayBpZiBhbnkgdGhhdCBleGVjdXRlZDwvcmV0dXJucz5cclxuICBzdGF0aWMgYXN5bmMgRXhlY3V0ZUNvbXBvbmVudE1haW5Qcm9ncmFtcyhjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbiwgbW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuKTogUHJvbWlzZTxUYXNrPiB7IC8vIGdvIHdpdGggU3RhcnRQcm9ncmFtXHJcbiAgICBsZXQgY3VycmVudE5vbkludGVyYWN0aXZlVGFzazogUmVmUGFyYW08VGFzaz4gPSBuZXcgUmVmUGFyYW0obnVsbCk7XHJcbiAgICBsZXQgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkOiBSZWZQYXJhbTxUYXNrPiA9IG5ldyBSZWZQYXJhbShudWxsKTtcclxuXHJcbiAgICBsZXQgbWF4Q3RsSWR4OiBudW1iZXIgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKDApLmdldE1heEN0bElkeCgpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gbWF4Q3RsSWR4OyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IGNvbXBvbmVudE1haW5Qcm9ncmFtOiBUYXNrID0gPFRhc2s+QWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgoLTEsIGkpO1xyXG5cclxuICAgICAgaWYgKGNvbXBvbmVudE1haW5Qcm9ncmFtICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0IFRhc2suRXhlY3V0ZU1haW5Qcm9ncmFtKGksIGNhbGxCeURlc3RTdWJGb3JtLCBtb3ZlVG9GaXJzdENvbnRyb2wsIGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2ssIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCwgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLnZhbHVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZXhlY3V0ZSBtYWluIHByb2dyYW0gb2YgQ3RsSW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIkN0bEluZGV4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjYWxsQnlEZXN0U3ViRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW92ZVRvRmlyc3RDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIEV4ZWN1dGVNYWluUHJvZ3JhbShDdGxJbmRleDogbnVtYmVyLCBjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbiwgbW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuLCBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrOiBSZWZQYXJhbTxUYXNrPiwgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkOiBSZWZQYXJhbTxUYXNrPiwgbWdEYXRhVGFibGU6IElNR0RhdGFDb2xsZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbWFpblByb2dyYW1UYXNrOiBUYXNrID0gPFRhc2s+bWdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCgtMSwgQ3RsSW5kZXgpO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiICBDbGllbnRNYW5hZ2VyLnN0YXJ0UHJvZzogY3RsSWR4PXswfSwgdGFzaz17MX1cIiwgQ3RsSW5kZXgsIG1haW5Qcm9ncmFtVGFzaykpO1xyXG5cclxuICAgIGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2sudmFsdWUgPSAgPFRhc2s+KGF3YWl0IG1haW5Qcm9ncmFtVGFzay5TdGFydChtb3ZlVG9GaXJzdENvbnRyb2wsIGNhbGxCeURlc3RTdWJGb3JtKSk7XHJcbiAgICBpZiAobm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLnZhbHVlID09PSBudWxsKVxyXG4gICAgICBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQudmFsdWUgPSBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrLnZhbHVlO1xyXG4gICAgZWxzZSBpZiAoY3VycmVudE5vbkludGVyYWN0aXZlVGFzay52YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICBEZWJ1Zy5Bc3NlcnQoZmFsc2UsIFwibW9yZSB0aGFuIDEgbm9uIGludGVyYWN0aXZlIHRhc2tzIGluIHN0YXJ0UHJvZ1wiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gT3BlbiBhbGwgdGhlIGZvcm0gdGhhdCBhcmUgcGVuZGluZyBpbiBDcmVhdGVkRm9ybXMgdmVjdG9yLiA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGFzeW5jIE9wZW5Gb3JtcyhjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGNyZWF0ZWRGb3JtczogQ3JlYXRlZEZvcm1WZWN0b3IgPSBNZ0Zvcm0uQ3JlYXRlZEZvcm1zO1xyXG4gICAgbGV0IG91dE1vc3RGb3JtOiBNZ0Zvcm1CYXNlID0gbnVsbDtcclxuXHJcbiAgICBpZiAoY3JlYXRlZEZvcm1zLkNvdW50KCkgPiAwKSB7XHJcbiAgICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgICB3aGlsZSAoaSA8IGNyZWF0ZWRGb3Jtcy5Db3VudCgpKSB7XHJcbiAgICAgICAgbGV0IG1nRm9ybTogTWdGb3JtID0gY3JlYXRlZEZvcm1zLmdldChpKTtcclxuICAgICAgICBsZXQgY2FuT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBPcGVuIGEgc3ViZm9ybSBvbmx5IGlmIGl0cyBjb250YWluZXIgZm9ybSBpcyBPcGVuZWQuXHJcbiAgICAgICAgLy8gaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKSBkb2Vzbid0IGdvIHdlbGwgZm9yIHN1YmZvcm1zIChRQ1IgIzkxOTExOSkuXHJcbiAgICAgICAgaWYgKG1nRm9ybS5pc1N1YkZvcm0oKSkge1xyXG4gICAgICAgICAgbGV0IG9wZW5lZDogYm9vbGVhbiA9ICg8TWdGb3JtQmFzZT5tZ0Zvcm0uZ2V0U3ViRm9ybUN0cmwoKS5nZXRGb3JtKCkpLk9wZW5lZDtcclxuICAgICAgICAgIGlmIChvcGVuZWQpIHtcclxuICAgICAgICAgICAgY2FuT3BlbiA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKCg8VGFzaz5tZ0Zvcm0uZ2V0VGFzaygpKS5pc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpKSB7XHJcbiAgICAgICAgICAgIGNhbk9wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbk9wZW4pIHtcclxuICAgICAgICAgIE1hbmFnZXIuT3BlbkZvcm0obWdGb3JtKTtcclxuICAgICAgICAgIGF3YWl0IE1hbmFnZXIuRG9GaXJzdFJlZnJlc2hUYWJsZShtZ0Zvcm0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1nRm9ybS5PcGVuZWQpIHtcclxuICAgICAgICAgIGlmIChjYWxsQnlEZXN0U3ViRm9ybSAmJiBtZ0Zvcm0uaXNTdWJGb3JtKCkpXHJcbiAgICAgICAgICAgIG91dE1vc3RGb3JtID0gbWdGb3JtLmdldFRvcE1vc3RGb3JtKCk7XHJcblxyXG4gICAgICAgICAgY3JlYXRlZEZvcm1zLnJlbW92ZShtZ0Zvcm0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gR29lcyBvdmVyIGZvcm1zIGlzIGNyZWF0ZWRGb3JtVmVjIGFuZCBwZXJmb3JtcyBtb3ZlIHRvIGZpcnN0IHJlY29yZCBjeWNsZSBjb250cm9sPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBhc3luYyBEb0ZpcnN0UmVjb3JkQ3ljbGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICBsZXQgbWdkOiBNR0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKGkpO1xyXG4gICAgICBpZiAobWdkID09PSBudWxsIHx8IG1nZC5Jc0Fib3J0aW5nKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IG1nZC5nZXRUYXNrc0NvdW50KCk7IGorKykge1xyXG4gICAgICAgIGxldCB0YXNrOiBUYXNrID0gbWdkLmdldFRhc2soaik7XHJcblxyXG4gICAgICAgIGlmICh0YXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBsZXQgbWdGb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG5cclxuICAgICAgICAgIGlmIChtZ0Zvcm0gIT09IG51bGwgJiYgdGFzay5pc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpICYmICFtZ0Zvcm0uSWdub3JlRmlyc3RSZWNvcmRDeWNsZSkge1xyXG4gICAgICAgICAgICBtZ0Zvcm0uSWdub3JlRmlyc3RSZWNvcmRDeWNsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZG9GaXJzdFJlY29yZEN5Y2xlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEZvciBldmVyeSBtZ2RhdGEgcGVyZm9ybSBtb3ZlIHRvIGZpcnN0IGNvbnRyb2wgdG8gdGhlIGZvcm1cclxuICAvLy8gdGhhdCB3ZSBtYXJrZWQgYmVmb3JlIHdpdGggTW92ZVRvRmlyc3RDb250cm9sIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIE1vdmVUb0ZpcnN0Q29udHJvbHMoY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoaSk7XHJcblxyXG4gICAgICBpZiAobWdkID09PSBudWxsIHx8IG1nZC5Jc0Fib3J0aW5nKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgbGV0IHRhc2tzQ291bnQ6IG51bWJlciA9IG1nZC5nZXRUYXNrc0NvdW50KCk7XHJcbiAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0YXNrc0NvdW50OyBqKyspIHtcclxuICAgICAgICBsZXQgdGFzazogVGFzayA9IG1nZC5nZXRUYXNrKGopO1xyXG4gICAgICAgIGxldCBtZ0Zvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcblxyXG4gICAgICAgIGlmICh0YXNrLmlzQ3VycmVudFN0YXJ0UHJvZ0xldmVsKCkgJiYgbWdGb3JtICE9PSBudWxsICYmIG1nRm9ybS5Nb3ZlZFRvRmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgICBtZ0Zvcm0uTW92ZWRUb0ZpcnN0Q29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKCFjYWxsQnlEZXN0U3ViRm9ybSlcclxuICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuXHJcblxyXG4iXX0=