@ragemp-mango/core 3.0.0 → 3.1.0

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.
@@ -0,0 +1,1901 @@
1
+ import {
2
+ Module,
3
+ ModuleContainer,
4
+ ModuleMetadataReader
5
+ } from "./chunk-73LIJA6X.js";
6
+ import {
7
+ ExecutionContextBase,
8
+ MangoRequestBase,
9
+ MangoResponseBase
10
+ } from "./chunk-AO6BXG54.js";
11
+ import {
12
+ Tree,
13
+ TreeNode
14
+ } from "./chunk-RYOUF322.js";
15
+ import {
16
+ validateControllerOptions,
17
+ validateErrorFilter,
18
+ validateGuard,
19
+ validateInjectableMetadata,
20
+ validateInjectionToken,
21
+ validateInterceptor,
22
+ validateModuleOptions,
23
+ validatePipe
24
+ } from "./chunk-PGWRESZG.js";
25
+ import {
26
+ Controller,
27
+ ControllerEventHandler,
28
+ ControllerFlowHandler,
29
+ ControllerMetadataReader,
30
+ ControllerRPCHandler,
31
+ PipelineHandler
32
+ } from "./chunk-SKPH3K2M.js";
33
+ import {
34
+ APP_ENVIROMENT,
35
+ CONTAINER_OPTIONS,
36
+ ENABLE_SHUTDOWN_HOOKS,
37
+ EXECUTION_CONTEXT_FACTORY,
38
+ GLOBAL_APP_CONTAINER,
39
+ GLOBAL_ERROR_FILTERS,
40
+ GLOBAL_GUARDS,
41
+ GLOBAL_INTERCEPTORS,
42
+ GLOBAL_PIPES,
43
+ INTERNAL_APP_CONTAINER,
44
+ MANGO_REQUEST_FACTORY,
45
+ MANGO_RESPONSE_FACTORY,
46
+ MULTIPLAYER_SERVICE,
47
+ PLUGINS
48
+ } from "./chunk-HK7QTFPA.js";
49
+ import {
50
+ CoreMetadataKey,
51
+ MethodParamType
52
+ } from "./chunk-TBWHLT75.js";
53
+ import {
54
+ LOGGER_SERVICE,
55
+ MODULE_CONTAINER,
56
+ REFLECTOR_SERVICE,
57
+ TIMER_SERVICE
58
+ } from "./chunk-DJZCOYB3.js";
59
+ import {
60
+ ErrorMessage
61
+ } from "./chunk-DXPVUDXD.js";
62
+ import {
63
+ generateRandomId,
64
+ isEmpty,
65
+ isNil,
66
+ isNumber,
67
+ isObject,
68
+ isString
69
+ } from "./chunk-E6IQL4S6.js";
70
+ import {
71
+ __name
72
+ } from "./chunk-7QVYU63E.js";
73
+
74
+ // src/services/index.ts
75
+ import "@abraham/reflection";
76
+
77
+ // src/services/reflector.service.ts
78
+ import { injectable as injectable9 } from "inversify";
79
+
80
+ // src/decorators/index.ts
81
+ import "@abraham/reflection";
82
+
83
+ // src/decorators/core/controller.decorator.ts
84
+ import { injectable } from "inversify";
85
+ function Controller2(options) {
86
+ return (target) => {
87
+ if (Reflect.hasMetadata(CoreMetadataKey.Controller, target)) {
88
+ throw new Error(ErrorMessage.DuplicateDecoratorUsage);
89
+ }
90
+ const { valid, value, error } = validateControllerOptions(options);
91
+ if (!valid) throw new Error(error);
92
+ Reflect.defineMetadata(CoreMetadataKey.Controller, value, target);
93
+ return injectable()(target);
94
+ };
95
+ }
96
+ __name(Controller2, "Controller");
97
+
98
+ // src/decorators/core/global.decorator.ts
99
+ function Global() {
100
+ return (target) => {
101
+ Reflect.defineMetadata(CoreMetadataKey.GlobalModule, true, target);
102
+ return target;
103
+ };
104
+ }
105
+ __name(Global, "Global");
106
+
107
+ // src/decorators/core/inject.decorator.ts
108
+ import { inject } from "inversify";
109
+ function Inject(key) {
110
+ return (target, propertyKey, paramIndex) => {
111
+ if (!isNil(key) && !validateInjectionToken(key).valid) {
112
+ throw new Error(ErrorMessage.InvalidInjectionTokenSpecified);
113
+ }
114
+ const token = key ?? Reflect.getMetadata("design:type", target, propertyKey);
115
+ if (!token) {
116
+ throw new Error(ErrorMessage.InjectionTokenNotFound);
117
+ }
118
+ inject(token)(target, propertyKey, paramIndex);
119
+ };
120
+ }
121
+ __name(Inject, "Inject");
122
+
123
+ // src/decorators/core/injectable.decorator.ts
124
+ import { injectable as injectable2 } from "inversify";
125
+ function Injectable(options) {
126
+ return (target) => {
127
+ if (Reflect.hasMetadata(CoreMetadataKey.Injectable, target)) {
128
+ throw new Error(ErrorMessage.DuplicateDecoratorUsage);
129
+ }
130
+ const { valid, value, error } = validateInjectableMetadata(options);
131
+ if (!valid) throw new Error(error);
132
+ Reflect.defineMetadata(CoreMetadataKey.Injectable, value, target);
133
+ return injectable2()(target);
134
+ };
135
+ }
136
+ __name(Injectable, "Injectable");
137
+
138
+ // src/decorators/core/module.decorator.ts
139
+ import { injectable as injectable3 } from "inversify";
140
+ function Module2(options) {
141
+ return (target) => {
142
+ if (Reflect.hasMetadata(CoreMetadataKey.Module, target)) {
143
+ throw new Error(ErrorMessage.DuplicateDecoratorUsage);
144
+ }
145
+ const { valid, value, error } = validateModuleOptions(options);
146
+ if (!valid) throw new Error(error);
147
+ Reflect.defineMetadata(CoreMetadataKey.Module, value, target);
148
+ return injectable3()(target);
149
+ };
150
+ }
151
+ __name(Module2, "Module");
152
+
153
+ // src/decorators/core/optional.decorator.ts
154
+ import { optional } from "inversify";
155
+ function Optional() {
156
+ return (target, propertyKey, paramIndex) => {
157
+ return optional()(target, propertyKey, paramIndex);
158
+ };
159
+ }
160
+ __name(Optional, "Optional");
161
+
162
+ // src/decorators/core/set-metadata.decorator.ts
163
+ function SetMetadata(key, value) {
164
+ const decoratorFactory = /* @__PURE__ */ __name((target, _method, descriptor) => {
165
+ if (descriptor) {
166
+ Reflect.defineMetadata(key, value, descriptor.value);
167
+ return descriptor;
168
+ }
169
+ Reflect.defineMetadata(key, value, target);
170
+ return target;
171
+ }, "decoratorFactory");
172
+ decoratorFactory.KEY = key;
173
+ return decoratorFactory;
174
+ }
175
+ __name(SetMetadata, "SetMetadata");
176
+
177
+ // src/decorators/errors/catch.decorator.ts
178
+ function Catch(...exceptions) {
179
+ return (target) => {
180
+ if (Reflect.hasMetadata(CoreMetadataKey.Catch, target)) {
181
+ throw new Error(ErrorMessage.DuplicateDecoratorUsage);
182
+ }
183
+ const duplicates = exceptions.filter((exception, index) => exceptions.indexOf(exception) !== index);
184
+ if (duplicates.length) {
185
+ throw new Error(ErrorMessage.ExceptionHandlingConflict);
186
+ }
187
+ Reflect.defineMetadata(CoreMetadataKey.Catch, exceptions, target);
188
+ return target;
189
+ };
190
+ }
191
+ __name(Catch, "Catch");
192
+
193
+ // src/decorators/errors/use-filters.decorator.ts
194
+ function UseFilters(...filters) {
195
+ return (target, method, descriptor) => {
196
+ const validatedFilters = [];
197
+ for (const filter of filters) {
198
+ const { valid, value, error } = validateErrorFilter(filter);
199
+ if (!valid) throw new Error(error);
200
+ validatedFilters.push(value);
201
+ }
202
+ if (!isNil(descriptor) && !isNil(descriptor.value)) {
203
+ if (filters.length === 0) {
204
+ throw new Error(ErrorMessage.AtLeastOneFilterRequired);
205
+ }
206
+ const methodFilters = Reflect.getMetadata(CoreMetadataKey.ErrorFilters, target.constructor, method) || [];
207
+ if (!isNil(methodFilters.find((filter) => filters.includes(filter)))) {
208
+ throw new Error(ErrorMessage.DuplicateErrorFilterDetected);
209
+ }
210
+ Reflect.defineMetadata(CoreMetadataKey.ErrorFilters, [
211
+ ...validatedFilters,
212
+ ...methodFilters
213
+ ], target.constructor, method);
214
+ return descriptor;
215
+ }
216
+ if (filters.length === 0) {
217
+ throw new Error(ErrorMessage.AtLeastOneFilterRequired);
218
+ }
219
+ const classFilters = Reflect.getMetadata(CoreMetadataKey.ErrorFilters, target) || [];
220
+ if (!isNil(classFilters.find((filter) => filters.includes(filter)))) {
221
+ throw new Error(ErrorMessage.DuplicateErrorFilterDetected);
222
+ }
223
+ Reflect.defineMetadata(CoreMetadataKey.ErrorFilters, [
224
+ ...validatedFilters,
225
+ ...classFilters
226
+ ], target);
227
+ return target;
228
+ };
229
+ }
230
+ __name(UseFilters, "UseFilters");
231
+
232
+ // src/app/index.ts
233
+ import "@abraham/reflection";
234
+
235
+ // src/app/module-tree/app-runtime.ts
236
+ import { inject as inject2, injectable as injectable4, optional as optional2 } from "inversify";
237
+ function _ts_decorate(decorators, target, key, desc) {
238
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
239
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
240
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
241
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
242
+ }
243
+ __name(_ts_decorate, "_ts_decorate");
244
+ function _ts_metadata(k, v) {
245
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
246
+ }
247
+ __name(_ts_metadata, "_ts_metadata");
248
+ var AppRuntime = class {
249
+ static {
250
+ __name(this, "AppRuntime");
251
+ }
252
+ eventHandler;
253
+ rpcHandler;
254
+ globalGuards;
255
+ globalInterceptors;
256
+ globalPipes;
257
+ globalErrorFilters;
258
+ loggerService;
259
+ enableShutdownHooks;
260
+ async boot(resolvedTree) {
261
+ await resolvedTree.asyncTraverse(async (node) => {
262
+ const startTime = Date.now();
263
+ const module = node.value;
264
+ module.instance = module.container.get(module.metadata.classRef);
265
+ module.controllers.forEach((controller) => controller.instance = module.container.get(controller.metadata.classRef));
266
+ [
267
+ ...module.metadata.internalProviders,
268
+ ...module.metadata.externalProviders
269
+ ].forEach(([token]) => module.container.get(token));
270
+ this.loggerService.log(`~lw~Module ~lb~${module.metadata.classRef.name} ~lw~loaded ~lk~(${Date.now() - startTime}ms)`);
271
+ await this.runLifecycleMethod(module, "onModuleInit");
272
+ });
273
+ await this.runLifecycleMethods(resolvedTree, "onAppBootstrap");
274
+ resolvedTree.traverse((node) => {
275
+ const module = node.value;
276
+ module.controllers.forEach((controller) => {
277
+ const time = Date.now();
278
+ this.registerTimers(controller);
279
+ this.registerListeners(controller);
280
+ this.loggerService.log(`~lw~Controller ~lc~${controller.metadata.classRef.name} ~lw~timers and listeners registered ~lk~(${Date.now() - time}ms)`);
281
+ });
282
+ });
283
+ }
284
+ async shutdown(resolvedTree) {
285
+ if (this.enableShutdownHooks) {
286
+ await this.runLifecycleMethods(resolvedTree, "onModuleDestroy");
287
+ await this.runLifecycleMethods(resolvedTree, "beforeAppShutdown");
288
+ }
289
+ await resolvedTree.asyncTraverse(async (node) => {
290
+ const module = node.value;
291
+ module.controllers.forEach((controller) => {
292
+ const timerService = controller.owner.container.get(TIMER_SERVICE);
293
+ timerService.everyticks.forEach((timer) => timer.destroy());
294
+ timerService.intervals.forEach((timer) => timer.destroy());
295
+ timerService.timeouts.forEach((timer) => timer.destroy());
296
+ timerService.crons.forEach((cron) => cron.stop());
297
+ controller.eventHandlers.forEach((handler) => handler.destroy());
298
+ controller.rpcHandlers.forEach((handler) => handler.destroy());
299
+ });
300
+ });
301
+ if (this.enableShutdownHooks) {
302
+ await this.runLifecycleMethods(resolvedTree, "onAppShutdown");
303
+ }
304
+ }
305
+ registerListeners(controller) {
306
+ const module = controller.owner;
307
+ controller.metadata.events.forEach((event) => {
308
+ const guards = [
309
+ ...this.globalGuards,
310
+ ...module.metadata.guards,
311
+ ...controller.metadata.guards,
312
+ ...event.guards
313
+ ];
314
+ const interceptors = [
315
+ ...this.globalInterceptors,
316
+ ...module.metadata.interceptors,
317
+ ...controller.metadata.interceptors,
318
+ ...event.interceptors
319
+ ];
320
+ const pipes = [
321
+ ...this.globalPipes,
322
+ ...module.metadata.pipes,
323
+ ...controller.metadata.pipes,
324
+ ...event.pipes
325
+ ];
326
+ const mappedErrorFilters = this.mapErrorFilters([
327
+ ...this.globalErrorFilters,
328
+ ...module.metadata.errorFilters,
329
+ ...controller.metadata.errorFilters,
330
+ ...event.errorFilters
331
+ ]);
332
+ const handler = this.eventHandler.registerEvent(guards, interceptors, pipes, mappedErrorFilters, controller, event);
333
+ controller.eventHandlers.push(handler);
334
+ });
335
+ controller.metadata.rpcs.forEach(async (rpc) => {
336
+ const guards = [
337
+ ...this.globalGuards,
338
+ ...module.metadata.guards,
339
+ ...controller.metadata.guards,
340
+ ...rpc.guards
341
+ ];
342
+ const interceptors = [
343
+ ...this.globalInterceptors,
344
+ ...module.metadata.interceptors,
345
+ ...controller.metadata.interceptors,
346
+ ...rpc.interceptors
347
+ ];
348
+ const pipes = [
349
+ ...this.globalPipes,
350
+ ...module.metadata.pipes,
351
+ ...controller.metadata.pipes,
352
+ ...rpc.pipes
353
+ ];
354
+ const mappedErrorFilters = this.mapErrorFilters([
355
+ ...this.globalErrorFilters,
356
+ ...module.metadata.errorFilters,
357
+ ...controller.metadata.errorFilters,
358
+ ...rpc.errorFilters
359
+ ]);
360
+ const handler = await this.rpcHandler.registerRPC(guards, interceptors, pipes, mappedErrorFilters, controller, rpc);
361
+ controller.rpcHandlers.push(handler);
362
+ });
363
+ }
364
+ registerTimers(controller) {
365
+ const timerService = controller.owner.container.get(TIMER_SERVICE);
366
+ controller.metadata.timers.forEach((timer) => {
367
+ if (timer.type === "cron") {
368
+ timerService.createCronJob(controller.instance[timer.method].bind(controller.instance), timer.options);
369
+ } else if (timer.type === "everytick") {
370
+ timerService.createEveryTick(controller.instance[timer.method].bind(controller.instance), timer.name);
371
+ } else if (timer.type === "interval") {
372
+ timerService.createInterval(controller.instance[timer.method].bind(controller.instance), timer.options.timeout, timer.name);
373
+ } else if (timer.type === "timeout") {
374
+ timerService.createTimeout(controller.instance[timer.method].bind(controller.instance), timer.options.timeout, timer.name);
375
+ }
376
+ });
377
+ }
378
+ mapErrorFilters(errorFilters) {
379
+ const filterMap = [];
380
+ for (const filter of errorFilters) {
381
+ const errors = Reflect.getMetadata(CoreMetadataKey.Catch, filter) ?? [];
382
+ if (errors.length === 0) {
383
+ errors.push("MANGO_ANY_ERROR");
384
+ }
385
+ for (const error of errors) {
386
+ if (!isNil(filterMap.find((filterError) => filterError[0] === error))) {
387
+ this.loggerService.error("An error occurred while trying to map error filters.");
388
+ throw new Error(ErrorMessage.ErrorAlreadyHandledByFilter);
389
+ }
390
+ filterMap.push([
391
+ error,
392
+ filter
393
+ ]);
394
+ }
395
+ }
396
+ return filterMap;
397
+ }
398
+ async runLifecycleMethods(resolvedTree, method) {
399
+ return resolvedTree.asyncTraverse(async (node) => await this.runLifecycleMethod(node.value, method));
400
+ }
401
+ async runLifecycleMethod(module, method) {
402
+ await Promise.all(module.controllers.map(async (controller) => {
403
+ if (!isObject(controller.instance) || isNil(controller.instance[method])) return;
404
+ await controller.instance[method]();
405
+ }));
406
+ await Promise.all([
407
+ ...module.metadata.internalProviders,
408
+ ...module.metadata.externalProviders
409
+ ].map(async ([token]) => {
410
+ const providerInstance = module.container.get(token);
411
+ if (!isObject(providerInstance) || isNil(providerInstance[method])) return;
412
+ await providerInstance[method]();
413
+ }));
414
+ if (!isObject(module.instance) || isNil(module.instance[method])) return;
415
+ await module.instance[method]();
416
+ }
417
+ };
418
+ _ts_decorate([
419
+ inject2(ControllerEventHandler),
420
+ _ts_metadata("design:type", typeof ControllerEventHandler === "undefined" ? Object : ControllerEventHandler)
421
+ ], AppRuntime.prototype, "eventHandler", void 0);
422
+ _ts_decorate([
423
+ inject2(ControllerRPCHandler),
424
+ _ts_metadata("design:type", typeof ControllerRPCHandler === "undefined" ? Object : ControllerRPCHandler)
425
+ ], AppRuntime.prototype, "rpcHandler", void 0);
426
+ _ts_decorate([
427
+ inject2(GLOBAL_GUARDS),
428
+ _ts_metadata("design:type", Array)
429
+ ], AppRuntime.prototype, "globalGuards", void 0);
430
+ _ts_decorate([
431
+ inject2(GLOBAL_INTERCEPTORS),
432
+ _ts_metadata("design:type", Array)
433
+ ], AppRuntime.prototype, "globalInterceptors", void 0);
434
+ _ts_decorate([
435
+ inject2(GLOBAL_PIPES),
436
+ _ts_metadata("design:type", Array)
437
+ ], AppRuntime.prototype, "globalPipes", void 0);
438
+ _ts_decorate([
439
+ inject2(GLOBAL_ERROR_FILTERS),
440
+ _ts_metadata("design:type", Array)
441
+ ], AppRuntime.prototype, "globalErrorFilters", void 0);
442
+ _ts_decorate([
443
+ inject2(LOGGER_SERVICE),
444
+ _ts_metadata("design:type", typeof LoggerService === "undefined" ? Object : LoggerService)
445
+ ], AppRuntime.prototype, "loggerService", void 0);
446
+ _ts_decorate([
447
+ inject2(ENABLE_SHUTDOWN_HOOKS),
448
+ optional2(),
449
+ _ts_metadata("design:type", Boolean)
450
+ ], AppRuntime.prototype, "enableShutdownHooks", void 0);
451
+ AppRuntime = _ts_decorate([
452
+ injectable4()
453
+ ], AppRuntime);
454
+
455
+ // src/app/module-tree/dependency-binder.ts
456
+ import { Container, inject as inject3, injectable as injectable5, optional as optional3 } from "inversify";
457
+ function _ts_decorate2(decorators, target, key, desc) {
458
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
459
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
460
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
461
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
462
+ }
463
+ __name(_ts_decorate2, "_ts_decorate");
464
+ function _ts_metadata2(k, v) {
465
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
466
+ }
467
+ __name(_ts_metadata2, "_ts_metadata");
468
+ var ModuleDependencyBinder = class {
469
+ static {
470
+ __name(this, "ModuleDependencyBinder");
471
+ }
472
+ globalAppContainer;
473
+ loggerService;
474
+ containerOptions;
475
+ async bind(resolvedTree) {
476
+ await resolvedTree.asyncTraverse(async (node) => {
477
+ const startTime = Date.now();
478
+ const module = node.value;
479
+ module.container = new ModuleContainer(module.metadata.container ?? this.containerOptions);
480
+ module.container.parent = this.globalAppContainer;
481
+ this.globalAppContainer.bind(module.metadata.classRef).toSelf().inSingletonScope();
482
+ if (module.metadata.global) {
483
+ for (const [_, provider] of module.metadata.externalProviders) {
484
+ this.bindProvider(provider, this.globalAppContainer);
485
+ }
486
+ } else {
487
+ for (const [token, provider] of module.metadata.externalProviders) {
488
+ this.bindProvider(provider, module.container);
489
+ module.parent?.container.bind(token).toDynamicValue(() => module.container.get(token));
490
+ }
491
+ for (const importModule of module.repetitiveImports) {
492
+ for (const [token] of importModule.metadata.externalProviders) {
493
+ module.container.bind(token).toDynamicValue(() => importModule.container.get(token));
494
+ }
495
+ }
496
+ }
497
+ for (const [_, provider] of module.metadata.internalProviders) {
498
+ this.bindProvider(provider, module.container);
499
+ }
500
+ module.container.bind(MODULE_CONTAINER).toConstantValue(module.container);
501
+ for (const classRef of module.metadata.controllers) {
502
+ module.container.bind(classRef).toSelf().inSingletonScope();
503
+ }
504
+ module.container.bind(TIMER_SERVICE).to(TimerService).inSingletonScope();
505
+ this.loggerService.log(`~lw~Module ~lb~${module.metadata.classRef.name} ~lw~dependencies binded ~lk~(${Date.now() - startTime}ms)`);
506
+ });
507
+ }
508
+ bindProvider(provider, container) {
509
+ if ("useValue" in provider) {
510
+ container.bind(provider.provide).toConstantValue(provider.useValue);
511
+ } else if ("useFactory" in provider) {
512
+ const binding = container.bind(provider.provide).toDynamicValue((ctx) => {
513
+ const deps = provider.inject?.map((dep) => {
514
+ if (isObject(dep) && "token" in dep && "optional" in dep) {
515
+ try {
516
+ return ctx.container.get(dep.token);
517
+ } catch (err) {
518
+ if (dep.optional) return void 0;
519
+ this.loggerService.error("An error occurred while trying to resolve a dependency.");
520
+ throw err;
521
+ }
522
+ }
523
+ return ctx.container.get(dep);
524
+ }) ?? [];
525
+ return provider.useFactory(...deps);
526
+ });
527
+ if (provider.scope === "transient") binding.inTransientScope();
528
+ else if (provider.scope === "request") binding.inRequestScope();
529
+ else binding.inSingletonScope();
530
+ } else if ("useClass" in provider) {
531
+ const binding = container.bind(provider.provide).to(provider.useClass);
532
+ if (provider.scope === "transient") binding.inTransientScope();
533
+ else if (provider.scope === "request") binding.inRequestScope();
534
+ else binding.inSingletonScope();
535
+ } else if ("useExisting" in provider) {
536
+ container.bind(provider.provide).toService(provider.useExisting);
537
+ }
538
+ }
539
+ };
540
+ _ts_decorate2([
541
+ inject3(GLOBAL_APP_CONTAINER),
542
+ _ts_metadata2("design:type", typeof Container === "undefined" ? Object : Container)
543
+ ], ModuleDependencyBinder.prototype, "globalAppContainer", void 0);
544
+ _ts_decorate2([
545
+ inject3(LOGGER_SERVICE),
546
+ _ts_metadata2("design:type", typeof LoggerService === "undefined" ? Object : LoggerService)
547
+ ], ModuleDependencyBinder.prototype, "loggerService", void 0);
548
+ _ts_decorate2([
549
+ optional3(),
550
+ inject3(CONTAINER_OPTIONS),
551
+ _ts_metadata2("design:type", typeof interfaces === "undefined" || typeof interfaces.ContainerOptions === "undefined" ? Object : interfaces.ContainerOptions)
552
+ ], ModuleDependencyBinder.prototype, "containerOptions", void 0);
553
+ ModuleDependencyBinder = _ts_decorate2([
554
+ injectable5()
555
+ ], ModuleDependencyBinder);
556
+
557
+ // src/app/module-tree/module-tree-scanner.ts
558
+ import { inject as inject4, injectable as injectable6 } from "inversify";
559
+ function _ts_decorate3(decorators, target, key, desc) {
560
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
561
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
562
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
563
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
564
+ }
565
+ __name(_ts_decorate3, "_ts_decorate");
566
+ function _ts_metadata3(k, v) {
567
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
568
+ }
569
+ __name(_ts_metadata3, "_ts_metadata");
570
+ var ModuleTreeScanner = class {
571
+ static {
572
+ __name(this, "ModuleTreeScanner");
573
+ }
574
+ moduleMetadataReader;
575
+ controllerMetadataReader;
576
+ loggerService;
577
+ async scan(classRef) {
578
+ const startTime = Date.now();
579
+ const moduleMetadata = await this.moduleMetadataReader.read(classRef);
580
+ const module = new Module();
581
+ module.metadata = moduleMetadata;
582
+ this.loggerService.log(`~lw~Module ~lb~${module.metadata.classRef.name} ~lw~scanned ~lk~(${Date.now() - startTime}ms)`);
583
+ await this.scanControllers(module);
584
+ const moduleTree = new Tree(module);
585
+ const scannedModules = /* @__PURE__ */ new Map();
586
+ scannedModules.set(classRef, module);
587
+ for (const importedModule of moduleMetadata.imports) {
588
+ await this.scanModules(moduleTree.root, importedModule, scannedModules);
589
+ }
590
+ return moduleTree;
591
+ }
592
+ async scanModules(parentNode, classRef, scannedModules = /* @__PURE__ */ new Map()) {
593
+ const scannedModule = scannedModules.get(classRef);
594
+ if (!isNil(scannedModule)) {
595
+ parentNode.value.repetitiveImports.add(scannedModule);
596
+ return;
597
+ }
598
+ const startTime = Date.now();
599
+ const moduleMetadata = await this.moduleMetadataReader.read(classRef);
600
+ this.checkCircularDependency(parentNode.value.metadata, moduleMetadata);
601
+ const module = new Module();
602
+ module.metadata = moduleMetadata;
603
+ module.parent = parentNode.value;
604
+ this.loggerService.log(`~lw~Module ~lb~${module.metadata.classRef.name} ~lw~scanned ~lk~(${Date.now() - startTime}ms)`);
605
+ await this.scanControllers(module);
606
+ const treeNode = new TreeNode(module);
607
+ parentNode.addChild(treeNode);
608
+ scannedModules.set(classRef, module);
609
+ for (const importModule of moduleMetadata.imports) {
610
+ await this.scanModules(treeNode, importModule, scannedModules);
611
+ }
612
+ }
613
+ async scanControllers(module) {
614
+ for (const classRef of module.metadata.controllers) {
615
+ const startTime = Date.now();
616
+ const controllerMetadata = await this.controllerMetadataReader.read(classRef);
617
+ const controller = new Controller();
618
+ controller.metadata = controllerMetadata;
619
+ controller.owner = module;
620
+ module.controllers.push(controller);
621
+ this.loggerService.log(`~lw~Controller ~lc~${classRef.name} ~lw~scanned ~lk~(${Date.now() - startTime}ms)`);
622
+ }
623
+ }
624
+ async checkCircularDependency(parentMetadata, moduleMetadata) {
625
+ if (moduleMetadata.imports.includes(parentMetadata.classRef)) {
626
+ throw new Error(ErrorMessage.CircularDependencyDetected);
627
+ }
628
+ }
629
+ };
630
+ _ts_decorate3([
631
+ inject4(ModuleMetadataReader),
632
+ _ts_metadata3("design:type", typeof ModuleMetadataReader === "undefined" ? Object : ModuleMetadataReader)
633
+ ], ModuleTreeScanner.prototype, "moduleMetadataReader", void 0);
634
+ _ts_decorate3([
635
+ inject4(ControllerMetadataReader),
636
+ _ts_metadata3("design:type", typeof ControllerMetadataReader === "undefined" ? Object : ControllerMetadataReader)
637
+ ], ModuleTreeScanner.prototype, "controllerMetadataReader", void 0);
638
+ _ts_decorate3([
639
+ inject4(LOGGER_SERVICE),
640
+ _ts_metadata3("design:type", typeof LoggerService === "undefined" ? Object : LoggerService)
641
+ ], ModuleTreeScanner.prototype, "loggerService", void 0);
642
+ ModuleTreeScanner = _ts_decorate3([
643
+ injectable6()
644
+ ], ModuleTreeScanner);
645
+
646
+ // src/app/multiplayer/ragemp/ragemp-script-event-handler.ts
647
+ var RageMPScriptEvent = class {
648
+ static {
649
+ __name(this, "RageMPScriptEvent");
650
+ }
651
+ eventName;
652
+ listener;
653
+ constructor(eventName, listener) {
654
+ this.eventName = eventName;
655
+ this.listener = listener;
656
+ }
657
+ destroy() {
658
+ mp.events.remove(this.eventName, this.listener);
659
+ }
660
+ };
661
+
662
+ // src/app/multiplayer/ragemp/ragemp-event-emmiter.ts
663
+ var RageMPEventEmmiter = class {
664
+ static {
665
+ __name(this, "RageMPEventEmmiter");
666
+ }
667
+ emit(eventName, ...args) {
668
+ mp.events.call(eventName, ...args);
669
+ }
670
+ on(eventName, listener) {
671
+ mp.events.add(eventName, listener);
672
+ return new RageMPScriptEvent(eventName, listener);
673
+ }
674
+ once(eventName, listener) {
675
+ const onceWrapper = /* @__PURE__ */ __name((...args) => {
676
+ mp.events.remove(eventName, onceWrapper);
677
+ listener(...args);
678
+ }, "onceWrapper");
679
+ mp.events.add(eventName, onceWrapper);
680
+ return new RageMPScriptEvent(eventName, onceWrapper);
681
+ }
682
+ off(eventName, listener) {
683
+ mp.events.remove(eventName, listener);
684
+ }
685
+ };
686
+
687
+ // src/app/multiplayer/ragemp/ragemp-timer.ts
688
+ var RageMPTimer = class {
689
+ static {
690
+ __name(this, "RageMPTimer");
691
+ }
692
+ id;
693
+ interval;
694
+ once;
695
+ callback;
696
+ clearTimer;
697
+ lastTick = Date.now();
698
+ constructor(id, interval = 0, once, callback, clearTimer) {
699
+ this.id = id;
700
+ this.interval = interval;
701
+ this.once = once;
702
+ this.callback = callback;
703
+ this.clearTimer = clearTimer;
704
+ }
705
+ destroy() {
706
+ this.clearTimer();
707
+ }
708
+ };
709
+
710
+ // src/app/multiplayer/ragemp/ragemp-timers.ts
711
+ var RageMPTimers = class {
712
+ static {
713
+ __name(this, "RageMPTimers");
714
+ }
715
+ timerIncrementer = 0;
716
+ timers = /* @__PURE__ */ new Map();
717
+ everyTickHandlers = /* @__PURE__ */ new Map();
718
+ isEveryTickRunning = false;
719
+ everyTickMainHandler = null;
720
+ get all() {
721
+ return [
722
+ ...this.timers.values()
723
+ ];
724
+ }
725
+ get warningThreshold() {
726
+ return 0;
727
+ }
728
+ set warningThreshold(_value) {
729
+ }
730
+ get sourceLocationFrameSkipCount() {
731
+ return 0;
732
+ }
733
+ set sourceLocationFrameSkipCount(_value) {
734
+ }
735
+ getByID(id) {
736
+ const timer = this.timers.get(id);
737
+ return timer ?? null;
738
+ }
739
+ createTimer(createTimer, clear, callback, interval, once, ...args) {
740
+ const callbackBind = callback.bind(this, ...Array.isArray(args) ? args : []);
741
+ const timerId = typeof interval === "number" ? createTimer(callbackBind, interval) : createTimer(callbackBind);
742
+ const id = this.timerIncrementer++;
743
+ const rageMPTimer = new RageMPTimer(id, interval ?? 0, once, callbackBind, () => {
744
+ clear(timerId);
745
+ this.timers.delete(id);
746
+ });
747
+ this.timers.set(id, rageMPTimer);
748
+ return rageMPTimer;
749
+ }
750
+ setInterval(callback, time, ...args) {
751
+ return this.createTimer((cb, interval) => setInterval(cb, interval), (id) => clearInterval(id), callback, time, false, ...args);
752
+ }
753
+ setTimeout(callback, time, ...args) {
754
+ const id = this.timerIncrementer++;
755
+ const callbackBind = callback.bind(this, ...Array.isArray(args) ? args : []);
756
+ const timerId = setTimeout(() => {
757
+ callbackBind();
758
+ this.timers.delete(id);
759
+ }, time);
760
+ const rageMPTimer = new RageMPTimer(id, time, true, callbackBind, () => {
761
+ clearTimeout(timerId);
762
+ this.timers.delete(id);
763
+ });
764
+ this.timers.set(id, rageMPTimer);
765
+ return rageMPTimer;
766
+ }
767
+ everyTick(callback, ...args) {
768
+ const id = this.timerIncrementer++;
769
+ const callbackBind = callback.bind(this, ...Array.isArray(args) ? args : []);
770
+ this.everyTickHandlers.set(id, {
771
+ callback,
772
+ bound: callbackBind
773
+ });
774
+ const isClientSide = typeof mp !== "undefined" && typeof mp.browsers !== "undefined";
775
+ if (!this.isEveryTickRunning) {
776
+ this.isEveryTickRunning = true;
777
+ if (isClientSide) {
778
+ this.everyTickMainHandler = () => {
779
+ for (const [, handler] of this.everyTickHandlers) {
780
+ try {
781
+ handler.bound();
782
+ } catch (e) {
783
+ mp.console.logError(`Error in everyTick handler: ${e}`);
784
+ }
785
+ }
786
+ };
787
+ mp.events.add("render", this.everyTickMainHandler);
788
+ } else {
789
+ const intervalHandler = /* @__PURE__ */ __name(() => {
790
+ for (const [, handler] of this.everyTickHandlers) {
791
+ try {
792
+ handler.bound();
793
+ } catch (e) {
794
+ mp.console.logError(`Error in everyTick handler: ${e}`);
795
+ }
796
+ }
797
+ }, "intervalHandler");
798
+ this._everyTickInterval = setInterval(intervalHandler, 0);
799
+ }
800
+ }
801
+ const rageMPTimer = new RageMPTimer(id, 0, false, callbackBind, () => {
802
+ this.everyTickHandlers.delete(id);
803
+ this.timers.delete(id);
804
+ if (this.everyTickHandlers.size === 0) {
805
+ if (isClientSide && this.everyTickMainHandler) {
806
+ mp.events.remove("render", this.everyTickMainHandler);
807
+ this.everyTickMainHandler = null;
808
+ } else if (this._everyTickInterval) {
809
+ clearInterval(this._everyTickInterval);
810
+ this._everyTickInterval = null;
811
+ }
812
+ this.isEveryTickRunning = false;
813
+ }
814
+ });
815
+ this.timers.set(id, rageMPTimer);
816
+ return rageMPTimer;
817
+ }
818
+ nextTick(callback, ...args) {
819
+ const id = this.timerIncrementer++;
820
+ const callbackBind = callback.bind(this, ...Array.isArray(args) ? args : []);
821
+ const isClientSide = typeof mp !== "undefined" && typeof mp.browsers !== "undefined";
822
+ let timerId;
823
+ if (isClientSide) {
824
+ const handler = /* @__PURE__ */ __name(() => {
825
+ try {
826
+ callbackBind();
827
+ } finally {
828
+ mp.events.remove("render", handler);
829
+ this.timers.delete(id);
830
+ }
831
+ }, "handler");
832
+ mp.events.add("render", handler);
833
+ const rageMPTimer = new RageMPTimer(id, 0, true, callbackBind, () => {
834
+ mp.events.remove("render", handler);
835
+ this.timers.delete(id);
836
+ });
837
+ this.timers.set(id, rageMPTimer);
838
+ return rageMPTimer;
839
+ } else {
840
+ timerId = setTimeout(() => {
841
+ try {
842
+ callbackBind();
843
+ } finally {
844
+ this.timers.delete(id);
845
+ }
846
+ }, 0);
847
+ const rageMPTimer = new RageMPTimer(id, 0, true, callbackBind, () => {
848
+ clearTimeout(timerId);
849
+ this.timers.delete(id);
850
+ });
851
+ this.timers.set(id, rageMPTimer);
852
+ return rageMPTimer;
853
+ }
854
+ }
855
+ time(_name) {
856
+ }
857
+ timeEnd(_name) {
858
+ }
859
+ };
860
+
861
+ // src/app/multiplayer/ragemp/ragemp-multiplayer.service.ts
862
+ var RageMPMultiplayerService = class {
863
+ static {
864
+ __name(this, "RageMPMultiplayerService");
865
+ }
866
+ Timers;
867
+ Events;
868
+ constructor() {
869
+ this.Events = new RageMPEventEmmiter();
870
+ this.Timers = new RageMPTimers();
871
+ }
872
+ parseInternalArgs(...args) {
873
+ const player = isObject(args[0]) ? args[0] : void 0;
874
+ return {
875
+ player,
876
+ body: args
877
+ };
878
+ }
879
+ log(arg, ...args) {
880
+ const message = [
881
+ arg,
882
+ ...args
883
+ ].map((a) => typeof a === "object" ? JSON.stringify(a) : String(a)).join(" ");
884
+ mp.console.logInfo(message);
885
+ }
886
+ logError(arg, ...args) {
887
+ const message = [
888
+ arg,
889
+ ...args
890
+ ].map((a) => typeof a === "object" ? JSON.stringify(a) : String(a)).join(" ");
891
+ mp.console.logError(message);
892
+ }
893
+ logWarning(arg, ...args) {
894
+ const message = [
895
+ arg,
896
+ ...args
897
+ ].map((a) => typeof a === "object" ? JSON.stringify(a) : String(a)).join(" ");
898
+ mp.console.logWarning(message);
899
+ }
900
+ logDebug(arg, ...args) {
901
+ const message = [
902
+ arg,
903
+ ...args
904
+ ].map((a) => typeof a === "object" ? JSON.stringify(a) : String(a)).join(" ");
905
+ mp.console.logInfo(`[DEBUG] ${message}`);
906
+ }
907
+ };
908
+
909
+ // src/app/app-builder.ts
910
+ import { inject as inject6, Container as Container3, injectable as injectable8 } from "inversify";
911
+
912
+ // src/app/app.ts
913
+ import { Container as Container2, inject as inject5, injectable as injectable7 } from "inversify";
914
+ function _ts_decorate4(decorators, target, key, desc) {
915
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
916
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
917
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
918
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
919
+ }
920
+ __name(_ts_decorate4, "_ts_decorate");
921
+ function _ts_metadata4(k, v) {
922
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
923
+ }
924
+ __name(_ts_metadata4, "_ts_metadata");
925
+ var App = class {
926
+ static {
927
+ __name(this, "App");
928
+ }
929
+ moduleTreeScanner;
930
+ moduleDependencyBinder;
931
+ appRuntime;
932
+ internalAppContainer;
933
+ plugins;
934
+ loggerService;
935
+ moduleTree;
936
+ loaded = false;
937
+ async start(rootModule) {
938
+ if (this.loaded) {
939
+ this.loggerService.error("Error occurred while starting the app.");
940
+ throw new Error(ErrorMessage.AppAlreadyLoaded);
941
+ }
942
+ this.loggerService.log("~lw~Starting app...");
943
+ await this.runPluginMethods("beforeStart");
944
+ this.loggerService.log("~lw~Scanning module tree...");
945
+ await this.runPluginMethods("beforeScan");
946
+ this.moduleTree = await this.moduleTreeScanner.scan(rootModule);
947
+ await this.runPluginMethods("afterScan");
948
+ this.loggerService.log("~lw~Binding module dependencies...");
949
+ await this.runPluginMethods("beforeBind");
950
+ await this.moduleDependencyBinder.bind(this.moduleTree);
951
+ await this.runPluginMethods("afterBind");
952
+ this.loggerService.log("~lw~Loading app...");
953
+ await this.runPluginMethods("beforeLoad");
954
+ await this.appRuntime.boot(this.moduleTree);
955
+ this.loaded = true;
956
+ await this.runPluginMethods("afterLoad");
957
+ this.loggerService.log("~lw~App loaded");
958
+ await this.runPluginMethods("afterStart");
959
+ }
960
+ async stop() {
961
+ if (!this.loaded) {
962
+ this.loggerService.error("Error occurred while stopping the app.");
963
+ throw new Error(ErrorMessage.AppNotLoaded);
964
+ }
965
+ await this.runPluginMethods("beforeStop");
966
+ this.loggerService.log("~lw~Stopping app...");
967
+ await this.appRuntime.shutdown(this.moduleTree);
968
+ this.loaded = false;
969
+ this.loggerService.log("~lw~App stopped");
970
+ await this.runPluginMethods("afterStop");
971
+ }
972
+ async runPluginMethods(method) {
973
+ await Promise.all(this.plugins.map(async (p) => {
974
+ const plugin = this.internalAppContainer.get(p);
975
+ if (!plugin[method]) return Promise.resolve();
976
+ return Promise.resolve(plugin[method]());
977
+ }));
978
+ }
979
+ };
980
+ _ts_decorate4([
981
+ inject5(ModuleTreeScanner),
982
+ _ts_metadata4("design:type", typeof ModuleTreeScanner === "undefined" ? Object : ModuleTreeScanner)
983
+ ], App.prototype, "moduleTreeScanner", void 0);
984
+ _ts_decorate4([
985
+ inject5(ModuleDependencyBinder),
986
+ _ts_metadata4("design:type", typeof ModuleDependencyBinder === "undefined" ? Object : ModuleDependencyBinder)
987
+ ], App.prototype, "moduleDependencyBinder", void 0);
988
+ _ts_decorate4([
989
+ inject5(AppRuntime),
990
+ _ts_metadata4("design:type", typeof AppRuntime === "undefined" ? Object : AppRuntime)
991
+ ], App.prototype, "appRuntime", void 0);
992
+ _ts_decorate4([
993
+ inject5(INTERNAL_APP_CONTAINER),
994
+ _ts_metadata4("design:type", typeof Container2 === "undefined" ? Object : Container2)
995
+ ], App.prototype, "internalAppContainer", void 0);
996
+ _ts_decorate4([
997
+ inject5(PLUGINS),
998
+ _ts_metadata4("design:type", Array)
999
+ ], App.prototype, "plugins", void 0);
1000
+ _ts_decorate4([
1001
+ inject5(LOGGER_SERVICE),
1002
+ _ts_metadata4("design:type", typeof LoggerService === "undefined" ? Object : LoggerService)
1003
+ ], App.prototype, "loggerService", void 0);
1004
+ App = _ts_decorate4([
1005
+ injectable7()
1006
+ ], App);
1007
+
1008
+ // src/app/app-builder.ts
1009
+ function _ts_decorate5(decorators, target, key, desc) {
1010
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1011
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1012
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1013
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1014
+ }
1015
+ __name(_ts_decorate5, "_ts_decorate");
1016
+ function _ts_metadata5(k, v) {
1017
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1018
+ }
1019
+ __name(_ts_metadata5, "_ts_metadata");
1020
+ var AppBuilder = class {
1021
+ static {
1022
+ __name(this, "AppBuilder");
1023
+ }
1024
+ enviroment;
1025
+ internalAppContainer;
1026
+ multiplayerService;
1027
+ plugins;
1028
+ globalContainerOptions = {};
1029
+ useGlobalGuards(...guards) {
1030
+ const validatedGuards = [];
1031
+ for (const guard of guards) {
1032
+ const { valid, value, error } = validateGuard(guard);
1033
+ if (!valid) throw new Error(error);
1034
+ validatedGuards.push(value);
1035
+ }
1036
+ this.internalAppContainer.bind(GLOBAL_GUARDS).toConstantValue(validatedGuards);
1037
+ return this;
1038
+ }
1039
+ useGlobalInterceptors(...interceptors) {
1040
+ const validatedInterceptors = [];
1041
+ for (const interceptor of interceptors) {
1042
+ const { valid, value, error } = validateInterceptor(interceptor);
1043
+ if (!valid) throw new Error(error);
1044
+ validatedInterceptors.push(value);
1045
+ }
1046
+ this.internalAppContainer.bind(GLOBAL_INTERCEPTORS).toConstantValue(validatedInterceptors);
1047
+ return this;
1048
+ }
1049
+ useGlobalPipes(...pipes) {
1050
+ const validatedPipes = [];
1051
+ for (const pipe of pipes) {
1052
+ const { valid, value, error } = validatePipe(pipe);
1053
+ if (!valid) throw new Error(error);
1054
+ validatedPipes.push(value);
1055
+ }
1056
+ this.internalAppContainer.bind(GLOBAL_PIPES).toConstantValue(validatedPipes);
1057
+ return this;
1058
+ }
1059
+ useGlobalFilters(...filters) {
1060
+ const validatedFIlters = [];
1061
+ for (const filter of filters) {
1062
+ const { valid, value, error } = validateErrorFilter(filter);
1063
+ if (!valid) throw new Error(error);
1064
+ validatedFIlters.push(value);
1065
+ }
1066
+ this.internalAppContainer.bind(GLOBAL_ERROR_FILTERS).toConstantValue(validatedFIlters);
1067
+ return this;
1068
+ }
1069
+ usePlugins(...plugins) {
1070
+ plugins.forEach((p) => this.internalAppContainer.bind(p).toSelf().inSingletonScope());
1071
+ const internalPlugins = this.internalAppContainer.get(PLUGINS);
1072
+ this.internalAppContainer.rebind(PLUGINS).toConstantValue([
1073
+ ...internalPlugins,
1074
+ ...plugins
1075
+ ]);
1076
+ return this;
1077
+ }
1078
+ enableShutdownHooks() {
1079
+ this.internalAppContainer.bind(ENABLE_SHUTDOWN_HOOKS).toConstantValue(true);
1080
+ return this;
1081
+ }
1082
+ setContainerOptions(options, onlyGlobal = false) {
1083
+ this.globalContainerOptions = options;
1084
+ if (onlyGlobal) return this;
1085
+ this.internalAppContainer.bind(CONTAINER_OPTIONS).toConstantValue(options);
1086
+ return this;
1087
+ }
1088
+ async build() {
1089
+ const globalAppContainer = new Container3(this.globalContainerOptions);
1090
+ globalAppContainer.bind(REFLECTOR_SERVICE).toConstantValue(ReflectorService);
1091
+ globalAppContainer.bind(ReflectorService).toService(REFLECTOR_SERVICE);
1092
+ globalAppContainer.bind(MULTIPLAYER_SERVICE).toConstantValue(this.multiplayerService);
1093
+ this.internalAppContainer.bind(App).toSelf().inSingletonScope();
1094
+ this.internalAppContainer.bind(GLOBAL_APP_CONTAINER).toConstantValue(globalAppContainer);
1095
+ this.internalAppContainer.bind(ModuleTreeScanner).toSelf().inSingletonScope();
1096
+ this.internalAppContainer.bind(ModuleDependencyBinder).toSelf().inSingletonScope();
1097
+ this.internalAppContainer.bind(AppRuntime).toSelf().inSingletonScope();
1098
+ this.internalAppContainer.bind(PipelineHandler).toSelf().inSingletonScope();
1099
+ this.internalAppContainer.bind(Module).toSelf().inTransientScope();
1100
+ this.internalAppContainer.bind(ModuleMetadataReader).toSelf().inSingletonScope();
1101
+ this.internalAppContainer.bind(Controller).toSelf().inTransientScope();
1102
+ this.internalAppContainer.bind(ControllerMetadataReader).toSelf().inSingletonScope();
1103
+ this.internalAppContainer.bind(ControllerFlowHandler).toSelf().inSingletonScope();
1104
+ this.internalAppContainer.bind(ControllerEventHandler).toSelf().inSingletonScope();
1105
+ this.internalAppContainer.bind(ControllerRPCHandler).toSelf().inSingletonScope();
1106
+ this.internalAppContainer.bind(MangoRequestBase).toSelf().inTransientScope();
1107
+ this.internalAppContainer.bind(MANGO_REQUEST_FACTORY).toFactory((context) => {
1108
+ return (body, player) => {
1109
+ const request = context.container.get(MangoRequestBase);
1110
+ request.$body = body;
1111
+ request.$player = player;
1112
+ return request;
1113
+ };
1114
+ });
1115
+ this.internalAppContainer.bind(MangoResponseBase).toSelf().inTransientScope();
1116
+ this.internalAppContainer.bind(MANGO_RESPONSE_FACTORY).toFactory((context) => {
1117
+ return () => {
1118
+ return context.container.get(MangoResponseBase);
1119
+ };
1120
+ });
1121
+ this.internalAppContainer.bind(ExecutionContextBase).toSelf().inTransientScope();
1122
+ this.internalAppContainer.bind(EXECUTION_CONTEXT_FACTORY).toFactory((context) => {
1123
+ return (type, classRef, handler, request, response, name) => {
1124
+ const executionContext = context.container.get(ExecutionContextBase);
1125
+ executionContext.$type = type;
1126
+ executionContext.$request = request;
1127
+ executionContext.$response = response;
1128
+ executionContext.$handler = handler;
1129
+ executionContext.$classRef = classRef;
1130
+ executionContext.$name = name;
1131
+ return executionContext;
1132
+ };
1133
+ });
1134
+ for (const plugin of this.plugins) {
1135
+ this.internalAppContainer.bind(plugin).toSelf().inSingletonScope();
1136
+ const pluginInstance = this.internalAppContainer.get(plugin);
1137
+ if (!pluginInstance.onBuild) continue;
1138
+ await pluginInstance.onBuild();
1139
+ }
1140
+ if (!this.internalAppContainer.isBound(GLOBAL_GUARDS)) this.internalAppContainer.bind(GLOBAL_GUARDS).toConstantValue([]);
1141
+ if (!this.internalAppContainer.isBound(GLOBAL_INTERCEPTORS)) this.internalAppContainer.bind(GLOBAL_INTERCEPTORS).toConstantValue([]);
1142
+ if (!this.internalAppContainer.isBound(GLOBAL_PIPES)) this.internalAppContainer.bind(GLOBAL_PIPES).toConstantValue([]);
1143
+ if (!this.internalAppContainer.isBound(GLOBAL_ERROR_FILTERS)) this.internalAppContainer.bind(GLOBAL_ERROR_FILTERS).toConstantValue([]);
1144
+ return this.internalAppContainer.get(App);
1145
+ }
1146
+ };
1147
+ _ts_decorate5([
1148
+ inject6(APP_ENVIROMENT),
1149
+ _ts_metadata5("design:type", String)
1150
+ ], AppBuilder.prototype, "enviroment", void 0);
1151
+ _ts_decorate5([
1152
+ inject6(INTERNAL_APP_CONTAINER),
1153
+ _ts_metadata5("design:type", typeof Container3 === "undefined" ? Object : Container3)
1154
+ ], AppBuilder.prototype, "internalAppContainer", void 0);
1155
+ _ts_decorate5([
1156
+ inject6(MULTIPLAYER_SERVICE),
1157
+ _ts_metadata5("design:type", typeof MultiplayerService === "undefined" ? Object : MultiplayerService)
1158
+ ], AppBuilder.prototype, "multiplayerService", void 0);
1159
+ _ts_decorate5([
1160
+ inject6(PLUGINS),
1161
+ _ts_metadata5("design:type", Array)
1162
+ ], AppBuilder.prototype, "plugins", void 0);
1163
+ AppBuilder = _ts_decorate5([
1164
+ injectable8()
1165
+ ], AppBuilder);
1166
+
1167
+ // src/app/create-app.ts
1168
+ import { Container as Container4 } from "inversify";
1169
+ async function createAppBuilder({ enviroment, plugins, appBuilderInherit, multiplayerService }) {
1170
+ const internalAppContainer = new Container4();
1171
+ if (multiplayerService) internalAppContainer.bind(MULTIPLAYER_SERVICE).toConstantValue(multiplayerService);
1172
+ internalAppContainer.bind(INTERNAL_APP_CONTAINER).toConstantValue(internalAppContainer);
1173
+ internalAppContainer.bind(APP_ENVIROMENT).toConstantValue(enviroment);
1174
+ internalAppContainer.bind(PLUGINS).toConstantValue(plugins);
1175
+ internalAppContainer.bind(appBuilderInherit).toSelf().inSingletonScope();
1176
+ return internalAppContainer.get(appBuilderInherit);
1177
+ }
1178
+ __name(createAppBuilder, "createAppBuilder");
1179
+
1180
+ // src/decorators/create-event-decorator.ts
1181
+ function createEventDecorator(type, name, webViewId) {
1182
+ return (target, method) => {
1183
+ if (!isNil(name) && !isString(name)) {
1184
+ throw new Error(ErrorMessage.EventNameMustBeString);
1185
+ }
1186
+ name = name ?? method;
1187
+ const events = Reflect.getMetadata(CoreMetadataKey.ControllerEvents, target) ?? [];
1188
+ if (events.some((event) => event.method === method && event.name === name && event.type === type)) {
1189
+ throw new Error(ErrorMessage.EventNameMustBeUnique);
1190
+ }
1191
+ Reflect.defineMetadata(CoreMetadataKey.ControllerEvents, [
1192
+ ...events,
1193
+ {
1194
+ method,
1195
+ name,
1196
+ type,
1197
+ webViewId
1198
+ }
1199
+ ], target);
1200
+ };
1201
+ }
1202
+ __name(createEventDecorator, "createEventDecorator");
1203
+
1204
+ // src/decorators/events/on-internal.decorator.ts
1205
+ function OnInternal(eventName) {
1206
+ return createEventDecorator("onInternal", eventName);
1207
+ }
1208
+ __name(OnInternal, "OnInternal");
1209
+
1210
+ // src/decorators/events/on-webview.decorator.ts
1211
+ function OnWebView(id, eventName) {
1212
+ return createEventDecorator("onWebView", eventName, id);
1213
+ }
1214
+ __name(OnWebView, "OnWebView");
1215
+
1216
+ // src/decorators/events/on.decorator.ts
1217
+ function On(eventName) {
1218
+ return createEventDecorator("on", eventName);
1219
+ }
1220
+ __name(On, "On");
1221
+
1222
+ // src/decorators/events/once-internal.decorator.ts
1223
+ function OnceInternal(eventName) {
1224
+ return createEventDecorator("onceInternal", eventName);
1225
+ }
1226
+ __name(OnceInternal, "OnceInternal");
1227
+
1228
+ // src/decorators/events/once.decorator.ts
1229
+ function Once(eventName) {
1230
+ return createEventDecorator("once", eventName);
1231
+ }
1232
+ __name(Once, "Once");
1233
+
1234
+ // src/decorators/events/once-webview.decorator.ts
1235
+ function OnceWebView(id, eventName) {
1236
+ return createEventDecorator("onceWebView", eventName, id);
1237
+ }
1238
+ __name(OnceWebView, "OnceWebView");
1239
+
1240
+ // src/decorators/params/body.decorator.ts
1241
+ function Body(...pipes) {
1242
+ return (target, method, index) => {
1243
+ const validatedPipes = [];
1244
+ for (const pipe of pipes) {
1245
+ const { valid, value, error } = validatePipe(pipe);
1246
+ if (!valid) throw new Error(error);
1247
+ validatedPipes.push(value);
1248
+ }
1249
+ const params = Reflect.getMetadata(CoreMetadataKey.ControllerParams, target, method) ?? [];
1250
+ if (params.some((param) => param.index === index)) {
1251
+ throw new Error(ErrorMessage.MultipleDecoratorsOnSingleParameterNotAllowed);
1252
+ }
1253
+ const paramTypes = Reflect.getMetadata("design:paramtypes", target, method);
1254
+ const metatype = Array.isArray(paramTypes) ? paramTypes[index] : void 0;
1255
+ Reflect.defineMetadata(CoreMetadataKey.ControllerParams, [
1256
+ ...params,
1257
+ {
1258
+ index,
1259
+ method,
1260
+ pipes: validatedPipes,
1261
+ type: MethodParamType.Body,
1262
+ data: void 0,
1263
+ metatype
1264
+ }
1265
+ ], target, method);
1266
+ };
1267
+ }
1268
+ __name(Body, "Body");
1269
+
1270
+ // src/decorators/params/index.decorator.ts
1271
+ function Index(key, ...pipes) {
1272
+ return (target, method, index) => {
1273
+ if (!isNumber(key)) {
1274
+ throw new Error(ErrorMessage.IndexKeyMustBeNumber);
1275
+ }
1276
+ const validatedPipes = [];
1277
+ for (const pipe of pipes) {
1278
+ const { valid, value, error } = validatePipe(pipe);
1279
+ if (!valid) throw new Error(error);
1280
+ validatedPipes.push(value);
1281
+ }
1282
+ const params = Reflect.getMetadata(CoreMetadataKey.ControllerParams, target, method) ?? [];
1283
+ if (params.some((param) => param.index === index)) {
1284
+ throw new Error(ErrorMessage.MultipleDecoratorsOnSingleParameterNotAllowed);
1285
+ }
1286
+ const paramTypes = Reflect.getMetadata("design:paramtypes", target, method);
1287
+ const metatype = Array.isArray(paramTypes) ? paramTypes[index] : void 0;
1288
+ Reflect.defineMetadata(CoreMetadataKey.ControllerParams, [
1289
+ ...params,
1290
+ {
1291
+ index,
1292
+ method,
1293
+ pipes: validatedPipes,
1294
+ type: MethodParamType.Index,
1295
+ data: key,
1296
+ metatype
1297
+ }
1298
+ ], target, method);
1299
+ };
1300
+ }
1301
+ __name(Index, "Index");
1302
+
1303
+ // src/decorators/params/request.decorator.ts
1304
+ function Request() {
1305
+ return (target, method, index) => {
1306
+ const params = Reflect.getMetadata(CoreMetadataKey.ControllerParams, target, method) ?? [];
1307
+ if (params.some((param) => param.index === index)) {
1308
+ throw new Error(ErrorMessage.MultipleDecoratorsOnSingleParameterNotAllowed);
1309
+ }
1310
+ const paramTypes = Reflect.getMetadata("design:paramtypes", target, method);
1311
+ const metatype = Array.isArray(paramTypes) ? paramTypes[index] : void 0;
1312
+ Reflect.defineMetadata(CoreMetadataKey.ControllerParams, [
1313
+ ...params,
1314
+ {
1315
+ index,
1316
+ method,
1317
+ type: MethodParamType.Request,
1318
+ data: void 0,
1319
+ metatype
1320
+ }
1321
+ ], target, method);
1322
+ };
1323
+ }
1324
+ __name(Request, "Request");
1325
+ function Req() {
1326
+ return Request();
1327
+ }
1328
+ __name(Req, "Req");
1329
+
1330
+ // src/decorators/params/param.decorator.ts
1331
+ function Param(key, ...pipes) {
1332
+ return (target, method, index) => {
1333
+ if (!isString(key)) {
1334
+ throw new Error(ErrorMessage.ParamKeyMustBeString);
1335
+ }
1336
+ const validatedPipes = [];
1337
+ for (const pipe of pipes) {
1338
+ const { valid, value, error } = validatePipe(pipe);
1339
+ if (!valid) throw new Error(error);
1340
+ validatedPipes.push(value);
1341
+ }
1342
+ const params = Reflect.getMetadata(CoreMetadataKey.ControllerParams, target, method) ?? [];
1343
+ if (params.some((param) => param.index === index)) {
1344
+ throw new Error(ErrorMessage.MultipleDecoratorsOnSingleParameterNotAllowed);
1345
+ }
1346
+ const paramTypes = Reflect.getMetadata("design:paramtypes", target, method);
1347
+ const metatype = Array.isArray(paramTypes) ? paramTypes[index] : void 0;
1348
+ Reflect.defineMetadata(CoreMetadataKey.ControllerParams, [
1349
+ ...params,
1350
+ {
1351
+ index,
1352
+ method,
1353
+ data: key,
1354
+ pipes: validatedPipes,
1355
+ type: MethodParamType.Param,
1356
+ metatype
1357
+ }
1358
+ ], target, method);
1359
+ };
1360
+ }
1361
+ __name(Param, "Param");
1362
+
1363
+ // src/decorators/params/response.deorator.ts
1364
+ function Response() {
1365
+ return (target, method, index) => {
1366
+ const params = Reflect.getMetadata(CoreMetadataKey.ControllerParams, target, method) ?? [];
1367
+ if (params.some((param) => param.index === index)) {
1368
+ throw new Error(ErrorMessage.MultipleDecoratorsOnSingleParameterNotAllowed);
1369
+ }
1370
+ const paramTypes = Reflect.getMetadata("design:paramtypes", target, method);
1371
+ const metatype = Array.isArray(paramTypes) ? paramTypes[index] : void 0;
1372
+ Reflect.defineMetadata(CoreMetadataKey.ControllerParams, [
1373
+ ...params,
1374
+ {
1375
+ index,
1376
+ method,
1377
+ type: MethodParamType.Response,
1378
+ data: void 0,
1379
+ metatype
1380
+ }
1381
+ ], target, method);
1382
+ };
1383
+ }
1384
+ __name(Response, "Response");
1385
+ function Res() {
1386
+ return Response();
1387
+ }
1388
+ __name(Res, "Res");
1389
+
1390
+ // src/decorators/pipeline/use-guards.decorator.ts
1391
+ function UseGuards(...guards) {
1392
+ return (target, method, descriptor) => {
1393
+ const validatedGuards = [];
1394
+ for (const guard of guards) {
1395
+ const { valid, value, error } = validateGuard(guard);
1396
+ if (!valid) throw new Error(error);
1397
+ validatedGuards.push(value);
1398
+ }
1399
+ if (!isNil(descriptor) && !isNil(descriptor.value)) {
1400
+ if (guards.length === 0) {
1401
+ throw new Error(ErrorMessage.AtLeastOneGuardRequired);
1402
+ }
1403
+ const methodGuards = Reflect.getMetadata(CoreMetadataKey.Guards, target.constructor, method) || [];
1404
+ Reflect.defineMetadata(CoreMetadataKey.Guards, [
1405
+ ...validatedGuards,
1406
+ ...methodGuards
1407
+ ], target.constructor, method);
1408
+ return descriptor;
1409
+ }
1410
+ if (guards.length === 0) {
1411
+ throw new Error(ErrorMessage.AtLeastOneGuardRequired);
1412
+ }
1413
+ const classGuards = Reflect.getMetadata(CoreMetadataKey.Guards, target) || [];
1414
+ Reflect.defineMetadata(CoreMetadataKey.Guards, [
1415
+ ...validatedGuards,
1416
+ ...classGuards
1417
+ ], target);
1418
+ return target;
1419
+ };
1420
+ }
1421
+ __name(UseGuards, "UseGuards");
1422
+
1423
+ // src/decorators/pipeline/use-interceptors.decorator.ts
1424
+ function UseInterceptors(...interceptors) {
1425
+ return (target, method, descriptor) => {
1426
+ const validatedInterceptors = [];
1427
+ for (const interceptor of interceptors) {
1428
+ const { valid, value, error } = validateInterceptor(interceptor);
1429
+ if (!valid) throw new Error(error);
1430
+ validatedInterceptors.push(value);
1431
+ }
1432
+ if (!isNil(descriptor) && !isNil(descriptor.value)) {
1433
+ if (interceptors.length === 0) {
1434
+ throw new Error(ErrorMessage.AtLeastOneInterceptorRequired);
1435
+ }
1436
+ const methodInterceptors = Reflect.getMetadata(CoreMetadataKey.Interceptors, target.constructor, method) || [];
1437
+ Reflect.defineMetadata(CoreMetadataKey.Interceptors, [
1438
+ ...validatedInterceptors,
1439
+ ...methodInterceptors
1440
+ ], target.constructor, method);
1441
+ return descriptor;
1442
+ }
1443
+ if (interceptors.length === 0) {
1444
+ throw new Error(ErrorMessage.AtLeastOneInterceptorRequired);
1445
+ }
1446
+ const classInterceptors = Reflect.getMetadata(CoreMetadataKey.Interceptors, target) || [];
1447
+ Reflect.defineMetadata(CoreMetadataKey.Interceptors, [
1448
+ ...validatedInterceptors,
1449
+ ...classInterceptors
1450
+ ], target);
1451
+ return target;
1452
+ };
1453
+ }
1454
+ __name(UseInterceptors, "UseInterceptors");
1455
+
1456
+ // src/decorators/pipeline/use-pipes.decorator.ts
1457
+ function UsePipes(...pipes) {
1458
+ return (target, method, descriptor) => {
1459
+ const validatedPipes = [];
1460
+ for (const pipe of pipes) {
1461
+ const { valid, value, error } = validatePipe(pipe);
1462
+ if (!valid) throw new Error(error);
1463
+ validatedPipes.push(value);
1464
+ }
1465
+ if (!isNil(descriptor) && !isNil(descriptor.value)) {
1466
+ if (pipes.length === 0) {
1467
+ throw new Error(ErrorMessage.AtLeastOnePipeRequired);
1468
+ }
1469
+ const methodPipes = Reflect.getMetadata(CoreMetadataKey.Pipes, target.constructor, method) || [];
1470
+ Reflect.defineMetadata(CoreMetadataKey.Pipes, [
1471
+ ...validatedPipes,
1472
+ ...methodPipes
1473
+ ], target.constructor, method);
1474
+ return descriptor;
1475
+ }
1476
+ if (pipes.length === 0) {
1477
+ throw new Error(ErrorMessage.AtLeastOnePipeRequired);
1478
+ }
1479
+ const classPipes = Reflect.getMetadata(CoreMetadataKey.Pipes, target) || [];
1480
+ Reflect.defineMetadata(CoreMetadataKey.Pipes, [
1481
+ ...validatedPipes,
1482
+ ...classPipes
1483
+ ], target);
1484
+ return target;
1485
+ };
1486
+ }
1487
+ __name(UsePipes, "UsePipes");
1488
+
1489
+ // src/decorators/create-rpc-decorator.ts
1490
+ function createRPCDecorator(type, name, webViewId) {
1491
+ return (target, method) => {
1492
+ if (!isNil(webViewId) && !isString(webViewId) && !isNumber(webViewId)) {
1493
+ throw new Error(ErrorMessage.WebViewIdMustBeStringOrNumber);
1494
+ }
1495
+ if (!isNil(name) && !isString(name)) {
1496
+ throw new Error(ErrorMessage.RPCNameMustBeString);
1497
+ }
1498
+ name = name ?? method;
1499
+ const rpcs = Reflect.getMetadata(CoreMetadataKey.ControllerRPCs, target) ?? [];
1500
+ if (rpcs.some((rpc) => rpc.method === method && rpc.name === name && rpc.type === type)) {
1501
+ throw new Error(ErrorMessage.RPCNameMustBeUnique);
1502
+ }
1503
+ Reflect.defineMetadata(CoreMetadataKey.ControllerRPCs, [
1504
+ ...rpcs,
1505
+ {
1506
+ method,
1507
+ name,
1508
+ type,
1509
+ webViewId
1510
+ }
1511
+ ], target);
1512
+ };
1513
+ }
1514
+ __name(createRPCDecorator, "createRPCDecorator");
1515
+
1516
+ // src/decorators/rpc/on-request.decorator.ts
1517
+ function OnRequest(rpcName) {
1518
+ return createRPCDecorator("onRequest", rpcName);
1519
+ }
1520
+ __name(OnRequest, "OnRequest");
1521
+
1522
+ // src/decorators/rpc/on-webview-request.decorator.ts
1523
+ function OnWebViewRequest(id, rpcName) {
1524
+ return createRPCDecorator("onWebViewRequest", rpcName, id);
1525
+ }
1526
+ __name(OnWebViewRequest, "OnWebViewRequest");
1527
+
1528
+ // src/decorators/create-timer.decorator.ts
1529
+ function createTimerDecorator(type, name, options) {
1530
+ return (target, method) => {
1531
+ if (!isNil(name) && !isString(name)) {
1532
+ throw new Error(ErrorMessage.TimerNameMustBeString);
1533
+ }
1534
+ name = name ?? method;
1535
+ const timers = Reflect.getMetadata(CoreMetadataKey.Timers, target) ?? [];
1536
+ if (timers.some((timer) => timer.method === method && timer.name === name && timer.type === type)) {
1537
+ throw new Error(ErrorMessage.EventNameMustBeUnique);
1538
+ }
1539
+ Reflect.defineMetadata(CoreMetadataKey.Timers, [
1540
+ ...timers,
1541
+ {
1542
+ method,
1543
+ name,
1544
+ type,
1545
+ options
1546
+ }
1547
+ ], target);
1548
+ };
1549
+ }
1550
+ __name(createTimerDecorator, "createTimerDecorator");
1551
+
1552
+ // src/decorators/timers/cron.decorator.ts
1553
+ function Cron(pattern, options = {}) {
1554
+ return createTimerDecorator("cron", options.name, {
1555
+ pattern,
1556
+ ...options
1557
+ });
1558
+ }
1559
+ __name(Cron, "Cron");
1560
+
1561
+ // src/decorators/timers/every-tick.decorator.ts
1562
+ function EveryTick(name) {
1563
+ return createTimerDecorator("everytick", name);
1564
+ }
1565
+ __name(EveryTick, "EveryTick");
1566
+
1567
+ // src/decorators/timers/interval.decorator.ts
1568
+ function Interval(nameOrTimeout, timeout) {
1569
+ const [name, intervalTimeout] = isString(nameOrTimeout) ? [
1570
+ nameOrTimeout,
1571
+ timeout
1572
+ ] : [
1573
+ void 0,
1574
+ nameOrTimeout
1575
+ ];
1576
+ return createTimerDecorator("interval", name, {
1577
+ timeout: intervalTimeout
1578
+ });
1579
+ }
1580
+ __name(Interval, "Interval");
1581
+
1582
+ // src/decorators/timers/timeout.decorator.ts
1583
+ function Timeout(nameOrTimeout, timeout) {
1584
+ const [name, intervalTimeout] = isString(nameOrTimeout) ? [
1585
+ nameOrTimeout,
1586
+ timeout
1587
+ ] : [
1588
+ void 0,
1589
+ nameOrTimeout
1590
+ ];
1591
+ return createTimerDecorator("timeout", name, {
1592
+ timeout: intervalTimeout
1593
+ });
1594
+ }
1595
+ __name(Timeout, "Timeout");
1596
+
1597
+ // src/decorators/apply-decorator.util.ts
1598
+ function applyDecorators(...decorators) {
1599
+ return (target, propertyKey, descriptor) => {
1600
+ for (const decorator of decorators) {
1601
+ if (target instanceof Function && !descriptor) {
1602
+ decorator(target);
1603
+ continue;
1604
+ }
1605
+ decorator(target, propertyKey, descriptor);
1606
+ }
1607
+ };
1608
+ }
1609
+ __name(applyDecorators, "applyDecorators");
1610
+
1611
+ // src/decorators/create-param.util.ts
1612
+ function createParamDecorator(factory) {
1613
+ return (data, ...pipes) => {
1614
+ return (target, method, index) => {
1615
+ const validatedPipes = [];
1616
+ for (const pipe of pipes) {
1617
+ const { valid, value, error } = validatePipe(pipe);
1618
+ if (!valid) throw new Error(error);
1619
+ validatedPipes.push(value);
1620
+ }
1621
+ const params = Reflect.getMetadata(CoreMetadataKey.ControllerParams, target, method) ?? [];
1622
+ if (params.some((param) => param.index === index)) {
1623
+ throw new Error(ErrorMessage.MultipleDecoratorsOnSingleParameterNotAllowed);
1624
+ }
1625
+ const paramTypes = Reflect.getMetadata("design:paramtypes", target, method);
1626
+ const metatype = Array.isArray(paramTypes) ? paramTypes[index] : void 0;
1627
+ Reflect.defineMetadata(CoreMetadataKey.ControllerParams, [
1628
+ ...params,
1629
+ {
1630
+ index,
1631
+ method,
1632
+ pipes: validatedPipes,
1633
+ type: MethodParamType.Custom,
1634
+ factory,
1635
+ data,
1636
+ metatype
1637
+ }
1638
+ ], target, method);
1639
+ };
1640
+ };
1641
+ }
1642
+ __name(createParamDecorator, "createParamDecorator");
1643
+
1644
+ // src/decorators/forward-ref.util.ts
1645
+ import { LazyServiceIdentifier } from "inversify";
1646
+ function forwardRef(fn) {
1647
+ return new LazyServiceIdentifier(fn);
1648
+ }
1649
+ __name(forwardRef, "forwardRef");
1650
+
1651
+ // src/services/reflector.service.ts
1652
+ function _ts_decorate6(decorators, target, key, desc) {
1653
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1654
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1655
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1656
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1657
+ }
1658
+ __name(_ts_decorate6, "_ts_decorate");
1659
+ var ReflectorService = class {
1660
+ static {
1661
+ __name(this, "ReflectorService");
1662
+ }
1663
+ get(metadataKey, target) {
1664
+ return Reflect.getMetadata(metadataKey, target);
1665
+ }
1666
+ getAll(metadataKey, targets) {
1667
+ return (targets || []).map((target) => this.get(metadataKey, target));
1668
+ }
1669
+ getAllAndMerge(metadataKey, targets) {
1670
+ const metadataCollection = this.getAll(metadataKey, targets).filter((item) => item !== void 0);
1671
+ if (isEmpty(metadataCollection)) return metadataCollection;
1672
+ return metadataCollection.reduce((a, b) => {
1673
+ if (Array.isArray(a)) {
1674
+ return a.concat(b);
1675
+ }
1676
+ if (isObject(a) && isObject(b)) {
1677
+ return {
1678
+ ...a,
1679
+ ...b
1680
+ };
1681
+ }
1682
+ return [
1683
+ a,
1684
+ b
1685
+ ];
1686
+ });
1687
+ }
1688
+ getAllAndOverride(metadataKey, targets) {
1689
+ for (const target of targets) {
1690
+ const result = this.get(metadataKey, target);
1691
+ if (result !== void 0) return result;
1692
+ }
1693
+ return void 0;
1694
+ }
1695
+ static createDecorator(options = {}) {
1696
+ const metadataKey = options.key ?? generateRandomId();
1697
+ const decoratorFn = /* @__PURE__ */ __name((metadataValue) => (target, key, descriptor) => {
1698
+ const value = options.transform ? options.transform(metadataValue) : metadataValue;
1699
+ SetMetadata(metadataKey, value ?? {})(target, key, descriptor);
1700
+ }, "decoratorFn");
1701
+ decoratorFn.KEY = metadataKey;
1702
+ return decoratorFn;
1703
+ }
1704
+ };
1705
+ ReflectorService = _ts_decorate6([
1706
+ injectable9()
1707
+ ], ReflectorService);
1708
+
1709
+ // src/services/timer.service.ts
1710
+ import { inject as inject7, injectable as injectable10 } from "inversify";
1711
+ import { Cron as Cron2 } from "croner";
1712
+ function _ts_decorate7(decorators, target, key, desc) {
1713
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1714
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1715
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1716
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1717
+ }
1718
+ __name(_ts_decorate7, "_ts_decorate");
1719
+ function _ts_metadata6(k, v) {
1720
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1721
+ }
1722
+ __name(_ts_metadata6, "_ts_metadata");
1723
+ var TimerService = class {
1724
+ static {
1725
+ __name(this, "TimerService");
1726
+ }
1727
+ multiplayerService;
1728
+ $everyticks = /* @__PURE__ */ new Map();
1729
+ $intervals = /* @__PURE__ */ new Map();
1730
+ $timeouts = /* @__PURE__ */ new Map();
1731
+ $crons = /* @__PURE__ */ new Map();
1732
+ get all() {
1733
+ return this.multiplayerService.Timers.all;
1734
+ }
1735
+ get everyticks() {
1736
+ return [
1737
+ ...this.$everyticks.values()
1738
+ ];
1739
+ }
1740
+ get intervals() {
1741
+ return [
1742
+ ...this.$intervals.values()
1743
+ ];
1744
+ }
1745
+ get timeouts() {
1746
+ return [
1747
+ ...this.$timeouts.values()
1748
+ ];
1749
+ }
1750
+ get crons() {
1751
+ return [
1752
+ ...this.$crons.values()
1753
+ ];
1754
+ }
1755
+ set warningThreshold(value) {
1756
+ this.multiplayerService.Timers.warningThreshold = value;
1757
+ }
1758
+ get warningThreshold() {
1759
+ return this.multiplayerService.Timers.warningThreshold;
1760
+ }
1761
+ set sourceLocationFrameSkipCount(value) {
1762
+ this.multiplayerService.Timers.sourceLocationFrameSkipCount = value;
1763
+ }
1764
+ get sourceLocationFrameSkipCount() {
1765
+ return this.multiplayerService.Timers.sourceLocationFrameSkipCount;
1766
+ }
1767
+ createCronJob(callback, options) {
1768
+ const { pattern, ...cronOptions } = options;
1769
+ const cron = Cron2(pattern, cronOptions, callback);
1770
+ if (isString(options.name)) this.$crons.set(options.name, cron);
1771
+ return cron;
1772
+ }
1773
+ createInterval(callback, interval, name) {
1774
+ const timer = this.multiplayerService.Timers.setInterval(callback, interval);
1775
+ if (isString(name)) this.$intervals.set(name, timer);
1776
+ return timer;
1777
+ }
1778
+ createTimeout(callback, timeout, name) {
1779
+ const timer = this.multiplayerService.Timers.setTimeout(callback, timeout);
1780
+ if (isString(name)) this.$timeouts.set(name, timer);
1781
+ return timer;
1782
+ }
1783
+ createEveryTick(callback, name) {
1784
+ const timer = this.multiplayerService.Timers.everyTick(callback);
1785
+ if (isString(name)) this.$everyticks.set(name, timer);
1786
+ return timer;
1787
+ }
1788
+ delete(type, name) {
1789
+ switch (type) {
1790
+ case "cron":
1791
+ const cronJob = this.$crons.get(name);
1792
+ if (cronJob) {
1793
+ cronJob.stop();
1794
+ this.$crons.delete(name);
1795
+ }
1796
+ break;
1797
+ case "everytick":
1798
+ const everytick = this.$everyticks.get(name);
1799
+ if (everytick) {
1800
+ everytick.destroy();
1801
+ this.$everyticks.delete(name);
1802
+ }
1803
+ break;
1804
+ case "interval":
1805
+ const interval = this.$intervals.get(name);
1806
+ if (interval) {
1807
+ interval.destroy();
1808
+ this.$intervals.delete(name);
1809
+ }
1810
+ break;
1811
+ case "timeout":
1812
+ const timeout = this.$timeouts.get(name);
1813
+ if (timeout) {
1814
+ timeout.destroy();
1815
+ this.$timeouts.delete(name);
1816
+ }
1817
+ break;
1818
+ }
1819
+ }
1820
+ getByName(type, name) {
1821
+ switch (type) {
1822
+ case "cron":
1823
+ return this.$crons.get(name);
1824
+ case "everytick":
1825
+ return this.$everyticks.get(name);
1826
+ case "interval":
1827
+ return this.$intervals.get(name);
1828
+ case "timeout":
1829
+ return this.$timeouts.get(name);
1830
+ }
1831
+ }
1832
+ getById(id) {
1833
+ return this.multiplayerService.Timers.getByID(id);
1834
+ }
1835
+ time(name) {
1836
+ return this.multiplayerService.Timers.time(name);
1837
+ }
1838
+ timeEnd(name) {
1839
+ return this.multiplayerService.Timers.timeEnd(name);
1840
+ }
1841
+ };
1842
+ _ts_decorate7([
1843
+ inject7(MULTIPLAYER_SERVICE),
1844
+ _ts_metadata6("design:type", typeof MultiplayerService === "undefined" ? Object : MultiplayerService)
1845
+ ], TimerService.prototype, "multiplayerService", void 0);
1846
+ TimerService = _ts_decorate7([
1847
+ injectable10()
1848
+ ], TimerService);
1849
+
1850
+ export {
1851
+ Controller2 as Controller,
1852
+ Global,
1853
+ Inject,
1854
+ Injectable,
1855
+ Module2 as Module,
1856
+ Optional,
1857
+ SetMetadata,
1858
+ Catch,
1859
+ UseFilters,
1860
+ AppRuntime,
1861
+ ReflectorService,
1862
+ TimerService,
1863
+ ModuleDependencyBinder,
1864
+ ModuleTreeScanner,
1865
+ RageMPScriptEvent,
1866
+ RageMPEventEmmiter,
1867
+ RageMPTimer,
1868
+ RageMPTimers,
1869
+ RageMPMultiplayerService,
1870
+ App,
1871
+ AppBuilder,
1872
+ createAppBuilder,
1873
+ createEventDecorator,
1874
+ OnInternal,
1875
+ OnWebView,
1876
+ On,
1877
+ OnceInternal,
1878
+ Once,
1879
+ OnceWebView,
1880
+ Body,
1881
+ Index,
1882
+ Request,
1883
+ Req,
1884
+ Param,
1885
+ Response,
1886
+ Res,
1887
+ UseGuards,
1888
+ UseInterceptors,
1889
+ UsePipes,
1890
+ createRPCDecorator,
1891
+ OnRequest,
1892
+ OnWebViewRequest,
1893
+ Cron,
1894
+ EveryTick,
1895
+ Interval,
1896
+ Timeout,
1897
+ applyDecorators,
1898
+ createParamDecorator,
1899
+ forwardRef
1900
+ };
1901
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NlcnZpY2VzL2luZGV4LnRzIiwgIi4uL3NyYy9zZXJ2aWNlcy9yZWZsZWN0b3Iuc2VydmljZS50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9pbmRleC50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jb3JlL2NvbnRyb2xsZXIuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NvcmUvZ2xvYmFsLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jb3JlL2luamVjdC5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvY29yZS9pbmplY3RhYmxlLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jb3JlL21vZHVsZS5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvY29yZS9vcHRpb25hbC5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvY29yZS9zZXQtbWV0YWRhdGEuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2Vycm9ycy9jYXRjaC5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXJyb3JzL3VzZS1maWx0ZXJzLmRlY29yYXRvci50cyIsICIuLi9zcmMvYXBwL2luZGV4LnRzIiwgIi4uL3NyYy9hcHAvbW9kdWxlLXRyZWUvYXBwLXJ1bnRpbWUudHMiLCAiLi4vc3JjL2FwcC9tb2R1bGUtdHJlZS9kZXBlbmRlbmN5LWJpbmRlci50cyIsICIuLi9zcmMvYXBwL21vZHVsZS10cmVlL21vZHVsZS10cmVlLXNjYW5uZXIudHMiLCAiLi4vc3JjL2FwcC9tdWx0aXBsYXllci9yYWdlbXAvcmFnZW1wLXNjcmlwdC1ldmVudC1oYW5kbGVyLnRzIiwgIi4uL3NyYy9hcHAvbXVsdGlwbGF5ZXIvcmFnZW1wL3JhZ2VtcC1ldmVudC1lbW1pdGVyLnRzIiwgIi4uL3NyYy9hcHAvbXVsdGlwbGF5ZXIvcmFnZW1wL3JhZ2VtcC10aW1lci50cyIsICIuLi9zcmMvYXBwL211bHRpcGxheWVyL3JhZ2VtcC9yYWdlbXAtdGltZXJzLnRzIiwgIi4uL3NyYy9hcHAvbXVsdGlwbGF5ZXIvcmFnZW1wL3JhZ2VtcC1tdWx0aXBsYXllci5zZXJ2aWNlLnRzIiwgIi4uL3NyYy9hcHAvYXBwLWJ1aWxkZXIudHMiLCAiLi4vc3JjL2FwcC9hcHAudHMiLCAiLi4vc3JjL2FwcC9jcmVhdGUtYXBwLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NyZWF0ZS1ldmVudC1kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXZlbnRzL29uLWludGVybmFsLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9ldmVudHMvb24td2Vidmlldy5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXZlbnRzL29uLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9ldmVudHMvb25jZS1pbnRlcm5hbC5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXZlbnRzL29uY2UuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2V2ZW50cy9vbmNlLXdlYnZpZXcuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3BhcmFtcy9ib2R5LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9wYXJhbXMvaW5kZXguZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3BhcmFtcy9yZXF1ZXN0LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9wYXJhbXMvcGFyYW0uZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3BhcmFtcy9yZXNwb25zZS5kZW9yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9waXBlbGluZS91c2UtZ3VhcmRzLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9waXBlbGluZS91c2UtaW50ZXJjZXB0b3JzLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9waXBlbGluZS91c2UtcGlwZXMuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NyZWF0ZS1ycGMtZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3JwYy9vbi1yZXF1ZXN0LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9ycGMvb24td2Vidmlldy1yZXF1ZXN0LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jcmVhdGUtdGltZXIuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3RpbWVycy9jcm9uLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy90aW1lcnMvZXZlcnktdGljay5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvdGltZXJzL2ludGVydmFsLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy90aW1lcnMvdGltZW91dC5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvYXBwbHktZGVjb3JhdG9yLnV0aWwudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvY3JlYXRlLXBhcmFtLnV0aWwudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZm9yd2FyZC1yZWYudXRpbC50cyIsICIuLi9zcmMvc2VydmljZXMvdGltZXIuc2VydmljZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0ICdAYWJyYWhhbS9yZWZsZWN0aW9uJztcblxuZXhwb3J0ICogZnJvbSAnLi9yZWZsZWN0b3Iuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3RpbWVyLnNlcnZpY2UnO1xuIiwgImltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgU2V0TWV0YWRhdGEgfSBmcm9tICcuLi9kZWNvcmF0b3JzJztcbmltcG9ydCB0eXBlIHsgQ3JlYXRlRGVjb3JhdG9yT3B0aW9ucywgQ3JlYXRlRGVjb3JhdG9yV2l0aFRyYW5zZm9ybU9wdGlvbnMsIFJlZmxlY3RhYmxlRGVjb3JhdG9yIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJhbmRvbUlkLCBpc0VtcHR5LCBpc09iamVjdCB9IGZyb20gJy4uL3V0aWxzJztcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlZmxlY3RvclNlcnZpY2Uge1xuICAgIHB1YmxpYyBnZXQ8VFJlc3VsdCA9IHVua25vd24sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBzeW1ib2wgPSBzdHJpbmc+KG1ldGFkYXRhS2V5OiBUS2V5LCB0YXJnZXQ6IE5ld2FibGUgfCBGdW5jdGlvbikge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRNZXRhZGF0YTxUUmVzdWx0PihtZXRhZGF0YUtleSwgdGFyZ2V0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QWxsPFRSZXN1bHQgZXh0ZW5kcyB1bmtub3duW10gPSB1bmtub3duW10sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBzeW1ib2wgPSBzdHJpbmc+KFxuICAgICAgICBtZXRhZGF0YUtleTogVEtleSxcbiAgICAgICAgdGFyZ2V0czogKE5ld2FibGUgfCBGdW5jdGlvbilbXSxcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIDxUUmVzdWx0Pih0YXJnZXRzIHx8IFtdKS5tYXAoKHRhcmdldCkgPT4gdGhpcy5nZXQobWV0YWRhdGFLZXksIHRhcmdldCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGxBbmRNZXJnZTxUUmVzdWx0IGV4dGVuZHMgdW5rbm93bltdID0gdW5rbm93bltdLCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgc3ltYm9sID0gc3RyaW5nPihcbiAgICAgICAgbWV0YWRhdGFLZXk6IFRLZXksXG4gICAgICAgIHRhcmdldHM6IChOZXdhYmxlIHwgRnVuY3Rpb24pW10sXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhQ29sbGVjdGlvbiA9IHRoaXMuZ2V0QWxsPFRSZXN1bHQsIFRLZXk+KG1ldGFkYXRhS2V5LCB0YXJnZXRzKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgaWYgKGlzRW1wdHkobWV0YWRhdGFDb2xsZWN0aW9uKSkgcmV0dXJuIDxUUmVzdWx0Pm1ldGFkYXRhQ29sbGVjdGlvbjtcblxuICAgICAgICByZXR1cm4gPFRSZXN1bHQ+bWV0YWRhdGFDb2xsZWN0aW9uLnJlZHVjZSgoYSwgYikgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5jb25jYXQoYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QoYSkgJiYgaXNPYmplY3QoYikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAuLi5hLFxuICAgICAgICAgICAgICAgICAgICAuLi5iLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW2EsIGJdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QWxsQW5kT3ZlcnJpZGU8VFJlc3VsdCA9IHVua25vd24sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBzeW1ib2wgPSBzdHJpbmc+KG1ldGFkYXRhS2V5OiBUS2V5LCB0YXJnZXRzOiAoTmV3YWJsZSB8IEZ1bmN0aW9uKVtdKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0KG1ldGFkYXRhS2V5LCB0YXJnZXQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gPFRSZXN1bHQ+cmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVEZWNvcmF0b3I8VFBhcmFtPihvcHRpb25zPzogQ3JlYXRlRGVjb3JhdG9yT3B0aW9uczxUUGFyYW0+KTogUmVmbGVjdGFibGVEZWNvcmF0b3I8VFBhcmFtPjtcbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZURlY29yYXRvcjxUUGFyYW0sIFRUcmFuc2Zvcm1lZD4oXG4gICAgICAgIG9wdGlvbnM6IENyZWF0ZURlY29yYXRvcldpdGhUcmFuc2Zvcm1PcHRpb25zPFRQYXJhbSwgVFRyYW5zZm9ybWVkPixcbiAgICApOiBSZWZsZWN0YWJsZURlY29yYXRvcjxUUGFyYW0sIFRUcmFuc2Zvcm1lZD47XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVEZWNvcmF0b3I8VFBhcmFtLCBUVHJhbnNmb3JtZWQgPSBUUGFyYW0+KFxuICAgICAgICBvcHRpb25zOiBDcmVhdGVEZWNvcmF0b3JPcHRpb25zPFRQYXJhbSwgVFRyYW5zZm9ybWVkPiA9IHt9LFxuICAgICk6IFJlZmxlY3RhYmxlRGVjb3JhdG9yPFRQYXJhbSwgVFRyYW5zZm9ybWVkPiB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhS2V5ID0gb3B0aW9ucy5rZXkgPz8gZ2VuZXJhdGVSYW5kb21JZCgpO1xuICAgICAgICBjb25zdCBkZWNvcmF0b3JGbiA9IChtZXRhZGF0YVZhbHVlOiBUUGFyYW0pID0+ICh0YXJnZXQ6IG9iamVjdCB8IEZ1bmN0aW9uLCBrZXk/OiBzdHJpbmcgfCBzeW1ib2wsIGRlc2NyaXB0b3I/OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy50cmFuc2Zvcm0gPyBvcHRpb25zLnRyYW5zZm9ybShtZXRhZGF0YVZhbHVlKSA6IG1ldGFkYXRhVmFsdWU7XG4gICAgICAgICAgICBTZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdmFsdWUgPz8ge30pKHRhcmdldCwga2V5ISwgZGVzY3JpcHRvcik7XG4gICAgICAgIH07XG5cbiAgICAgICAgZGVjb3JhdG9yRm4uS0VZID0gbWV0YWRhdGFLZXk7XG4gICAgICAgIHJldHVybiBkZWNvcmF0b3JGbiBhcyBSZWZsZWN0YWJsZURlY29yYXRvcjxUUGFyYW0sIFRUcmFuc2Zvcm1lZD47XG4gICAgfVxufVxuIiwgImltcG9ydCAnQGFicmFoYW0vcmVmbGVjdGlvbic7XG5cbmV4cG9ydCAqIGZyb20gJy4vY29yZSc7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2V2ZW50cyc7XG5leHBvcnQgKiBmcm9tICcuL3BhcmFtcyc7XG5leHBvcnQgKiBmcm9tICcuL3BpcGVsaW5lJztcbmV4cG9ydCAqIGZyb20gJy4vcnBjJztcbmV4cG9ydCAqIGZyb20gJy4vdGltZXJzJztcblxuZXhwb3J0ICogZnJvbSAnLi9hcHBseS1kZWNvcmF0b3IudXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL2NyZWF0ZS1ldmVudC1kZWNvcmF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9jcmVhdGUtcGFyYW0udXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL2NyZWF0ZS1ycGMtZGVjb3JhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vZm9yd2FyZC1yZWYudXRpbCc7XG4iLCAiaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgQ29udHJvbGxlck9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHZhbGlkYXRlQ29udHJvbGxlck9wdGlvbnMgfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gQ29udHJvbGxlcjxUIGV4dGVuZHMgTmV3YWJsZT4ob3B0aW9ucz86IENvbnRyb2xsZXJPcHRpb25zKSB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IFQpID0+IHtcbiAgICAgICAgaWYgKFJlZmxlY3QuaGFzTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXIsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuRHVwbGljYXRlRGVjb3JhdG9yVXNhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZUNvbnRyb2xsZXJPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyLCB2YWx1ZSwgdGFyZ2V0KTtcblxuICAgICAgICByZXR1cm4gaW5qZWN0YWJsZSgpKHRhcmdldCk7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gR2xvYmFsPFQgZXh0ZW5kcyBOZXdhYmxlPigpIHtcbiAgICByZXR1cm4gKHRhcmdldDogVCkgPT4ge1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5HbG9iYWxNb2R1bGUsIHRydWUsIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBpbmplY3QgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHR5cGUgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IHZhbGlkYXRlSW5qZWN0aW9uVG9rZW4gfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gSW5qZWN0PFQgPSB1bmtub3duPihrZXk/OiBJbmplY3Rpb25Ub2tlbjxUPikge1xuICAgIHJldHVybiA8UHJvcGVydHlEZWNvcmF0b3IgJiBQYXJhbWV0ZXJEZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZywgcGFyYW1JbmRleD86IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAoIWlzTmlsKGtleSkgJiYgIXZhbGlkYXRlSW5qZWN0aW9uVG9rZW4oa2V5KS52YWxpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5JbnZhbGlkSW5qZWN0aW9uVG9rZW5TcGVjaWZpZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG9rZW4gPSBrZXkgPz8gUmVmbGVjdC5nZXRNZXRhZGF0YTxJbmplY3Rpb25Ub2tlbj4oJ2Rlc2lnbjp0eXBlJywgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuSW5qZWN0aW9uVG9rZW5Ob3RGb3VuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbmplY3QodG9rZW4pKHRhcmdldCwgcHJvcGVydHlLZXksIHBhcmFtSW5kZXgpO1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgSW5qZWN0YWJsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IHZhbGlkYXRlSW5qZWN0YWJsZU1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBJbmplY3RhYmxlPFQgZXh0ZW5kcyBOZXdhYmxlPihvcHRpb25zPzogSW5qZWN0YWJsZU9wdGlvbnMpIHtcbiAgICByZXR1cm4gKHRhcmdldDogVCkgPT4ge1xuICAgICAgICBpZiAoUmVmbGVjdC5oYXNNZXRhZGF0YShDb3JlTWV0YWRhdGFLZXkuSW5qZWN0YWJsZSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5EdXBsaWNhdGVEZWNvcmF0b3JVc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlSW5qZWN0YWJsZU1ldGFkYXRhKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5JbmplY3RhYmxlLCB2YWx1ZSwgdGFyZ2V0KTtcblxuICAgICAgICByZXR1cm4gaW5qZWN0YWJsZSgpKHRhcmdldCk7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBNb2R1bGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IHZhbGlkYXRlTW9kdWxlT3B0aW9ucyB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gTW9kdWxlPFQgZXh0ZW5kcyBOZXdhYmxlPihvcHRpb25zPzogTW9kdWxlT3B0aW9ucykge1xuICAgIHJldHVybiAodGFyZ2V0OiBUKSA9PiB7XG4gICAgICAgIGlmIChSZWZsZWN0Lmhhc01ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5Nb2R1bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuRHVwbGljYXRlRGVjb3JhdG9yVXNhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZU1vZHVsZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvciEpO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5Nb2R1bGUsIHZhbHVlLCB0YXJnZXQpO1xuXG4gICAgICAgIHJldHVybiBpbmplY3RhYmxlKCkodGFyZ2V0KTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IG9wdGlvbmFsIH0gZnJvbSAnaW52ZXJzaWZ5JztcblxuZXhwb3J0IGZ1bmN0aW9uIE9wdGlvbmFsKCkge1xuICAgIHJldHVybiA8UHJvcGVydHlEZWNvcmF0b3IgJiBQYXJhbWV0ZXJEZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZywgcGFyYW1JbmRleD86IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gb3B0aW9uYWwoKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBwYXJhbUluZGV4KTtcbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEN1c3RvbURlY29yYXRvciB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIFNldE1ldGFkYXRhPEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsIFYgPSB1bmtub3duPihrZXk6IEssIHZhbHVlOiBWKSB7XG4gICAgY29uc3QgZGVjb3JhdG9yRmFjdG9yeSA9IDxDdXN0b21EZWNvcmF0b3I+KCh0YXJnZXQ6IG9iamVjdCwgX21ldGhvZD86IHN0cmluZywgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShrZXksIHZhbHVlLCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoa2V5LCB2YWx1ZSwgdGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9KTtcbiAgICBkZWNvcmF0b3JGYWN0b3J5LktFWSA9IGtleTtcbiAgICByZXR1cm4gZGVjb3JhdG9yRmFjdG9yeTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gQ2F0Y2g8VCBleHRlbmRzIE5ld2FibGU+KC4uLmV4Y2VwdGlvbnM6IHVua25vd25bXSkge1xuICAgIHJldHVybiAodGFyZ2V0OiBUKSA9PiB7XG4gICAgICAgIGlmIChSZWZsZWN0Lmhhc01ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5DYXRjaCwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5EdXBsaWNhdGVEZWNvcmF0b3JVc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXBsaWNhdGVzID0gZXhjZXB0aW9ucy5maWx0ZXIoKGV4Y2VwdGlvbiwgaW5kZXgpID0+IGV4Y2VwdGlvbnMuaW5kZXhPZihleGNlcHRpb24pICE9PSBpbmRleCk7XG4gICAgICAgIGlmIChkdXBsaWNhdGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5FeGNlcHRpb25IYW5kbGluZ0NvbmZsaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkNhdGNoLCBleGNlcHRpb25zLCB0YXJnZXQpO1xuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEVycm9yRmlsdGVyIH0gZnJvbSAnLi4vLi4vYXBwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVFcnJvckZpbHRlciB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlRmlsdGVycyguLi5maWx0ZXJzOiAoTmV3YWJsZTxFcnJvckZpbHRlcj4gfCBFcnJvckZpbHRlcilbXSkge1xuICAgIHJldHVybiA8Q2xhc3NEZWNvcmF0b3IgJiBNZXRob2REZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kPzogc3RyaW5nLCBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEZpbHRlcnM6IChOZXdhYmxlPEVycm9yRmlsdGVyPiB8IEVycm9yRmlsdGVyKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGZpbHRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVFcnJvckZpbHRlcihmaWx0ZXIpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZEZpbHRlcnMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmlsKGRlc2NyaXB0b3IpICYmICFpc05pbChkZXNjcmlwdG9yLnZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKGZpbHRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BdExlYXN0T25lRmlsdGVyUmVxdWlyZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtZXRob2RGaWx0ZXJzID1cbiAgICAgICAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGU8RXJyb3JGaWx0ZXI+W10+KENvcmVNZXRhZGF0YUtleS5FcnJvckZpbHRlcnMsIHRhcmdldC5jb25zdHJ1Y3RvciwgbWV0aG9kKSB8fCBbXTtcbiAgICAgICAgICAgIGlmICghaXNOaWwobWV0aG9kRmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlcnMuaW5jbHVkZXMoZmlsdGVyKSkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5EdXBsaWNhdGVFcnJvckZpbHRlckRldGVjdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkVycm9yRmlsdGVycywgWy4uLnZhbGlkYXRlZEZpbHRlcnMsIC4uLm1ldGhvZEZpbHRlcnNdLCB0YXJnZXQuY29uc3RydWN0b3IsIG1ldGhvZCk7XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BdExlYXN0T25lRmlsdGVyUmVxdWlyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhc3NGaWx0ZXJzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlPEVycm9yRmlsdGVyPltdPihDb3JlTWV0YWRhdGFLZXkuRXJyb3JGaWx0ZXJzLCB0YXJnZXQpIHx8IFtdO1xuICAgICAgICBpZiAoIWlzTmlsKGNsYXNzRmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlcnMuaW5jbHVkZXMoZmlsdGVyKSkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkR1cGxpY2F0ZUVycm9yRmlsdGVyRGV0ZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkVycm9yRmlsdGVycywgWy4uLnZhbGlkYXRlZEZpbHRlcnMsIC4uLmNsYXNzRmlsdGVyc10sIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0ICdAYWJyYWhhbS9yZWZsZWN0aW9uJztcblxuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cm9sbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vZW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlLXRyZWUnO1xuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9tdWx0aXBsYXllcic7XG4vLyBBcHBcbmV4cG9ydCAqIGZyb20gJy4vYXBwLWJ1aWxkZXInO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jcmVhdGUtYXBwJztcbiIsICJpbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBpc05pbCwgaXNPYmplY3QgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBFTkFCTEVfU0hVVERPV05fSE9PS1MsIEdMT0JBTF9FUlJPUl9GSUxURVJTLCBHTE9CQUxfR1VBUkRTLCBHTE9CQUxfSU5URVJDRVBUT1JTLCBHTE9CQUxfUElQRVMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUgeyBFcnJvckZpbHRlciwgR3VhcmQsIEludGVyY2VwdG9yIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNb2R1bGUgfSBmcm9tICcuLi9tb2R1bGUnO1xuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlLCBvcHRpb25hbCB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBDb250cm9sbGVyLCBDb250cm9sbGVyRXZlbnRIYW5kbGVyLCBDb250cm9sbGVyUlBDSGFuZGxlciB9IGZyb20gJy4uL2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgTE9HR0VSX1NFUlZJQ0UsIFRJTUVSX1NFUlZJQ0UgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBMb2dnZXJTZXJ2aWNlLCBQaXBlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IFRyZWUgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFRpbWVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFwcFJ1bnRpbWUge1xuICAgIEBpbmplY3QoQ29udHJvbGxlckV2ZW50SGFuZGxlcikgcHJpdmF0ZSByZWFkb25seSBldmVudEhhbmRsZXI6IENvbnRyb2xsZXJFdmVudEhhbmRsZXI7XG4gICAgQGluamVjdChDb250cm9sbGVyUlBDSGFuZGxlcikgcHJpdmF0ZSByZWFkb25seSBycGNIYW5kbGVyOiBDb250cm9sbGVyUlBDSGFuZGxlcjtcbiAgICBAaW5qZWN0KEdMT0JBTF9HVUFSRFMpIHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsR3VhcmRzOiAoTmV3YWJsZTxHdWFyZD4gfCBHdWFyZClbXTtcbiAgICBAaW5qZWN0KEdMT0JBTF9JTlRFUkNFUFRPUlMpIHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsSW50ZXJjZXB0b3JzOiAoTmV3YWJsZTxJbnRlcmNlcHRvcj4gfCBJbnRlcmNlcHRvcilbXTtcbiAgICBAaW5qZWN0KEdMT0JBTF9QSVBFUykgcHJpdmF0ZSByZWFkb25seSBnbG9iYWxQaXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdO1xuICAgIEBpbmplY3QoR0xPQkFMX0VSUk9SX0ZJTFRFUlMpIHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsRXJyb3JGaWx0ZXJzOiAoTmV3YWJsZTxFcnJvckZpbHRlcj4gfCBFcnJvckZpbHRlcilbXTtcbiAgICBAaW5qZWN0KExPR0dFUl9TRVJWSUNFKSBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlclNlcnZpY2U6IExvZ2dlclNlcnZpY2U7XG4gICAgQGluamVjdChFTkFCTEVfU0hVVERPV05fSE9PS1MpIEBvcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgZW5hYmxlU2h1dGRvd25Ib29rczogYm9vbGVhbjtcblxuICAgIHB1YmxpYyBhc3luYyBib290KHJlc29sdmVkVHJlZTogVHJlZTxNb2R1bGU+KSB7XG4gICAgICAgIGF3YWl0IHJlc29sdmVkVHJlZS5hc3luY1RyYXZlcnNlKGFzeW5jIChub2RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBtb2R1bGUsIGNvbnRyb2xsZXJzIGFuZCBwcm92aWRlcnMuXG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgbW9kdWxlLmluc3RhbmNlID0gbW9kdWxlLmNvbnRhaW5lci5nZXQ8eyBba2V5OiBzdHJpbmddOiBGdW5jdGlvbiB9Pihtb2R1bGUubWV0YWRhdGEuY2xhc3NSZWYpO1xuICAgICAgICAgICAgbW9kdWxlLmNvbnRyb2xsZXJzLmZvckVhY2goXG4gICAgICAgICAgICAgICAgKGNvbnRyb2xsZXIpID0+IChjb250cm9sbGVyLmluc3RhbmNlID0gbW9kdWxlLmNvbnRhaW5lci5nZXQ8eyBba2V5OiBzdHJpbmddOiBGdW5jdGlvbiB9Pihjb250cm9sbGVyLm1ldGFkYXRhLmNsYXNzUmVmKSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgWy4uLm1vZHVsZS5tZXRhZGF0YS5pbnRlcm5hbFByb3ZpZGVycywgLi4ubW9kdWxlLm1ldGFkYXRhLmV4dGVybmFsUHJvdmlkZXJzXS5mb3JFYWNoKChbdG9rZW5dKSA9PlxuICAgICAgICAgICAgICAgIG1vZHVsZS5jb250YWluZXIuZ2V0PGFueT4odG9rZW4pLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gTG9nIG1vZHVsZSBsb2FkZWQuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKGB+bHd+TW9kdWxlIH5sYn4ke21vZHVsZS5tZXRhZGF0YS5jbGFzc1JlZi5uYW1lfSB+bHd+bG9hZGVkIH5sa34oJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfW1zKWApO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5MaWZlY3ljbGVNZXRob2QobW9kdWxlLCAnb25Nb2R1bGVJbml0Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBhd2FpdCB0aGlzLnJ1bkxpZmVjeWNsZU1ldGhvZHMocmVzb2x2ZWRUcmVlLCAnb25Nb2R1bGVJbml0Jyk7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuTGlmZWN5Y2xlTWV0aG9kcyhyZXNvbHZlZFRyZWUsICdvbkFwcEJvb3RzdHJhcCcpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIGV2ZW50IGFuZCBycGMgbGlzdGVuZXJzLlxuICAgICAgICByZXNvbHZlZFRyZWUudHJhdmVyc2UoKG5vZGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICBtb2R1bGUuY29udHJvbGxlcnMuZm9yRWFjaCgoY29udHJvbGxlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJUaW1lcnMoY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3Rlckxpc3RlbmVycyhjb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKFxuICAgICAgICAgICAgICAgICAgICBgfmx3fkNvbnRyb2xsZXIgfmxjfiR7Y29udHJvbGxlci5tZXRhZGF0YS5jbGFzc1JlZi5uYW1lfSB+bHd+dGltZXJzIGFuZCBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCB+bGt+KCR7RGF0ZS5ub3coKSAtIHRpbWV9bXMpYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bihyZXNvbHZlZFRyZWU6IFRyZWU8TW9kdWxlPikge1xuICAgICAgICBpZiAodGhpcy5lbmFibGVTaHV0ZG93bkhvb2tzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJ1bkxpZmVjeWNsZU1ldGhvZHMocmVzb2x2ZWRUcmVlLCAnb25Nb2R1bGVEZXN0cm95Jyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJ1bkxpZmVjeWNsZU1ldGhvZHMocmVzb2x2ZWRUcmVlLCAnYmVmb3JlQXBwU2h1dGRvd24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHJlc29sdmVkVHJlZS5hc3luY1RyYXZlcnNlKGFzeW5jIChub2RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgbW9kdWxlLmNvbnRyb2xsZXJzLmZvckVhY2goKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lclNlcnZpY2UgPSBjb250cm9sbGVyLm93bmVyLmNvbnRhaW5lci5nZXQ8VGltZXJTZXJ2aWNlPihUSU1FUl9TRVJWSUNFKTtcblxuICAgICAgICAgICAgICAgIC8vIERlc3Ryb3kgYWxsIHRpbWVycy5cbiAgICAgICAgICAgICAgICB0aW1lclNlcnZpY2UuZXZlcnl0aWNrcy5mb3JFYWNoKCh0aW1lcikgPT4gdGltZXIuZGVzdHJveSgpKTtcbiAgICAgICAgICAgICAgICB0aW1lclNlcnZpY2UuaW50ZXJ2YWxzLmZvckVhY2goKHRpbWVyKSA9PiB0aW1lci5kZXN0cm95KCkpO1xuICAgICAgICAgICAgICAgIHRpbWVyU2VydmljZS50aW1lb3V0cy5mb3JFYWNoKCh0aW1lcikgPT4gdGltZXIuZGVzdHJveSgpKTtcbiAgICAgICAgICAgICAgICB0aW1lclNlcnZpY2UuY3JvbnMuZm9yRWFjaCgoY3JvbikgPT4gY3Jvbi5zdG9wKCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gRGVzdHJveSBhbGwgc2NyaXB0IGV2ZW50IGhhbmRsZXJzLlxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZXZlbnRIYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiBoYW5kbGVyLmRlc3Ryb3koKSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5ycGNIYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiBoYW5kbGVyLmRlc3Ryb3koKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gLy8gRGVzdHJveSBhbGwgdGltZXJzLlxuICAgICAgICAvLyB0aGlzLnRpbWVyU2VydmljZS5ldmVyeXRpY2tzLmZvckVhY2goKHRpbWVyKSA9PiB0aW1lci5kZXN0cm95KCkpO1xuICAgICAgICAvLyB0aGlzLnRpbWVyU2VydmljZS5pbnRlcnZhbHMuZm9yRWFjaCgodGltZXIpID0+IHRpbWVyLmRlc3Ryb3koKSk7XG4gICAgICAgIC8vIHRoaXMudGltZXJTZXJ2aWNlLnRpbWVvdXRzLmZvckVhY2goKHRpbWVyKSA9PiB0aW1lci5kZXN0cm95KCkpO1xuICAgICAgICAvLyB0aGlzLnRpbWVyU2VydmljZS5jcm9uSm9icy5mb3JFYWNoKChjcm9uSm9iKSA9PiBjcm9uSm9iLnN0b3AoKSk7XG5cbiAgICAgICAgLy8gLy8gRGVzdHJveSBhbGwgc2NyaXB0IGV2ZW50IGhhbmRsZXJzLlxuICAgICAgICAvLyB0aGlzLmV2ZW50U2VydmljZS4kbG9jYWxIYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiBoYW5kbGVyLmRlc3Ryb3koKSk7XG4gICAgICAgIC8vIHRoaXMuZXZlbnRTZXJ2aWNlLiRpbnRlcm5hbEhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IGhhbmRsZXIuZGVzdHJveSgpKTtcbiAgICAgICAgLy8gdGhpcy5ldmVudFNlcnZpY2UuJHJlbW90ZUhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IGhhbmRsZXIuZGVzdHJveSgpKTtcblxuICAgICAgICBpZiAodGhpcy5lbmFibGVTaHV0ZG93bkhvb2tzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJ1bkxpZmVjeWNsZU1ldGhvZHMocmVzb2x2ZWRUcmVlLCAnb25BcHBTaHV0ZG93bicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3Rlckxpc3RlbmVycyhjb250cm9sbGVyOiBDb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IGNvbnRyb2xsZXIub3duZXI7XG4gICAgICAgIGNvbnRyb2xsZXIubWV0YWRhdGEuZXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBndWFyZHMgPSBbLi4udGhpcy5nbG9iYWxHdWFyZHMsIC4uLm1vZHVsZS5tZXRhZGF0YS5ndWFyZHMsIC4uLmNvbnRyb2xsZXIubWV0YWRhdGEuZ3VhcmRzLCAuLi5ldmVudC5ndWFyZHNdO1xuICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0b3JzID0gW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2xvYmFsSW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgICAgIC4uLm1vZHVsZS5tZXRhZGF0YS5pbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICAgICAgLi4uY29udHJvbGxlci5tZXRhZGF0YS5pbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICAgICAgLi4uZXZlbnQuaW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGNvbnN0IHBpcGVzID0gWy4uLnRoaXMuZ2xvYmFsUGlwZXMsIC4uLm1vZHVsZS5tZXRhZGF0YS5waXBlcywgLi4uY29udHJvbGxlci5tZXRhZGF0YS5waXBlcywgLi4uZXZlbnQucGlwZXNdO1xuICAgICAgICAgICAgY29uc3QgbWFwcGVkRXJyb3JGaWx0ZXJzID0gdGhpcy5tYXBFcnJvckZpbHRlcnMoW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2xvYmFsRXJyb3JGaWx0ZXJzLFxuICAgICAgICAgICAgICAgIC4uLm1vZHVsZS5tZXRhZGF0YS5lcnJvckZpbHRlcnMsXG4gICAgICAgICAgICAgICAgLi4uY29udHJvbGxlci5tZXRhZGF0YS5lcnJvckZpbHRlcnMsXG4gICAgICAgICAgICAgICAgLi4uZXZlbnQuZXJyb3JGaWx0ZXJzLFxuICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmV2ZW50SGFuZGxlci5yZWdpc3RlckV2ZW50KGd1YXJkcywgaW50ZXJjZXB0b3JzLCBwaXBlcywgbWFwcGVkRXJyb3JGaWx0ZXJzLCBjb250cm9sbGVyLCBldmVudCk7XG4gICAgICAgICAgICBjb250cm9sbGVyLmV2ZW50SGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29udHJvbGxlci5tZXRhZGF0YS5ycGNzLmZvckVhY2goYXN5bmMgKHJwYykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZ3VhcmRzID0gWy4uLnRoaXMuZ2xvYmFsR3VhcmRzLCAuLi5tb2R1bGUubWV0YWRhdGEuZ3VhcmRzLCAuLi5jb250cm9sbGVyLm1ldGFkYXRhLmd1YXJkcywgLi4ucnBjLmd1YXJkc107XG4gICAgICAgICAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nbG9iYWxJbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICAgICAgLi4ubW9kdWxlLm1ldGFkYXRhLmludGVyY2VwdG9ycyxcbiAgICAgICAgICAgICAgICAuLi5jb250cm9sbGVyLm1ldGFkYXRhLmludGVyY2VwdG9ycyxcbiAgICAgICAgICAgICAgICAuLi5ycGMuaW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGNvbnN0IHBpcGVzID0gWy4uLnRoaXMuZ2xvYmFsUGlwZXMsIC4uLm1vZHVsZS5tZXRhZGF0YS5waXBlcywgLi4uY29udHJvbGxlci5tZXRhZGF0YS5waXBlcywgLi4ucnBjLnBpcGVzXTtcbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZEVycm9yRmlsdGVycyA9IHRoaXMubWFwRXJyb3JGaWx0ZXJzKFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdsb2JhbEVycm9yRmlsdGVycyxcbiAgICAgICAgICAgICAgICAuLi5tb2R1bGUubWV0YWRhdGEuZXJyb3JGaWx0ZXJzLFxuICAgICAgICAgICAgICAgIC4uLmNvbnRyb2xsZXIubWV0YWRhdGEuZXJyb3JGaWx0ZXJzLFxuICAgICAgICAgICAgICAgIC4uLnJwYy5lcnJvckZpbHRlcnMsXG4gICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IHRoaXMucnBjSGFuZGxlci5yZWdpc3RlclJQQyhndWFyZHMsIGludGVyY2VwdG9ycywgcGlwZXMsIG1hcHBlZEVycm9yRmlsdGVycywgY29udHJvbGxlciwgcnBjKTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIucnBjSGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyVGltZXJzKGNvbnRyb2xsZXI6IENvbnRyb2xsZXIpIHtcbiAgICAgICAgY29uc3QgdGltZXJTZXJ2aWNlID0gY29udHJvbGxlci5vd25lci5jb250YWluZXIuZ2V0PFRpbWVyU2VydmljZT4oVElNRVJfU0VSVklDRSk7XG5cbiAgICAgICAgY29udHJvbGxlci5tZXRhZGF0YS50aW1lcnMuZm9yRWFjaCgodGltZXIpID0+IHtcbiAgICAgICAgICAgIGlmICh0aW1lci50eXBlID09PSAnY3JvbicpIHtcbiAgICAgICAgICAgICAgICB0aW1lclNlcnZpY2UuY3JlYXRlQ3JvbkpvYihjb250cm9sbGVyLmluc3RhbmNlW3RpbWVyLm1ldGhvZF0hLmJpbmQoY29udHJvbGxlci5pbnN0YW5jZSksIHRpbWVyLm9wdGlvbnMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aW1lci50eXBlID09PSAnZXZlcnl0aWNrJykge1xuICAgICAgICAgICAgICAgIHRpbWVyU2VydmljZS5jcmVhdGVFdmVyeVRpY2soY29udHJvbGxlci5pbnN0YW5jZVt0aW1lci5tZXRob2RdIS5iaW5kKGNvbnRyb2xsZXIuaW5zdGFuY2UpLCB0aW1lci5uYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXIudHlwZSA9PT0gJ2ludGVydmFsJykge1xuICAgICAgICAgICAgICAgIHRpbWVyU2VydmljZS5jcmVhdGVJbnRlcnZhbChcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5pbnN0YW5jZVt0aW1lci5tZXRob2RdIS5iaW5kKGNvbnRyb2xsZXIuaW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICB0aW1lci5vcHRpb25zLnRpbWVvdXQsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVyLm5hbWUsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXIudHlwZSA9PT0gJ3RpbWVvdXQnKSB7XG4gICAgICAgICAgICAgICAgdGltZXJTZXJ2aWNlLmNyZWF0ZVRpbWVvdXQoY29udHJvbGxlci5pbnN0YW5jZVt0aW1lci5tZXRob2RdIS5iaW5kKGNvbnRyb2xsZXIuaW5zdGFuY2UpLCB0aW1lci5vcHRpb25zLnRpbWVvdXQsIHRpbWVyLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcEVycm9yRmlsdGVycyhlcnJvckZpbHRlcnM6IChOZXdhYmxlPEVycm9yRmlsdGVyPiB8IEVycm9yRmlsdGVyKVtdKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlck1hcDogW3Vua25vd24gfCAnTUFOR09fQU5ZX0VSUk9SJywgTmV3YWJsZTxFcnJvckZpbHRlcj4gfCBFcnJvckZpbHRlcl1bXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGVycm9yRmlsdGVycykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxhbnlbXT4oQ29yZU1ldGFkYXRhS2V5LkNhdGNoLCBmaWx0ZXIpID8/IFtdO1xuICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCgnTUFOR09fQU5ZX0VSUk9SJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVycm9yIG9mIGVycm9ycykge1xuICAgICAgICAgICAgICAgIGlmICghaXNOaWwoZmlsdGVyTWFwLmZpbmQoKGZpbHRlckVycm9yKSA9PiBmaWx0ZXJFcnJvclswXSA9PT0gZXJyb3IpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBtYXAgZXJyb3IgZmlsdGVycy4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5FcnJvckFscmVhZHlIYW5kbGVkQnlGaWx0ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaWx0ZXJNYXAucHVzaChbZXJyb3IsIGZpbHRlcl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlck1hcDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1bkxpZmVjeWNsZU1ldGhvZHMoXG4gICAgICAgIHJlc29sdmVkVHJlZTogVHJlZTxNb2R1bGU+LFxuICAgICAgICBtZXRob2Q6ICdvbk1vZHVsZUluaXQnIHwgJ29uTW9kdWxlRGVzdHJveScgfCAnb25BcHBCb290c3RyYXAnIHwgJ2JlZm9yZUFwcFNodXRkb3duJyB8ICdvbkFwcFNodXRkb3duJyxcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVkVHJlZS5hc3luY1RyYXZlcnNlKGFzeW5jIChub2RlKSA9PiBhd2FpdCB0aGlzLnJ1bkxpZmVjeWNsZU1ldGhvZChub2RlLnZhbHVlLCBtZXRob2QpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1bkxpZmVjeWNsZU1ldGhvZChcbiAgICAgICAgbW9kdWxlOiBNb2R1bGUsXG4gICAgICAgIG1ldGhvZDogJ29uTW9kdWxlSW5pdCcgfCAnb25Nb2R1bGVEZXN0cm95JyB8ICdvbkFwcEJvb3RzdHJhcCcgfCAnYmVmb3JlQXBwU2h1dGRvd24nIHwgJ29uQXBwU2h1dGRvd24nLFxuICAgICkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIG1vZHVsZS5jb250cm9sbGVycy5tYXAoYXN5bmMgKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzT2JqZWN0KGNvbnRyb2xsZXIuaW5zdGFuY2UpIHx8IGlzTmlsKGNvbnRyb2xsZXIuaW5zdGFuY2VbbWV0aG9kXSkpIHJldHVybjtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sbGVyLmluc3RhbmNlW21ldGhvZF0hKCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBbLi4ubW9kdWxlLm1ldGFkYXRhLmludGVybmFsUHJvdmlkZXJzLCAuLi5tb2R1bGUubWV0YWRhdGEuZXh0ZXJuYWxQcm92aWRlcnNdLm1hcChhc3luYyAoW3Rva2VuXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVySW5zdGFuY2UgPSA8eyBba2V5OiBzdHJpbmddOiBGdW5jdGlvbiB9Pm1vZHVsZS5jb250YWluZXIuZ2V0KHRva2VuKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzT2JqZWN0KHByb3ZpZGVySW5zdGFuY2UpIHx8IGlzTmlsKHByb3ZpZGVySW5zdGFuY2VbbWV0aG9kXSkpIHJldHVybjtcbiAgICAgICAgICAgICAgICBhd2FpdCBwcm92aWRlckluc3RhbmNlW21ldGhvZF0hKCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFpc09iamVjdChtb2R1bGUuaW5zdGFuY2UpIHx8IGlzTmlsKG1vZHVsZS5pbnN0YW5jZVttZXRob2RdKSkgcmV0dXJuO1xuICAgICAgICBhd2FpdCBtb2R1bGUuaW5zdGFuY2VbbWV0aG9kXSEoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBMb2dnZXJTZXJ2aWNlLCBQcm92aWRlciB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBDT05UQUlORVJfT1BUSU9OUywgR0xPQkFMX0FQUF9DT05UQUlORVIgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgTW9kdWxlLCBNb2R1bGVDb250YWluZXIgfSBmcm9tICcuLi9tb2R1bGUnO1xuaW1wb3J0IHsgQ29udGFpbmVyLCBpbmplY3QsIGluamVjdGFibGUsIG9wdGlvbmFsLCB0eXBlIGludGVyZmFjZXMgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgTE9HR0VSX1NFUlZJQ0UsIE1PRFVMRV9DT05UQUlORVIsIFRJTUVSX1NFUlZJQ0UgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUgeyBUcmVlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVGltZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTW9kdWxlRGVwZW5kZW5jeUJpbmRlciB7XG4gICAgQGluamVjdChHTE9CQUxfQVBQX0NPTlRBSU5FUikgcHJpdmF0ZSByZWFkb25seSBnbG9iYWxBcHBDb250YWluZXI6IENvbnRhaW5lcjtcbiAgICBAaW5qZWN0KExPR0dFUl9TRVJWSUNFKSBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlclNlcnZpY2U6IExvZ2dlclNlcnZpY2U7XG4gICAgQG9wdGlvbmFsKCkgQGluamVjdChDT05UQUlORVJfT1BUSU9OUykgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXJPcHRpb25zPzogaW50ZXJmYWNlcy5Db250YWluZXJPcHRpb25zO1xuXG4gICAgcHVibGljIGFzeW5jIGJpbmQocmVzb2x2ZWRUcmVlOiBUcmVlPE1vZHVsZT4pIHtcbiAgICAgICAgYXdhaXQgcmVzb2x2ZWRUcmVlLmFzeW5jVHJhdmVyc2UoYXN5bmMgKG5vZGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICBtb2R1bGUuY29udGFpbmVyID0gbmV3IE1vZHVsZUNvbnRhaW5lcihtb2R1bGUubWV0YWRhdGEuY29udGFpbmVyID8/IHRoaXMuY29udGFpbmVyT3B0aW9ucyk7XG4gICAgICAgICAgICAvLyBBdHRhY2ggdGhlIGdsb2JhbCBjb250YWluZXIgdG8gdGhlIG1vZHVsZSBjb250YWluZXIsIHNvIGl0IGNhbiBiZSB1c2VkIHRvIHJlc29sdmUgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgbW9kdWxlLmNvbnRhaW5lci5wYXJlbnQgPSB0aGlzLmdsb2JhbEFwcENvbnRhaW5lcjtcbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsQXBwQ29udGFpbmVyLmJpbmQobW9kdWxlLm1ldGFkYXRhLmNsYXNzUmVmKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBtb2R1bGUgaXMgZ2xvYmFsLCB3ZSB3YW50IHRvIGJpbmQgaXQgdG8gdGhlIGdsb2JhbCBjb250YWluZXIuXG4gICAgICAgICAgICBpZiAobW9kdWxlLm1ldGFkYXRhLmdsb2JhbCkge1xuICAgICAgICAgICAgICAgIC8vIEJpbmQgZXh0ZXJuYWwgcHJvdmlkZXJzIHRvIHRoZSBnbG9iYWwgY29udGFpbmVyLCBzbyB0aGV5IGNhbiBiZSBpbmplY3RlZCBpbiBvdGhlciBtb2R1bGVzLlxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIHByb3ZpZGVyXSBvZiBtb2R1bGUubWV0YWRhdGEuZXh0ZXJuYWxQcm92aWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kUHJvdmlkZXIocHJvdmlkZXIsIHRoaXMuZ2xvYmFsQXBwQ29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBtb2R1bGUgaXMgbm90IGdsb2JhbCwgd2Ugd2FudCB0byBiaW5kIGl0IHRvIGl0cyBvd24gY29udGFpbmVyLlxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3Rva2VuLCBwcm92aWRlcl0gb2YgbW9kdWxlLm1ldGFkYXRhLmV4dGVybmFsUHJvdmlkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZFByb3ZpZGVyKHByb3ZpZGVyLCBtb2R1bGUuY29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlLnBhcmVudD8uY29udGFpbmVyLmJpbmQodG9rZW4pLnRvRHluYW1pY1ZhbHVlKCgpID0+IG1vZHVsZS5jb250YWluZXIuZ2V0KHRva2VuKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaW1wb3J0TW9kdWxlIG9mIG1vZHVsZS5yZXBldGl0aXZlSW1wb3J0cykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFt0b2tlbl0gb2YgaW1wb3J0TW9kdWxlLm1ldGFkYXRhLmV4dGVybmFsUHJvdmlkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuY29udGFpbmVyLmJpbmQodG9rZW4pLnRvRHluYW1pY1ZhbHVlKCgpID0+IGltcG9ydE1vZHVsZS5jb250YWluZXIuZ2V0KHRva2VuKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEJpbmQgaW50ZXJuYWwgcHJvdmlkZXJzLlxuICAgICAgICAgICAgZm9yIChjb25zdCBbXywgcHJvdmlkZXJdIG9mIG1vZHVsZS5tZXRhZGF0YS5pbnRlcm5hbFByb3ZpZGVycykge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZFByb3ZpZGVyKHByb3ZpZGVyLCBtb2R1bGUuY29udGFpbmVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQmluZCBjb250YWluZXIgdG8gaXRzZWxmIHNvIGl0IGNhbiBiZSBpbmplY3RlZC5cbiAgICAgICAgICAgIG1vZHVsZS5jb250YWluZXIuYmluZChNT0RVTEVfQ09OVEFJTkVSKS50b0NvbnN0YW50VmFsdWUobW9kdWxlLmNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIC8vIEJpbmQgY29udHJvbGxlcnMgdG8gdGhlIGNvbnRhaW5lci5cbiAgICAgICAgICAgIGZvciAoY29uc3QgY2xhc3NSZWYgb2YgbW9kdWxlLm1ldGFkYXRhLmNvbnRyb2xsZXJzKSB7XG4gICAgICAgICAgICAgICAgbW9kdWxlLmNvbnRhaW5lci5iaW5kKGNsYXNzUmVmKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEJpbmQgc2VydmljZXMgdG8gdGhlIGNvbnRhaW5lci5cbiAgICAgICAgICAgIG1vZHVsZS5jb250YWluZXIuYmluZChUSU1FUl9TRVJWSUNFKS50byhUaW1lclNlcnZpY2UpLmluU2luZ2xldG9uU2NvcGUoKTtcblxuICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZyhcbiAgICAgICAgICAgICAgICBgfmx3fk1vZHVsZSB+bGJ+JHttb2R1bGUubWV0YWRhdGEuY2xhc3NSZWYubmFtZX0gfmx3fmRlcGVuZGVuY2llcyBiaW5kZWQgfmxrfigke0RhdGUubm93KCkgLSBzdGFydFRpbWV9bXMpYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZFByb3ZpZGVyKHByb3ZpZGVyOiBFeGNsdWRlPFByb3ZpZGVyLCBOZXdhYmxlPiwgY29udGFpbmVyOiBDb250YWluZXIpIHtcbiAgICAgICAgaWYgKCd1c2VWYWx1ZScgaW4gcHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5iaW5kKHByb3ZpZGVyLnByb3ZpZGUpLnRvQ29uc3RhbnRWYWx1ZShwcm92aWRlci51c2VWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoJ3VzZUZhY3RvcnknIGluIHByb3ZpZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kaW5nID0gY29udGFpbmVyLmJpbmQocHJvdmlkZXIucHJvdmlkZSkudG9EeW5hbWljVmFsdWUoKGN0eCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlcHMgPVxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5pbmplY3Q/Lm1hcCgoZGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QoZGVwKSAmJiAndG9rZW4nIGluIGRlcCAmJiAnb3B0aW9uYWwnIGluIGRlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdHguY29udGFpbmVyLmdldChkZXAudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwLm9wdGlvbmFsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZXNvbHZlIGEgZGVwZW5kZW5jeS4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdHguY29udGFpbmVyLmdldChkZXApO1xuICAgICAgICAgICAgICAgICAgICB9KSA/PyBbXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIudXNlRmFjdG9yeSguLi5kZXBzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGVyLnNjb3BlID09PSAndHJhbnNpZW50JykgYmluZGluZy5pblRyYW5zaWVudFNjb3BlKCk7XG4gICAgICAgICAgICBlbHNlIGlmIChwcm92aWRlci5zY29wZSA9PT0gJ3JlcXVlc3QnKSBiaW5kaW5nLmluUmVxdWVzdFNjb3BlKCk7XG4gICAgICAgICAgICBlbHNlIGJpbmRpbmcuaW5TaW5nbGV0b25TY29wZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCd1c2VDbGFzcycgaW4gcHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRpbmcgPSBjb250YWluZXIuYmluZChwcm92aWRlci5wcm92aWRlKS50byhwcm92aWRlci51c2VDbGFzcyk7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXIuc2NvcGUgPT09ICd0cmFuc2llbnQnKSBiaW5kaW5nLmluVHJhbnNpZW50U2NvcGUoKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHByb3ZpZGVyLnNjb3BlID09PSAncmVxdWVzdCcpIGJpbmRpbmcuaW5SZXF1ZXN0U2NvcGUoKTtcbiAgICAgICAgICAgIGVsc2UgYmluZGluZy5pblNpbmdsZXRvblNjb3BlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoJ3VzZUV4aXN0aW5nJyBpbiBwcm92aWRlcikge1xuICAgICAgICAgICAgY29udGFpbmVyLmJpbmQocHJvdmlkZXIucHJvdmlkZSkudG9TZXJ2aWNlKHByb3ZpZGVyLnVzZUV4aXN0aW5nKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IER5bmFtaWNNb2R1bGUsIExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENvbnRyb2xsZXIsIENvbnRyb2xsZXJNZXRhZGF0YVJlYWRlciB9IGZyb20gJy4uL2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgTW9kdWxlLCBNb2R1bGVNZXRhZGF0YVJlYWRlciB9IGZyb20gJy4uL21vZHVsZSc7XG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHsgVHJlZSwgVHJlZU5vZGUgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBMT0dHRVJfU0VSVklDRSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7IE1vZHVsZU1ldGFkYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBpc05pbCB9IGZyb20gJy4uLy4uL3V0aWxzJztcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1vZHVsZVRyZWVTY2FubmVyIHtcbiAgICBAaW5qZWN0KE1vZHVsZU1ldGFkYXRhUmVhZGVyKSBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZU1ldGFkYXRhUmVhZGVyOiBNb2R1bGVNZXRhZGF0YVJlYWRlcjtcbiAgICBAaW5qZWN0KENvbnRyb2xsZXJNZXRhZGF0YVJlYWRlcikgcHJpdmF0ZSByZWFkb25seSBjb250cm9sbGVyTWV0YWRhdGFSZWFkZXI6IENvbnRyb2xsZXJNZXRhZGF0YVJlYWRlcjtcbiAgICBAaW5qZWN0KExPR0dFUl9TRVJWSUNFKSBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlclNlcnZpY2U6IExvZ2dlclNlcnZpY2U7XG5cbiAgICBwdWJsaWMgYXN5bmMgc2NhbihjbGFzc1JlZjogTmV3YWJsZSB8IER5bmFtaWNNb2R1bGUgfCBQcm9taXNlPER5bmFtaWNNb2R1bGU+KSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIC8vIFJlYWQgbW9kdWxlIG1ldGFkYXRhXG4gICAgICAgIGNvbnN0IG1vZHVsZU1ldGFkYXRhID0gYXdhaXQgdGhpcy5tb2R1bGVNZXRhZGF0YVJlYWRlci5yZWFkKGNsYXNzUmVmKTtcbiAgICAgICAgLy8gQ3JlYXRlIG1vZHVsZSBpbnN0YW5jZSBhbmQgc2V0IG1ldGFkYXRhIHRvIGl0XG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBNb2R1bGUoKTtcbiAgICAgICAgbW9kdWxlLm1ldGFkYXRhID0gbW9kdWxlTWV0YWRhdGE7XG4gICAgICAgIC8vIExvZyBtb2R1bGUgaW5mb1xuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKGB+bHd+TW9kdWxlIH5sYn4ke21vZHVsZS5tZXRhZGF0YS5jbGFzc1JlZi5uYW1lfSB+bHd+c2Nhbm5lZCB+bGt+KCR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tcylgKTtcbiAgICAgICAgLy8gU2NhbiBjb250cm9sbGVycyBpbiBtb2R1bGVcbiAgICAgICAgYXdhaXQgdGhpcy5zY2FuQ29udHJvbGxlcnMobW9kdWxlKTtcbiAgICAgICAgLy8gU2NhbiBjb250cm9sbGVycyBpbiBtb2R1bGVcbiAgICAgICAgY29uc3QgbW9kdWxlVHJlZSA9IG5ldyBUcmVlKG1vZHVsZSk7XG4gICAgICAgIGNvbnN0IHNjYW5uZWRNb2R1bGVzID0gbmV3IE1hcDxOZXdhYmxlIHwgRHluYW1pY01vZHVsZSB8IFByb21pc2U8RHluYW1pY01vZHVsZT4sIE1vZHVsZT4oKTtcbiAgICAgICAgc2Nhbm5lZE1vZHVsZXMuc2V0KGNsYXNzUmVmLCBtb2R1bGUpO1xuICAgICAgICAvLyBTY2FuIGltcG9ydGVkIG1vZHVsZXNcbiAgICAgICAgZm9yIChjb25zdCBpbXBvcnRlZE1vZHVsZSBvZiBtb2R1bGVNZXRhZGF0YS5pbXBvcnRzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNjYW5Nb2R1bGVzKG1vZHVsZVRyZWUucm9vdCwgaW1wb3J0ZWRNb2R1bGUsIHNjYW5uZWRNb2R1bGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kdWxlVHJlZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNjYW5Nb2R1bGVzKFxuICAgICAgICBwYXJlbnROb2RlOiBUcmVlTm9kZTxNb2R1bGU+LFxuICAgICAgICBjbGFzc1JlZjogTmV3YWJsZSB8IER5bmFtaWNNb2R1bGUgfCBQcm9taXNlPER5bmFtaWNNb2R1bGU+LFxuICAgICAgICBzY2FubmVkTW9kdWxlcyA9IG5ldyBNYXA8TmV3YWJsZSB8IER5bmFtaWNNb2R1bGUgfCBQcm9taXNlPER5bmFtaWNNb2R1bGU+LCBNb2R1bGU+KCksXG4gICAgKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIG1vZHVsZSBpcyBhbHJlYWR5IGltcG9ydGVkXG4gICAgICAgIGNvbnN0IHNjYW5uZWRNb2R1bGUgPSBzY2FubmVkTW9kdWxlcy5nZXQoY2xhc3NSZWYpO1xuICAgICAgICBpZiAoIWlzTmlsKHNjYW5uZWRNb2R1bGUpKSB7XG4gICAgICAgICAgICBwYXJlbnROb2RlLnZhbHVlLnJlcGV0aXRpdmVJbXBvcnRzLmFkZChzY2FubmVkTW9kdWxlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gUmVhZCBtb2R1bGUgbWV0YWRhdGFcbiAgICAgICAgY29uc3QgbW9kdWxlTWV0YWRhdGEgPSBhd2FpdCB0aGlzLm1vZHVsZU1ldGFkYXRhUmVhZGVyLnJlYWQoY2xhc3NSZWYpO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3lcbiAgICAgICAgdGhpcy5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeShwYXJlbnROb2RlLnZhbHVlLm1ldGFkYXRhLCBtb2R1bGVNZXRhZGF0YSk7XG4gICAgICAgIC8vIENyZWF0ZSBtb2R1bGUgaW5zdGFuY2VcbiAgICAgICAgY29uc3QgbW9kdWxlID0gbmV3IE1vZHVsZSgpO1xuICAgICAgICBtb2R1bGUubWV0YWRhdGEgPSBtb2R1bGVNZXRhZGF0YTtcbiAgICAgICAgbW9kdWxlLnBhcmVudCA9IHBhcmVudE5vZGUudmFsdWU7XG4gICAgICAgIC8vIExvZyBtb2R1bGUgaW5mb1xuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKGB+bHd+TW9kdWxlIH5sYn4ke21vZHVsZS5tZXRhZGF0YS5jbGFzc1JlZi5uYW1lfSB+bHd+c2Nhbm5lZCB+bGt+KCR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tcylgKTtcbiAgICAgICAgLy8gU2NhbiBjb250cm9sbGVycyBpbiBtb2R1bGVcbiAgICAgICAgYXdhaXQgdGhpcy5zY2FuQ29udHJvbGxlcnMobW9kdWxlKTtcbiAgICAgICAgLy8gQWRkIG1vZHVsZSB0byB0cmVlXG4gICAgICAgIGNvbnN0IHRyZWVOb2RlID0gbmV3IFRyZWVOb2RlKG1vZHVsZSk7XG4gICAgICAgIHBhcmVudE5vZGUuYWRkQ2hpbGQodHJlZU5vZGUpO1xuICAgICAgICAvLyBBZGQgbW9kdWxlIHRvIGltcG9ydGVkIG1vZHVsZXMgc2V0IHRvIHByZXZlbnQgdW5uZWNlc3Nhcnkgc2Nhbm5pbmdcbiAgICAgICAgc2Nhbm5lZE1vZHVsZXMuc2V0KGNsYXNzUmVmLCBtb2R1bGUpO1xuICAgICAgICAvLyBTY2FuIGltcG9ydGVkIG1vZHVsZXMgcmVjdXJzaXZlbHlcbiAgICAgICAgZm9yIChjb25zdCBpbXBvcnRNb2R1bGUgb2YgbW9kdWxlTWV0YWRhdGEuaW1wb3J0cykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY2FuTW9kdWxlcyh0cmVlTm9kZSwgaW1wb3J0TW9kdWxlLCBzY2FubmVkTW9kdWxlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNjYW5Db250cm9sbGVycyhtb2R1bGU6IE1vZHVsZSkge1xuICAgICAgICAvLyBTY2FuIGNvbnRyb2xsZXJzXG4gICAgICAgIGZvciAoY29uc3QgY2xhc3NSZWYgb2YgbW9kdWxlLm1ldGFkYXRhLmNvbnRyb2xsZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgY29uc3QgY29udHJvbGxlck1ldGFkYXRhID0gYXdhaXQgdGhpcy5jb250cm9sbGVyTWV0YWRhdGFSZWFkZXIucmVhZChjbGFzc1JlZik7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXIoKTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIubWV0YWRhdGEgPSBjb250cm9sbGVyTWV0YWRhdGE7XG4gICAgICAgICAgICBjb250cm9sbGVyLm93bmVyID0gbW9kdWxlO1xuICAgICAgICAgICAgbW9kdWxlLmNvbnRyb2xsZXJzLnB1c2goY29udHJvbGxlcik7XG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2coYH5sd35Db250cm9sbGVyIH5sY34ke2NsYXNzUmVmLm5hbWV9IH5sd35zY2FubmVkIH5sa34oJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfW1zKWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja0NpcmN1bGFyRGVwZW5kZW5jeShwYXJlbnRNZXRhZGF0YTogTW9kdWxlTWV0YWRhdGEsIG1vZHVsZU1ldGFkYXRhOiBNb2R1bGVNZXRhZGF0YSkge1xuICAgICAgICAvLyBDaGVjayBpZiBwYXJlbnQgbW9kdWxlIGlzIGltcG9ydGVkIGluIG1vZHVsZVxuICAgICAgICBpZiAobW9kdWxlTWV0YWRhdGEuaW1wb3J0cy5pbmNsdWRlcyhwYXJlbnRNZXRhZGF0YS5jbGFzc1JlZikpIHtcbiAgICAgICAgICAgIC8vIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2Nhbm5pbmcgdGhlIG1vZHVsZSB0cmVlLicpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5DaXJjdWxhckRlcGVuZGVuY3lEZXRlY3RlZCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTY3JpcHRFdmVudEhhbmRsZXIgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGNsYXNzIFJhZ2VNUFNjcmlwdEV2ZW50IGltcGxlbWVudHMgU2NyaXB0RXZlbnRIYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBldmVudE5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkLFxuICAgICkge31cblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIG1wLmV2ZW50cy5yZW1vdmUodGhpcy5ldmVudE5hbWUsIHRoaXMubGlzdGVuZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEV2ZW50RW1taXRlciwgU2NyaXB0RXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSYWdlTVBTY3JpcHRFdmVudCB9IGZyb20gJy4vcmFnZW1wLXNjcmlwdC1ldmVudC1oYW5kbGVyJztcblxuZXhwb3J0IGNsYXNzIFJhZ2VNUEV2ZW50RW1taXRlciBpbXBsZW1lbnRzIEV2ZW50RW1taXRlciB7XG4gICAgZW1pdChldmVudE5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICAgICAgbXAuZXZlbnRzLmNhbGwoZXZlbnROYW1lLCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICBvbihldmVudE5hbWU6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IFNjcmlwdEV2ZW50SGFuZGxlciB7XG4gICAgICAgIG1wLmV2ZW50cy5hZGQoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBuZXcgUmFnZU1QU2NyaXB0RXZlbnQoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgb25jZShldmVudE5hbWU6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IFNjcmlwdEV2ZW50SGFuZGxlciB7XG4gICAgICAgIGNvbnN0IG9uY2VXcmFwcGVyID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICBtcC5ldmVudHMucmVtb3ZlKGV2ZW50TmFtZSwgb25jZVdyYXBwZXIpO1xuICAgICAgICAgICAgbGlzdGVuZXIoLi4uYXJncyk7XG4gICAgICAgIH07XG4gICAgICAgIG1wLmV2ZW50cy5hZGQoZXZlbnROYW1lLCBvbmNlV3JhcHBlcik7XG4gICAgICAgIHJldHVybiBuZXcgUmFnZU1QU2NyaXB0RXZlbnQoZXZlbnROYW1lLCBvbmNlV3JhcHBlcik7XG4gICAgfVxuXG4gICAgb2ZmKGV2ZW50TmFtZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIG1wLmV2ZW50cy5yZW1vdmUoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlwbGF5ZXJUaW1lciB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgY2xhc3MgUmFnZU1QVGltZXIgaW1wbGVtZW50cyBNdWx0aXBsYXllclRpbWVyIHtcbiAgICBwdWJsaWMgbGFzdFRpY2sgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaWQ6IG51bWJlcixcbiAgICAgICAgcHVibGljIGludGVydmFsOiBudW1iZXIgPSAwLFxuICAgICAgICBwdWJsaWMgb25jZTogYm9vbGVhbixcbiAgICAgICAgcHVibGljIGNhbGxiYWNrOiBGdW5jdGlvbixcbiAgICAgICAgcHJpdmF0ZSBjbGVhclRpbWVyOiBGdW5jdGlvbixcbiAgICApIHt9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNsZWFyVGltZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aXBsYXllclRpbWVyLCBNdWx0aXBsYXllclRpbWVycyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUmFnZU1QVGltZXIgfSBmcm9tICcuL3JhZ2VtcC10aW1lcic7XG5cbmV4cG9ydCBjbGFzcyBSYWdlTVBUaW1lcnMgaW1wbGVtZW50cyBNdWx0aXBsYXllclRpbWVycyB7XG4gICAgcHJpdmF0ZSB0aW1lckluY3JlbWVudGVyOiBudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgdGltZXJzID0gbmV3IE1hcDxudW1iZXIsIE11bHRpcGxheWVyVGltZXI+KCk7XG4gICAgcHJpdmF0ZSBldmVyeVRpY2tIYW5kbGVycyA9IG5ldyBNYXA8bnVtYmVyLCB7IGNhbGxiYWNrOiBGdW5jdGlvbjsgYm91bmQ6IEZ1bmN0aW9uIH0+KCk7XG4gICAgcHJpdmF0ZSBpc0V2ZXJ5VGlja1J1bm5pbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIGV2ZXJ5VGlja01haW5IYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICAgIHB1YmxpYyBnZXQgYWxsKCk6IE11bHRpcGxheWVyVGltZXJbXSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy50aW1lcnMudmFsdWVzKCldO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgd2FybmluZ1RocmVzaG9sZCgpOiBudW1iZXIge1xuICAgICAgICAvLyBSYWdlTVAgZG9lc24ndCBoYXZlIHRoaXMgZmVhdHVyZVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHdhcm5pbmdUaHJlc2hvbGQoX3ZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgLy8gUmFnZU1QIGRvZXNuJ3QgaGF2ZSB0aGlzIGZlYXR1cmVcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNvdXJjZUxvY2F0aW9uRnJhbWVTa2lwQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgLy8gUmFnZU1QIGRvZXNuJ3QgaGF2ZSB0aGlzIGZlYXR1cmVcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzb3VyY2VMb2NhdGlvbkZyYW1lU2tpcENvdW50KF92YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIC8vIFJhZ2VNUCBkb2Vzbid0IGhhdmUgdGhpcyBmZWF0dXJlXG4gICAgfVxuXG4gICAgZ2V0QnlJRChpZDogbnVtYmVyKTogTXVsdGlwbGF5ZXJUaW1lciB8IG51bGwge1xuICAgICAgICBjb25zdCB0aW1lciA9IHRoaXMudGltZXJzLmdldChpZCk7XG4gICAgICAgIHJldHVybiB0aW1lciA/PyBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlVGltZXIoXG4gICAgICAgIGNyZWF0ZVRpbWVyOiAoLi4uYXJnczogYW55W10pID0+IG51bWJlcixcbiAgICAgICAgY2xlYXI6IChpZDogbnVtYmVyKSA9PiB2b2lkLFxuICAgICAgICBjYWxsYmFjazogRnVuY3Rpb24sXG4gICAgICAgIGludGVydmFsOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgICAgIG9uY2U6IGJvb2xlYW4sXG4gICAgICAgIC4uLmFyZ3M6IHVua25vd25bXVxuICAgICkge1xuICAgICAgICBjb25zdCBjYWxsYmFja0JpbmQgPSBjYWxsYmFjay5iaW5kKHRoaXMsIC4uLihBcnJheS5pc0FycmF5KGFyZ3MpID8gYXJncyA6IFtdKSk7XG4gICAgICAgIGNvbnN0IHRpbWVySWQgPSB0eXBlb2YgaW50ZXJ2YWwgPT09ICdudW1iZXInID8gY3JlYXRlVGltZXIoY2FsbGJhY2tCaW5kLCBpbnRlcnZhbCkgOiBjcmVhdGVUaW1lcihjYWxsYmFja0JpbmQpO1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMudGltZXJJbmNyZW1lbnRlcisrO1xuXG4gICAgICAgIGNvbnN0IHJhZ2VNUFRpbWVyID0gbmV3IFJhZ2VNUFRpbWVyKGlkLCBpbnRlcnZhbCA/PyAwLCBvbmNlLCBjYWxsYmFja0JpbmQsICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFyKHRpbWVySWQpO1xuICAgICAgICAgICAgdGhpcy50aW1lcnMuZGVsZXRlKGlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudGltZXJzLnNldChpZCwgcmFnZU1QVGltZXIpO1xuICAgICAgICByZXR1cm4gcmFnZU1QVGltZXI7XG4gICAgfVxuXG4gICAgc2V0SW50ZXJ2YWwoY2FsbGJhY2s6IEZ1bmN0aW9uLCB0aW1lOiBudW1iZXIsIC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUaW1lcihcbiAgICAgICAgICAgIChjYjogRnVuY3Rpb24sIGludGVydmFsOiBudW1iZXIpID0+IHNldEludGVydmFsKGNiIGFzICgpID0+IHZvaWQsIGludGVydmFsKSBhcyB1bmtub3duIGFzIG51bWJlcixcbiAgICAgICAgICAgIChpZDogbnVtYmVyKSA9PiBjbGVhckludGVydmFsKGlkKSxcbiAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgdGltZSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgLi4uYXJnc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoY2FsbGJhY2s6IEZ1bmN0aW9uLCB0aW1lOiBudW1iZXIsIC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMudGltZXJJbmNyZW1lbnRlcisrO1xuICAgICAgICBjb25zdCBjYWxsYmFja0JpbmQgPSBjYWxsYmFjay5iaW5kKHRoaXMsIC4uLihBcnJheS5pc0FycmF5KGFyZ3MpID8gYXJncyA6IFtdKSk7XG5cbiAgICAgICAgY29uc3QgdGltZXJJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2tCaW5kKCk7XG4gICAgICAgICAgICB0aGlzLnRpbWVycy5kZWxldGUoaWQpO1xuICAgICAgICB9LCB0aW1lKSBhcyB1bmtub3duIGFzIG51bWJlcjtcblxuICAgICAgICBjb25zdCByYWdlTVBUaW1lciA9IG5ldyBSYWdlTVBUaW1lcihpZCwgdGltZSwgdHJ1ZSwgY2FsbGJhY2tCaW5kLCAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgICAgICB0aGlzLnRpbWVycy5kZWxldGUoaWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50aW1lcnMuc2V0KGlkLCByYWdlTVBUaW1lcik7XG4gICAgICAgIHJldHVybiByYWdlTVBUaW1lcjtcbiAgICB9XG5cbiAgICBldmVyeVRpY2soY2FsbGJhY2s6IEZ1bmN0aW9uLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnRpbWVySW5jcmVtZW50ZXIrKztcbiAgICAgICAgY29uc3QgY2FsbGJhY2tCaW5kID0gY2FsbGJhY2suYmluZCh0aGlzLCAuLi4oQXJyYXkuaXNBcnJheShhcmdzKSA/IGFyZ3MgOiBbXSkpO1xuXG4gICAgICAgIHRoaXMuZXZlcnlUaWNrSGFuZGxlcnMuc2V0KGlkLCB7IGNhbGxiYWNrLCBib3VuZDogY2FsbGJhY2tCaW5kIH0pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIG9uIGNsaWVudC1zaWRlIChyZW5kZXIgZXZlbnQgZXhpc3RzKSBvciBzZXJ2ZXItc2lkZVxuICAgICAgICBjb25zdCBpc0NsaWVudFNpZGUgPSB0eXBlb2YgbXAgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiAobXAgYXMgYW55KS5icm93c2VycyAhPT0gJ3VuZGVmaW5lZCc7XG5cbiAgICAgICAgLy8gU3RhcnQgdGhlIHRpY2sgbG9vcCBpZiBub3QgYWxyZWFkeSBydW5uaW5nXG4gICAgICAgIGlmICghdGhpcy5pc0V2ZXJ5VGlja1J1bm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuaXNFdmVyeVRpY2tSdW5uaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKGlzQ2xpZW50U2lkZSkge1xuICAgICAgICAgICAgICAgIC8vIENsaWVudC1zaWRlOiB1c2UgcmVuZGVyIGV2ZW50IGZvciBmcmFtZS1hY2N1cmF0ZSB0aWNraW5nXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVyeVRpY2tNYWluSGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbLCBoYW5kbGVyXSBvZiB0aGlzLmV2ZXJ5VGlja0hhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuYm91bmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcC5jb25zb2xlLmxvZ0Vycm9yKGBFcnJvciBpbiBldmVyeVRpY2sgaGFuZGxlcjogJHtlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtcC5ldmVudHMuYWRkKCdyZW5kZXInLCB0aGlzLmV2ZXJ5VGlja01haW5IYW5kbGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU2VydmVyLXNpZGU6IHVzZSBzZXRJbnRlcnZhbCB3aXRoIG1pbmltYWwgZGVsYXkgYXMgYXBwcm94aW1hdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IGludGVydmFsSGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbLCBoYW5kbGVyXSBvZiB0aGlzLmV2ZXJ5VGlja0hhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuYm91bmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcC5jb25zb2xlLmxvZ0Vycm9yKGBFcnJvciBpbiBldmVyeVRpY2sgaGFuZGxlcjogJHtlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpLl9ldmVyeVRpY2tJbnRlcnZhbCA9IHNldEludGVydmFsKGludGVydmFsSGFuZGxlciwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYWdlTVBUaW1lciA9IG5ldyBSYWdlTVBUaW1lcihpZCwgMCwgZmFsc2UsIGNhbGxiYWNrQmluZCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ldmVyeVRpY2tIYW5kbGVycy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgdGhpcy50aW1lcnMuZGVsZXRlKGlkKTtcblxuICAgICAgICAgICAgLy8gU3RvcCB0aGUgdGljayBsb29wIGlmIG5vIG1vcmUgaGFuZGxlcnNcbiAgICAgICAgICAgIGlmICh0aGlzLmV2ZXJ5VGlja0hhbmRsZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNDbGllbnRTaWRlICYmIHRoaXMuZXZlcnlUaWNrTWFpbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbXAuZXZlbnRzLnJlbW92ZSgncmVuZGVyJywgdGhpcy5ldmVyeVRpY2tNYWluSGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlcnlUaWNrTWFpbkhhbmRsZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMgYXMgYW55KS5fZXZlcnlUaWNrSW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCgodGhpcyBhcyBhbnkpLl9ldmVyeVRpY2tJbnRlcnZhbCk7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSkuX2V2ZXJ5VGlja0ludGVydmFsID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pc0V2ZXJ5VGlja1J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudGltZXJzLnNldChpZCwgcmFnZU1QVGltZXIpO1xuICAgICAgICByZXR1cm4gcmFnZU1QVGltZXI7XG4gICAgfVxuXG4gICAgbmV4dFRpY2soY2FsbGJhY2s6IEZ1bmN0aW9uLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnRpbWVySW5jcmVtZW50ZXIrKztcbiAgICAgICAgY29uc3QgY2FsbGJhY2tCaW5kID0gY2FsbGJhY2suYmluZCh0aGlzLCAuLi4oQXJyYXkuaXNBcnJheShhcmdzKSA/IGFyZ3MgOiBbXSkpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIG9uIGNsaWVudC1zaWRlIChyZW5kZXIgZXZlbnQgZXhpc3RzKSBvciBzZXJ2ZXItc2lkZVxuICAgICAgICBjb25zdCBpc0NsaWVudFNpZGUgPSB0eXBlb2YgbXAgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiAobXAgYXMgYW55KS5icm93c2VycyAhPT0gJ3VuZGVmaW5lZCc7XG5cbiAgICAgICAgbGV0IHRpbWVySWQ6IGFueTtcblxuICAgICAgICBpZiAoaXNDbGllbnRTaWRlKSB7XG4gICAgICAgICAgICAvLyBDbGllbnQtc2lkZTogdXNlIHJlbmRlciBldmVudCBmb3IgbmV4dCBmcmFtZVxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0JpbmQoKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBtcC5ldmVudHMucmVtb3ZlKCdyZW5kZXInLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcnMuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbXAuZXZlbnRzLmFkZCgncmVuZGVyJywgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNvbnN0IHJhZ2VNUFRpbWVyID0gbmV3IFJhZ2VNUFRpbWVyKGlkLCAwLCB0cnVlLCBjYWxsYmFja0JpbmQsICgpID0+IHtcbiAgICAgICAgICAgICAgICBtcC5ldmVudHMucmVtb3ZlKCdyZW5kZXInLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVycy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRpbWVycy5zZXQoaWQsIHJhZ2VNUFRpbWVyKTtcbiAgICAgICAgICAgIHJldHVybiByYWdlTVBUaW1lcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFNlcnZlci1zaWRlOiB1c2Ugc2V0SW1tZWRpYXRlIG9yIHNldFRpbWVvdXQoMCkgZm9yIG5leHQgdGlja1xuICAgICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrQmluZCgpO1xuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJhZ2VNUFRpbWVyID0gbmV3IFJhZ2VNUFRpbWVyKGlkLCAwLCB0cnVlLCBjYWxsYmFja0JpbmQsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lcnMuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50aW1lcnMuc2V0KGlkLCByYWdlTVBUaW1lcik7XG4gICAgICAgICAgICByZXR1cm4gcmFnZU1QVGltZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aW1lKF9uYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIC8vIFJhZ2VNUCBkb2Vzbid0IGhhdmUgY29uc29sZS50aW1lIGVxdWl2YWxlbnRcbiAgICAgICAgLy8gQ291bGQgaW1wbGVtZW50IGN1c3RvbSB0aW1pbmcgaWYgbmVlZGVkXG4gICAgfVxuXG4gICAgdGltZUVuZChfbmFtZT86IHN0cmluZykge1xuICAgICAgICAvLyBSYWdlTVAgZG9lc24ndCBoYXZlIGNvbnNvbGUudGltZUVuZCBlcXVpdmFsZW50XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgRXZlbnRFbW1pdGVyLCBNdWx0aXBsYXllclNlcnZpY2UsIE11bHRpcGxheWVyVGltZXJzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSYWdlTVBFdmVudEVtbWl0ZXIgfSBmcm9tICcuL3JhZ2VtcC1ldmVudC1lbW1pdGVyJztcbmltcG9ydCB7IFJhZ2VNUFRpbWVycyB9IGZyb20gJy4vcmFnZW1wLXRpbWVycyc7XG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFJhZ2VNUE11bHRpcGxheWVyU2VydmljZSBpbXBsZW1lbnRzIE11bHRpcGxheWVyU2VydmljZSB7XG4gICAgcmVhZG9ubHkgVGltZXJzOiBNdWx0aXBsYXllclRpbWVycztcbiAgICByZWFkb25seSBFdmVudHM6IEV2ZW50RW1taXRlcjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLkV2ZW50cyA9IG5ldyBSYWdlTVBFdmVudEVtbWl0ZXIoKTtcbiAgICAgICAgdGhpcy5UaW1lcnMgPSBuZXcgUmFnZU1QVGltZXJzKCk7XG4gICAgfVxuXG4gICAgcGFyc2VJbnRlcm5hbEFyZ3M8VSA9IHVua25vd24sIFQgPSB1bmtub3duPihcbiAgICAgICAgLi4uYXJnczogYW55XG4gICAgKToge1xuICAgICAgICBwbGF5ZXI/OiBVO1xuICAgICAgICBib2R5PzogVDtcbiAgICB9IHtcbiAgICAgICAgY29uc3QgcGxheWVyID0gKGlzT2JqZWN0KGFyZ3NbMF0pID8gYXJnc1swXSA6IHVuZGVmaW5lZCkgYXMgVTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGxheWVyLFxuICAgICAgICAgICAgYm9keTogYXJncyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBsb2coYXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbYXJnLCAuLi5hcmdzXS5tYXAoYSA9PlxuICAgICAgICAgICAgdHlwZW9mIGEgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoYSkgOiBTdHJpbmcoYSlcbiAgICAgICAgKS5qb2luKCcgJyk7XG4gICAgICAgIG1wLmNvbnNvbGUubG9nSW5mbyhtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBsb2dFcnJvcihhcmc6IGFueSwgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IFthcmcsIC4uLmFyZ3NdLm1hcChhID0+XG4gICAgICAgICAgICB0eXBlb2YgYSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShhKSA6IFN0cmluZyhhKVxuICAgICAgICApLmpvaW4oJyAnKTtcbiAgICAgICAgbXAuY29uc29sZS5sb2dFcnJvcihtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBsb2dXYXJuaW5nKGFyZzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gW2FyZywgLi4uYXJnc10ubWFwKGEgPT5cbiAgICAgICAgICAgIHR5cGVvZiBhID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGEpIDogU3RyaW5nKGEpXG4gICAgICAgICkuam9pbignICcpO1xuICAgICAgICBtcC5jb25zb2xlLmxvZ1dhcm5pbmcobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgbG9nRGVidWcoYXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIC8vIFJhZ2VNUCBkb2Vzbid0IGhhdmUgYSBkZWRpY2F0ZWQgZGVidWcgbG9nLCB1c2UgaW5mb1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gW2FyZywgLi4uYXJnc10ubWFwKGEgPT5cbiAgICAgICAgICAgIHR5cGVvZiBhID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGEpIDogU3RyaW5nKGEpXG4gICAgICAgICkuam9pbignICcpO1xuICAgICAgICBtcC5jb25zb2xlLmxvZ0luZm8oYFtERUJVR10gJHttZXNzYWdlfWApO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyB2YWxpZGF0ZUVycm9yRmlsdGVyLCB2YWxpZGF0ZUd1YXJkLCB2YWxpZGF0ZUludGVyY2VwdG9yLCB2YWxpZGF0ZVBpcGUgfSBmcm9tICcuLi9zY2hlbWFzL2V2ZW50cyc7XG5pbXBvcnQge1xuICAgIElOVEVSTkFMX0FQUF9DT05UQUlORVIsXG4gICAgR0xPQkFMX0VSUk9SX0ZJTFRFUlMsXG4gICAgR0xPQkFMX0dVQVJEUyxcbiAgICBHTE9CQUxfSU5URVJDRVBUT1JTLFxuICAgIEdMT0JBTF9QSVBFUyxcbiAgICBFTkFCTEVfU0hVVERPV05fSE9PS1MsXG4gICAgUExVR0lOUyxcbiAgICBHTE9CQUxfQVBQX0NPTlRBSU5FUixcbiAgICBBUFBfRU5WSVJPTUVOVCxcbiAgICBNQU5HT19SRVFVRVNUX0ZBQ1RPUlksXG4gICAgTUFOR09fUkVTUE9OU0VfRkFDVE9SWSxcbiAgICBFWEVDVVRJT05fQ09OVEVYVF9GQUNUT1JZLFxuICAgIENPTlRBSU5FUl9PUFRJT05TLFxuICAgIE1VTFRJUExBWUVSX1NFUlZJQ0UsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGluamVjdCwgQ29udGFpbmVyLCBpbmplY3RhYmxlLCB0eXBlIGludGVyZmFjZXMgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgQXBwIH0gZnJvbSAnLi9hcHAnO1xuaW1wb3J0IHR5cGUgeyBFcnJvckZpbHRlciwgR3VhcmQsIEludGVyY2VwdG9yLCBNYW5nb1BsdWdpbiwgTXVsdGlwbGF5ZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgUGlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgICBDb250cm9sbGVyRXZlbnRIYW5kbGVyLFxuICAgIENvbnRyb2xsZXJGbG93SGFuZGxlcixcbiAgICBDb250cm9sbGVyTWV0YWRhdGFSZWFkZXIsXG4gICAgQ29udHJvbGxlclJQQ0hhbmRsZXIsXG4gICAgUGlwZWxpbmVIYW5kbGVyLFxufSBmcm9tICcuL2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgTW9kdWxlLCBNb2R1bGVNZXRhZGF0YVJlYWRlciB9IGZyb20gJy4vbW9kdWxlJztcbmltcG9ydCB7IEFwcFJ1bnRpbWUsIE1vZHVsZURlcGVuZGVuY3lCaW5kZXIsIE1vZHVsZVRyZWVTY2FubmVyIH0gZnJvbSAnLi9tb2R1bGUtdHJlZSc7XG5pbXBvcnQgeyBDb250cm9sbGVyIH0gZnJvbSAnLi9jb250cm9sbGVyJztcbmltcG9ydCB7IEV4ZWN1dGlvbkNvbnRleHRCYXNlLCBNYW5nb1JlcXVlc3RCYXNlLCBNYW5nb1Jlc3BvbnNlQmFzZSB9IGZyb20gJy4vcGlwZWxpbmUnO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0VHlwZSB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgUkVGTEVDVE9SX1NFUlZJQ0UgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgUmVmbGVjdG9yU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzJztcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFwcEJ1aWxkZXI8RyBleHRlbmRzIEd1YXJkID0gR3VhcmQsIEkgZXh0ZW5kcyBJbnRlcmNlcHRvciA9IEludGVyY2VwdG9yLCBFRiBleHRlbmRzIEVycm9yRmlsdGVyID0gRXJyb3JGaWx0ZXI+IHtcbiAgICBAaW5qZWN0KEFQUF9FTlZJUk9NRU5UKSBwcm90ZWN0ZWQgcmVhZG9ubHkgZW52aXJvbWVudDogc3RyaW5nO1xuICAgIEBpbmplY3QoSU5URVJOQUxfQVBQX0NPTlRBSU5FUikgcHJvdGVjdGVkIHJlYWRvbmx5IGludGVybmFsQXBwQ29udGFpbmVyOiBDb250YWluZXI7XG4gICAgQGluamVjdChNVUxUSVBMQVlFUl9TRVJWSUNFKSBwcm90ZWN0ZWQgcmVhZG9ubHkgbXVsdGlwbGF5ZXJTZXJ2aWNlOiBNdWx0aXBsYXllclNlcnZpY2U7XG4gICAgQGluamVjdChQTFVHSU5TKSBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luczogTmV3YWJsZTxNYW5nb1BsdWdpbj5bXTtcblxuICAgIHByaXZhdGUgZ2xvYmFsQ29udGFpbmVyT3B0aW9uczogaW50ZXJmYWNlcy5Db250YWluZXJPcHRpb25zID0ge307XG5cbiAgICBwdWJsaWMgdXNlR2xvYmFsR3VhcmRzKC4uLmd1YXJkczogKE5ld2FibGU8Rz4gfCBHKVtdKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEd1YXJkczogKE5ld2FibGU8Rz4gfCBHKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZ3VhcmQgb2YgZ3VhcmRzKSB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlR3VhcmQoZ3VhcmQpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZEd1YXJkcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChHTE9CQUxfR1VBUkRTKS50b0NvbnN0YW50VmFsdWUodmFsaWRhdGVkR3VhcmRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHVzZUdsb2JhbEludGVyY2VwdG9ycyguLi5pbnRlcmNlcHRvcnM6IChOZXdhYmxlPEk+IHwgSSlbXSkge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRJbnRlcmNlcHRvcnM6IChOZXdhYmxlPEk+IHwgSSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGludGVyY2VwdG9yIG9mIGludGVyY2VwdG9ycykge1xuICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZUludGVyY2VwdG9yKGludGVyY2VwdG9yKTtcbiAgICAgICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB2YWxpZGF0ZWRJbnRlcmNlcHRvcnMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoR0xPQkFMX0lOVEVSQ0VQVE9SUykudG9Db25zdGFudFZhbHVlKHZhbGlkYXRlZEludGVyY2VwdG9ycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB1c2VHbG9iYWxQaXBlcyguLi5waXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZFBpcGVzOiAoTmV3YWJsZTxQaXBlPiB8IFBpcGUpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwaXBlIG9mIHBpcGVzKSB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlUGlwZShwaXBlKTtcbiAgICAgICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB2YWxpZGF0ZWRQaXBlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChHTE9CQUxfUElQRVMpLnRvQ29uc3RhbnRWYWx1ZSh2YWxpZGF0ZWRQaXBlcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB1c2VHbG9iYWxGaWx0ZXJzKC4uLmZpbHRlcnM6IChOZXdhYmxlPEVGPiB8IEVGKVtdKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEZJbHRlcnM6IChOZXdhYmxlPEVGPiB8IEVGKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGZpbHRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVFcnJvckZpbHRlcihmaWx0ZXIpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZEZJbHRlcnMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoR0xPQkFMX0VSUk9SX0ZJTFRFUlMpLnRvQ29uc3RhbnRWYWx1ZSh2YWxpZGF0ZWRGSWx0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHVzZVBsdWdpbnMoLi4ucGx1Z2luczogTmV3YWJsZTxNYW5nb1BsdWdpbj5bXSkge1xuICAgICAgICBwbHVnaW5zLmZvckVhY2goKHApID0+IHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChwKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCkpO1xuICAgICAgICBjb25zdCBpbnRlcm5hbFBsdWdpbnMgPSB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmdldDxOZXdhYmxlPE1hbmdvUGx1Z2luPltdPihQTFVHSU5TKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5yZWJpbmQoUExVR0lOUykudG9Db25zdGFudFZhbHVlKFsuLi5pbnRlcm5hbFBsdWdpbnMsIC4uLnBsdWdpbnNdKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGVuYWJsZVNodXRkb3duSG9va3MoKSB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChFTkFCTEVfU0hVVERPV05fSE9PS1MpLnRvQ29uc3RhbnRWYWx1ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbnRhaW5lck9wdGlvbnMob3B0aW9uczogaW50ZXJmYWNlcy5Db250YWluZXJPcHRpb25zLCBvbmx5R2xvYmFsID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5nbG9iYWxDb250YWluZXJPcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgaWYgKG9ubHlHbG9iYWwpIHJldHVybiB0aGlzO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoQ09OVEFJTkVSX09QVElPTlMpLnRvQ29uc3RhbnRWYWx1ZShvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJ1aWxkKCkge1xuICAgICAgICBjb25zdCBnbG9iYWxBcHBDb250YWluZXIgPSBuZXcgQ29udGFpbmVyKHRoaXMuZ2xvYmFsQ29udGFpbmVyT3B0aW9ucyk7XG4gICAgICAgIC8vIEdMb2JhbCBzZXJ2aWNlIGJpbmRpbmdzXG4gICAgICAgIGdsb2JhbEFwcENvbnRhaW5lci5iaW5kKFJFRkxFQ1RPUl9TRVJWSUNFKS50b0NvbnN0YW50VmFsdWUoUmVmbGVjdG9yU2VydmljZSk7XG4gICAgICAgIGdsb2JhbEFwcENvbnRhaW5lci5iaW5kKFJlZmxlY3RvclNlcnZpY2UpLnRvU2VydmljZShSRUZMRUNUT1JfU0VSVklDRSk7XG5cbiAgICAgICAgLy8gTXVsdGlwbGF5ZXIgc2VydmljZSBiaW5kaW5nc1xuICAgICAgICBnbG9iYWxBcHBDb250YWluZXIuYmluZChNVUxUSVBMQVlFUl9TRVJWSUNFKS50b0NvbnN0YW50VmFsdWUodGhpcy5tdWx0aXBsYXllclNlcnZpY2UpO1xuIFxuICAgICAgICAvLyBBcHAgYmluZGluZ3NcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEFwcCkudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoR0xPQkFMX0FQUF9DT05UQUlORVIpLnRvQ29uc3RhbnRWYWx1ZShnbG9iYWxBcHBDb250YWluZXIpO1xuXG4gICAgICAgIC8vIE1vZHVsZSB0cmVlIGJpbmRpbmdzXG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChNb2R1bGVUcmVlU2Nhbm5lcikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoTW9kdWxlRGVwZW5kZW5jeUJpbmRlcikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoQXBwUnVudGltZSkudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuXG4gICAgICAgIC8vIEFwcCBiaW5kaW5nc1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoUGlwZWxpbmVIYW5kbGVyKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG5cbiAgICAgICAgLy8gTW9kdWxlIGJpbmRpbmdzXG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChNb2R1bGUpLnRvU2VsZigpLmluVHJhbnNpZW50U2NvcGUoKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKE1vZHVsZU1ldGFkYXRhUmVhZGVyKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG5cbiAgICAgICAgLy8gQ29udHJvbGxlciBiaW5kaW5nc1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoQ29udHJvbGxlcikudG9TZWxmKCkuaW5UcmFuc2llbnRTY29wZSgpO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoQ29udHJvbGxlck1ldGFkYXRhUmVhZGVyKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChDb250cm9sbGVyRmxvd0hhbmRsZXIpLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKENvbnRyb2xsZXJFdmVudEhhbmRsZXIpLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKENvbnRyb2xsZXJSUENIYW5kbGVyKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG5cbiAgICAgICAgLy8gTWFuZ28gUmVxdWVzdCBhbmQgUmVzcG9uc2UgYmluZGluZ3NcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKE1hbmdvUmVxdWVzdEJhc2UpLnRvU2VsZigpLmluVHJhbnNpZW50U2NvcGUoKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKE1BTkdPX1JFUVVFU1RfRkFDVE9SWSkudG9GYWN0b3J5KChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKGJvZHk6IHVua25vd24sIHBsYXllcjogUGxheWVyTXApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gY29udGV4dC5jb250YWluZXIuZ2V0KE1hbmdvUmVxdWVzdEJhc2UpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3QuJGJvZHkgPSBib2R5O1xuICAgICAgICAgICAgICAgIHJlcXVlc3QuJHBsYXllciA9IHBsYXllcjtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoTWFuZ29SZXNwb25zZUJhc2UpLnRvU2VsZigpLmluVHJhbnNpZW50U2NvcGUoKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKE1BTkdPX1JFU1BPTlNFX0ZBQ1RPUlkpLnRvRmFjdG9yeSgoY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jb250YWluZXIuZ2V0KE1hbmdvUmVzcG9uc2VCYXNlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoRXhlY3V0aW9uQ29udGV4dEJhc2UpLnRvU2VsZigpLmluVHJhbnNpZW50U2NvcGUoKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEVYRUNVVElPTl9DT05URVhUX0ZBQ1RPUlkpLnRvRmFjdG9yeSgoY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0eXBlOiBFeGVjdXRpb25Db250ZXh0VHlwZSxcbiAgICAgICAgICAgICAgICBjbGFzc1JlZjogTmV3YWJsZSxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBGdW5jdGlvbixcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiBNYW5nb1JlcXVlc3RCYXNlLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBNYW5nb1Jlc3BvbnNlQmFzZSxcbiAgICAgICAgICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gY29udGV4dC5jb250YWluZXIuZ2V0KEV4ZWN1dGlvbkNvbnRleHRCYXNlKTtcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LiR0eXBlID0gdHlwZTtcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LiRyZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LiRyZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQuJGhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQuJGNsYXNzUmVmID0gY2xhc3NSZWY7XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dC4kbmFtZSA9IG5hbWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGlvbkNvbnRleHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQbHVnaW5zIGJpbmRpbmdzXG4gICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucykge1xuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKHBsdWdpbikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuICAgICAgICAgICAgY29uc3QgcGx1Z2luSW5zdGFuY2UgPSB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmdldChwbHVnaW4pO1xuICAgICAgICAgICAgaWYgKCFwbHVnaW5JbnN0YW5jZS5vbkJ1aWxkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGF3YWl0IHBsdWdpbkluc3RhbmNlLm9uQnVpbGQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5pc0JvdW5kKEdMT0JBTF9HVUFSRFMpKSB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoR0xPQkFMX0dVQVJEUykudG9Db25zdGFudFZhbHVlKFtdKTtcbiAgICAgICAgaWYgKCF0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmlzQm91bmQoR0xPQkFMX0lOVEVSQ0VQVE9SUykpXG4gICAgICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoR0xPQkFMX0lOVEVSQ0VQVE9SUykudG9Db25zdGFudFZhbHVlKFtdKTtcbiAgICAgICAgaWYgKCF0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmlzQm91bmQoR0xPQkFMX1BJUEVTKSkgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEdMT0JBTF9QSVBFUykudG9Db25zdGFudFZhbHVlKFtdKTtcbiAgICAgICAgaWYgKCF0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmlzQm91bmQoR0xPQkFMX0VSUk9SX0ZJTFRFUlMpKVxuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEdMT0JBTF9FUlJPUl9GSUxURVJTKS50b0NvbnN0YW50VmFsdWUoW10pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmdldChBcHApO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBDb250YWluZXIsIGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBNb2R1bGVEZXBlbmRlbmN5QmluZGVyLCBNb2R1bGVUcmVlU2Nhbm5lciB9IGZyb20gJy4vbW9kdWxlLXRyZWUnO1xuaW1wb3J0IHsgTW9kdWxlIH0gZnJvbSAnLi9tb2R1bGUvbW9kdWxlJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IElOVEVSTkFMX0FQUF9DT05UQUlORVIsIFBMVUdJTlMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBcHBSdW50aW1lIH0gZnJvbSAnLi9tb2R1bGUtdHJlZSc7XG5pbXBvcnQgdHlwZSB7IE1hbmdvUGx1Z2luIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NvcmUvbWFuZ28tcGx1Z2luLmludGVyZmFjZSc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IFRyZWUgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IHR5cGUgTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTE9HR0VSX1NFUlZJQ0UgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXBwIHtcbiAgICBAaW5qZWN0KE1vZHVsZVRyZWVTY2FubmVyKSBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZVRyZWVTY2FubmVyOiBNb2R1bGVUcmVlU2Nhbm5lcjtcbiAgICBAaW5qZWN0KE1vZHVsZURlcGVuZGVuY3lCaW5kZXIpIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlRGVwZW5kZW5jeUJpbmRlcjogTW9kdWxlRGVwZW5kZW5jeUJpbmRlcjtcbiAgICBAaW5qZWN0KEFwcFJ1bnRpbWUpIHByaXZhdGUgcmVhZG9ubHkgYXBwUnVudGltZTogQXBwUnVudGltZTtcbiAgICBAaW5qZWN0KElOVEVSTkFMX0FQUF9DT05UQUlORVIpIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJuYWxBcHBDb250YWluZXI6IENvbnRhaW5lcjtcbiAgICBAaW5qZWN0KFBMVUdJTlMpIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luczogTmV3YWJsZTxNYW5nb1BsdWdpbj5bXTtcbiAgICBAaW5qZWN0KExPR0dFUl9TRVJWSUNFKSBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlclNlcnZpY2U6IExvZ2dlclNlcnZpY2U7XG4gICAgcHJpdmF0ZSBtb2R1bGVUcmVlOiBUcmVlPE1vZHVsZT47XG4gICAgcHJpdmF0ZSBsb2FkZWQgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBhc3luYyBzdGFydDxUPihyb290TW9kdWxlOiBOZXdhYmxlPFQ+KSB7XG4gICAgICAgIGlmICh0aGlzLmxvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBzdGFydGluZyB0aGUgYXBwLicpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BcHBBbHJlYWR5TG9hZGVkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKCd+bHd+U3RhcnRpbmcgYXBwLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuUGx1Z2luTWV0aG9kcygnYmVmb3JlU3RhcnQnKTtcblxuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKCd+bHd+U2Nhbm5pbmcgbW9kdWxlIHRyZWUuLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5QbHVnaW5NZXRob2RzKCdiZWZvcmVTY2FuJyk7XG4gICAgICAgIHRoaXMubW9kdWxlVHJlZSA9IGF3YWl0IHRoaXMubW9kdWxlVHJlZVNjYW5uZXIuc2Nhbihyb290TW9kdWxlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5QbHVnaW5NZXRob2RzKCdhZnRlclNjYW4nKTtcblxuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKCd+bHd+QmluZGluZyBtb2R1bGUgZGVwZW5kZW5jaWVzLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuUGx1Z2luTWV0aG9kcygnYmVmb3JlQmluZCcpO1xuICAgICAgICBhd2FpdCB0aGlzLm1vZHVsZURlcGVuZGVuY3lCaW5kZXIuYmluZCh0aGlzLm1vZHVsZVRyZWUpO1xuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2FmdGVyQmluZCcpO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2coJ35sd35Mb2FkaW5nIGFwcC4uLicpO1xuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2JlZm9yZUxvYWQnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHBSdW50aW1lLmJvb3QodGhpcy5tb2R1bGVUcmVlKTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2FmdGVyTG9hZCcpO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2coJ35sd35BcHAgbG9hZGVkJyk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5ydW5QbHVnaW5NZXRob2RzKCdhZnRlclN0YXJ0Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN0b3AoKSB7XG4gICAgICAgIGlmICghdGhpcy5sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgc3RvcHBpbmcgdGhlIGFwcC4nKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuQXBwTm90TG9hZGVkKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2JlZm9yZVN0b3AnKTtcbiAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZygnfmx3flN0b3BwaW5nIGFwcC4uLicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFwcFJ1bnRpbWUuc2h1dGRvd24odGhpcy5tb2R1bGVUcmVlKTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZygnfmx3fkFwcCBzdG9wcGVkJyk7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuUGx1Z2luTWV0aG9kcygnYWZ0ZXJTdG9wJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5QbHVnaW5NZXRob2RzKG1ldGhvZDoga2V5b2YgTWFuZ29QbHVnaW4pIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMubWFwKGFzeW5jIChwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5nZXQocCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwbHVnaW5bbWV0aG9kXSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocGx1Z2luW21ldGhvZF0hKCkpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBBUFBfRU5WSVJPTUVOVCwgSU5URVJOQUxfQVBQX0NPTlRBSU5FUiwgTVVMVElQTEFZRVJfU0VSVklDRSwgUExVR0lOUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgTWFuZ29QbHVnaW4sIE11bHRpcGxheWVyU2VydmljZSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IEFwcEVudmlyb21lbnQgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB0eXBlIHsgQXBwQnVpbGRlciB9IGZyb20gJy4vYXBwLWJ1aWxkZXInO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXBwQnVpbGRlcjxUIGV4dGVuZHMgQXBwQnVpbGRlcj4oe1xuICAgIGVudmlyb21lbnQsXG4gICAgcGx1Z2lucyxcbiAgICBhcHBCdWlsZGVySW5oZXJpdCxcbiAgICBtdWx0aXBsYXllclNlcnZpY2UsXG59OiB7XG4gICAgZW52aXJvbWVudDogQXBwRW52aXJvbWVudDtcbiAgICBwbHVnaW5zOiBOZXdhYmxlPE1hbmdvUGx1Z2luPltdO1xuICAgIGFwcEJ1aWxkZXJJbmhlcml0OiBOZXdhYmxlPFQ+O1xuICAgIG11bHRpcGxheWVyU2VydmljZT86IE11bHRpcGxheWVyU2VydmljZTtcbn0pIHtcbiAgICBjb25zdCBpbnRlcm5hbEFwcENvbnRhaW5lciA9IG5ldyBDb250YWluZXIoKTtcblxuICAgIGlmIChtdWx0aXBsYXllclNlcnZpY2UpIGludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoTVVMVElQTEFZRVJfU0VSVklDRSkudG9Db25zdGFudFZhbHVlKG11bHRpcGxheWVyU2VydmljZSk7XG4gICAgaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChJTlRFUk5BTF9BUFBfQ09OVEFJTkVSKS50b0NvbnN0YW50VmFsdWUoaW50ZXJuYWxBcHBDb250YWluZXIpO1xuICAgIGludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoQVBQX0VOVklST01FTlQpLnRvQ29uc3RhbnRWYWx1ZShlbnZpcm9tZW50KTtcbiAgICBpbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKFBMVUdJTlMpLnRvQ29uc3RhbnRWYWx1ZShwbHVnaW5zKTtcbiAgICBpbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKGFwcEJ1aWxkZXJJbmhlcml0KS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG5cbiAgICByZXR1cm4gaW50ZXJuYWxBcHBDb250YWluZXIuZ2V0KGFwcEJ1aWxkZXJJbmhlcml0KTtcbn1cbiIsICJpbXBvcnQgeyBpc05pbCwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXksIHR5cGUgRXZlbnRNZXRhZGF0YSwgdHlwZSBQaXBlbGluZU1ldGFkYXRhIH0gZnJvbSAnLi4vYXBwJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uL2VudW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50RGVjb3JhdG9yKHR5cGU6IEV2ZW50TWV0YWRhdGFbJ3R5cGUnXSwgbmFtZT86IHN0cmluZywgd2ViVmlld0lkPzogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgcmV0dXJuIDxNZXRob2REZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKCFpc05pbChuYW1lKSAmJiAhaXNTdHJpbmcobmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuRXZlbnROYW1lTXVzdEJlU3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5hbWUgPSBuYW1lID8/IG1ldGhvZDtcblxuICAgICAgICBjb25zdCBldmVudHMgPVxuICAgICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YTxPbWl0PEV2ZW50TWV0YWRhdGEsICdwYXJhbXMnIHwga2V5b2YgUGlwZWxpbmVNZXRhZGF0YT5bXT4oQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJFdmVudHMsIHRhcmdldCkgPz8gW107XG5cbiAgICAgICAgaWYgKGV2ZW50cy5zb21lKChldmVudCkgPT4gZXZlbnQubWV0aG9kID09PSBtZXRob2QgJiYgZXZlbnQubmFtZSA9PT0gbmFtZSAmJiBldmVudC50eXBlID09PSB0eXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5FdmVudE5hbWVNdXN0QmVVbmlxdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YTxPbWl0PEV2ZW50TWV0YWRhdGEsICdwYXJhbXMnIHwga2V5b2YgUGlwZWxpbmVNZXRhZGF0YT5bXT4oXG4gICAgICAgICAgICBDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlckV2ZW50cyxcbiAgICAgICAgICAgIFsuLi5ldmVudHMsIHsgbWV0aG9kLCBuYW1lLCB0eXBlLCB3ZWJWaWV3SWQgfV0sXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICk7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlRXZlbnREZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtZXZlbnQtZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIE9uSW50ZXJuYWwoZXZlbnROYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlRXZlbnREZWNvcmF0b3IoJ29uSW50ZXJuYWwnLCBldmVudE5hbWUpO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUV2ZW50RGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLWV2ZW50LWRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBPbldlYlZpZXcoaWQ6IHN0cmluZyB8IG51bWJlciwgZXZlbnROYW1lPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUV2ZW50RGVjb3JhdG9yKCdvbldlYlZpZXcnLCBldmVudE5hbWUsIGlkKTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVFdmVudERlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS1ldmVudC1kZWNvcmF0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gT24oZXZlbnROYW1lPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUV2ZW50RGVjb3JhdG9yKCdvbicsIGV2ZW50TmFtZSk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlRXZlbnREZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtZXZlbnQtZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIE9uY2VJbnRlcm5hbChldmVudE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBjcmVhdGVFdmVudERlY29yYXRvcignb25jZUludGVybmFsJywgZXZlbnROYW1lKTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVFdmVudERlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS1ldmVudC1kZWNvcmF0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gT25jZShldmVudE5hbWU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlRXZlbnREZWNvcmF0b3IoJ29uY2UnLCBldmVudE5hbWUpO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUV2ZW50RGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLWV2ZW50LWRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBPbmNlV2ViVmlldyhpZDogc3RyaW5nIHwgbnVtYmVyLCBldmVudE5hbWU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlRXZlbnREZWNvcmF0b3IoJ29uY2VXZWJWaWV3JywgZXZlbnROYW1lLCBpZCk7XG59XG4iLCAiaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgTWV0aG9kUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vYXBwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTWV0aG9kUGFyYW1UeXBlIH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgUGlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVQaXBlIH0gZnJvbSAnLi4vLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBCb2R5KC4uLnBpcGVzOiAoTmV3YWJsZTxQaXBlPiB8IFBpcGUpW10pIHtcbiAgICByZXR1cm4gPFBhcmFtZXRlckRlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRQaXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGlwZSBvZiBwaXBlcykge1xuICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZVBpcGUocGlwZSk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdmFsaWRhdGVkUGlwZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcywgdGFyZ2V0LCBtZXRob2QpID8/IFtdO1xuXG4gICAgICAgIGlmIChwYXJhbXMuc29tZSgocGFyYW0pID0+IHBhcmFtLmluZGV4ID09PSBpbmRleCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmFtVHlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGVbXT4oJ2Rlc2lnbjpwYXJhbXR5cGVzJywgdGFyZ2V0LCBtZXRob2QpO1xuICAgICAgICBjb25zdCBtZXRhdHlwZSA9IEFycmF5LmlzQXJyYXkocGFyYW1UeXBlcykgPyBwYXJhbVR5cGVzW2luZGV4XSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihcbiAgICAgICAgICAgIENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUGFyYW1zLFxuICAgICAgICAgICAgWy4uLnBhcmFtcywgeyBpbmRleCwgbWV0aG9kLCBwaXBlczogdmFsaWRhdGVkUGlwZXMsIHR5cGU6IE1ldGhvZFBhcmFtVHlwZS5Cb2R5LCBkYXRhOiB1bmRlZmluZWQsIG1ldGF0eXBlIH1dLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICApO1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IENvcmVNZXRhZGF0YUtleSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IE1ldGhvZFBhcmFtZXRlciB9IGZyb20gJy4uLy4uL2FwcC9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1ldGhvZFBhcmFtVHlwZSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IFBpcGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgdmFsaWRhdGVQaXBlIH0gZnJvbSAnLi4vLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBJbmRleChrZXk6IG51bWJlciwgLi4ucGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSkge1xuICAgIHJldHVybiA8UGFyYW1ldGVyRGVjb3JhdG9yPigodGFyZ2V0OiBPYmplY3QsIG1ldGhvZDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICghaXNOdW1iZXIoa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5JbmRleEtleU11c3RCZU51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsaWRhdGVkUGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBpcGUgb2YgcGlwZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVQaXBlKHBpcGUpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZFBpcGVzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsIHRhcmdldCwgbWV0aG9kKSA/PyBbXTtcblxuICAgICAgICBpZiAocGFyYW1zLnNvbWUoKHBhcmFtKSA9PiBwYXJhbS5pbmRleCA9PT0gaW5kZXgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbVR5cGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlW10+KCdkZXNpZ246cGFyYW10eXBlcycsIHRhcmdldCwgbWV0aG9kKTtcbiAgICAgICAgY29uc3QgbWV0YXR5cGUgPSBBcnJheS5pc0FycmF5KHBhcmFtVHlwZXMpID8gcGFyYW1UeXBlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oXG4gICAgICAgICAgICBDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcyxcbiAgICAgICAgICAgIFsuLi5wYXJhbXMsIHsgaW5kZXgsIG1ldGhvZCwgcGlwZXM6IHZhbGlkYXRlZFBpcGVzLCB0eXBlOiBNZXRob2RQYXJhbVR5cGUuSW5kZXgsIGRhdGE6IGtleSwgbWV0YXR5cGUgfV0sXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICk7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgTWV0aG9kUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vYXBwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTWV0aG9kUGFyYW1UeXBlIH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIFJlcXVlc3QoKSB7XG4gICAgcmV0dXJuIDxQYXJhbWV0ZXJEZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsIHRhcmdldCwgbWV0aG9kKSA/PyBbXTtcblxuICAgICAgICBpZiAocGFyYW1zLnNvbWUoKHBhcmFtKSA9PiBwYXJhbS5pbmRleCA9PT0gaW5kZXgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbVR5cGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlW10+KCdkZXNpZ246cGFyYW10eXBlcycsIHRhcmdldCwgbWV0aG9kKTtcbiAgICAgICAgY29uc3QgbWV0YXR5cGUgPSBBcnJheS5pc0FycmF5KHBhcmFtVHlwZXMpID8gcGFyYW1UeXBlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oXG4gICAgICAgICAgICBDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcyxcbiAgICAgICAgICAgIFsuLi5wYXJhbXMsIHsgaW5kZXgsIG1ldGhvZCwgdHlwZTogTWV0aG9kUGFyYW1UeXBlLlJlcXVlc3QsIGRhdGE6IHVuZGVmaW5lZCwgbWV0YXR5cGUgfV0sXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXEoKSB7XG4gICAgcmV0dXJuIFJlcXVlc3QoKTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBNZXRob2RQYXJhbWV0ZXIgfSBmcm9tICcuLi8uLi9hcHAvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNZXRob2RQYXJhbVR5cGUgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IFBpcGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHZhbGlkYXRlUGlwZSB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gUGFyYW0oa2V5OiBzdHJpbmcsIC4uLnBpcGVzOiAoTmV3YWJsZTxQaXBlPiB8IFBpcGUpW10pIHtcbiAgICByZXR1cm4gPFBhcmFtZXRlckRlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAoIWlzU3RyaW5nKGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuUGFyYW1LZXlNdXN0QmVTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZFBpcGVzOiAoTmV3YWJsZTxQaXBlPiB8IFBpcGUpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwaXBlIG9mIHBpcGVzKSB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlUGlwZShwaXBlKTtcbiAgICAgICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB2YWxpZGF0ZWRQaXBlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TWV0aG9kUGFyYW1ldGVyW10+KENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUGFyYW1zLCB0YXJnZXQsIG1ldGhvZCkgPz8gW107XG5cbiAgICAgICAgaWYgKHBhcmFtcy5zb21lKChwYXJhbSkgPT4gcGFyYW0uaW5kZXggPT09IGluZGV4KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5NdWx0aXBsZURlY29yYXRvcnNPblNpbmdsZVBhcmFtZXRlck5vdEFsbG93ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1UeXBlcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZVtdPignZGVzaWduOnBhcmFtdHlwZXMnLCB0YXJnZXQsIG1ldGhvZCk7XG4gICAgICAgIGNvbnN0IG1ldGF0eXBlID0gQXJyYXkuaXNBcnJheShwYXJhbVR5cGVzKSA/IHBhcmFtVHlwZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGE8TWV0aG9kUGFyYW1ldGVyW10+KFxuICAgICAgICAgICAgQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsXG4gICAgICAgICAgICBbLi4ucGFyYW1zLCB7IGluZGV4LCBtZXRob2QsIGRhdGE6IGtleSwgcGlwZXM6IHZhbGlkYXRlZFBpcGVzLCB0eXBlOiBNZXRob2RQYXJhbVR5cGUuUGFyYW0sIG1ldGF0eXBlIH1dLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICApO1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IENvcmVNZXRhZGF0YUtleSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IE1ldGhvZFBhcmFtZXRlciB9IGZyb20gJy4uLy4uL2FwcC9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1ldGhvZFBhcmFtVHlwZSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXNwb25zZSgpIHtcbiAgICByZXR1cm4gPFBhcmFtZXRlckRlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcywgdGFyZ2V0LCBtZXRob2QpID8/IFtdO1xuXG4gICAgICAgIGlmIChwYXJhbXMuc29tZSgocGFyYW0pID0+IHBhcmFtLmluZGV4ID09PSBpbmRleCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmFtVHlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGVbXT4oJ2Rlc2lnbjpwYXJhbXR5cGVzJywgdGFyZ2V0LCBtZXRob2QpO1xuICAgICAgICBjb25zdCBtZXRhdHlwZSA9IEFycmF5LmlzQXJyYXkocGFyYW1UeXBlcykgPyBwYXJhbVR5cGVzW2luZGV4XSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihcbiAgICAgICAgICAgIENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUGFyYW1zLFxuICAgICAgICAgICAgWy4uLnBhcmFtcywgeyBpbmRleCwgbWV0aG9kLCB0eXBlOiBNZXRob2RQYXJhbVR5cGUuUmVzcG9uc2UsIGRhdGE6IHVuZGVmaW5lZCwgbWV0YXR5cGUgfV0sXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXMoKSB7XG4gICAgcmV0dXJuIFJlc3BvbnNlKCk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBHdWFyZCB9IGZyb20gJy4uLy4uL2FwcC9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IHZhbGlkYXRlR3VhcmQgfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcblxuZXhwb3J0IGZ1bmN0aW9uIFVzZUd1YXJkcyguLi5ndWFyZHM6IChOZXdhYmxlPEd1YXJkPiB8IEd1YXJkKVtdKSB7XG4gICAgcmV0dXJuIDxDbGFzc0RlY29yYXRvciAmIE1ldGhvZERlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q/OiBzdHJpbmcsIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkR3VhcmRzOiAoTmV3YWJsZTxHdWFyZD4gfCBHdWFyZClbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGd1YXJkIG9mIGd1YXJkcykge1xuICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZUd1YXJkKGd1YXJkKTtcbiAgICAgICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB2YWxpZGF0ZWRHdWFyZHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmlsKGRlc2NyaXB0b3IpICYmICFpc05pbChkZXNjcmlwdG9yLnZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKGd1YXJkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkF0TGVhc3RPbmVHdWFyZFJlcXVpcmVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWV0aG9kR3VhcmRzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlPEd1YXJkPltdPihDb3JlTWV0YWRhdGFLZXkuR3VhcmRzLCB0YXJnZXQuY29uc3RydWN0b3IsIG1ldGhvZCkgfHwgW107XG4gICAgICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5HdWFyZHMsIFsuLi52YWxpZGF0ZWRHdWFyZHMsIC4uLm1ldGhvZEd1YXJkc10sIHRhcmdldC5jb25zdHJ1Y3RvciwgbWV0aG9kKTtcbiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGd1YXJkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuQXRMZWFzdE9uZUd1YXJkUmVxdWlyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhc3NHdWFyZHMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGU8R3VhcmQ+W10+KENvcmVNZXRhZGF0YUtleS5HdWFyZHMsIHRhcmdldCkgfHwgW107XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5Lkd1YXJkcywgWy4uLnZhbGlkYXRlZEd1YXJkcywgLi4uY2xhc3NHdWFyZHNdLCB0YXJnZXQpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgSW50ZXJjZXB0b3IgfSBmcm9tICcuLi8uLi9hcHAvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBpc05pbCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IENvcmVNZXRhZGF0YUtleSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9lbnVtcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUludGVyY2VwdG9yIH0gZnJvbSAnLi4vLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzOiAoTmV3YWJsZTxJbnRlcmNlcHRvcj4gfCBJbnRlcmNlcHRvcilbXSkge1xuICAgIHJldHVybiA8Q2xhc3NEZWNvcmF0b3IgJiBNZXRob2REZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kPzogc3RyaW5nLCBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEludGVyY2VwdG9yczogKE5ld2FibGU8SW50ZXJjZXB0b3I+IHwgSW50ZXJjZXB0b3IpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiBpbnRlcmNlcHRvcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdmFsaWRhdGVkSW50ZXJjZXB0b3JzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc05pbChkZXNjcmlwdG9yKSAmJiAhaXNOaWwoZGVzY3JpcHRvci52YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmIChpbnRlcmNlcHRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BdExlYXN0T25lSW50ZXJjZXB0b3JSZXF1aXJlZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZEludGVyY2VwdG9ycyA9XG4gICAgICAgICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlPEludGVyY2VwdG9yPltdPihDb3JlTWV0YWRhdGFLZXkuSW50ZXJjZXB0b3JzLCB0YXJnZXQuY29uc3RydWN0b3IsIG1ldGhvZCkgfHwgW107XG4gICAgICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICAgICAgICAgIENvcmVNZXRhZGF0YUtleS5JbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICAgICAgWy4uLnZhbGlkYXRlZEludGVyY2VwdG9ycywgLi4ubWV0aG9kSW50ZXJjZXB0b3JzXSxcbiAgICAgICAgICAgICAgICB0YXJnZXQuY29uc3RydWN0b3IsXG4gICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGludGVyY2VwdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuQXRMZWFzdE9uZUludGVyY2VwdG9yUmVxdWlyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhc3NJbnRlcmNlcHRvcnMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGU8SW50ZXJjZXB0b3I+W10+KENvcmVNZXRhZGF0YUtleS5JbnRlcmNlcHRvcnMsIHRhcmdldCkgfHwgW107XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkludGVyY2VwdG9ycywgWy4uLnZhbGlkYXRlZEludGVyY2VwdG9ycywgLi4uY2xhc3NJbnRlcmNlcHRvcnNdLCB0YXJnZXQpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgUGlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVQaXBlIH0gZnJvbSAnLi4vLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VQaXBlcyguLi5waXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdKSB7XG4gICAgcmV0dXJuIDxDbGFzc0RlY29yYXRvciAmIE1ldGhvZERlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q/OiBzdHJpbmcsIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkUGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBpcGUgb2YgcGlwZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVQaXBlKHBpcGUpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZFBpcGVzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc05pbChkZXNjcmlwdG9yKSAmJiAhaXNOaWwoZGVzY3JpcHRvci52YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmIChwaXBlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkF0TGVhc3RPbmVQaXBlUmVxdWlyZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtZXRob2RQaXBlcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZTxQaXBlPltdPihDb3JlTWV0YWRhdGFLZXkuUGlwZXMsIHRhcmdldC5jb25zdHJ1Y3RvciwgbWV0aG9kKSB8fCBbXTtcbiAgICAgICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LlBpcGVzLCBbLi4udmFsaWRhdGVkUGlwZXMsIC4uLm1ldGhvZFBpcGVzXSwgdGFyZ2V0LmNvbnN0cnVjdG9yLCBtZXRob2QpO1xuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGlwZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkF0TGVhc3RPbmVQaXBlUmVxdWlyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhc3NQaXBlcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZTxQaXBlPltdPihDb3JlTWV0YWRhdGFLZXkuUGlwZXMsIHRhcmdldCkgfHwgW107XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LlBpcGVzLCBbLi4udmFsaWRhdGVkUGlwZXMsIC4uLmNsYXNzUGlwZXNdLCB0YXJnZXQpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IGlzTmlsLCBpc051bWJlciwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXksIHR5cGUgUGlwZWxpbmVNZXRhZGF0YSwgdHlwZSBSUENNZXRhZGF0YSB9IGZyb20gJy4uL2FwcCc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9lbnVtcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSUENEZWNvcmF0b3IodHlwZTogUlBDTWV0YWRhdGFbJ3R5cGUnXSwgbmFtZT86IHN0cmluZywgd2ViVmlld0lkPzogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgcmV0dXJuIDxNZXRob2REZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKCFpc05pbCh3ZWJWaWV3SWQpICYmICFpc1N0cmluZyh3ZWJWaWV3SWQpICYmICFpc051bWJlcih3ZWJWaWV3SWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLldlYlZpZXdJZE11c3RCZVN0cmluZ09yTnVtYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNOaWwobmFtZSkgJiYgIWlzU3RyaW5nKG5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLlJQQ05hbWVNdXN0QmVTdHJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmFtZSA9IG5hbWUgPz8gbWV0aG9kO1xuXG4gICAgICAgIGNvbnN0IHJwY3MgPVxuICAgICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YTxPbWl0PFJQQ01ldGFkYXRhLCAncGFyYW1zJyB8IGtleW9mIFBpcGVsaW5lTWV0YWRhdGE+W10+KENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUlBDcywgdGFyZ2V0KSA/PyBbXTtcblxuICAgICAgICBpZiAocnBjcy5zb21lKChycGMpID0+IHJwYy5tZXRob2QgPT09IG1ldGhvZCAmJiBycGMubmFtZSA9PT0gbmFtZSAmJiBycGMudHlwZSA9PT0gdHlwZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuUlBDTmFtZU11c3RCZVVuaXF1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhPE9taXQ8UlBDTWV0YWRhdGEsICdwYXJhbXMnIHwga2V5b2YgUGlwZWxpbmVNZXRhZGF0YT5bXT4oXG4gICAgICAgICAgICBDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclJQQ3MsXG4gICAgICAgICAgICBbLi4ucnBjcywgeyBtZXRob2QsIG5hbWUsIHR5cGUsIHdlYlZpZXdJZCB9XSxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgKTtcbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVSUENEZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtcnBjLWRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBPblJlcXVlc3QocnBjTmFtZT86IHN0cmluZykge1xuICAgIHJldHVybiBjcmVhdGVSUENEZWNvcmF0b3IoJ29uUmVxdWVzdCcsIHJwY05hbWUpO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZVJQQ0RlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS1ycGMtZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIE9uV2ViVmlld1JlcXVlc3QoaWQ6IHN0cmluZyB8IG51bWJlciwgcnBjTmFtZT86IHN0cmluZykge1xuICAgIHJldHVybiBjcmVhdGVSUENEZWNvcmF0b3IoJ29uV2ViVmlld1JlcXVlc3QnLCBycGNOYW1lLCBpZCk7XG59XG4iLCAiaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5LCB0eXBlIFRpbWVyTWV0YWRhdGEgfSBmcm9tICcuLi9hcHAnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IHsgaXNOaWwsIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGltZXJEZWNvcmF0b3IodHlwZTogVGltZXJNZXRhZGF0YVsndHlwZSddLCBuYW1lPzogc3RyaW5nLCBvcHRpb25zPzogVGltZXJNZXRhZGF0YVsnb3B0aW9ucyddKSB7XG4gICAgcmV0dXJuIDxNZXRob2REZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKCFpc05pbChuYW1lKSAmJiAhaXNTdHJpbmcobmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuVGltZXJOYW1lTXVzdEJlU3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5hbWUgPSBuYW1lID8/IG1ldGhvZDtcblxuICAgICAgICBjb25zdCB0aW1lcnMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPFRpbWVyTWV0YWRhdGFbXT4oQ29yZU1ldGFkYXRhS2V5LlRpbWVycywgdGFyZ2V0KSA/PyBbXTtcblxuICAgICAgICBpZiAodGltZXJzLnNvbWUoKHRpbWVyKSA9PiB0aW1lci5tZXRob2QgPT09IG1ldGhvZCAmJiB0aW1lci5uYW1lID09PSBuYW1lICYmIHRpbWVyLnR5cGUgPT09IHR5cGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkV2ZW50TmFtZU11c3RCZVVuaXF1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhPFRpbWVyTWV0YWRhdGFbXT4oXG4gICAgICAgICAgICBDb3JlTWV0YWRhdGFLZXkuVGltZXJzLFxuICAgICAgICAgICAgWy4uLnRpbWVycywgPFRpbWVyTWV0YWRhdGE+eyBtZXRob2QsIG5hbWUsIHR5cGUsIG9wdGlvbnMgfV0sXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICk7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDcm9uT3B0aW9ucyB9IGZyb20gJ2Nyb25lcic7XG5pbXBvcnQgeyBjcmVhdGVUaW1lckRlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS10aW1lci5kZWNvcmF0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gQ3JvbihwYXR0ZXJuOiBzdHJpbmcgfCBEYXRlLCBvcHRpb25zOiBDcm9uT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGNyZWF0ZVRpbWVyRGVjb3JhdG9yKCdjcm9uJywgb3B0aW9ucy5uYW1lLCB7IHBhdHRlcm4sIC4uLm9wdGlvbnMgfSk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlVGltZXJEZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtdGltZXIuZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIEV2ZXJ5VGljayhuYW1lPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVRpbWVyRGVjb3JhdG9yKCdldmVyeXRpY2snLCBuYW1lKTtcbn1cbiIsICJpbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IGNyZWF0ZVRpbWVyRGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLXRpbWVyLmRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBJbnRlcnZhbCh0aW1lb3V0OiBudW1iZXIpOiBNZXRob2REZWNvcmF0b3I7XG5leHBvcnQgZnVuY3Rpb24gSW50ZXJ2YWwobmFtZTogc3RyaW5nLCB0aW1lb3V0OiBudW1iZXIpOiBNZXRob2REZWNvcmF0b3I7XG5leHBvcnQgZnVuY3Rpb24gSW50ZXJ2YWwobmFtZU9yVGltZW91dDogc3RyaW5nIHwgbnVtYmVyLCB0aW1lb3V0PzogbnVtYmVyKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgICBjb25zdCBbbmFtZSwgaW50ZXJ2YWxUaW1lb3V0XSA9IGlzU3RyaW5nKG5hbWVPclRpbWVvdXQpID8gW25hbWVPclRpbWVvdXQsIHRpbWVvdXRdIDogW3VuZGVmaW5lZCwgbmFtZU9yVGltZW91dF07XG4gICAgcmV0dXJuIGNyZWF0ZVRpbWVyRGVjb3JhdG9yKCdpbnRlcnZhbCcsIG5hbWUsIHsgdGltZW91dDogaW50ZXJ2YWxUaW1lb3V0ISB9KTtcbn1cbiIsICJpbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IGNyZWF0ZVRpbWVyRGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLXRpbWVyLmRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBUaW1lb3V0KHRpbWVvdXQ6IG51bWJlcik6IE1ldGhvZERlY29yYXRvcjtcbmV4cG9ydCBmdW5jdGlvbiBUaW1lb3V0KG5hbWU6IHN0cmluZywgdmFsdWU6IG51bWJlcik6IE1ldGhvZERlY29yYXRvcjtcbmV4cG9ydCBmdW5jdGlvbiBUaW1lb3V0KG5hbWVPclRpbWVvdXQ6IHN0cmluZyB8IG51bWJlciwgdGltZW91dD86IG51bWJlcik6IE1ldGhvZERlY29yYXRvciB7XG4gICAgY29uc3QgW25hbWUsIGludGVydmFsVGltZW91dF0gPSBpc1N0cmluZyhuYW1lT3JUaW1lb3V0KSA/IFtuYW1lT3JUaW1lb3V0LCB0aW1lb3V0XSA6IFt1bmRlZmluZWQsIG5hbWVPclRpbWVvdXRdO1xuICAgIHJldHVybiBjcmVhdGVUaW1lckRlY29yYXRvcigndGltZW91dCcsIG5hbWUsIHsgdGltZW91dDogaW50ZXJ2YWxUaW1lb3V0ISB9KTtcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY29yYXRvcnM6IChDbGFzc0RlY29yYXRvciB8IE1ldGhvZERlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yKVtdKSB7XG4gICAgcmV0dXJuIDxURnVuY3Rpb24gZXh0ZW5kcyBGdW5jdGlvbiwgWT4oXG4gICAgICAgIHRhcmdldDogVEZ1bmN0aW9uIHwgT2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sLFxuICAgICAgICBkZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxZPixcbiAgICApID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgICAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmICFkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgKDxDbGFzc0RlY29yYXRvcj5kZWNvcmF0b3IpKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoPE1ldGhvZERlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yPmRlY29yYXRvcikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCwgTWV0aG9kUGFyYW1ldGVyIH0gZnJvbSAnLi4vYXBwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IE1ldGhvZFBhcmFtVHlwZSB9IGZyb20gJy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IFBpcGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHZhbGlkYXRlUGlwZSB9IGZyb20gJy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFyYW1EZWNvcmF0b3I8VElucHV0ID0gdW5rbm93biwgVE91dHB1dCA9IHVua25vd24+KGZhY3Rvcnk6IChkYXRhOiBUSW5wdXQsIGN0eDogRXhlY3V0aW9uQ29udGV4dCkgPT4gVE91dHB1dCkge1xuICAgIHJldHVybiA8VElucHV0ID0gdW5rbm93bj4oZGF0YT86IFRJbnB1dCwgLi4ucGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSkgPT4ge1xuICAgICAgICByZXR1cm4gPFBhcmFtZXRlckRlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGVkUGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwaXBlIG9mIHBpcGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZVBpcGUocGlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQaXBlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsIHRhcmdldCwgbWV0aG9kKSA/PyBbXTtcblxuICAgICAgICAgICAgaWYgKHBhcmFtcy5zb21lKChwYXJhbSkgPT4gcGFyYW0uaW5kZXggPT09IGluZGV4KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGFyYW1UeXBlcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZVtdPignZGVzaWduOnBhcmFtdHlwZXMnLCB0YXJnZXQsIG1ldGhvZCk7XG4gICAgICAgICAgICBjb25zdCBtZXRhdHlwZSA9IEFycmF5LmlzQXJyYXkocGFyYW1UeXBlcykgPyBwYXJhbVR5cGVzW2luZGV4XSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oXG4gICAgICAgICAgICAgICAgQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGlwZXM6IHZhbGlkYXRlZFBpcGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTWV0aG9kUGFyYW1UeXBlLkN1c3RvbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcnk6IDwoZGF0YTogdW5rbm93biwgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCkgPT4gdW5rbm93bj5mYWN0b3J5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF0eXBlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgTGF6eVNlcnZpY2VJZGVudGlmaWVyLCB0eXBlIGludGVyZmFjZXMgfSBmcm9tICdpbnZlcnNpZnknO1xuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZFJlZjxUID0gdW5rbm93bj4oZm46ICgpID0+IGludGVyZmFjZXMuU2VydmljZUlkZW50aWZpZXI8VD4pIHtcbiAgICByZXR1cm4gbmV3IExhenlTZXJ2aWNlSWRlbnRpZmllcjxUPihmbik7XG59IiwgImltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IENyb24sIHR5cGUgQ3Jvbk9wdGlvbnMgfSBmcm9tICdjcm9uZXInO1xuaW1wb3J0IHsgTVVMVElQTEFZRVJfU0VSVklDRSwgdHlwZSBNdWx0aXBsYXllclNlcnZpY2UsIHR5cGUgTXVsdGlwbGF5ZXJUaW1lciB9IGZyb20gJy4uL2FwcCc7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUaW1lclNlcnZpY2Uge1xuICAgIEBpbmplY3QoTVVMVElQTEFZRVJfU0VSVklDRSkgcHJpdmF0ZSByZWFkb25seSBtdWx0aXBsYXllclNlcnZpY2U6IE11bHRpcGxheWVyU2VydmljZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5ICRldmVyeXRpY2tzID0gbmV3IE1hcDxzdHJpbmcsIE11bHRpcGxheWVyVGltZXI+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSAkaW50ZXJ2YWxzID0gbmV3IE1hcDxzdHJpbmcsIE11bHRpcGxheWVyVGltZXI+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSAkdGltZW91dHMgPSBuZXcgTWFwPHN0cmluZywgTXVsdGlwbGF5ZXJUaW1lcj4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5ICRjcm9ucyA9IG5ldyBNYXA8c3RyaW5nLCBDcm9uPigpO1xuXG4gICAgcHVibGljIGdldCBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMuYWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXZlcnl0aWNrcygpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLiRldmVyeXRpY2tzLnZhbHVlcygpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGludGVydmFscygpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLiRpbnRlcnZhbHMudmFsdWVzKCldO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGltZW91dHMoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy4kdGltZW91dHMudmFsdWVzKCldO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3JvbnMoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy4kY3JvbnMudmFsdWVzKCldO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgd2FybmluZ1RocmVzaG9sZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlLlRpbWVycy53YXJuaW5nVGhyZXNob2xkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB3YXJuaW5nVGhyZXNob2xkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsYXllclNlcnZpY2UuVGltZXJzLndhcm5pbmdUaHJlc2hvbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzb3VyY2VMb2NhdGlvbkZyYW1lU2tpcENvdW50KHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5tdWx0aXBsYXllclNlcnZpY2UuVGltZXJzLnNvdXJjZUxvY2F0aW9uRnJhbWVTa2lwQ291bnQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNvdXJjZUxvY2F0aW9uRnJhbWVTa2lwQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMuc291cmNlTG9jYXRpb25GcmFtZVNraXBDb3VudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlQ3JvbkpvYihjYWxsYmFjazogRnVuY3Rpb24sIG9wdGlvbnM6IENyb25PcHRpb25zICYgeyBwYXR0ZXJuOiBzdHJpbmcgfCBEYXRlIH0pIHtcbiAgICAgICAgY29uc3QgeyBwYXR0ZXJuLCAuLi5jcm9uT3B0aW9ucyB9ID0gb3B0aW9ucztcblxuICAgICAgICBjb25zdCBjcm9uID0gQ3JvbihwYXR0ZXJuLCBjcm9uT3B0aW9ucywgY2FsbGJhY2spO1xuICAgICAgICBpZiAoaXNTdHJpbmcob3B0aW9ucy5uYW1lKSkgdGhpcy4kY3JvbnMuc2V0KG9wdGlvbnMubmFtZSwgY3Jvbik7XG5cbiAgICAgICAgcmV0dXJuIGNyb247XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUludGVydmFsKGNhbGxiYWNrOiBGdW5jdGlvbiwgaW50ZXJ2YWw6IG51bWJlciwgbmFtZT86IHN0cmluZykge1xuICAgICAgICBjb25zdCB0aW1lciA9IHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlLlRpbWVycy5zZXRJbnRlcnZhbChjYWxsYmFjaywgaW50ZXJ2YWwpO1xuICAgICAgICBpZiAoaXNTdHJpbmcobmFtZSkpIHRoaXMuJGludGVydmFscy5zZXQobmFtZSwgdGltZXIpO1xuICAgICAgICByZXR1cm4gdGltZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZVRpbWVvdXQoY2FsbGJhY2s6IEZ1bmN0aW9uLCB0aW1lb3V0OiBudW1iZXIsIG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMuc2V0VGltZW91dChjYWxsYmFjaywgdGltZW91dCk7XG4gICAgICAgIGlmIChpc1N0cmluZyhuYW1lKSkgdGhpcy4kdGltZW91dHMuc2V0KG5hbWUsIHRpbWVyKTtcbiAgICAgICAgcmV0dXJuIHRpbWVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVFdmVyeVRpY2soY2FsbGJhY2s6IEZ1bmN0aW9uLCBuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gdGhpcy5tdWx0aXBsYXllclNlcnZpY2UuVGltZXJzLmV2ZXJ5VGljayhjYWxsYmFjayk7XG4gICAgICAgIGlmIChpc1N0cmluZyhuYW1lKSkgdGhpcy4kZXZlcnl0aWNrcy5zZXQobmFtZSwgdGltZXIpO1xuICAgICAgICByZXR1cm4gdGltZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZSh0eXBlOiAnY3JvbicgfCAnZXZlcnl0aWNrJyB8ICd0aW1lb3V0JyB8ICdpbnRlcnZhbCcsIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Nyb24nOlxuICAgICAgICAgICAgICAgIGNvbnN0IGNyb25Kb2IgPSB0aGlzLiRjcm9ucy5nZXQobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNyb25Kb2IpIHtcbiAgICAgICAgICAgICAgICAgICAgY3JvbkpvYi5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGNyb25zLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdldmVyeXRpY2snOlxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZXJ5dGljayA9IHRoaXMuJGV2ZXJ5dGlja3MuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChldmVyeXRpY2spIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlcnl0aWNrLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZXZlcnl0aWNrcy5kZWxldGUobmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaW50ZXJ2YWwnOlxuICAgICAgICAgICAgICAgIGNvbnN0IGludGVydmFsID0gdGhpcy4kaW50ZXJ2YWxzLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRpbnRlcnZhbHMuZGVsZXRlKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3RpbWVvdXQnOlxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLiR0aW1lb3V0cy5nZXQobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHRpbWVvdXRzLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QnlOYW1lKHR5cGU6ICdjcm9uJyB8ICdldmVyeXRpY2snIHwgJ3RpbWVvdXQnIHwgJ2ludGVydmFsJywgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnY3Jvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGNyb25zLmdldChuYW1lKTtcbiAgICAgICAgICAgIGNhc2UgJ2V2ZXJ5dGljayc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGV2ZXJ5dGlja3MuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgY2FzZSAnaW50ZXJ2YWwnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRpbnRlcnZhbHMuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgY2FzZSAndGltZW91dCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHRpbWVvdXRzLmdldChuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRCeUlkKGlkOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlLlRpbWVycy5nZXRCeUlEKGlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdGltZShuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMudGltZShuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdGltZUVuZChuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMudGltZUVuZChuYW1lKTtcbiAgICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU87OztBQ0FQLFNBQVNBLGNBQUFBLG1CQUFrQjs7O0FDQTNCLE9BQU87OztBQ0lQLFNBQVNDLGtCQUFrQjtBQUdwQixTQUFTQyxZQUE4QkMsU0FBMkI7QUFDckUsU0FBTyxDQUFDQyxXQUFBQTtBQUNKLFFBQUlDLFFBQVFDLFlBQVlDLGdCQUFnQkwsWUFBWUUsTUFBQUEsR0FBUztBQUN6RCxZQUFNLElBQUlJLE1BQU1DLGFBQWFDLHVCQUF1QjtJQUN4RDtBQUVBLFVBQU0sRUFBRUMsT0FBT0MsT0FBT0MsTUFBSyxJQUFLQywwQkFBMEJYLE9BQUFBO0FBQzFELFFBQUksQ0FBQ1EsTUFBTyxPQUFNLElBQUlILE1BQU1LLEtBQUFBO0FBQzVCUixZQUFRVSxlQUFlUixnQkFBZ0JMLFlBQVlVLE9BQU9SLE1BQUFBO0FBRTFELFdBQU9ZLFdBQUFBLEVBQWFaLE1BQUFBO0VBQ3hCO0FBQ0o7QUFaZ0JGLE9BQUFBLGFBQUFBOzs7QUNKVCxTQUFTZSxTQUFBQTtBQUNaLFNBQU8sQ0FBQ0MsV0FB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T1gsSUFBQUE7UUFDM0I7QUFDQTtNQUNKLEtBQUs7QUFDRCxjQUFNTyxVQUFVLEtBQUszQixVQUFVa0MsSUFBSWQsSUFBQUE7QUFDbkMsWUFBSU8sU0FBUztBQUNUQSxrQkFBUVUsUUFBTztBQUNmLGVBQUtyQyxVQUFVK0IsT0FBT1gsSUFBQUE7UUFDMUI7QUFDQTtJQUNSO0VBQ0o7RUFFT2tCLFVBQVVOLE1BQXFEWixNQUFjO0FBQ2hGLFlBQVFZLE1BQUFBO01BQ0osS0FBSztBQUNELGVBQU8sS0FBSy9CLE9BQU9pQyxJQUFJZCxJQUFBQTtNQUMzQixLQUFLO0FBQ0QsZUFBTyxLQUFLdkIsWUFBWXFDLElBQUlkLElBQUFBO01BQ2hDLEtBQUs7QUFDRCxlQUFPLEtBQUtyQixXQUFXbUMsSUFBSWQsSUFBQUE7TUFDL0IsS0FBSztBQUNELGVBQU8sS0FBS3BCLFVBQVVrQyxJQUFJZCxJQUFBQTtJQUNsQztFQUNKO0VBRU9tQixRQUFRQyxJQUFZO0FBQ3ZCLFdBQU8sS0FBSzVDLG1CQUFtQk8sT0FBT3NDLFFBQVFELEVBQUFBO0VBQ2xEO0VBRU9FLEtBQUt0QixNQUFlO0FBQ3ZCLFdBQU8sS0FBS3hCLG1CQUFtQk8sT0FBT3VDLEtBQUt0QixJQUFBQTtFQUMvQztFQUVPdUIsUUFBUXZCLE1BQWU7QUFDMUIsV0FBTyxLQUFLeEIsbUJBQW1CTyxPQUFPd0MsUUFBUXZCLElBQUFBO0VBQ2xEO0FBQ0o7Ozs7Ozs7OyIsCiAgIm5hbWVzIjogWyJpbmplY3RhYmxlIiwgImluamVjdGFibGUiLCAiQ29udHJvbGxlciIsICJvcHRpb25zIiwgInRhcmdldCIsICJSZWZsZWN0IiwgImhhc01ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiRHVwbGljYXRlRGVjb3JhdG9yVXNhZ2UiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVDb250cm9sbGVyT3B0aW9ucyIsICJkZWZpbmVNZXRhZGF0YSIsICJpbmplY3RhYmxlIiwgIkdsb2JhbCIsICJ0YXJnZXQiLCAiUmVmbGVjdCIsICJkZWZpbmVNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiR2xvYmFsTW9kdWxlIiwgImluamVjdCIsICJJbmplY3QiLCAia2V5IiwgInRhcmdldCIsICJwcm9wZXJ0eUtleSIsICJwYXJhbUluZGV4IiwgImlzTmlsIiwgInZhbGlkYXRlSW5qZWN0aW9uVG9rZW4iLCAidmFsaWQiLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIkludmFsaWRJbmplY3Rpb25Ub2tlblNwZWNpZmllZCIsICJ0b2tlbiIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkluamVjdGlvblRva2VuTm90Rm91bmQiLCAiaW5qZWN0IiwgImluamVjdGFibGUiLCAiSW5qZWN0YWJsZSIsICJvcHRpb25zIiwgInRhcmdldCIsICJSZWZsZWN0IiwgImhhc01ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiRHVwbGljYXRlRGVjb3JhdG9yVXNhZ2UiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVJbmplY3RhYmxlTWV0YWRhdGEiLCAiZGVmaW5lTWV0YWRhdGEiLCAiaW5qZWN0YWJsZSIsICJpbmplY3RhYmxlIiwgIk1vZHVsZSIsICJvcHRpb25zIiwgInRhcmdldCIsICJSZWZsZWN0IiwgImhhc01ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiRHVwbGljYXRlRGVjb3JhdG9yVXNhZ2UiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVNb2R1bGVPcHRpb25zIiwgImRlZmluZU1ldGFkYXRhIiwgImluamVjdGFibGUiLCAib3B0aW9uYWwiLCAiT3B0aW9uYWwiLCAidGFyZ2V0IiwgInByb3BlcnR5S2V5IiwgInBhcmFtSW5kZXgiLCAib3B0aW9uYWwiLCAiU2V0TWV0YWRhdGEiLCAia2V5IiwgInZhbHVlIiwgImRlY29yYXRvckZhY3RvcnkiLCAidGFyZ2V0IiwgIl9tZXRob2QiLCAiZGVzY3JpcHRvciIsICJSZWZsZWN0IiwgImRlZmluZU1ldGFkYXRhIiwgIktFWSIsICJDYXRjaCIsICJleGNlcHRpb25zIiwgInRhcmdldCIsICJSZWZsZWN0IiwgImhhc01ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiRHVwbGljYXRlRGVjb3JhdG9yVXNhZ2UiLCAiZHVwbGljYXRlcyIsICJmaWx0ZXIiLCAiZXhjZXB0aW9uIiwgImluZGV4IiwgImluZGV4T2YiLCAibGVuZ3RoIiwgIkV4Y2VwdGlvbkhhbmRsaW5nQ29uZmxpY3QiLCAiZGVmaW5lTWV0YWRhdGEiLCAiVXNlRmlsdGVycyIsICJmaWx0ZXJzIiwgInRhcmdldCIsICJtZXRob2QiLCAiZGVzY3JpcHRvciIsICJ2YWxpZGF0ZWRGaWx0ZXJzIiwgImZpbHRlciIsICJ2YWxpZCIsICJ2YWx1ZSIsICJlcnJvciIsICJ2YWxpZGF0ZUVycm9yRmlsdGVyIiwgIkVycm9yIiwgInB1c2giLCAiaXNOaWwiLCAibGVuZ3RoIiwgIkVycm9yTWVzc2FnZSIsICJBdExlYXN0T25lRmlsdGVyUmVxdWlyZWQiLCAibWV0aG9kRmlsdGVycyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJFcnJvckZpbHRlcnMiLCAiZmluZCIsICJpbmNsdWRlcyIsICJEdXBsaWNhdGVFcnJvckZpbHRlckRldGVjdGVkIiwgImRlZmluZU1ldGFkYXRhIiwgImNsYXNzRmlsdGVycyIsICJpbmplY3QiLCAiaW5qZWN0YWJsZSIsICJvcHRpb25hbCIsICJBcHBSdW50aW1lIiwgImV2ZW50SGFuZGxlciIsICJycGNIYW5kbGVyIiwgImdsb2JhbEd1YXJkcyIsICJnbG9iYWxJbnRlcmNlcHRvcnMiLCAiZ2xvYmFsUGlwZXMiLCAiZ2xvYmFsRXJyb3JGaWx0ZXJzIiwgImxvZ2dlclNlcnZpY2UiLCAiZW5hYmxlU2h1dGRvd25Ib29rcyIsICJib290IiwgInJlc29sdmVkVHJlZSIsICJhc3luY1RyYXZlcnNlIiwgIm5vZGUiLCAic3RhcnRUaW1lIiwgIkRhdGUiLCAibm93IiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJpbnN0YW5jZSIsICJjb250YWluZXIiLCAiZ2V0IiwgIm1ldGFkYXRhIiwgImNsYXNzUmVmIiwgImNvbnRyb2xsZXJzIiwgImZvckVhY2giLCAiY29udHJvbGxlciIsICJpbnRlcm5hbFByb3ZpZGVycyIsICJleHRlcm5hbFByb3ZpZGVycyIsICJ0b2tlbiIsICJsb2ciLCAibmFtZSIsICJydW5MaWZlY3ljbGVNZXRob2QiLCAicnVuTGlmZWN5Y2xlTWV0aG9kcyIsICJ0cmF2ZXJzZSIsICJ0aW1lIiwgInJlZ2lzdGVyVGltZXJzIiwgInJlZ2lzdGVyTGlzdGVuZXJzIiwgInNodXRkb3duIiwgInRpbWVyU2VydmljZSIsICJvd25lciIsICJUSU1FUl9TRVJWSUNFIiwgImV2ZXJ5dGlja3MiLCAidGltZXIiLCAiZGVzdHJveSIsICJpbnRlcnZhbHMiLCAidGltZW91dHMiLCAiY3JvbnMiLCAiY3JvbiIsICJzdG9wIiwgImV2ZW50SGFuZGxlcnMiLCAiaGFuZGxlciIsICJycGNIYW5kbGVycyIsICJldmVudHMiLCAiZXZlbnQiLCAiZ3VhcmRzIiwgImludGVyY2VwdG9ycyIsICJwaXBlcyIsICJtYXBwZWRFcnJvckZpbHRlcnMiLCAibWFwRXJyb3JGaWx0ZXJzIiwgImVycm9yRmlsdGVycyIsICJyZWdpc3RlckV2ZW50IiwgInB1c2giLCAicnBjcyIsICJycGMiLCAicmVnaXN0ZXJSUEMiLCAidGltZXJzIiwgInR5cGUiLCAiY3JlYXRlQ3JvbkpvYiIsICJtZXRob2QiLCAiYmluZCIsICJvcHRpb25zIiwgImNyZWF0ZUV2ZXJ5VGljayIsICJjcmVhdGVJbnRlcnZhbCIsICJ0aW1lb3V0IiwgImNyZWF0ZVRpbWVvdXQiLCAiZmlsdGVyTWFwIiwgImZpbHRlciIsICJlcnJvcnMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiQ2F0Y2giLCAibGVuZ3RoIiwgImVycm9yIiwgImlzTmlsIiwgImZpbmQiLCAiZmlsdGVyRXJyb3IiLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIkVycm9yQWxyZWFkeUhhbmRsZWRCeUZpbHRlciIsICJQcm9taXNlIiwgImFsbCIsICJtYXAiLCAiaXNPYmplY3QiLCAicHJvdmlkZXJJbnN0YW5jZSIsICJDb250YWluZXIiLCAiaW5qZWN0IiwgImluamVjdGFibGUiLCAib3B0aW9uYWwiLCAiTW9kdWxlRGVwZW5kZW5jeUJpbmRlciIsICJnbG9iYWxBcHBDb250YWluZXIiLCAibG9nZ2VyU2VydmljZSIsICJjb250YWluZXJPcHRpb25zIiwgImJpbmQiLCAicmVzb2x2ZWRUcmVlIiwgImFzeW5jVHJhdmVyc2UiLCAibm9kZSIsICJzdGFydFRpbWUiLCAiRGF0ZSIsICJub3ciLCAibW9kdWxlIiwgInZhbHVlIiwgImNvbnRhaW5lciIsICJNb2R1bGVDb250YWluZXIiLCAibWV0YWRhdGEiLCAicGFyZW50IiwgImNsYXNzUmVmIiwgInRvU2VsZiIsICJpblNpbmdsZXRvblNjb3BlIiwgImdsb2JhbCIsICJfIiwgInByb3ZpZGVyIiwgImV4dGVybmFsUHJvdmlkZXJzIiwgImJpbmRQcm92aWRlciIsICJ0b2tlbiIsICJ0b0R5bmFtaWNWYWx1ZSIsICJnZXQiLCAiaW1wb3J0TW9kdWxlIiwgInJlcGV0aXRpdmVJbXBvcnRzIiwgImludGVybmFsUHJvdmlkZXJzIiwgIk1PRFVMRV9DT05UQUlORVIiLCAidG9Db25zdGFudFZhbHVlIiwgImNvbnRyb2xsZXJzIiwgIlRJTUVSX1NFUlZJQ0UiLCAidG8iLCAiVGltZXJTZXJ2aWNlIiwgImxvZyIsICJuYW1lIiwgInByb3ZpZGUiLCAidXNlVmFsdWUiLCAiYmluZGluZyIsICJjdHgiLCAiZGVwcyIsICJpbmplY3QiLCAibWFwIiwgImRlcCIsICJpc09iamVjdCIsICJlcnIiLCAib3B0aW9uYWwiLCAidW5kZWZpbmVkIiwgImVycm9yIiwgInVzZUZhY3RvcnkiLCAic2NvcGUiLCAiaW5UcmFuc2llbnRTY29wZSIsICJpblJlcXVlc3RTY29wZSIsICJ1c2VDbGFzcyIsICJ0b1NlcnZpY2UiLCAidXNlRXhpc3RpbmciLCAiaW5qZWN0IiwgImluamVjdGFibGUiLCAiTW9kdWxlVHJlZVNjYW5uZXIiLCAibW9kdWxlTWV0YWRhdGFSZWFkZXIiLCAiY29udHJvbGxlck1ldGFkYXRhUmVhZGVyIiwgImxvZ2dlclNlcnZpY2UiLCAic2NhbiIsICJjbGFzc1JlZiIsICJzdGFydFRpbWUiLCAiRGF0ZSIsICJub3ciLCAibW9kdWxlTWV0YWRhdGEiLCAicmVhZCIsICJtb2R1bGUiLCAiTW9kdWxlIiwgIm1ldGFkYXRhIiwgImxvZyIsICJuYW1lIiwgInNjYW5Db250cm9sbGVycyIsICJtb2R1bGVUcmVlIiwgIlRyZWUiLCAic2Nhbm5lZE1vZHVsZXMiLCAiTWFwIiwgInNldCIsICJpbXBvcnRlZE1vZHVsZSIsICJpbXBvcnRzIiwgInNjYW5Nb2R1bGVzIiwgInJvb3QiLCAicGFyZW50Tm9kZSIsICJzY2FubmVkTW9kdWxlIiwgImdldCIsICJpc05pbCIsICJ2YWx1ZSIsICJyZXBldGl0aXZlSW1wb3J0cyIsICJhZGQiLCAiY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kiLCAicGFyZW50IiwgInRyZWVOb2RlIiwgIlRyZWVOb2RlIiwgImFkZENoaWxkIiwgImltcG9ydE1vZHVsZSIsICJjb250cm9sbGVycyIsICJjb250cm9sbGVyTWV0YWRhdGEiLCAiY29udHJvbGxlciIsICJDb250cm9sbGVyIiwgIm93bmVyIiwgInB1c2giLCAicGFyZW50TWV0YWRhdGEiLCAiaW5jbHVkZXMiLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIkNpcmN1bGFyRGVwZW5kZW5jeURldGVjdGVkIiwgIlJhZ2VNUFNjcmlwdEV2ZW50IiwgImV2ZW50TmFtZSIsICJsaXN0ZW5lciIsICJkZXN0cm95IiwgIm1wIiwgImV2ZW50cyIsICJyZW1vdmUiLCAiUmFnZU1QRXZlbnRFbW1pdGVyIiwgImVtaXQiLCAiZXZlbnROYW1lIiwgImFyZ3MiLCAibXAiLCAiZXZlbnRzIiwgImNhbGwiLCAib24iLCAibGlzdGVuZXIiLCAiYWRkIiwgIlJhZ2VNUFNjcmlwdEV2ZW50IiwgIm9uY2UiLCAib25jZVdyYXBwZXIiLCAicmVtb3ZlIiwgIm9mZiIsICJSYWdlTVBUaW1lciIsICJsYXN0VGljayIsICJEYXRlIiwgIm5vdyIsICJpZCIsICJpbnRlcnZhbCIsICJvbmNlIiwgImNhbGxiYWNrIiwgImNsZWFyVGltZXIiLCAiZGVzdHJveSIsICJSYWdlTVBUaW1lcnMiLCAidGltZXJJbmNyZW1lbnRlciIsICJ0aW1lcnMiLCAiTWFwIiwgImV2ZXJ5VGlja0hhbmRsZXJzIiwgImlzRXZlcnlUaWNrUnVubmluZyIsICJldmVyeVRpY2tNYWluSGFuZGxlciIsICJhbGwiLCAidmFsdWVzIiwgIndhcm5pbmdUaHJlc2hvbGQiLCAiX3ZhbHVlIiwgInNvdXJjZUxvY2F0aW9uRnJhbWVTa2lwQ291bnQiLCAiZ2V0QnlJRCIsICJpZCIsICJ0aW1lciIsICJnZXQiLCAiY3JlYXRlVGltZXIiLCAiY2xlYXIiLCAiY2FsbGJhY2siLCAiaW50ZXJ2YWwiLCAib25jZSIsICJhcmdzIiwgImNhbGxiYWNrQmluZCIsICJiaW5kIiwgIkFycmF5IiwgImlzQXJyYXkiLCAidGltZXJJZCIsICJyYWdlTVBUaW1lciIsICJSYWdlTVBUaW1lciIsICJkZWxldGUiLCAic2V0IiwgInNldEludGVydmFsIiwgInRpbWUiLCAiY2IiLCAiY2xlYXJJbnRlcnZhbCIsICJzZXRUaW1lb3V0IiwgImNsZWFyVGltZW91dCIsICJldmVyeVRpY2siLCAiYm91bmQiLCAiaXNDbGllbnRTaWRlIiwgIm1wIiwgImJyb3dzZXJzIiwgImhhbmRsZXIiLCAiZSIsICJjb25zb2xlIiwgImxvZ0Vycm9yIiwgImV2ZW50cyIsICJhZGQiLCAiaW50ZXJ2YWxIYW5kbGVyIiwgIl9ldmVyeVRpY2tJbnRlcnZhbCIsICJzaXplIiwgInJlbW92ZSIsICJuZXh0VGljayIsICJfbmFtZSIsICJ0aW1lRW5kIiwgIlJhZ2VNUE11bHRpcGxheWVyU2VydmljZSIsICJUaW1lcnMiLCAiRXZlbnRzIiwgIlJhZ2VNUEV2ZW50RW1taXRlciIsICJSYWdlTVBUaW1lcnMiLCAicGFyc2VJbnRlcm5hbEFyZ3MiLCAiYXJncyIsICJwbGF5ZXIiLCAiaXNPYmplY3QiLCAidW5kZWZpbmVkIiwgImJvZHkiLCAibG9nIiwgImFyZyIsICJtZXNzYWdlIiwgIm1hcCIsICJhIiwgIkpTT04iLCAic3RyaW5naWZ5IiwgIlN0cmluZyIsICJqb2luIiwgIm1wIiwgImNvbnNvbGUiLCAibG9nSW5mbyIsICJsb2dFcnJvciIsICJsb2dXYXJuaW5nIiwgImxvZ0RlYnVnIiwgImluamVjdCIsICJDb250YWluZXIiLCAiaW5qZWN0YWJsZSIsICJDb250YWluZXIiLCAiaW5qZWN0IiwgImluamVjdGFibGUiLCAiQXBwIiwgIm1vZHVsZVRyZWVTY2FubmVyIiwgIm1vZHVsZURlcGVuZGVuY3lCaW5kZXIiLCAiYXBwUnVudGltZSIsICJpbnRlcm5hbEFwcENvbnRhaW5lciIsICJwbHVnaW5zIiwgImxvZ2dlclNlcnZpY2UiLCAibW9kdWxlVHJlZSIsICJsb2FkZWQiLCAic3RhcnQiLCAicm9vdE1vZHVsZSIsICJlcnJvciIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiQXBwQWxyZWFkeUxvYWRlZCIsICJsb2ciLCAicnVuUGx1Z2luTWV0aG9kcyIsICJzY2FuIiwgImJpbmQiLCAiYm9vdCIsICJzdG9wIiwgIkFwcE5vdExvYWRlZCIsICJzaHV0ZG93biIsICJtZXRob2QiLCAiUHJvbWlzZSIsICJhbGwiLCAibWFwIiwgInAiLCAicGx1Z2luIiwgImdldCIsICJyZXNvbHZlIiwgIkFwcEJ1aWxkZXIiLCAiZW52aXJvbWVudCIsICJpbnRlcm5hbEFwcENvbnRhaW5lciIsICJtdWx0aXBsYXllclNlcnZpY2UiLCAicGx1Z2lucyIsICJnbG9iYWxDb250YWluZXJPcHRpb25zIiwgInVzZUdsb2JhbEd1YXJkcyIsICJndWFyZHMiLCAidmFsaWRhdGVkR3VhcmRzIiwgImd1YXJkIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlR3VhcmQiLCAiRXJyb3IiLCAicHVzaCIsICJiaW5kIiwgIkdMT0JBTF9HVUFSRFMiLCAidG9Db25zdGFudFZhbHVlIiwgInVzZUdsb2JhbEludGVyY2VwdG9ycyIsICJpbnRlcmNlcHRvcnMiLCAidmFsaWRhdGVkSW50ZXJjZXB0b3JzIiwgImludGVyY2VwdG9yIiwgInZhbGlkYXRlSW50ZXJjZXB0b3IiLCAiR0xPQkFMX0lOVEVSQ0VQVE9SUyIsICJ1c2VHbG9iYWxQaXBlcyIsICJwaXBlcyIsICJ2YWxpZGF0ZWRQaXBlcyIsICJwaXBlIiwgInZhbGlkYXRlUGlwZSIsICJHTE9CQUxfUElQRVMiLCAidXNlR2xvYmFsRmlsdGVycyIsICJmaWx0ZXJzIiwgInZhbGlkYXRlZEZJbHRlcnMiLCAiZmlsdGVyIiwgInZhbGlkYXRlRXJyb3JGaWx0ZXIiLCAiR0xPQkFMX0VSUk9SX0ZJTFRFUlMiLCAidXNlUGx1Z2lucyIsICJmb3JFYWNoIiwgInAiLCAidG9TZWxmIiwgImluU2luZ2xldG9uU2NvcGUiLCAiaW50ZXJuYWxQbHVnaW5zIiwgImdldCIsICJQTFVHSU5TIiwgInJlYmluZCIsICJlbmFibGVTaHV0ZG93bkhvb2tzIiwgIkVOQUJMRV9TSFVURE9XTl9IT09LUyIsICJzZXRDb250YWluZXJPcHRpb25zIiwgIm9wdGlvbnMiLCAib25seUdsb2JhbCIsICJDT05UQUlORVJfT1BUSU9OUyIsICJidWlsZCIsICJnbG9iYWxBcHBDb250YWluZXIiLCAiQ29udGFpbmVyIiwgIlJFRkxFQ1RPUl9TRVJWSUNFIiwgIlJlZmxlY3RvclNlcnZpY2UiLCAidG9TZXJ2aWNlIiwgIk1VTFRJUExBWUVSX1NFUlZJQ0UiLCAiQXBwIiwgIkdMT0JBTF9BUFBfQ09OVEFJTkVSIiwgIk1vZHVsZVRyZWVTY2FubmVyIiwgIk1vZHVsZURlcGVuZGVuY3lCaW5kZXIiLCAiQXBwUnVudGltZSIsICJQaXBlbGluZUhhbmRsZXIiLCAiTW9kdWxlIiwgImluVHJhbnNpZW50U2NvcGUiLCAiTW9kdWxlTWV0YWRhdGFSZWFkZXIiLCAiQ29udHJvbGxlciIsICJDb250cm9sbGVyTWV0YWRhdGFSZWFkZXIiLCAiQ29udHJvbGxlckZsb3dIYW5kbGVyIiwgIkNvbnRyb2xsZXJFdmVudEhhbmRsZXIiLCAiQ29udHJvbGxlclJQQ0hhbmRsZXIiLCAiTWFuZ29SZXF1ZXN0QmFzZSIsICJNQU5HT19SRVFVRVNUX0ZBQ1RPUlkiLCAidG9GYWN0b3J5IiwgImNvbnRleHQiLCAiYm9keSIsICJwbGF5ZXIiLCAicmVxdWVzdCIsICJjb250YWluZXIiLCAiJGJvZHkiLCAiJHBsYXllciIsICJNYW5nb1Jlc3BvbnNlQmFzZSIsICJNQU5HT19SRVNQT05TRV9GQUNUT1JZIiwgIkV4ZWN1dGlvbkNvbnRleHRCYXNlIiwgIkVYRUNVVElPTl9DT05URVhUX0ZBQ1RPUlkiLCAidHlwZSIsICJjbGFzc1JlZiIsICJoYW5kbGVyIiwgInJlc3BvbnNlIiwgIm5hbWUiLCAiZXhlY3V0aW9uQ29udGV4dCIsICIkdHlwZSIsICIkcmVxdWVzdCIsICIkcmVzcG9uc2UiLCAiJGhhbmRsZXIiLCAiJGNsYXNzUmVmIiwgIiRuYW1lIiwgInBsdWdpbiIsICJwbHVnaW5JbnN0YW5jZSIsICJvbkJ1aWxkIiwgImlzQm91bmQiLCAiQ29udGFpbmVyIiwgImNyZWF0ZUFwcEJ1aWxkZXIiLCAiZW52aXJvbWVudCIsICJwbHVnaW5zIiwgImFwcEJ1aWxkZXJJbmhlcml0IiwgIm11bHRpcGxheWVyU2VydmljZSIsICJpbnRlcm5hbEFwcENvbnRhaW5lciIsICJDb250YWluZXIiLCAiYmluZCIsICJNVUxUSVBMQVlFUl9TRVJWSUNFIiwgInRvQ29uc3RhbnRWYWx1ZSIsICJJTlRFUk5BTF9BUFBfQ09OVEFJTkVSIiwgIkFQUF9FTlZJUk9NRU5UIiwgIlBMVUdJTlMiLCAidG9TZWxmIiwgImluU2luZ2xldG9uU2NvcGUiLCAiZ2V0IiwgImNyZWF0ZUV2ZW50RGVjb3JhdG9yIiwgInR5cGUiLCAibmFtZSIsICJ3ZWJWaWV3SWQiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJpc05pbCIsICJpc1N0cmluZyIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiRXZlbnROYW1lTXVzdEJlU3RyaW5nIiwgImV2ZW50cyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJDb250cm9sbGVyRXZlbnRzIiwgInNvbWUiLCAiZXZlbnQiLCAiRXZlbnROYW1lTXVzdEJlVW5pcXVlIiwgImRlZmluZU1ldGFkYXRhIiwgIk9uSW50ZXJuYWwiLCAiZXZlbnROYW1lIiwgImNyZWF0ZUV2ZW50RGVjb3JhdG9yIiwgIk9uV2ViVmlldyIsICJpZCIsICJldmVudE5hbWUiLCAiY3JlYXRlRXZlbnREZWNvcmF0b3IiLCAiT24iLCAiZXZlbnROYW1lIiwgImNyZWF0ZUV2ZW50RGVjb3JhdG9yIiwgIk9uY2VJbnRlcm5hbCIsICJldmVudE5hbWUiLCAiY3JlYXRlRXZlbnREZWNvcmF0b3IiLCAiT25jZSIsICJldmVudE5hbWUiLCAiY3JlYXRlRXZlbnREZWNvcmF0b3IiLCAiT25jZVdlYlZpZXciLCAiaWQiLCAiZXZlbnROYW1lIiwgImNyZWF0ZUV2ZW50RGVjb3JhdG9yIiwgIkJvZHkiLCAicGlwZXMiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJpbmRleCIsICJ2YWxpZGF0ZWRQaXBlcyIsICJwaXBlIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlUGlwZSIsICJFcnJvciIsICJwdXNoIiwgInBhcmFtcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJDb250cm9sbGVyUGFyYW1zIiwgInNvbWUiLCAicGFyYW0iLCAiRXJyb3JNZXNzYWdlIiwgIk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCIsICJwYXJhbVR5cGVzIiwgIm1ldGF0eXBlIiwgIkFycmF5IiwgImlzQXJyYXkiLCAidW5kZWZpbmVkIiwgImRlZmluZU1ldGFkYXRhIiwgInR5cGUiLCAiTWV0aG9kUGFyYW1UeXBlIiwgImRhdGEiLCAiSW5kZXgiLCAia2V5IiwgInBpcGVzIiwgInRhcmdldCIsICJtZXRob2QiLCAiaW5kZXgiLCAiaXNOdW1iZXIiLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIkluZGV4S2V5TXVzdEJlTnVtYmVyIiwgInZhbGlkYXRlZFBpcGVzIiwgInBpcGUiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVQaXBlIiwgInB1c2giLCAicGFyYW1zIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkNvbnRyb2xsZXJQYXJhbXMiLCAic29tZSIsICJwYXJhbSIsICJNdWx0aXBsZURlY29yYXRvcnNPblNpbmdsZVBhcmFtZXRlck5vdEFsbG93ZWQiLCAicGFyYW1UeXBlcyIsICJtZXRhdHlwZSIsICJBcnJheSIsICJpc0FycmF5IiwgInVuZGVmaW5lZCIsICJkZWZpbmVNZXRhZGF0YSIsICJ0eXBlIiwgIk1ldGhvZFBhcmFtVHlwZSIsICJkYXRhIiwgIlJlcXVlc3QiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJpbmRleCIsICJwYXJhbXMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiQ29udHJvbGxlclBhcmFtcyIsICJzb21lIiwgInBhcmFtIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJNdWx0aXBsZURlY29yYXRvcnNPblNpbmdsZVBhcmFtZXRlck5vdEFsbG93ZWQiLCAicGFyYW1UeXBlcyIsICJtZXRhdHlwZSIsICJBcnJheSIsICJpc0FycmF5IiwgInVuZGVmaW5lZCIsICJkZWZpbmVNZXRhZGF0YSIsICJ0eXBlIiwgIk1ldGhvZFBhcmFtVHlwZSIsICJkYXRhIiwgIlJlcSIsICJQYXJhbSIsICJrZXkiLCAicGlwZXMiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJpbmRleCIsICJpc1N0cmluZyIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiUGFyYW1LZXlNdXN0QmVTdHJpbmciLCAidmFsaWRhdGVkUGlwZXMiLCAicGlwZSIsICJ2YWxpZCIsICJ2YWx1ZSIsICJlcnJvciIsICJ2YWxpZGF0ZVBpcGUiLCAicHVzaCIsICJwYXJhbXMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiQ29udHJvbGxlclBhcmFtcyIsICJzb21lIiwgInBhcmFtIiwgIk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCIsICJwYXJhbVR5cGVzIiwgIm1ldGF0eXBlIiwgIkFycmF5IiwgImlzQXJyYXkiLCAidW5kZWZpbmVkIiwgImRlZmluZU1ldGFkYXRhIiwgImRhdGEiLCAidHlwZSIsICJNZXRob2RQYXJhbVR5cGUiLCAiUmVzcG9uc2UiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJpbmRleCIsICJwYXJhbXMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiQ29udHJvbGxlclBhcmFtcyIsICJzb21lIiwgInBhcmFtIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJNdWx0aXBsZURlY29yYXRvcnNPblNpbmdsZVBhcmFtZXRlck5vdEFsbG93ZWQiLCAicGFyYW1UeXBlcyIsICJtZXRhdHlwZSIsICJBcnJheSIsICJpc0FycmF5IiwgInVuZGVmaW5lZCIsICJkZWZpbmVNZXRhZGF0YSIsICJ0eXBlIiwgIk1ldGhvZFBhcmFtVHlwZSIsICJkYXRhIiwgIlJlcyIsICJVc2VHdWFyZHMiLCAiZ3VhcmRzIiwgInRhcmdldCIsICJtZXRob2QiLCAiZGVzY3JpcHRvciIsICJ2YWxpZGF0ZWRHdWFyZHMiLCAiZ3VhcmQiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVHdWFyZCIsICJFcnJvciIsICJwdXNoIiwgImlzTmlsIiwgImxlbmd0aCIsICJFcnJvck1lc3NhZ2UiLCAiQXRMZWFzdE9uZUd1YXJkUmVxdWlyZWQiLCAibWV0aG9kR3VhcmRzIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkd1YXJkcyIsICJkZWZpbmVNZXRhZGF0YSIsICJjbGFzc0d1YXJkcyIsICJVc2VJbnRlcmNlcHRvcnMiLCAiaW50ZXJjZXB0b3JzIiwgInRhcmdldCIsICJtZXRob2QiLCAiZGVzY3JpcHRvciIsICJ2YWxpZGF0ZWRJbnRlcmNlcHRvcnMiLCAiaW50ZXJjZXB0b3IiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVJbnRlcmNlcHRvciIsICJFcnJvciIsICJwdXNoIiwgImlzTmlsIiwgImxlbmd0aCIsICJFcnJvck1lc3NhZ2UiLCAiQXRMZWFzdE9uZUludGVyY2VwdG9yUmVxdWlyZWQiLCAibWV0aG9kSW50ZXJjZXB0b3JzIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkludGVyY2VwdG9ycyIsICJkZWZpbmVNZXRhZGF0YSIsICJjbGFzc0ludGVyY2VwdG9ycyIsICJVc2VQaXBlcyIsICJwaXBlcyIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImRlc2NyaXB0b3IiLCAidmFsaWRhdGVkUGlwZXMiLCAicGlwZSIsICJ2YWxpZCIsICJ2YWx1ZSIsICJlcnJvciIsICJ2YWxpZGF0ZVBpcGUiLCAiRXJyb3IiLCAicHVzaCIsICJpc05pbCIsICJsZW5ndGgiLCAiRXJyb3JNZXNzYWdlIiwgIkF0TGVhc3RPbmVQaXBlUmVxdWlyZWQiLCAibWV0aG9kUGlwZXMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiUGlwZXMiLCAiZGVmaW5lTWV0YWRhdGEiLCAiY2xhc3NQaXBlcyIsICJjcmVhdGVSUENEZWNvcmF0b3IiLCAidHlwZSIsICJuYW1lIiwgIndlYlZpZXdJZCIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImlzTmlsIiwgImlzU3RyaW5nIiwgImlzTnVtYmVyIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJXZWJWaWV3SWRNdXN0QmVTdHJpbmdPck51bWJlciIsICJSUENOYW1lTXVzdEJlU3RyaW5nIiwgInJwY3MiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiQ29udHJvbGxlclJQQ3MiLCAic29tZSIsICJycGMiLCAiUlBDTmFtZU11c3RCZVVuaXF1ZSIsICJkZWZpbmVNZXRhZGF0YSIsICJPblJlcXVlc3QiLCAicnBjTmFtZSIsICJjcmVhdGVSUENEZWNvcmF0b3IiLCAiT25XZWJWaWV3UmVxdWVzdCIsICJpZCIsICJycGNOYW1lIiwgImNyZWF0ZVJQQ0RlY29yYXRvciIsICJjcmVhdGVUaW1lckRlY29yYXRvciIsICJ0eXBlIiwgIm5hbWUiLCAib3B0aW9ucyIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImlzTmlsIiwgImlzU3RyaW5nIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJUaW1lck5hbWVNdXN0QmVTdHJpbmciLCAidGltZXJzIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIlRpbWVycyIsICJzb21lIiwgInRpbWVyIiwgIkV2ZW50TmFtZU11c3RCZVVuaXF1ZSIsICJkZWZpbmVNZXRhZGF0YSIsICJDcm9uIiwgInBhdHRlcm4iLCAib3B0aW9ucyIsICJjcmVhdGVUaW1lckRlY29yYXRvciIsICJuYW1lIiwgIkV2ZXJ5VGljayIsICJuYW1lIiwgImNyZWF0ZVRpbWVyRGVjb3JhdG9yIiwgIkludGVydmFsIiwgIm5hbWVPclRpbWVvdXQiLCAidGltZW91dCIsICJuYW1lIiwgImludGVydmFsVGltZW91dCIsICJpc1N0cmluZyIsICJ1bmRlZmluZWQiLCAiY3JlYXRlVGltZXJEZWNvcmF0b3IiLCAiVGltZW91dCIsICJuYW1lT3JUaW1lb3V0IiwgInRpbWVvdXQiLCAibmFtZSIsICJpbnRlcnZhbFRpbWVvdXQiLCAiaXNTdHJpbmciLCAidW5kZWZpbmVkIiwgImNyZWF0ZVRpbWVyRGVjb3JhdG9yIiwgImFwcGx5RGVjb3JhdG9ycyIsICJkZWNvcmF0b3JzIiwgInRhcmdldCIsICJwcm9wZXJ0eUtleSIsICJkZXNjcmlwdG9yIiwgImRlY29yYXRvciIsICJGdW5jdGlvbiIsICJjcmVhdGVQYXJhbURlY29yYXRvciIsICJmYWN0b3J5IiwgImRhdGEiLCAicGlwZXMiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJpbmRleCIsICJ2YWxpZGF0ZWRQaXBlcyIsICJwaXBlIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlUGlwZSIsICJFcnJvciIsICJwdXNoIiwgInBhcmFtcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJDb250cm9sbGVyUGFyYW1zIiwgInNvbWUiLCAicGFyYW0iLCAiRXJyb3JNZXNzYWdlIiwgIk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCIsICJwYXJhbVR5cGVzIiwgIm1ldGF0eXBlIiwgIkFycmF5IiwgImlzQXJyYXkiLCAidW5kZWZpbmVkIiwgImRlZmluZU1ldGFkYXRhIiwgInR5cGUiLCAiTWV0aG9kUGFyYW1UeXBlIiwgIkN1c3RvbSIsICJMYXp5U2VydmljZUlkZW50aWZpZXIiLCAiZm9yd2FyZFJlZiIsICJmbiIsICJMYXp5U2VydmljZUlkZW50aWZpZXIiLCAiUmVmbGVjdG9yU2VydmljZSIsICJnZXQiLCAibWV0YWRhdGFLZXkiLCAidGFyZ2V0IiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiZ2V0QWxsIiwgInRhcmdldHMiLCAibWFwIiwgImdldEFsbEFuZE1lcmdlIiwgIm1ldGFkYXRhQ29sbGVjdGlvbiIsICJmaWx0ZXIiLCAiaXRlbSIsICJ1bmRlZmluZWQiLCAiaXNFbXB0eSIsICJyZWR1Y2UiLCAiYSIsICJiIiwgIkFycmF5IiwgImlzQXJyYXkiLCAiY29uY2F0IiwgImlzT2JqZWN0IiwgImdldEFsbEFuZE92ZXJyaWRlIiwgInJlc3VsdCIsICJjcmVhdGVEZWNvcmF0b3IiLCAib3B0aW9ucyIsICJrZXkiLCAiZ2VuZXJhdGVSYW5kb21JZCIsICJkZWNvcmF0b3JGbiIsICJtZXRhZGF0YVZhbHVlIiwgImRlc2NyaXB0b3IiLCAidmFsdWUiLCAidHJhbnNmb3JtIiwgIlNldE1ldGFkYXRhIiwgIktFWSIsICJpbmplY3QiLCAiaW5qZWN0YWJsZSIsICJDcm9uIiwgIlRpbWVyU2VydmljZSIsICJtdWx0aXBsYXllclNlcnZpY2UiLCAiJGV2ZXJ5dGlja3MiLCAiTWFwIiwgIiRpbnRlcnZhbHMiLCAiJHRpbWVvdXRzIiwgIiRjcm9ucyIsICJhbGwiLCAiVGltZXJzIiwgImV2ZXJ5dGlja3MiLCAidmFsdWVzIiwgImludGVydmFscyIsICJ0aW1lb3V0cyIsICJjcm9ucyIsICJ3YXJuaW5nVGhyZXNob2xkIiwgInZhbHVlIiwgInNvdXJjZUxvY2F0aW9uRnJhbWVTa2lwQ291bnQiLCAiY3JlYXRlQ3JvbkpvYiIsICJjYWxsYmFjayIsICJvcHRpb25zIiwgInBhdHRlcm4iLCAiY3Jvbk9wdGlvbnMiLCAiY3JvbiIsICJDcm9uIiwgImlzU3RyaW5nIiwgIm5hbWUiLCAic2V0IiwgImNyZWF0ZUludGVydmFsIiwgImludGVydmFsIiwgInRpbWVyIiwgInNldEludGVydmFsIiwgImNyZWF0ZVRpbWVvdXQiLCAidGltZW91dCIsICJzZXRUaW1lb3V0IiwgImNyZWF0ZUV2ZXJ5VGljayIsICJldmVyeVRpY2siLCAiZGVsZXRlIiwgInR5cGUiLCAiY3JvbkpvYiIsICJnZXQiLCAic3RvcCIsICJldmVyeXRpY2siLCAiZGVzdHJveSIsICJnZXRCeU5hbWUiLCAiZ2V0QnlJZCIsICJpZCIsICJnZXRCeUlEIiwgInRpbWUiLCAidGltZUVuZCJdCn0K