appium 2.0.0-beta.34 → 2.0.0-beta.38
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/build/lib/appium.d.ts +41 -52
- package/build/lib/appium.d.ts.map +1 -1
- package/build/lib/appium.js +32 -15
- package/build/lib/cli/args.d.ts +1 -1
- package/build/lib/cli/args.d.ts.map +1 -1
- package/build/lib/cli/args.js +1 -1
- package/build/lib/cli/driver-command.d.ts +5 -5
- package/build/lib/cli/driver-command.d.ts.map +1 -1
- package/build/lib/cli/driver-command.js +8 -8
- package/build/lib/cli/extension-command.d.ts +78 -51
- package/build/lib/cli/extension-command.d.ts.map +1 -1
- package/build/lib/cli/extension-command.js +135 -80
- package/build/lib/cli/extension.d.ts +9 -5
- package/build/lib/cli/extension.d.ts.map +1 -1
- package/build/lib/cli/extension.js +5 -7
- package/build/lib/cli/parser.d.ts +3 -3
- package/build/lib/cli/parser.d.ts.map +1 -1
- package/build/lib/cli/parser.js +1 -1
- package/build/lib/cli/plugin-command.d.ts +9 -15
- package/build/lib/cli/plugin-command.d.ts.map +1 -1
- package/build/lib/cli/plugin-command.js +8 -8
- package/build/lib/cli/utils.js +1 -1
- package/build/lib/config-file.d.ts.map +1 -1
- package/build/lib/config-file.js +1 -1
- package/build/lib/config.d.ts +4 -4
- package/build/lib/config.d.ts.map +1 -1
- package/build/lib/config.js +1 -1
- package/build/lib/constants.d.ts.map +1 -1
- package/build/lib/constants.js +1 -1
- package/build/lib/extension/driver-config.d.ts +29 -32
- package/build/lib/extension/driver-config.d.ts.map +1 -1
- package/build/lib/extension/driver-config.js +7 -20
- package/build/lib/extension/extension-config.d.ts +108 -36
- package/build/lib/extension/extension-config.d.ts.map +1 -1
- package/build/lib/extension/extension-config.js +199 -60
- package/build/lib/extension/index.d.ts +16 -7
- package/build/lib/extension/index.d.ts.map +1 -1
- package/build/lib/extension/index.js +15 -18
- package/build/lib/extension/manifest.d.ts +12 -12
- package/build/lib/extension/manifest.d.ts.map +1 -1
- package/build/lib/extension/manifest.js +13 -3
- package/build/lib/extension/package-changed.d.ts.map +1 -1
- package/build/lib/extension/package-changed.js +1 -1
- package/build/lib/extension/plugin-config.d.ts +19 -24
- package/build/lib/extension/plugin-config.d.ts.map +1 -1
- package/build/lib/extension/plugin-config.js +9 -18
- package/build/lib/grid-register.d.ts.map +1 -1
- package/build/lib/grid-register.js +1 -1
- package/build/lib/logger.d.ts +1 -1
- package/build/lib/logger.d.ts.map +1 -1
- package/build/lib/logger.js +1 -1
- package/build/lib/logsink.d.ts.map +1 -1
- package/build/lib/logsink.js +3 -2
- package/build/lib/main.d.ts +13 -12
- package/build/lib/main.d.ts.map +1 -1
- package/build/lib/main.js +4 -4
- package/build/lib/schema/arg-spec.d.ts +4 -4
- package/build/lib/schema/arg-spec.d.ts.map +1 -1
- package/build/lib/schema/arg-spec.js +1 -1
- package/build/lib/schema/cli-args.d.ts.map +1 -1
- package/build/lib/schema/cli-args.js +1 -1
- package/build/lib/schema/cli-transformers.d.ts.map +1 -1
- package/build/lib/schema/cli-transformers.js +1 -1
- package/build/lib/schema/keywords.d.ts.map +1 -1
- package/build/lib/schema/keywords.js +1 -1
- package/build/lib/schema/schema.d.ts +2 -2
- package/build/lib/schema/schema.d.ts.map +1 -1
- package/build/lib/schema/schema.js +1 -1
- package/build/lib/utils.d.ts.map +1 -1
- package/build/lib/utils.js +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/appium-manifest.d.ts +23 -4
- package/build/types/appium-manifest.d.ts.map +1 -1
- package/build/types/cli.d.ts.map +1 -1
- package/build/types/{external-manifest.d.ts → extension-manifest.d.ts} +15 -7
- package/build/types/extension-manifest.d.ts.map +1 -0
- package/build/types/index.d.ts +6 -5
- package/build/types/index.d.ts.map +1 -1
- package/driver.d.ts +1 -0
- package/driver.js +14 -0
- package/lib/appium.js +208 -124
- package/lib/cli/args.js +143 -93
- package/lib/cli/driver-command.js +46 -26
- package/lib/cli/extension-command.js +314 -157
- package/lib/cli/extension.js +15 -19
- package/lib/cli/parser.js +19 -31
- package/lib/cli/plugin-command.js +39 -24
- package/lib/cli/utils.js +8 -14
- package/lib/config-file.js +21 -25
- package/lib/config.js +82 -64
- package/lib/constants.js +4 -13
- package/lib/extension/driver-config.js +171 -171
- package/lib/extension/extension-config.js +347 -126
- package/lib/extension/index.js +72 -58
- package/lib/extension/manifest.js +48 -57
- package/lib/extension/package-changed.js +9 -8
- package/lib/extension/plugin-config.js +62 -62
- package/lib/grid-register.js +29 -18
- package/lib/logger.js +1 -2
- package/lib/logsink.js +29 -31
- package/lib/main.js +111 -73
- package/lib/schema/arg-spec.js +10 -13
- package/lib/schema/cli-args.js +14 -37
- package/lib/schema/cli-transformers.js +7 -14
- package/lib/schema/keywords.js +15 -13
- package/lib/schema/schema.js +58 -75
- package/lib/utils.js +50 -25
- package/package.json +25 -18
- package/plugin.d.ts +1 -0
- package/plugin.js +13 -0
- package/scripts/autoinstall-extensions.js +177 -0
- package/support.d.ts +1 -0
- package/support.js +13 -0
- package/types/appium-manifest.ts +27 -15
- package/types/cli.ts +2 -9
- package/types/{external-manifest.ts → extension-manifest.ts} +21 -15
- package/types/index.ts +12 -5
- package/build/types/extension.d.ts +0 -43
- package/build/types/extension.d.ts.map +0 -1
- package/build/types/external-manifest.d.ts.map +0 -1
- package/lib/appium-config.schema.json +0 -278
- package/scripts/postinstall.js +0 -71
- package/types/extension.ts +0 -56
package/build/lib/appium.d.ts
CHANGED
|
@@ -10,14 +10,20 @@ export class NoDriverProxyCommandError extends Error {
|
|
|
10
10
|
code: Readonly<string>;
|
|
11
11
|
}
|
|
12
12
|
export type ExternalDriver = import('@appium/types').ExternalDriver;
|
|
13
|
+
export type Driver = import('@appium/types').Driver;
|
|
14
|
+
export type DriverClass = import('@appium/types').DriverClass;
|
|
13
15
|
export type W3CCapabilities = import('@appium/types').W3CCapabilities;
|
|
14
16
|
export type DriverData = import('@appium/types').DriverData;
|
|
15
17
|
export type DriverOpts = import('@appium/types').ServerArgs;
|
|
16
18
|
export type Constraints = import('@appium/types').Constraints;
|
|
17
19
|
export type AppiumServer = import('@appium/types').AppiumServer;
|
|
18
|
-
export type ExtensionType = import('
|
|
19
|
-
export type PluginClass = import('../types/extension').PluginClass;
|
|
20
|
+
export type ExtensionType = import('@appium/types').ExtensionType;
|
|
20
21
|
export type DriverConfig = import('./extension/driver-config').DriverConfig;
|
|
22
|
+
export type Plugin = import('@appium/types').Plugin;
|
|
23
|
+
export type PluginClass = import('@appium/types').PluginClass;
|
|
24
|
+
export type PluginType = import('@appium/types').PluginType;
|
|
25
|
+
export type DriverType = import('@appium/types').DriverType;
|
|
26
|
+
export type SessionHandler = import('@appium/types').SessionHandler<SessionHandlerResult<any[]>, SessionHandlerResult<void>>;
|
|
21
27
|
/**
|
|
22
28
|
* Used by {@linkcode AppiumDriver.createSession } and {@linkcode AppiumDriver.deleteSession } to describe
|
|
23
29
|
* result.
|
|
@@ -27,7 +33,6 @@ export type SessionHandlerResult<V> = {
|
|
|
27
33
|
error?: Error | undefined;
|
|
28
34
|
protocol?: string | undefined;
|
|
29
35
|
};
|
|
30
|
-
export type SessionHandler = import('@appium/types').SessionHandler<SessionHandlerResult<any[]>, SessionHandlerResult<void>>;
|
|
31
36
|
/**
|
|
32
37
|
* @implements {SessionHandler}
|
|
33
38
|
*/
|
|
@@ -52,9 +57,9 @@ export class AppiumDriver extends DriverCore implements SessionHandler {
|
|
|
52
57
|
pendingDrivers: Record<string, ExternalDriver[]>;
|
|
53
58
|
/**
|
|
54
59
|
* List of active plugins
|
|
55
|
-
* @type {PluginClass
|
|
60
|
+
* @type {Map<PluginClass,string>}
|
|
56
61
|
*/
|
|
57
|
-
pluginClasses: PluginClass
|
|
62
|
+
pluginClasses: Map<PluginClass, string>;
|
|
58
63
|
/**
|
|
59
64
|
* map of sessions to actual plugin instances per session
|
|
60
65
|
* @type {Record<string,InstanceType<PluginClass>[]>}
|
|
@@ -70,38 +75,8 @@ export class AppiumDriver extends DriverCore implements SessionHandler {
|
|
|
70
75
|
/** @type {AppiumServer} */
|
|
71
76
|
server: AppiumServer;
|
|
72
77
|
desiredCapConstraints: Readonly<import("@appium/types").Constraints>;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
allowCors: boolean;
|
|
76
|
-
allowInsecure: import("@appium/types").AllowInsecureConfig;
|
|
77
|
-
basePath: string;
|
|
78
|
-
callbackAddress: string | undefined;
|
|
79
|
-
callbackPort: number;
|
|
80
|
-
debugLogSpacing: boolean;
|
|
81
|
-
defaultCapabilities: import("@appium/types").DefaultCapabilitiesConfig | undefined;
|
|
82
|
-
denyInsecure: import("@appium/types").DenyInsecureConfig;
|
|
83
|
-
driver: import("@appium/types").DriverConfig | undefined;
|
|
84
|
-
keepAliveTimeout: number;
|
|
85
|
-
localTimezone: boolean;
|
|
86
|
-
logFile: string | undefined;
|
|
87
|
-
logFilters: import("@appium/types").LogFiltersConfig | undefined;
|
|
88
|
-
loglevel: import("@appium/types").LogLevelConfig;
|
|
89
|
-
logNoColors: boolean;
|
|
90
|
-
logTimestamp: boolean;
|
|
91
|
-
longStacktrace: boolean;
|
|
92
|
-
noPermsCheck: boolean;
|
|
93
|
-
nodeconfig: import("@appium/types").NodeconfigConfig | undefined;
|
|
94
|
-
plugin: import("@appium/types").PluginConfig | undefined;
|
|
95
|
-
port: number;
|
|
96
|
-
relaxedSecurityEnabled: boolean;
|
|
97
|
-
sessionOverride: boolean;
|
|
98
|
-
strictCaps: boolean;
|
|
99
|
-
tmpDir: string | undefined;
|
|
100
|
-
traceDir: string | undefined;
|
|
101
|
-
useDrivers: import("@appium/types").UseDriversConfig;
|
|
102
|
-
usePlugins: import("@appium/types").UsePluginsConfig;
|
|
103
|
-
webhook: string | undefined;
|
|
104
|
-
};
|
|
78
|
+
/** @type {DriverOpts} */
|
|
79
|
+
args: DriverOpts;
|
|
105
80
|
sessionExists(sessionId: any): boolean;
|
|
106
81
|
driverForSession(sessionId: any): import("@appium/types").ExternalDriver;
|
|
107
82
|
getStatus(): Promise<{
|
|
@@ -115,39 +90,49 @@ export class AppiumDriver extends DriverCore implements SessionHandler {
|
|
|
115
90
|
}[]>;
|
|
116
91
|
printNewSessionAnnouncement(driverName: any, driverVersion: any, driverBaseVersion: any): void;
|
|
117
92
|
/**
|
|
118
|
-
*
|
|
93
|
+
* Retrieves all CLI arguments for a specific plugin.
|
|
94
|
+
* @param {string} extName - Plugin name
|
|
95
|
+
* @returns {Record<string,unknown>} Arguments object. If none, an empty object.
|
|
96
|
+
*/
|
|
97
|
+
getCliArgsForPlugin(extName: string): Record<string, unknown>;
|
|
98
|
+
/**
|
|
99
|
+
* Retrieves CLI args for a specific driver.
|
|
119
100
|
*
|
|
120
|
-
*
|
|
101
|
+
* _Any arg which is equal to its default value will not be present in the returned object._
|
|
121
102
|
*
|
|
122
|
-
*
|
|
123
|
-
* @param {
|
|
124
|
-
* @
|
|
125
|
-
* @param {Object} extInstance the driver or plugin instance
|
|
103
|
+
* _Note that this behavior currently (May 18 2022) differs from how plugins are handled_ (see {@linkcode AppiumDriver.getCliArgsForPlugin}).
|
|
104
|
+
* @param {string} extName - Driver name
|
|
105
|
+
* @returns {Record<string,unknown>|undefined} Arguments object. If none, `undefined`
|
|
126
106
|
*/
|
|
127
|
-
|
|
107
|
+
getCliArgsForDriver(extName: string): Record<string, unknown> | undefined;
|
|
128
108
|
/**
|
|
129
109
|
* Create a new session
|
|
130
110
|
* @param {W3CCapabilities} jsonwpCaps JSONWP formatted desired capabilities
|
|
131
111
|
* @param {W3CCapabilities} reqCaps Required capabilities (JSONWP standard)
|
|
132
112
|
* @param {W3CCapabilities} w3cCapabilities W3C capabilities
|
|
133
|
-
* @param {
|
|
113
|
+
* @param {DriverData[]} [driverData]
|
|
134
114
|
*/
|
|
135
115
|
createSession(jsonwpCaps: W3CCapabilities, reqCaps: W3CCapabilities, w3cCapabilities: W3CCapabilities, driverData?: import("@appium/types").DriverData[] | undefined): Promise<{
|
|
136
|
-
protocol:
|
|
116
|
+
protocol: string | undefined;
|
|
137
117
|
error: any;
|
|
138
118
|
value?: undefined;
|
|
139
119
|
} | {
|
|
140
|
-
protocol:
|
|
120
|
+
protocol: string | undefined;
|
|
141
121
|
value: any[];
|
|
142
122
|
error?: undefined;
|
|
143
123
|
}>;
|
|
144
|
-
attachUnexpectedShutdownHandler(driver: any, innerSessionId: any): void;
|
|
145
124
|
/**
|
|
146
125
|
*
|
|
147
|
-
* @param {
|
|
126
|
+
* @param {Driver} driver
|
|
127
|
+
* @param {string} innerSessionId
|
|
128
|
+
*/
|
|
129
|
+
attachUnexpectedShutdownHandler(driver: Driver, innerSessionId: string): void;
|
|
130
|
+
/**
|
|
131
|
+
*
|
|
132
|
+
* @param {DriverClass} InnerDriver
|
|
148
133
|
* @returns {Promise<DriverData[]>}}
|
|
149
134
|
*/
|
|
150
|
-
curSessionDataForDriver(InnerDriver:
|
|
135
|
+
curSessionDataForDriver(InnerDriver: DriverClass): Promise<DriverData[]>;
|
|
151
136
|
/**
|
|
152
137
|
* @param {string} sessionId
|
|
153
138
|
*/
|
|
@@ -179,12 +164,16 @@ export class AppiumDriver extends DriverCore implements SessionHandler {
|
|
|
179
164
|
* sessionless
|
|
180
165
|
*/
|
|
181
166
|
pluginsToHandleCmd(cmd: string, sessionId?: string | null): any[];
|
|
182
|
-
|
|
167
|
+
/**
|
|
168
|
+
* Creates instances of all of the enabled Plugin classes
|
|
169
|
+
* @returns {Plugin[]}
|
|
170
|
+
*/
|
|
171
|
+
createPluginInstances(): Plugin[];
|
|
183
172
|
/**
|
|
184
173
|
*
|
|
185
174
|
* @param {string} cmd
|
|
186
175
|
* @param {...any} args
|
|
187
|
-
* @returns {Promise<{value: any, error?: Error, protocol: string} | import('type-fest').AsyncReturnType<
|
|
176
|
+
* @returns {Promise<{value: any, error?: Error, protocol: string} | import('type-fest').AsyncReturnType<Driver['executeCommand']>>}
|
|
188
177
|
*/
|
|
189
178
|
executeCommand(cmd: string, ...args: any[]): Promise<any>;
|
|
190
179
|
wrapCommandWithPlugins({ driver, cmd, args, next, cmdHandledBy, plugins }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appium.d.ts","sourceRoot":"","sources":["../../lib/appium.js"],"names":[],"mappings":"AA+
|
|
1
|
+
{"version":3,"file":"appium.d.ts","sourceRoot":"","sources":["../../lib/appium.js"],"names":[],"mappings":"AA+xBA;;;GAGG;AACH;IAME,cAOC;IAZD;;OAEG;IACH,MAFU,SAAS,MAAM,CAAC,CAEgB;CAU3C;6BAKY,OAAO,eAAe,EAAE,cAAc;qBACtC,OAAO,eAAe,EAAE,MAAM;0BAC9B,OAAO,eAAe,EAAE,WAAW;8BACnC,OAAO,eAAe,EAAE,eAAe;yBACvC,OAAO,eAAe,EAAE,UAAU;yBAClC,OAAO,eAAe,EAAE,UAAU;0BAClC,OAAO,eAAe,EAAE,WAAW;2BACnC,OAAO,eAAe,EAAE,YAAY;4BACpC,OAAO,eAAe,EAAE,aAAa;2BACrC,OAAO,2BAA2B,EAAE,YAAY;qBAChD,OAAO,eAAe,EAAE,MAAM;0BAC9B,OAAO,eAAe,EAAE,WAAW;yBACnC,OAAO,eAAe,EAAE,UAAU;yBAClC,OAAO,eAAe,EAAE,UAAU;6BAClC,OAAO,eAAe,EAAE,cAAc,CAAC,qBAAqB,GAAG,EAAE,CAAC,EAAC,qBAAqB,IAAI,CAAC,CAAC;;;;;;;;;;AAhyB3G;;GAEG;AACH;IAqDE;;OAEG;IACH,kBAFW,UAAU,EAqBpB;IA1ED;;;;;OAKG;IACH,UAFU,OAAO,MAAM,EAAC,cAAc,CAAC,CAEzB;IAEd;;;;;OAKG;IACH,gBAFU,OAAO,MAAM,EAAC,cAAc,EAAE,CAAC,CAErB;IASpB;;;OAGG;IACH,eAFU,IAAI,WAAW,EAAC,MAAM,CAAC,CAEnB;IAEd;;;OAGG;IACH,gBAFU,OAAO,MAAM,EAAC,aAAa,WAAW,CAAC,EAAE,CAAC,CAEhC;IAEpB;;;OAGG;IACH,oBAFU,aAAa,WAAW,CAAC,EAAE,CAEb;IAExB,2BAA2B;IAC3B,cADW,YAAY,CACV;IAEb,2BAA2B;IAC3B,QADW,YAAY,CAChB;IAEP,qEAAqD;IAErD,yBAAyB;IACzB,MADW,UAAU,CAChB;IA4CL,uCAGC;IAED,yEAEC;IAGD;;OAIC;IAGD;;;;;SAKC;IAED,+FAiBC;IAED;;;;OAIG;IACH,6BAHW,MAAM,GACJ,OAAO,MAAM,EAAC,OAAO,CAAC,CAIlC;IAED;;;;;;;;OAQG;IACH,6BAHW,MAAM,GACJ,OAAO,MAAM,EAAC,OAAO,CAAC,GAAC,SAAS,CAgB5C;IAED;;;;;;OAMG;IACH,0BALW,eAAe,WACf,eAAe,mBACf,eAAe;;;;;;;;OAuKzB;IAED;;;;OAIG;IACH,wCAHW,MAAM,kBACN,MAAM,QAsChB;IAED;;;;OAIG;IAEH,qCAJW,WAAW,GACT,QAAQ,UAAU,EAAE,CAAC,CAkBjC;IAED;;OAEG;IACH,yBAFW,MAAM;;;;;;;;OA0ChB;IAED,4CAqBC;IAED;;;;;OAKG;IACH,8BAHY,MAAM,gBAejB;IAED;;;;;;;;;OASG;IACH,wBAJW,MAAM,cACL,MAAM,gBASjB;IAED;;;OAGG;IACH,yBAFa,MAAM,EAAE,CAWpB;IAED;;;;;OAKG;IACH,oBAJW,MAAM,WACF,GAAG,kBA+HjB;IAED;;;;;;;YAwBC;IAED;;;aAoBC;IAED;;;;;;;OAwBC;IAED,qCAGC;IAED,sDAGC;IAED,kCAGC;CACF"}
|
package/build/lib/appium.js
CHANGED
|
@@ -23,6 +23,8 @@ var _support = require("@appium/support");
|
|
|
23
23
|
|
|
24
24
|
var _schema = require("./schema");
|
|
25
25
|
|
|
26
|
+
var _constants = require("./constants");
|
|
27
|
+
|
|
26
28
|
const desiredCapabilityConstraints = Object.freeze({
|
|
27
29
|
automationName: {
|
|
28
30
|
presence: true,
|
|
@@ -40,11 +42,13 @@ class AppiumDriver extends _baseDriver.DriverCore {
|
|
|
40
42
|
sessions = {};
|
|
41
43
|
pendingDrivers = {};
|
|
42
44
|
newCommandTimeoutMs = 0;
|
|
43
|
-
pluginClasses
|
|
45
|
+
pluginClasses;
|
|
44
46
|
sessionPlugins = {};
|
|
45
47
|
sessionlessPlugins = [];
|
|
46
48
|
driverConfig;
|
|
47
49
|
server;
|
|
50
|
+
desiredCapConstraints = desiredCapabilityConstraints;
|
|
51
|
+
args;
|
|
48
52
|
|
|
49
53
|
constructor(opts) {
|
|
50
54
|
if (opts.tmpDir) {
|
|
@@ -52,7 +56,6 @@ class AppiumDriver extends _baseDriver.DriverCore {
|
|
|
52
56
|
}
|
|
53
57
|
|
|
54
58
|
super(opts);
|
|
55
|
-
this.desiredCapConstraints = desiredCapabilityConstraints;
|
|
56
59
|
this.args = { ...opts
|
|
57
60
|
};
|
|
58
61
|
(0, _config.updateBuildInfo)().catch(err => {
|
|
@@ -102,17 +105,23 @@ class AppiumDriver extends _baseDriver.DriverCore {
|
|
|
102
105
|
this.log.info(driverBaseVersion ? `${driverName}'s BaseDriver version is ${driverBaseVersion}` : `Could not determine ${driverName}'s BaseDriver version`);
|
|
103
106
|
}
|
|
104
107
|
|
|
105
|
-
|
|
106
|
-
var _this$args$
|
|
108
|
+
getCliArgsForPlugin(extName) {
|
|
109
|
+
var _this$args$plugin$ext, _this$args$plugin;
|
|
110
|
+
|
|
111
|
+
return (_this$args$plugin$ext = (_this$args$plugin = this.args.plugin) === null || _this$args$plugin === void 0 ? void 0 : _this$args$plugin[extName]) !== null && _this$args$plugin$ext !== void 0 ? _this$args$plugin$ext : {};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
getCliArgsForDriver(extName) {
|
|
115
|
+
var _this$args$driver;
|
|
107
116
|
|
|
108
|
-
const allCliArgsForExt = (_this$args$
|
|
117
|
+
const allCliArgsForExt = (_this$args$driver = this.args.driver) === null || _this$args$driver === void 0 ? void 0 : _this$args$driver[extName];
|
|
109
118
|
|
|
110
119
|
if (!_lodash.default.isEmpty(allCliArgsForExt)) {
|
|
111
|
-
const defaults = (0, _schema.getDefaultsForExtension)(
|
|
120
|
+
const defaults = (0, _schema.getDefaultsForExtension)(_constants.DRIVER_TYPE, extName);
|
|
112
121
|
const cliArgs = _lodash.default.isEmpty(defaults) ? allCliArgsForExt : _lodash.default.omitBy(allCliArgsForExt, (value, key) => _lodash.default.isEqual(defaults[key], value));
|
|
113
122
|
|
|
114
123
|
if (!_lodash.default.isEmpty(cliArgs)) {
|
|
115
|
-
|
|
124
|
+
return cliArgs;
|
|
116
125
|
}
|
|
117
126
|
}
|
|
118
127
|
}
|
|
@@ -187,7 +196,12 @@ class AppiumDriver extends _baseDriver.DriverCore {
|
|
|
187
196
|
driverInstance.allowInsecure = this.args.allowInsecure;
|
|
188
197
|
}
|
|
189
198
|
|
|
190
|
-
this.
|
|
199
|
+
const cliArgs = this.getCliArgsForDriver(driverName);
|
|
200
|
+
|
|
201
|
+
if (!_lodash.default.isEmpty(cliArgs)) {
|
|
202
|
+
driverInstance.cliArgs = cliArgs;
|
|
203
|
+
}
|
|
204
|
+
|
|
191
205
|
driverInstance.server = this.server;
|
|
192
206
|
driverInstance.serverHost = this.args.address;
|
|
193
207
|
driverInstance.serverPort = this.args.port;
|
|
@@ -367,12 +381,15 @@ class AppiumDriver extends _baseDriver.DriverCore {
|
|
|
367
381
|
}
|
|
368
382
|
|
|
369
383
|
createPluginInstances() {
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
this.
|
|
374
|
-
|
|
375
|
-
|
|
384
|
+
const pluginInstances = [];
|
|
385
|
+
|
|
386
|
+
for (const [PluginClass, name] of this.pluginClasses.entries()) {
|
|
387
|
+
const cliArgs = this.getCliArgsForPlugin(name);
|
|
388
|
+
const plugin = new PluginClass(name, cliArgs);
|
|
389
|
+
pluginInstances.push(plugin);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
return pluginInstances;
|
|
376
393
|
}
|
|
377
394
|
|
|
378
395
|
async executeCommand(cmd, ...args) {
|
|
@@ -565,4 +582,4 @@ class NoDriverProxyCommandError extends Error {
|
|
|
565
582
|
}
|
|
566
583
|
|
|
567
584
|
exports.NoDriverProxyCommandError = NoDriverProxyCommandError;
|
|
568
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXNpcmVkQ2FwYWJpbGl0eUNvbnN0cmFpbnRzIiwiT2JqZWN0IiwiZnJlZXplIiwiYXV0b21hdGlvbk5hbWUiLCJwcmVzZW5jZSIsImlzU3RyaW5nIiwicGxhdGZvcm1OYW1lIiwic2Vzc2lvbnNMaXN0R3VhcmQiLCJBc3luY0xvY2siLCJwZW5kaW5nRHJpdmVyc0d1YXJkIiwiQXBwaXVtRHJpdmVyIiwiRHJpdmVyQ29yZSIsInNlc3Npb25zIiwicGVuZGluZ0RyaXZlcnMiLCJuZXdDb21tYW5kVGltZW91dE1zIiwicGx1Z2luQ2xhc3NlcyIsInNlc3Npb25QbHVnaW5zIiwic2Vzc2lvbmxlc3NQbHVnaW5zIiwiZHJpdmVyQ29uZmlnIiwic2VydmVyIiwiY29uc3RydWN0b3IiLCJvcHRzIiwidG1wRGlyIiwicHJvY2VzcyIsImVudiIsIkFQUElVTV9UTVBfRElSIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwiYXJncyIsImNhdGNoIiwiZXJyIiwibG9nIiwiZGVidWciLCJfbG9nIiwiaW5zdGFuY2VOYW1lIiwibmFtZSIsIm5vZGUiLCJnZXRPYmplY3RJZCIsInN1YnN0cmluZyIsImxvZ2dlciIsImdldExvZ2dlciIsImlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQiLCJzZXNzaW9uRXhpc3RzIiwic2Vzc2lvbklkIiwiZHN0U2Vzc2lvbiIsImRyaXZlckZvclNlc3Npb24iLCJnZXRTdGF0dXMiLCJidWlsZCIsIl8iLCJjbG9uZSIsImdldFNlc3Npb25zIiwidG9QYWlycyIsIm1hcCIsImlkIiwiZHJpdmVyIiwiY2FwYWJpbGl0aWVzIiwiY2FwcyIsInByaW50TmV3U2Vzc2lvbkFubm91bmNlbWVudCIsImRyaXZlck5hbWUiLCJkcml2ZXJWZXJzaW9uIiwiZHJpdmVyQmFzZVZlcnNpb24iLCJpbmZvIiwiQVBQSVVNX1ZFUiIsImJhc2VWZXJzaW9uIiwiYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uIiwiZXh0VHlwZSIsImV4dE5hbWUiLCJleHRJbnN0YW5jZSIsImFsbENsaUFyZ3NGb3JFeHQiLCJpc0VtcHR5IiwiZGVmYXVsdHMiLCJjbGlBcmdzIiwib21pdEJ5IiwidmFsdWUiLCJrZXkiLCJpc0VxdWFsIiwiY3JlYXRlU2Vzc2lvbiIsImpzb253cENhcHMiLCJyZXFDYXBzIiwidzNjQ2FwYWJpbGl0aWVzIiwiZHJpdmVyRGF0YSIsImRlZmF1bHRDYXBhYmlsaXRpZXMiLCJjbG9uZURlZXAiLCJkZWZhdWx0U2V0dGluZ3MiLCJqd3BTZXR0aW5ncyIsInczY1NldHRpbmdzIiwiYWx3YXlzTWF0Y2giLCJmaXJzdE1hdGNoRW50cnkiLCJmaXJzdE1hdGNoIiwiYXNzaWduIiwicHJvdG9jb2wiLCJpbm5lclNlc3Npb25JZCIsImRDYXBzIiwicGFyc2VkQ2FwcyIsImRlc2lyZWRDYXBzIiwicHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzIiwicHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzIiwiZXJyb3IiLCJJbm5lckRyaXZlciIsInZlcnNpb24iLCJmaW5kTWF0Y2hpbmdEcml2ZXIiLCJzZXNzaW9uT3ZlcnJpZGUiLCJkZWxldGVBbGxTZXNzaW9ucyIsInJ1bm5pbmdEcml2ZXJzRGF0YSIsIm90aGVyUGVuZGluZ0RyaXZlcnNEYXRhIiwiZHJpdmVySW5zdGFuY2UiLCJyZWxheGVkU2VjdXJpdHlFbmFibGVkIiwiZGVueUluc2VjdXJlIiwiYSIsImFsbG93SW5zZWN1cmUiLCJzZXJ2ZXJIb3N0IiwiYWRkcmVzcyIsInNlcnZlclBvcnQiLCJwb3J0Iiwic2VydmVyUGF0aCIsImJhc2VQYXRoIiwiY3VyU2Vzc2lvbkRhdGFGb3JEcml2ZXIiLCJlIiwiZXJyb3JzIiwiU2Vzc2lvbk5vdENyZWF0ZWRFcnJvciIsIm1lc3NhZ2UiLCJhY3F1aXJlIiwiY29tcGFjdCIsImRydiIsInB1c2giLCJwdWxsIiwiYXR0YWNoVW5leHBlY3RlZFNodXRkb3duSGFuZGxlciIsInN0YXJ0TmV3Q29tbWFuZFRpbWVvdXQiLCJpc1czQ1Byb3RvY29sIiwiSlNPTiIsInN0cmluZ2lmeSIsInVwZGF0ZVNldHRpbmdzIiwiaXNNanNvbndwUHJvdG9jb2wiLCJvblNodXRkb3duIiwiY2F1c2UiLCJFcnJvciIsIndhcm4iLCJwbHVnaW4iLCJpc0Z1bmN0aW9uIiwib25VbmV4cGVjdGVkU2h1dGRvd24iLCJkYXRhIiwidmFsdWVzIiwiZmlsdGVyIiwicyIsImRhdHVtIiwiZGVsZXRlU2Vzc2lvbiIsIm90aGVyU2Vzc2lvbnNEYXRhIiwiY3VyQ29uc3RydWN0b3JOYW1lIiwic2Vzc2lvbnNDb3VudCIsInNpemUiLCJmb3JjZSIsInJlYXNvbiIsInV0aWwiLCJwbHVyYWxpemUiLCJjbGVhbnVwUHJvbWlzZXMiLCJzdGFydFVuZXhwZWN0ZWRTaHV0ZG93biIsImtleXMiLCJjbGVhbnVwUHJvbWlzZSIsInBsdWdpbnNGb3JTZXNzaW9uIiwiY3JlYXRlUGx1Z2luSW5zdGFuY2VzIiwicGx1Z2luc1RvSGFuZGxlQ21kIiwiY21kIiwicCIsImhhbmRsZSIsIlBsdWdpbkNsYXNzIiwicGx1Z2luTmFtZSIsImV4ZWN1dGVDb21tYW5kIiwiaXNHZXRTdGF0dXMiLCJHRVRfU1RBVFVTX0NPTU1BTkQiLCJpc1VtYnJlbGxhQ21kIiwiaXNBcHBpdW1Ecml2ZXJDb21tYW5kIiwiaXNTZXNzaW9uQ21kIiwicmVxRm9yUHJveHkiLCJsYXN0IiwicG9wIiwicGx1Z2lucyIsImNtZEhhbmRsZWRCeSIsImRlZmF1bHQiLCJkZWZhdWx0QmVoYXZpb3IiLCJsZW5ndGgiLCJwcm94eUNvbW1hbmQiLCJOb0RyaXZlclByb3h5Q29tbWFuZEVycm9yIiwib3JpZ2luYWxVcmwiLCJtZXRob2QiLCJib2R5IiwiQmFzZURyaXZlciIsInByb3RvdHlwZSIsImNhbGwiLCJ3cmFwcGVkQ21kIiwid3JhcENvbW1hbmRXaXRoUGx1Z2lucyIsIm5leHQiLCJyZXMiLCJleGVjdXRlV3JhcHBlZENvbW1hbmQiLCJsb2dQbHVnaW5IYW5kbGVyUmVwb3J0IiwiQ1JFQVRFX1NFU1NJT05fQ09NTUFORCIsImZpcnN0IiwiX25leHQiLCJkaWRIYW5kbGUiLCJrIiwiZGlkbnRIYW5kbGUiLCJjbWRSZXMiLCJjbWRFcnIiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwicHJveHlBY3RpdmUiLCJnZXRQcm94eUF2b2lkTGlzdCIsImNhblByb3h5IiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsImNvZGUiXSwic291cmNlcyI6WyIuLi8uLi9saWIvYXBwaXVtLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZ2V0QnVpbGRJbmZvLCB1cGRhdGVCdWlsZEluZm8sIEFQUElVTV9WRVIgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyLCBEcml2ZXJDb3JlLCBlcnJvcnMsIGlzU2Vzc2lvbkNvbW1hbmQsXG4gICAgICAgICBDUkVBVEVfU0VTU0lPTl9DT01NQU5ELCBERUxFVEVfU0VTU0lPTl9DT01NQU5ELCBHRVRfU1RBVFVTX0NPTU1BTkRcbn0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgQXN5bmNMb2NrIGZyb20gJ2FzeW5jLWxvY2snO1xuaW1wb3J0IHsgcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIsIHB1bGxTZXR0aW5ncyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgdXRpbCwgbm9kZSwgbG9nZ2VyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGdldERlZmF1bHRzRm9yRXh0ZW5zaW9uIH0gZnJvbSAnLi9zY2hlbWEnO1xuXG4vKipcbiAqIEludmFyaWFudCBzZXQgb2YgYmFzZSBjb25zdHJhaW50c1xuICogQHR5cGUge1JlYWRvbmx5PENvbnN0cmFpbnRzPn1cbiAqL1xuY29uc3QgZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyA9IE9iamVjdC5mcmVlemUoe1xuICBhdXRvbWF0aW9uTmFtZToge1xuICAgIHByZXNlbmNlOiB0cnVlLFxuICAgIGlzU3RyaW5nOiB0cnVlLFxuICB9LFxuICBwbGF0Zm9ybU5hbWU6IHtcbiAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICBpc1N0cmluZzogdHJ1ZSxcbiAgfSxcbn0pO1xuXG5jb25zdCBzZXNzaW9uc0xpc3RHdWFyZCA9IG5ldyBBc3luY0xvY2soKTtcbmNvbnN0IHBlbmRpbmdEcml2ZXJzR3VhcmQgPSBuZXcgQXN5bmNMb2NrKCk7XG5cbi8qKlxuICogQGltcGxlbWVudHMge1Nlc3Npb25IYW5kbGVyfVxuICovXG5jbGFzcyBBcHBpdW1Ecml2ZXIgZXh0ZW5kcyBEcml2ZXJDb3JlIHtcbiAgLyoqXG4gICAqIEFjY2VzcyB0byBzZXNzaW9ucyBsaXN0IG11c3QgYmUgZ3VhcmRlZCB3aXRoIGEgU2VtYXBob3JlLCBiZWNhdXNlXG4gICAqIGl0IG1pZ2h0IGJlIGNoYW5nZWQgYnkgb3RoZXIgYXN5bmMgY2FsbHMgYXQgYW55IHRpbWVcbiAgICogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gdGhlIG91dHNpZGVcbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsRXh0ZXJuYWxEcml2ZXI+fVxuICAgKi9cbiAgc2Vzc2lvbnMgPSB7fTtcblxuICAvKipcbiAgICogQWNjZXNzIHRvIHBlbmRpbmcgZHJpdmVycyBsaXN0IG11c3QgYmUgZ3VhcmRlZCB3aXRoIGEgU2VtYXBob3JlLCBiZWNhdXNlXG4gICAqIGl0IG1pZ2h0IGJlIGNoYW5nZWQgYnkgb3RoZXIgYXN5bmMgY2FsbHMgYXQgYW55IHRpbWVcbiAgICogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gdGhlIG91dHNpZGVcbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsRXh0ZXJuYWxEcml2ZXJbXT59XG4gICAqL1xuICBwZW5kaW5nRHJpdmVycyA9IHt9O1xuXG4gIC8qKlxuICAgKiBOb3RlIHRoYXQge0BsaW5rY29kZSBBcHBpdW1Ecml2ZXJ9IGhhcyBubyBgbmV3Q29tbWFuZFRpbWVvdXRgIG1ldGhvZC5cbiAgICogYEFwcGl1bURyaXZlcmAgZG9lcyBub3Qgc2V0IGFuZCBvYnNlcnZlIGl0cyBvd24gdGltZW91dHM7IGluZGl2aWR1YWxcbiAgICogc2Vzc2lvbnMgKG1hbmFnZWQgZHJpdmVycykgZG8gaW5zdGVhZC5cbiAgICovXG4gIG5ld0NvbW1hbmRUaW1lb3V0TXMgPSAwO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFjdGl2ZSBwbHVnaW5zXG4gICAqIEB0eXBlIHtQbHVnaW5DbGFzc1tdfVxuICAgKi9cbiAgcGx1Z2luQ2xhc3NlcyA9IFtdO1xuXG4gIC8qKlxuICAgKiBtYXAgb2Ygc2Vzc2lvbnMgdG8gYWN0dWFsIHBsdWdpbiBpbnN0YW5jZXMgcGVyIHNlc3Npb25cbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsSW5zdGFuY2VUeXBlPFBsdWdpbkNsYXNzPltdPn1cbiAgICovXG4gIHNlc3Npb25QbHVnaW5zID0ge307XG5cbiAgLyoqXG4gICAqIHNvbWUgY29tbWFuZHMgYXJlIHNlc3Npb25sZXNzLCBzbyB3ZSBuZWVkIGEgc2V0IG9mIHBsdWdpbnMgZm9yIHRoZW1cbiAgICogQHR5cGUge0luc3RhbmNlVHlwZTxQbHVnaW5DbGFzcz5bXX1cbiAgICovXG4gIHNlc3Npb25sZXNzUGx1Z2lucyA9IFtdOztcblxuICAvKiogQHR5cGUge0RyaXZlckNvbmZpZ30gKi9cbiAgZHJpdmVyQ29uZmlnO1xuXG4gIC8qKiBAdHlwZSB7QXBwaXVtU2VydmVyfSAqL1xuICBzZXJ2ZXI7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RHJpdmVyT3B0c30gb3B0c1xuICAgKi9cbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gc2V0IGAtLXRtcGAgaGVyZSBzaW5jZSBpdCBzaG91bGQgYmUgc2V0IHRvXG4gICAgLy8gcHJvY2Vzcy5lbnYuQVBQSVVNX1RNUF9ESVIgb25jZSBhdCBhbiBpbml0aWFsIHBvaW50IGluIHRoZSBBcHBpdW0gbGlmZWN5Y2xlLlxuICAgIC8vIFRoZSBwcm9jZXNzIGFyZ3VtZW50IHdpbGwgYmUgcmVmZXJlbmNlZCBieSBCYXNlRHJpdmVyLlxuICAgIC8vIFBsZWFzZSBjYWxsIEBhcHBpdW0vc3VwcG9ydC50ZW1wRGlyIG1vZHVsZSB0byBhcHBseSB0aGlzIGJlbmVmaXQuXG4gICAgaWYgKG9wdHMudG1wRGlyKSB7XG4gICAgICBwcm9jZXNzLmVudi5BUFBJVU1fVE1QX0RJUiA9IG9wdHMudG1wRGlyO1xuICAgIH1cblxuICAgIHN1cGVyKG9wdHMpO1xuXG4gICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSBkZXNpcmVkQ2FwYWJpbGl0eUNvbnN0cmFpbnRzO1xuXG4gICAgdGhpcy5hcmdzID0gey4uLm9wdHN9O1xuXG4gICAgLy8gYWxsb3cgdGhpcyB0byBoYXBwZW4gaW4gdGhlIGJhY2tncm91bmQsIHNvIG5vIGBhd2FpdGBcbiAgICAvLyBjYXRjaCB0aGlzIHRvIGF2b2lkIGFuIHVuaGFuZGxlZCByZWplY3Rpb25cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlbixwcm9taXNlL3ByZWZlci1hd2FpdC10by1jYWxsYmFja3NcbiAgICB1cGRhdGVCdWlsZEluZm8oKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhlcnIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBsb2dnZXIgaW5zdGFuY2UgZm9yIHRoZSBjdXJyZW50IHVtYnJlbGxhIGRyaXZlciBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0IGxvZyAoKSB7XG4gICAgaWYgKCF0aGlzLl9sb2cpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlTmFtZSA9IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX1AJHtub2RlLmdldE9iamVjdElkKHRoaXMpLnN1YnN0cmluZygwLCA0KX1gO1xuICAgICAgdGhpcy5fbG9nID0gbG9nZ2VyLmdldExvZ2dlcihpbnN0YW5jZU5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbG9nO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBjb21tYW5kcyBxdWV1ZWluZyBmb3IgdGhlIHVtYnJlbGxhIEFwcGl1bSBkcml2ZXJcbiAgICovXG4gIGdldCBpc0NvbW1hbmRzUXVldWVFbmFibGVkICgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzZXNzaW9uRXhpc3RzIChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgIHJldHVybiBkc3RTZXNzaW9uICYmIGRzdFNlc3Npb24uc2Vzc2lvbklkICE9PSBudWxsO1xuICB9XG5cbiAgZHJpdmVyRm9yU2Vzc2lvbiAoc2Vzc2lvbklkKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgfVxuXG4gIGFzeW5jIGdldFN0YXR1cyAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICAgIHJldHVybiB7XG4gICAgICBidWlsZDogXy5jbG9uZShnZXRCdWlsZEluZm8oKSksXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldFNlc3Npb25zICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgcmV0dXJuIF8udG9QYWlycyh0aGlzLnNlc3Npb25zKVxuICAgICAgLm1hcCgoW2lkLCBkcml2ZXJdKSA9PiAoe2lkLCBjYXBhYmlsaXRpZXM6IGRyaXZlci5jYXBzfSkpO1xuICB9XG5cbiAgcHJpbnROZXdTZXNzaW9uQW5ub3VuY2VtZW50IChkcml2ZXJOYW1lLCBkcml2ZXJWZXJzaW9uLCBkcml2ZXJCYXNlVmVyc2lvbikge1xuICAgIHRoaXMubG9nLmluZm8oZHJpdmVyVmVyc2lvblxuICAgICAgPyBgQXBwaXVtIHYke0FQUElVTV9WRVJ9IGNyZWF0aW5nIG5ldyAke2RyaXZlck5hbWV9ICh2JHtkcml2ZXJWZXJzaW9ufSkgc2Vzc2lvbmBcbiAgICAgIDogYEFwcGl1bSB2JHtBUFBJVU1fVkVSfSBjcmVhdGluZyBuZXcgJHtkcml2ZXJOYW1lfSBzZXNzaW9uYFxuICAgICk7XG4gICAgdGhpcy5sb2cuaW5mbyhgQ2hlY2tpbmcgQmFzZURyaXZlciB2ZXJzaW9ucyBmb3IgQXBwaXVtIGFuZCAke2RyaXZlck5hbWV9YCk7XG4gICAgdGhpcy5sb2cuaW5mbyhBcHBpdW1Ecml2ZXIuYmFzZVZlcnNpb25cbiAgICAgID8gYEFwcGl1bSdzIEJhc2VEcml2ZXIgdmVyc2lvbiBpcyAke0FwcGl1bURyaXZlci5iYXNlVmVyc2lvbn1gXG4gICAgICA6IGBDb3VsZCBub3QgZGV0ZXJtaW5lIEFwcGl1bSdzIEJhc2VEcml2ZXIgdmVyc2lvbmBcbiAgICApO1xuICAgIHRoaXMubG9nLmluZm8oZHJpdmVyQmFzZVZlcnNpb25cbiAgICAgID8gYCR7ZHJpdmVyTmFtZX0ncyBCYXNlRHJpdmVyIHZlcnNpb24gaXMgJHtkcml2ZXJCYXNlVmVyc2lvbn1gXG4gICAgICA6IGBDb3VsZCBub3QgZGV0ZXJtaW5lICR7ZHJpdmVyTmFtZX0ncyBCYXNlRHJpdmVyIHZlcnNpb25gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbmQgYXNzaWduIENMSSBhcmdzIGZvciBhIGRyaXZlciBvciBwbHVnaW5cbiAgICpcbiAgICogSWYgdGhlIGV4dGVuc2lvbiBoYXMgcHJvdmlkZWQgYSBzY2hlbWEsIHZhbGlkYXRpb24gaGFzIGFscmVhZHkgaGFwcGVuZWQuXG4gICAqXG4gICAqIEFueSBhcmcgd2hpY2ggaXMgZXF1YWwgdG8gaXRzIGRlZmF1bHQgdmFsdWUgd2lsbCBub3QgYmUgYXNzaWduZWQgdG8gdGhlIGV4dGVuc2lvbi5cbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlICdkcml2ZXInIG9yICdwbHVnaW4nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IGV4dEluc3RhbmNlIHRoZSBkcml2ZXIgb3IgcGx1Z2luIGluc3RhbmNlXG4gICAqL1xuICBhc3NpZ25DbGlBcmdzVG9FeHRlbnNpb24gKGV4dFR5cGUsIGV4dE5hbWUsIGV4dEluc3RhbmNlKSB7XG4gICAgY29uc3QgYWxsQ2xpQXJnc0ZvckV4dCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyx1bmtub3duPnx1bmRlZmluZWR9ICovKHRoaXMuYXJnc1tleHRUeXBlXT8uW2V4dE5hbWVdKTtcbiAgICBpZiAoIV8uaXNFbXB0eShhbGxDbGlBcmdzRm9yRXh0KSkge1xuICAgICAgY29uc3QgZGVmYXVsdHMgPSBnZXREZWZhdWx0c0ZvckV4dGVuc2lvbihleHRUeXBlLCBleHROYW1lKTtcbiAgICAgIGNvbnN0IGNsaUFyZ3MgPSBfLmlzRW1wdHkoZGVmYXVsdHMpXG4gICAgICAgID8gYWxsQ2xpQXJnc0ZvckV4dFxuICAgICAgICA6IF8ub21pdEJ5KGFsbENsaUFyZ3NGb3JFeHQsICh2YWx1ZSwga2V5KSA9PiBfLmlzRXF1YWwoZGVmYXVsdHNba2V5XSwgdmFsdWUpKTtcbiAgICAgIGlmICghXy5pc0VtcHR5KGNsaUFyZ3MpKSB7XG4gICAgICAgIGV4dEluc3RhbmNlLmNsaUFyZ3MgPSBjbGlBcmdzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgc2Vzc2lvblxuICAgKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllc30ganNvbndwQ2FwcyBKU09OV1AgZm9ybWF0dGVkIGRlc2lyZWQgY2FwYWJpbGl0aWVzXG4gICAqIEBwYXJhbSB7VzNDQ2FwYWJpbGl0aWVzfSByZXFDYXBzIFJlcXVpcmVkIGNhcGFiaWxpdGllcyAoSlNPTldQIHN0YW5kYXJkKVxuICAgKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllc30gdzNjQ2FwYWJpbGl0aWVzIFczQyBjYXBhYmlsaXRpZXNcbiAgICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJEYXRhW119IFtkcml2ZXJEYXRhXVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU2Vzc2lvbiAoanNvbndwQ2FwcywgcmVxQ2FwcywgdzNjQ2FwYWJpbGl0aWVzLCBkcml2ZXJEYXRhKSB7XG4gICAgY29uc3QgZGVmYXVsdENhcGFiaWxpdGllcyA9IF8uY2xvbmVEZWVwKHRoaXMuYXJncy5kZWZhdWx0Q2FwYWJpbGl0aWVzKTtcbiAgICBjb25zdCBkZWZhdWx0U2V0dGluZ3MgPSBwdWxsU2V0dGluZ3MoZGVmYXVsdENhcGFiaWxpdGllcyk7XG4gICAganNvbndwQ2FwcyA9IF8uY2xvbmVEZWVwKGpzb253cENhcHMpO1xuICAgIGNvbnN0IGp3cFNldHRpbmdzID0gey4uLmRlZmF1bHRTZXR0aW5ncywgLi4ucHVsbFNldHRpbmdzKGpzb253cENhcHMpfTtcbiAgICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNsaWVudCBvbmx5IHByb3ZpZGVzIGNhcHMgdXNpbmcgSlNPTldQIHN0YW5kYXJkLFxuICAgIC8vIGFsdGhvdWdoIGZpcnN0TWF0Y2gvYWx3YXlzTWF0Y2ggcHJvcGVydGllcyBhcmUgc3RpbGwgcHJlc2VudC5cbiAgICAvLyBJbiBzdWNoIGNhc2Ugd2UgYXNzdW1lIHRoZSBjbGllbnQgdW5kZXJzdGFuZHMgVzNDIHByb3RvY29sIGFuZCBtZXJnZSB0aGUgZ2l2ZW5cbiAgICAvLyBKU09OV1AgY2FwcyB0byBXM0MgY2Fwc1xuICAgIGNvbnN0IHczY1NldHRpbmdzID0ge1xuICAgICAgLi4uandwU2V0dGluZ3MsXG4gICAgICAuLi5wdWxsU2V0dGluZ3MoKHczY0NhcGFiaWxpdGllcyA/PyB7fSkuYWx3YXlzTWF0Y2ggPz8ge30pXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGZpcnN0TWF0Y2hFbnRyeSBvZiAoKHczY0NhcGFiaWxpdGllcyA/PyB7fSkuZmlyc3RNYXRjaCA/PyBbXSkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odzNjU2V0dGluZ3MsIHB1bGxTZXR0aW5ncyhmaXJzdE1hdGNoRW50cnkpKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvdG9jb2w7XG4gICAgbGV0IGlubmVyU2Vzc2lvbklkLCBkQ2FwcztcbiAgICB0cnkge1xuICAgICAgLy8gUGFyc2UgdGhlIGNhcHMgaW50byBhIGZvcm1hdCB0aGF0IHRoZSBJbm5lckRyaXZlciB3aWxsIGFjY2VwdFxuICAgICAgY29uc3QgcGFyc2VkQ2FwcyA9IHBhcnNlQ2Fwc0ZvcklubmVyRHJpdmVyKFxuICAgICAgICBqc29ud3BDYXBzLFxuICAgICAgICB3M2NDYXBhYmlsaXRpZXMsXG4gICAgICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzLFxuICAgICAgICBkZWZhdWx0Q2FwYWJpbGl0aWVzXG4gICAgICApO1xuXG4gICAgICBjb25zdCB7ZGVzaXJlZENhcHMsIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcywgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzfSA9IC8qKiBAdHlwZSB7aW1wb3J0KCcuL3V0aWxzJykuUGFyc2VkRHJpdmVyQ2Fwc30gKi8ocGFyc2VkQ2Fwcyk7XG4gICAgICBwcm90b2NvbCA9IHBhcnNlZENhcHMucHJvdG9jb2w7XG4gICAgICBjb25zdCBlcnJvciA9IC8qKiBAdHlwZSB7aW1wb3J0KCcuL3V0aWxzJykuSW52YWxpZENhcHN9ICovKHBhcnNlZENhcHMpLmVycm9yO1xuICAgICAgLy8gSWYgdGhlIHBhcnNpbmcgb2YgdGhlIGNhcHMgcHJvZHVjZWQgYW4gZXJyb3IsIHRocm93IGl0IGluIGhlcmVcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge1xuICAgICAgICBkcml2ZXI6IElubmVyRHJpdmVyLFxuICAgICAgICB2ZXJzaW9uOiBkcml2ZXJWZXJzaW9uLFxuICAgICAgICBkcml2ZXJOYW1lXG4gICAgICB9ID0gdGhpcy5kcml2ZXJDb25maWcuZmluZE1hdGNoaW5nRHJpdmVyKGRlc2lyZWRDYXBzKTtcbiAgICAgIHRoaXMucHJpbnROZXdTZXNzaW9uQW5ub3VuY2VtZW50KElubmVyRHJpdmVyLm5hbWUsIGRyaXZlclZlcnNpb24sIElubmVyRHJpdmVyLmJhc2VWZXJzaW9uKTtcblxuICAgICAgaWYgKHRoaXMuYXJncy5zZXNzaW9uT3ZlcnJpZGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVBbGxTZXNzaW9ucygpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHtEcml2ZXJEYXRhW119XG4gICAgICAgKi9cbiAgICAgIGxldCBydW5uaW5nRHJpdmVyc0RhdGEgPSBbXTtcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUge0RyaXZlckRhdGFbXX1cbiAgICAgICAqL1xuICAgICAgbGV0IG90aGVyUGVuZGluZ0RyaXZlcnNEYXRhID0gW107XG5cbiAgICAgIGNvbnN0IGRyaXZlckluc3RhbmNlID0gbmV3IElubmVyRHJpdmVyKHRoaXMuYXJncywgdHJ1ZSk7XG5cbiAgICAgIC8vIFdlIHdhbnQgdG8gYXNzaWduIHNlY3VyaXR5IHZhbHVlcyBkaXJlY3RseSBvbiB0aGUgZHJpdmVyLiBUaGUgZHJpdmVyXG4gICAgICAvLyBzaG91bGQgbm90IHJlYWQgc2VjdXJpdHkgdmFsdWVzIGZyb20gYHRoaXMub3B0c2AgYmVjYXVzZSB0aG9zZSB2YWx1ZXNcbiAgICAgIC8vIGNvdWxkIGhhdmUgYmVlbiBzZXQgYnkgYSBtYWxpY2lvdXMgdXNlciB2aWEgY2FwYWJpbGl0aWVzLCB3aGVyZWFzIHdlXG4gICAgICAvLyB3YW50IGEgZ3VhcmFudGVlIHRoZSB2YWx1ZXMgd2VyZSBzZXQgYnkgdGhlIGFwcGl1bSBzZXJ2ZXIgYWRtaW5cbiAgICAgIGlmICh0aGlzLmFyZ3MucmVsYXhlZFNlY3VyaXR5RW5hYmxlZCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBBcHBseWluZyByZWxheGVkIHNlY3VyaXR5IHRvICcke0lubmVyRHJpdmVyLm5hbWV9JyBhcyBwZXIgYCArXG4gICAgICAgICAgYHNlcnZlciBjb21tYW5kIGxpbmUgYXJndW1lbnQuIEFsbCBpbnNlY3VyZSBmZWF0dXJlcyB3aWxsIGJlIGAgK1xuICAgICAgICAgIGBlbmFibGVkIHVubGVzcyBleHBsaWNpdGx5IGRpc2FibGVkIGJ5IC0tZGVueS1pbnNlY3VyZWApO1xuICAgICAgICBkcml2ZXJJbnN0YW5jZS5yZWxheGVkU2VjdXJpdHlFbmFibGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5hcmdzLmRlbnlJbnNlY3VyZSkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRXhwbGljaXRseSBwcmV2ZW50aW5nIHVzZSBvZiBpbnNlY3VyZSBmZWF0dXJlczonKTtcbiAgICAgICAgdGhpcy5hcmdzLmRlbnlJbnNlY3VyZS5tYXAoKGEpID0+IHRoaXMubG9nLmluZm8oYCAgICAke2F9YCkpO1xuICAgICAgICBkcml2ZXJJbnN0YW5jZS5kZW55SW5zZWN1cmUgPSB0aGlzLmFyZ3MuZGVueUluc2VjdXJlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZSkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRXhwbGljaXRseSBlbmFibGluZyB1c2Ugb2YgaW5zZWN1cmUgZmVhdHVyZXM6Jyk7XG4gICAgICAgIHRoaXMuYXJncy5hbGxvd0luc2VjdXJlLm1hcCgoYSkgPT4gdGhpcy5sb2cuaW5mbyhgICAgICR7YX1gKSk7XG4gICAgICAgIGRyaXZlckluc3RhbmNlLmFsbG93SW5zZWN1cmUgPSB0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZTtcbiAgICAgIH1cblxuICAgICAgLy8gTGlrZXdpc2UsIGFueSBkcml2ZXItc3BlY2lmaWMgQ0xJIGFyZ3MgdGhhdCB3ZXJlIHBhc3NlZCBpbiBzaG91bGQgYmUgYXNzaWduZWQgZGlyZWN0bHkgdG9cbiAgICAgIC8vIHRoZSBkcml2ZXIgc28gdGhhdCB0aGV5IGNhbm5vdCBiZSBtaW1pY2tlZCBieSBhIG1hbGljaW91cyB1c2VyIHNlbmRpbmcgaW4gY2FwYWJpbGl0aWVzXG4gICAgICB0aGlzLmFzc2lnbkNsaUFyZ3NUb0V4dGVuc2lvbignZHJpdmVyJywgZHJpdmVyTmFtZSwgZHJpdmVySW5zdGFuY2UpO1xuXG4gICAgICAvLyBUaGlzIGFzc2lnbm1lbnQgaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3Qgd2ViIHNvY2tldHMgZnVuY3Rpb25hbGl0eSBpbnNpZGUgdGhlIGRyaXZlclxuICAgICAgLy8gRHJpdmVycy9wbHVnaW5zIG1pZ2h0IGFsc28gd2FudCB0byBrbm93IHdoZXJlIHRoZXkgYXJlIGhvc3RlZFxuXG4gICAgICAvLyBYWFg6IHRlbXBvcmFyeSBoYWNrIHRvIHdvcmsgYXJvdW5kICMxNjc0N1xuICAgICAgZHJpdmVySW5zdGFuY2Uuc2VydmVyID0gdGhpcy5zZXJ2ZXI7XG4gICAgICBkcml2ZXJJbnN0YW5jZS5zZXJ2ZXJIb3N0ID0gdGhpcy5hcmdzLmFkZHJlc3M7XG4gICAgICBkcml2ZXJJbnN0YW5jZS5zZXJ2ZXJQb3J0ID0gdGhpcy5hcmdzLnBvcnQ7XG4gICAgICBkcml2ZXJJbnN0YW5jZS5zZXJ2ZXJQYXRoID0gdGhpcy5hcmdzLmJhc2VQYXRoO1xuXG4gICAgICB0cnkge1xuICAgICAgICBydW5uaW5nRHJpdmVyc0RhdGEgPSBhd2FpdCB0aGlzLmN1clNlc3Npb25EYXRhRm9yRHJpdmVyKElubmVyRHJpdmVyKSA/PyBbXTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKGUubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBwZW5kaW5nRHJpdmVyc0d1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHtcbiAgICAgICAgdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXSA9IHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0gfHwgW107XG4gICAgICAgIG90aGVyUGVuZGluZ0RyaXZlcnNEYXRhID0gXy5jb21wYWN0KHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0ubWFwKChkcnYpID0+IGRydi5kcml2ZXJEYXRhKSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0ucHVzaChkcml2ZXJJbnN0YW5jZSk7XG4gICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgW2lubmVyU2Vzc2lvbklkLCBkQ2Fwc10gPSBhd2FpdCBkcml2ZXJJbnN0YW5jZS5jcmVhdGVTZXNzaW9uKFxuICAgICAgICAgIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyxcbiAgICAgICAgICByZXFDYXBzLFxuICAgICAgICAgIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyxcbiAgICAgICAgICBbLi4ucnVubmluZ0RyaXZlcnNEYXRhLCAuLi5vdGhlclBlbmRpbmdEcml2ZXJzRGF0YV1cbiAgICAgICAgKTtcbiAgICAgICAgcHJvdG9jb2wgPSBkcml2ZXJJbnN0YW5jZS5wcm90b2NvbDtcbiAgICAgICAgdGhpcy5zZXNzaW9uc1tpbm5lclNlc3Npb25JZF0gPSBkcml2ZXJJbnN0YW5jZTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHBlbmRpbmdEcml2ZXJzR3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICAgIF8ucHVsbCh0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdLCBkcml2ZXJJbnN0YW5jZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIoZHJpdmVySW5zdGFuY2UsIGlubmVyU2Vzc2lvbklkKTtcblxuICAgICAgdGhpcy5sb2cuaW5mbyhgTmV3ICR7SW5uZXJEcml2ZXIubmFtZX0gc2Vzc2lvbiBjcmVhdGVkIHN1Y2Nlc3NmdWxseSwgc2Vzc2lvbiBgICtcbiAgICAgICAgYCR7aW5uZXJTZXNzaW9uSWR9IGFkZGVkIHRvIG1hc3RlciBzZXNzaW9uIGxpc3RgKTtcblxuICAgICAgLy8gc2V0IHRoZSBOZXcgQ29tbWFuZCBUaW1lb3V0IGZvciB0aGUgaW5uZXIgZHJpdmVyXG4gICAgICBkcml2ZXJJbnN0YW5jZS5zdGFydE5ld0NvbW1hbmRUaW1lb3V0KCk7XG5cbiAgICAgIC8vIGFwcGx5IGluaXRpYWwgdmFsdWVzIHRvIEFwcGl1bSBzZXR0aW5ncyAoaWYgcHJvdmlkZWQpXG4gICAgICBpZiAoZHJpdmVySW5zdGFuY2UuaXNXM0NQcm90b2NvbCgpICYmICFfLmlzRW1wdHkodzNjU2V0dGluZ3MpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYEFwcGx5aW5nIHRoZSBpbml0aWFsIHZhbHVlcyB0byBBcHBpdW0gc2V0dGluZ3MgcGFyc2VkIGZyb20gVzNDIGNhcHM6IGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHczY1NldHRpbmdzKSk7XG4gICAgICAgIGF3YWl0IGRyaXZlckluc3RhbmNlLnVwZGF0ZVNldHRpbmdzKHczY1NldHRpbmdzKTtcbiAgICAgIH0gZWxzZSBpZiAoZHJpdmVySW5zdGFuY2UuaXNNanNvbndwUHJvdG9jb2woKSAmJiAhXy5pc0VtcHR5KGp3cFNldHRpbmdzKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBBcHBseWluZyB0aGUgaW5pdGlhbCB2YWx1ZXMgdG8gQXBwaXVtIHNldHRpbmdzIHBhcnNlZCBmcm9tIE1KU09OV1AgY2FwczogYCArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoandwU2V0dGluZ3MpKTtcbiAgICAgICAgYXdhaXQgZHJpdmVySW5zdGFuY2UudXBkYXRlU2V0dGluZ3MoandwU2V0dGluZ3MpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwcm90b2NvbCxcbiAgICAgIHZhbHVlOiBbaW5uZXJTZXNzaW9uSWQsIGRDYXBzLCBwcm90b2NvbF1cbiAgICB9O1xuICB9XG5cbiAgYXR0YWNoVW5leHBlY3RlZFNodXRkb3duSGFuZGxlciAoZHJpdmVyLCBpbm5lclNlc3Npb25JZCkge1xuICAgIGNvbnN0IG9uU2h1dGRvd24gPSAoY2F1c2UgPSBuZXcgRXJyb3IoJ1Vua25vd24gZXJyb3InKSkgPT4ge1xuICAgICAgdGhpcy5sb2cud2FybihgRW5kaW5nIHNlc3Npb24sIGNhdXNlIHdhcyAnJHtjYXVzZS5tZXNzYWdlfSdgKTtcblxuICAgICAgaWYgKHRoaXMuc2Vzc2lvblBsdWdpbnNbaW5uZXJTZXNzaW9uSWRdKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuc2Vzc2lvblBsdWdpbnNbaW5uZXJTZXNzaW9uSWRdKSB7XG4gICAgICAgICAgaWYgKF8uaXNGdW5jdGlvbihwbHVnaW4ub25VbmV4cGVjdGVkU2h1dGRvd24pKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgUGx1Z2luICR7cGx1Z2luLm5hbWV9IGRlZmluZXMgYW4gdW5leHBlY3RlZCBzaHV0ZG93biBoYW5kbGVyOyBjYWxsaW5nIGl0IG5vd2ApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcGx1Z2luLm9uVW5leHBlY3RlZFNodXRkb3duKGRyaXZlciwgY2F1c2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBHb3QgYW4gZXJyb3Igd2hlbiBydW5uaW5nIHBsdWdpbiAke3BsdWdpbi5uYW1lfSBzaHV0ZG93biBoYW5kbGVyOiAke2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBQbHVnaW4gJHtwbHVnaW4ubmFtZX0gZG9lcyBub3QgZGVmaW5lIGFuIHVuZXhwZWN0ZWQgc2h1dGRvd24gaGFuZGxlcmApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZy5pbmZvKGBSZW1vdmluZyBzZXNzaW9uICcke2lubmVyU2Vzc2lvbklkfScgZnJvbSBvdXIgbWFzdGVyIHNlc3Npb24gbGlzdGApO1xuICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvbnNbaW5uZXJTZXNzaW9uSWRdO1xuICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvblBsdWdpbnNbaW5uZXJTZXNzaW9uSWRdO1xuICAgIH07XG5cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGRyaXZlci5vblVuZXhwZWN0ZWRTaHV0ZG93bikpIHtcbiAgICAgIGRyaXZlci5vblVuZXhwZWN0ZWRTaHV0ZG93bihvblNodXRkb3duKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cud2FybihgRmFpbGVkIHRvIGF0dGFjaCB0aGUgdW5leHBlY3RlZCBzaHV0ZG93biBsaXN0ZW5lci4gYCArXG4gICAgICAgIGBJcyAnb25VbmV4cGVjdGVkU2h1dGRvd24nIG1ldGhvZCBhdmFpbGFibGUgZm9yICcke2RyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfSc/YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuLi90eXBlcy9leHRlbnNpb24nKS5Ecml2ZXJDbGFzc30gSW5uZXJEcml2ZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8RHJpdmVyRGF0YVtdPn19XG4gICAqL1xuICBhc3luYyBjdXJTZXNzaW9uRGF0YUZvckRyaXZlciAoSW5uZXJEcml2ZXIpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgY29uc3QgZGF0YSA9IF8uY29tcGFjdChfLnZhbHVlcyh0aGlzLnNlc3Npb25zKVxuICAgICAgLmZpbHRlcigocykgPT4gcy5jb25zdHJ1Y3Rvci5uYW1lID09PSBJbm5lckRyaXZlci5uYW1lKVxuICAgICAgLm1hcCgocykgPT4gcy5kcml2ZXJEYXRhKSk7XG4gICAgZm9yIChjb25zdCBkYXR1bSBvZiBkYXRhKSB7XG4gICAgICBpZiAoIWRhdHVtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvYmxlbSBnZXR0aW5nIHNlc3Npb24gZGF0YSBmb3IgZHJpdmVyIHR5cGUgYCArXG4gICAgICAgICAgYCR7SW5uZXJEcml2ZXIubmFtZX07IGRvZXMgaXQgaW1wbGVtZW50ICdnZXQgZHJpdmVyRGF0YSc/YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKHNlc3Npb25JZCkge1xuICAgIGxldCBwcm90b2NvbDtcbiAgICB0cnkge1xuICAgICAgbGV0IG90aGVyU2Vzc2lvbnNEYXRhO1xuICAgICAgY29uc3QgZHN0U2Vzc2lvbiA9IGF3YWl0IHNlc3Npb25zTGlzdEd1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VyQ29uc3RydWN0b3JOYW1lID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIG90aGVyU2Vzc2lvbnNEYXRhID0gXy50b1BhaXJzKHRoaXMuc2Vzc2lvbnMpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUuY29uc3RydWN0b3IubmFtZSA9PT0gY3VyQ29uc3RydWN0b3JOYW1lICYmIGtleSAhPT0gc2Vzc2lvbklkKVxuICAgICAgICAgICAgICAubWFwKChbLCB2YWx1ZV0pID0+IHZhbHVlLmRyaXZlckRhdGEpO1xuICAgICAgICBjb25zdCBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgICAgICBwcm90b2NvbCA9IGRzdFNlc3Npb24ucHJvdG9jb2w7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFJlbW92aW5nIHNlc3Npb24gJHtzZXNzaW9uSWR9IGZyb20gb3VyIG1hc3RlciBzZXNzaW9uIGxpc3RgKTtcbiAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBkZWxldGVTZXNzaW9uIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgb3Igbm90XG4gICAgICAgIC8vIG1ha2UgdGhlIHNlc3Npb24gdW5hdmFpbGFibGUsIGJlY2F1c2Ugd2hvIGtub3dzIHdoYXQgc3RhdGUgaXQgbWlnaHRcbiAgICAgICAgLy8gYmUgaW4gb3RoZXJ3aXNlXG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF07XG4gICAgICAgIHJldHVybiBkc3RTZXNzaW9uO1xuICAgICAgfSk7XG4gICAgICAvLyB0aGlzIG1heSBub3QgYmUgY29ycmVjdCwgYnV0IGlmIGBkc3RTZXNzaW9uYCB3YXMgZmFsc3ksIHRoZSBjYWxsIHRvIGBkZWxldGVTZXNzaW9uKClgIHdvdWxkXG4gICAgICAvLyB0aHJvdyBhbnl3YXkuXG4gICAgICBpZiAoIWRzdFNlc3Npb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXNzaW9uIG5vdCBmb3VuZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIHZhbHVlOiBhd2FpdCBkc3RTZXNzaW9uLmRlbGV0ZVNlc3Npb24oc2Vzc2lvbklkLCBvdGhlclNlc3Npb25zRGF0YSksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBIYWQgdHJvdWJsZSBlbmRpbmcgc2Vzc2lvbiAke3Nlc3Npb25JZH06ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIGVycm9yOiBlLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVBbGxTZXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gICAgY29uc3Qgc2Vzc2lvbnNDb3VudCA9IF8uc2l6ZSh0aGlzLnNlc3Npb25zKTtcbiAgICBpZiAoMCA9PT0gc2Vzc2lvbnNDb3VudCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ1RoZXJlIGFyZSBubyBhY3RpdmUgc2Vzc2lvbnMgZm9yIGNsZWFudXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBmb3JjZSA9IGZhbHNlLFxuICAgICAgcmVhc29uLFxuICAgIH0gPSBvcHRzO1xuICAgIHRoaXMubG9nLmRlYnVnKGBDbGVhbmluZyB1cCAke3V0aWwucGx1cmFsaXplKCdhY3RpdmUgc2Vzc2lvbicsIHNlc3Npb25zQ291bnQsIHRydWUpfWApO1xuICAgIGNvbnN0IGNsZWFudXBQcm9taXNlcyA9IGZvcmNlXG4gICAgICA/IF8udmFsdWVzKHRoaXMuc2Vzc2lvbnMpLm1hcCgoZHJ2KSA9PiBkcnYuc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24ocmVhc29uICYmIG5ldyBFcnJvcihyZWFzb24pKSlcbiAgICAgIDogXy5rZXlzKHRoaXMuc2Vzc2lvbnMpLm1hcCgoaWQpID0+IHRoaXMuZGVsZXRlU2Vzc2lvbihpZCkpO1xuICAgIGZvciAoY29uc3QgY2xlYW51cFByb21pc2Ugb2YgY2xlYW51cFByb21pc2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjbGVhbnVwUHJvbWlzZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXBwcm9wcmlhdGUgcGx1Z2lucyBmb3IgYSBzZXNzaW9uIChvciBzZXNzaW9ubGVzcyBwbHVnaW5zKVxuICAgKlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IHNlc3Npb25JZCAtIHRoZSBzZXNzaW9uSWQgKG9yIG51bGwpIHRvIHVzZSB0byBmaW5kIHBsdWdpbnNcbiAgICogQHJldHVybnMge0FycmF5fSAtIGFycmF5IG9mIHBsdWdpbiBpbnN0YW5jZXNcbiAgICovXG4gIHBsdWdpbnNGb3JTZXNzaW9uIChzZXNzaW9uSWQgPSBudWxsKSB7XG4gICAgaWYgKHNlc3Npb25JZCkge1xuICAgICAgaWYgKCF0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF0pIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uUGx1Z2luc1tzZXNzaW9uSWRdID0gdGhpcy5jcmVhdGVQbHVnaW5JbnN0YW5jZXMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF07XG4gICAgfVxuXG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLnNlc3Npb25sZXNzUGx1Z2lucykpIHtcbiAgICAgIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zID0gdGhpcy5jcmVhdGVQbHVnaW5JbnN0YW5jZXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIGdldCBwbHVnaW5zIGZvciBhIGNvbW1hbmQsIHdlIGVpdGhlciBnZXQgdGhlIHBsdWdpbiBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiBwYXJ0aWN1bGFyIGNvbW1hbmQncyBzZXNzaW9uLCBvciBpbiB0aGUgY2FzZSBvZiBzZXNzaW9ubGVzcyBwbHVnaW5zLCBwdWxsIGZyb20gdGhlIHNldCBvZlxuICAgKiBwbHVnaW4gaW5zdGFuY2VzIHJlc2VydmVkIGZvciBzZXNzaW9ubGVzcyBjb21tYW5kcyAoYW5kIHdlIGxhemlseSBjcmVhdGUgcGx1Z2luIGluc3RhbmNlcyBvblxuICAgKiBmaXJzdCB1c2UpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbWQgLSB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZCB0byBmaW5kIGEgcGx1Z2luIHRvIGhhbmRsZVxuICAgKiBAcGFyYW0gez9zdHJpbmd9IHNlc3Npb25JZCAtIHRoZSBwYXJ0aWN1bGFyIHNlc3Npb24gZm9yIHdoaWNoIHRvIGZpbmQgYSBwbHVnaW4sIG9yIG51bGwgaWZcbiAgICogc2Vzc2lvbmxlc3NcbiAgICovXG4gIHBsdWdpbnNUb0hhbmRsZUNtZCAoY21kLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gICAgLy8gdG8gaGFuZGxlIGEgZ2l2ZW4gY29tbWFuZCwgYSBwbHVnaW4gc2hvdWxkIGVpdGhlciBpbXBsZW1lbnQgdGhhdCBjb21tYW5kIGFzIGEgcGx1Z2luXG4gICAgLy8gaW5zdGFuY2UgbWV0aG9kIG9yIGl0IHNob3VsZCBpbXBsZW1lbnQgYSBnZW5lcmljICdoYW5kbGUnIG1ldGhvZFxuICAgIHJldHVybiB0aGlzLnBsdWdpbnNGb3JTZXNzaW9uKHNlc3Npb25JZClcbiAgICAgIC5maWx0ZXIoKHApID0+IF8uaXNGdW5jdGlvbihwW2NtZF0pIHx8IF8uaXNGdW5jdGlvbihwLmhhbmRsZSkpO1xuICB9XG5cbiAgY3JlYXRlUGx1Z2luSW5zdGFuY2VzICgpIHtcbiAgICByZXR1cm4gdGhpcy5wbHVnaW5DbGFzc2VzLm1hcCgoUGx1Z2luQ2xhc3MpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBQbHVnaW5DbGFzcy5wbHVnaW5OYW1lO1xuICAgICAgY29uc3QgcGx1Z2luID0gbmV3IFBsdWdpbkNsYXNzKG5hbWUpO1xuICAgICAgdGhpcy5hc3NpZ25DbGlBcmdzVG9FeHRlbnNpb24oJ3BsdWdpbicsIG5hbWUsIHBsdWdpbik7XG4gICAgICByZXR1cm4gcGx1Z2luO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbWRcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHt2YWx1ZTogYW55LCBlcnJvcj86IEVycm9yLCBwcm90b2NvbDogc3RyaW5nfSB8IGltcG9ydCgndHlwZS1mZXN0JykuQXN5bmNSZXR1cm5UeXBlPGltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlclsnZXhlY3V0ZUNvbW1hbmQnXT4+fVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUNvbW1hbmQgKGNtZCwgLi4uYXJncykge1xuICAgIC8vIFdlIGhhdmUgYmFzaWNhbGx5IHRocmVlIGNhc2VzIGZvciBob3cgdG8gaGFuZGxlIGNvbW1hbmRzOlxuICAgIC8vIDEuIGhhbmRsZSBnZXRTdGF0dXMgKHdlIGRvIHRoaXMgYXMgYSBzcGVjaWFsIG91dCBvZiBiYW5kIGNhc2Ugc28gaXQgZG9lc24ndCBnZXQgYWRkZWQgdG8gYW5cbiAgICAvLyAgICBleGVjdXRpb24gcXVldWUsIGFuZCBjYW4gYmUgY2FsbGVkIHdoaWxlIGUuZy4gY3JlYXRlU2Vzc2lvbiBpcyBpbiBwcm9ncmVzcylcbiAgICAvLyAyLiBoYW5kbGUgY29tbWFuZHMgdGhhdCB0aGlzIHVtYnJlbGxhIGRyaXZlciBzaG91bGQgaGFuZGxlLCByYXRoZXIgdGhhbiB0aGUgYWN0dWFsIHNlc3Npb25cbiAgICAvLyAgICBkcml2ZXIgKGZvciBleGFtcGxlLCBkZWxldGVTZXNzaW9uLCBvciBvdGhlciBub24tc2Vzc2lvbiBjb21tYW5kcylcbiAgICAvLyAzLiBoYW5kbGUgc2Vzc2lvbiBkcml2ZXIgY29tbWFuZHMuXG4gICAgLy8gVGhlIHRyaWNreSBwYXJ0IGlzIHRoYXQgYmVjYXVzZSB3ZSBzdXBwb3J0IGNvbW1hbmQgcGx1Z2lucywgd2UgbmVlZCB0byB3cmFwIGFueSBvZiB0aGVzZVxuICAgIC8vIGNhc2VzIHdpdGggcGx1Z2luIGhhbmRsaW5nLlxuXG4gICAgY29uc3QgaXNHZXRTdGF0dXMgPSBjbWQgPT09IEdFVF9TVEFUVVNfQ09NTUFORDtcbiAgICBjb25zdCBpc1VtYnJlbGxhQ21kID0gaXNBcHBpdW1Ecml2ZXJDb21tYW5kKGNtZCk7XG4gICAgY29uc3QgaXNTZXNzaW9uQ21kID0gaXNTZXNzaW9uQ29tbWFuZChjbWQpO1xuXG4gICAgLy8gaWYgYSBwbHVnaW4gb3ZlcnJpZGUgcHJveHlpbmcgZm9yIHRoaXMgY29tbWFuZCBhbmQgdGhhdCBpcyB3aHkgd2UgYXJlIGhlcmUgaW5zdGVhZCBvZiBqdXN0XG4gICAgLy8gbGV0dGluZyB0aGUgcHJvdG9jb2wgcHJveHkgdGhlIGNvbW1hbmQgZW50aXJlbHksIGRldGVybWluZSB0aGF0LCBnZXQgdGhlIHJlcXVlc3Qgb2JqZWN0IGZvclxuICAgIC8vIHVzZSBsYXRlciBvbiwgdGhlbiBjbGVhbiB1cCB0aGUgYXJnc1xuICAgIGNvbnN0IHJlcUZvclByb3h5ID0gXy5sYXN0KGFyZ3MpPy5yZXFGb3JQcm94eTtcbiAgICBpZiAocmVxRm9yUHJveHkpIHtcbiAgICAgIGFyZ3MucG9wKCk7XG4gICAgfVxuXG5cbiAgICAvLyBmaXJzdCBkbyBzb21lIGVycm9yIGNoZWNraW5nLiBJZiB3ZSdyZSByZXF1ZXN0aW5nIGEgc2Vzc2lvbiBjb21tYW5kIGV4ZWN1dGlvbiwgdGhlbiBtYWtlXG4gICAgLy8gc3VyZSB0aGF0IHNlc3Npb24gYWN0dWFsbHkgZXhpc3RzIG9uIHRoZSBzZXNzaW9uIGRyaXZlciwgYW5kIHNldCB0aGUgc2Vzc2lvbiBkcml2ZXIgaXRzZWxmXG4gICAgbGV0IHNlc3Npb25JZCA9IG51bGw7XG4gICAgbGV0IGRzdFNlc3Npb24gPSBudWxsO1xuICAgIGxldCBwcm90b2NvbCA9IG51bGw7XG4gICAgLyoqIEB0eXBlIHt0aGlzIHwgRXh0ZXJuYWxEcml2ZXJ9ICovXG4gICAgbGV0IGRyaXZlciA9IHRoaXM7XG4gICAgaWYgKGlzU2Vzc2lvbkNtZCkge1xuICAgICAgc2Vzc2lvbklkID0gXy5sYXN0KGFyZ3MpO1xuICAgICAgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICAgIGlmICghZHN0U2Vzc2lvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBzZXNzaW9uIHdpdGggaWQgJyR7c2Vzc2lvbklkfScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICAgIH1cbiAgICAgIC8vIG5vdyBzYXZlIHRoZSByZXNwb25zZSBwcm90b2NvbCBnaXZlbiB0aGF0IHRoZSBzZXNzaW9uIGRyaXZlcidzIHByb3RvY29sIG1pZ2h0IGRpZmZlclxuICAgICAgcHJvdG9jb2wgPSBkc3RTZXNzaW9uLnByb3RvY29sO1xuICAgICAgaWYgKCFpc1VtYnJlbGxhQ21kKSB7XG4gICAgICAgIGRyaXZlciA9IGRzdFNlc3Npb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFueSBwbHVnaW5zIHdoaWNoIGFyZSByZWdpc3RlcmVkIGFzIGhhbmRsaW5nIHRoaXMgY29tbWFuZFxuICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLnBsdWdpbnNUb0hhbmRsZUNtZChjbWQsIHNlc3Npb25JZCk7XG5cbiAgICAvLyBub3cgd2UgZGVmaW5lIGEgJ2NtZEhhbmRsZWRCeScgb2JqZWN0IHdoaWNoIHdpbGwga2VlcCB0cmFjayBvZiB3aGljaCBwbHVnaW5zIGhhdmUgaGFuZGxlZCB0aGlzXG4gICAgLy8gY29tbWFuZC4gd2UgY2FyZSBhYm91dCB0aGlzIGJlY2F1c2UgKGEpIG11bHRpcGxlIHBsdWdpbnMgY2FuIGhhbmRsZSB0aGUgc2FtZSBjb21tYW5kLCBhbmRcbiAgICAvLyAoYikgdGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCBhIHBsdWdpbiB3aWxsIGFjdHVhbGx5IGNhbGwgdGhlIG5leHQoKSBtZXRob2Qgd2hpY2ggcnVucyB0aGVcbiAgICAvLyBvcmlnaW5hbCBjb21tYW5kIGV4ZWN1dGlvbi4gVGhpcyByZXN1bHRzIGluIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBjb21tYW5kIG1pZ2h0IGJlIGhhbmRsZWRcbiAgICAvLyBieSBzb21lIGJ1dCBub3QgYWxsIHBsdWdpbnMsIG9yIGJ5IHBsdWdpbihzKSBidXQgbm90IGJ5IHRoZSBkZWZhdWx0IGJlaGF2aW9yLiBTbyBzdGFydCBvdXRcbiAgICAvLyB0aGlzIG9iamVjdCBkZWNsYXJpbmcgdGhhdCB0aGUgZGVmYXVsdCBoYW5kbGVyIGhhcyBub3QgYmVlbiBleGVjdXRlZC5cbiAgICBjb25zdCBjbWRIYW5kbGVkQnkgPSB7ZGVmYXVsdDogZmFsc2V9O1xuXG4gICAgLy8gbm93IHdlIGRlZmluZSBhbiBhc3luYyBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byBwbHVnaW5zLCBhbmQgc3VjY2Vzc2l2ZWx5IHdyYXBwZWRcbiAgICAvLyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBsdWdpbiB0aGF0IGNhbiBoYW5kbGUgdGhlIGNvbW1hbmQuIFRvIHN0YXJ0IG9mZiB3aXRoLCB0aGUgYXN5bmNcbiAgICAvLyBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzIGNhbGxpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGkuZS4sIHdoaWNoZXZlciBvZiB0aGUgMyBjYXNlcyBhYm92ZSBpc1xuICAgIC8vIHRoZSBhcHByb3ByaWF0ZSBvbmVcbiAgICBjb25zdCBkZWZhdWx0QmVoYXZpb3IgPSBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBpZiB3ZSdyZSBydW5uaW5nIHdpdGggcGx1Z2lucywgbWFrZSBzdXJlIHdlIGxvZyB0aGF0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGFjdHVhbGx5XG4gICAgICAvLyBoYXBwZW5pbmcgc28gd2UgY2FuIHRlbGwgd2hlbiB0aGUgcGx1Z2luIGNhbGwgY2hhaW4gaXMgdW53cmFwcGluZyB0byB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgICAgLy8gaWYgdGhhdCdzIHdoYXQgaGFwcGVuc1xuICAgICAgcGx1Z2lucy5sZW5ndGggJiYgdGhpcy5sb2cuaW5mbyhgRXhlY3V0aW5nIGRlZmF1bHQgaGFuZGxpbmcgYmVoYXZpb3IgZm9yIGNvbW1hbmQgJyR7Y21kfSdgKTtcblxuICAgICAgLy8gaWYgd2UgbWFrZSBpdCBoZXJlLCB3ZSBrbm93IHRoYXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgaGFuZGxlZFxuICAgICAgY21kSGFuZGxlZEJ5LmRlZmF1bHQgPSB0cnVlO1xuXG4gICAgICBpZiAocmVxRm9yUHJveHkpIHtcbiAgICAgICAgLy8gd2Ugd291bGQgaGF2ZSBwcm94aWVkIHRoaXMgY29tbWFuZCBoYWQgYSBwbHVnaW4gbm90IGhhbmRsZWQgaXQsIHNvIHRoZSBkZWZhdWx0IGJlaGF2aW9yXG4gICAgICAgIC8vIGlzIHRvIGRvIHRoZSBwcm94eSBhbmQgcmV0cmlldmUgdGhlIHJlc3VsdCBpbnRlcm5hbGx5IHNvIGl0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIHBsdWdpblxuICAgICAgICAvLyBpbiBjYXNlIGl0IGNhbGxzICdhd2FpdCBuZXh0KCknLiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGRyaXZlciBoYXZlIGRlZmluZWRcbiAgICAgICAgLy8gJ3Byb3h5Q29tbWFuZCcgYW5kIG5vdCBqdXN0ICdwcm94eVJlcVJlcycuXG4gICAgICAgIGlmICghZHN0U2Vzc2lvbi5wcm94eUNvbW1hbmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9Ecml2ZXJQcm94eUNvbW1hbmRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBkc3RTZXNzaW9uLnByb3h5Q29tbWFuZChyZXFGb3JQcm94eS5vcmlnaW5hbFVybCwgcmVxRm9yUHJveHkubWV0aG9kLFxuICAgICAgICAgIHJlcUZvclByb3h5LmJvZHkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNHZXRTdGF0dXMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1VtYnJlbGxhQ21kKSB7XG4gICAgICAgIC8vIHNvbWUgY29tbWFuZHMsIGxpa2UgZGVsZXRlU2Vzc2lvbiwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdG8gaGFuZGxlIG9uICp0aGlzKiBkcml2ZXIsXG4gICAgICAgIC8vIG5vdCB0aGUgcGxhdGZvcm0gZHJpdmVyXG4gICAgICAgIHJldHVybiBhd2FpdCBCYXNlRHJpdmVyLnByb3RvdHlwZS5leGVjdXRlQ29tbWFuZC5jYWxsKHRoaXMsIGNtZCwgLi4uYXJncyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGhlcmUgd2Uga25vdyB0aGF0IHdlIGFyZSBleGVjdXRpbmcgYSBzZXNzaW9uIGNvbW1hbmQsIGFuZCBoYXZlIGEgdmFsaWQgc2Vzc2lvbiBkcml2ZXJcbiAgICAgIHJldHVybiBhd2FpdCBkc3RTZXNzaW9uLmV4ZWN1dGVDb21tYW5kKGNtZCwgLi4uYXJncyk7XG4gICAgfTtcblxuICAgIC8vIG5vdyB0YWtlIG91ciBkZWZhdWx0IGJlaGF2aW9yLCB3cmFwIGl0IHdpdGggYW55IG51bWJlciBvZiBwbHVnaW4gYmVoYXZpb3JzLCBhbmQgcnVuIGl0XG4gICAgY29uc3Qgd3JhcHBlZENtZCA9IHRoaXMud3JhcENvbW1hbmRXaXRoUGx1Z2lucyh7XG4gICAgICBkcml2ZXIsIGNtZCwgYXJncywgcGx1Z2lucywgY21kSGFuZGxlZEJ5LCBuZXh0OiBkZWZhdWx0QmVoYXZpb3JcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmV4ZWN1dGVXcmFwcGVkQ29tbWFuZCh7d3JhcHBlZENtZCwgcHJvdG9jb2x9KTtcblxuICAgIC8vIGlmIHdlIGhhZCBwbHVnaW5zLCBtYWtlIHN1cmUgdG8gbG9nIG91dCB0aGUgaGVscGZ1bCByZXBvcnQgYWJvdXQgd2hpY2ggcGx1Z2lucyBlbmRlZCB1cFxuICAgIC8vIGhhbmRsaW5nIHRoZSBjb21tYW5kIGFuZCB3aGljaCBkaWRuJ3RcbiAgICB0aGlzLmxvZ1BsdWdpbkhhbmRsZXJSZXBvcnQocGx1Z2lucywge2NtZCwgY21kSGFuZGxlZEJ5fSk7XG5cbiAgICAvLyBBbmQgZmluYWxseSwgaWYgdGhlIGNvbW1hbmQgd2FzIGNyZWF0ZVNlc3Npb24sIHdlIHdhbnQgdG8gbWlncmF0ZSBhbnkgcGx1Z2lucyB3aGljaCB3ZXJlXG4gICAgLy8gcHJldmlvdXNseSBzZXNzaW9ubGVzcyB0byB1c2UgdGhlIG5ldyBzZXNzaW9uSWQsIHNvIHRoYXQgcGx1Z2lucyBjYW4gc2hhcmUgc3RhdGUgYmV0d2VlblxuICAgIC8vIHRoZWlyIGNyZWF0ZVNlc3Npb24gbWV0aG9kIGFuZCBvdGhlciBpbnN0YW5jZSBtZXRob2RzXG4gICAgaWYgKGNtZCA9PT0gQ1JFQVRFX1NFU1NJT05fQ09NTUFORCAmJiB0aGlzLnNlc3Npb25sZXNzUGx1Z2lucy5sZW5ndGggJiYgIXJlcy5lcnJvcikge1xuICAgICAgY29uc3Qgc2Vzc2lvbklkID0gXy5maXJzdChyZXMudmFsdWUpO1xuICAgICAgdGhpcy5sb2cuaW5mbyhgUHJvbW90aW5nICR7dGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMubGVuZ3RofSBzZXNzaW9ubGVzcyBwbHVnaW5zIHRvIGJlIGF0dGFjaGVkIGAgK1xuICAgICAgICBgdG8gc2Vzc2lvbiBJRCAke3Nlc3Npb25JZH1gKTtcbiAgICAgIHRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXSA9IHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zO1xuICAgICAgdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgd3JhcENvbW1hbmRXaXRoUGx1Z2lucyAoe2RyaXZlciwgY21kLCBhcmdzLCBuZXh0LCBjbWRIYW5kbGVkQnksIHBsdWdpbnN9KSB7XG4gICAgcGx1Z2lucy5sZW5ndGggJiYgdGhpcy5sb2cuaW5mbyhgUGx1Z2lucyB3aGljaCBjYW4gaGFuZGxlIGNtZCAnJHtjbWR9JzogJHtwbHVnaW5zLm1hcCgocCkgPT4gcC5uYW1lKX1gKTtcblxuICAgIC8vIG5vdyB3ZSBjYW4gZ28gdGhyb3VnaCBlYWNoIHBsdWdpbiBhbmQgd3JhcCBgbmV4dGAgYXJvdW5kIGl0cyBvd24gaGFuZGxlciwgcGFzc2luZyB0aGUgKm9sZCpcbiAgICAvLyBuZXh0IGluIHNvIHRoYXQgaXQgY2FuIGNhbGwgaXQgaWYgaXQgd2FudHMgdG9cbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAvLyBuZWVkIGFuIElJRkUgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhlIHZhbHVlIG9mIG5leHQgdGhhdCdzIHBhc3NlZCB0byBwbHVnaW4uaGFuZGxlIHRvIGJlXG4gICAgICAvLyBleGFjdGx5IHRoZSB2YWx1ZSBvZiBuZXh0IGhlcmUgYmVmb3JlIHJlYXNzaWdubWVudDsgd2UgZG9uJ3Qgd2FudCBpdCB0byBiZSBsYXppbHlcbiAgICAgIC8vIGV2YWx1YXRlZCwgb3RoZXJ3aXNlIHdlIGVuZCB1cCB3aXRoIGluZmluaXRlIHJlY3Vyc2lvbiBvZiB0aGUgbGFzdCBgbmV4dGAgdG8gYmUgZGVmaW5lZC5cbiAgICAgIGNtZEhhbmRsZWRCeVtwbHVnaW4ubmFtZV0gPSBmYWxzZTsgLy8gd2Ugc2VlIGEgbmV3IHBsdWdpbiwgc28gYWRkIGl0IHRvIHRoZSAnY21kSGFuZGxlZEJ5JyBvYmplY3RcbiAgICAgIG5leHQgPSAoKF9uZXh0KSA9PiBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFBsdWdpbiAke3BsdWdpbi5uYW1lfSBpcyBub3cgaGFuZGxpbmcgY21kICcke2NtZH0nYCk7XG4gICAgICAgIGNtZEhhbmRsZWRCeVtwbHVnaW4ubmFtZV0gPSB0cnVlOyAvLyBpZiB3ZSBtYWtlIGl0IGhlcmUsIHRoaXMgcGx1Z2luIGhhcyBhdHRlbXB0ZWQgdG8gaGFuZGxlIGNtZFxuICAgICAgICAvLyBmaXJzdCBhdHRlbXB0IHRvIGhhbmRsZSB0aGUgY29tbWFuZCB2aWEgYSBjb21tYW5kLXNwZWNpZmljIGhhbmRsZXIgb24gdGhlIHBsdWdpblxuICAgICAgICBpZiAocGx1Z2luW2NtZF0pIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcGx1Z2luW2NtZF0oX25leHQsIGRyaXZlciwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBjYWxsIHRoZSBnZW5lcmljICdoYW5kbGUnIG1ldGhvZFxuICAgICAgICByZXR1cm4gYXdhaXQgcGx1Z2luLmhhbmRsZShfbmV4dCwgZHJpdmVyLCBjbWQsIC4uLmFyZ3MpO1xuICAgICAgfSkobmV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuICBsb2dQbHVnaW5IYW5kbGVyUmVwb3J0IChwbHVnaW5zLCB7Y21kLCBjbWRIYW5kbGVkQnl9KSB7XG4gICAgaWYgKCFwbHVnaW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGRheSwgd2UgaGF2ZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHdoaWNoIHBsdWdpbnMgZW5kZWQgdXAgZ2V0dGluZ1xuICAgIC8vIHRoZWlyIGNvZGUgcnVuIGFzIHBhcnQgb2YgaGFuZGxpbmcgdGhpcyBjb21tYW5kLiBCZWNhdXNlIHBsdWdpbnMgY2FuIGNob29zZSAqbm90KiB0b1xuICAgIC8vIHBhc3MgY29udHJvbCB0byBvdGhlciBwbHVnaW5zIG9yIHRvIHRoZSBkZWZhdWx0IGRyaXZlciBiZWhhdmlvciwgdGhpcyBpcyBpbmZvcm1hdGlvblxuICAgIC8vIHdoaWNoIGlzIHByb2JhYmx5IHVzZWZ1bCB0byB0aGUgdXNlciAoZXNwZWNpYWxseSBpbiBzaXR1YXRpb25zIHdoZXJlIHBsdWdpbnMgbWlnaHQgbm90XG4gICAgLy8gaW50ZXJhY3Qgd2VsbCB0b2dldGhlciwgYW5kIGl0IHdvdWxkIGJlIGhhcmQgdG8gZGVidWcgb3RoZXJ3aXNlIHdpdGhvdXQgdGhpcyBraW5kIG9mXG4gICAgLy8gbWVzc2FnZSkuXG4gICAgY29uc3QgZGlkSGFuZGxlID0gT2JqZWN0LmtleXMoY21kSGFuZGxlZEJ5KS5maWx0ZXIoKGspID0+IGNtZEhhbmRsZWRCeVtrXSk7XG4gICAgY29uc3QgZGlkbnRIYW5kbGUgPSBPYmplY3Qua2V5cyhjbWRIYW5kbGVkQnkpLmZpbHRlcigoaykgPT4gIWNtZEhhbmRsZWRCeVtrXSk7XG4gICAgaWYgKGRpZG50SGFuZGxlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYENvbW1hbmQgJyR7Y21kfScgd2FzICpub3QqIGhhbmRsZWQgYnkgdGhlIGZvbGxvd2luZyBiZWhhdmlvdXJzIG9yIHBsdWdpbnMsIGV2ZW4gYCArXG4gICAgICAgIGB0aG91Z2ggdGhleSB3ZXJlIHJlZ2lzdGVyZWQgdG8gaGFuZGxlIGl0OiAke0pTT04uc3RyaW5naWZ5KGRpZG50SGFuZGxlKX0uIFRoZSBgICtcbiAgICAgICAgYGNvbW1hbmQgKndhcyogaGFuZGxlZCBieSB0aGVzZTogJHtKU09OLnN0cmluZ2lmeShkaWRIYW5kbGUpfS5gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBleGVjdXRlV3JhcHBlZENvbW1hbmQgKHt3cmFwcGVkQ21kLCBwcm90b2NvbH0pIHtcbiAgICBsZXQgY21kUmVzLCBjbWRFcnIsIHJlcyA9IHt9O1xuICAgIHRyeSB7XG4gICAgICAvLyBBdCB0aGlzIHBvaW50LCBgd3JhcHBlZENtZGAgZGVmaW5lcyBhIHdob2xlIHNlcXVlbmNlIG9mIHBsdWdpbiBoYW5kbGVycywgY3VsbWluYXRpbmcgaW5cbiAgICAgIC8vIG91ciBkZWZhdWx0IGhhbmRsZXIuIFdoYXRldmVyIGl0IHJldHVybnMgaXMgd2hhdCB3ZSdyZSBnb2luZyB0byB3YW50IHRvIHNlbmQgYmFjayB0byB0aGVcbiAgICAgIC8vIHVzZXIuXG4gICAgICBjbWRSZXMgPSBhd2FpdCB3cmFwcGVkQ21kKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY21kRXJyID0gZTtcbiAgICB9XG5cbiAgICAvLyBTYWRseSwgd2UgZG9uJ3Qga25vdyBleGFjdGx5IHdoYXQga2luZCBvZiBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC4gSXQgd2lsbCBlaXRoZXIgYmUgYSBiYXJlXG4gICAgLy8gb2JqZWN0LCBvciBhIHByb3RvY29sLWF3YXJlIG9iamVjdCB3aXRoIHByb3RvY29sIGFuZCBlcnJvci92YWx1ZSBrZXlzLiBTbyB3ZSBuZWVkIHRvIHNuaWZmXG4gICAgLy8gaXQgYW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCBkb3VibGUtd3JhcCBpdCBpZiBpdCdzIHRoZSBsYXR0ZXIga2luZC5cbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGNtZFJlcykgJiYgXy5oYXMoY21kUmVzLCAncHJvdG9jb2wnKSkge1xuICAgICAgcmVzID0gY21kUmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMudmFsdWUgPSBjbWRSZXM7XG4gICAgICByZXMuZXJyb3IgPSBjbWRFcnI7XG4gICAgICByZXMucHJvdG9jb2wgPSBwcm90b2NvbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHByb3h5QWN0aXZlIChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgIHJldHVybiBkc3RTZXNzaW9uICYmIF8uaXNGdW5jdGlvbihkc3RTZXNzaW9uLnByb3h5QWN0aXZlKSAmJiBkc3RTZXNzaW9uLnByb3h5QWN0aXZlKHNlc3Npb25JZCk7XG4gIH1cblxuICBnZXRQcm94eUF2b2lkTGlzdCAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICByZXR1cm4gZHN0U2Vzc2lvbiA/IGRzdFNlc3Npb24uZ2V0UHJveHlBdm9pZExpc3QoKSA6IFtdO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgZHN0U2Vzc2lvbi5jYW5Qcm94eShzZXNzaW9uSWQpO1xuICB9XG59XG5cbi8vIGhlbHAgZGVjaWRlIHdoaWNoIGNvbW1hbmRzIHNob3VsZCBiZSBwcm94aWVkIHRvIHN1Yi1kcml2ZXJzIGFuZCB3aGljaFxuLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhpcywgb3VyIHVtYnJlbGxhIGRyaXZlclxuZnVuY3Rpb24gaXNBcHBpdW1Ecml2ZXJDb21tYW5kIChjbWQpIHtcbiAgcmV0dXJuICFpc1Nlc3Npb25Db21tYW5kKGNtZCkgfHwgY21kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EO1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIEFwcGl1bSB0cmllZCB0byBwcm94eSBhIGNvbW1hbmQgdXNpbmcgYSBkcml2ZXIncyBgcHJveHlDb21tYW5kYCBtZXRob2QgYnV0IHRoZVxuICogbWV0aG9kIGRpZCBub3QgZXhpc3RcbiAqL1xuZXhwb3J0IGNsYXNzIE5vRHJpdmVyUHJveHlDb21tYW5kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX05PX0RSSVZFUl9QUk9YWUNPTU1BTkQnO1xuXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcihgVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHRoaXMgY29tbWFuZCB3YXMgdG8gcHJveHksIGJ1dCB0aGUgZHJpdmVyIGAgK1xuICAgICAgICAgIGBkaWQgbm90IGhhdmUgdGhlICdwcm94eUNvbW1hbmQnIG1ldGhvZCBkZWZpbmVkLiBUbyBmdWxseSBzdXBwb3J0IGAgK1xuICAgICAgICAgIGBwbHVnaW5zLCBkcml2ZXJzIHNob3VsZCBoYXZlICdwcm94eUNvbW1hbmQnIHNldCB0byBhIGp3cFByb3h5IG9iamVjdCdzIGAgK1xuICAgICAgICAgIGAnY29tbWFuZCgpJyBtZXRob2QsIGluIGFkZGl0aW9uIHRvIHRoZSBub3JtYWwgJ3Byb3h5UmVxUmVzJ2ApO1xuICB9XG59XG5cbmV4cG9ydCB7IEFwcGl1bURyaXZlciB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlcm5hbERyaXZlcn0gRXh0ZXJuYWxEcml2ZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5XM0NDYXBhYmlsaXRpZXN9IFczQ0NhcGFiaWxpdGllc1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlckRhdGF9IERyaXZlckRhdGFcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TZXJ2ZXJBcmdzfSBEcml2ZXJPcHRzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ29uc3RyYWludHN9IENvbnN0cmFpbnRzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtU2VydmVyfSBBcHBpdW1TZXJ2ZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL3R5cGVzJykuRXh0ZW5zaW9uVHlwZX0gRXh0ZW5zaW9uVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vdHlwZXMvZXh0ZW5zaW9uJykuUGx1Z2luQ2xhc3N9IFBsdWdpbkNsYXNzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL2V4dGVuc2lvbi9kcml2ZXItY29uZmlnJykuRHJpdmVyQ29uZmlnfSBEcml2ZXJDb25maWdcbiAqL1xuXG4vKipcbiAqIFVzZWQgYnkge0BsaW5rY29kZSBBcHBpdW1Ecml2ZXIuY3JlYXRlU2Vzc2lvbn0gYW5kIHtAbGlua2NvZGUgQXBwaXVtRHJpdmVyLmRlbGV0ZVNlc3Npb259IHRvIGRlc2NyaWJlXG4gKiByZXN1bHQuXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGVkZWYgU2Vzc2lvbkhhbmRsZXJSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7Vn0gW3ZhbHVlXVxuICogQHByb3BlcnR5IHtFcnJvcn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwcm90b2NvbF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TZXNzaW9uSGFuZGxlcjxTZXNzaW9uSGFuZGxlclJlc3VsdDxhbnlbXT4sU2Vzc2lvbkhhbmRsZXJSZXN1bHQ8dm9pZD4+fSBTZXNzaW9uSGFuZGxlclxuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7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
|
|
585
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXNpcmVkQ2FwYWJpbGl0eUNvbnN0cmFpbnRzIiwiT2JqZWN0IiwiZnJlZXplIiwiYXV0b21hdGlvbk5hbWUiLCJwcmVzZW5jZSIsImlzU3RyaW5nIiwicGxhdGZvcm1OYW1lIiwic2Vzc2lvbnNMaXN0R3VhcmQiLCJBc3luY0xvY2siLCJwZW5kaW5nRHJpdmVyc0d1YXJkIiwiQXBwaXVtRHJpdmVyIiwiRHJpdmVyQ29yZSIsInNlc3Npb25zIiwicGVuZGluZ0RyaXZlcnMiLCJuZXdDb21tYW5kVGltZW91dE1zIiwicGx1Z2luQ2xhc3NlcyIsInNlc3Npb25QbHVnaW5zIiwic2Vzc2lvbmxlc3NQbHVnaW5zIiwiZHJpdmVyQ29uZmlnIiwic2VydmVyIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwiYXJncyIsImNvbnN0cnVjdG9yIiwib3B0cyIsInRtcERpciIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fVE1QX0RJUiIsInVwZGF0ZUJ1aWxkSW5mbyIsImNhdGNoIiwiZXJyIiwibG9nIiwiZGVidWciLCJfbG9nIiwiaW5zdGFuY2VOYW1lIiwibmFtZSIsIm5vZGUiLCJnZXRPYmplY3RJZCIsInN1YnN0cmluZyIsImxvZ2dlciIsImdldExvZ2dlciIsImlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQiLCJzZXNzaW9uRXhpc3RzIiwic2Vzc2lvbklkIiwiZHN0U2Vzc2lvbiIsImRyaXZlckZvclNlc3Npb24iLCJnZXRTdGF0dXMiLCJidWlsZCIsIl8iLCJjbG9uZSIsImdldEJ1aWxkSW5mbyIsImdldFNlc3Npb25zIiwidG9QYWlycyIsIm1hcCIsImlkIiwiZHJpdmVyIiwiY2FwYWJpbGl0aWVzIiwiY2FwcyIsInByaW50TmV3U2Vzc2lvbkFubm91bmNlbWVudCIsImRyaXZlck5hbWUiLCJkcml2ZXJWZXJzaW9uIiwiZHJpdmVyQmFzZVZlcnNpb24iLCJpbmZvIiwiQVBQSVVNX1ZFUiIsImJhc2VWZXJzaW9uIiwiZ2V0Q2xpQXJnc0ZvclBsdWdpbiIsImV4dE5hbWUiLCJwbHVnaW4iLCJnZXRDbGlBcmdzRm9yRHJpdmVyIiwiYWxsQ2xpQXJnc0ZvckV4dCIsImlzRW1wdHkiLCJkZWZhdWx0cyIsImdldERlZmF1bHRzRm9yRXh0ZW5zaW9uIiwiRFJJVkVSX1RZUEUiLCJjbGlBcmdzIiwib21pdEJ5IiwidmFsdWUiLCJrZXkiLCJpc0VxdWFsIiwiY3JlYXRlU2Vzc2lvbiIsImpzb253cENhcHMiLCJyZXFDYXBzIiwidzNjQ2FwYWJpbGl0aWVzIiwiZHJpdmVyRGF0YSIsImRlZmF1bHRDYXBhYmlsaXRpZXMiLCJjbG9uZURlZXAiLCJkZWZhdWx0U2V0dGluZ3MiLCJwdWxsU2V0dGluZ3MiLCJqd3BTZXR0aW5ncyIsInczY1NldHRpbmdzIiwiYWx3YXlzTWF0Y2giLCJmaXJzdE1hdGNoRW50cnkiLCJmaXJzdE1hdGNoIiwiYXNzaWduIiwicHJvdG9jb2wiLCJpbm5lclNlc3Npb25JZCIsImRDYXBzIiwicGFyc2VkQ2FwcyIsInBhcnNlQ2Fwc0ZvcklubmVyRHJpdmVyIiwiZGVzaXJlZENhcHMiLCJwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMiLCJwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMiLCJlcnJvciIsIklubmVyRHJpdmVyIiwidmVyc2lvbiIsImZpbmRNYXRjaGluZ0RyaXZlciIsInNlc3Npb25PdmVycmlkZSIsImRlbGV0ZUFsbFNlc3Npb25zIiwicnVubmluZ0RyaXZlcnNEYXRhIiwib3RoZXJQZW5kaW5nRHJpdmVyc0RhdGEiLCJkcml2ZXJJbnN0YW5jZSIsInJlbGF4ZWRTZWN1cml0eUVuYWJsZWQiLCJkZW55SW5zZWN1cmUiLCJhIiwiYWxsb3dJbnNlY3VyZSIsInNlcnZlckhvc3QiLCJhZGRyZXNzIiwic2VydmVyUG9ydCIsInBvcnQiLCJzZXJ2ZXJQYXRoIiwiYmFzZVBhdGgiLCJjdXJTZXNzaW9uRGF0YUZvckRyaXZlciIsImUiLCJlcnJvcnMiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwibWVzc2FnZSIsImFjcXVpcmUiLCJjb21wYWN0IiwiZHJ2IiwicHVzaCIsInB1bGwiLCJhdHRhY2hVbmV4cGVjdGVkU2h1dGRvd25IYW5kbGVyIiwic3RhcnROZXdDb21tYW5kVGltZW91dCIsImlzVzNDUHJvdG9jb2wiLCJKU09OIiwic3RyaW5naWZ5IiwidXBkYXRlU2V0dGluZ3MiLCJpc01qc29ud3BQcm90b2NvbCIsIm9uU2h1dGRvd24iLCJjYXVzZSIsIkVycm9yIiwid2FybiIsImlzRnVuY3Rpb24iLCJvblVuZXhwZWN0ZWRTaHV0ZG93biIsImRhdGEiLCJ2YWx1ZXMiLCJmaWx0ZXIiLCJzIiwiZGF0dW0iLCJkZWxldGVTZXNzaW9uIiwib3RoZXJTZXNzaW9uc0RhdGEiLCJjdXJDb25zdHJ1Y3Rvck5hbWUiLCJzZXNzaW9uc0NvdW50Iiwic2l6ZSIsImZvcmNlIiwicmVhc29uIiwidXRpbCIsInBsdXJhbGl6ZSIsImNsZWFudXBQcm9taXNlcyIsInN0YXJ0VW5leHBlY3RlZFNodXRkb3duIiwia2V5cyIsImNsZWFudXBQcm9taXNlIiwicGx1Z2luc0ZvclNlc3Npb24iLCJjcmVhdGVQbHVnaW5JbnN0YW5jZXMiLCJwbHVnaW5zVG9IYW5kbGVDbWQiLCJjbWQiLCJwIiwiaGFuZGxlIiwicGx1Z2luSW5zdGFuY2VzIiwiUGx1Z2luQ2xhc3MiLCJlbnRyaWVzIiwiZXhlY3V0ZUNvbW1hbmQiLCJpc0dldFN0YXR1cyIsIkdFVF9TVEFUVVNfQ09NTUFORCIsImlzVW1icmVsbGFDbWQiLCJpc0FwcGl1bURyaXZlckNvbW1hbmQiLCJpc1Nlc3Npb25DbWQiLCJpc1Nlc3Npb25Db21tYW5kIiwicmVxRm9yUHJveHkiLCJsYXN0IiwicG9wIiwicGx1Z2lucyIsImNtZEhhbmRsZWRCeSIsImRlZmF1bHQiLCJkZWZhdWx0QmVoYXZpb3IiLCJsZW5ndGgiLCJwcm94eUNvbW1hbmQiLCJOb0RyaXZlclByb3h5Q29tbWFuZEVycm9yIiwib3JpZ2luYWxVcmwiLCJtZXRob2QiLCJib2R5IiwiQmFzZURyaXZlciIsInByb3RvdHlwZSIsImNhbGwiLCJ3cmFwcGVkQ21kIiwid3JhcENvbW1hbmRXaXRoUGx1Z2lucyIsIm5leHQiLCJyZXMiLCJleGVjdXRlV3JhcHBlZENvbW1hbmQiLCJsb2dQbHVnaW5IYW5kbGVyUmVwb3J0IiwiQ1JFQVRFX1NFU1NJT05fQ09NTUFORCIsImZpcnN0IiwiX25leHQiLCJkaWRIYW5kbGUiLCJrIiwiZGlkbnRIYW5kbGUiLCJjbWRSZXMiLCJjbWRFcnIiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwicHJveHlBY3RpdmUiLCJnZXRQcm94eUF2b2lkTGlzdCIsImNhblByb3h5IiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsImNvZGUiXSwic291cmNlcyI6WyIuLi8uLi9saWIvYXBwaXVtLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtnZXRCdWlsZEluZm8sIHVwZGF0ZUJ1aWxkSW5mbywgQVBQSVVNX1ZFUn0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtcbiAgQmFzZURyaXZlcixcbiAgRHJpdmVyQ29yZSxcbiAgZXJyb3JzLFxuICBpc1Nlc3Npb25Db21tYW5kLFxuICBDUkVBVEVfU0VTU0lPTl9DT01NQU5ELFxuICBERUxFVEVfU0VTU0lPTl9DT01NQU5ELFxuICBHRVRfU1RBVFVTX0NPTU1BTkQsXG59IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCB7cGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIsIHB1bGxTZXR0aW5nc30gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3V0aWwsIG5vZGUsIGxvZ2dlcn0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7Z2V0RGVmYXVsdHNGb3JFeHRlbnNpb259IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCB7RFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogSW52YXJpYW50IHNldCBvZiBiYXNlIGNvbnN0cmFpbnRzXG4gKiBAdHlwZSB7UmVhZG9ubHk8Q29uc3RyYWludHM+fVxuICovXG5jb25zdCBkZXNpcmVkQ2FwYWJpbGl0eUNvbnN0cmFpbnRzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGF1dG9tYXRpb25OYW1lOiB7XG4gICAgcHJlc2VuY2U6IHRydWUsXG4gICAgaXNTdHJpbmc6IHRydWUsXG4gIH0sXG4gIHBsYXRmb3JtTmFtZToge1xuICAgIHByZXNlbmNlOiB0cnVlLFxuICAgIGlzU3RyaW5nOiB0cnVlLFxuICB9LFxufSk7XG5cbmNvbnN0IHNlc3Npb25zTGlzdEd1YXJkID0gbmV3IEFzeW5jTG9jaygpO1xuY29uc3QgcGVuZGluZ0RyaXZlcnNHdWFyZCA9IG5ldyBBc3luY0xvY2soKTtcblxuLyoqXG4gKiBAaW1wbGVtZW50cyB7U2Vzc2lvbkhhbmRsZXJ9XG4gKi9cbmNsYXNzIEFwcGl1bURyaXZlciBleHRlbmRzIERyaXZlckNvcmUge1xuICAvKipcbiAgICogQWNjZXNzIHRvIHNlc3Npb25zIGxpc3QgbXVzdCBiZSBndWFyZGVkIHdpdGggYSBTZW1hcGhvcmUsIGJlY2F1c2VcbiAgICogaXQgbWlnaHQgYmUgY2hhbmdlZCBieSBvdGhlciBhc3luYyBjYWxscyBhdCBhbnkgdGltZVxuICAgKiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYWNjZXNzIHRoaXMgcHJvcGVydHkgZGlyZWN0bHkgZnJvbSB0aGUgb3V0c2lkZVxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxFeHRlcm5hbERyaXZlcj59XG4gICAqL1xuICBzZXNzaW9ucyA9IHt9O1xuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdG8gcGVuZGluZyBkcml2ZXJzIGxpc3QgbXVzdCBiZSBndWFyZGVkIHdpdGggYSBTZW1hcGhvcmUsIGJlY2F1c2VcbiAgICogaXQgbWlnaHQgYmUgY2hhbmdlZCBieSBvdGhlciBhc3luYyBjYWxscyBhdCBhbnkgdGltZVxuICAgKiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYWNjZXNzIHRoaXMgcHJvcGVydHkgZGlyZWN0bHkgZnJvbSB0aGUgb3V0c2lkZVxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxFeHRlcm5hbERyaXZlcltdPn1cbiAgICovXG4gIHBlbmRpbmdEcml2ZXJzID0ge307XG5cbiAgLyoqXG4gICAqIE5vdGUgdGhhdCB7QGxpbmtjb2RlIEFwcGl1bURyaXZlcn0gaGFzIG5vIGBuZXdDb21tYW5kVGltZW91dGAgbWV0aG9kLlxuICAgKiBgQXBwaXVtRHJpdmVyYCBkb2VzIG5vdCBzZXQgYW5kIG9ic2VydmUgaXRzIG93biB0aW1lb3V0czsgaW5kaXZpZHVhbFxuICAgKiBzZXNzaW9ucyAobWFuYWdlZCBkcml2ZXJzKSBkbyBpbnN0ZWFkLlxuICAgKi9cbiAgbmV3Q29tbWFuZFRpbWVvdXRNcyA9IDA7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYWN0aXZlIHBsdWdpbnNcbiAgICogQHR5cGUge01hcDxQbHVnaW5DbGFzcyxzdHJpbmc+fVxuICAgKi9cbiAgcGx1Z2luQ2xhc3NlcztcblxuICAvKipcbiAgICogbWFwIG9mIHNlc3Npb25zIHRvIGFjdHVhbCBwbHVnaW4gaW5zdGFuY2VzIHBlciBzZXNzaW9uXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLEluc3RhbmNlVHlwZTxQbHVnaW5DbGFzcz5bXT59XG4gICAqL1xuICBzZXNzaW9uUGx1Z2lucyA9IHt9O1xuXG4gIC8qKlxuICAgKiBzb21lIGNvbW1hbmRzIGFyZSBzZXNzaW9ubGVzcywgc28gd2UgbmVlZCBhIHNldCBvZiBwbHVnaW5zIGZvciB0aGVtXG4gICAqIEB0eXBlIHtJbnN0YW5jZVR5cGU8UGx1Z2luQ2xhc3M+W119XG4gICAqL1xuICBzZXNzaW9ubGVzc1BsdWdpbnMgPSBbXTtcblxuICAvKiogQHR5cGUge0RyaXZlckNvbmZpZ30gKi9cbiAgZHJpdmVyQ29uZmlnO1xuXG4gIC8qKiBAdHlwZSB7QXBwaXVtU2VydmVyfSAqL1xuICBzZXJ2ZXI7XG5cbiAgZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cztcblxuICAvKiogQHR5cGUge0RyaXZlck9wdHN9ICovXG4gIGFyZ3M7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RHJpdmVyT3B0c30gb3B0c1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0cykge1xuICAgIC8vIEl0IGlzIG5lY2Vzc2FyeSB0byBzZXQgYC0tdG1wYCBoZXJlIHNpbmNlIGl0IHNob3VsZCBiZSBzZXQgdG9cbiAgICAvLyBwcm9jZXNzLmVudi5BUFBJVU1fVE1QX0RJUiBvbmNlIGF0IGFuIGluaXRpYWwgcG9pbnQgaW4gdGhlIEFwcGl1bSBsaWZlY3ljbGUuXG4gICAgLy8gVGhlIHByb2Nlc3MgYXJndW1lbnQgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IEJhc2VEcml2ZXIuXG4gICAgLy8gUGxlYXNlIGNhbGwgQGFwcGl1bS9zdXBwb3J0LnRlbXBEaXIgbW9kdWxlIHRvIGFwcGx5IHRoaXMgYmVuZWZpdC5cbiAgICBpZiAob3B0cy50bXBEaXIpIHtcbiAgICAgIHByb2Nlc3MuZW52LkFQUElVTV9UTVBfRElSID0gb3B0cy50bXBEaXI7XG4gICAgfVxuXG4gICAgc3VwZXIob3B0cyk7XG5cbiAgICB0aGlzLmFyZ3MgPSB7Li4ub3B0c307XG5cbiAgICAvLyBhbGxvdyB0aGlzIHRvIGhhcHBlbiBpbiB0aGUgYmFja2dyb3VuZCwgc28gbm8gYGF3YWl0YFxuICAgIC8vIGNhdGNoIHRoaXMgdG8gYXZvaWQgYW4gdW5oYW5kbGVkIHJlamVjdGlvblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by10aGVuLHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLWNhbGxiYWNrc1xuICAgIHVwZGF0ZUJ1aWxkSW5mbygpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGVycik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIGN1cnJlbnQgdW1icmVsbGEgZHJpdmVyIGluc3RhbmNlXG4gICAqL1xuICBnZXQgbG9nKCkge1xuICAgIGlmICghdGhpcy5fbG9nKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZU5hbWUgPSBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9QCR7bm9kZS5nZXRPYmplY3RJZCh0aGlzKS5zdWJzdHJpbmcoMCwgNCl9YDtcbiAgICAgIHRoaXMuX2xvZyA9IGxvZ2dlci5nZXRMb2dnZXIoaW5zdGFuY2VOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2xvZztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgY29tbWFuZHMgcXVldWVpbmcgZm9yIHRoZSB1bWJyZWxsYSBBcHBpdW0gZHJpdmVyXG4gICAqL1xuICBnZXQgaXNDb21tYW5kc1F1ZXVlRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzZXNzaW9uRXhpc3RzKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgZHN0U2Vzc2lvbi5zZXNzaW9uSWQgIT09IG51bGw7XG4gIH1cblxuICBkcml2ZXJGb3JTZXNzaW9uKHNlc3Npb25JZCkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hd2FpdFxuICBhc3luYyBnZXRTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1aWxkOiBfLmNsb25lKGdldEJ1aWxkSW5mbygpKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXdhaXRcbiAgYXN5bmMgZ2V0U2Vzc2lvbnMoKSB7XG4gICAgcmV0dXJuIF8udG9QYWlycyh0aGlzLnNlc3Npb25zKS5tYXAoKFtpZCwgZHJpdmVyXSkgPT4gKHtcbiAgICAgIGlkLFxuICAgICAgY2FwYWJpbGl0aWVzOiBkcml2ZXIuY2FwcyxcbiAgICB9KSk7XG4gIH1cblxuICBwcmludE5ld1Nlc3Npb25Bbm5vdW5jZW1lbnQoZHJpdmVyTmFtZSwgZHJpdmVyVmVyc2lvbiwgZHJpdmVyQmFzZVZlcnNpb24pIHtcbiAgICB0aGlzLmxvZy5pbmZvKFxuICAgICAgZHJpdmVyVmVyc2lvblxuICAgICAgICA/IGBBcHBpdW0gdiR7QVBQSVVNX1ZFUn0gY3JlYXRpbmcgbmV3ICR7ZHJpdmVyTmFtZX0gKHYke2RyaXZlclZlcnNpb259KSBzZXNzaW9uYFxuICAgICAgICA6IGBBcHBpdW0gdiR7QVBQSVVNX1ZFUn0gY3JlYXRpbmcgbmV3ICR7ZHJpdmVyTmFtZX0gc2Vzc2lvbmBcbiAgICApO1xuICAgIHRoaXMubG9nLmluZm8oYENoZWNraW5nIEJhc2VEcml2ZXIgdmVyc2lvbnMgZm9yIEFwcGl1bSBhbmQgJHtkcml2ZXJOYW1lfWApO1xuICAgIHRoaXMubG9nLmluZm8oXG4gICAgICBBcHBpdW1Ecml2ZXIuYmFzZVZlcnNpb25cbiAgICAgICAgPyBgQXBwaXVtJ3MgQmFzZURyaXZlciB2ZXJzaW9uIGlzICR7QXBwaXVtRHJpdmVyLmJhc2VWZXJzaW9ufWBcbiAgICAgICAgOiBgQ291bGQgbm90IGRldGVybWluZSBBcHBpdW0ncyBCYXNlRHJpdmVyIHZlcnNpb25gXG4gICAgKTtcbiAgICB0aGlzLmxvZy5pbmZvKFxuICAgICAgZHJpdmVyQmFzZVZlcnNpb25cbiAgICAgICAgPyBgJHtkcml2ZXJOYW1lfSdzIEJhc2VEcml2ZXIgdmVyc2lvbiBpcyAke2RyaXZlckJhc2VWZXJzaW9ufWBcbiAgICAgICAgOiBgQ291bGQgbm90IGRldGVybWluZSAke2RyaXZlck5hbWV9J3MgQmFzZURyaXZlciB2ZXJzaW9uYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGFsbCBDTEkgYXJndW1lbnRzIGZvciBhIHNwZWNpZmljIHBsdWdpbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBQbHVnaW4gbmFtZVxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZyx1bmtub3duPn0gQXJndW1lbnRzIG9iamVjdC4gSWYgbm9uZSwgYW4gZW1wdHkgb2JqZWN0LlxuICAgKi9cbiAgZ2V0Q2xpQXJnc0ZvclBsdWdpbihleHROYW1lKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyx1bmtub3duPn0gKi8gKHRoaXMuYXJncy5wbHVnaW4/LltleHROYW1lXSA/PyB7fSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIENMSSBhcmdzIGZvciBhIHNwZWNpZmljIGRyaXZlci5cbiAgICpcbiAgICogX0FueSBhcmcgd2hpY2ggaXMgZXF1YWwgdG8gaXRzIGRlZmF1bHQgdmFsdWUgd2lsbCBub3QgYmUgcHJlc2VudCBpbiB0aGUgcmV0dXJuZWQgb2JqZWN0Ll9cbiAgICpcbiAgICogX05vdGUgdGhhdCB0aGlzIGJlaGF2aW9yIGN1cnJlbnRseSAoTWF5IDE4IDIwMjIpIGRpZmZlcnMgZnJvbSBob3cgcGx1Z2lucyBhcmUgaGFuZGxlZF8gKHNlZSB7QGxpbmtjb2RlIEFwcGl1bURyaXZlci5nZXRDbGlBcmdzRm9yUGx1Z2lufSkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lIC0gRHJpdmVyIG5hbWVcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsdW5rbm93bj58dW5kZWZpbmVkfSBBcmd1bWVudHMgb2JqZWN0LiBJZiBub25lLCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgZ2V0Q2xpQXJnc0ZvckRyaXZlcihleHROYW1lKSB7XG4gICAgY29uc3QgYWxsQ2xpQXJnc0ZvckV4dCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyx1bmtub3duPnx1bmRlZmluZWR9ICovIChcbiAgICAgIHRoaXMuYXJncy5kcml2ZXI/LltleHROYW1lXVxuICAgICk7XG5cbiAgICBpZiAoIV8uaXNFbXB0eShhbGxDbGlBcmdzRm9yRXh0KSkge1xuICAgICAgY29uc3QgZGVmYXVsdHMgPSBnZXREZWZhdWx0c0ZvckV4dGVuc2lvbihEUklWRVJfVFlQRSwgZXh0TmFtZSk7XG4gICAgICBjb25zdCBjbGlBcmdzID0gXy5pc0VtcHR5KGRlZmF1bHRzKVxuICAgICAgICA/IGFsbENsaUFyZ3NGb3JFeHRcbiAgICAgICAgOiBfLm9taXRCeShhbGxDbGlBcmdzRm9yRXh0LCAodmFsdWUsIGtleSkgPT4gXy5pc0VxdWFsKGRlZmF1bHRzW2tleV0sIHZhbHVlKSk7XG4gICAgICBpZiAoIV8uaXNFbXB0eShjbGlBcmdzKSkge1xuICAgICAgICByZXR1cm4gY2xpQXJncztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHNlc3Npb25cbiAgICogQHBhcmFtIHtXM0NDYXBhYmlsaXRpZXN9IGpzb253cENhcHMgSlNPTldQIGZvcm1hdHRlZCBkZXNpcmVkIGNhcGFiaWxpdGllc1xuICAgKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllc30gcmVxQ2FwcyBSZXF1aXJlZCBjYXBhYmlsaXRpZXMgKEpTT05XUCBzdGFuZGFyZClcbiAgICogQHBhcmFtIHtXM0NDYXBhYmlsaXRpZXN9IHczY0NhcGFiaWxpdGllcyBXM0MgY2FwYWJpbGl0aWVzXG4gICAqIEBwYXJhbSB7RHJpdmVyRGF0YVtdfSBbZHJpdmVyRGF0YV1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24oanNvbndwQ2FwcywgcmVxQ2FwcywgdzNjQ2FwYWJpbGl0aWVzLCBkcml2ZXJEYXRhKSB7XG4gICAgY29uc3QgZGVmYXVsdENhcGFiaWxpdGllcyA9IF8uY2xvbmVEZWVwKHRoaXMuYXJncy5kZWZhdWx0Q2FwYWJpbGl0aWVzKTtcbiAgICBjb25zdCBkZWZhdWx0U2V0dGluZ3MgPSBwdWxsU2V0dGluZ3MoZGVmYXVsdENhcGFiaWxpdGllcyk7XG4gICAganNvbndwQ2FwcyA9IF8uY2xvbmVEZWVwKGpzb253cENhcHMpO1xuICAgIGNvbnN0IGp3cFNldHRpbmdzID0gey4uLmRlZmF1bHRTZXR0aW5ncywgLi4ucHVsbFNldHRpbmdzKGpzb253cENhcHMpfTtcbiAgICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNsaWVudCBvbmx5IHByb3ZpZGVzIGNhcHMgdXNpbmcgSlNPTldQIHN0YW5kYXJkLFxuICAgIC8vIGFsdGhvdWdoIGZpcnN0TWF0Y2gvYWx3YXlzTWF0Y2ggcHJvcGVydGllcyBhcmUgc3RpbGwgcHJlc2VudC5cbiAgICAvLyBJbiBzdWNoIGNhc2Ugd2UgYXNzdW1lIHRoZSBjbGllbnQgdW5kZXJzdGFuZHMgVzNDIHByb3RvY29sIGFuZCBtZXJnZSB0aGUgZ2l2ZW5cbiAgICAvLyBKU09OV1AgY2FwcyB0byBXM0MgY2Fwc1xuICAgIGNvbnN0IHczY1NldHRpbmdzID0ge1xuICAgICAgLi4uandwU2V0dGluZ3MsXG4gICAgICAuLi5wdWxsU2V0dGluZ3MoKHczY0NhcGFiaWxpdGllcyA/PyB7fSkuYWx3YXlzTWF0Y2ggPz8ge30pLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBmaXJzdE1hdGNoRW50cnkgb2YgKHczY0NhcGFiaWxpdGllcyA/PyB7fSkuZmlyc3RNYXRjaCA/PyBbXSkge1xuICAgICAgT2JqZWN0LmFzc2lnbih3M2NTZXR0aW5ncywgcHVsbFNldHRpbmdzKGZpcnN0TWF0Y2hFbnRyeSkpO1xuICAgIH1cblxuICAgIGxldCBwcm90b2NvbDtcbiAgICBsZXQgaW5uZXJTZXNzaW9uSWQsIGRDYXBzO1xuICAgIHRyeSB7XG4gICAgICAvLyBQYXJzZSB0aGUgY2FwcyBpbnRvIGEgZm9ybWF0IHRoYXQgdGhlIElubmVyRHJpdmVyIHdpbGwgYWNjZXB0XG4gICAgICBjb25zdCBwYXJzZWRDYXBzID0gcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIoXG4gICAgICAgIGpzb253cENhcHMsXG4gICAgICAgIHczY0NhcGFiaWxpdGllcyxcbiAgICAgICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMsXG4gICAgICAgIGRlZmF1bHRDYXBhYmlsaXRpZXNcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHtkZXNpcmVkQ2FwcywgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXN9ID1cbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoJy4vdXRpbHMnKS5QYXJzZWREcml2ZXJDYXBzfSAqLyAocGFyc2VkQ2Fwcyk7XG4gICAgICBwcm90b2NvbCA9IHBhcnNlZENhcHMucHJvdG9jb2w7XG4gICAgICBjb25zdCBlcnJvciA9IC8qKiBAdHlwZSB7aW1wb3J0KCcuL3V0aWxzJykuSW52YWxpZENhcHN9ICovIChwYXJzZWRDYXBzKS5lcnJvcjtcbiAgICAgIC8vIElmIHRoZSBwYXJzaW5nIG9mIHRoZSBjYXBzIHByb2R1Y2VkIGFuIGVycm9yLCB0aHJvdyBpdCBpbiBoZXJlXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJpdmVyOiBJbm5lckRyaXZlcixcbiAgICAgICAgdmVyc2lvbjogZHJpdmVyVmVyc2lvbixcbiAgICAgICAgZHJpdmVyTmFtZSxcbiAgICAgIH0gPSB0aGlzLmRyaXZlckNvbmZpZy5maW5kTWF0Y2hpbmdEcml2ZXIoZGVzaXJlZENhcHMpO1xuICAgICAgdGhpcy5wcmludE5ld1Nlc3Npb25Bbm5vdW5jZW1lbnQoSW5uZXJEcml2ZXIubmFtZSwgZHJpdmVyVmVyc2lvbiwgSW5uZXJEcml2ZXIuYmFzZVZlcnNpb24pO1xuXG4gICAgICBpZiAodGhpcy5hcmdzLnNlc3Npb25PdmVycmlkZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUFsbFNlc3Npb25zKCk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUge0RyaXZlckRhdGFbXX1cbiAgICAgICAqL1xuICAgICAgbGV0IHJ1bm5pbmdEcml2ZXJzRGF0YSA9IFtdO1xuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7RHJpdmVyRGF0YVtdfVxuICAgICAgICovXG4gICAgICBsZXQgb3RoZXJQZW5kaW5nRHJpdmVyc0RhdGEgPSBbXTtcblxuICAgICAgY29uc3QgZHJpdmVySW5zdGFuY2UgPSBuZXcgSW5uZXJEcml2ZXIodGhpcy5hcmdzLCB0cnVlKTtcblxuICAgICAgLy8gV2Ugd2FudCB0byBhc3NpZ24gc2VjdXJpdHkgdmFsdWVzIGRpcmVjdGx5IG9uIHRoZSBkcml2ZXIuIFRoZSBkcml2ZXJcbiAgICAgIC8vIHNob3VsZCBub3QgcmVhZCBzZWN1cml0eSB2YWx1ZXMgZnJvbSBgdGhpcy5vcHRzYCBiZWNhdXNlIHRob3NlIHZhbHVlc1xuICAgICAgLy8gY291bGQgaGF2ZSBiZWVuIHNldCBieSBhIG1hbGljaW91cyB1c2VyIHZpYSBjYXBhYmlsaXRpZXMsIHdoZXJlYXMgd2VcbiAgICAgIC8vIHdhbnQgYSBndWFyYW50ZWUgdGhlIHZhbHVlcyB3ZXJlIHNldCBieSB0aGUgYXBwaXVtIHNlcnZlciBhZG1pblxuICAgICAgaWYgKHRoaXMuYXJncy5yZWxheGVkU2VjdXJpdHlFbmFibGVkKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oXG4gICAgICAgICAgYEFwcGx5aW5nIHJlbGF4ZWQgc2VjdXJpdHkgdG8gJyR7SW5uZXJEcml2ZXIubmFtZX0nIGFzIHBlciBgICtcbiAgICAgICAgICAgIGBzZXJ2ZXIgY29tbWFuZCBsaW5lIGFyZ3VtZW50LiBBbGwgaW5zZWN1cmUgZmVhdHVyZXMgd2lsbCBiZSBgICtcbiAgICAgICAgICAgIGBlbmFibGVkIHVubGVzcyBleHBsaWNpdGx5IGRpc2FibGVkIGJ5IC0tZGVueS1pbnNlY3VyZWBcbiAgICAgICAgKTtcbiAgICAgICAgZHJpdmVySW5zdGFuY2UucmVsYXhlZFNlY3VyaXR5RW5hYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuYXJncy5kZW55SW5zZWN1cmUpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ0V4cGxpY2l0bHkgcHJldmVudGluZyB1c2Ugb2YgaW5zZWN1cmUgZmVhdHVyZXM6Jyk7XG4gICAgICAgIHRoaXMuYXJncy5kZW55SW5zZWN1cmUubWFwKChhKSA9PiB0aGlzLmxvZy5pbmZvKGAgICAgJHthfWApKTtcbiAgICAgICAgZHJpdmVySW5zdGFuY2UuZGVueUluc2VjdXJlID0gdGhpcy5hcmdzLmRlbnlJbnNlY3VyZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5hcmdzLmFsbG93SW5zZWN1cmUpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ0V4cGxpY2l0bHkgZW5hYmxpbmcgdXNlIG9mIGluc2VjdXJlIGZlYXR1cmVzOicpO1xuICAgICAgICB0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZS5tYXAoKGEpID0+IHRoaXMubG9nLmluZm8oYCAgICAke2F9YCkpO1xuICAgICAgICBkcml2ZXJJbnN0YW5jZS5hbGxvd0luc2VjdXJlID0gdGhpcy5hcmdzLmFsbG93SW5zZWN1cmU7XG4gICAgICB9XG5cbiAgICAgIC8vIExpa2V3aXNlLCBhbnkgZHJpdmVyLXNwZWNpZmljIENMSSBhcmdzIHRoYXQgd2VyZSBwYXNzZWQgaW4gc2hvdWxkIGJlIGFzc2lnbmVkIGRpcmVjdGx5IHRvXG4gICAgICAvLyB0aGUgZHJpdmVyIHNvIHRoYXQgdGhleSBjYW5ub3QgYmUgbWltaWNrZWQgYnkgYSBtYWxpY2lvdXMgdXNlciBzZW5kaW5nIGluIGNhcGFiaWxpdGllc1xuICAgICAgY29uc3QgY2xpQXJncyA9IHRoaXMuZ2V0Q2xpQXJnc0ZvckRyaXZlcihkcml2ZXJOYW1lKTtcbiAgICAgIGlmICghXy5pc0VtcHR5KGNsaUFyZ3MpKSB7XG4gICAgICAgIGRyaXZlckluc3RhbmNlLmNsaUFyZ3MgPSBjbGlBcmdzO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIGFzc2lnbm1lbnQgaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3Qgd2ViIHNvY2tldHMgZnVuY3Rpb25hbGl0eSBpbnNpZGUgdGhlIGRyaXZlclxuICAgICAgLy8gRHJpdmVycy9wbHVnaW5zIG1pZ2h0IGFsc28gd2FudCB0byBrbm93IHdoZXJlIHRoZXkgYXJlIGhvc3RlZFxuXG4gICAgICAvLyBYWFg6IHRlbXBvcmFyeSBoYWNrIHRvIHdvcmsgYXJvdW5kICMxNjc0N1xuICAgICAgZHJpdmVySW5zdGFuY2Uuc2VydmVyID0gdGhpcy5zZXJ2ZXI7XG4gICAgICBkcml2ZXJJbnN0YW5jZS5zZXJ2ZXJIb3N0ID0gdGhpcy5hcmdzLmFkZHJlc3M7XG4gICAgICBkcml2ZXJJbnN0YW5jZS5zZXJ2ZXJQb3J0ID0gdGhpcy5hcmdzLnBvcnQ7XG4gICAgICBkcml2ZXJJbnN0YW5jZS5zZXJ2ZXJQYXRoID0gdGhpcy5hcmdzLmJhc2VQYXRoO1xuXG4gICAgICB0cnkge1xuICAgICAgICBydW5uaW5nRHJpdmVyc0RhdGEgPSAoYXdhaXQgdGhpcy5jdXJTZXNzaW9uRGF0YUZvckRyaXZlcihJbm5lckRyaXZlcikpID8/IFtdO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHBlbmRpbmdEcml2ZXJzR3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdID0gdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXSB8fCBbXTtcbiAgICAgICAgb3RoZXJQZW5kaW5nRHJpdmVyc0RhdGEgPSBfLmNvbXBhY3QoXG4gICAgICAgICAgdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXS5tYXAoKGRydikgPT4gZHJ2LmRyaXZlckRhdGEpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0ucHVzaChkcml2ZXJJbnN0YW5jZSk7XG4gICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgW2lubmVyU2Vzc2lvbklkLCBkQ2Fwc10gPSBhd2FpdCBkcml2ZXJJbnN0YW5jZS5jcmVhdGVTZXNzaW9uKFxuICAgICAgICAgIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyxcbiAgICAgICAgICByZXFDYXBzLFxuICAgICAgICAgIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyxcbiAgICAgICAgICBbLi4ucnVubmluZ0RyaXZlcnNEYXRhLCAuLi5vdGhlclBlbmRpbmdEcml2ZXJzRGF0YV1cbiAgICAgICAgKTtcbiAgICAgICAgcHJvdG9jb2wgPSBkcml2ZXJJbnN0YW5jZS5wcm90b2NvbDtcbiAgICAgICAgdGhpcy5zZXNzaW9uc1tpbm5lclNlc3Npb25JZF0gPSBkcml2ZXJJbnN0YW5jZTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHBlbmRpbmdEcml2ZXJzR3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICAgIF8ucHVsbCh0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdLCBkcml2ZXJJbnN0YW5jZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIoZHJpdmVySW5zdGFuY2UsIGlubmVyU2Vzc2lvbklkKTtcblxuICAgICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgICAgYE5ldyAke0lubmVyRHJpdmVyLm5hbWV9IHNlc3Npb24gY3JlYXRlZCBzdWNjZXNzZnVsbHksIHNlc3Npb24gYCArXG4gICAgICAgICAgYCR7aW5uZXJTZXNzaW9uSWR9IGFkZGVkIHRvIG1hc3RlciBzZXNzaW9uIGxpc3RgXG4gICAgICApO1xuXG4gICAgICAvLyBzZXQgdGhlIE5ldyBDb21tYW5kIFRpbWVvdXQgZm9yIHRoZSBpbm5lciBkcml2ZXJcbiAgICAgIGRyaXZlckluc3RhbmNlLnN0YXJ0TmV3Q29tbWFuZFRpbWVvdXQoKTtcblxuICAgICAgLy8gYXBwbHkgaW5pdGlhbCB2YWx1ZXMgdG8gQXBwaXVtIHNldHRpbmdzIChpZiBwcm92aWRlZClcbiAgICAgIGlmIChkcml2ZXJJbnN0YW5jZS5pc1czQ1Byb3RvY29sKCkgJiYgIV8uaXNFbXB0eSh3M2NTZXR0aW5ncykpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgICAgICBgQXBwbHlpbmcgdGhlIGluaXRpYWwgdmFsdWVzIHRvIEFwcGl1bSBzZXR0aW5ncyBwYXJzZWQgZnJvbSBXM0MgY2FwczogYCArXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh3M2NTZXR0aW5ncylcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgZHJpdmVySW5zdGFuY2UudXBkYXRlU2V0dGluZ3ModzNjU2V0dGluZ3MpO1xuICAgICAgfSBlbHNlIGlmIChkcml2ZXJJbnN0YW5jZS5pc01qc29ud3BQcm90b2NvbCgpICYmICFfLmlzRW1wdHkoandwU2V0dGluZ3MpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oXG4gICAgICAgICAgYEFwcGx5aW5nIHRoZSBpbml0aWFsIHZhbHVlcyB0byBBcHBpdW0gc2V0dGluZ3MgcGFyc2VkIGZyb20gTUpTT05XUCBjYXBzOiBgICtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGp3cFNldHRpbmdzKVxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBkcml2ZXJJbnN0YW5jZS51cGRhdGVTZXR0aW5ncyhqd3BTZXR0aW5ncyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICBlcnJvcixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3RvY29sLFxuICAgICAgdmFsdWU6IFtpbm5lclNlc3Npb25JZCwgZENhcHMsIHByb3RvY29sXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RHJpdmVyfSBkcml2ZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlubmVyU2Vzc2lvbklkXG4gICAqL1xuICBhdHRhY2hVbmV4cGVjdGVkU2h1dGRvd25IYW5kbGVyKGRyaXZlciwgaW5uZXJTZXNzaW9uSWQpIHtcbiAgICBjb25zdCBvblNodXRkb3duID0gKGNhdXNlID0gbmV3IEVycm9yKCdVbmtub3duIGVycm9yJykpID0+IHtcbiAgICAgIHRoaXMubG9nLndhcm4oYEVuZGluZyBzZXNzaW9uLCBjYXVzZSB3YXMgJyR7Y2F1c2UubWVzc2FnZX0nYCk7XG5cbiAgICAgIGlmICh0aGlzLnNlc3Npb25QbHVnaW5zW2lubmVyU2Vzc2lvbklkXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnNlc3Npb25QbHVnaW5zW2lubmVyU2Vzc2lvbklkXSkge1xuICAgICAgICAgIGlmIChfLmlzRnVuY3Rpb24ocGx1Z2luLm9uVW5leHBlY3RlZFNodXRkb3duKSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICAgIGBQbHVnaW4gJHtwbHVnaW4ubmFtZX0gZGVmaW5lcyBhbiB1bmV4cGVjdGVkIHNodXRkb3duIGhhbmRsZXI7IGNhbGxpbmcgaXQgbm93YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHBsdWdpbi5vblVuZXhwZWN0ZWRTaHV0ZG93bihkcml2ZXIsIGNhdXNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2cud2FybihcbiAgICAgICAgICAgICAgICBgR290IGFuIGVycm9yIHdoZW4gcnVubmluZyBwbHVnaW4gJHtwbHVnaW4ubmFtZX0gc2h1dGRvd24gaGFuZGxlcjogJHtlfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFBsdWdpbiAke3BsdWdpbi5uYW1lfSBkb2VzIG5vdCBkZWZpbmUgYW4gdW5leHBlY3RlZCBzaHV0ZG93biBoYW5kbGVyYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmluZm8oYFJlbW92aW5nIHNlc3Npb24gJyR7aW5uZXJTZXNzaW9uSWR9JyBmcm9tIG91ciBtYXN0ZXIgc2Vzc2lvbiBsaXN0YCk7XG4gICAgICBkZWxldGUgdGhpcy5zZXNzaW9uc1tpbm5lclNlc3Npb25JZF07XG4gICAgICBkZWxldGUgdGhpcy5zZXNzaW9uUGx1Z2luc1tpbm5lclNlc3Npb25JZF07XG4gICAgfTtcblxuICAgIGlmIChfLmlzRnVuY3Rpb24oZHJpdmVyLm9uVW5leHBlY3RlZFNodXRkb3duKSkge1xuICAgICAgZHJpdmVyLm9uVW5leHBlY3RlZFNodXRkb3duKG9uU2h1dGRvd24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy53YXJuKFxuICAgICAgICBgRmFpbGVkIHRvIGF0dGFjaCB0aGUgdW5leHBlY3RlZCBzaHV0ZG93biBsaXN0ZW5lci4gYCArXG4gICAgICAgICAgYElzICdvblVuZXhwZWN0ZWRTaHV0ZG93bicgbWV0aG9kIGF2YWlsYWJsZSBmb3IgJyR7ZHJpdmVyLmNvbnN0cnVjdG9yLm5hbWV9Jz9gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0RyaXZlckNsYXNzfSBJbm5lckRyaXZlclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxEcml2ZXJEYXRhW10+fX1cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF3YWl0XG4gIGFzeW5jIGN1clNlc3Npb25EYXRhRm9yRHJpdmVyKElubmVyRHJpdmVyKSB7XG4gICAgY29uc3QgZGF0YSA9IF8uY29tcGFjdChcbiAgICAgIF8udmFsdWVzKHRoaXMuc2Vzc2lvbnMpXG4gICAgICAgIC5maWx0ZXIoKHMpID0+IHMuY29uc3RydWN0b3IubmFtZSA9PT0gSW5uZXJEcml2ZXIubmFtZSlcbiAgICAgICAgLm1hcCgocykgPT4gcy5kcml2ZXJEYXRhKVxuICAgICk7XG4gICAgZm9yIChjb25zdCBkYXR1bSBvZiBkYXRhKSB7XG4gICAgICBpZiAoIWRhdHVtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUHJvYmxlbSBnZXR0aW5nIHNlc3Npb24gZGF0YSBmb3IgZHJpdmVyIHR5cGUgYCArXG4gICAgICAgICAgICBgJHtJbm5lckRyaXZlci5uYW1lfTsgZG9lcyBpdCBpbXBsZW1lbnQgJ2dldCBkcml2ZXJEYXRhJz9gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24oc2Vzc2lvbklkKSB7XG4gICAgbGV0IHByb3RvY29sO1xuICAgIHRyeSB7XG4gICAgICBsZXQgb3RoZXJTZXNzaW9uc0RhdGE7XG4gICAgICBjb25zdCBkc3RTZXNzaW9uID0gYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJDb25zdHJ1Y3Rvck5hbWUgPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF0uY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgb3RoZXJTZXNzaW9uc0RhdGEgPSBfLnRvUGFpcnModGhpcy5zZXNzaW9ucylcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUuY29uc3RydWN0b3IubmFtZSA9PT0gY3VyQ29uc3RydWN0b3JOYW1lICYmIGtleSAhPT0gc2Vzc2lvbklkXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKFssIHZhbHVlXSkgPT4gdmFsdWUuZHJpdmVyRGF0YSk7XG4gICAgICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgICAgIHByb3RvY29sID0gZHN0U2Vzc2lvbi5wcm90b2NvbDtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgUmVtb3Zpbmcgc2Vzc2lvbiAke3Nlc3Npb25JZH0gZnJvbSBvdXIgbWFzdGVyIHNlc3Npb24gbGlzdGApO1xuICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGRlbGV0ZVNlc3Npb24gY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBvciBub3RcbiAgICAgICAgLy8gbWFrZSB0aGUgc2Vzc2lvbiB1bmF2YWlsYWJsZSwgYmVjYXVzZSB3aG8ga25vd3Mgd2hhdCBzdGF0ZSBpdCBtaWdodFxuICAgICAgICAvLyBiZSBpbiBvdGhlcndpc2VcbiAgICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXTtcbiAgICAgICAgcmV0dXJuIGRzdFNlc3Npb247XG4gICAgICB9KTtcbiAgICAgIC8vIHRoaXMgbWF5IG5vdCBiZSBjb3JyZWN0LCBidXQgaWYgYGRzdFNlc3Npb25gIHdhcyBmYWxzeSwgdGhlIGNhbGwgdG8gYGRlbGV0ZVNlc3Npb24oKWAgd291bGRcbiAgICAgIC8vIHRocm93IGFueXdheS5cbiAgICAgIGlmICghZHN0U2Vzc2lvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nlc3Npb24gbm90IGZvdW5kJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgdmFsdWU6IGF3YWl0IGRzdFNlc3Npb24uZGVsZXRlU2Vzc2lvbihzZXNzaW9uSWQsIG90aGVyU2Vzc2lvbnNEYXRhKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoYEhhZCB0cm91YmxlIGVuZGluZyBzZXNzaW9uICR7c2Vzc2lvbklkfTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgZXJyb3I6IGUsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbFNlc3Npb25zKG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHNlc3Npb25zQ291bnQgPSBfLnNpemUodGhpcy5zZXNzaW9ucyk7XG4gICAgaWYgKDAgPT09IHNlc3Npb25zQ291bnQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdUaGVyZSBhcmUgbm8gYWN0aXZlIHNlc3Npb25zIGZvciBjbGVhbnVwJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge2ZvcmNlID0gZmFsc2UsIHJlYXNvbn0gPSBvcHRzO1xuICAgIHRoaXMubG9nLmRlYnVnKGBDbGVhbmluZyB1cCAke3V0aWwucGx1cmFsaXplKCdhY3RpdmUgc2Vzc2lvbicsIHNlc3Npb25zQ291bnQsIHRydWUpfWApO1xuICAgIGNvbnN0IGNsZWFudXBQcm9taXNlcyA9IGZvcmNlXG4gICAgICA/IF8udmFsdWVzKHRoaXMuc2Vzc2lvbnMpLm1hcCgoZHJ2KSA9PlxuICAgICAgICAgIGRydi5zdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihyZWFzb24gJiYgbmV3IEVycm9yKHJlYXNvbikpXG4gICAgICAgIClcbiAgICAgIDogXy5rZXlzKHRoaXMuc2Vzc2lvbnMpLm1hcCgoaWQpID0+IHRoaXMuZGVsZXRlU2Vzc2lvbihpZCkpO1xuICAgIGZvciAoY29uc3QgY2xlYW51cFByb21pc2Ugb2YgY2xlYW51cFByb21pc2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjbGVhbnVwUHJvbWlzZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXBwcm9wcmlhdGUgcGx1Z2lucyBmb3IgYSBzZXNzaW9uIChvciBzZXNzaW9ubGVzcyBwbHVnaW5zKVxuICAgKlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IHNlc3Npb25JZCAtIHRoZSBzZXNzaW9uSWQgKG9yIG51bGwpIHRvIHVzZSB0byBmaW5kIHBsdWdpbnNcbiAgICogQHJldHVybnMge0FycmF5fSAtIGFycmF5IG9mIHBsdWdpbiBpbnN0YW5jZXNcbiAgICovXG4gIHBsdWdpbnNGb3JTZXNzaW9uKHNlc3Npb25JZCA9IG51bGwpIHtcbiAgICBpZiAoc2Vzc2lvbklkKSB7XG4gICAgICBpZiAoIXRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXSkge1xuICAgICAgICB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF0gPSB0aGlzLmNyZWF0ZVBsdWdpbkluc3RhbmNlcygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zKSkge1xuICAgICAgdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMgPSB0aGlzLmNyZWF0ZVBsdWdpbkluc3RhbmNlcygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnM7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHBsdWdpbnMgZm9yIGEgY29tbWFuZCwgd2UgZWl0aGVyIGdldCB0aGUgcGx1Z2luIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAqIHBhcnRpY3VsYXIgY29tbWFuZCdzIHNlc3Npb24sIG9yIGluIHRoZSBjYXNlIG9mIHNlc3Npb25sZXNzIHBsdWdpbnMsIHB1bGwgZnJvbSB0aGUgc2V0IG9mXG4gICAqIHBsdWdpbiBpbnN0YW5jZXMgcmVzZXJ2ZWQgZm9yIHNlc3Npb25sZXNzIGNvbW1hbmRzIChhbmQgd2UgbGF6aWx5IGNyZWF0ZSBwbHVnaW4gaW5zdGFuY2VzIG9uXG4gICAqIGZpcnN0IHVzZSlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNtZCAtIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIHRvIGZpbmQgYSBwbHVnaW4gdG8gaGFuZGxlXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gc2Vzc2lvbklkIC0gdGhlIHBhcnRpY3VsYXIgc2Vzc2lvbiBmb3Igd2hpY2ggdG8gZmluZCBhIHBsdWdpbiwgb3IgbnVsbCBpZlxuICAgKiBzZXNzaW9ubGVzc1xuICAgKi9cbiAgcGx1Z2luc1RvSGFuZGxlQ21kKGNtZCwgc2Vzc2lvbklkID0gbnVsbCkge1xuICAgIC8vIHRvIGhhbmRsZSBhIGdpdmVuIGNvbW1hbmQsIGEgcGx1Z2luIHNob3VsZCBlaXRoZXIgaW1wbGVtZW50IHRoYXQgY29tbWFuZCBhcyBhIHBsdWdpblxuICAgIC8vIGluc3RhbmNlIG1ldGhvZCBvciBpdCBzaG91bGQgaW1wbGVtZW50IGEgZ2VuZXJpYyAnaGFuZGxlJyBtZXRob2RcbiAgICByZXR1cm4gdGhpcy5wbHVnaW5zRm9yU2Vzc2lvbihzZXNzaW9uSWQpLmZpbHRlcihcbiAgICAgIChwKSA9PiBfLmlzRnVuY3Rpb24ocFtjbWRdKSB8fCBfLmlzRnVuY3Rpb24ocC5oYW5kbGUpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGluc3RhbmNlcyBvZiBhbGwgb2YgdGhlIGVuYWJsZWQgUGx1Z2luIGNsYXNzZXNcbiAgICogQHJldHVybnMge1BsdWdpbltdfVxuICAgKi9cbiAgY3JlYXRlUGx1Z2luSW5zdGFuY2VzKCkge1xuICAgIC8qKiBAdHlwZSB7UGx1Z2luW119ICovXG4gICAgY29uc3QgcGx1Z2luSW5zdGFuY2VzID0gW107XG4gICAgZm9yIChjb25zdCBbUGx1Z2luQ2xhc3MsIG5hbWVdIG9mIHRoaXMucGx1Z2luQ2xhc3Nlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IGNsaUFyZ3MgPSB0aGlzLmdldENsaUFyZ3NGb3JQbHVnaW4obmFtZSk7XG4gICAgICBjb25zdCBwbHVnaW4gPSBuZXcgUGx1Z2luQ2xhc3MobmFtZSwgY2xpQXJncyk7XG4gICAgICBwbHVnaW5JbnN0YW5jZXMucHVzaChwbHVnaW4pO1xuICAgIH1cbiAgICByZXR1cm4gcGx1Z2luSW5zdGFuY2VzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbWRcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHt2YWx1ZTogYW55LCBlcnJvcj86IEVycm9yLCBwcm90b2NvbDogc3RyaW5nfSB8IGltcG9ydCgndHlwZS1mZXN0JykuQXN5bmNSZXR1cm5UeXBlPERyaXZlclsnZXhlY3V0ZUNvbW1hbmQnXT4+fVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKSB7XG4gICAgLy8gV2UgaGF2ZSBiYXNpY2FsbHkgdGhyZWUgY2FzZXMgZm9yIGhvdyB0byBoYW5kbGUgY29tbWFuZHM6XG4gICAgLy8gMS4gaGFuZGxlIGdldFN0YXR1cyAod2UgZG8gdGhpcyBhcyBhIHNwZWNpYWwgb3V0IG9mIGJhbmQgY2FzZSBzbyBpdCBkb2Vzbid0IGdldCBhZGRlZCB0byBhblxuICAgIC8vICAgIGV4ZWN1dGlvbiBxdWV1ZSwgYW5kIGNhbiBiZSBjYWxsZWQgd2hpbGUgZS5nLiBjcmVhdGVTZXNzaW9uIGlzIGluIHByb2dyZXNzKVxuICAgIC8vIDIuIGhhbmRsZSBjb21tYW5kcyB0aGF0IHRoaXMgdW1icmVsbGEgZHJpdmVyIHNob3VsZCBoYW5kbGUsIHJhdGhlciB0aGFuIHRoZSBhY3R1YWwgc2Vzc2lvblxuICAgIC8vICAgIGRyaXZlciAoZm9yIGV4YW1wbGUsIGRlbGV0ZVNlc3Npb24sIG9yIG90aGVyIG5vbi1zZXNzaW9uIGNvbW1hbmRzKVxuICAgIC8vIDMuIGhhbmRsZSBzZXNzaW9uIGRyaXZlciBjb21tYW5kcy5cbiAgICAvLyBUaGUgdHJpY2t5IHBhcnQgaXMgdGhhdCBiZWNhdXNlIHdlIHN1cHBvcnQgY29tbWFuZCBwbHVnaW5zLCB3ZSBuZWVkIHRvIHdyYXAgYW55IG9mIHRoZXNlXG4gICAgLy8gY2FzZXMgd2l0aCBwbHVnaW4gaGFuZGxpbmcuXG5cbiAgICBjb25zdCBpc0dldFN0YXR1cyA9IGNtZCA9PT0gR0VUX1NUQVRVU19DT01NQU5EO1xuICAgIGNvbnN0IGlzVW1icmVsbGFDbWQgPSBpc0FwcGl1bURyaXZlckNvbW1hbmQoY21kKTtcbiAgICBjb25zdCBpc1Nlc3Npb25DbWQgPSBpc1Nlc3Npb25Db21tYW5kKGNtZCk7XG5cbiAgICAvLyBpZiBhIHBsdWdpbiBvdmVycmlkZSBwcm94eWluZyBmb3IgdGhpcyBjb21tYW5kIGFuZCB0aGF0IGlzIHdoeSB3ZSBhcmUgaGVyZSBpbnN0ZWFkIG9mIGp1c3RcbiAgICAvLyBsZXR0aW5nIHRoZSBwcm90b2NvbCBwcm94eSB0aGUgY29tbWFuZCBlbnRpcmVseSwgZGV0ZXJtaW5lIHRoYXQsIGdldCB0aGUgcmVxdWVzdCBvYmplY3QgZm9yXG4gICAgLy8gdXNlIGxhdGVyIG9uLCB0aGVuIGNsZWFuIHVwIHRoZSBhcmdzXG4gICAgY29uc3QgcmVxRm9yUHJveHkgPSBfLmxhc3QoYXJncyk/LnJlcUZvclByb3h5O1xuICAgIGlmIChyZXFGb3JQcm94eSkge1xuICAgICAgYXJncy5wb3AoKTtcbiAgICB9XG5cbiAgICAvLyBmaXJzdCBkbyBzb21lIGVycm9yIGNoZWNraW5nLiBJZiB3ZSdyZSByZXF1ZXN0aW5nIGEgc2Vzc2lvbiBjb21tYW5kIGV4ZWN1dGlvbiwgdGhlbiBtYWtlXG4gICAgLy8gc3VyZSB0aGF0IHNlc3Npb24gYWN0dWFsbHkgZXhpc3RzIG9uIHRoZSBzZXNzaW9uIGRyaXZlciwgYW5kIHNldCB0aGUgc2Vzc2lvbiBkcml2ZXIgaXRzZWxmXG4gICAgbGV0IHNlc3Npb25JZCA9IG51bGw7XG4gICAgbGV0IGRzdFNlc3Npb24gPSBudWxsO1xuICAgIGxldCBwcm90b2NvbCA9IG51bGw7XG4gICAgLyoqIEB0eXBlIHt0aGlzIHwgRXh0ZXJuYWxEcml2ZXJ9ICovXG4gICAgbGV0IGRyaXZlciA9IHRoaXM7XG4gICAgaWYgKGlzU2Vzc2lvbkNtZCkge1xuICAgICAgc2Vzc2lvbklkID0gXy5sYXN0KGFyZ3MpO1xuICAgICAgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICAgIGlmICghZHN0U2Vzc2lvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBzZXNzaW9uIHdpdGggaWQgJyR7c2Vzc2lvbklkfScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICAgIH1cbiAgICAgIC8vIG5vdyBzYXZlIHRoZSByZXNwb25zZSBwcm90b2NvbCBnaXZlbiB0aGF0IHRoZSBzZXNzaW9uIGRyaXZlcidzIHByb3RvY29sIG1pZ2h0IGRpZmZlclxuICAgICAgcHJvdG9jb2wgPSBkc3RTZXNzaW9uLnByb3RvY29sO1xuICAgICAgaWYgKCFpc1VtYnJlbGxhQ21kKSB7XG4gICAgICAgIGRyaXZlciA9IGRzdFNlc3Npb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFueSBwbHVnaW5zIHdoaWNoIGFyZSByZWdpc3RlcmVkIGFzIGhhbmRsaW5nIHRoaXMgY29tbWFuZFxuICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLnBsdWdpbnNUb0hhbmRsZUNtZChjbWQsIHNlc3Npb25JZCk7XG5cbiAgICAvLyBub3cgd2UgZGVmaW5lIGEgJ2NtZEhhbmRsZWRCeScgb2JqZWN0IHdoaWNoIHdpbGwga2VlcCB0cmFjayBvZiB3aGljaCBwbHVnaW5zIGhhdmUgaGFuZGxlZCB0aGlzXG4gICAgLy8gY29tbWFuZC4gd2UgY2FyZSBhYm91dCB0aGlzIGJlY2F1c2UgKGEpIG11bHRpcGxlIHBsdWdpbnMgY2FuIGhhbmRsZSB0aGUgc2FtZSBjb21tYW5kLCBhbmRcbiAgICAvLyAoYikgdGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCBhIHBsdWdpbiB3aWxsIGFjdHVhbGx5IGNhbGwgdGhlIG5leHQoKSBtZXRob2Qgd2hpY2ggcnVucyB0aGVcbiAgICAvLyBvcmlnaW5hbCBjb21tYW5kIGV4ZWN1dGlvbi4gVGhpcyByZXN1bHRzIGluIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBjb21tYW5kIG1pZ2h0IGJlIGhhbmRsZWRcbiAgICAvLyBieSBzb21lIGJ1dCBub3QgYWxsIHBsdWdpbnMsIG9yIGJ5IHBsdWdpbihzKSBidXQgbm90IGJ5IHRoZSBkZWZhdWx0IGJlaGF2aW9yLiBTbyBzdGFydCBvdXRcbiAgICAvLyB0aGlzIG9iamVjdCBkZWNsYXJpbmcgdGhhdCB0aGUgZGVmYXVsdCBoYW5kbGVyIGhhcyBub3QgYmVlbiBleGVjdXRlZC5cbiAgICBjb25zdCBjbWRIYW5kbGVkQnkgPSB7ZGVmYXVsdDogZmFsc2V9O1xuXG4gICAgLy8gbm93IHdlIGRlZmluZSBhbiBhc3luYyBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byBwbHVnaW5zLCBhbmQgc3VjY2Vzc2l2ZWx5IHdyYXBwZWRcbiAgICAvLyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBsdWdpbiB0aGF0IGNhbiBoYW5kbGUgdGhlIGNvbW1hbmQuIFRvIHN0YXJ0IG9mZiB3aXRoLCB0aGUgYXN5bmNcbiAgICAvLyBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzIGNhbGxpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGkuZS4sIHdoaWNoZXZlciBvZiB0aGUgMyBjYXNlcyBhYm92ZSBpc1xuICAgIC8vIHRoZSBhcHByb3ByaWF0ZSBvbmVcbiAgICBjb25zdCBkZWZhdWx0QmVoYXZpb3IgPSBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBpZiB3ZSdyZSBydW5uaW5nIHdpdGggcGx1Z2lucywgbWFrZSBzdXJlIHdlIGxvZyB0aGF0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGFjdHVhbGx5XG4gICAgICAvLyBoYXBwZW5pbmcgc28gd2UgY2FuIHRlbGwgd2hlbiB0aGUgcGx1Z2luIGNhbGwgY2hhaW4gaXMgdW53cmFwcGluZyB0byB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgICAgLy8gaWYgdGhhdCdzIHdoYXQgaGFwcGVuc1xuICAgICAgcGx1Z2lucy5sZW5ndGggJiYgdGhpcy5sb2cuaW5mbyhgRXhlY3V0aW5nIGRlZmF1bHQgaGFuZGxpbmcgYmVoYXZpb3IgZm9yIGNvbW1hbmQgJyR7Y21kfSdgKTtcblxuICAgICAgLy8gaWYgd2UgbWFrZSBpdCBoZXJlLCB3ZSBrbm93IHRoYXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgaGFuZGxlZFxuICAgICAgY21kSGFuZGxlZEJ5LmRlZmF1bHQgPSB0cnVlO1xuXG4gICAgICBpZiAocmVxRm9yUHJveHkpIHtcbiAgICAgICAgLy8gd2Ugd291bGQgaGF2ZSBwcm94aWVkIHRoaXMgY29tbWFuZCBoYWQgYSBwbHVnaW4gbm90IGhhbmRsZWQgaXQsIHNvIHRoZSBkZWZhdWx0IGJlaGF2aW9yXG4gICAgICAgIC8vIGlzIHRvIGRvIHRoZSBwcm94eSBhbmQgcmV0cmlldmUgdGhlIHJlc3VsdCBpbnRlcm5hbGx5IHNvIGl0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIHBsdWdpblxuICAgICAgICAvLyBpbiBjYXNlIGl0IGNhbGxzICdhd2FpdCBuZXh0KCknLiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGRyaXZlciBoYXZlIGRlZmluZWRcbiAgICAgICAgLy8gJ3Byb3h5Q29tbWFuZCcgYW5kIG5vdCBqdXN0ICdwcm94eVJlcVJlcycuXG4gICAgICAgIGlmICghZHN0U2Vzc2lvbi5wcm94eUNvbW1hbmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9Ecml2ZXJQcm94eUNvbW1hbmRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBkc3RTZXNzaW9uLnByb3h5Q29tbWFuZChcbiAgICAgICAgICByZXFGb3JQcm94eS5vcmlnaW5hbFVybCxcbiAgICAgICAgICByZXFGb3JQcm94eS5tZXRob2QsXG4gICAgICAgICAgcmVxRm9yUHJveHkuYm9keVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNHZXRTdGF0dXMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1VtYnJlbGxhQ21kKSB7XG4gICAgICAgIC8vIHNvbWUgY29tbWFuZHMsIGxpa2UgZGVsZXRlU2Vzc2lvbiwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdG8gaGFuZGxlIG9uICp0aGlzKiBkcml2ZXIsXG4gICAgICAgIC8vIG5vdCB0aGUgcGxhdGZvcm0gZHJpdmVyXG4gICAgICAgIHJldHVybiBhd2FpdCBCYXNlRHJpdmVyLnByb3RvdHlwZS5leGVjdXRlQ29tbWFuZC5jYWxsKHRoaXMsIGNtZCwgLi4uYXJncyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGhlcmUgd2Uga25vdyB0aGF0IHdlIGFyZSBleGVjdXRpbmcgYSBzZXNzaW9uIGNvbW1hbmQsIGFuZCBoYXZlIGEgdmFsaWQgc2Vzc2lvbiBkcml2ZXJcbiAgICAgIHJldHVybiBhd2FpdCBkc3RTZXNzaW9uLmV4ZWN1dGVDb21tYW5kKGNtZCwgLi4uYXJncyk7XG4gICAgfTtcblxuICAgIC8vIG5vdyB0YWtlIG91ciBkZWZhdWx0IGJlaGF2aW9yLCB3cmFwIGl0IHdpdGggYW55IG51bWJlciBvZiBwbHVnaW4gYmVoYXZpb3JzLCBhbmQgcnVuIGl0XG4gICAgY29uc3Qgd3JhcHBlZENtZCA9IHRoaXMud3JhcENvbW1hbmRXaXRoUGx1Z2lucyh7XG4gICAgICBkcml2ZXIsXG4gICAgICBjbWQsXG4gICAgICBhcmdzLFxuICAgICAgcGx1Z2lucyxcbiAgICAgIGNtZEhhbmRsZWRCeSxcbiAgICAgIG5leHQ6IGRlZmF1bHRCZWhhdmlvcixcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmV4ZWN1dGVXcmFwcGVkQ29tbWFuZCh7d3JhcHBlZENtZCwgcHJvdG9jb2x9KTtcblxuICAgIC8vIGlmIHdlIGhhZCBwbHVnaW5zLCBtYWtlIHN1cmUgdG8gbG9nIG91dCB0aGUgaGVscGZ1bCByZXBvcnQgYWJvdXQgd2hpY2ggcGx1Z2lucyBlbmRlZCB1cFxuICAgIC8vIGhhbmRsaW5nIHRoZSBjb21tYW5kIGFuZCB3aGljaCBkaWRuJ3RcbiAgICB0aGlzLmxvZ1BsdWdpbkhhbmRsZXJSZXBvcnQocGx1Z2lucywge2NtZCwgY21kSGFuZGxlZEJ5fSk7XG5cbiAgICAvLyBBbmQgZmluYWxseSwgaWYgdGhlIGNvbW1hbmQgd2FzIGNyZWF0ZVNlc3Npb24sIHdlIHdhbnQgdG8gbWlncmF0ZSBhbnkgcGx1Z2lucyB3aGljaCB3ZXJlXG4gICAgLy8gcHJldmlvdXNseSBzZXNzaW9ubGVzcyB0byB1c2UgdGhlIG5ldyBzZXNzaW9uSWQsIHNvIHRoYXQgcGx1Z2lucyBjYW4gc2hhcmUgc3RhdGUgYmV0d2VlblxuICAgIC8vIHRoZWlyIGNyZWF0ZVNlc3Npb24gbWV0aG9kIGFuZCBvdGhlciBpbnN0YW5jZSBtZXRob2RzXG4gICAgaWYgKGNtZCA9PT0gQ1JFQVRFX1NFU1NJT05fQ09NTUFORCAmJiB0aGlzLnNlc3Npb25sZXNzUGx1Z2lucy5sZW5ndGggJiYgIXJlcy5lcnJvcikge1xuICAgICAgY29uc3Qgc2Vzc2lvbklkID0gXy5maXJzdChyZXMudmFsdWUpO1xuICAgICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgICAgYFByb21vdGluZyAke3RoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zLmxlbmd0aH0gc2Vzc2lvbmxlc3MgcGx1Z2lucyB0byBiZSBhdHRhY2hlZCBgICtcbiAgICAgICAgICBgdG8gc2Vzc2lvbiBJRCAke3Nlc3Npb25JZH1gXG4gICAgICApO1xuICAgICAgdGhpcy5zZXNzaW9uUGx1Z2luc1tzZXNzaW9uSWRdID0gdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnM7XG4gICAgICB0aGlzLnNlc3Npb25sZXNzUGx1Z2lucyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICB3cmFwQ29tbWFuZFdpdGhQbHVnaW5zKHtkcml2ZXIsIGNtZCwgYXJncywgbmV4dCwgY21kSGFuZGxlZEJ5LCBwbHVnaW5zfSkge1xuICAgIHBsdWdpbnMubGVuZ3RoICYmXG4gICAgICB0aGlzLmxvZy5pbmZvKGBQbHVnaW5zIHdoaWNoIGNhbiBoYW5kbGUgY21kICcke2NtZH0nOiAke3BsdWdpbnMubWFwKChwKSA9PiBwLm5hbWUpfWApO1xuXG4gICAgLy8gbm93IHdlIGNhbiBnbyB0aHJvdWdoIGVhY2ggcGx1Z2luIGFuZCB3cmFwIGBuZXh0YCBhcm91bmQgaXRzIG93biBoYW5kbGVyLCBwYXNzaW5nIHRoZSAqb2xkKlxuICAgIC8vIG5leHQgaW4gc28gdGhhdCBpdCBjYW4gY2FsbCBpdCBpZiBpdCB3YW50cyB0b1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgIC8vIG5lZWQgYW4gSUlGRSBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdmFsdWUgb2YgbmV4dCB0aGF0J3MgcGFzc2VkIHRvIHBsdWdpbi5oYW5kbGUgdG8gYmVcbiAgICAgIC8vIGV4YWN0bHkgdGhlIHZhbHVlIG9mIG5leHQgaGVyZSBiZWZvcmUgcmVhc3NpZ25tZW50OyB3ZSBkb24ndCB3YW50IGl0IHRvIGJlIGxhemlseVxuICAgICAgLy8gZXZhbHVhdGVkLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggaW5maW5pdGUgcmVjdXJzaW9uIG9mIHRoZSBsYXN0IGBuZXh0YCB0byBiZSBkZWZpbmVkLlxuICAgICAgY21kSGFuZGxlZEJ5W3BsdWdpbi5uYW1lXSA9IGZhbHNlOyAvLyB3ZSBzZWUgYSBuZXcgcGx1Z2luLCBzbyBhZGQgaXQgdG8gdGhlICdjbWRIYW5kbGVkQnknIG9iamVjdFxuICAgICAgbmV4dCA9ICgoX25leHQpID0+IGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgUGx1Z2luICR7cGx1Z2luLm5hbWV9IGlzIG5vdyBoYW5kbGluZyBjbWQgJyR7Y21kfSdgKTtcbiAgICAgICAgY21kSGFuZGxlZEJ5W3BsdWdpbi5uYW1lXSA9IHRydWU7IC8vIGlmIHdlIG1ha2UgaXQgaGVyZSwgdGhpcyBwbHVnaW4gaGFzIGF0dGVtcHRlZCB0byBoYW5kbGUgY21kXG4gICAgICAgIC8vIGZpcnN0IGF0dGVtcHQgdG8gaGFuZGxlIHRoZSBjb21tYW5kIHZpYSBhIGNvbW1hbmQtc3BlY2lmaWMgaGFuZGxlciBvbiB0aGUgcGx1Z2luXG4gICAgICAgIGlmIChwbHVnaW5bY21kXSkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBwbHVnaW5bY21kXShfbmV4dCwgZHJpdmVyLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2UsIGNhbGwgdGhlIGdlbmVyaWMgJ2hhbmRsZScgbWV0aG9kXG4gICAgICAgIHJldHVybiBhd2FpdCBwbHVnaW4uaGFuZGxlKF9uZXh0LCBkcml2ZXIsIGNtZCwgLi4uYXJncyk7XG4gICAgICB9KShuZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuXG4gIGxvZ1BsdWdpbkhhbmRsZXJSZXBvcnQocGx1Z2lucywge2NtZCwgY21kSGFuZGxlZEJ5fSkge1xuICAgIGlmICghcGx1Z2lucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBkYXksIHdlIGhhdmUgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB3aGljaCBwbHVnaW5zIGVuZGVkIHVwIGdldHRpbmdcbiAgICAvLyB0aGVpciBjb2RlIHJ1biBhcyBwYXJ0IG9mIGhhbmRsaW5nIHRoaXMgY29tbWFuZC4gQmVjYXVzZSBwbHVnaW5zIGNhbiBjaG9vc2UgKm5vdCogdG9cbiAgICAvLyBwYXNzIGNvbnRyb2wgdG8gb3RoZXIgcGx1Z2lucyBvciB0byB0aGUgZGVmYXVsdCBkcml2ZXIgYmVoYXZpb3IsIHRoaXMgaXMgaW5mb3JtYXRpb25cbiAgICAvLyB3aGljaCBpcyBwcm9iYWJseSB1c2VmdWwgdG8gdGhlIHVzZXIgKGVzcGVjaWFsbHkgaW4gc2l0dWF0aW9ucyB3aGVyZSBwbHVnaW5zIG1pZ2h0IG5vdFxuICAgIC8vIGludGVyYWN0IHdlbGwgdG9nZXRoZXIsIGFuZCBpdCB3b3VsZCBiZSBoYXJkIHRvIGRlYnVnIG90aGVyd2lzZSB3aXRob3V0IHRoaXMga2luZCBvZlxuICAgIC8vIG1lc3NhZ2UpLlxuICAgIGNvbnN0IGRpZEhhbmRsZSA9IE9iamVjdC5rZXlzKGNtZEhhbmRsZWRCeSkuZmlsdGVyKChrKSA9PiBjbWRIYW5kbGVkQnlba10pO1xuICAgIGNvbnN0IGRpZG50SGFuZGxlID0gT2JqZWN0LmtleXMoY21kSGFuZGxlZEJ5KS5maWx0ZXIoKGspID0+ICFjbWRIYW5kbGVkQnlba10pO1xuICAgIGlmIChkaWRudEhhbmRsZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKFxuICAgICAgICBgQ29tbWFuZCAnJHtjbWR9JyB3YXMgKm5vdCogaGFuZGxlZCBieSB0aGUgZm9sbG93aW5nIGJlaGF2aW91cnMgb3IgcGx1Z2lucywgZXZlbiBgICtcbiAgICAgICAgICBgdGhvdWdoIHRoZXkgd2VyZSByZWdpc3RlcmVkIHRvIGhhbmRsZSBpdDogJHtKU09OLnN0cmluZ2lmeShkaWRudEhhbmRsZSl9LiBUaGUgYCArXG4gICAgICAgICAgYGNvbW1hbmQgKndhcyogaGFuZGxlZCBieSB0aGVzZTogJHtKU09OLnN0cmluZ2lmeShkaWRIYW5kbGUpfS5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVXcmFwcGVkQ29tbWFuZCh7d3JhcHBlZENtZCwgcHJvdG9jb2x9KSB7XG4gICAgbGV0IGNtZFJlcyxcbiAgICAgIGNtZEVycixcbiAgICAgIHJlcyA9IHt9O1xuICAgIHRyeSB7XG4gICAgICAvLyBBdCB0aGlzIHBvaW50LCBgd3JhcHBlZENtZGAgZGVmaW5lcyBhIHdob2xlIHNlcXVlbmNlIG9mIHBsdWdpbiBoYW5kbGVycywgY3VsbWluYXRpbmcgaW5cbiAgICAgIC8vIG91ciBkZWZhdWx0IGhhbmRsZXIuIFdoYXRldmVyIGl0IHJldHVybnMgaXMgd2hhdCB3ZSdyZSBnb2luZyB0byB3YW50IHRvIHNlbmQgYmFjayB0byB0aGVcbiAgICAgIC8vIHVzZXIuXG4gICAgICBjbWRSZXMgPSBhd2FpdCB3cmFwcGVkQ21kKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY21kRXJyID0gZTtcbiAgICB9XG5cbiAgICAvLyBTYWRseSwgd2UgZG9uJ3Qga25vdyBleGFjdGx5IHdoYXQga2luZCBvZiBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC4gSXQgd2lsbCBlaXRoZXIgYmUgYSBiYXJlXG4gICAgLy8gb2JqZWN0LCBvciBhIHByb3RvY29sLWF3YXJlIG9iamVjdCB3aXRoIHByb3RvY29sIGFuZCBlcnJvci92YWx1ZSBrZXlzLiBTbyB3ZSBuZWVkIHRvIHNuaWZmXG4gICAgLy8gaXQgYW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCBkb3VibGUtd3JhcCBpdCBpZiBpdCdzIHRoZSBsYXR0ZXIga2luZC5cbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGNtZFJlcykgJiYgXy5oYXMoY21kUmVzLCAncHJvdG9jb2wnKSkge1xuICAgICAgcmVzID0gY21kUmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMudmFsdWUgPSBjbWRSZXM7XG4gICAgICByZXMuZXJyb3IgPSBjbWRFcnI7XG4gICAgICByZXMucHJvdG9jb2wgPSBwcm90b2NvbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHByb3h5QWN0aXZlKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgXy5pc0Z1bmN0aW9uKGRzdFNlc3Npb24ucHJveHlBY3RpdmUpICYmIGRzdFNlc3Npb24ucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0KHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gPyBkc3RTZXNzaW9uLmdldFByb3h5QXZvaWRMaXN0KCkgOiBbXTtcbiAgfVxuXG4gIGNhblByb3h5KHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgZHN0U2Vzc2lvbi5jYW5Qcm94eShzZXNzaW9uSWQpO1xuICB9XG59XG5cbi8vIGhlbHAgZGVjaWRlIHdoaWNoIGNvbW1hbmRzIHNob3VsZCBiZSBwcm94aWVkIHRvIHN1Yi1kcml2ZXJzIGFuZCB3aGljaFxuLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhpcywgb3VyIHVtYnJlbGxhIGRyaXZlclxuZnVuY3Rpb24gaXNBcHBpdW1Ecml2ZXJDb21tYW5kKGNtZCkge1xuICByZXR1cm4gIWlzU2Vzc2lvbkNvbW1hbmQoY21kKSB8fCBjbWQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQ7XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gQXBwaXVtIHRyaWVkIHRvIHByb3h5IGEgY29tbWFuZCB1c2luZyBhIGRyaXZlcidzIGBwcm94eUNvbW1hbmRgIG1ldGhvZCBidXQgdGhlXG4gKiBtZXRob2QgZGlkIG5vdCBleGlzdFxuICovXG5leHBvcnQgY2xhc3MgTm9Ecml2ZXJQcm94eUNvbW1hbmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTxzdHJpbmc+fVxuICAgKi9cbiAgY29kZSA9ICdBUFBJVU1FUlJfTk9fRFJJVkVSX1BST1hZQ09NTUFORCc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHRoaXMgY29tbWFuZCB3YXMgdG8gcHJveHksIGJ1dCB0aGUgZHJpdmVyIGAgK1xuICAgICAgICBgZGlkIG5vdCBoYXZlIHRoZSAncHJveHlDb21tYW5kJyBtZXRob2QgZGVmaW5lZC4gVG8gZnVsbHkgc3VwcG9ydCBgICtcbiAgICAgICAgYHBsdWdpbnMsIGRyaXZlcnMgc2hvdWxkIGhhdmUgJ3Byb3h5Q29tbWFuZCcgc2V0IHRvIGEgandwUHJveHkgb2JqZWN0J3MgYCArXG4gICAgICAgIGAnY29tbWFuZCgpJyBtZXRob2QsIGluIGFkZGl0aW9uIHRvIHRoZSBub3JtYWwgJ3Byb3h5UmVxUmVzJ2BcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7QXBwaXVtRHJpdmVyfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRXh0ZXJuYWxEcml2ZXJ9IEV4dGVybmFsRHJpdmVyXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyfSBEcml2ZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJDbGFzc30gRHJpdmVyQ2xhc3NcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5XM0NDYXBhYmlsaXRpZXN9IFczQ0NhcGFiaWxpdGllc1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlckRhdGF9IERyaXZlckRhdGFcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TZXJ2ZXJBcmdzfSBEcml2ZXJPcHRzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ29uc3RyYWludHN9IENvbnN0cmFpbnRzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtU2VydmVyfSBBcHBpdW1TZXJ2ZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL2V4dGVuc2lvbi9kcml2ZXItY29uZmlnJykuRHJpdmVyQ29uZmlnfSBEcml2ZXJDb25maWdcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5QbHVnaW59IFBsdWdpblxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlBsdWdpbkNsYXNzfSBQbHVnaW5DbGFzc1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlBsdWdpblR5cGV9IFBsdWdpblR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJUeXBlfSBEcml2ZXJUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuU2Vzc2lvbkhhbmRsZXI8U2Vzc2lvbkhhbmRsZXJSZXN1bHQ8YW55W10+LFNlc3Npb25IYW5kbGVyUmVzdWx0PHZvaWQ+Pn0gU2Vzc2lvbkhhbmRsZXJcbiAqL1xuXG4vKipcbiAqIFVzZWQgYnkge0BsaW5rY29kZSBBcHBpdW1Ecml2ZXIuY3JlYXRlU2Vzc2lvbn0gYW5kIHtAbGlua2NvZGUgQXBwaXVtRHJpdmVyLmRlbGV0ZVNlc3Npb259IHRvIGRlc2NyaWJlXG4gKiByZXN1bHQuXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGVkZWYgU2Vzc2lvbkhhbmRsZXJSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7Vn0gW3ZhbHVlXVxuICogQHByb3BlcnR5IHtFcnJvcn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwcm90b2NvbF1cbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQVNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQU1BLE1BQU1BLDRCQUE0QixHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztFQUNqREMsY0FBYyxFQUFFO0lBQ2RDLFFBQVEsRUFBRSxJQURJO0lBRWRDLFFBQVEsRUFBRTtFQUZJLENBRGlDO0VBS2pEQyxZQUFZLEVBQUU7SUFDWkYsUUFBUSxFQUFFLElBREU7SUFFWkMsUUFBUSxFQUFFO0VBRkU7QUFMbUMsQ0FBZCxDQUFyQztBQVdB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
|
package/build/lib/cli/args.d.ts
CHANGED
|
@@ -15,6 +15,6 @@ export function getServerArgs(): ArgumentDefinitions;
|
|
|
15
15
|
/**
|
|
16
16
|
* Builds a Record of extension types to a Record of subcommands to their argument definitions
|
|
17
17
|
*/
|
|
18
|
-
export const getExtensionArgs: (() => Record<import("
|
|
18
|
+
export const getExtensionArgs: (() => Record<import("../../../types/build").ExtensionType, Record<import("appium/types").CliExtensionSubcommand, ArgumentDefinitions>>) & _.MemoizedFunction;
|
|
19
19
|
import _ from "lodash";
|
|
20
20
|
//# sourceMappingURL=args.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../lib/cli/args.js"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../lib/cli/args.js"],"names":[],"mappings":";;;4BA2Ra,OAAO,uBAAuB,EAAE,aAAa;;;;kCAK7C,IAAI,MAAM,EAAE,EAAC,OAAO,UAAU,EAAE,eAAe,CAAC;AAhE7D;;;;GAIG;AACH,qDAEC;AA/LD;;GAEG;AACH,6LAcG"}
|