@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.
- package/bundles/magic-xpa-engine.umd.js +45 -45
- package/bundles/magic-xpa-engine.umd.js.map +1 -1
- package/bundles/magic-xpa-engine.umd.min.js +2 -2
- package/bundles/magic-xpa-engine.umd.min.js.map +1 -1
- package/esm2015/src/CommandsProcessorBase.js +2 -2
- package/esm2015/src/CurrentClientVersion.js +2 -2
- package/esm2015/src/commands/ClientToServer/BrowserEscEventCommand.js +2 -3
- package/esm2015/src/data/DataView.js +2 -3
- package/esm2015/src/data/Field.js +2 -3
- package/esm2015/src/data/Record.js +2 -3
- package/esm2015/src/env/LanguageData.js +2 -3
- package/esm2015/src/event/EventHandler.js +2 -3
- package/esm2015/src/event/EventHandlerPosition.js +2 -2
- package/esm2015/src/event/EventsManager.js +2 -3
- package/esm2015/src/exp/ExpressionEvaluator.js +2 -3
- package/esm2015/src/gui/MgForm.js +2 -3
- package/esm2015/src/http/client/HttpClientBase.js +2 -3
- package/esm2015/src/remote/RemoteCommandsProcessor.js +2 -3
- package/esm2015/src/remote/ServerError.js +2 -3
- package/esm2015/src/rt/DataviewHeadersSaxHandler.js +2 -3
- package/esm2015/src/tasks/Task.js +2 -3
- package/fesm2015/magic-xpa-engine.js +2 -3
- package/fesm2015/magic-xpa-engine.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __awaiter } from "tslib";
|
|
2
|
-
import { ApplicationException, Debug, List, NNumber, NString, RefParam } from "@magic-xpa/mscorelib";
|
|
2
|
+
import { ApplicationException, Debug, List, NNumber, NString, RefParam, isNullOrUndefined } from "@magic-xpa/mscorelib";
|
|
3
3
|
import { Constants, InternalInterface, Logger, MsgInterface, PICInterface, StorageAttribute, StrUtil, UtilStrByteMode, XMLConstants, XmlParser } from "@magic-xpa/utils";
|
|
4
4
|
import { BlobType, DisplayConvertor, ExpVal, FieldDef, NUM_TYPE, PIC, VectorType } from "@magic-xpa/gui";
|
|
5
5
|
import { YesNoExp } from "../exp/YesNoExp";
|
|
@@ -10,7 +10,6 @@ import { ArgumentsList } from "../rt/ArgumentsList";
|
|
|
10
10
|
import { ConstInterface } from "../ConstInterface";
|
|
11
11
|
import { RunTimeEvent } from "../event/RunTimeEvent";
|
|
12
12
|
import { Record } from "./Record";
|
|
13
|
-
import { isNullOrUndefined } from "util";
|
|
14
13
|
import { Environment } from "../env/Environment";
|
|
15
14
|
import { FieldBase } from "./FieldBase";
|
|
16
15
|
import { LastFocusedManager } from "../rt/LastFocusedManager";
|
|
@@ -669,4 +668,4 @@ Field.LEAVE_FLAGS = false;
|
|
|
669
668
|
Field.NUM0 = null;
|
|
670
669
|
Field.NUM1 = null;
|
|
671
670
|
Field._variableChangeEvts = new List();
|
|
672
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL2RhdGEvRmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbkcsT0FBTyxFQUNMLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxRQUFRLEVBQ1IsZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixRQUFRLEVBRVIsUUFBUSxFQUNSLEdBQUcsRUFDSCxVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFHL0QsT0FBTyxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWpELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsV0FBVyxFQUFF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LEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1NBQzFDOztZQUNJLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBS0QsSUFBSSx5QkFBeUI7UUFDM0IsT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBZSxJQUFJLENBQUMsU0FBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRCxhQUFhLENBQUMsaUJBQTBCO1FBRXRDLElBQUksaUJBQWlCLEVBQUU7WUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDbkIsT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO2FBQ0k7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbkIsT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOztBQXhoQ00saUJBQVcsR0FBWSxLQUFLLENBQUM7QUFFckIsVUFBSSxHQUFhLElBQUksQ0FBQztBQUN0QixVQUFJLEdBQWEsSUFBSSxDQUFDO0FBaUN0Qix5QkFBbUIsR0FBK0IsSUFBSSxJQUFJLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBwbGljYXRpb25FeGNlcHRpb24sIERlYnVnLCBMaXN0LCBOTnVtYmVyLCBOU3RyaW5nLCBSZWZQYXJhbX0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7XHJcbiAgQ29uc3RhbnRzLFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBNc2dJbnRlcmZhY2UsXHJcbiAgUElDSW50ZXJmYWNlLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBVdGlsU3RyQnl0ZU1vZGUsXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7XHJcbiAgQmxvYlR5cGUsXHJcbiAgRGlzcGxheUNvbnZlcnRvcixcclxuICBFeHBWYWwsXHJcbiAgRmllbGREZWYsXHJcbiAgTWdDb250cm9sQmFzZSxcclxuICBOVU1fVFlQRSxcclxuICBQSUMsXHJcbiAgVmVjdG9yVHlwZVxyXG59IGZyb20gXCJAbWFnaWMteHBhL2d1aVwiO1xyXG5cclxuaW1wb3J0IHtZZXNOb0V4cH0gZnJvbSBcIi4uL2V4cC9ZZXNOb0V4cFwiO1xyXG5pbXBvcnQge0V4cHJlc3Npb259IGZyb20gXCIuLi9leHAvRXhwcmVzc2lvblwiO1xyXG5pbXBvcnQge0V4cHJlc3Npb25FdmFsdWF0b3J9IGZyb20gXCIuLi9leHAvRXhwcmVzc2lvbkV2YWx1YXRvclwiO1xyXG5pbXBvcnQge01nRm9ybX0gZnJvbSBcIi4uL2d1aS9NZ0Zvcm1cIjtcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gXCIuLi9ndWkvTWdDb250cm9sXCI7XHJcbmltcG9ydCB7UmVjb21wdXRlLCBSZWNvbXB1dGVfUmNtcEJ5fSBmcm9tIFwiLi4vcnQvUmVjb21wdXRlXCI7XHJcbmltcG9ydCB7Qm91bmRhcnl9IGZyb20gXCIuLi9ydC9Cb3VuZGFyeVwiO1xyXG5pbXBvcnQge0FyZ3VtZW50c0xpc3R9IGZyb20gXCIuLi9ydC9Bcmd1bWVudHNMaXN0XCI7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gXCIuLi9Db25zdEludGVyZmFjZVwiO1xyXG5pbXBvcnQge1Rhc2t9IGZyb20gXCIuLi90YXNrcy9UYXNrXCI7XHJcbmltcG9ydCB7UnVuVGltZUV2ZW50fSBmcm9tIFwiLi4vZXZlbnQvUnVuVGltZUV2ZW50XCI7XHJcbmltcG9ydCB7UmVjb3JkfSBmcm9tIFwiLi9SZWNvcmRcIjtcclxuaW1wb3J0IHtEYXRhVmlld30gZnJvbSBcIi4vRGF0YVZpZXdcIjtcclxuaW1wb3J0IHtpc051bGxPclVuZGVmaW5lZH0gZnJvbSBcInV0aWxcIjtcclxuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tIFwiLi4vZW52L0Vudmlyb25tZW50XCI7XHJcbmltcG9ydCB7IEZpZWxkQmFzZSB9IGZyb20gXCIuL0ZpZWxkQmFzZVwiO1xyXG5pbXBvcnQgeyBMYXN0Rm9jdXNlZE1hbmFnZXIgfSBmcm9tIFwiLi4vcnQvTGFzdEZvY3VzZWRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IExhbmd1YWdlRGF0YSB9IGZyb20gXCIuLi9lbnYvTGFuZ3VhZ2VEYXRhXCI7XHJcbmltcG9ydCB7IEFjY2Vzc0hlbHBlciB9IGZyb20gXCIuLi9BY2Nlc3NIZWxwZXJcIjtcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgZGF0YSBmb3IgPGZsZGggLi4uPlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgRmllbGQgZXh0ZW5kcyBGaWVsZEJhc2Uge1xyXG4gIHN0YXRpYyBMRUFWRV9GTEFHUzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyBOVU0wOiBOVU1fVFlQRSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgTlVNMTogTlVNX1RZUEUgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIF9saW5rRXhwOiBZZXNOb0V4cCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcmVjb21wdXRlOiBSZWNvbXB1dGUgPSBudWxsO1xyXG4gIENhY2hlVGFibGVGbGRJZHg6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfY2F1c2VUYWJsZUludmFsaWRhdGlvbjogYm9vbGVhbiA9IGZhbHNlOyAvLyBjaGFuZ2UgaW4gdGhpcyBmaWVsZCB3aWxsIGNhdXNlIGludmFsaWRhdGlvbiBvZiBhbGwgcm93cyBpbiB0YWJsZVxyXG4gIHByaXZhdGUgX2Zvcm06IE1nRm9ybSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaGFzQ2hhbmdlRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gaWYgVFJVRSwgdGhlcmUgaXMgYSBoYW5kbGVyIHRvIHJ1biB3aGVuIHRoaXMgZmllbGQgaXMgdXBkYXRlZFxyXG4gIHByaXZhdGUgX2hhc1pvb21IYW5kbGVyOiBib29sZWFuID0gZmFsc2U7IC8vIGlmIFRSVUUsIHRoZXJlIGlzIGEgem9vbSBoYW5kbGVyIGZvciB0aGlzIGZpZWxkXHJcbiAgcHJpdmF0ZSBfaW5FdmFsUHJvY2VzczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2luaXRFeHA6IEV4cHJlc3Npb24gPSBudWxsO1xyXG4gIHByaXZhdGUgX2ludmFsaWRWYWx1ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfaXNMaW5rRmxkOiBib29sZWFuID0gZmFsc2U7IC8vIGlmIFRSVUUsIGl0IG1lYW5zIHRoYXQgdGhlIGZpZWxkIGJlbG9uZ3MgdG8gYSBsaW5rXHJcbiAgcHJpdmF0ZSBfaXNWaXJ0dWFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZGF0YXZpZXdIZWFkZXJJZDogbnVtYmVyID0gLTE7ICAvLyBtZW1iZXJzIHJlbGF0ZWQgdG8gdGFibGUgY2FjaGVcclxuICBwcml2YXRlIF9saW5rQ3JlYXRlOiBib29sZWFuID0gZmFsc2U7IC8vIElmIHRydWUgdGhlbiBpdCdzIGEgcmVhbCBmaWVsZCB3aGljaCBiZWxvbmdzIHRvIGxpbmsgY3JlYXRlLlxyXG4gIExvY2F0ZTogQm91bmRhcnkgPSBudWxsO1xyXG4gIFJhbmdlOiBCb3VuZGFyeSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaXNQYXJhbTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzRXhwb3NlZFJvdXRlUGFyYW06IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0V4cG9zZWRUb0NsaWVudDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfcHJldklzTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3ByZXZWYWx1ZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF90YWJsZU5hbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaW5kZXhJblRhYmxlOiBudW1iZXIgPSAtMTtcclxuXHJcbiAgcHJpdmF0ZSBfdmlyQXNSZWFsOiBib29sZWFuID0gZmFsc2U7IC8vIElmIHRydWUgdGhlbiBhIHZpcnR1YWwgZmllbGQgaXMgY29tcHV0ZWQgYXMgcmVhbCAobmVlZGVkIGZvciBsaW5rIHJldCB2YWx1ZSlcclxuICBwcm90ZWN0ZWQgX3ZhbDogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIG1vZGlmaWVkQXRMZWFzdE9uY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc051bGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9jbGVhclZlY3RvclR5cGU6IGJvb2xlYW4gPSB0cnVlOyAvLyBkbyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdmVjdG9yIG9iamVjdFxyXG4gIHByaXZhdGUgX3ZlY3RvclR5cGU6IFZlY3RvclR5cGUgPSBudWxsOyAvLyB0aGUgdmVjdG9yIHJlcHJlc2VudGF0aW9uXHJcblxyXG4gIHByaXZhdGUgc3RhdGljIF92YXJpYWJsZUNoYW5nZUV2dHM6IExpc3Q8RmllbGQgfCBSdW5UaW1lRXZlbnQ+ID0gbmV3IExpc3QoKTsgLy8gZm9yIFZhcmlhYmxlIENoYW5nZSBldmVudCBleGVjdXRpb24sIHByZXZpb3VzbHkgdXNlZCB2aWEgZ2V0UGVuZGluZ1ZhckNoYW5nZUV2ZW50c1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ1RPUlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRhdmlld1wiPmEgcmVmZXJlbmNlIHRvIHRoZSBkYXRhdmlldzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPmNvdW50ZXIgb2YgdGhlIGZpZWxkIGluIEZpZWxkVGFibGU8L3BhcmFtPlxyXG4gIGNvbnN0cnVjdG9yKGRhdGF2aWV3OiBEYXRhVmlldywgaWQ6IG51bWJlcikge1xyXG4gICAgc3VwZXIoaWQpO1xyXG4gICAgaWYgKEZpZWxkLk5VTTAgPT09IG51bGwpIHtcclxuICAgICAgRmllbGQuTlVNMCA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgICBGaWVsZC5OVU0xID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICAgIEZpZWxkLk5VTTAuTlVNXzRfTE9ORygwKTtcclxuICAgICAgRmllbGQuTlVNMS5OVU1fNF9MT05HKDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2RhdGF2aWV3ID0gZGF0YXZpZXc7XHJcbiAgICB0aGlzLl9saW5rRXhwID0gbmV3IFllc05vRXhwKGZhbHNlKTtcclxuICAgIEZpZWxkRGVmLl9kZWZhdWx0X2RhdGUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmRpc3AybWcoUElDSW50ZXJmYWNlLkRFRkFVTFRfREFURSxcclxuICAgICAgbmV3IFBJQyhcIjZcIiwgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDLCBzdXBlci5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKSxcclxuICAgICAgc3VwZXIuZ2V0VGFzaygpLmdldENvbXBJZHgoKSxcclxuICAgICAgQmxvYlR5cGUuQ09OVEVOVF9UWVBFX1VOS05PV04pO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldCBWaXJBc1JlYWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmlyQXNSZWFsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IElzVmlydHVhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1ZpcnR1YWw7XHJcbiAgfVxyXG5cclxuICBnZXQgSXNFeHBvc2VkUm91dGVQYXJhbSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0V4cG9zZWRSb3V0ZVBhcmFtO1xyXG4gIH1cclxuXHJcbiAgZ2V0IElzRXhwb3NlZFRvQ2xpZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzRXhwb3NlZFRvQ2xpZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbmRleCBpbiB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0IEluZGV4SW5UYWJsZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luZGV4SW5UYWJsZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGZpZWxkIGF0dHJpYnV0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJvdGVjdGVkIHNldEF0dHJpYnV0ZShhdHRyaWJ1dGU6IHN0cmluZywgdmFsdWVTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVGFnUHJvY2Vzc2VkOiBib29sZWFuID0gc3VwZXIuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWVTdHIpO1xyXG4gICAgaWYgKCFpc1RhZ1Byb2Nlc3NlZCkge1xyXG4gICAgICBsZXQgZGF0YTogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKHZhbHVlU3RyLCBcIixcIik7XHJcbiAgICAgIGlzVGFnUHJvY2Vzc2VkID0gdHJ1ZTtcclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVklSVFVBTDpcclxuICAgICAgICAgIHRoaXMuX2lzVmlydHVhbCA9IChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSAhPT0gMCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUEFSQU06XHJcbiAgICAgICAgICB0aGlzLl9pc1BhcmFtID0gKFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpICE9PSAwKTtcclxuICAgICAgICAgIGlmICghdGhpcy5faXNWaXJ0dWFsICYmIHRoaXMuX2lzUGFyYW0pXHJcbiAgICAgICAgICAvLyBwb3NzaWJsZSBlcnJvciAtIHdlIHJlbHkgb24gdGhlIG9yZGVyIG9mIFhNTCBhdHRyaWJ1dGVzXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcclxuICAgICAgICAgICAgICBcImluIEZpZWxkLmluaXRFbGVtZW50cygpOiBub24gdmlydHVhbCBmaWVsZCBpcyBkZWZpbmVkIGFzIGEgcGFyYW1ldGVyXCIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0VYUE9TRURfUk9VVEVfUEFSQU1TOlxyXG4gICAgICAgICAgdGhpcy5faXNFeHBvc2VkUm91dGVQYXJhbSA9IChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSAhPT0gMCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX2lzUGFyYW0gJiYgdGhpcy5faXNFeHBvc2VkUm91dGVQYXJhbSlcclxuICAgICAgICAgIC8vIHBvc3NpYmxlIGVycm9yIC0gd2UgcmVseSBvbiB0aGUgb3JkZXIgb2YgWE1MIGF0dHJpYnV0ZXNcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFxyXG4gICAgICAgICAgICAgIFwiaW4gRmllbGQuaW5pdEVsZW1lbnRzKCk6IG5vbiBwYXJhbWV0ZXIgZmllbGQgaXMgZGVmaW5lZCBhcyBhIGV4cG9zZWQgcm91dGUgcGFyYW1ldGVyXCIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0VYUE9TRURfVE9fQ0xJRU5UOlxyXG4gICAgICAgICAgLy8gVGhlIGZsYWcgd2FzIHNlcmlhbGl6ZWQgb25seSBmb3Igc2VydmVyIHZhcmlhYmxlIChleHBvc2UgdG8gY2xpZW50ID0gMCApXHJcbiAgICAgICAgICBpZiAoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikgPT0gMClcclxuICAgICAgICAgICAgdGhpcy5faXNFeHBvc2VkVG9DbGllbnQgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9WSVJfQVNfUkVBTDpcclxuICAgICAgICAgIHRoaXMuX3ZpckFzUmVhbCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9MTktfQ1JFQVRFOlxyXG4gICAgICAgICAgdGhpcy5fbGlua0NyZWF0ZSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9MTktFWFA6XHJcbiAgICAgICAgICB0aGlzLl9saW5rRXhwLnNldFZhbCg8VGFzaz4odGhpcy5nZXRUYXNrKCkpLCB2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVEFCTEVfTkFNRTpcclxuICAgICAgICAgIHRoaXMuX3RhYmxlTmFtZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5ERVhfSU5fVEFCTEU6XHJcbiAgICAgICAgICB0aGlzLl9pbmRleEluVGFibGUgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTklUOlxyXG4gICAgICAgICAgbGV0IGV4cE51bTogbnVtYmVyID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICB0aGlzLl9pbml0RXhwID0gKDxUYXNrPnRoaXMuZ2V0VGFzaygpKS5nZXRFeHBCeUlkKGV4cE51bSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX05BTUU6IHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NIQUNIRURfRkxEX0lEOlxyXG4gICAgICAgICAgLy8gTUdfQVRUUl9DSEFDSEVEX0ZMRCBpcyBpbiB0aGUgZm9ybWF0IG9mIGNhY2hlZFRhYmxlSWQsZmxkXHJcbiAgICAgICAgICB0aGlzLkNhY2hlVGFibGVGbGRJZHggPSBOTnVtYmVyLlBhcnNlKGRhdGFbMV0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0xPQ0FURTpcclxuICAgICAgICAgIC8vIGxvY2F0ZSBpcyBpbiB0aGUgZm9ybWF0IG9mIG1heCxtaW4gZXhwcmVzc2lvbiBudW0gKC0xIGlmIG5vbiBleGlzdHMpXHJcbiAgICAgICAgICB0aGlzLkxvY2F0ZSA9IG5ldyBCb3VuZGFyeSg8VGFzaz50aGlzLmdldFRhc2soKSwgTk51bWJlci5QYXJzZShkYXRhWzFdKSwgTk51bWJlci5QYXJzZShkYXRhWzBdKSwgdGhpcy5nZXRUeXBlKCksIHRoaXMuZ2V0U2l6ZSgpLCB0aGlzLkNhY2hlVGFibGVGbGRJZHgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1JBTkdFOlxyXG4gICAgICAgICAgLy8gcmFuZ2UgaXMgaW4gdGhlIGZvcm1hdCBvZiBtYXgsbWluIGV4cHJlc3Npb24gbnVtICgtMSBpZiBub24gZXhpc3RzKVxyXG4gICAgICAgICAgdGhpcy5SYW5nZSA9IG5ldyBCb3VuZGFyeSg8VGFzaz50aGlzLmdldFRhc2soKSwgTk51bWJlci5QYXJzZShkYXRhWzFdKSwgTk51bWJlci5QYXJzZShkYXRhWzBdKSwgdGhpcy5nZXRUeXBlKCksIHRoaXMuZ2V0U2l6ZSgpLCB0aGlzLkNhY2hlVGFibGVGbGRJZHgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0xJTks6XHJcbiAgICAgICAgICB0aGlzLl9kYXRhdmlld0hlYWRlcklkID0gTk51bWJlci5QYXJzZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSVNfTElOS19GSUVMRDpcclxuICAgICAgICAgIHRoaXMuX2lzTGlua0ZsZCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpc1RhZ1Byb2Nlc3NlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiVW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJ3swfSdcIiwgYXR0cmlidXRlKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzVGFnUHJvY2Vzc2VkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBhIHJlZmVyZW5jZSB0byB0aGUgUmVjb21wdXRlIE9iamVjdCBvZiB0aGlzIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY29tcFJlZlwiPnJlZmVyZW5jZSB0byBSZWNvbXB1dGUgT2JqZWN0PC9wYXJhbT5cclxuICBzZXRSZWNvbXB1dGUocmVjb21wUmVmOiBSZWNvbXB1dGUpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlY29tcHV0ZSA9IHJlY29tcFJlZjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVtb3ZlcyB0aGUgc3BlY2lmaWMgc3ViZm9ybSB0YXNrIGZyb20gdGhlIHJlY29tcHV0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybVRhc2tcIj48L3BhcmFtPlxyXG4gIFJlbW92ZVN1YmZvcm1Gcm9tUmVjb21wdXRlKHN1YmZvcm1UYXNrOiBUYXNrKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcmVjb21wdXRlICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3JlY29tcHV0ZS5SZW1vdmVTdWJmb3JtKHN1YmZvcm1UYXNrKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW5zZXJ0IHRoZSBzcGVjaWZpYyBzdWJmb3JtIHRhc2sgaW50byB0aGUgZmllbGQgcmVjb21wdXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtVGFza1wiPjwvcGFyYW0+XHJcbiAgQWRkU3ViZm9ybVJlY29tcHV0ZShzdWJmb3JtVGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3JlY29tcHV0ZSA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9yZWNvbXB1dGUgPSBuZXcgUmVjb21wdXRlKCk7XHJcbiAgICAgIHRoaXMuX3JlY29tcHV0ZS5UYXNrID0gPFRhc2s+c3VwZXIuZ2V0VGFzaygpO1xyXG4gICAgICB0aGlzLl9yZWNvbXB1dGUuT3duZXJGbGQgPSB0aGlzO1xyXG4gICAgICB0aGlzLl9yZWNvbXB1dGUuUmNtcE1vZGUgPSBSZWNvbXB1dGVfUmNtcEJ5LkNMSUVOVDtcclxuICAgIH1cclxuICAgIHRoaXMuX3JlY29tcHV0ZS5BZGRTdWJmb3JtKHN1YmZvcm1UYXNrKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGEgcmVmZXJlbmNlIHRvIGEgY29udHJvbCBhdHRhY2hlZCB0byB0aGlzIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj50aGUgY29udHJvbCB3aGljaCBpcyBhdHRhY2hlZCB0byB0aGlzIGZpZWxkPC9wYXJhbT5cclxuICBTZXRDb250cm9sKGN0cmw6IE1nQ29udHJvbEJhc2UpOiB2b2lkIHtcclxuICAgIHN1cGVyLlNldENvbnRyb2woY3RybCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzVmlydHVhbCAmJiBjdHJsLklzUmVwZWF0YWJsZSAmJiB0aGlzLl9pbml0RXhwID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2NhdXNlVGFibGVJbnZhbGlkYXRpb24gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXB1dGUgdGhlIGZpZWxkIGluaXQgZXhwcmVzc2lvbiBvciBnZXQgaXRzIHZhbHVlIGZyb20gdGhlIGRhdGF2aWV3LCBzZXRcclxuICAvLy8gICB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIChhbmQgdXBkYXRlIHRoZSBkaXNwbGF5KVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNvbXB1dGVcIj50ZWxscyB0aGUgY29tcHV0ZSB0byBzdGFydCB0aGUgcmVjb21wdXRlIGNoYWluIGFuZCByZWNvbXB1dGVcclxuICAvLy8gICB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGZpZWxkIChpZiBpdCBpcyByZWFsKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHB1YmxpYyBhc3luYyBjb21wdXRlKHJlY29tcHV0ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJlc3VsdDogUmVmUGFyYW08c3RyaW5nPiA9IG5ldyBSZWZQYXJhbSh0aGlzLmdldFZhbHVlKGZhbHNlKSk7XHJcbiAgICBsZXQgaXNOdWxsRmxkOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbSh0aGlzLl9pc051bGwpO1xyXG4gICAgbGV0IHJlYyA9ICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgIGxldCB0YXNrID0gPFRhc2s+c3VwZXIuZ2V0VGFzaygpO1xyXG5cclxuICAgIGxldCB6ZXJvUmVhbDogYm9vbGVhbiA9IHRoaXMuX2xpbmtDcmVhdGUgJiYgcmVjLkluQ29tcHV0ZSAmJiAhcmVjb21wdXRlICYmIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURTtcclxuICAgIC8vIFFDUiAjOTk5MDI0IC0gemVybyBsbmsgY3JlYXRlIHZhbHVlcyBkdXJpbmcgY29tcHV0ZVxyXG5cclxuICAgIGlmICh0aGlzLl9mb3JtID09IG51bGwpXHJcbiAgICAgIHRoaXMuX2Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG5cclxuICAgIC8vIG5vIG5lZWQgdG8gemVybyByZWFscyBpZiB3ZSBhcmUgcmVjb3ZlcmluZyBhIHJlY29yZC5cclxuICAgIGlmICgodGhpcy5fZm9ybSAhPSBudWxsICYmIHRoaXMuX2Zvcm0uSW5SZXN0b3JlKSB8fCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICB6ZXJvUmVhbCA9IGZhbHNlO1xyXG5cclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TGFzdFJ0RXZlbnQoKTtcclxuICAgIGxldCBjb21wdXRlT25DYW5jZWxFdmVudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHJ0RXZ0ICE9IG51bGwpXHJcbiAgICAgIGNvbXB1dGVPbkNhbmNlbEV2ZW50ID0gcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUw7XHJcblxyXG4gICAgLy8gdmlydHVhbCBhcyByZWFsIGlzIGVzcGVjaWFsbHkgZm9yIGZpZWxkcyB3aGljaCBhcmUgdXNlZCBhcyBhIFwicmV0dXJuIHZhbHVlXCJcclxuICAgIC8vIG9mIGEgbGluay4gVGhlaXIgdmFsdWUgaXMgcmV0dXJuZWQgYnkgdGhlIGxpbmsgcmVzdWx0IGFuZCBub3QgYnkgdGhlIGluaXQgZXhwcmVzc2lvbi5cclxuICAgIC8vIHdoZW4gdGhlIGZvcm0gaXMgcmVzdG9yaW5nIHRoZSBjdXJyIHJvdyB3ZSBzaG91bGRuJ3QgY29tcHV0ZSB0aGUgaW5pdCBleHByZXNzaW9uXHJcbiAgICAvLyBidXQgdG8gdXNlIHRoZSB2YWx1ZSBmcm9tIHRoZSByZWNvcmQgKGJ5IGdldFZhbHVlKVxyXG4gICAgLy8gUUNSIzkyNjc1ODogV2hlbiBUYXNrJ3MgbW9kZSBpcyBDcmVhdGUsIGluaXQgZm9yIHJlYWwgZmllbGQgc2hvdWxkIGJlIGV2YWx1YXRlZCBvbmx5IHdoZW4gaXQgY29tZXMgZm9yIGNhbmNlbCBldmVudChsYXN0IHJ1bnRpbWUgZXZlbnQgaXMgY2FuY2VsIGV2ZW50KS5cclxuICAgIC8vIFdoaWxlIGNyZWF0aW5nIGEgbmV3IHJlY29yZCwgaW5pdCB3aWxsIGJlIGV2YWx1YXRlZCBiZWNhdXNlIG9mIGNvbmRpdGlvbiByZWMuaXNOZXdSZWMoKS4gKEl0IGlzIHRoZSByZWZpeCBvZiBRQ1IjOTk0MDcyKVxyXG4gICAgaWYgKCF0aGlzLl92aXJBc1JlYWwgJiYgKHRoaXMuX2Zvcm0gPT0gbnVsbCB8fCAhdGhpcy5fZm9ybS5JblJlc3RvcmUpICYmXHJcbiAgICAgICgodGhpcy5faXNWaXJ0dWFsIHx8ICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgY29tcHV0ZU9uQ2FuY2VsRXZlbnQpKSB8fCByZWNvbXB1dGUgfHxcclxuICAgICAgICB6ZXJvUmVhbCB8fCByZWMuaXNOZXdSZWMoKSAmJiAhcmVjLmlzQ29tcHV0ZWQoKSkpIHtcclxuICAgICAgaWYgKCF0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpIHx8ICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpICYmICF0aGlzLlBhcnRPZkRhdGF2aWV3KSkge1xyXG4gICAgICAgIC8vIFFDUiAjNzc1NTA4OiBmb3IgZGF0YXZpZXdzLCB3aGljaCBhcmUgY29tcHV0ZWQgYnkgdGhlIHNlcnZlciwgcHJldmVudFxyXG4gICAgICAgIC8vIGNvbXB1dGluZyB0aGUgaW5pdCBleHByZXNzaW9uIHdoaWxlIGluIGNvbXB1dGUgb2YgdGhlIHJlY29yZCBiZWNhdXNlIHRoZVxyXG4gICAgICAgIC8vIHNlcnZlciBoYXZlIGFscmVhZHkgZG9uZSBpdFxyXG4gICAgICAgIGlmICgodGhpcy5faXNWaXJ0dWFsIHx8IHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkgfHwgKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuY29tcHV0ZUJ5Q2xpZW50KCkgfHxcclxuICAgICAgICAgICFyZWMuSW5Db21wdXRlIHx8IHplcm9SZWFsIHx8IHJlYy5sYXRlQ29tcHV0ZSgpKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5faW5pdEV4cCAhPSBudWxsKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5FdmFsdWF0ZUluaXRFeHByZXNzaW9uKHJlc3VsdCwgaXNOdWxsRmxkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKHplcm9SZWFsKVxyXG4gICAgICAgICAgICByZXN1bHQudmFsdWUgPSB0aGlzLmdldERlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2ludmFsaWRWYWx1ZSkge1xyXG4gICAgICB0aGlzLl9wcmV2VmFsdWUgPSByZXN1bHQudmFsdWU7XHJcbiAgICAgIHRoaXMuX3ByZXZJc051bGwgPSBpc051bGxGbGQudmFsdWU7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnNldFZhbHVlKHJlc3VsdC52YWx1ZSwgaXNOdWxsRmxkLnZhbHVlLCByZWNvbXB1dGUsIGZhbHNlLCByZWNvbXB1dGUgJiYgIXRoaXMuX2lzVmlydHVhbCwgZmFsc2UsIGZhbHNlKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGV2YWx1YXRlIGluaXQgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzdWx0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxGbGRcIj48L3BhcmFtPlxyXG4gIGFzeW5jIEV2YWx1YXRlSW5pdEV4cHJlc3Npb24ocmVzdWx0OiBSZWZQYXJhbTxzdHJpbmc+LCBpc051bGxGbGQ6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5faW5pdEV4cCAhPT0gbnVsbCk7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLl9pbkV2YWxQcm9jZXNzID0gdHJ1ZTtcclxuICAgICAgcmVzdWx0LnZhbHVlID0gYXdhaXQgdGhpcy5faW5pdEV4cC5ldmFsdWF0ZVdpdGhSZXN1bHRUeXBlQW5kTGVuZ3RoKHRoaXMuX3R5cGUsIHRoaXMuX3NpemUpO1xyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2luRXZhbFByb2Nlc3MgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpc051bGxGbGQudmFsdWUgPSAocmVzdWx0LnZhbHVlID09PSBudWxsKTtcclxuICAgIGlmIChpc051bGxGbGQudmFsdWUgJiYgdGhpcy5OdWxsQWxsb3dlZCkge1xyXG4gICAgICByZXN1bHQudmFsdWUgPSB0aGlzLmdldFZhbHVlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLy8vXHJcbiAgLy8vLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLy8vIDxwYXJhbSBuYW1lPVwicmVjb21wdXRlXCI+PC9wYXJhbT5cclxuICAvLy8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgLy8gYm9vbCBTaG91bGRSZWNvbXB1dGUoYm9vbCByZWNvbXB1dGUpXHJcbiAgLy8ge1xyXG4gIC8vICAgaWYgKHJlY29tcHV0ZSlcclxuICAvLyAgIHtcclxuICAvLyAgICAgIGJvb2wgY29tcHV0ZWRCeUZldGNoID0gIUlzVmlydHVhbCB8fCBWaXJBc1JlYWw7XHJcbiAgLy8gICAgICBpZiAoY29tcHV0ZWRCeUZldGNoKVxyXG4gIC8vICAgICAge1xyXG4gIC8vICAgICAgICAgVGFzayB0YXNrID0gKFRhc2spZ2V0VGFzaygpO1xyXG4gIC8vICAgICAgICAgRGF0YXZpZXdIZWFkZXJCYXNlIGhlYWRlciA9IHRhc2suZ2V0RGF0YXZpZXdIZWFkZXJzKCkuZ2V0RGF0YXZpZXdIZWFkZXJCeUlkKF9kYXRhdmlld0hlYWRlcklkKTtcclxuICAvLyAgICAgICAgIC8vbG9jYWwgZGF0YXZhc2UgYWxyZWFkeSBjb21wdXRlZCB0aGUgcmVjb3JkIGFzIHNlcnZlciBkb2VzXHJcbiAgLy8gICAgICAgICBpZiAoaGVhZGVyIGlzIExvY2FsRGF0YXZpZXdIZWFkZXIpXHJcbiAgLy8gICAgICAgICB7XHJcbiAgLy8gICAgICAgICAgICAgdmFyIHJlYyA9ICgoRGF0YVZpZXcpX2RhdGF2aWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgLy8gICAgICAgICAgICAgcmV0dXJuICFyZWMuSW5Db21wdXRlO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIHJlY29tcHV0ZTtcclxuICAvLyB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaGVja051bGxBcml0aG1ldGljXCI+aWYgdHJ1ZSB0aGVuIHRoZSBudWxsIGFyaXRobWV0aWMgZW52aXJvbm1lbnRcclxuICAvLy8gICBzZXR0aW5nIGlzIHVzZWQgdG8gcmV0dXJuIG51bGwgd2hlbiBcIm51bGxpZnlcIiBjb21wdXRhdGlvbiBpcyBuZWVkZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICBnZXRWYWx1ZShjaGVja051bGxBcml0aG1ldGljOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIC8vIGlmIHdlIG5lZWQgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgZmllbGRcclxuICAgIGlmICgoPFRhc2s+c3VwZXIuZ2V0VGFzaygpKS5nZXRFdmFsT2xkVmFsdWVzKCkpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldE9yaWdpbmFsVmFsdWUoKTtcclxuICAgIGlmICh0aGlzLl9pbnZhbGlkVmFsdWUpXHJcbiAgICAgIHRoaXMudGFrZVZhbEZyb21SZWMoKTtcclxuICAgIGlmICh0aGlzLl9pc051bGwpXHJcbiAgICAgIHRoaXMuX3ZhbCA9IHRoaXMuZ2V0VmFsdWVGb3JOdWxsKGNoZWNrTnVsbEFyaXRobWV0aWMpO1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaXNDaGFuZ2VkKG5ld1ZhbHVlOiBzdHJpbmcsIGlzTnVsbDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXZWYWx1ZSAhPT0gbnVsbCAmJiAoISh0aGlzLl9wcmV2VmFsdWUgPT09IG5ld1ZhbHVlKSB8fCB0aGlzLl9wcmV2SXNOdWxsICE9PSBpc051bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGJ5IHRha2luZyBpdCBmcm9tIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgdGFrZVZhbEZyb21SZWMoKTogdm9pZCB7XHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICBpZiAocmVjICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3ZhbCA9IHJlYy5HZXRGaWVsZFZhbHVlKHRoaXMuX2lkKTtcclxuICAgICAgdGhpcy5faXNOdWxsID0gcmVjLklzTnVsbCh0aGlzLl9pZCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5faW52YWxpZFZhbHVlKSB7XHJcbiAgICAgIGlmIChyZWMgIT09IG51bGwgJiYgdGhpcy5fY2F1c2VUYWJsZUludmFsaWRhdGlvbiAmJiB0aGlzLmlzQ2hhbmdlZCh0aGlzLl92YWwsIHRoaXMuX2lzTnVsbCkgJiYgdGhpcy5fZm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgIHJlYy5zZXRDYXVzZUludmFsaWRhdGlvbih0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWUgPSB0aGlzLl92YWw7XHJcbiAgICAgIHRoaXMuX3ByZXZJc051bGwgPSB0aGlzLl9pc051bGw7XHJcbiAgICAgIHRoaXMuX2ludmFsaWRWYWx1ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gWkVSTyBUSEUgVkVDVE9SIE9CSkVDVFxyXG4gICAgdGhpcy5fdmVjdG9yVHlwZSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgZmllbGQgd2l0aG91dCB1cGRhdGluZyB0aGUgZmllbGQgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE9yaWdpbmFsVmFsdWUoKTogc3RyaW5nIHtcclxuICAgIGxldCBvcmlnaW5hbFJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0T3JpZ2luYWxSZWMoKTtcclxuXHJcbiAgICBpZiAob3JpZ2luYWxSZWMuSXNOdWxsKHRoaXMuX2lkKSlcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuXHJcbiAgICByZXR1cm4gb3JpZ2luYWxSZWMuR2V0RmllbGRWYWx1ZSh0aGlzLl9pZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaXMgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGZpZWxkIHdhcyBudWxsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc09yaWdpbmFsVmFsdWVOdWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IG9yaWdpbmFsUmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRPcmlnaW5hbFJlYygpO1xyXG4gICAgcmV0dXJuIG9yaWdpbmFsUmVjLklzTnVsbCh0aGlzLl9pZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHZhbHVlIGJ5IHJlYyBpZHhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+cmVjb3JkIGlkeDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRWYWx1ZUJ5UmVjSWR4KGlkeDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCByZWM6IFJlY29yZCA9ICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldFJlY0J5SWR4KGlkeCk7XHJcbiAgICBsZXQgZmllbGRWYWx1ZTogc3RyaW5nID0gcmVjLkdldEZpZWxkVmFsdWUodGhpcy5faWQpO1xyXG4gICAgcmV0dXJuIHJlYy5Jc051bGwodGhpcy5faWQpID8gdGhpcy5nZXRWYWx1ZUZvck51bGwoZmFsc2UpIDogZmllbGRWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgbW9kaWZpZWRBdExlYXN0T25jZSBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldE1vZGlmaWVkQXRMZWFzdE9uY2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RpZmllZEF0TGVhc3RPbmNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBudWxsIGlmIHZhbHVlIG9mIGZpZWxkIGZvciB0aGUgcmVjb3JkIGlzIG51bGxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+cmVjb3JkIGlkeDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc051bGxCeVJlY0lkeChpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0UmVjQnlJZHgoaWR4KTtcclxuICAgIHJldHVybiByZWMuSXNOdWxsKHRoaXMuX2lkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgZmllbGQncyB2YWx1ZSBmb3IgcmVjb3JkIGlkeCByZWNpZHggZXF1YWxzIHRvIG1nVmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1nVmFsdWVcIj52YWx1ZSB0byBjb21wYXJlICA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbEZsZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZVwiPnR5cGUgb2YgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY0lkeFwiPnJlY0lkeCBvZiB0aGUgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzRXF1YWwobWdWYWx1ZTogc3RyaW5nLCBpc051bGxGbGQ6IGJvb2xlYW4sIHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIHJlY0lkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVjID0gPFJlY29yZD4oKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0UmVjQnlJZHgocmVjSWR4KSk7XHJcbiAgICBsZXQgdmFsc0VxdWFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAocmVjICE9IG51bGwpIHtcclxuICAgICAgbGV0IGZpZWxkVmFsdWU6IHN0cmluZyA9IHJlYy5HZXRGaWVsZFZhbHVlKHRoaXMuX2lkKTtcclxuICAgICAgbGV0IGZpZWxzSXNOdWxsOiBib29sZWFuID0gcmVjLklzTnVsbCh0aGlzLl9pZCk7XHJcbiAgICAgIHZhbHNFcXVhbCA9IEV4cHJlc3Npb25FdmFsdWF0b3IubWdWYWxzRXF1YWwoZmllbGRWYWx1ZSwgZmllbHNJc051bGwsIHRoaXMuX3R5cGUsIG1nVmFsdWUsIGlzTnVsbEZsZCwgdHlwZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsc0VxdWFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgd2hpY2ggc2hvdWxkIGJlIGluc2VydGVkIGludG8gYSBuZXcgcmVjLCB3aGVuIGl0XHJcbiAgLy8vICAgaXMgY3JlYXRlZC4gVGhpcyB3aWxsIHVzdWFsbHkgYmUgdGhlIGZpZWxkJ3MgZGVmYXVsdCB2YWx1ZSwgdW5sZXNzIHRoZXJlIGlzIGFcclxuICAvLy8gICB2aXJ0dWFsIGZpZWxkIHdpdGhvdXQgYW4gaW5pdCBleHByZXNzaW9uLiBJbiB0aGlzIGNhc2UsIHRoZSBjdXJyZW50IHZhbHVlIHdpbGwgYmVcclxuICAvLy8gICByZXR1cm5lZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNsb2JiZXJlZE9ubHlcIj5jbG9iYmVyZWRPbmx5IGlzIHRydWUgaWYgd2Ugd2FudCB0byBvbmx5IHRha2UgdGhlIHZhbHVlcyBvZiB0aGUgdmlydHVhbHMgd2l0aCBubyBpbml0IGV4cHJlc3Npb248L3BhcmFtPlxyXG4gIGdldE5ld1JlY1ZhbHVlKGNsb2JiZXJlZE9ubHk6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX2lzVmlydHVhbCAmJiB0aGlzLl9pbml0RXhwID09IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLl92YWw7XHJcbiAgICByZXR1cm4gIWNsb2JiZXJlZE9ubHkgPyB0aGlzLmdldERlZmF1bHRWYWx1ZSgpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNldFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUodmFsOiBzdHJpbmcsIGlzTnVsbEZsZDogYm9vbGVhbiwgcmVjb21wdXRlOiBib29sZWFuLCBzZXRSZWNvcmRVcGRhdGVkOiBib29sZWFuLCBpc0FyZ1VwZGF0ZTogYm9vbGVhbiwgZW5mb3JjZVZhcmlhYmxlQ2hhbmdlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGVuZm9yY2VWYXJpYWJsZUNoYW5nZSkpXHJcbiAgICAgIGVuZm9yY2VWYXJpYWJsZUNoYW5nZSA9IGZhbHNlO1xyXG4gICAgYXdhaXQgdGhpcy5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlXzEodmFsLCBpc051bGxGbGQsIHJlY29tcHV0ZSwgc2V0UmVjb3JkVXBkYXRlZCwgaXNBcmdVcGRhdGUsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxsIHRoZSBzZXQgdmFsdWUgZnVuY3Rpb24gZnJvbSB0aGUgXCJvdXRlclwiIHdvcmxkLiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgcmVjb21wdXRlXHJcbiAgLy8vICAgY2hhaW4uIFdoZW4gcmVjb21wdXRlIGlzIGRvbmUgLSByZWZyZXNoIGNvbnRyb2xzIHdoaWNoIGFyZSBleHByZXNzaW9uIGRlcGVuZGVudC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbFwiPnRoZSBuZXcgdmFsdWUgb2YgdGhlIGZpZWxkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxGbGRcIj5pZiB0cnVlIHRoZW4gdGhlIHZhbHVlIGlzIG51bGw8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY29tcHV0ZVwiPnN0YXRlcyB3aGV0aGVyIHRvIGV4ZWN1dGUgcmVjb21wdXRlIHdoZW4gc2V0dGluZyB0aGUgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY29tcHV0ZU9ubHlXaGVuVXBkYXRlVmFsdWVcIj46IGRvIHRoZSByZWNvbXB1dGUgb25seSB3aGVuIHRoZSB2YWx1ZSB3YXMgdXBkYXRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXRSZWNvcmRVcGRhdGVkXCI+dGVsbHMgd2hldGhlciB0byBkZWZpbmUgdGhlIHJlY29yZCBhcyB1cGRhdGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc0FyZ1VwZGF0ZVwiPnRydWUgaWYgY2FsbGVkIGZvciBoYW5kbGVyIGFyZ3VtZW50LXBhcmFtZXRlciBjb3B5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbmZvcmNlVmFyaWFibGVDaGFuZ2VcIj5leGVjdXRlIHZhaWFibGUgY2hhbmdlIGV2ZW4gd2hlbiByZWNvbXB1dGUgaXMgZmFsc2U8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZV8xKHZhbDogc3RyaW5nLCBpc051bGxGbGQ6IGJvb2xlYW4sIHJlY29tcHV0ZTogYm9vbGVhbiwgc2V0UmVjb3JkVXBkYXRlZDogYm9vbGVhbiwgaXNBcmdVcGRhdGU6IGJvb2xlYW4sIGVuZm9yY2VWYXJpYWJsZUNoYW5nZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2sgPSA8VGFzaz50aGlzLmdldFRhc2soKTtcclxuICAgIGlmICh0YXNrICE9IG51bGwpXHJcbiAgICAgIHRhc2suVmV3Rmlyc3QrKztcclxuXHJcbiAgICBsZXQgdmFsdWVXYXNVcGRhdGVkOiBib29sZWFuID0gYXdhaXQgdGhpcy5zZXRWYWx1ZSh2YWwsIGlzTnVsbEZsZCwgcmVjb21wdXRlLCBzZXRSZWNvcmRVcGRhdGVkLCAhdGhpcy5faXNWaXJ0dWFsLCBpc0FyZ1VwZGF0ZSwgZW5mb3JjZVZhcmlhYmxlQ2hhbmdlKTtcclxuXHJcbiAgICAvLyBBIGZpZWxkIHRoYXQgaXMgYW4gZXZlbnQgaGFuZGxlciBmaWVsZCBjYW5ub3QgYXBwZWFyIGFzIGEgcHJvcGVydHkgaW4gZ3VpLiBubyBuZWVkIHRvIHJlZnJlc2ggYWxsXHJcbiAgICAvLyBmb3JtK2NvbnRyb2xzIHByb3BlcnRpZXMgZXhwcmVzc2lvbnMgZm9yIGl0LlxyXG4gICAgaWYgKHRhc2sgIT09IG51bGwgJiYgdGFzay5WZXdGaXJzdCA9PT0gMSAmJiB0aGlzLl9mb3JtICE9PSBudWxsICYmICF0aGlzLklzRXZlbnRIYW5kbGVyRmllbGQpIHtcclxuICAgICAgaWYgKHJlY29tcHV0ZSAmJiB2YWx1ZVdhc1VwZGF0ZWQpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fZm9ybS5yZWZyZXNoT25FeHByZXNzaW9ucygpO1xyXG5cclxuICAgIH1cclxuICAgIGlmICh0YXNrICE9IG51bGwpXHJcbiAgICAgIHRhc2suVmV3Rmlyc3QtLTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgY3VycmVudCByZWNvcmQgYW5kIHVwZGF0ZSB0aGUgZGlzcGxheVxyXG4gIC8vLyAgIHRoZSBmaWVsZCBtdXN0IGJlIGluIGEgbWFnaWMgaW50ZXJuYWwgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXdWYWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmaWVsZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsRmxkXCI+aWYgdHJ1ZSB0aGVuIHRoZSB2YWx1ZSBpcyBudWxsPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNvbXB1dGVcIj5zdGF0ZXMgd2hldGhlciB0byBleGVjdXRlIHJlY29tcHV0ZSB3aGVuIHNldHRpbmcgdGhlIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXRSZWNvcmRNb2RpZmllZFwiPnN0YXRlcyB3aGV0aGVyIHRvIGRlZmluZSB0aGUgcmVjb3JkIGFzIG1vZGlmaWVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXRDcnNyTW9kaWZpZWRcIj5zdGF0ZXMgd2hldGhlciB0byBkZWZpbmUgdGhlIGN1cnNvciBvZiB0aGUgZmllbGQgYXMgbW9kaWZpZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzQXJnVXBkYXRlXCI+dHJ1ZSBpZiBjYWxsZWQgZm9yIGhhbmRsZXIgYXJndW1lbnQtcGFyYW1ldGVyIGNvcHk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50aGUgcmV0dXJuIHZhbHVlIHdhcyB1cGRhdGVkIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIHNldFZhbHVlKG5ld1ZhbDogc3RyaW5nLCBpc051bGxGbGQ6IGJvb2xlYW4sIHJlY29tcHV0ZTogYm9vbGVhbiwgc2V0UmVjb3JkTW9kaWZpZWQ6IGJvb2xlYW4sIHNldENyc3JNb2RpZmllZDogYm9vbGVhbiwgaXNBcmdVcGRhdGU6IGJvb2xlYW4sIGVuZm9yY2VWYWxpYWJsZUNoYW5nZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHJlYzogUmVjb3JkO1xyXG4gICAgbGV0IHJlY0ZsZFZhbDogc3RyaW5nO1xyXG4gICAgbGV0IHZhbHNFcXVhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHJlbWFpbmRlcjogbnVtYmVyO1xyXG4gICAgbGV0IHplcm9SZWFsOiBib29sZWFuO1xyXG4gICAgbGV0IGFyZ3M6IEFyZ3VtZW50c0xpc3QgPSBudWxsO1xyXG4gICAgbGV0IG1haW5DdHJsID0gdGhpcy5nZXRDdHJsKCk7XHJcbiAgICBsZXQgcGVuZGluZ0V2ZW50czogbnVtYmVyO1xyXG4gICAgbGV0IGV2dHM6IExpc3Q8RmllbGQgfCBSdW5UaW1lRXZlbnQ+O1xyXG4gICAgbGV0IGZvcmNlVXBkYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgY2hlY2tGb3JWYXJpYWJsZUNoYW5nZTogYm9vbGVhbiA9IHJlY29tcHV0ZSB8fCBlbmZvcmNlVmFsaWFibGVDaGFuZ2U7XHJcblxyXG4gICAgbGV0IHRhc2sgPSA8VGFzaz50aGlzLmdldFRhc2soKTtcclxuICAgIGlmICh0aGlzLl9mb3JtID09PSBudWxsKVxyXG4gICAgICB0aGlzLl9mb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuXHJcbiAgICBpZiAoaXNOdWxsRmxkICYmICF0aGlzLk51bGxBbGxvd2VkICYmIHRoaXMuX3R5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgbmV3VmFsID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoKTtcclxuICAgICAgaXNOdWxsRmxkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSIzgwNTM2NDogRm9yIGFueSBmaWVsZCwgd2Ugc3RvcmUgdGhlIHZhbHVlIGluIGZpZWxkIGFzIGl0IGlzICh3aXRob3V0IGNoZWNraW5nIHRoZSBwaWN0dXJlKS5cclxuICAgIC8vIEJ1dCBmb3IgTnVtZXJpYyBmaWVsZCwgaWYgcGljdHVyZSBkb2VzIG5vdCBjb250YWluIGRlY2ltYWxzIHRoZW4gd2Ugc2hvdWxkIHJvdW5kIG9mZiB0aGUgdmFsdWUgYW5kIHRoZW4gc2F2ZSB0aGlzIHZhbHVlIGluIGZpZWxkXHJcbiAgICAvLyBvdGhlcndpc2UgaXQgd2lsbCBnaXZlIHdyb25nIGNhbGN1bGF0aW9uLiBTbyBhbHdheXMgcm91bmQgb2ZmIHRoZSB2YWx1ZSBkZXBlbmRpbmcgb24gcGljdHVyZSdzIGRlY2ltYWwuXHJcbiAgICAvLyBjaGVjayBpZiBuZXdWYWwgaXMgXCJsb25nXCIgc2luY2UgdGhlcmUgaXMgbm8gcmVhc29uIHRvIHJvdW5kIGFuIGFscmVhZHkgd2hvbGUgbnVtYmVyXHJcbiAgICBpZiAodGhpcy5fdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDICYmIG5ld1ZhbCAhPSBudWxsICYmICFOVU1fVFlQRS5udW1IZXhTdHJJc0xvbmcobmV3VmFsKSkge1xyXG4gICAgICBsZXQgbnVtVmFsID0gbmV3IE5VTV9UWVBFKG5ld1ZhbCk7XHJcbiAgICAgIGxldCBwaWMgPSBuZXcgUElDKHRoaXMuX3BpY3R1cmUsIHRoaXMuX3R5cGUsIHN1cGVyLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICBsZXQgZGVjczogbnVtYmVyID0gcGljLmdldERlYygpO1xyXG4gICAgICBudW1WYWwucm91bmQoZGVjcyk7XHJcbiAgICAgIG5ld1ZhbCA9IG51bVZhbC50b1hNTHJlY29yZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlYyA9ICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgIGlmIChyZWMgPT0gbnVsbClcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKExhbmd1YWdlRGF0YS5JbnN0YW5jZS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlJUX1NUUl9OT19SRUNTX0lOX1JORykpO1xyXG5cclxuICAgIC8vIGRvbid0IGFsbG93IHVwZGF0aW5nIFJFQUwgZmllbGRzLCB1bmxlc3MgJ2FsbG93IHVwZGF0ZSBpbiBxdWVyeSBtb2RlJyBpcyBzZXQgdG8gVFJVRVxyXG4gICAgaWYgKCF0aGlzLklzVmlydHVhbCAmJlxyXG4gICAgICAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiZcclxuICAgICAgICAhRW52aXJvbm1lbnQuSW5zdGFuY2UuYWxsb3dVcGRhdGVJblF1ZXJ5TW9kZSh0YXNrLmdldENvbXBJZHgoKSlcclxuICAgICAgICB8fCByZWMuSW5Gb3JjZVVwZGF0ZSAmJiByZWMuSW5Db21wdXRlKSlcclxuICAgICAgcmV0dXJuICF2YWxzRXF1YWw7XHJcblxyXG4gICAgaWYgKGNoZWNrRm9yVmFyaWFibGVDaGFuZ2UgJiYgdGhpcy5nZXRIYXNDaGFuZ2VFdmVudCgpKSB7XHJcbiAgICAgIGxldCBhcmdzTGlzdCA9IG5ldyBBcnJheSgyKTtcclxuICAgICAgYXJnc0xpc3RbMF0gPSBuZXcgRXhwVmFsKFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQywgZmFsc2UsXHJcbiAgICAgICAgKG1haW5DdHJsICE9PSBudWxsICYmIG1haW5DdHJsLklzSW50ZXJhY3RpdmVVcGRhdGVcclxuICAgICAgICAgID8gRmllbGQuTlVNMC50b1hNTHJlY29yZCgpXHJcbiAgICAgICAgICA6IEZpZWxkLk5VTTEudG9YTUxyZWNvcmQoKSkpO1xyXG4gICAgICBhcmdzTGlzdFsxXSA9IG5ldyBFeHBWYWwodGhpcy5nZXRUeXBlKCksIHRoaXMuaXNOdWxsKCksIHRoaXMuZ2V0VmFsdWUoZmFsc2UpKTtcclxuICAgICAgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIH1cclxuICAgIGlmIChtYWluQ3RybCAhPSBudWxsKVxyXG4gICAgICBtYWluQ3RybC5Jc0ludGVyYWN0aXZlVXBkYXRlID0gZmFsc2U7XHJcblxyXG4gICAgLy8gdXBkYXRlIHRoZSBmaWVsZCBpbiB0aGUgY3VycmVudCByZWNvcmRcclxuICAgIGlmICh0aGlzLl90eXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICAvLyBjb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzLCBub3QgY2hhcmFjdGVycyAoSlBOOiBEQkNTIHN1cHBvcnQpXHJcbiAgICAgIGlmIChuZXdWYWwgIT0gbnVsbClcclxuICAgICAgICByZW1haW5kZXIgPSB0aGlzLl9zaXplIC0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIobmV3VmFsKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJlbWFpbmRlciA9IDA7XHJcblxyXG4gICAgICBpZiAobmV3VmFsICE9IG51bGwgJiYgdGhpcy5fdHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CICYmIHRoaXMuX3R5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IgJiZcclxuICAgICAgICByZW1haW5kZXIgPCAwKVxyXG4gICAgICAgIHRoaXMuX3ZhbCA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihuZXdWYWwsIHRoaXMuX3NpemUpO1xyXG4gICAgICBlbHNlIGlmICh0aGlzLl90eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBICYmIHJlbWFpbmRlciA+IDApXHJcbiAgICAgICAgdGhpcy5fdmFsID0gbmV3VmFsICsgTlN0cmluZy5Gcm9tQ2hhcnModGhpcy5fc3BhY2VzLCAwICwgcmVtYWluZGVyKTtcclxuICAgICAgZWxzZSBpZiAodGhpcy5fdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKVxyXG4gICAgICAgIHRoaXMuX3ZhbCA9IEJsb2JUeXBlLmNvcHlCbG9iKHRoaXMuX3ZhbCwgbmV3VmFsKTtcclxuICAgICAgZWxzZSB0aGlzLl92YWwgPSBuZXdWYWw7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKG5ld1ZhbCAhPSBudWxsKVxyXG4gICAgICAgIHJlbWFpbmRlciA9IHRoaXMuX3NpemUgLSBuZXdWYWwubGVuZ3RoO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmVtYWluZGVyID0gMDtcclxuXHJcbiAgICAgIGlmIChuZXdWYWwgIT0gbnVsbCAmJiB0aGlzLl90eXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgJiYgdGhpcy5fdHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUiAmJiByZW1haW5kZXIgPCAwKVxyXG4gICAgICAgIHRoaXMuX3ZhbCA9IG5ld1ZhbC5zdWJzdHIoMCwgdGhpcy5fc2l6ZSk7XHJcbiAgICAgIGVsc2UgaWYgKCh0aGlzLl90eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX3R5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkgJiYgcmVtYWluZGVyID4gMClcclxuICAgICAgICB0aGlzLl92YWwgPSBuZXdWYWwgKyAgTlN0cmluZy5Gcm9tQ2hhcnModGhpcy5fc3BhY2VzLCAwICwgcmVtYWluZGVyKTtcclxuICAgICAgZWxzZSBpZiAodGhpcy5fdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB7XHJcbiAgICAgICAgLy8gRW5zdXJlIF92YWwgaXMgbm90IG51bGwsIHNvIHRoYXQgdGhlIGJsb2IgY29weSB3aWxsIGJlXHJcbiAgICAgICAgLy8gZG9uZSBjb3JyZWN0bHksIGFjY29yZGluZyB0byB0aGUgZmllbGQncyBibG9iIHR5cGUuXHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbCA9PT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuX3ZhbCA9IHRoaXMuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICB0aGlzLl92YWwgPSBCbG9iVHlwZS5jb3B5QmxvYih0aGlzLl92YWwsIG5ld1ZhbCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB0aGlzLl92YWwgPSBuZXdWYWw7XHJcbiAgICB9XHJcbiAgICAvLyBJZiBkb3RuZXQgdmFyIGlzIHVwZGF0ZWQgd2l0aCBuZXcgYmxvYnByZWZpeCwgdmFsc0VxdWFsIGlzIGZhbHNlLCB3ZSBzaG91bGQgbm90IGNoZWNrIGluIHJlY29yZC5cclxuICAgIHtcclxuICAgICAgcmVjRmxkVmFsID0gcmVjLkdldEZpZWxkVmFsdWUodGhpcy5faWQpO1xyXG5cclxuICAgICAgLy8gSW4gb3JkZXIgdG8gY29tcGFyZSwgSWYgdmlydHVhbCdzIG9sZCB2YWx1ZSBpcyB0YWtlbiBmcm9tIHJlY29yZCwgdGhlbiBvbGQgaXNOdWxsIHZhbHVlIGFsc28gc2hvdWxkIGJlIHRha2VuIGZyb20gcmVjb3JkLlxyXG4gICAgICAvLyBUaGlzIHNob3VsZCBiZSBkb25lIG9ubHkgaWYgbm90IGluIHJlLWNvbXB1dGUgLyBub3QgYXJndW1lbnQgLyBubyBpbml0RXhwLilcclxuICAgICAgLy8gTWFpbmx5ICwgdGhpcyBpcyBuZWVkZWQsIHdoZW4gY3Vyc29yIGlzIHBhcmtlZCBvbiBvbmUgcmVjb3JkIGFuZCB2aXJ0dWFsIGlzIG1vZGlmaWVkIGZyb20gbnVsbCB0byBub25udWxsIG9yIHZpY2V2ZXJzYSBhbmRcclxuICAgICAgLy8gbm93IGlmIGN1cnNvciBtb3ZlcyBmcm9tIG9uZSByZWNvcmQgdG8gbmV4dCByZWNvcmQsIFdlIG5lZWQgdG8gIGdldCB0aGUgb2xkIG51bGwgdmFsdWUgZnJvbSByZWNvcmQuXHJcblxyXG4gICAgICBsZXQgb2xkTnVsbFZhbDogYm9vbGVhbiA9IHRoaXMuX2lzTnVsbDtcclxuICAgICAgaWYgKCFyZWNvbXB1dGUgJiYgIWlzQXJnVXBkYXRlICYmIHRoaXMuX2luaXRFeHAgPT0gbnVsbClcclxuICAgICAgICBvbGROdWxsVmFsID0gcmVjLklzTnVsbCh0aGlzLl9pZCk7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHZhbHNFcXVhbCA9IEV4cHJlc3Npb25FdmFsdWF0b3IubWdWYWxzRXF1YWwodGhpcy5fdmFsLCBpc051bGxGbGQsIHRoaXMuX3R5cGUsIHJlY0ZsZFZhbCwgb2xkTnVsbFZhbCwgdGhpcy5fdHlwZSk7XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICAgIHRoaXMuX3ZhbCA9IHRoaXMuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICB2YWxzRXF1YWwgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICAgIC8vIHplcm8gdGhlIHZlY3RvclxyXG4gICAgaWYgKHRoaXMuX2NsZWFyVmVjdG9yVHlwZSlcclxuICAgICAgdGhpcy5fdmVjdG9yVHlwZSA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5faW52YWxpZFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX2ludmFsaWRWYWx1ZSA9IGZhbHNlO1xyXG4gICAgICByZWMuY2xlYXJGbGFnKHRoaXMuX2lkLCBSZWNvcmQuRkxBR19VUERBVEVEKTtcclxuICAgICAgcmVjLmNsZWFyRmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfTU9ESUZJRUQpO1xyXG4gICAgfVxyXG4gICAgLy8gZHVyaW5nIGNvbXB1dGUsIHdlIHNob3VsZCB6ZXJvIGZpZWxkcyB3aGljaCBiZWxvbmcgdG8gbGluayBjcmVhdGUuXHJcbiAgICB6ZXJvUmVhbCA9IHRoaXMuX2xpbmtDcmVhdGUgJiYgcmVjLkluQ29tcHV0ZSAmJiAhcmVjb21wdXRlICYmICh0aGlzLl9mb3JtID09IG51bGwgfHwgIXRoaXMuX2Zvcm0uSW5SZXN0b3JlKSAmJlxyXG4gICAgICAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTtcclxuXHJcbiAgICAvLyBWaXJ0dWFscyB3aXRob3V0IGluaXQgZXhwcmVzc2lvbiBhcmUgY29waWVkIGZyb20gb25lIHJlY29yZCB0byBhbm90aGVyLCBldmVuIGF0XHJcbiAgICAvLyBjb21wdXRlIHRpbWUgKG5vIHJlY29tcHV0ZSkuIE5ldmVydGhlbGVzcywgaW4gY2FzZSB0aGVpciB2YWx1ZSBjaGFuZ2VzLCB3ZSBtdXN0XHJcbiAgICAvLyBwZXJmb3JtIHJlY29tcHV0ZS5cclxuICAgIGlmICgodGhpcy5faXNWaXJ0dWFsIHx8IHplcm9SZWFsKSAmJiAhcmVjLmlzTmV3UmVjKCkgJiYgIXZhbHNFcXVhbClcclxuICAgICAgZm9yY2VVcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgIC8vIGlmIHRoZSByZWNvbXB1dGUgaXMgZmFsc2UgaXQgbWVhbnMgdGhhdCB0aGUgdXNlciBpcyBzZXR0aW5nIGEgdmFsdWVcclxuICAgIC8vIHRoYXQgaXRzIHNvdXJjZSBpcyB0aGUgcmVjb3JkLCB0aHVzLCB3ZSBkb24ndCBoYXZlIHRvIHVwZGF0ZSB0aGUgcmVjb3JkLlxyXG4gICAgLy8gaWYgdGhlIHJlY29tcHV0ZSBpcyB0cnVlLCBnbyBhaGVhZCBhbmQgdXBkYXRlIHRoZSByZWNvcmQuXHJcbiAgICBpZiAoY2hlY2tGb3JWYXJpYWJsZUNoYW5nZSB8fCBmb3JjZVVwZGF0ZSB8fCByZWMuaXNOZXdSZWMoKSkge1xyXG4gICAgICB0aGlzLlVwZGF0ZU51bGwoaXNOdWxsRmxkLCByZWMpO1xyXG5cclxuICAgICAgaWYgKHNldENyc3JNb2RpZmllZClcclxuICAgICAgICByZWMuc2V0RmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfQ1JTUl9NT0RJRklFRCk7XHJcbiAgICAgIHJlYy5zZXRGaWVsZFZhbHVlKHRoaXMuX2lkLCB0aGlzLl92YWwsIHNldFJlY29yZE1vZGlmaWVkKTtcclxuICAgICAgZXZ0cyA9IEZpZWxkLl92YXJpYWJsZUNoYW5nZUV2dHM7XHJcbiAgICAgIHBlbmRpbmdFdmVudHMgPSBldnRzLmxlbmd0aDtcclxuICAgICAgaWYgKGNoZWNrRm9yVmFyaWFibGVDaGFuZ2UgJiYgdGhpcy5nZXRIYXNDaGFuZ2VFdmVudCgpICYmICFldnRzLkNvbnRhaW5zKHRoaXMpICYmICF2YWxzRXF1YWwpIHtcclxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHZhcmlhYmxlIGNoYW5nZSBoYW5kbGVyIC0gc2F2ZSB2YWx1ZSBhbmQgcHJlcGFyZSBwYXJhbXNcclxuICAgICAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KHRoaXMpO1xyXG4gICAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRSk7XHJcbiAgICAgICAgcnRFdnQuc2V0QXJnTGlzdChhcmdzKTtcclxuICAgICAgICBldnRzLnB1c2godGhpcyk7XHJcbiAgICAgICAgZXZ0cy5wdXNoKHJ0RXZ0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gY2hlY2sgZm9yIHJlY29tcHV0ZSBhbmQgZXhlY3V0ZSBpdFxyXG4gICAgICAvLyBRQ1IgIzI5OTYwOSwgaWYgd2UgYXJlIGluIGxvY2FsIGRhdGF2aWV3IG1hbmFnZXIsIHdlIGNhbiBvbmx5IGNvbXB1dGUuXHJcbiAgICAgIC8vIFJlY29tcHV0ZSBpcyBub3QgYWxsb3dlZCwgc2luY2UgaXQgd2lsbCBiZSBleGVjdXRlZCBtdWx0aXBsZSB0aW1lc1xyXG4gICAgICBpZiAodGhpcy5fcmVjb21wdXRlICE9IG51bGwgJiYgKHJlY29tcHV0ZSB8fCBmb3JjZVVwZGF0ZSkgJiYgISg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLkluTG9jYWxEYXRhdmlld0NvbW1hbmQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gaWYgZmllbGQgY2F1c2VkIHRhYmxlIGludmFsaWRhdGlvbiBhbmQgaXQncyB2YWx1ZSB3YXMgY2hhbmdlZFxyXG4gICAgICAgICAgaWYgKGZvcmNlVXBkYXRlKVxyXG4gICAgICAgICAgICByZWMuSW5Gb3JjZVVwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLl9yZWNvbXB1dGUuZXhlY3V0ZShyZWMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICBpZiAoZm9yY2VVcGRhdGUpXHJcbiAgICAgICAgICAgIHJlYy5JbkZvcmNlVXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9jYXVzZVRhYmxlSW52YWxpZGF0aW9uICYmIHRoaXMuaXNDaGFuZ2VkKHRoaXMuX3ZhbCwgaXNOdWxsRmxkKSlcclxuICAgICAgICByZWMuc2V0Q2F1c2VJbnZhbGlkYXRpb24odHJ1ZSk7XHJcblxyXG4gICAgICAvLyBEb24ndCB1cGRhdGUgY29udHJvbHMgd2hpbGUgZmV0Y2hpbmcgcmVjb3JkcyBmcm9tIGxvY2FsIGRhdGFiYXNlLiBJZiB0aGUgdGFzayBoYXMgYSB0YWJsZSBjb250cm9sLCB0aGVuIGFjdHVhbCBjb250cm9scyBvbiB0aGVcclxuICAgICAgLy8gcm93cyBhcmUgY3JlYXRlZCBhZnRlciBuby4gb2Ygcm93cyBpcyBrbm93biAoYW5kIHRoaXMgaXMgYWZ0ZXIgdGhlIGRhdGEgaXMgYXZhaWFsYWJsZSkuIFNvLCB3aGlsZSBmZXRjaGluZyByZWNvcmRzLCBjb250cm9scyBpblxyXG4gICAgICAvLyB0YWJsZSBhcmUgbm90IHlldCBjcmVhdGVkIGFuZCBoZW5jZSB0aGVyZSBpcyBhbiBhc3NlcnQgd2hpbGUgdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgY29udHJvbHMuIEFmdGVyIHNraXBwaW5nIHRoaXMgdXBkYXRlLCB0aGUgY29udHJvbHNcclxuICAgICAgLy8gYXJlIHVwZGF0ZWQgZnJvbSBvdGhlciBwbGFjZXMgKHJlZnJlc2hUYWJsZSwgY29tbW9uSGFuZGxlckJlZm9yZSwgaGFuZGxlUm93RGF0YUN1clBhZ2UgZXRjIGxpa2UgaXQgaGFwcGVucyBmb3Igc2VydmVyIGRhdGEpXHJcbiAgICAgIGlmICgocmVjb21wdXRlIHx8IGZvcmNlVXBkYXRlKSAmJiAhKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuSW5Mb2NhbERhdGF2aWV3Q29tbWFuZCAmJiBtYWluQ3RybCAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKG1haW5DdHJsLmlzQ2hvaWNlQ29udHJvbCgpKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFJpZ2h0IGFmdGVyIHdlIGV4aXQgdGhlIHRvcG1vc3QgdXBkYXRlIC0gZXhlY3V0ZSBhbGwgdmFyaWFibGUgY2hhbmdlIGV2ZW50cy5cclxuICAgICAgLy8gbm90ZSB0aGF0IGR1cmluZyB0aGlzIGV4ZWN1dGlvbiwgbmV3IG9uZXMgbWF5IGJlIGNyZWF0ZWQuXHJcbiAgICAgIGlmIChwZW5kaW5nRXZlbnRzID09PSAwICYmIGNoZWNrRm9yVmFyaWFibGVDaGFuZ2UgJiYgdGhpcy5nZXRIYXNDaGFuZ2VFdmVudCgpKSB7XHJcbiAgICAgICAgd2hpbGUgKGV2dHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IGV2dCA9IDxSdW5UaW1lRXZlbnQ+ZXZ0cy5nZXRfSXRlbSgxKTtcclxuICAgICAgICAgIGV2dHMuUmVtb3ZlQXQoMCk7XHJcbiAgICAgICAgICBldnRzLlJlbW92ZUF0KDApO1xyXG4gICAgICAgICAgaWYgKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSA9PSBudWxsKVxyXG4gICAgICAgICAgICBldnQuc2V0VGFzayg8VGFzaz50aGlzLmdldFRhc2soKSk7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRhc2tSZWY6IFRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBpbiB2YXJpYWJsZSBjaGFuZ2UgZXZlbnQgYW5kIFRhc2tTdWZmaXggaXMgZXhlY3V0ZWQsIGl0IG1lYW5zIHdlIGFyZSBoZXJlIGZyb21cclxuICAgICAgICAgICAgLy8gdXBkYXRlIGFyZ3VtZW50cyB3aGlsZSBjbG9zaW5nIHRoZSB0YXNrLiBJbiBzdWNoIGNhc2UsIHdlIHNob3VsZCBzZXQgdGhlIGV2ZW50IHRhc2sgYXMgUGF0aFBhcmVudFRhc2tcclxuICAgICAgICAgICAgLy8gYW5kIG5vdCB0aGUgdGFzayBpdHNlbGYuXHJcbiAgICAgICAgICAgIGlmICh0YXNrUmVmLlRhc2tTdWZmaXhFeGVjdXRlZCkge1xyXG4gICAgICAgICAgICAgIHRhc2tSZWYgPSAodGFza1JlZi5QYXRoUGFyZW50VGFzayAhPSBudWxsKSA/IDxUYXNrPnRhc2tSZWYuUGF0aFBhcmVudFRhc2sgOiB0YXNrUmVmO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGV2dC5zZXRUYXNrKHRhc2tSZWYpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZXZ0LnNldEN0cmwoTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpKTtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUV2ZW50KGV2dCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gIzc3NjAzMSAtIHRoZSBmaWVsZCBzaG91bGQgYmUgbWFya2VkIG1vZGlmaWVkIG9ubHkgaWYgdmFsIGFyZSBub3QgZXF1YWwuIE90aGVyd2lzZSwgZXZlbiBmb3IgbnVsbCBmaWVsZCBwYXJhbXRlciBwYXNzaW5nXHJcbiAgICAvLyBvciBzYW1lIHZhbHVlIHVwZGF0ZSwgaXQgaXMgbWFya2VkIGFzIG1vZGlmaWVkIGFuZCBSUyBpcyBleGVjdXRlZC5cclxuICAgIGlmIChyZWNvbXB1dGUgJiYgIXZhbHNFcXVhbClcclxuICAgICAgdGhpcy5zZXRNb2RpZmllZCgpO1xyXG4gICAgcmV0dXJuICF2YWxzRXF1YWw7XHJcbiAgfVxyXG5cclxuICBVcGRhdGVOdWxsKGlzTnVsbEZsZDogYm9vbGVhbiwgcmVjOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIGlmIChpc051bGxGbGQpXHJcbiAgICAgIHJlYy5zZXRGbGFnKHRoaXMuX2lkLCBSZWNvcmQuRkxBR19OVUxMKTtcclxuICAgIGVsc2VcclxuICAgICAgcmVjLmNsZWFyRmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfTlVMTCk7XHJcbiAgICB0aGlzLl9pc051bGwgPSBpc051bGxGbGQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGEgdmVjIGNlbGxcclxuICAvLy8gICBjYW4gbm90IGJlIGV4ZWN1dGVkIHdpdGhvdXQgdGhlIGxvZ2ljIGZyb20gZXZhbF9vcF92ZWNHZXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+dGhlIGNlbGwgaW5kZXggaW4gdGhlIHZlY3RvciBzdHJhdHMgZnJvbSAxPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbFwiPnRoZSBuZXcgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsSXNOdWxsXCI+aXMgdGhlIGJldyB2YWx1ZSBudWxsPC9wYXJhbT5cclxuICBhc3luYyBzZXRDZWxsVmVjVmFsdWUoaWR4OiBudW1iZXIsIG5ld1ZhbDogc3RyaW5nLCB2YWxJc051bGw6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl90eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgIC8vIGluaXRpYWxpemVkIHRoZSB2ZWN0b3Igb2JqZWN0IGlmIG5lZWRlZFxyXG4gICAgICBpZiAodGhpcy5fdmVjdG9yVHlwZSA9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fdmVjdG9yVHlwZSA9IHRoaXMuaXNOdWxsKClcclxuICAgICAgICAgID8gbmV3IFZlY3RvclR5cGUodGhpcy5fdmVjQ2VsbHNUeXBlLCB0aGlzLl92ZWNDZWxsc0NvbnRlbnRUeXBlLCB0aGlzLkRlZmF1bHRWYWx1ZSwgdGhpcy5pc051bGxEZWZhdWx0KCksXHJcbiAgICAgICAgICB0aGlzLk51bGxBbGxvd2VkLCB0aGlzLl92ZWNDZWxsc1NpemUpXHJcbiAgICAgICAgICA6IG5ldyBWZWN0b3JUeXBlKHRoaXMuX3ZhbCk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gaWYgdmVjQ2VsbHNUeXBlIGlzIEJMT0IsIGNvbnZlcnQgZGF0YSBpbnRvIGJsb2JcclxuICAgICAgaWYgKHRoaXMuX3ZlY0NlbGxzVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB7XHJcbiAgICAgICAgbGV0IHRtcE5ld1ZhbDogc3RyaW5nID0gdGhpcy5nZXRDZWxsRGVmdWFsdFZhbHVlKCk7XHJcbiAgICAgICAgbmV3VmFsID0gQmxvYlR5cGUuY29weUJsb2IodG1wTmV3VmFsLCBuZXdWYWwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXMgPSB0aGlzLl92ZWN0b3JUeXBlLnNldFZlY0NlbGwoaWR4LCBuZXdWYWwsIHZhbElzTnVsbCk7XHJcbiAgICAgIC8vIHN0YXJ0IHJlY29tcHV0ZVxyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgdGhpcy5fY2xlYXJWZWN0b3JUeXBlID0gZmFsc2U7XHJcbiAgICAgICAgLy8gUUNSIDk4NDU2MyBkbyBub3Qgc2V0IHRoZSByZWNvcmQgYXMgY2hhbmdlZFxyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZSh0aGlzLl92ZWN0b3JUeXBlLnRvU3RyaW5nKCksIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuX2NsZWFyVmVjdG9yVHlwZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY2VsbCB2YWx1ZSBvZiBhIGdpdmVuIGNlbGwgaW4gdGhlIHZlY3RvclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgY2VsbCdzIHZhbHVlIGFzIHN0cmluZzwvcmV0dXJucz5cclxuICBnZXRWZWNDZWxsVmFsdWUoaWR4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX3R5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgLy8gaWYgd2UgYXJlIGhlcmUgdGhhbiB0aGUgZmlsZWQgbXVzdCBoYXZlIG5vbmUgbnVsbCB2YWx1ZSBvZiBhIHZlY3RvclxyXG4gICAgICBpZiAodGhpcy5fdmVjdG9yVHlwZSA9PSBudWxsKVxyXG4gICAgICAgIHRoaXMuX3ZlY3RvclR5cGUgPSBuZXcgVmVjdG9yVHlwZSh0aGlzLl92YWwpO1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuX3ZlY3RvclR5cGUuZ2V0VmVjQ2VsbChpZHgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSByZWNvbXB1dGVkIHZhcmlhYmxlIHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFJlY29tcHV0ZWQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW52YWxpZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLiBBbiBpbnZhbGlkIHZhbHVlIGZvcmNlcyB1cyB0byByZS1jYWxjdWxhdGUgdGhlIGZpZWxkJ3NcclxuICAvLy8gICB2YWx1ZSBieSBjb3B5aW5nIGl0IGZyb20gdGhlIGRhdGF2aWV3LlxyXG4gIC8vLyAgIHVzZWQgd2hlbiBzd2l0Y2hpbmcgdG8gYW5vdGhlciByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9yY2VJbnZhbGlkYXRlXCI+LSBEb250IGNoZWNrIHRoZSBmaWVsZCdzIHR5cGUgYW5kIG1ha2UgaXQgaW52YWxpZCAodXN1YWxseSBWaXJ0dWFsc1xyXG4gIC8vLyAgIHdpdGhvdXQgaW5pdCBleHByZXNzaW9uIGFyZSBuZXZlciBpbnZhbGlkYXRlZCwgc2luY2UgdGhleSByZXRhaW4gdGhlaXIgdmFsdWUgd2hlbiBtb3ZpbmdcclxuICAvLy8gICBiZXR3ZWVuIHJlY29yZHMpLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNsZWFyRmxhZ3NcIj48L3BhcmFtPlxyXG4gIGludmFsaWRhdGUoZm9yY2VJbnZhbGlkYXRlOiBib29sZWFuLCBjbGVhckZsYWdzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pc1ZpcnR1YWwgfHwgdGhpcy5fdmlyQXNSZWFsIHx8IHRoaXMuX2luaXRFeHAgIT09IG51bGwgfHwgZm9yY2VJbnZhbGlkYXRlKSB7XHJcbiAgICAgIHRoaXMuX2ludmFsaWRWYWx1ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoY2xlYXJGbGFncyAmJiByZWMgIT09IG51bGwpIHtcclxuICAgICAgcmVjLmNsZWFyRmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfVVBEQVRFRCk7XHJcbiAgICAgIHJlYy5jbGVhckZsYWcodGhpcy5faWQsIFJlY29yZC5GTEFHX01PRElGSUVEKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgTmFtZSBvZiB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGdldFRhYmxlTmFtZSgpOiBTdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTmFtZSA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZm9yIGdldCBWQVJOQU1FIGZ1bmN0aW9uIHVzZVxyXG4gIC8vLyAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRhYmxlIG5hbWUgd2hlcmUgdGhlIHZhcmlhYmxlIG9yaWdpbmF0ZXMsXHJcbiAgLy8vICAgY29uY2F0ZW5hdGVkIHdpdGggJy4nIGFuZCB0aGUgdmFyaWFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlhYmxlIGluIHRoYXQgdGFibGUuXHJcbiAgLy8vICAgSWYgdGhlIHZhcmlhYmxlIGlzIGEgdmlydHVhbCBvbmUsIHRoZW4gdGhlIHRhYmxlIG5hbWUgd291bGQgaW5kaWNhdGUgJ1ZpcnR1YWwnLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl9pc1BhcmFtKVxyXG4gICAgICByZXR1cm4gXCJQYXJhbWV0ZXIuXCIgKyB0aGlzLmdldFZhck5hbWUoKTtcclxuICAgIGVsc2UgaWYgKHRoaXMuX2lzVmlydHVhbClcclxuICAgICAgcmV0dXJuIFwiVmlydHVhbC5cIiArIHRoaXMuZ2V0VmFyTmFtZSgpO1xyXG4gICAgZWxzZSByZXR1cm4gdGhpcy5nZXRUYWJsZU5hbWUoKSArIFwiLlwiICsgdGhpcy5nZXRWYXJOYW1lKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGVzdCBmb3IgYSBudWxsaXR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgaXNOdWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCg8VGFzaz5zdXBlci5nZXRUYXNrKCkpLmdldEV2YWxPbGRWYWx1ZXMoKSlcclxuICAgICAgcmV0dXJuIHRoaXMuaXNPcmlnaW5hbFZhbHVlTnVsbCgpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5faW52YWxpZFZhbHVlKVxyXG4gICAgICB0aGlzLnRha2VWYWxGcm9tUmVjKCk7XHJcbiAgICByZXR1cm4gdGhpcy5faXNOdWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgUHJldklzTnVsbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2SXNOdWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRlc3QgZm9yIGFuIG1vZGlmaWVkIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgcmV0dXJuIGN1cnJSZWMuaXNGbGRNb2RpZmllZCh0aGlzLl9pZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBtb2RpZmllZCBmbGFnXHJcbiAgLy8vICAgcGxlYXNlIG5vdGUgdGhhdCBjbGVhcmluZyB0aGUgZmxhZyBpcyBkb25lIGV4cGxpY2l0bHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldE1vZGlmaWVkKCk6IHZvaWQge1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gKCg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldEN1cnJSZWMoKSk7XHJcbiAgICByZWMuc2V0RmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfTU9ESUZJRUQpO1xyXG5cclxuICAgIC8vIFRoaXMgZmxhZyB3aWxsIGJlIHNldCBhcyBGTEFHX01PRElGSUVEIGFuZCBuZXZlciBjbGVhcmVkLiBRY3IgIzkyNjgxNVxyXG4gICAgcmVjLnNldEZsYWcodGhpcy5faWQsIFJlY29yZC5GTEFHX01PRElGSUVEX0FUTEVBU1RfT05DRSk7XHJcbiAgICBpZiAodGhpcy5Jc1ZpcnR1YWwpXHJcbiAgICAgIHRoaXMubW9kaWZpZWRBdExlYXN0T25jZSA9IHRydWU7XHJcbiAgICAvLyB0aGUgc2V0dGluZyBvZiB0aGUgcmVjb3JkIG1vZGlmaWVkIGZsYWcgaXMgZG9uZSBleHBsaWNpdGx5XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB1cGRhdGVkIGZsYWdcclxuICAvLy8gICBwbGVhc2Ugbm90ZSB0aGF0IGNsZWFyaW5nIHRoZSBmbGFnIGlzIGRvbmUgZXhwbGljaXRseVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0VXBkYXRlZCgpOiB2b2lkIHtcclxuICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICBjdXJyUmVjLnNldEZsYWcodGhpcy5faWQsIFJlY29yZC5GTEFHX1VQREFURUQpO1xyXG4gICAgY3VyclJlYy5zZXRVcGRhdGVkKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgZmllbGQgaXMgYSBwYXJhbWV0ZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzUGFyYW0oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNQYXJhbTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGlmIHRoZSBmaWVsZCBpbiBldmFsdWF0aW9uIHByb2Nlc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzSW5FdmFsUHJvY2VzcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbkV2YWxQcm9jZXNzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgZmllbGQgaGFzIGFuIGluaXQgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaGFzSW5pdEV4cCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbml0RXhwICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIHJlY29tcHV0ZXMgdGhpcyBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNTZXJ2ZXJSY21wKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29tcHV0ZSAhPT0gbnVsbCAmJiB0aGlzLl9yZWNvbXB1dGUuaXNTZXJ2ZXJSY21wKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgcGljdHVyZSBvZiB0aGUgZmllbGQgYXMgYSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFBpY3R1cmUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9waWN0dXJlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHRoZSBpZCBvZiB0aGUgbGluayB0aGlzIGZpZWxkIGJlbG9uZyB0b1xyXG4gIC8vLyAgIGlmIGRvZXMgbm90IGJlbG9uZyB0byBhbnkgbGluayByZXR1cm4gLTFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERhdGF2aWV3SGVhZGVySWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhdmlld0hlYWRlcklkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHdoZXRoZXIgdGhlIGZpZWxkIGJlbG9uZ3MgdG8gYSBsaW5rIG9yIG5vdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0IElzTGlua0ZpZWxkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzTGlua0ZsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBldmFsdWF0ZXMgYW5kIHJldHVybnMgdGhlIGluaXQgZXhwcmVzc2lvbiB2YWx1ZSBvZiB0aGlzIGZpZWxkIChudWxsIGlmIHRoZXJlIGlzIG5vbilcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBhc3luYyBnZXRJbml0RXhwVmFsKHJlczogUmVmUGFyYW08c3RyaW5nPiwgaXNOdWxsOiBSZWZQYXJhbTxib29sZWFuPik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGlmICh0aGlzLl9pbml0RXhwICE9IG51bGwpXHJcbiAgICAgIGF3YWl0IHRoaXMuRXZhbHVhdGVJbml0RXhwcmVzc2lvbihyZXMsIGlzTnVsbCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJlcy52YWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIGhhc0NoYW5nZUV2ZW50IGZsYWcgdG8gVFJVRVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SGFzQ2hhbmdlRXZlbnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9oYXNDaGFuZ2VFdmVudCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0cmlldmVzIHRoZSBoYXNDaGFuZ2VFdmVudCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldEhhc0NoYW5nZUV2ZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhc0NoYW5nZUV2ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBoYXNab29tSGFuZGxlciB0byB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRIYXNab29tSGFuZGxlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2hhc1pvb21IYW5kbGVyID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGhhc1pvb21IYW5kbGVyXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBnZXRIYXNab29tSGFuZGxlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9oYXNab29tSGFuZGxlcjtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGluIHRoaXMgZmllbGQgd2lsbCBjYXVzZSBpbnZhbGlkYXRpb24gb2YgYWxsIHJvd3MgaW4gdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNDYXVzZVRhYmxlSW52YWxpZGF0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhdXNlVGFibGVJbnZhbGlkYXRpb247XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGNhdXNlIFRhYmxlIEludmFsaWRhdGlvbiBtZW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2F1c2VUYWJsZUludmFsaWRhdGlvblwiPjwvcGFyYW0+XHJcbiAgY2F1c2VUYWJsZUludmFsaWRhdGlvbihjYXVzZVRhYmxlSW52YWxpZGF0aW9uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYXVzZVRhYmxlSW52YWxpZGF0aW9uID0gY2F1c2VUYWJsZUludmFsaWRhdGlvbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB3aGVuIHZhbHVlIGlzIG51bGwsIGdldCB2YWx1ZSB0aGF0IHJlcHJlc2VudCBudWxsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoZWNrTnVsbEFyaXRobWV0aWNcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VmFsdWVGb3JOdWxsKGNoZWNrTnVsbEFyaXRobWV0aWM6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgbGV0IHZhbDogc3RyaW5nO1xyXG4gICAgaWYgKHRoaXMuTnVsbEFsbG93ZWQpIHtcclxuXHJcbiAgICAgIGlmIChjaGVja051bGxBcml0aG1ldGljICYmIHN1cGVyLmdldFRhc2soKS5nZXROdWxsQXJpdGhtZXRpYygpID09PSBDb25zdGFudHMuTlVMTF9BUklUSF9OVUxMSUZZKSB7XHJcbiAgICAgICAgdmFsID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5fbnVsbFZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLl9udWxsVmFsdWUgPSBzdXBlci5nZXRNYWdpY0RlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YWwgPSB0aGlzLl9udWxsVmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB2YWwgPSBzdXBlci5nZXRNYWdpY0RlZmF1bHRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjb250cm9sIHdoaWNoIGlzIGF0dGFjaGVkIHRvIHRoZSBmaWVsZCBhbmQgcmVzaWRlcyBvbiB0aGUgc2FtZSB0YXNrXHJcbiAgLy8vICAgb2Ygb2YgdGhlIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgZ2V0Q3RybCgpOiBNZ0NvbnRyb2wge1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbDtcclxuXHJcbiAgICBpZiAodGhpcy5fY29udHJvbHMgIT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fY29udHJvbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjdHJsID0gPE1nQ29udHJvbD50aGlzLl9jb250cm9scy5nZXRfSXRlbShpKTtcclxuICAgICAgICBpZiAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpID09PSB0aGlzLmdldFRhc2soKSlcclxuICAgICAgICAgIHJldHVybiBjdHJsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgdGhlIGRpc3BsYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHVwZGF0ZURpc3BsYXkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCBzdXBlci51cGRhdGVEaXNwbGF5V2l0aFZhbHVlKHRoaXMuZ2V0RGlzcFZhbHVlKCksIHRoaXMuaXNOdWxsKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdmFsdWUgdG8gZGlzcGxheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGdldERpc3BWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuaXNOdWxsKCkpIHtcclxuICAgICAgaWYgKHRoaXMuX251bGxEaXNwbGF5ICE9IG51bGwpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVsbERpc3BsYXkoKTtcclxuICAgICAgZWxzZSByZXR1cm4gc3VwZXIuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuICAgIH1cclxuICAgIGVsc2UgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB0cnVlLCBpZiByYW5nZSBjb25kaXRpb24gc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGllbGQgZHVyaW5nIGNvbXB1dGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBTaG91bGRDaGVja1JhbmdlSW5Db21wdXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuSXNMaW5rRmllbGQgfHwgKHRoaXMuSXNWaXJ0dWFsICYmICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLkhhc01haW5UYWJsZSk7XHJcbiAgfVxyXG5cclxuICBJc0ZvckFyZ3VtZW50KHRhc2tIYXNQYXJhbWV0ZXJzOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAvLyBJZiB3ZSBuZWVkIGEgcGFyYW1ldGVyIGFuZCB0aGUgZmllbGQgaXMgbm90IG9uZVxyXG4gICAgaWYgKHRhc2tIYXNQYXJhbWV0ZXJzKSB7XHJcbiAgICAgIGlmICghdGhpcy5pc1BhcmFtKCkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMuSXNWaXJ0dWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbn1cclxuIl19
|
|
671
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL2RhdGEvRmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdEgsT0FBTyxFQUNMLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxRQUFRLEVBQ1IsZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixRQUFRLEVBRVIsUUFBUSxFQUNSLEdBQUcsRUFDSCxVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFHL0QsT0FBTyxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWpELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVB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MUM7O1lBQ0ksT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFLRCxJQUFJLHlCQUF5QjtRQUMzQixPQUFPLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFlLElBQUksQ0FBQyxTQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELGFBQWEsQ0FBQyxpQkFBMEI7UUFFdEMsSUFBSSxpQkFBaUIsRUFBRTtZQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNuQixPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7YUFDSTtZQUNILElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNuQixPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7O0FBeGhDTSxpQkFBVyxHQUFZLEtBQUssQ0FBQztBQUVyQixVQUFJLEdBQWEsSUFBSSxDQUFDO0FBQ3RCLFVBQUksR0FBYSxJQUFJLENBQUM7QUFpQ3RCLHlCQUFtQixHQUErQixJQUFJLElBQUksRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgRGVidWcsIExpc3QsIE5OdW1iZXIsIE5TdHJpbmcsIFJlZlBhcmFtLCBpc051bGxPclVuZGVmaW5lZH0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7XHJcbiAgQ29uc3RhbnRzLFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBNc2dJbnRlcmZhY2UsXHJcbiAgUElDSW50ZXJmYWNlLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBVdGlsU3RyQnl0ZU1vZGUsXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7XHJcbiAgQmxvYlR5cGUsXHJcbiAgRGlzcGxheUNvbnZlcnRvcixcclxuICBFeHBWYWwsXHJcbiAgRmllbGREZWYsXHJcbiAgTWdDb250cm9sQmFzZSxcclxuICBOVU1fVFlQRSxcclxuICBQSUMsXHJcbiAgVmVjdG9yVHlwZVxyXG59IGZyb20gXCJAbWFnaWMteHBhL2d1aVwiO1xyXG5cclxuaW1wb3J0IHtZZXNOb0V4cH0gZnJvbSBcIi4uL2V4cC9ZZXNOb0V4cFwiO1xyXG5pbXBvcnQge0V4cHJlc3Npb259IGZyb20gXCIuLi9leHAvRXhwcmVzc2lvblwiO1xyXG5pbXBvcnQge0V4cHJlc3Npb25FdmFsdWF0b3J9IGZyb20gXCIuLi9leHAvRXhwcmVzc2lvbkV2YWx1YXRvclwiO1xyXG5pbXBvcnQge01nRm9ybX0gZnJvbSBcIi4uL2d1aS9NZ0Zvcm1cIjtcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gXCIuLi9ndWkvTWdDb250cm9sXCI7XHJcbmltcG9ydCB7UmVjb21wdXRlLCBSZWNvbXB1dGVfUmNtcEJ5fSBmcm9tIFwiLi4vcnQvUmVjb21wdXRlXCI7XHJcbmltcG9ydCB7Qm91bmRhcnl9IGZyb20gXCIuLi9ydC9Cb3VuZGFyeVwiO1xyXG5pbXBvcnQge0FyZ3VtZW50c0xpc3R9IGZyb20gXCIuLi9ydC9Bcmd1bWVudHNMaXN0XCI7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gXCIuLi9Db25zdEludGVyZmFjZVwiO1xyXG5pbXBvcnQge1Rhc2t9IGZyb20gXCIuLi90YXNrcy9UYXNrXCI7XHJcbmltcG9ydCB7UnVuVGltZUV2ZW50fSBmcm9tIFwiLi4vZXZlbnQvUnVuVGltZUV2ZW50XCI7XHJcbmltcG9ydCB7UmVjb3JkfSBmcm9tIFwiLi9SZWNvcmRcIjtcclxuaW1wb3J0IHtEYXRhVmlld30gZnJvbSBcIi4vRGF0YVZpZXdcIjtcclxuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tIFwiLi4vZW52L0Vudmlyb25tZW50XCI7XHJcbmltcG9ydCB7IEZpZWxkQmFzZSB9IGZyb20gXCIuL0ZpZWxkQmFzZVwiO1xyXG5pbXBvcnQgeyBMYXN0Rm9jdXNlZE1hbmFnZXIgfSBmcm9tIFwiLi4vcnQvTGFzdEZvY3VzZWRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IExhbmd1YWdlRGF0YSB9IGZyb20gXCIuLi9lbnYvTGFuZ3VhZ2VEYXRhXCI7XHJcbmltcG9ydCB7IEFjY2Vzc0hlbHBlciB9IGZyb20gXCIuLi9BY2Nlc3NIZWxwZXJcIjtcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgZGF0YSBmb3IgPGZsZGggLi4uPlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgRmllbGQgZXh0ZW5kcyBGaWVsZEJhc2Uge1xyXG4gIHN0YXRpYyBMRUFWRV9GTEFHUzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyBOVU0wOiBOVU1fVFlQRSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgTlVNMTogTlVNX1RZUEUgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIF9saW5rRXhwOiBZZXNOb0V4cCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcmVjb21wdXRlOiBSZWNvbXB1dGUgPSBudWxsO1xyXG4gIENhY2hlVGFibGVGbGRJZHg6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfY2F1c2VUYWJsZUludmFsaWRhdGlvbjogYm9vbGVhbiA9IGZhbHNlOyAvLyBjaGFuZ2UgaW4gdGhpcyBmaWVsZCB3aWxsIGNhdXNlIGludmFsaWRhdGlvbiBvZiBhbGwgcm93cyBpbiB0YWJsZVxyXG4gIHByaXZhdGUgX2Zvcm06IE1nRm9ybSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaGFzQ2hhbmdlRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gaWYgVFJVRSwgdGhlcmUgaXMgYSBoYW5kbGVyIHRvIHJ1biB3aGVuIHRoaXMgZmllbGQgaXMgdXBkYXRlZFxyXG4gIHByaXZhdGUgX2hhc1pvb21IYW5kbGVyOiBib29sZWFuID0gZmFsc2U7IC8vIGlmIFRSVUUsIHRoZXJlIGlzIGEgem9vbSBoYW5kbGVyIGZvciB0aGlzIGZpZWxkXHJcbiAgcHJpdmF0ZSBfaW5FdmFsUHJvY2VzczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2luaXRFeHA6IEV4cHJlc3Npb24gPSBudWxsO1xyXG4gIHByaXZhdGUgX2ludmFsaWRWYWx1ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfaXNMaW5rRmxkOiBib29sZWFuID0gZmFsc2U7IC8vIGlmIFRSVUUsIGl0IG1lYW5zIHRoYXQgdGhlIGZpZWxkIGJlbG9uZ3MgdG8gYSBsaW5rXHJcbiAgcHJpdmF0ZSBfaXNWaXJ0dWFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZGF0YXZpZXdIZWFkZXJJZDogbnVtYmVyID0gLTE7ICAvLyBtZW1iZXJzIHJlbGF0ZWQgdG8gdGFibGUgY2FjaGVcclxuICBwcml2YXRlIF9saW5rQ3JlYXRlOiBib29sZWFuID0gZmFsc2U7IC8vIElmIHRydWUgdGhlbiBpdCdzIGEgcmVhbCBmaWVsZCB3aGljaCBiZWxvbmdzIHRvIGxpbmsgY3JlYXRlLlxyXG4gIExvY2F0ZTogQm91bmRhcnkgPSBudWxsO1xyXG4gIFJhbmdlOiBCb3VuZGFyeSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaXNQYXJhbTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzRXhwb3NlZFJvdXRlUGFyYW06IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0V4cG9zZWRUb0NsaWVudDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfcHJldklzTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3ByZXZWYWx1ZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF90YWJsZU5hbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaW5kZXhJblRhYmxlOiBudW1iZXIgPSAtMTtcclxuXHJcbiAgcHJpdmF0ZSBfdmlyQXNSZWFsOiBib29sZWFuID0gZmFsc2U7IC8vIElmIHRydWUgdGhlbiBhIHZpcnR1YWwgZmllbGQgaXMgY29tcHV0ZWQgYXMgcmVhbCAobmVlZGVkIGZvciBsaW5rIHJldCB2YWx1ZSlcclxuICBwcm90ZWN0ZWQgX3ZhbDogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIG1vZGlmaWVkQXRMZWFzdE9uY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc051bGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9jbGVhclZlY3RvclR5cGU6IGJvb2xlYW4gPSB0cnVlOyAvLyBkbyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdmVjdG9yIG9iamVjdFxyXG4gIHByaXZhdGUgX3ZlY3RvclR5cGU6IFZlY3RvclR5cGUgPSBudWxsOyAvLyB0aGUgdmVjdG9yIHJlcHJlc2VudGF0aW9uXHJcblxyXG4gIHByaXZhdGUgc3RhdGljIF92YXJpYWJsZUNoYW5nZUV2dHM6IExpc3Q8RmllbGQgfCBSdW5UaW1lRXZlbnQ+ID0gbmV3IExpc3QoKTsgLy8gZm9yIFZhcmlhYmxlIENoYW5nZSBldmVudCBleGVjdXRpb24sIHByZXZpb3VzbHkgdXNlZCB2aWEgZ2V0UGVuZGluZ1ZhckNoYW5nZUV2ZW50c1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ1RPUlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRhdmlld1wiPmEgcmVmZXJlbmNlIHRvIHRoZSBkYXRhdmlldzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPmNvdW50ZXIgb2YgdGhlIGZpZWxkIGluIEZpZWxkVGFibGU8L3BhcmFtPlxyXG4gIGNvbnN0cnVjdG9yKGRhdGF2aWV3OiBEYXRhVmlldywgaWQ6IG51bWJlcikge1xyXG4gICAgc3VwZXIoaWQpO1xyXG4gICAgaWYgKEZpZWxkLk5VTTAgPT09IG51bGwpIHtcclxuICAgICAgRmllbGQuTlVNMCA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgICBGaWVsZC5OVU0xID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICAgIEZpZWxkLk5VTTAuTlVNXzRfTE9ORygwKTtcclxuICAgICAgRmllbGQuTlVNMS5OVU1fNF9MT05HKDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2RhdGF2aWV3ID0gZGF0YXZpZXc7XHJcbiAgICB0aGlzLl9saW5rRXhwID0gbmV3IFllc05vRXhwKGZhbHNlKTtcclxuICAgIEZpZWxkRGVmLl9kZWZhdWx0X2RhdGUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmRpc3AybWcoUElDSW50ZXJmYWNlLkRFRkFVTFRfREFURSxcclxuICAgICAgbmV3IFBJQyhcIjZcIiwgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDLCBzdXBlci5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKSxcclxuICAgICAgc3VwZXIuZ2V0VGFzaygpLmdldENvbXBJZHgoKSxcclxuICAgICAgQmxvYlR5cGUuQ09OVEVOVF9UWVBFX1VOS05PV04pO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldCBWaXJBc1JlYWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmlyQXNSZWFsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IElzVmlydHVhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1ZpcnR1YWw7XHJcbiAgfVxyXG5cclxuICBnZXQgSXNFeHBvc2VkUm91dGVQYXJhbSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0V4cG9zZWRSb3V0ZVBhcmFtO1xyXG4gIH1cclxuXHJcbiAgZ2V0IElzRXhwb3NlZFRvQ2xpZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzRXhwb3NlZFRvQ2xpZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbmRleCBpbiB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0IEluZGV4SW5UYWJsZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luZGV4SW5UYWJsZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGZpZWxkIGF0dHJpYnV0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJvdGVjdGVkIHNldEF0dHJpYnV0ZShhdHRyaWJ1dGU6IHN0cmluZywgdmFsdWVTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVGFnUHJvY2Vzc2VkOiBib29sZWFuID0gc3VwZXIuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWVTdHIpO1xyXG4gICAgaWYgKCFpc1RhZ1Byb2Nlc3NlZCkge1xyXG4gICAgICBsZXQgZGF0YTogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKHZhbHVlU3RyLCBcIixcIik7XHJcbiAgICAgIGlzVGFnUHJvY2Vzc2VkID0gdHJ1ZTtcclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVklSVFVBTDpcclxuICAgICAgICAgIHRoaXMuX2lzVmlydHVhbCA9IChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSAhPT0gMCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUEFSQU06XHJcbiAgICAgICAgICB0aGlzLl9pc1BhcmFtID0gKFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpICE9PSAwKTtcclxuICAgICAgICAgIGlmICghdGhpcy5faXNWaXJ0dWFsICYmIHRoaXMuX2lzUGFyYW0pXHJcbiAgICAgICAgICAvLyBwb3NzaWJsZSBlcnJvciAtIHdlIHJlbHkgb24gdGhlIG9yZGVyIG9mIFhNTCBhdHRyaWJ1dGVzXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcclxuICAgICAgICAgICAgICBcImluIEZpZWxkLmluaXRFbGVtZW50cygpOiBub24gdmlydHVhbCBmaWVsZCBpcyBkZWZpbmVkIGFzIGEgcGFyYW1ldGVyXCIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0VYUE9TRURfUk9VVEVfUEFSQU1TOlxyXG4gICAgICAgICAgdGhpcy5faXNFeHBvc2VkUm91dGVQYXJhbSA9IChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSAhPT0gMCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX2lzUGFyYW0gJiYgdGhpcy5faXNFeHBvc2VkUm91dGVQYXJhbSlcclxuICAgICAgICAgIC8vIHBvc3NpYmxlIGVycm9yIC0gd2UgcmVseSBvbiB0aGUgb3JkZXIgb2YgWE1MIGF0dHJpYnV0ZXNcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFxyXG4gICAgICAgICAgICAgIFwiaW4gRmllbGQuaW5pdEVsZW1lbnRzKCk6IG5vbiBwYXJhbWV0ZXIgZmllbGQgaXMgZGVmaW5lZCBhcyBhIGV4cG9zZWQgcm91dGUgcGFyYW1ldGVyXCIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0VYUE9TRURfVE9fQ0xJRU5UOlxyXG4gICAgICAgICAgLy8gVGhlIGZsYWcgd2FzIHNlcmlhbGl6ZWQgb25seSBmb3Igc2VydmVyIHZhcmlhYmxlIChleHBvc2UgdG8gY2xpZW50ID0gMCApXHJcbiAgICAgICAgICBpZiAoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikgPT0gMClcclxuICAgICAgICAgICAgdGhpcy5faXNFeHBvc2VkVG9DbGllbnQgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9WSVJfQVNfUkVBTDpcclxuICAgICAgICAgIHRoaXMuX3ZpckFzUmVhbCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9MTktfQ1JFQVRFOlxyXG4gICAgICAgICAgdGhpcy5fbGlua0NyZWF0ZSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9MTktFWFA6XHJcbiAgICAgICAgICB0aGlzLl9saW5rRXhwLnNldFZhbCg8VGFzaz4odGhpcy5nZXRUYXNrKCkpLCB2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVEFCTEVfTkFNRTpcclxuICAgICAgICAgIHRoaXMuX3RhYmxlTmFtZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5ERVhfSU5fVEFCTEU6XHJcbiAgICAgICAgICB0aGlzLl9pbmRleEluVGFibGUgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTklUOlxyXG4gICAgICAgICAgbGV0IGV4cE51bTogbnVtYmVyID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICB0aGlzLl9pbml0RXhwID0gKDxUYXNrPnRoaXMuZ2V0VGFzaygpKS5nZXRFeHBCeUlkKGV4cE51bSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX05BTUU6IHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NIQUNIRURfRkxEX0lEOlxyXG4gICAgICAgICAgLy8gTUdfQVRUUl9DSEFDSEVEX0ZMRCBpcyBpbiB0aGUgZm9ybWF0IG9mIGNhY2hlZFRhYmxlSWQsZmxkXHJcbiAgICAgICAgICB0aGlzLkNhY2hlVGFibGVGbGRJZHggPSBOTnVtYmVyLlBhcnNlKGRhdGFbMV0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0xPQ0FURTpcclxuICAgICAgICAgIC8vIGxvY2F0ZSBpcyBpbiB0aGUgZm9ybWF0IG9mIG1heCxtaW4gZXhwcmVzc2lvbiBudW0gKC0xIGlmIG5vbiBleGlzdHMpXHJcbiAgICAgICAgICB0aGlzLkxvY2F0ZSA9IG5ldyBCb3VuZGFyeSg8VGFzaz50aGlzLmdldFRhc2soKSwgTk51bWJlci5QYXJzZShkYXRhWzFdKSwgTk51bWJlci5QYXJzZShkYXRhWzBdKSwgdGhpcy5nZXRUeXBlKCksIHRoaXMuZ2V0U2l6ZSgpLCB0aGlzLkNhY2hlVGFibGVGbGRJZHgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1JBTkdFOlxyXG4gICAgICAgICAgLy8gcmFuZ2UgaXMgaW4gdGhlIGZvcm1hdCBvZiBtYXgsbWluIGV4cHJlc3Npb24gbnVtICgtMSBpZiBub24gZXhpc3RzKVxyXG4gICAgICAgICAgdGhpcy5SYW5nZSA9IG5ldyBCb3VuZGFyeSg8VGFzaz50aGlzLmdldFRhc2soKSwgTk51bWJlci5QYXJzZShkYXRhWzFdKSwgTk51bWJlci5QYXJzZShkYXRhWzBdKSwgdGhpcy5nZXRUeXBlKCksIHRoaXMuZ2V0U2l6ZSgpLCB0aGlzLkNhY2hlVGFibGVGbGRJZHgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0xJTks6XHJcbiAgICAgICAgICB0aGlzLl9kYXRhdmlld0hlYWRlcklkID0gTk51bWJlci5QYXJzZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSVNfTElOS19GSUVMRDpcclxuICAgICAgICAgIHRoaXMuX2lzTGlua0ZsZCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpc1RhZ1Byb2Nlc3NlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiVW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJ3swfSdcIiwgYXR0cmlidXRlKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzVGFnUHJvY2Vzc2VkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBhIHJlZmVyZW5jZSB0byB0aGUgUmVjb21wdXRlIE9iamVjdCBvZiB0aGlzIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY29tcFJlZlwiPnJlZmVyZW5jZSB0byBSZWNvbXB1dGUgT2JqZWN0PC9wYXJhbT5cclxuICBzZXRSZWNvbXB1dGUocmVjb21wUmVmOiBSZWNvbXB1dGUpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlY29tcHV0ZSA9IHJlY29tcFJlZjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVtb3ZlcyB0aGUgc3BlY2lmaWMgc3ViZm9ybSB0YXNrIGZyb20gdGhlIHJlY29tcHV0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybVRhc2tcIj48L3BhcmFtPlxyXG4gIFJlbW92ZVN1YmZvcm1Gcm9tUmVjb21wdXRlKHN1YmZvcm1UYXNrOiBUYXNrKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcmVjb21wdXRlICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3JlY29tcHV0ZS5SZW1vdmVTdWJmb3JtKHN1YmZvcm1UYXNrKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW5zZXJ0IHRoZSBzcGVjaWZpYyBzdWJmb3JtIHRhc2sgaW50byB0aGUgZmllbGQgcmVjb21wdXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtVGFza1wiPjwvcGFyYW0+XHJcbiAgQWRkU3ViZm9ybVJlY29tcHV0ZShzdWJmb3JtVGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3JlY29tcHV0ZSA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9yZWNvbXB1dGUgPSBuZXcgUmVjb21wdXRlKCk7XHJcbiAgICAgIHRoaXMuX3JlY29tcHV0ZS5UYXNrID0gPFRhc2s+c3VwZXIuZ2V0VGFzaygpO1xyXG4gICAgICB0aGlzLl9yZWNvbXB1dGUuT3duZXJGbGQgPSB0aGlzO1xyXG4gICAgICB0aGlzLl9yZWNvbXB1dGUuUmNtcE1vZGUgPSBSZWNvbXB1dGVfUmNtcEJ5LkNMSUVOVDtcclxuICAgIH1cclxuICAgIHRoaXMuX3JlY29tcHV0ZS5BZGRTdWJmb3JtKHN1YmZvcm1UYXNrKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGEgcmVmZXJlbmNlIHRvIGEgY29udHJvbCBhdHRhY2hlZCB0byB0aGlzIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj50aGUgY29udHJvbCB3aGljaCBpcyBhdHRhY2hlZCB0byB0aGlzIGZpZWxkPC9wYXJhbT5cclxuICBTZXRDb250cm9sKGN0cmw6IE1nQ29udHJvbEJhc2UpOiB2b2lkIHtcclxuICAgIHN1cGVyLlNldENvbnRyb2woY3RybCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzVmlydHVhbCAmJiBjdHJsLklzUmVwZWF0YWJsZSAmJiB0aGlzLl9pbml0RXhwID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2NhdXNlVGFibGVJbnZhbGlkYXRpb24gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXB1dGUgdGhlIGZpZWxkIGluaXQgZXhwcmVzc2lvbiBvciBnZXQgaXRzIHZhbHVlIGZyb20gdGhlIGRhdGF2aWV3LCBzZXRcclxuICAvLy8gICB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIChhbmQgdXBkYXRlIHRoZSBkaXNwbGF5KVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNvbXB1dGVcIj50ZWxscyB0aGUgY29tcHV0ZSB0byBzdGFydCB0aGUgcmVjb21wdXRlIGNoYWluIGFuZCByZWNvbXB1dGVcclxuICAvLy8gICB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGZpZWxkIChpZiBpdCBpcyByZWFsKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHB1YmxpYyBhc3luYyBjb21wdXRlKHJlY29tcHV0ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJlc3VsdDogUmVmUGFyYW08c3RyaW5nPiA9IG5ldyBSZWZQYXJhbSh0aGlzLmdldFZhbHVlKGZhbHNlKSk7XHJcbiAgICBsZXQgaXNOdWxsRmxkOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbSh0aGlzLl9pc051bGwpO1xyXG4gICAgbGV0IHJlYyA9ICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgIGxldCB0YXNrID0gPFRhc2s+c3VwZXIuZ2V0VGFzaygpO1xyXG5cclxuICAgIGxldCB6ZXJvUmVhbDogYm9vbGVhbiA9IHRoaXMuX2xpbmtDcmVhdGUgJiYgcmVjLkluQ29tcHV0ZSAmJiAhcmVjb21wdXRlICYmIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURTtcclxuICAgIC8vIFFDUiAjOTk5MDI0IC0gemVybyBsbmsgY3JlYXRlIHZhbHVlcyBkdXJpbmcgY29tcHV0ZVxyXG5cclxuICAgIGlmICh0aGlzLl9mb3JtID09IG51bGwpXHJcbiAgICAgIHRoaXMuX2Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG5cclxuICAgIC8vIG5vIG5lZWQgdG8gemVybyByZWFscyBpZiB3ZSBhcmUgcmVjb3ZlcmluZyBhIHJlY29yZC5cclxuICAgIGlmICgodGhpcy5fZm9ybSAhPSBudWxsICYmIHRoaXMuX2Zvcm0uSW5SZXN0b3JlKSB8fCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICB6ZXJvUmVhbCA9IGZhbHNlO1xyXG5cclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TGFzdFJ0RXZlbnQoKTtcclxuICAgIGxldCBjb21wdXRlT25DYW5jZWxFdmVudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHJ0RXZ0ICE9IG51bGwpXHJcbiAgICAgIGNvbXB1dGVPbkNhbmNlbEV2ZW50ID0gcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUw7XHJcblxyXG4gICAgLy8gdmlydHVhbCBhcyByZWFsIGlzIGVzcGVjaWFsbHkgZm9yIGZpZWxkcyB3aGljaCBhcmUgdXNlZCBhcyBhIFwicmV0dXJuIHZhbHVlXCJcclxuICAgIC8vIG9mIGEgbGluay4gVGhlaXIgdmFsdWUgaXMgcmV0dXJuZWQgYnkgdGhlIGxpbmsgcmVzdWx0IGFuZCBub3QgYnkgdGhlIGluaXQgZXhwcmVzc2lvbi5cclxuICAgIC8vIHdoZW4gdGhlIGZvcm0gaXMgcmVzdG9yaW5nIHRoZSBjdXJyIHJvdyB3ZSBzaG91bGRuJ3QgY29tcHV0ZSB0aGUgaW5pdCBleHByZXNzaW9uXHJcbiAgICAvLyBidXQgdG8gdXNlIHRoZSB2YWx1ZSBmcm9tIHRoZSByZWNvcmQgKGJ5IGdldFZhbHVlKVxyXG4gICAgLy8gUUNSIzkyNjc1ODogV2hlbiBUYXNrJ3MgbW9kZSBpcyBDcmVhdGUsIGluaXQgZm9yIHJlYWwgZmllbGQgc2hvdWxkIGJlIGV2YWx1YXRlZCBvbmx5IHdoZW4gaXQgY29tZXMgZm9yIGNhbmNlbCBldmVudChsYXN0IHJ1bnRpbWUgZXZlbnQgaXMgY2FuY2VsIGV2ZW50KS5cclxuICAgIC8vIFdoaWxlIGNyZWF0aW5nIGEgbmV3IHJlY29yZCwgaW5pdCB3aWxsIGJlIGV2YWx1YXRlZCBiZWNhdXNlIG9mIGNvbmRpdGlvbiByZWMuaXNOZXdSZWMoKS4gKEl0IGlzIHRoZSByZWZpeCBvZiBRQ1IjOTk0MDcyKVxyXG4gICAgaWYgKCF0aGlzLl92aXJBc1JlYWwgJiYgKHRoaXMuX2Zvcm0gPT0gbnVsbCB8fCAhdGhpcy5fZm9ybS5JblJlc3RvcmUpICYmXHJcbiAgICAgICgodGhpcy5faXNWaXJ0dWFsIHx8ICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgY29tcHV0ZU9uQ2FuY2VsRXZlbnQpKSB8fCByZWNvbXB1dGUgfHxcclxuICAgICAgICB6ZXJvUmVhbCB8fCByZWMuaXNOZXdSZWMoKSAmJiAhcmVjLmlzQ29tcHV0ZWQoKSkpIHtcclxuICAgICAgaWYgKCF0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpIHx8ICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpICYmICF0aGlzLlBhcnRPZkRhdGF2aWV3KSkge1xyXG4gICAgICAgIC8vIFFDUiAjNzc1NTA4OiBmb3IgZGF0YXZpZXdzLCB3aGljaCBhcmUgY29tcHV0ZWQgYnkgdGhlIHNlcnZlciwgcHJldmVudFxyXG4gICAgICAgIC8vIGNvbXB1dGluZyB0aGUgaW5pdCBleHByZXNzaW9uIHdoaWxlIGluIGNvbXB1dGUgb2YgdGhlIHJlY29yZCBiZWNhdXNlIHRoZVxyXG4gICAgICAgIC8vIHNlcnZlciBoYXZlIGFscmVhZHkgZG9uZSBpdFxyXG4gICAgICAgIGlmICgodGhpcy5faXNWaXJ0dWFsIHx8IHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkgfHwgKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuY29tcHV0ZUJ5Q2xpZW50KCkgfHxcclxuICAgICAgICAgICFyZWMuSW5Db21wdXRlIHx8IHplcm9SZWFsIHx8IHJlYy5sYXRlQ29tcHV0ZSgpKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5faW5pdEV4cCAhPSBudWxsKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5FdmFsdWF0ZUluaXRFeHByZXNzaW9uKHJlc3VsdCwgaXNOdWxsRmxkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKHplcm9SZWFsKVxyXG4gICAgICAgICAgICByZXN1bHQudmFsdWUgPSB0aGlzLmdldERlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2ludmFsaWRWYWx1ZSkge1xyXG4gICAgICB0aGlzLl9wcmV2VmFsdWUgPSByZXN1bHQudmFsdWU7XHJcbiAgICAgIHRoaXMuX3ByZXZJc051bGwgPSBpc051bGxGbGQudmFsdWU7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnNldFZhbHVlKHJlc3VsdC52YWx1ZSwgaXNOdWxsRmxkLnZhbHVlLCByZWNvbXB1dGUsIGZhbHNlLCByZWNvbXB1dGUgJiYgIXRoaXMuX2lzVmlydHVhbCwgZmFsc2UsIGZhbHNlKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGV2YWx1YXRlIGluaXQgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzdWx0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxGbGRcIj48L3BhcmFtPlxyXG4gIGFzeW5jIEV2YWx1YXRlSW5pdEV4cHJlc3Npb24ocmVzdWx0OiBSZWZQYXJhbTxzdHJpbmc+LCBpc051bGxGbGQ6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5faW5pdEV4cCAhPT0gbnVsbCk7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLl9pbkV2YWxQcm9jZXNzID0gdHJ1ZTtcclxuICAgICAgcmVzdWx0LnZhbHVlID0gYXdhaXQgdGhpcy5faW5pdEV4cC5ldmFsdWF0ZVdpdGhSZXN1bHRUeXBlQW5kTGVuZ3RoKHRoaXMuX3R5cGUsIHRoaXMuX3NpemUpO1xyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2luRXZhbFByb2Nlc3MgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpc051bGxGbGQudmFsdWUgPSAocmVzdWx0LnZhbHVlID09PSBudWxsKTtcclxuICAgIGlmIChpc051bGxGbGQudmFsdWUgJiYgdGhpcy5OdWxsQWxsb3dlZCkge1xyXG4gICAgICByZXN1bHQudmFsdWUgPSB0aGlzLmdldFZhbHVlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLy8vXHJcbiAgLy8vLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLy8vIDxwYXJhbSBuYW1lPVwicmVjb21wdXRlXCI+PC9wYXJhbT5cclxuICAvLy8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgLy8gYm9vbCBTaG91bGRSZWNvbXB1dGUoYm9vbCByZWNvbXB1dGUpXHJcbiAgLy8ge1xyXG4gIC8vICAgaWYgKHJlY29tcHV0ZSlcclxuICAvLyAgIHtcclxuICAvLyAgICAgIGJvb2wgY29tcHV0ZWRCeUZldGNoID0gIUlzVmlydHVhbCB8fCBWaXJBc1JlYWw7XHJcbiAgLy8gICAgICBpZiAoY29tcHV0ZWRCeUZldGNoKVxyXG4gIC8vICAgICAge1xyXG4gIC8vICAgICAgICAgVGFzayB0YXNrID0gKFRhc2spZ2V0VGFzaygpO1xyXG4gIC8vICAgICAgICAgRGF0YXZpZXdIZWFkZXJCYXNlIGhlYWRlciA9IHRhc2suZ2V0RGF0YXZpZXdIZWFkZXJzKCkuZ2V0RGF0YXZpZXdIZWFkZXJCeUlkKF9kYXRhdmlld0hlYWRlcklkKTtcclxuICAvLyAgICAgICAgIC8vbG9jYWwgZGF0YXZhc2UgYWxyZWFkeSBjb21wdXRlZCB0aGUgcmVjb3JkIGFzIHNlcnZlciBkb2VzXHJcbiAgLy8gICAgICAgICBpZiAoaGVhZGVyIGlzIExvY2FsRGF0YXZpZXdIZWFkZXIpXHJcbiAgLy8gICAgICAgICB7XHJcbiAgLy8gICAgICAgICAgICAgdmFyIHJlYyA9ICgoRGF0YVZpZXcpX2RhdGF2aWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgLy8gICAgICAgICAgICAgcmV0dXJuICFyZWMuSW5Db21wdXRlO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIHJlY29tcHV0ZTtcclxuICAvLyB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaGVja051bGxBcml0aG1ldGljXCI+aWYgdHJ1ZSB0aGVuIHRoZSBudWxsIGFyaXRobWV0aWMgZW52aXJvbm1lbnRcclxuICAvLy8gICBzZXR0aW5nIGlzIHVzZWQgdG8gcmV0dXJuIG51bGwgd2hlbiBcIm51bGxpZnlcIiBjb21wdXRhdGlvbiBpcyBuZWVkZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICBnZXRWYWx1ZShjaGVja051bGxBcml0aG1ldGljOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIC8vIGlmIHdlIG5lZWQgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgZmllbGRcclxuICAgIGlmICgoPFRhc2s+c3VwZXIuZ2V0VGFzaygpKS5nZXRFdmFsT2xkVmFsdWVzKCkpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldE9yaWdpbmFsVmFsdWUoKTtcclxuICAgIGlmICh0aGlzLl9pbnZhbGlkVmFsdWUpXHJcbiAgICAgIHRoaXMudGFrZVZhbEZyb21SZWMoKTtcclxuICAgIGlmICh0aGlzLl9pc051bGwpXHJcbiAgICAgIHRoaXMuX3ZhbCA9IHRoaXMuZ2V0VmFsdWVGb3JOdWxsKGNoZWNrTnVsbEFyaXRobWV0aWMpO1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaXNDaGFuZ2VkKG5ld1ZhbHVlOiBzdHJpbmcsIGlzTnVsbDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXZWYWx1ZSAhPT0gbnVsbCAmJiAoISh0aGlzLl9wcmV2VmFsdWUgPT09IG5ld1ZhbHVlKSB8fCB0aGlzLl9wcmV2SXNOdWxsICE9PSBpc051bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGJ5IHRha2luZyBpdCBmcm9tIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgdGFrZVZhbEZyb21SZWMoKTogdm9pZCB7XHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICBpZiAocmVjICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3ZhbCA9IHJlYy5HZXRGaWVsZFZhbHVlKHRoaXMuX2lkKTtcclxuICAgICAgdGhpcy5faXNOdWxsID0gcmVjLklzTnVsbCh0aGlzLl9pZCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5faW52YWxpZFZhbHVlKSB7XHJcbiAgICAgIGlmIChyZWMgIT09IG51bGwgJiYgdGhpcy5fY2F1c2VUYWJsZUludmFsaWRhdGlvbiAmJiB0aGlzLmlzQ2hhbmdlZCh0aGlzLl92YWwsIHRoaXMuX2lzTnVsbCkgJiYgdGhpcy5fZm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgIHJlYy5zZXRDYXVzZUludmFsaWRhdGlvbih0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWUgPSB0aGlzLl92YWw7XHJcbiAgICAgIHRoaXMuX3ByZXZJc051bGwgPSB0aGlzLl9pc051bGw7XHJcbiAgICAgIHRoaXMuX2ludmFsaWRWYWx1ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gWkVSTyBUSEUgVkVDVE9SIE9CSkVDVFxyXG4gICAgdGhpcy5fdmVjdG9yVHlwZSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgZmllbGQgd2l0aG91dCB1cGRhdGluZyB0aGUgZmllbGQgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE9yaWdpbmFsVmFsdWUoKTogc3RyaW5nIHtcclxuICAgIGxldCBvcmlnaW5hbFJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0T3JpZ2luYWxSZWMoKTtcclxuXHJcbiAgICBpZiAob3JpZ2luYWxSZWMuSXNOdWxsKHRoaXMuX2lkKSlcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuXHJcbiAgICByZXR1cm4gb3JpZ2luYWxSZWMuR2V0RmllbGRWYWx1ZSh0aGlzLl9pZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaXMgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGZpZWxkIHdhcyBudWxsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc09yaWdpbmFsVmFsdWVOdWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IG9yaWdpbmFsUmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRPcmlnaW5hbFJlYygpO1xyXG4gICAgcmV0dXJuIG9yaWdpbmFsUmVjLklzTnVsbCh0aGlzLl9pZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHZhbHVlIGJ5IHJlYyBpZHhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+cmVjb3JkIGlkeDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRWYWx1ZUJ5UmVjSWR4KGlkeDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCByZWM6IFJlY29yZCA9ICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldFJlY0J5SWR4KGlkeCk7XHJcbiAgICBsZXQgZmllbGRWYWx1ZTogc3RyaW5nID0gcmVjLkdldEZpZWxkVmFsdWUodGhpcy5faWQpO1xyXG4gICAgcmV0dXJuIHJlYy5Jc051bGwodGhpcy5faWQpID8gdGhpcy5nZXRWYWx1ZUZvck51bGwoZmFsc2UpIDogZmllbGRWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgbW9kaWZpZWRBdExlYXN0T25jZSBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldE1vZGlmaWVkQXRMZWFzdE9uY2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RpZmllZEF0TGVhc3RPbmNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBudWxsIGlmIHZhbHVlIG9mIGZpZWxkIGZvciB0aGUgcmVjb3JkIGlzIG51bGxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+cmVjb3JkIGlkeDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc051bGxCeVJlY0lkeChpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0UmVjQnlJZHgoaWR4KTtcclxuICAgIHJldHVybiByZWMuSXNOdWxsKHRoaXMuX2lkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgZmllbGQncyB2YWx1ZSBmb3IgcmVjb3JkIGlkeCByZWNpZHggZXF1YWxzIHRvIG1nVmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1nVmFsdWVcIj52YWx1ZSB0byBjb21wYXJlICA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbEZsZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZVwiPnR5cGUgb2YgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY0lkeFwiPnJlY0lkeCBvZiB0aGUgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzRXF1YWwobWdWYWx1ZTogc3RyaW5nLCBpc051bGxGbGQ6IGJvb2xlYW4sIHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIHJlY0lkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVjID0gPFJlY29yZD4oKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0UmVjQnlJZHgocmVjSWR4KSk7XHJcbiAgICBsZXQgdmFsc0VxdWFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAocmVjICE9IG51bGwpIHtcclxuICAgICAgbGV0IGZpZWxkVmFsdWU6IHN0cmluZyA9IHJlYy5HZXRGaWVsZFZhbHVlKHRoaXMuX2lkKTtcclxuICAgICAgbGV0IGZpZWxzSXNOdWxsOiBib29sZWFuID0gcmVjLklzTnVsbCh0aGlzLl9pZCk7XHJcbiAgICAgIHZhbHNFcXVhbCA9IEV4cHJlc3Npb25FdmFsdWF0b3IubWdWYWxzRXF1YWwoZmllbGRWYWx1ZSwgZmllbHNJc051bGwsIHRoaXMuX3R5cGUsIG1nVmFsdWUsIGlzTnVsbEZsZCwgdHlwZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsc0VxdWFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgd2hpY2ggc2hvdWxkIGJlIGluc2VydGVkIGludG8gYSBuZXcgcmVjLCB3aGVuIGl0XHJcbiAgLy8vICAgaXMgY3JlYXRlZC4gVGhpcyB3aWxsIHVzdWFsbHkgYmUgdGhlIGZpZWxkJ3MgZGVmYXVsdCB2YWx1ZSwgdW5sZXNzIHRoZXJlIGlzIGFcclxuICAvLy8gICB2aXJ0dWFsIGZpZWxkIHdpdGhvdXQgYW4gaW5pdCBleHByZXNzaW9uLiBJbiB0aGlzIGNhc2UsIHRoZSBjdXJyZW50IHZhbHVlIHdpbGwgYmVcclxuICAvLy8gICByZXR1cm5lZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNsb2JiZXJlZE9ubHlcIj5jbG9iYmVyZWRPbmx5IGlzIHRydWUgaWYgd2Ugd2FudCB0byBvbmx5IHRha2UgdGhlIHZhbHVlcyBvZiB0aGUgdmlydHVhbHMgd2l0aCBubyBpbml0IGV4cHJlc3Npb248L3BhcmFtPlxyXG4gIGdldE5ld1JlY1ZhbHVlKGNsb2JiZXJlZE9ubHk6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX2lzVmlydHVhbCAmJiB0aGlzLl9pbml0RXhwID09IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLl92YWw7XHJcbiAgICByZXR1cm4gIWNsb2JiZXJlZE9ubHkgPyB0aGlzLmdldERlZmF1bHRWYWx1ZSgpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNldFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUodmFsOiBzdHJpbmcsIGlzTnVsbEZsZDogYm9vbGVhbiwgcmVjb21wdXRlOiBib29sZWFuLCBzZXRSZWNvcmRVcGRhdGVkOiBib29sZWFuLCBpc0FyZ1VwZGF0ZTogYm9vbGVhbiwgZW5mb3JjZVZhcmlhYmxlQ2hhbmdlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGVuZm9yY2VWYXJpYWJsZUNoYW5nZSkpXHJcbiAgICAgIGVuZm9yY2VWYXJpYWJsZUNoYW5nZSA9IGZhbHNlO1xyXG4gICAgYXdhaXQgdGhpcy5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlXzEodmFsLCBpc051bGxGbGQsIHJlY29tcHV0ZSwgc2V0UmVjb3JkVXBkYXRlZCwgaXNBcmdVcGRhdGUsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxsIHRoZSBzZXQgdmFsdWUgZnVuY3Rpb24gZnJvbSB0aGUgXCJvdXRlclwiIHdvcmxkLiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgcmVjb21wdXRlXHJcbiAgLy8vICAgY2hhaW4uIFdoZW4gcmVjb21wdXRlIGlzIGRvbmUgLSByZWZyZXNoIGNvbnRyb2xzIHdoaWNoIGFyZSBleHByZXNzaW9uIGRlcGVuZGVudC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbFwiPnRoZSBuZXcgdmFsdWUgb2YgdGhlIGZpZWxkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxGbGRcIj5pZiB0cnVlIHRoZW4gdGhlIHZhbHVlIGlzIG51bGw8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY29tcHV0ZVwiPnN0YXRlcyB3aGV0aGVyIHRvIGV4ZWN1dGUgcmVjb21wdXRlIHdoZW4gc2V0dGluZyB0aGUgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY29tcHV0ZU9ubHlXaGVuVXBkYXRlVmFsdWVcIj46IGRvIHRoZSByZWNvbXB1dGUgb25seSB3aGVuIHRoZSB2YWx1ZSB3YXMgdXBkYXRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXRSZWNvcmRVcGRhdGVkXCI+dGVsbHMgd2hldGhlciB0byBkZWZpbmUgdGhlIHJlY29yZCBhcyB1cGRhdGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc0FyZ1VwZGF0ZVwiPnRydWUgaWYgY2FsbGVkIGZvciBoYW5kbGVyIGFyZ3VtZW50LXBhcmFtZXRlciBjb3B5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbmZvcmNlVmFyaWFibGVDaGFuZ2VcIj5leGVjdXRlIHZhaWFibGUgY2hhbmdlIGV2ZW4gd2hlbiByZWNvbXB1dGUgaXMgZmFsc2U8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZV8xKHZhbDogc3RyaW5nLCBpc051bGxGbGQ6IGJvb2xlYW4sIHJlY29tcHV0ZTogYm9vbGVhbiwgc2V0UmVjb3JkVXBkYXRlZDogYm9vbGVhbiwgaXNBcmdVcGRhdGU6IGJvb2xlYW4sIGVuZm9yY2VWYXJpYWJsZUNoYW5nZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2sgPSA8VGFzaz50aGlzLmdldFRhc2soKTtcclxuICAgIGlmICh0YXNrICE9IG51bGwpXHJcbiAgICAgIHRhc2suVmV3Rmlyc3QrKztcclxuXHJcbiAgICBsZXQgdmFsdWVXYXNVcGRhdGVkOiBib29sZWFuID0gYXdhaXQgdGhpcy5zZXRWYWx1ZSh2YWwsIGlzTnVsbEZsZCwgcmVjb21wdXRlLCBzZXRSZWNvcmRVcGRhdGVkLCAhdGhpcy5faXNWaXJ0dWFsLCBpc0FyZ1VwZGF0ZSwgZW5mb3JjZVZhcmlhYmxlQ2hhbmdlKTtcclxuXHJcbiAgICAvLyBBIGZpZWxkIHRoYXQgaXMgYW4gZXZlbnQgaGFuZGxlciBmaWVsZCBjYW5ub3QgYXBwZWFyIGFzIGEgcHJvcGVydHkgaW4gZ3VpLiBubyBuZWVkIHRvIHJlZnJlc2ggYWxsXHJcbiAgICAvLyBmb3JtK2NvbnRyb2xzIHByb3BlcnRpZXMgZXhwcmVzc2lvbnMgZm9yIGl0LlxyXG4gICAgaWYgKHRhc2sgIT09IG51bGwgJiYgdGFzay5WZXdGaXJzdCA9PT0gMSAmJiB0aGlzLl9mb3JtICE9PSBudWxsICYmICF0aGlzLklzRXZlbnRIYW5kbGVyRmllbGQpIHtcclxuICAgICAgaWYgKHJlY29tcHV0ZSAmJiB2YWx1ZVdhc1VwZGF0ZWQpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fZm9ybS5yZWZyZXNoT25FeHByZXNzaW9ucygpO1xyXG5cclxuICAgIH1cclxuICAgIGlmICh0YXNrICE9IG51bGwpXHJcbiAgICAgIHRhc2suVmV3Rmlyc3QtLTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgY3VycmVudCByZWNvcmQgYW5kIHVwZGF0ZSB0aGUgZGlzcGxheVxyXG4gIC8vLyAgIHRoZSBmaWVsZCBtdXN0IGJlIGluIGEgbWFnaWMgaW50ZXJuYWwgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXdWYWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmaWVsZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsRmxkXCI+aWYgdHJ1ZSB0aGVuIHRoZSB2YWx1ZSBpcyBudWxsPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNvbXB1dGVcIj5zdGF0ZXMgd2hldGhlciB0byBleGVjdXRlIHJlY29tcHV0ZSB3aGVuIHNldHRpbmcgdGhlIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXRSZWNvcmRNb2RpZmllZFwiPnN0YXRlcyB3aGV0aGVyIHRvIGRlZmluZSB0aGUgcmVjb3JkIGFzIG1vZGlmaWVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXRDcnNyTW9kaWZpZWRcIj5zdGF0ZXMgd2hldGhlciB0byBkZWZpbmUgdGhlIGN1cnNvciBvZiB0aGUgZmllbGQgYXMgbW9kaWZpZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzQXJnVXBkYXRlXCI+dHJ1ZSBpZiBjYWxsZWQgZm9yIGhhbmRsZXIgYXJndW1lbnQtcGFyYW1ldGVyIGNvcHk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50aGUgcmV0dXJuIHZhbHVlIHdhcyB1cGRhdGVkIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIHNldFZhbHVlKG5ld1ZhbDogc3RyaW5nLCBpc051bGxGbGQ6IGJvb2xlYW4sIHJlY29tcHV0ZTogYm9vbGVhbiwgc2V0UmVjb3JkTW9kaWZpZWQ6IGJvb2xlYW4sIHNldENyc3JNb2RpZmllZDogYm9vbGVhbiwgaXNBcmdVcGRhdGU6IGJvb2xlYW4sIGVuZm9yY2VWYWxpYWJsZUNoYW5nZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHJlYzogUmVjb3JkO1xyXG4gICAgbGV0IHJlY0ZsZFZhbDogc3RyaW5nO1xyXG4gICAgbGV0IHZhbHNFcXVhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHJlbWFpbmRlcjogbnVtYmVyO1xyXG4gICAgbGV0IHplcm9SZWFsOiBib29sZWFuO1xyXG4gICAgbGV0IGFyZ3M6IEFyZ3VtZW50c0xpc3QgPSBudWxsO1xyXG4gICAgbGV0IG1haW5DdHJsID0gdGhpcy5nZXRDdHJsKCk7XHJcbiAgICBsZXQgcGVuZGluZ0V2ZW50czogbnVtYmVyO1xyXG4gICAgbGV0IGV2dHM6IExpc3Q8RmllbGQgfCBSdW5UaW1lRXZlbnQ+O1xyXG4gICAgbGV0IGZvcmNlVXBkYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgY2hlY2tGb3JWYXJpYWJsZUNoYW5nZTogYm9vbGVhbiA9IHJlY29tcHV0ZSB8fCBlbmZvcmNlVmFsaWFibGVDaGFuZ2U7XHJcblxyXG4gICAgbGV0IHRhc2sgPSA8VGFzaz50aGlzLmdldFRhc2soKTtcclxuICAgIGlmICh0aGlzLl9mb3JtID09PSBudWxsKVxyXG4gICAgICB0aGlzLl9mb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuXHJcbiAgICBpZiAoaXNOdWxsRmxkICYmICF0aGlzLk51bGxBbGxvd2VkICYmIHRoaXMuX3R5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgbmV3VmFsID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoKTtcclxuICAgICAgaXNOdWxsRmxkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSIzgwNTM2NDogRm9yIGFueSBmaWVsZCwgd2Ugc3RvcmUgdGhlIHZhbHVlIGluIGZpZWxkIGFzIGl0IGlzICh3aXRob3V0IGNoZWNraW5nIHRoZSBwaWN0dXJlKS5cclxuICAgIC8vIEJ1dCBmb3IgTnVtZXJpYyBmaWVsZCwgaWYgcGljdHVyZSBkb2VzIG5vdCBjb250YWluIGRlY2ltYWxzIHRoZW4gd2Ugc2hvdWxkIHJvdW5kIG9mZiB0aGUgdmFsdWUgYW5kIHRoZW4gc2F2ZSB0aGlzIHZhbHVlIGluIGZpZWxkXHJcbiAgICAvLyBvdGhlcndpc2UgaXQgd2lsbCBnaXZlIHdyb25nIGNhbGN1bGF0aW9uLiBTbyBhbHdheXMgcm91bmQgb2ZmIHRoZSB2YWx1ZSBkZXBlbmRpbmcgb24gcGljdHVyZSdzIGRlY2ltYWwuXHJcbiAgICAvLyBjaGVjayBpZiBuZXdWYWwgaXMgXCJsb25nXCIgc2luY2UgdGhlcmUgaXMgbm8gcmVhc29uIHRvIHJvdW5kIGFuIGFscmVhZHkgd2hvbGUgbnVtYmVyXHJcbiAgICBpZiAodGhpcy5fdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDICYmIG5ld1ZhbCAhPSBudWxsICYmICFOVU1fVFlQRS5udW1IZXhTdHJJc0xvbmcobmV3VmFsKSkge1xyXG4gICAgICBsZXQgbnVtVmFsID0gbmV3IE5VTV9UWVBFKG5ld1ZhbCk7XHJcbiAgICAgIGxldCBwaWMgPSBuZXcgUElDKHRoaXMuX3BpY3R1cmUsIHRoaXMuX3R5cGUsIHN1cGVyLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICBsZXQgZGVjczogbnVtYmVyID0gcGljLmdldERlYygpO1xyXG4gICAgICBudW1WYWwucm91bmQoZGVjcyk7XHJcbiAgICAgIG5ld1ZhbCA9IG51bVZhbC50b1hNTHJlY29yZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlYyA9ICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgIGlmIChyZWMgPT0gbnVsbClcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKExhbmd1YWdlRGF0YS5JbnN0YW5jZS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlJUX1NUUl9OT19SRUNTX0lOX1JORykpO1xyXG5cclxuICAgIC8vIGRvbid0IGFsbG93IHVwZGF0aW5nIFJFQUwgZmllbGRzLCB1bmxlc3MgJ2FsbG93IHVwZGF0ZSBpbiBxdWVyeSBtb2RlJyBpcyBzZXQgdG8gVFJVRVxyXG4gICAgaWYgKCF0aGlzLklzVmlydHVhbCAmJlxyXG4gICAgICAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiZcclxuICAgICAgICAhRW52aXJvbm1lbnQuSW5zdGFuY2UuYWxsb3dVcGRhdGVJblF1ZXJ5TW9kZSh0YXNrLmdldENvbXBJZHgoKSlcclxuICAgICAgICB8fCByZWMuSW5Gb3JjZVVwZGF0ZSAmJiByZWMuSW5Db21wdXRlKSlcclxuICAgICAgcmV0dXJuICF2YWxzRXF1YWw7XHJcblxyXG4gICAgaWYgKGNoZWNrRm9yVmFyaWFibGVDaGFuZ2UgJiYgdGhpcy5nZXRIYXNDaGFuZ2VFdmVudCgpKSB7XHJcbiAgICAgIGxldCBhcmdzTGlzdCA9IG5ldyBBcnJheSgyKTtcclxuICAgICAgYXJnc0xpc3RbMF0gPSBuZXcgRXhwVmFsKFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQywgZmFsc2UsXHJcbiAgICAgICAgKG1haW5DdHJsICE9PSBudWxsICYmIG1haW5DdHJsLklzSW50ZXJhY3RpdmVVcGRhdGVcclxuICAgICAgICAgID8gRmllbGQuTlVNMC50b1hNTHJlY29yZCgpXHJcbiAgICAgICAgICA6IEZpZWxkLk5VTTEudG9YTUxyZWNvcmQoKSkpO1xyXG4gICAgICBhcmdzTGlzdFsxXSA9IG5ldyBFeHBWYWwodGhpcy5nZXRUeXBlKCksIHRoaXMuaXNOdWxsKCksIHRoaXMuZ2V0VmFsdWUoZmFsc2UpKTtcclxuICAgICAgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIH1cclxuICAgIGlmIChtYWluQ3RybCAhPSBudWxsKVxyXG4gICAgICBtYWluQ3RybC5Jc0ludGVyYWN0aXZlVXBkYXRlID0gZmFsc2U7XHJcblxyXG4gICAgLy8gdXBkYXRlIHRoZSBmaWVsZCBpbiB0aGUgY3VycmVudCByZWNvcmRcclxuICAgIGlmICh0aGlzLl90eXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICAvLyBjb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzLCBub3QgY2hhcmFjdGVycyAoSlBOOiBEQkNTIHN1cHBvcnQpXHJcbiAgICAgIGlmIChuZXdWYWwgIT0gbnVsbClcclxuICAgICAgICByZW1haW5kZXIgPSB0aGlzLl9zaXplIC0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIobmV3VmFsKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJlbWFpbmRlciA9IDA7XHJcblxyXG4gICAgICBpZiAobmV3VmFsICE9IG51bGwgJiYgdGhpcy5fdHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CICYmIHRoaXMuX3R5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IgJiZcclxuICAgICAgICByZW1haW5kZXIgPCAwKVxyXG4gICAgICAgIHRoaXMuX3ZhbCA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihuZXdWYWwsIHRoaXMuX3NpemUpO1xyXG4gICAgICBlbHNlIGlmICh0aGlzLl90eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBICYmIHJlbWFpbmRlciA+IDApXHJcbiAgICAgICAgdGhpcy5fdmFsID0gbmV3VmFsICsgTlN0cmluZy5Gcm9tQ2hhcnModGhpcy5fc3BhY2VzLCAwICwgcmVtYWluZGVyKTtcclxuICAgICAgZWxzZSBpZiAodGhpcy5fdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKVxyXG4gICAgICAgIHRoaXMuX3ZhbCA9IEJsb2JUeXBlLmNvcHlCbG9iKHRoaXMuX3ZhbCwgbmV3VmFsKTtcclxuICAgICAgZWxzZSB0aGlzLl92YWwgPSBuZXdWYWw7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKG5ld1ZhbCAhPSBudWxsKVxyXG4gICAgICAgIHJlbWFpbmRlciA9IHRoaXMuX3NpemUgLSBuZXdWYWwubGVuZ3RoO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmVtYWluZGVyID0gMDtcclxuXHJcbiAgICAgIGlmIChuZXdWYWwgIT0gbnVsbCAmJiB0aGlzLl90eXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgJiYgdGhpcy5fdHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUiAmJiByZW1haW5kZXIgPCAwKVxyXG4gICAgICAgIHRoaXMuX3ZhbCA9IG5ld1ZhbC5zdWJzdHIoMCwgdGhpcy5fc2l6ZSk7XHJcbiAgICAgIGVsc2UgaWYgKCh0aGlzLl90eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX3R5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkgJiYgcmVtYWluZGVyID4gMClcclxuICAgICAgICB0aGlzLl92YWwgPSBuZXdWYWwgKyAgTlN0cmluZy5Gcm9tQ2hhcnModGhpcy5fc3BhY2VzLCAwICwgcmVtYWluZGVyKTtcclxuICAgICAgZWxzZSBpZiAodGhpcy5fdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB7XHJcbiAgICAgICAgLy8gRW5zdXJlIF92YWwgaXMgbm90IG51bGwsIHNvIHRoYXQgdGhlIGJsb2IgY29weSB3aWxsIGJlXHJcbiAgICAgICAgLy8gZG9uZSBjb3JyZWN0bHksIGFjY29yZGluZyB0byB0aGUgZmllbGQncyBibG9iIHR5cGUuXHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbCA9PT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuX3ZhbCA9IHRoaXMuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICB0aGlzLl92YWwgPSBCbG9iVHlwZS5jb3B5QmxvYih0aGlzLl92YWwsIG5ld1ZhbCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB0aGlzLl92YWwgPSBuZXdWYWw7XHJcbiAgICB9XHJcbiAgICAvLyBJZiBkb3RuZXQgdmFyIGlzIHVwZGF0ZWQgd2l0aCBuZXcgYmxvYnByZWZpeCwgdmFsc0VxdWFsIGlzIGZhbHNlLCB3ZSBzaG91bGQgbm90IGNoZWNrIGluIHJlY29yZC5cclxuICAgIHtcclxuICAgICAgcmVjRmxkVmFsID0gcmVjLkdldEZpZWxkVmFsdWUodGhpcy5faWQpO1xyXG5cclxuICAgICAgLy8gSW4gb3JkZXIgdG8gY29tcGFyZSwgSWYgdmlydHVhbCdzIG9sZCB2YWx1ZSBpcyB0YWtlbiBmcm9tIHJlY29yZCwgdGhlbiBvbGQgaXNOdWxsIHZhbHVlIGFsc28gc2hvdWxkIGJlIHRha2VuIGZyb20gcmVjb3JkLlxyXG4gICAgICAvLyBUaGlzIHNob3VsZCBiZSBkb25lIG9ubHkgaWYgbm90IGluIHJlLWNvbXB1dGUgLyBub3QgYXJndW1lbnQgLyBubyBpbml0RXhwLilcclxuICAgICAgLy8gTWFpbmx5ICwgdGhpcyBpcyBuZWVkZWQsIHdoZW4gY3Vyc29yIGlzIHBhcmtlZCBvbiBvbmUgcmVjb3JkIGFuZCB2aXJ0dWFsIGlzIG1vZGlmaWVkIGZyb20gbnVsbCB0byBub25udWxsIG9yIHZpY2V2ZXJzYSBhbmRcclxuICAgICAgLy8gbm93IGlmIGN1cnNvciBtb3ZlcyBmcm9tIG9uZSByZWNvcmQgdG8gbmV4dCByZWNvcmQsIFdlIG5lZWQgdG8gIGdldCB0aGUgb2xkIG51bGwgdmFsdWUgZnJvbSByZWNvcmQuXHJcblxyXG4gICAgICBsZXQgb2xkTnVsbFZhbDogYm9vbGVhbiA9IHRoaXMuX2lzTnVsbDtcclxuICAgICAgaWYgKCFyZWNvbXB1dGUgJiYgIWlzQXJnVXBkYXRlICYmIHRoaXMuX2luaXRFeHAgPT0gbnVsbClcclxuICAgICAgICBvbGROdWxsVmFsID0gcmVjLklzTnVsbCh0aGlzLl9pZCk7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHZhbHNFcXVhbCA9IEV4cHJlc3Npb25FdmFsdWF0b3IubWdWYWxzRXF1YWwodGhpcy5fdmFsLCBpc051bGxGbGQsIHRoaXMuX3R5cGUsIHJlY0ZsZFZhbCwgb2xkTnVsbFZhbCwgdGhpcy5fdHlwZSk7XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICAgIHRoaXMuX3ZhbCA9IHRoaXMuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICB2YWxzRXF1YWwgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICAgIC8vIHplcm8gdGhlIHZlY3RvclxyXG4gICAgaWYgKHRoaXMuX2NsZWFyVmVjdG9yVHlwZSlcclxuICAgICAgdGhpcy5fdmVjdG9yVHlwZSA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5faW52YWxpZFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX2ludmFsaWRWYWx1ZSA9IGZhbHNlO1xyXG4gICAgICByZWMuY2xlYXJGbGFnKHRoaXMuX2lkLCBSZWNvcmQuRkxBR19VUERBVEVEKTtcclxuICAgICAgcmVjLmNsZWFyRmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfTU9ESUZJRUQpO1xyXG4gICAgfVxyXG4gICAgLy8gZHVyaW5nIGNvbXB1dGUsIHdlIHNob3VsZCB6ZXJvIGZpZWxkcyB3aGljaCBiZWxvbmcgdG8gbGluayBjcmVhdGUuXHJcbiAgICB6ZXJvUmVhbCA9IHRoaXMuX2xpbmtDcmVhdGUgJiYgcmVjLkluQ29tcHV0ZSAmJiAhcmVjb21wdXRlICYmICh0aGlzLl9mb3JtID09IG51bGwgfHwgIXRoaXMuX2Zvcm0uSW5SZXN0b3JlKSAmJlxyXG4gICAgICAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTtcclxuXHJcbiAgICAvLyBWaXJ0dWFscyB3aXRob3V0IGluaXQgZXhwcmVzc2lvbiBhcmUgY29waWVkIGZyb20gb25lIHJlY29yZCB0byBhbm90aGVyLCBldmVuIGF0XHJcbiAgICAvLyBjb21wdXRlIHRpbWUgKG5vIHJlY29tcHV0ZSkuIE5ldmVydGhlbGVzcywgaW4gY2FzZSB0aGVpciB2YWx1ZSBjaGFuZ2VzLCB3ZSBtdXN0XHJcbiAgICAvLyBwZXJmb3JtIHJlY29tcHV0ZS5cclxuICAgIGlmICgodGhpcy5faXNWaXJ0dWFsIHx8IHplcm9SZWFsKSAmJiAhcmVjLmlzTmV3UmVjKCkgJiYgIXZhbHNFcXVhbClcclxuICAgICAgZm9yY2VVcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgIC8vIGlmIHRoZSByZWNvbXB1dGUgaXMgZmFsc2UgaXQgbWVhbnMgdGhhdCB0aGUgdXNlciBpcyBzZXR0aW5nIGEgdmFsdWVcclxuICAgIC8vIHRoYXQgaXRzIHNvdXJjZSBpcyB0aGUgcmVjb3JkLCB0aHVzLCB3ZSBkb24ndCBoYXZlIHRvIHVwZGF0ZSB0aGUgcmVjb3JkLlxyXG4gICAgLy8gaWYgdGhlIHJlY29tcHV0ZSBpcyB0cnVlLCBnbyBhaGVhZCBhbmQgdXBkYXRlIHRoZSByZWNvcmQuXHJcbiAgICBpZiAoY2hlY2tGb3JWYXJpYWJsZUNoYW5nZSB8fCBmb3JjZVVwZGF0ZSB8fCByZWMuaXNOZXdSZWMoKSkge1xyXG4gICAgICB0aGlzLlVwZGF0ZU51bGwoaXNOdWxsRmxkLCByZWMpO1xyXG5cclxuICAgICAgaWYgKHNldENyc3JNb2RpZmllZClcclxuICAgICAgICByZWMuc2V0RmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfQ1JTUl9NT0RJRklFRCk7XHJcbiAgICAgIHJlYy5zZXRGaWVsZFZhbHVlKHRoaXMuX2lkLCB0aGlzLl92YWwsIHNldFJlY29yZE1vZGlmaWVkKTtcclxuICAgICAgZXZ0cyA9IEZpZWxkLl92YXJpYWJsZUNoYW5nZUV2dHM7XHJcbiAgICAgIHBlbmRpbmdFdmVudHMgPSBldnRzLmxlbmd0aDtcclxuICAgICAgaWYgKGNoZWNrRm9yVmFyaWFibGVDaGFuZ2UgJiYgdGhpcy5nZXRIYXNDaGFuZ2VFdmVudCgpICYmICFldnRzLkNvbnRhaW5zKHRoaXMpICYmICF2YWxzRXF1YWwpIHtcclxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHZhcmlhYmxlIGNoYW5nZSBoYW5kbGVyIC0gc2F2ZSB2YWx1ZSBhbmQgcHJlcGFyZSBwYXJhbXNcclxuICAgICAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KHRoaXMpO1xyXG4gICAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRSk7XHJcbiAgICAgICAgcnRFdnQuc2V0QXJnTGlzdChhcmdzKTtcclxuICAgICAgICBldnRzLnB1c2godGhpcyk7XHJcbiAgICAgICAgZXZ0cy5wdXNoKHJ0RXZ0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gY2hlY2sgZm9yIHJlY29tcHV0ZSBhbmQgZXhlY3V0ZSBpdFxyXG4gICAgICAvLyBRQ1IgIzI5OTYwOSwgaWYgd2UgYXJlIGluIGxvY2FsIGRhdGF2aWV3IG1hbmFnZXIsIHdlIGNhbiBvbmx5IGNvbXB1dGUuXHJcbiAgICAgIC8vIFJlY29tcHV0ZSBpcyBub3QgYWxsb3dlZCwgc2luY2UgaXQgd2lsbCBiZSBleGVjdXRlZCBtdWx0aXBsZSB0aW1lc1xyXG4gICAgICBpZiAodGhpcy5fcmVjb21wdXRlICE9IG51bGwgJiYgKHJlY29tcHV0ZSB8fCBmb3JjZVVwZGF0ZSkgJiYgISg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLkluTG9jYWxEYXRhdmlld0NvbW1hbmQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gaWYgZmllbGQgY2F1c2VkIHRhYmxlIGludmFsaWRhdGlvbiBhbmQgaXQncyB2YWx1ZSB3YXMgY2hhbmdlZFxyXG4gICAgICAgICAgaWYgKGZvcmNlVXBkYXRlKVxyXG4gICAgICAgICAgICByZWMuSW5Gb3JjZVVwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLl9yZWNvbXB1dGUuZXhlY3V0ZShyZWMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICBpZiAoZm9yY2VVcGRhdGUpXHJcbiAgICAgICAgICAgIHJlYy5JbkZvcmNlVXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9jYXVzZVRhYmxlSW52YWxpZGF0aW9uICYmIHRoaXMuaXNDaGFuZ2VkKHRoaXMuX3ZhbCwgaXNOdWxsRmxkKSlcclxuICAgICAgICByZWMuc2V0Q2F1c2VJbnZhbGlkYXRpb24odHJ1ZSk7XHJcblxyXG4gICAgICAvLyBEb24ndCB1cGRhdGUgY29udHJvbHMgd2hpbGUgZmV0Y2hpbmcgcmVjb3JkcyBmcm9tIGxvY2FsIGRhdGFiYXNlLiBJZiB0aGUgdGFzayBoYXMgYSB0YWJsZSBjb250cm9sLCB0aGVuIGFjdHVhbCBjb250cm9scyBvbiB0aGVcclxuICAgICAgLy8gcm93cyBhcmUgY3JlYXRlZCBhZnRlciBuby4gb2Ygcm93cyBpcyBrbm93biAoYW5kIHRoaXMgaXMgYWZ0ZXIgdGhlIGRhdGEgaXMgYXZhaWFsYWJsZSkuIFNvLCB3aGlsZSBmZXRjaGluZyByZWNvcmRzLCBjb250cm9scyBpblxyXG4gICAgICAvLyB0YWJsZSBhcmUgbm90IHlldCBjcmVhdGVkIGFuZCBoZW5jZSB0aGVyZSBpcyBhbiBhc3NlcnQgd2hpbGUgdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgY29udHJvbHMuIEFmdGVyIHNraXBwaW5nIHRoaXMgdXBkYXRlLCB0aGUgY29udHJvbHNcclxuICAgICAgLy8gYXJlIHVwZGF0ZWQgZnJvbSBvdGhlciBwbGFjZXMgKHJlZnJlc2hUYWJsZSwgY29tbW9uSGFuZGxlckJlZm9yZSwgaGFuZGxlUm93RGF0YUN1clBhZ2UgZXRjIGxpa2UgaXQgaGFwcGVucyBmb3Igc2VydmVyIGRhdGEpXHJcbiAgICAgIGlmICgocmVjb21wdXRlIHx8IGZvcmNlVXBkYXRlKSAmJiAhKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuSW5Mb2NhbERhdGF2aWV3Q29tbWFuZCAmJiBtYWluQ3RybCAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKG1haW5DdHJsLmlzQ2hvaWNlQ29udHJvbCgpKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFJpZ2h0IGFmdGVyIHdlIGV4aXQgdGhlIHRvcG1vc3QgdXBkYXRlIC0gZXhlY3V0ZSBhbGwgdmFyaWFibGUgY2hhbmdlIGV2ZW50cy5cclxuICAgICAgLy8gbm90ZSB0aGF0IGR1cmluZyB0aGlzIGV4ZWN1dGlvbiwgbmV3IG9uZXMgbWF5IGJlIGNyZWF0ZWQuXHJcbiAgICAgIGlmIChwZW5kaW5nRXZlbnRzID09PSAwICYmIGNoZWNrRm9yVmFyaWFibGVDaGFuZ2UgJiYgdGhpcy5nZXRIYXNDaGFuZ2VFdmVudCgpKSB7XHJcbiAgICAgICAgd2hpbGUgKGV2dHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IGV2dCA9IDxSdW5UaW1lRXZlbnQ+ZXZ0cy5nZXRfSXRlbSgxKTtcclxuICAgICAgICAgIGV2dHMuUmVtb3ZlQXQoMCk7XHJcbiAgICAgICAgICBldnRzLlJlbW92ZUF0KDApO1xyXG4gICAgICAgICAgaWYgKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSA9PSBudWxsKVxyXG4gICAgICAgICAgICBldnQuc2V0VGFzayg8VGFzaz50aGlzLmdldFRhc2soKSk7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRhc2tSZWY6IFRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBpbiB2YXJpYWJsZSBjaGFuZ2UgZXZlbnQgYW5kIFRhc2tTdWZmaXggaXMgZXhlY3V0ZWQsIGl0IG1lYW5zIHdlIGFyZSBoZXJlIGZyb21cclxuICAgICAgICAgICAgLy8gdXBkYXRlIGFyZ3VtZW50cyB3aGlsZSBjbG9zaW5nIHRoZSB0YXNrLiBJbiBzdWNoIGNhc2UsIHdlIHNob3VsZCBzZXQgdGhlIGV2ZW50IHRhc2sgYXMgUGF0aFBhcmVudFRhc2tcclxuICAgICAgICAgICAgLy8gYW5kIG5vdCB0aGUgdGFzayBpdHNlbGYuXHJcbiAgICAgICAgICAgIGlmICh0YXNrUmVmLlRhc2tTdWZmaXhFeGVjdXRlZCkge1xyXG4gICAgICAgICAgICAgIHRhc2tSZWYgPSAodGFza1JlZi5QYXRoUGFyZW50VGFzayAhPSBudWxsKSA/IDxUYXNrPnRhc2tSZWYuUGF0aFBhcmVudFRhc2sgOiB0YXNrUmVmO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGV2dC5zZXRUYXNrKHRhc2tSZWYpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZXZ0LnNldEN0cmwoTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpKTtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUV2ZW50KGV2dCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gIzc3NjAzMSAtIHRoZSBmaWVsZCBzaG91bGQgYmUgbWFya2VkIG1vZGlmaWVkIG9ubHkgaWYgdmFsIGFyZSBub3QgZXF1YWwuIE90aGVyd2lzZSwgZXZlbiBmb3IgbnVsbCBmaWVsZCBwYXJhbXRlciBwYXNzaW5nXHJcbiAgICAvLyBvciBzYW1lIHZhbHVlIHVwZGF0ZSwgaXQgaXMgbWFya2VkIGFzIG1vZGlmaWVkIGFuZCBSUyBpcyBleGVjdXRlZC5cclxuICAgIGlmIChyZWNvbXB1dGUgJiYgIXZhbHNFcXVhbClcclxuICAgICAgdGhpcy5zZXRNb2RpZmllZCgpO1xyXG4gICAgcmV0dXJuICF2YWxzRXF1YWw7XHJcbiAgfVxyXG5cclxuICBVcGRhdGVOdWxsKGlzTnVsbEZsZDogYm9vbGVhbiwgcmVjOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIGlmIChpc051bGxGbGQpXHJcbiAgICAgIHJlYy5zZXRGbGFnKHRoaXMuX2lkLCBSZWNvcmQuRkxBR19OVUxMKTtcclxuICAgIGVsc2VcclxuICAgICAgcmVjLmNsZWFyRmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfTlVMTCk7XHJcbiAgICB0aGlzLl9pc051bGwgPSBpc051bGxGbGQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGEgdmVjIGNlbGxcclxuICAvLy8gICBjYW4gbm90IGJlIGV4ZWN1dGVkIHdpdGhvdXQgdGhlIGxvZ2ljIGZyb20gZXZhbF9vcF92ZWNHZXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+dGhlIGNlbGwgaW5kZXggaW4gdGhlIHZlY3RvciBzdHJhdHMgZnJvbSAxPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbFwiPnRoZSBuZXcgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsSXNOdWxsXCI+aXMgdGhlIGJldyB2YWx1ZSBudWxsPC9wYXJhbT5cclxuICBhc3luYyBzZXRDZWxsVmVjVmFsdWUoaWR4OiBudW1iZXIsIG5ld1ZhbDogc3RyaW5nLCB2YWxJc051bGw6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl90eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgIC8vIGluaXRpYWxpemVkIHRoZSB2ZWN0b3Igb2JqZWN0IGlmIG5lZWRlZFxyXG4gICAgICBpZiAodGhpcy5fdmVjdG9yVHlwZSA9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fdmVjdG9yVHlwZSA9IHRoaXMuaXNOdWxsKClcclxuICAgICAgICAgID8gbmV3IFZlY3RvclR5cGUodGhpcy5fdmVjQ2VsbHNUeXBlLCB0aGlzLl92ZWNDZWxsc0NvbnRlbnRUeXBlLCB0aGlzLkRlZmF1bHRWYWx1ZSwgdGhpcy5pc051bGxEZWZhdWx0KCksXHJcbiAgICAgICAgICB0aGlzLk51bGxBbGxvd2VkLCB0aGlzLl92ZWNDZWxsc1NpemUpXHJcbiAgICAgICAgICA6IG5ldyBWZWN0b3JUeXBlKHRoaXMuX3ZhbCk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gaWYgdmVjQ2VsbHNUeXBlIGlzIEJMT0IsIGNvbnZlcnQgZGF0YSBpbnRvIGJsb2JcclxuICAgICAgaWYgKHRoaXMuX3ZlY0NlbGxzVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB7XHJcbiAgICAgICAgbGV0IHRtcE5ld1ZhbDogc3RyaW5nID0gdGhpcy5nZXRDZWxsRGVmdWFsdFZhbHVlKCk7XHJcbiAgICAgICAgbmV3VmFsID0gQmxvYlR5cGUuY29weUJsb2IodG1wTmV3VmFsLCBuZXdWYWwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXMgPSB0aGlzLl92ZWN0b3JUeXBlLnNldFZlY0NlbGwoaWR4LCBuZXdWYWwsIHZhbElzTnVsbCk7XHJcbiAgICAgIC8vIHN0YXJ0IHJlY29tcHV0ZVxyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgdGhpcy5fY2xlYXJWZWN0b3JUeXBlID0gZmFsc2U7XHJcbiAgICAgICAgLy8gUUNSIDk4NDU2MyBkbyBub3Qgc2V0IHRoZSByZWNvcmQgYXMgY2hhbmdlZFxyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZSh0aGlzLl92ZWN0b3JUeXBlLnRvU3RyaW5nKCksIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuX2NsZWFyVmVjdG9yVHlwZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY2VsbCB2YWx1ZSBvZiBhIGdpdmVuIGNlbGwgaW4gdGhlIHZlY3RvclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgY2VsbCdzIHZhbHVlIGFzIHN0cmluZzwvcmV0dXJucz5cclxuICBnZXRWZWNDZWxsVmFsdWUoaWR4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX3R5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgLy8gaWYgd2UgYXJlIGhlcmUgdGhhbiB0aGUgZmlsZWQgbXVzdCBoYXZlIG5vbmUgbnVsbCB2YWx1ZSBvZiBhIHZlY3RvclxyXG4gICAgICBpZiAodGhpcy5fdmVjdG9yVHlwZSA9PSBudWxsKVxyXG4gICAgICAgIHRoaXMuX3ZlY3RvclR5cGUgPSBuZXcgVmVjdG9yVHlwZSh0aGlzLl92YWwpO1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuX3ZlY3RvclR5cGUuZ2V0VmVjQ2VsbChpZHgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSByZWNvbXB1dGVkIHZhcmlhYmxlIHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFJlY29tcHV0ZWQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW52YWxpZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLiBBbiBpbnZhbGlkIHZhbHVlIGZvcmNlcyB1cyB0byByZS1jYWxjdWxhdGUgdGhlIGZpZWxkJ3NcclxuICAvLy8gICB2YWx1ZSBieSBjb3B5aW5nIGl0IGZyb20gdGhlIGRhdGF2aWV3LlxyXG4gIC8vLyAgIHVzZWQgd2hlbiBzd2l0Y2hpbmcgdG8gYW5vdGhlciByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9yY2VJbnZhbGlkYXRlXCI+LSBEb250IGNoZWNrIHRoZSBmaWVsZCdzIHR5cGUgYW5kIG1ha2UgaXQgaW52YWxpZCAodXN1YWxseSBWaXJ0dWFsc1xyXG4gIC8vLyAgIHdpdGhvdXQgaW5pdCBleHByZXNzaW9uIGFyZSBuZXZlciBpbnZhbGlkYXRlZCwgc2luY2UgdGhleSByZXRhaW4gdGhlaXIgdmFsdWUgd2hlbiBtb3ZpbmdcclxuICAvLy8gICBiZXR3ZWVuIHJlY29yZHMpLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNsZWFyRmxhZ3NcIj48L3BhcmFtPlxyXG4gIGludmFsaWRhdGUoZm9yY2VJbnZhbGlkYXRlOiBib29sZWFuLCBjbGVhckZsYWdzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pc1ZpcnR1YWwgfHwgdGhpcy5fdmlyQXNSZWFsIHx8IHRoaXMuX2luaXRFeHAgIT09IG51bGwgfHwgZm9yY2VJbnZhbGlkYXRlKSB7XHJcbiAgICAgIHRoaXMuX2ludmFsaWRWYWx1ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoY2xlYXJGbGFncyAmJiByZWMgIT09IG51bGwpIHtcclxuICAgICAgcmVjLmNsZWFyRmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfVVBEQVRFRCk7XHJcbiAgICAgIHJlYy5jbGVhckZsYWcodGhpcy5faWQsIFJlY29yZC5GTEFHX01PRElGSUVEKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgTmFtZSBvZiB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGdldFRhYmxlTmFtZSgpOiBTdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTmFtZSA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZm9yIGdldCBWQVJOQU1FIGZ1bmN0aW9uIHVzZVxyXG4gIC8vLyAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRhYmxlIG5hbWUgd2hlcmUgdGhlIHZhcmlhYmxlIG9yaWdpbmF0ZXMsXHJcbiAgLy8vICAgY29uY2F0ZW5hdGVkIHdpdGggJy4nIGFuZCB0aGUgdmFyaWFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlhYmxlIGluIHRoYXQgdGFibGUuXHJcbiAgLy8vICAgSWYgdGhlIHZhcmlhYmxlIGlzIGEgdmlydHVhbCBvbmUsIHRoZW4gdGhlIHRhYmxlIG5hbWUgd291bGQgaW5kaWNhdGUgJ1ZpcnR1YWwnLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl9pc1BhcmFtKVxyXG4gICAgICByZXR1cm4gXCJQYXJhbWV0ZXIuXCIgKyB0aGlzLmdldFZhck5hbWUoKTtcclxuICAgIGVsc2UgaWYgKHRoaXMuX2lzVmlydHVhbClcclxuICAgICAgcmV0dXJuIFwiVmlydHVhbC5cIiArIHRoaXMuZ2V0VmFyTmFtZSgpO1xyXG4gICAgZWxzZSByZXR1cm4gdGhpcy5nZXRUYWJsZU5hbWUoKSArIFwiLlwiICsgdGhpcy5nZXRWYXJOYW1lKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGVzdCBmb3IgYSBudWxsaXR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgaXNOdWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCg8VGFzaz5zdXBlci5nZXRUYXNrKCkpLmdldEV2YWxPbGRWYWx1ZXMoKSlcclxuICAgICAgcmV0dXJuIHRoaXMuaXNPcmlnaW5hbFZhbHVlTnVsbCgpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5faW52YWxpZFZhbHVlKVxyXG4gICAgICB0aGlzLnRha2VWYWxGcm9tUmVjKCk7XHJcbiAgICByZXR1cm4gdGhpcy5faXNOdWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgUHJldklzTnVsbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2SXNOdWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRlc3QgZm9yIGFuIG1vZGlmaWVkIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgcmV0dXJuIGN1cnJSZWMuaXNGbGRNb2RpZmllZCh0aGlzLl9pZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBtb2RpZmllZCBmbGFnXHJcbiAgLy8vICAgcGxlYXNlIG5vdGUgdGhhdCBjbGVhcmluZyB0aGUgZmxhZyBpcyBkb25lIGV4cGxpY2l0bHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldE1vZGlmaWVkKCk6IHZvaWQge1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gKCg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldEN1cnJSZWMoKSk7XHJcbiAgICByZWMuc2V0RmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfTU9ESUZJRUQpO1xyXG5cclxuICAgIC8vIFRoaXMgZmxhZyB3aWxsIGJlIHNldCBhcyBGTEFHX01PRElGSUVEIGFuZCBuZXZlciBjbGVhcmVkLiBRY3IgIzkyNjgxNVxyXG4gICAgcmVjLnNldEZsYWcodGhpcy5faWQsIFJlY29yZC5GTEFHX01PRElGSUVEX0FUTEVBU1RfT05DRSk7XHJcbiAgICBpZiAodGhpcy5Jc1ZpcnR1YWwpXHJcbiAgICAgIHRoaXMubW9kaWZpZWRBdExlYXN0T25jZSA9IHRydWU7XHJcbiAgICAvLyB0aGUgc2V0dGluZyBvZiB0aGUgcmVjb3JkIG1vZGlmaWVkIGZsYWcgaXMgZG9uZSBleHBsaWNpdGx5XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB1cGRhdGVkIGZsYWdcclxuICAvLy8gICBwbGVhc2Ugbm90ZSB0aGF0IGNsZWFyaW5nIHRoZSBmbGFnIGlzIGRvbmUgZXhwbGljaXRseVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0VXBkYXRlZCgpOiB2b2lkIHtcclxuICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICBjdXJyUmVjLnNldEZsYWcodGhpcy5faWQsIFJlY29yZC5GTEFHX1VQREFURUQpO1xyXG4gICAgY3VyclJlYy5zZXRVcGRhdGVkKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgZmllbGQgaXMgYSBwYXJhbWV0ZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzUGFyYW0oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNQYXJhbTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGlmIHRoZSBmaWVsZCBpbiBldmFsdWF0aW9uIHByb2Nlc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzSW5FdmFsUHJvY2VzcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbkV2YWxQcm9jZXNzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgZmllbGQgaGFzIGFuIGluaXQgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaGFzSW5pdEV4cCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbml0RXhwICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIHJlY29tcHV0ZXMgdGhpcyBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNTZXJ2ZXJSY21wKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29tcHV0ZSAhPT0gbnVsbCAmJiB0aGlzLl9yZWNvbXB1dGUuaXNTZXJ2ZXJSY21wKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgcGljdHVyZSBvZiB0aGUgZmllbGQgYXMgYSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFBpY3R1cmUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9waWN0dXJlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHRoZSBpZCBvZiB0aGUgbGluayB0aGlzIGZpZWxkIGJlbG9uZyB0b1xyXG4gIC8vLyAgIGlmIGRvZXMgbm90IGJlbG9uZyB0byBhbnkgbGluayByZXR1cm4gLTFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERhdGF2aWV3SGVhZGVySWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhdmlld0hlYWRlcklkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHdoZXRoZXIgdGhlIGZpZWxkIGJlbG9uZ3MgdG8gYSBsaW5rIG9yIG5vdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0IElzTGlua0ZpZWxkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzTGlua0ZsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBldmFsdWF0ZXMgYW5kIHJldHVybnMgdGhlIGluaXQgZXhwcmVzc2lvbiB2YWx1ZSBvZiB0aGlzIGZpZWxkIChudWxsIGlmIHRoZXJlIGlzIG5vbilcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBhc3luYyBnZXRJbml0RXhwVmFsKHJlczogUmVmUGFyYW08c3RyaW5nPiwgaXNOdWxsOiBSZWZQYXJhbTxib29sZWFuPik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGlmICh0aGlzLl9pbml0RXhwICE9IG51bGwpXHJcbiAgICAgIGF3YWl0IHRoaXMuRXZhbHVhdGVJbml0RXhwcmVzc2lvbihyZXMsIGlzTnVsbCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJlcy52YWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIGhhc0NoYW5nZUV2ZW50IGZsYWcgdG8gVFJVRVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SGFzQ2hhbmdlRXZlbnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9oYXNDaGFuZ2VFdmVudCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0cmlldmVzIHRoZSBoYXNDaGFuZ2VFdmVudCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldEhhc0NoYW5nZUV2ZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhc0NoYW5nZUV2ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBoYXNab29tSGFuZGxlciB0byB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRIYXNab29tSGFuZGxlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2hhc1pvb21IYW5kbGVyID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGhhc1pvb21IYW5kbGVyXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBnZXRIYXNab29tSGFuZGxlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9oYXNab29tSGFuZGxlcjtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGluIHRoaXMgZmllbGQgd2lsbCBjYXVzZSBpbnZhbGlkYXRpb24gb2YgYWxsIHJvd3MgaW4gdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNDYXVzZVRhYmxlSW52YWxpZGF0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhdXNlVGFibGVJbnZhbGlkYXRpb247XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGNhdXNlIFRhYmxlIEludmFsaWRhdGlvbiBtZW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2F1c2VUYWJsZUludmFsaWRhdGlvblwiPjwvcGFyYW0+XHJcbiAgY2F1c2VUYWJsZUludmFsaWRhdGlvbihjYXVzZVRhYmxlSW52YWxpZGF0aW9uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYXVzZVRhYmxlSW52YWxpZGF0aW9uID0gY2F1c2VUYWJsZUludmFsaWRhdGlvbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB3aGVuIHZhbHVlIGlzIG51bGwsIGdldCB2YWx1ZSB0aGF0IHJlcHJlc2VudCBudWxsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoZWNrTnVsbEFyaXRobWV0aWNcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VmFsdWVGb3JOdWxsKGNoZWNrTnVsbEFyaXRobWV0aWM6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgbGV0IHZhbDogc3RyaW5nO1xyXG4gICAgaWYgKHRoaXMuTnVsbEFsbG93ZWQpIHtcclxuXHJcbiAgICAgIGlmIChjaGVja051bGxBcml0aG1ldGljICYmIHN1cGVyLmdldFRhc2soKS5nZXROdWxsQXJpdGhtZXRpYygpID09PSBDb25zdGFudHMuTlVMTF9BUklUSF9OVUxMSUZZKSB7XHJcbiAgICAgICAgdmFsID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5fbnVsbFZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLl9udWxsVmFsdWUgPSBzdXBlci5nZXRNYWdpY0RlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YWwgPSB0aGlzLl9udWxsVmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB2YWwgPSBzdXBlci5nZXRNYWdpY0RlZmF1bHRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjb250cm9sIHdoaWNoIGlzIGF0dGFjaGVkIHRvIHRoZSBmaWVsZCBhbmQgcmVzaWRlcyBvbiB0aGUgc2FtZSB0YXNrXHJcbiAgLy8vICAgb2Ygb2YgdGhlIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgZ2V0Q3RybCgpOiBNZ0NvbnRyb2wge1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbDtcclxuXHJcbiAgICBpZiAodGhpcy5fY29udHJvbHMgIT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fY29udHJvbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjdHJsID0gPE1nQ29udHJvbD50aGlzLl9jb250cm9scy5nZXRfSXRlbShpKTtcclxuICAgICAgICBpZiAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpID09PSB0aGlzLmdldFRhc2soKSlcclxuICAgICAgICAgIHJldHVybiBjdHJsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgdGhlIGRpc3BsYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHVwZGF0ZURpc3BsYXkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCBzdXBlci51cGRhdGVEaXNwbGF5V2l0aFZhbHVlKHRoaXMuZ2V0RGlzcFZhbHVlKCksIHRoaXMuaXNOdWxsKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdmFsdWUgdG8gZGlzcGxheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGdldERpc3BWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuaXNOdWxsKCkpIHtcclxuICAgICAgaWYgKHRoaXMuX251bGxEaXNwbGF5ICE9IG51bGwpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVsbERpc3BsYXkoKTtcclxuICAgICAgZWxzZSByZXR1cm4gc3VwZXIuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuICAgIH1cclxuICAgIGVsc2UgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB0cnVlLCBpZiByYW5nZSBjb25kaXRpb24gc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGllbGQgZHVyaW5nIGNvbXB1dGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBTaG91bGRDaGVja1JhbmdlSW5Db21wdXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuSXNMaW5rRmllbGQgfHwgKHRoaXMuSXNWaXJ0dWFsICYmICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLkhhc01haW5UYWJsZSk7XHJcbiAgfVxyXG5cclxuICBJc0ZvckFyZ3VtZW50KHRhc2tIYXNQYXJhbWV0ZXJzOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAvLyBJZiB3ZSBuZWVkIGEgcGFyYW1ldGVyIGFuZCB0aGUgZmllbGQgaXMgbm90IG9uZVxyXG4gICAgaWYgKHRhc2tIYXNQYXJhbWV0ZXJzKSB7XHJcbiAgICAgIGlmICghdGhpcy5pc1BhcmFtKCkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMuSXNWaXJ0dWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbn1cclxuIl19
|