tryharder 0.1.2 → 0.2.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.
- package/README.md +63 -55
- package/dist/errors.d.ts +6 -1
- package/dist/errors.js +14 -4
- package/dist/index.d.ts +82 -10
- package/dist/index.js +144 -206
- package/dist/shared/chunk-1bnw2q61.js +123 -0
- package/dist/types.d.ts +12 -3
- package/package.json +1 -1
- package/dist/shared/chunk-f024nrjy.js +0 -108
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
UnhandledException,
|
|
8
8
|
__callDispose,
|
|
9
9
|
__using
|
|
10
|
-
} from "./shared/chunk-
|
|
10
|
+
} from "./shared/chunk-1bnw2q61.js";
|
|
11
11
|
|
|
12
12
|
// src/shims/disposer.ts
|
|
13
13
|
var SUPPRESSED_ERROR_MESSAGE = "An error was suppressed during disposal";
|
|
@@ -28,7 +28,7 @@ function defineAsyncDisposeAlias(prototype) {
|
|
|
28
28
|
Object.defineProperty(prototype, ASYNC_DISPOSE, {
|
|
29
29
|
configurable: true,
|
|
30
30
|
async value() {
|
|
31
|
-
await this.
|
|
31
|
+
await this.dispose();
|
|
32
32
|
},
|
|
33
33
|
writable: true
|
|
34
34
|
});
|
|
@@ -122,9 +122,6 @@ defineDisposeAlias(InternalDisposableStack.prototype);
|
|
|
122
122
|
class AsyncDisposerStack {
|
|
123
123
|
#disposed = false;
|
|
124
124
|
#stack = [];
|
|
125
|
-
add(fn) {
|
|
126
|
-
this.defer(fn);
|
|
127
|
-
}
|
|
128
125
|
defer(fn) {
|
|
129
126
|
checkCanRegister(this.#disposed, "AsyncDisposableStack");
|
|
130
127
|
if (typeof fn !== "function") {
|
|
@@ -140,12 +137,9 @@ class AsyncDisposerStack {
|
|
|
140
137
|
this.#stack.push(resolveAsyncDisposer(value));
|
|
141
138
|
return value;
|
|
142
139
|
}
|
|
143
|
-
async
|
|
140
|
+
async dispose() {
|
|
144
141
|
await this.#disposeAllAsync();
|
|
145
142
|
}
|
|
146
|
-
async cleanup() {
|
|
147
|
-
await this.disposeAsync();
|
|
148
|
-
}
|
|
149
143
|
async#disposeAllAsync() {
|
|
150
144
|
if (this.#disposed) {
|
|
151
145
|
return;
|
|
@@ -227,8 +221,8 @@ async function resolveWithAbort(signal, promise, createAbortResult) {
|
|
|
227
221
|
// src/lib/modifiers/retry.ts
|
|
228
222
|
function retryOptions(policy) {
|
|
229
223
|
const limit = typeof policy === "number" ? policy : policy.limit;
|
|
230
|
-
invariant(Number.
|
|
231
|
-
invariant(limit >=
|
|
224
|
+
invariant(Number.isInteger(limit), new Panic("RETRY_INVALID_LIMIT"));
|
|
225
|
+
invariant(limit >= 1, new Panic("RETRY_INVALID_LIMIT"));
|
|
232
226
|
if (typeof policy === "number") {
|
|
233
227
|
return {
|
|
234
228
|
backoff: "constant",
|
|
@@ -291,9 +285,6 @@ function checkShouldAttemptRetry(error, ctx, config) {
|
|
|
291
285
|
}
|
|
292
286
|
return policy.shouldRetry(error, ctx);
|
|
293
287
|
}
|
|
294
|
-
function checkIsRetryExhausted(attempt, config) {
|
|
295
|
-
return config.retry !== undefined && attempt >= config.retry.limit;
|
|
296
|
-
}
|
|
297
288
|
|
|
298
289
|
// src/lib/modifiers/signal.ts
|
|
299
290
|
class SignalController {
|
|
@@ -329,6 +320,11 @@ class SignalController {
|
|
|
329
320
|
defineDisposeAlias(SignalController.prototype);
|
|
330
321
|
|
|
331
322
|
// src/lib/modifiers/timeout.ts
|
|
323
|
+
function assertValidTimeout(ms) {
|
|
324
|
+
invariant(Number.isFinite(ms), new Panic("TIMEOUT_INVALID_MS"));
|
|
325
|
+
invariant(ms >= 0, new Panic("TIMEOUT_INVALID_MS"));
|
|
326
|
+
}
|
|
327
|
+
|
|
332
328
|
class TimeoutController {
|
|
333
329
|
signal;
|
|
334
330
|
#controller;
|
|
@@ -340,8 +336,7 @@ class TimeoutController {
|
|
|
340
336
|
if (timeoutMs === undefined) {
|
|
341
337
|
return;
|
|
342
338
|
}
|
|
343
|
-
|
|
344
|
-
invariant(timeoutMs >= 0, new Panic("TIMEOUT_INVALID_MS"));
|
|
339
|
+
assertValidTimeout(timeoutMs);
|
|
345
340
|
this.#controller = new AbortController;
|
|
346
341
|
this.signal = this.#controller.signal;
|
|
347
342
|
if (this.#timeoutMs <= 0) {
|
|
@@ -557,17 +552,40 @@ class BaseExecution {
|
|
|
557
552
|
retryDelayForCurrentAttempt() {
|
|
558
553
|
return calculateRetryDelay(this.ctx.retry.attempt, this.config);
|
|
559
554
|
}
|
|
560
|
-
checkIsRetryExhaustedCurrentAttempt() {
|
|
561
|
-
return checkIsRetryExhausted(this.ctx.retry.attempt, this.config);
|
|
562
|
-
}
|
|
563
555
|
buildRetryDecision(error) {
|
|
564
556
|
const shouldAttemptRetry = this.shouldAttemptRetry(error);
|
|
565
557
|
return {
|
|
566
558
|
delay: shouldAttemptRetry ? this.retryDelayForCurrentAttempt() : 0,
|
|
567
|
-
isRetryExhausted: this.checkIsRetryExhaustedCurrentAttempt(),
|
|
568
559
|
shouldAttemptRetry
|
|
569
560
|
};
|
|
570
561
|
}
|
|
562
|
+
resolveControlOrRetry(error) {
|
|
563
|
+
if (error instanceof Panic) {
|
|
564
|
+
throw error;
|
|
565
|
+
}
|
|
566
|
+
if (error instanceof ControlError) {
|
|
567
|
+
return error;
|
|
568
|
+
}
|
|
569
|
+
const controlError = this.checkDidControlFail(error);
|
|
570
|
+
if (controlError) {
|
|
571
|
+
return controlError;
|
|
572
|
+
}
|
|
573
|
+
const retryDecision = this.buildRetryDecision(error);
|
|
574
|
+
if (retryDecision.shouldAttemptRetry) {
|
|
575
|
+
return new RetryDirective(retryDecision);
|
|
576
|
+
}
|
|
577
|
+
return;
|
|
578
|
+
}
|
|
579
|
+
resolveUnmappedFailure(error) {
|
|
580
|
+
const finalizeControlError = this.checkDidControlFail(error);
|
|
581
|
+
if (finalizeControlError) {
|
|
582
|
+
return finalizeControlError;
|
|
583
|
+
}
|
|
584
|
+
if (this.config.retry) {
|
|
585
|
+
return new RetryExhaustedError(undefined, { cause: error });
|
|
586
|
+
}
|
|
587
|
+
return new UnhandledException(undefined, { cause: error });
|
|
588
|
+
}
|
|
571
589
|
get #wrapCtx() {
|
|
572
590
|
this.#wrapCtxCache ??= BaseExecution.createWrapContext(this.ctx);
|
|
573
591
|
return this.#wrapCtxCache;
|
|
@@ -597,6 +615,47 @@ class OrchestrationExecution extends BaseExecution {
|
|
|
597
615
|
}
|
|
598
616
|
return await this.executeTasks();
|
|
599
617
|
}
|
|
618
|
+
async executeTaskGraph(graph, options = {}) {
|
|
619
|
+
let __stack = [];
|
|
620
|
+
try {
|
|
621
|
+
const execution = __using(__stack, graph, 1);
|
|
622
|
+
const {
|
|
623
|
+
mapFailure = (error) => ({ thrown: error }),
|
|
624
|
+
waitForTasksToSettle = true
|
|
625
|
+
} = options;
|
|
626
|
+
let result;
|
|
627
|
+
let threw = false;
|
|
628
|
+
let thrownError;
|
|
629
|
+
try {
|
|
630
|
+
result = await this.raceWithCancellation(execution.execute());
|
|
631
|
+
} catch (error) {
|
|
632
|
+
const outcome = await mapFailure(error);
|
|
633
|
+
if ("mapped" in outcome) {
|
|
634
|
+
result = outcome.mapped;
|
|
635
|
+
} else {
|
|
636
|
+
threw = true;
|
|
637
|
+
thrownError = outcome.thrown;
|
|
638
|
+
}
|
|
639
|
+
} finally {
|
|
640
|
+
if (waitForTasksToSettle) {
|
|
641
|
+
await execution.waitForTasksToSettle();
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
const cancellation = this.checkDidCancel(thrownError);
|
|
645
|
+
if (cancellation) {
|
|
646
|
+
throw cancellation;
|
|
647
|
+
}
|
|
648
|
+
if (threw) {
|
|
649
|
+
throw thrownError;
|
|
650
|
+
}
|
|
651
|
+
return result;
|
|
652
|
+
} catch (_catch) {
|
|
653
|
+
var _err = _catch, _hasErr = 1;
|
|
654
|
+
} finally {
|
|
655
|
+
var _promise = __callDispose(__stack, _err, _hasErr);
|
|
656
|
+
_promise && await _promise;
|
|
657
|
+
}
|
|
658
|
+
}
|
|
600
659
|
}
|
|
601
660
|
|
|
602
661
|
class TaskGraphExecutionBase {
|
|
@@ -617,8 +676,8 @@ class TaskGraphExecutionBase {
|
|
|
617
676
|
this.resolvers = new Map;
|
|
618
677
|
this.taskSignal = signal ? AbortSignal.any([signal, this.internalController.signal]) : this.internalController.signal;
|
|
619
678
|
}
|
|
620
|
-
async
|
|
621
|
-
await this.disposer.
|
|
679
|
+
async dispose() {
|
|
680
|
+
await this.disposer.dispose();
|
|
622
681
|
}
|
|
623
682
|
getTaskHandler(taskName) {
|
|
624
683
|
const taskFn = this.tasks[taskName];
|
|
@@ -691,22 +750,13 @@ class TaskGraphExecutionBase {
|
|
|
691
750
|
this.internalController.abort(error);
|
|
692
751
|
}
|
|
693
752
|
}
|
|
694
|
-
onTaskResult(_taskName, _value) {
|
|
695
|
-
this.tasks;
|
|
696
|
-
}
|
|
697
|
-
onTaskError(_taskName, _error) {
|
|
698
|
-
this.tasks;
|
|
699
|
-
}
|
|
700
753
|
mapStoredError(error) {
|
|
701
|
-
this.tasks;
|
|
702
754
|
return error instanceof Error ? error : new UnhandledException(undefined, { cause: error });
|
|
703
755
|
}
|
|
704
756
|
shouldAbortOnTaskError(_error) {
|
|
705
|
-
this.tasks;
|
|
706
757
|
return false;
|
|
707
758
|
}
|
|
708
759
|
shouldRethrowTaskError(_error) {
|
|
709
|
-
this.tasks;
|
|
710
760
|
return true;
|
|
711
761
|
}
|
|
712
762
|
setFirstRejection(error) {
|
|
@@ -719,11 +769,11 @@ class TaskGraphExecutionBase {
|
|
|
719
769
|
const context = this.createTaskContext(resultProxy);
|
|
720
770
|
const result = await taskFn.call(context);
|
|
721
771
|
this.storeResult(taskName, result);
|
|
722
|
-
this.onTaskResult(taskName, result);
|
|
772
|
+
this.onTaskResult?.(taskName, result);
|
|
723
773
|
} catch (error) {
|
|
724
774
|
this.setFirstRejection(error);
|
|
725
775
|
this.storeError(taskName, error);
|
|
726
|
-
this.onTaskError(taskName, error);
|
|
776
|
+
this.onTaskError?.(taskName, error);
|
|
727
777
|
if (this.shouldAbortOnTaskError(error)) {
|
|
728
778
|
this.abortInternal(error);
|
|
729
779
|
}
|
|
@@ -803,68 +853,44 @@ class AllExecution extends OrchestrationExecution {
|
|
|
803
853
|
this.#tasks = tasks;
|
|
804
854
|
this.#options = options;
|
|
805
855
|
}
|
|
806
|
-
|
|
807
|
-
|
|
856
|
+
executeTasks() {
|
|
857
|
+
const execution = new TaskExecution(this.executionSignal, this.#tasks, "fail-fast");
|
|
858
|
+
return this.executeTaskGraph(execution, {
|
|
859
|
+
mapFailure: (error) => this.#mapFailure(execution, error)
|
|
860
|
+
});
|
|
861
|
+
}
|
|
862
|
+
async#mapFailure(execution, error) {
|
|
863
|
+
const controlAfterFailure = this.checkDidControlFail(error);
|
|
864
|
+
const catchFn = this.#options?.catch;
|
|
865
|
+
if (controlAfterFailure) {
|
|
866
|
+
return { thrown: controlAfterFailure };
|
|
867
|
+
}
|
|
868
|
+
if (!catchFn) {
|
|
869
|
+
return { thrown: error };
|
|
870
|
+
}
|
|
871
|
+
const context = {
|
|
872
|
+
failedTask: execution.failedTask,
|
|
873
|
+
partial: execution.returnValue,
|
|
874
|
+
signal: execution.signal
|
|
875
|
+
};
|
|
808
876
|
try {
|
|
809
|
-
const
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
877
|
+
const mapped = catchFn(error, context);
|
|
878
|
+
if (!checkIsPromiseLike(mapped)) {
|
|
879
|
+
return { mapped };
|
|
880
|
+
}
|
|
813
881
|
try {
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
const catchFn = this.#options?.catch;
|
|
818
|
-
if (controlAfterFailure) {
|
|
819
|
-
threw = true;
|
|
820
|
-
thrownError = controlAfterFailure;
|
|
821
|
-
} else if (catchFn) {
|
|
822
|
-
const context = {
|
|
823
|
-
failedTask: execution.failedTask,
|
|
824
|
-
partial: execution.returnValue,
|
|
825
|
-
signal: execution.signal
|
|
826
|
-
};
|
|
827
|
-
try {
|
|
828
|
-
const mapped = catchFn(error, context);
|
|
829
|
-
if (checkIsPromiseLike(mapped)) {
|
|
830
|
-
try {
|
|
831
|
-
result = await this.raceWithCancellation(Promise.resolve(mapped).catch((catchError) => {
|
|
832
|
-
if (catchError instanceof CancellationError) {
|
|
833
|
-
throw catchError;
|
|
834
|
-
}
|
|
835
|
-
throw new Panic("ALL_CATCH_HANDLER_REJECT", { cause: catchError });
|
|
836
|
-
}), error);
|
|
837
|
-
} catch (mappedError) {
|
|
838
|
-
threw = true;
|
|
839
|
-
thrownError = mappedError;
|
|
840
|
-
}
|
|
841
|
-
} else {
|
|
842
|
-
result = mapped;
|
|
843
|
-
}
|
|
844
|
-
} catch (catchError) {
|
|
845
|
-
threw = true;
|
|
846
|
-
thrownError = new Panic("ALL_CATCH_HANDLER_THROW", { cause: catchError });
|
|
882
|
+
const raced = await this.raceWithCancellation(Promise.resolve(mapped).catch((catchError) => {
|
|
883
|
+
if (catchError instanceof CancellationError) {
|
|
884
|
+
throw catchError;
|
|
847
885
|
}
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
await execution.waitForTasksToSettle();
|
|
854
|
-
}
|
|
855
|
-
const cancellation = this.checkDidCancel(thrownError);
|
|
856
|
-
if (cancellation) {
|
|
857
|
-
throw cancellation;
|
|
886
|
+
throw new Panic("ALL_CATCH_HANDLER_REJECT", { cause: catchError });
|
|
887
|
+
}), error);
|
|
888
|
+
return { mapped: raced };
|
|
889
|
+
} catch (mappedError) {
|
|
890
|
+
return { thrown: mappedError };
|
|
858
891
|
}
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
}
|
|
862
|
-
return result;
|
|
863
|
-
} catch (_catch) {
|
|
864
|
-
var _err = _catch, _hasErr = 1;
|
|
865
|
-
} finally {
|
|
866
|
-
var _promise = __callDispose(__stack, _err, _hasErr);
|
|
867
|
-
_promise && await _promise;
|
|
892
|
+
} catch (catchError) {
|
|
893
|
+
return { thrown: new Panic("ALL_CATCH_HANDLER_THROW", { cause: catchError }) };
|
|
868
894
|
}
|
|
869
895
|
}
|
|
870
896
|
}
|
|
@@ -887,22 +913,10 @@ class AllSettledExecution extends OrchestrationExecution {
|
|
|
887
913
|
super(config);
|
|
888
914
|
this.#tasks = tasks;
|
|
889
915
|
}
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
const result = await this.raceWithCancellation(execution.execute());
|
|
895
|
-
const cancellation = this.checkDidCancel();
|
|
896
|
-
if (cancellation) {
|
|
897
|
-
throw cancellation;
|
|
898
|
-
}
|
|
899
|
-
return result;
|
|
900
|
-
} catch (_catch) {
|
|
901
|
-
var _err = _catch, _hasErr = 1;
|
|
902
|
-
} finally {
|
|
903
|
-
var _promise = __callDispose(__stack, _err, _hasErr);
|
|
904
|
-
_promise && await _promise;
|
|
905
|
-
}
|
|
916
|
+
executeTasks() {
|
|
917
|
+
return this.executeTaskGraph(new TaskExecution(this.executionSignal, this.#tasks, "settled"), {
|
|
918
|
+
waitForTasksToSettle: false
|
|
919
|
+
});
|
|
906
920
|
}
|
|
907
921
|
}
|
|
908
922
|
async function executeAllSettled(config, tasks) {
|
|
@@ -972,7 +986,6 @@ class FlowExecution extends TaskGraphExecutionBase {
|
|
|
972
986
|
return super.mapStoredError(error);
|
|
973
987
|
}
|
|
974
988
|
shouldAbortOnTaskError() {
|
|
975
|
-
this.taskNames;
|
|
976
989
|
return true;
|
|
977
990
|
}
|
|
978
991
|
waitForFirstRejection() {
|
|
@@ -991,35 +1004,8 @@ class FlowRunnerExecution extends OrchestrationExecution {
|
|
|
991
1004
|
super(config);
|
|
992
1005
|
this.#tasks = tasks;
|
|
993
1006
|
}
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
try {
|
|
997
|
-
const execution = __using(__stack, new FlowExecution(this.executionSignal, this.#tasks), 1);
|
|
998
|
-
let result;
|
|
999
|
-
let threw = false;
|
|
1000
|
-
let thrownError;
|
|
1001
|
-
try {
|
|
1002
|
-
result = await this.raceWithCancellation(execution.execute());
|
|
1003
|
-
} catch (error) {
|
|
1004
|
-
threw = true;
|
|
1005
|
-
thrownError = error;
|
|
1006
|
-
} finally {
|
|
1007
|
-
await execution.waitForTasksToSettle();
|
|
1008
|
-
}
|
|
1009
|
-
const cancellation = this.checkDidCancel(thrownError);
|
|
1010
|
-
if (cancellation) {
|
|
1011
|
-
throw cancellation;
|
|
1012
|
-
}
|
|
1013
|
-
if (threw) {
|
|
1014
|
-
throw thrownError;
|
|
1015
|
-
}
|
|
1016
|
-
return result;
|
|
1017
|
-
} catch (_catch) {
|
|
1018
|
-
var _err = _catch, _hasErr = 1;
|
|
1019
|
-
} finally {
|
|
1020
|
-
var _promise = __callDispose(__stack, _err, _hasErr);
|
|
1021
|
-
_promise && await _promise;
|
|
1022
|
-
}
|
|
1007
|
+
executeTasks() {
|
|
1008
|
+
return this.executeTaskGraph(new FlowExecution(this.executionSignal, this.#tasks));
|
|
1023
1009
|
}
|
|
1024
1010
|
}
|
|
1025
1011
|
async function executeFlow(config, tasks) {
|
|
@@ -1047,33 +1033,17 @@ class RunExecution extends BaseExecution {
|
|
|
1047
1033
|
return this.#runAttemptLoop(1);
|
|
1048
1034
|
}
|
|
1049
1035
|
async#resolveFailure(error) {
|
|
1050
|
-
|
|
1051
|
-
|
|
1036
|
+
const resolved = this.resolveControlOrRetry(error);
|
|
1037
|
+
if (resolved) {
|
|
1038
|
+
return resolved;
|
|
1052
1039
|
}
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
const controlError = this.checkDidControlFail(error);
|
|
1057
|
-
if (controlError) {
|
|
1058
|
-
return controlError;
|
|
1059
|
-
}
|
|
1060
|
-
const retryDecision = this.buildRetryDecision(error);
|
|
1061
|
-
if (retryDecision.shouldAttemptRetry) {
|
|
1062
|
-
return new RetryDirective(retryDecision);
|
|
1063
|
-
}
|
|
1064
|
-
if (retryDecision.isRetryExhausted) {
|
|
1065
|
-
return new RetryExhaustedError(undefined, { cause: error });
|
|
1066
|
-
}
|
|
1067
|
-
if (!this.#catchFn) {
|
|
1068
|
-
const finalizeControlError = this.checkDidControlFail(error);
|
|
1069
|
-
if (finalizeControlError) {
|
|
1070
|
-
return finalizeControlError;
|
|
1071
|
-
}
|
|
1072
|
-
return new UnhandledException(undefined, { cause: error });
|
|
1040
|
+
const catchFn = this.#catchFn;
|
|
1041
|
+
if (!catchFn) {
|
|
1042
|
+
return this.resolveUnmappedFailure(error);
|
|
1073
1043
|
}
|
|
1074
1044
|
let mapped;
|
|
1075
1045
|
try {
|
|
1076
|
-
mapped =
|
|
1046
|
+
mapped = catchFn(error);
|
|
1077
1047
|
} catch (catchError) {
|
|
1078
1048
|
throw new Panic("RUN_CATCH_HANDLER_THROW", { cause: catchError });
|
|
1079
1049
|
}
|
|
@@ -1157,33 +1127,17 @@ class RunSyncExecution extends BaseExecution {
|
|
|
1157
1127
|
return this.#runAttemptLoop(1);
|
|
1158
1128
|
}
|
|
1159
1129
|
#resolveFailure(error) {
|
|
1160
|
-
|
|
1161
|
-
|
|
1130
|
+
const resolved = this.resolveControlOrRetry(error);
|
|
1131
|
+
if (resolved) {
|
|
1132
|
+
return resolved;
|
|
1162
1133
|
}
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
const controlError = this.checkDidControlFail(error);
|
|
1167
|
-
if (controlError) {
|
|
1168
|
-
return controlError;
|
|
1169
|
-
}
|
|
1170
|
-
const retryDecision = this.buildRetryDecision(error);
|
|
1171
|
-
if (retryDecision.shouldAttemptRetry) {
|
|
1172
|
-
return new RetryDirective(retryDecision);
|
|
1173
|
-
}
|
|
1174
|
-
if (retryDecision.isRetryExhausted) {
|
|
1175
|
-
return new RetryExhaustedError(undefined, { cause: error });
|
|
1176
|
-
}
|
|
1177
|
-
if (!this.#catchFn) {
|
|
1178
|
-
const finalizeControlError = this.checkDidControlFail(error);
|
|
1179
|
-
if (finalizeControlError) {
|
|
1180
|
-
return finalizeControlError;
|
|
1181
|
-
}
|
|
1182
|
-
return new UnhandledException(undefined, { cause: error });
|
|
1134
|
+
const catchFn = this.#catchFn;
|
|
1135
|
+
if (!catchFn) {
|
|
1136
|
+
return this.resolveUnmappedFailure(error);
|
|
1183
1137
|
}
|
|
1184
1138
|
let mapped;
|
|
1185
1139
|
try {
|
|
1186
|
-
mapped =
|
|
1140
|
+
mapped = catchFn(error);
|
|
1187
1141
|
} catch (catchError) {
|
|
1188
1142
|
throw new Panic("RUN_SYNC_CATCH_HANDLER_THROW", { cause: catchError });
|
|
1189
1143
|
}
|
|
@@ -1242,8 +1196,7 @@ class RunBuilder {
|
|
|
1242
1196
|
this.config = config;
|
|
1243
1197
|
}
|
|
1244
1198
|
buildTimeoutConfig(ms) {
|
|
1245
|
-
|
|
1246
|
-
invariant(ms >= 0, new Panic("TIMEOUT_INVALID_MS"));
|
|
1199
|
+
assertValidTimeout(ms);
|
|
1247
1200
|
return {
|
|
1248
1201
|
...this.config,
|
|
1249
1202
|
timeout: ms
|
|
@@ -1256,18 +1209,15 @@ class RunBuilder {
|
|
|
1256
1209
|
};
|
|
1257
1210
|
}
|
|
1258
1211
|
retry(policy) {
|
|
1259
|
-
return new
|
|
1212
|
+
return new RunBuilder({
|
|
1260
1213
|
...this.config,
|
|
1261
1214
|
retry: retryOptions(policy)
|
|
1262
1215
|
});
|
|
1263
1216
|
}
|
|
1264
1217
|
timeout(ms) {
|
|
1265
|
-
return new
|
|
1218
|
+
return new RunBuilder(this.buildTimeoutConfig(ms));
|
|
1266
1219
|
}
|
|
1267
1220
|
signal(signal) {
|
|
1268
|
-
if (this instanceof ExecutionBuilder) {
|
|
1269
|
-
return new ExecutionBuilder(this.buildSignalConfig(signal));
|
|
1270
|
-
}
|
|
1271
1221
|
return new RunBuilder(this.buildSignalConfig(signal));
|
|
1272
1222
|
}
|
|
1273
1223
|
wrap(fn) {
|
|
@@ -1293,20 +1243,8 @@ class RunBuilder {
|
|
|
1293
1243
|
}
|
|
1294
1244
|
}
|
|
1295
1245
|
|
|
1296
|
-
class ExecutionBuilder extends RunBuilder {
|
|
1297
|
-
constructor(config = {}) {
|
|
1298
|
-
super(config);
|
|
1299
|
-
Object.defineProperties(this, {
|
|
1300
|
-
all: { configurable: true, value: undefined, writable: false },
|
|
1301
|
-
allSettled: { configurable: true, value: undefined, writable: false },
|
|
1302
|
-
flow: { configurable: true, value: undefined, writable: false },
|
|
1303
|
-
wrap: { configurable: true, value: undefined, writable: false }
|
|
1304
|
-
});
|
|
1305
|
-
}
|
|
1306
|
-
}
|
|
1307
|
-
|
|
1308
1246
|
// src/lib/dispose.ts
|
|
1309
|
-
function
|
|
1247
|
+
function disposer() {
|
|
1310
1248
|
return createAsyncDisposer();
|
|
1311
1249
|
}
|
|
1312
1250
|
// src/lib/gen.ts
|
|
@@ -1381,10 +1319,10 @@ export {
|
|
|
1381
1319
|
retry,
|
|
1382
1320
|
driveGen as gen,
|
|
1383
1321
|
flow,
|
|
1384
|
-
|
|
1322
|
+
disposer,
|
|
1385
1323
|
allSettled,
|
|
1386
1324
|
all
|
|
1387
1325
|
};
|
|
1388
1326
|
|
|
1389
|
-
//# debugId=
|
|
1390
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3NoaW1zL2Rpc3Bvc2VyLnRzIiwgInNyYy9saWIvdXRpbHMudHMiLCAic3JjL2xpYi9tb2RpZmllcnMvcmV0cnkudHMiLCAic3JjL2xpYi9tb2RpZmllcnMvc2lnbmFsLnRzIiwgInNyYy9saWIvbW9kaWZpZXJzL3RpbWVvdXQudHMiLCAic3JjL2xpYi9leGVjdXRvcnMvYmFzZS50cyIsICJzcmMvbGliL2V4ZWN1dG9ycy9zaGFyZWQudHMiLCAic3JjL2xpYi9leGVjdXRvcnMvYWxsLnRzIiwgInNyYy9saWIvZXhlY3V0b3JzL2FsbC1zZXR0bGVkLnRzIiwgInNyYy9saWIvZXhlY3V0b3JzL2Zsb3cudHMiLCAic3JjL2xpYi9leGVjdXRvcnMvcnVuLnRzIiwgInNyYy9saWIvZXhlY3V0b3JzL3J1bi1zeW5jLnRzIiwgInNyYy9saWIvYnVpbGRlci50cyIsICJzcmMvbGliL2Rpc3Bvc2UudHMiLCAic3JjL2xpYi9nZW4udHMiLCAic3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImNvbnN0IFNVUFBSRVNTRURfRVJST1JfTUVTU0FHRSA9IFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsXCJcblxuY29uc3QgbmF0aXZlRGlzcG9zZSA9IFJlZmxlY3QuZ2V0KFN5bWJvbCwgXCJkaXNwb3NlXCIpXG5jb25zdCBuYXRpdmVBc3luY0Rpc3Bvc2UgPSBSZWZsZWN0LmdldChTeW1ib2wsIFwiYXN5bmNEaXNwb3NlXCIpXG5cbmV4cG9ydCBjb25zdCBESVNQT1NFOiBzeW1ib2wgPVxuICB0eXBlb2YgbmF0aXZlRGlzcG9zZSA9PT0gXCJzeW1ib2xcIiA/IG5hdGl2ZURpc3Bvc2UgOiBTeW1ib2wuZm9yKFwiU3ltYm9sLmRpc3Bvc2VcIilcbmV4cG9ydCBjb25zdCBBU1lOQ19ESVNQT1NFOiBzeW1ib2wgPVxuICB0eXBlb2YgbmF0aXZlQXN5bmNEaXNwb3NlID09PSBcInN5bWJvbFwiID8gbmF0aXZlQXN5bmNEaXNwb3NlIDogU3ltYm9sLmZvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2VcIilcblxudHlwZSBTeW5jRGlzcG9zZXIgPSAoKSA9PiB2b2lkXG50eXBlIEFzeW5jRGlzcG9zZXJGbiA9ICgpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPlxuXG5leHBvcnQgdHlwZSBEaXNwb3NhYmxlTGlrZSA9IHtcbiAgW0RJU1BPU0VdKCk6IHZvaWRcbn1cblxuZXhwb3J0IHR5cGUgQXN5bmNEaXNwb3NhYmxlTGlrZSA9IHtcbiAgW0FTWU5DX0RJU1BPU0VdKCk6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPlxufVxuXG5leHBvcnQgdHlwZSBNYXliZURpc3Bvc2FibGUgPSBBc3luY0Rpc3Bvc2FibGVMaWtlIHwgRGlzcG9zYWJsZUxpa2UgfCBudWxsIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNEaXNwb3NlciBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIGFkZChmbjogKCkgPT4gdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+KTogdm9pZFxuICBjbGVhbnVwKCk6IFByb21pc2U8dm9pZD5cbiAgZGVmZXIoZm46ICgpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPik6IHZvaWRcbiAgdXNlPFQgZXh0ZW5kcyBBc3luY0Rpc3Bvc2FibGUgfCBEaXNwb3NhYmxlIHwgbnVsbCB8IHVuZGVmaW5lZD4odmFsdWU6IFQpOiBUXG4gIGRpc3Bvc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVEaXNwb3NlQWxpYXMocHJvdG90eXBlOiB7IGRpc3Bvc2UoKTogdm9pZCB9KTogdm9pZCB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90b3R5cGUsIERJU1BPU0UsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWUodGhpczogeyBkaXNwb3NlKCk6IHZvaWQgfSkge1xuICAgICAgdGhpcy5kaXNwb3NlKClcbiAgICB9LFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQXN5bmNEaXNwb3NlQWxpYXMocHJvdG90eXBlOiB7IGRpc3Bvc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IH0pOiB2b2lkIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSwgQVNZTkNfRElTUE9TRSwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBhc3luYyB2YWx1ZSh0aGlzOiB7IGRpc3Bvc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IH0pIHtcbiAgICAgIGF3YWl0IHRoaXMuZGlzcG9zZUFzeW5jKClcbiAgICB9LFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICB9KVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTdXBwcmVzc2VkRXJyb3IoZXJyb3I6IHVua25vd24sIHN1cHByZXNzZWQ6IHVua25vd24pOiBFcnJvciB7XG4gIGlmICh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gbmV3IFN1cHByZXNzZWRFcnJvcihlcnJvciwgc3VwcHJlc3NlZCwgU1VQUFJFU1NFRF9FUlJPUl9NRVNTQUdFKVxuICB9XG5cbiAgY29uc3Qgd3JhcHBlZCA9IG5ldyBFcnJvcihTVVBQUkVTU0VEX0VSUk9SX01FU1NBR0UpIGFzIEVycm9yICYge1xuICAgIGVycm9yOiB1bmtub3duXG4gICAgc3VwcHJlc3NlZDogdW5rbm93blxuICB9XG5cbiAgd3JhcHBlZC5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIlxuICB3cmFwcGVkLmVycm9yID0gZXJyb3JcbiAgd3JhcHBlZC5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZFxuXG4gIHJldHVybiB3cmFwcGVkXG59XG5cbmZ1bmN0aW9uIGNoZWNrQ2FuUmVnaXN0ZXIoZGlzcG9zZWQ6IGJvb2xlYW4sIG5hbWU6IHN0cmluZykge1xuICBpZiAoZGlzcG9zZWQpIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoYCR7bmFtZX0gYWxyZWFkeSBkaXNwb3NlZGApXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVN5bmNEaXNwb3Nlcih2YWx1ZTogRGlzcG9zYWJsZSB8IERpc3Bvc2FibGVMaWtlKTogU3luY0Rpc3Bvc2VyIHtcbiAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWUgYXMgRGlzcG9zYWJsZUxpa2VcbiAgY29uc3QgZGlzcG9zZXIgPSBjYW5kaWRhdGVbRElTUE9TRV1cblxuICBpZiAodHlwZW9mIGRpc3Bvc2VyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlXCIpXG4gIH1cblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGRpc3Bvc2VyLmNhbGwodmFsdWUpXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFzeW5jRGlzcG9zZXIoXG4gIHZhbHVlOiBBc3luY0Rpc3Bvc2FibGUgfCBEaXNwb3NhYmxlIHwgTWF5YmVEaXNwb3NhYmxlXG4pOiBBc3luY0Rpc3Bvc2VyRm4ge1xuICBjb25zdCBhc3luY0NhbmRpZGF0ZSA9IHZhbHVlIGFzIEFzeW5jRGlzcG9zYWJsZUxpa2VcbiAgY29uc3QgYXN5bmNEaXNwb3NlciA9IGFzeW5jQ2FuZGlkYXRlW0FTWU5DX0RJU1BPU0VdXG5cbiAgaWYgKHR5cGVvZiBhc3luY0Rpc3Bvc2VyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gKCkgPT4gYXN5bmNEaXNwb3Nlci5jYWxsKHZhbHVlKVxuICB9XG5cbiAgY29uc3Qgc3luY0NhbmRpZGF0ZSA9IHZhbHVlIGFzIERpc3Bvc2FibGVMaWtlXG4gIGNvbnN0IHN5bmNEaXNwb3NlciA9IHN5bmNDYW5kaWRhdGVbRElTUE9TRV1cblxuICBpZiAodHlwZW9mIHN5bmNEaXNwb3NlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHN5bmNEaXNwb3Nlci5jYWxsKHZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGVcIilcbn1cblxuZXhwb3J0IGNsYXNzIEludGVybmFsRGlzcG9zYWJsZVN0YWNrIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gICNkaXNwb3NlZCA9IGZhbHNlXG4gICNzdGFjazogU3luY0Rpc3Bvc2VyW10gPSBbXVxuICBkZWNsYXJlIFtTeW1ib2wuZGlzcG9zZV06ICgpID0+IHZvaWRcblxuICBkZWZlcihmbjogU3luY0Rpc3Bvc2VyKTogdm9pZCB7XG4gICAgY2hlY2tDYW5SZWdpc3Rlcih0aGlzLiNkaXNwb3NlZCwgXCJEaXNwb3NhYmxlU3RhY2tcIilcbiAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7U3RyaW5nKGZuKX0gaXMgbm90IGEgZnVuY3Rpb25gKVxuICAgIH1cbiAgICB0aGlzLiNzdGFjay5wdXNoKGZuKVxuICB9XG5cbiAgdXNlPFQgZXh0ZW5kcyBEaXNwb3NhYmxlIHwgRGlzcG9zYWJsZUxpa2U+KHZhbHVlOiBUKTogVFxuICB1c2UodmFsdWU6IG51bGwpOiBudWxsXG4gIHVzZSh2YWx1ZTogdW5kZWZpbmVkKTogdW5kZWZpbmVkXG4gIHVzZSh2YWx1ZTogRGlzcG9zYWJsZSB8IERpc3Bvc2FibGVMaWtlIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBjaGVja0NhblJlZ2lzdGVyKHRoaXMuI2Rpc3Bvc2VkLCBcIkRpc3Bvc2FibGVTdGFja1wiKVxuICAgIHRoaXMuI3N0YWNrLnB1c2gocmVzb2x2ZVN5bmNEaXNwb3Nlcih2YWx1ZSkpXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuI2Rpc3Bvc2VBbGwoKVxuICB9XG5cbiAgI2Rpc3Bvc2VBbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLiNkaXNwb3NlZCA9IHRydWVcblxuICAgIGxldCBlcnJvcjogdW5rbm93blxuXG4gICAgd2hpbGUgKHRoaXMuI3N0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGRpc3Bvc2VyID0gdGhpcy4jc3RhY2sucG9wKClcblxuICAgICAgaWYgKCFkaXNwb3Nlcikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBkaXNwb3NlcigpXG4gICAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgICBlcnJvciA9IGVycm9yID09PSB1bmRlZmluZWQgPyBjYXVnaHRFcnJvciA6IGNyZWF0ZVN1cHByZXNzZWRFcnJvcihjYXVnaHRFcnJvciwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsLCB0eXBlc2NyaXB0L29ubHktdGhyb3ctZXJyb3IgLS0gUHJlc2VydmUgcmF3IGRpc3Bvc2VyIGZhaWx1cmVzLlxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cbn1cbmRlZmluZURpc3Bvc2VBbGlhcyhJbnRlcm5hbERpc3Bvc2FibGVTdGFjay5wcm90b3R5cGUpXG5cbmNsYXNzIEFzeW5jRGlzcG9zZXJTdGFjayBpbXBsZW1lbnRzIEFzeW5jRGlzcG9zZXIge1xuICAjZGlzcG9zZWQgPSBmYWxzZVxuICAjc3RhY2s6IEFzeW5jRGlzcG9zZXJGbltdID0gW11cbiAgZGVjbGFyZSBbU3ltYm9sLmFzeW5jRGlzcG9zZV06ICgpID0+IFByb21pc2U8dm9pZD5cblxuICBhZGQoZm46IEFzeW5jRGlzcG9zZXJGbik6IHZvaWQge1xuICAgIHRoaXMuZGVmZXIoZm4pXG4gIH1cblxuICBkZWZlcihmbjogQXN5bmNEaXNwb3NlckZuKTogdm9pZCB7XG4gICAgY2hlY2tDYW5SZWdpc3Rlcih0aGlzLiNkaXNwb3NlZCwgXCJBc3luY0Rpc3Bvc2FibGVTdGFja1wiKVxuICAgIGlmICh0eXBlb2YgZm4gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtTdHJpbmcoZm4pfSBpcyBub3QgYSBmdW5jdGlvbmApXG4gICAgfVxuICAgIHRoaXMuI3N0YWNrLnB1c2goZm4pXG4gIH1cblxuICB1c2U8VCBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZSB8IERpc3Bvc2FibGU+KHZhbHVlOiBUKTogVFxuICB1c2UodmFsdWU6IG51bGwpOiBudWxsXG4gIHVzZSh2YWx1ZTogdW5kZWZpbmVkKTogdW5kZWZpbmVkXG4gIHVzZSh2YWx1ZTogQXN5bmNEaXNwb3NhYmxlIHwgRGlzcG9zYWJsZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgY2hlY2tDYW5SZWdpc3Rlcih0aGlzLiNkaXNwb3NlZCwgXCJBc3luY0Rpc3Bvc2FibGVTdGFja1wiKVxuICAgIHRoaXMuI3N0YWNrLnB1c2gocmVzb2x2ZUFzeW5jRGlzcG9zZXIodmFsdWUpKVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgYXN5bmMgZGlzcG9zZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuI2Rpc3Bvc2VBbGxBc3luYygpXG4gIH1cblxuICBhc3luYyBjbGVhbnVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGlzcG9zZUFzeW5jKClcbiAgfVxuXG4gIGFzeW5jICNkaXNwb3NlQWxsQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLiNkaXNwb3NlZCA9IHRydWVcblxuICAgIGxldCBlcnJvcjogdW5rbm93blxuXG4gICAgd2hpbGUgKHRoaXMuI3N0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGRpc3Bvc2VyID0gdGhpcy4jc3RhY2sucG9wKClcblxuICAgICAgaWYgKCFkaXNwb3Nlcikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBDbGVhbnVwIG11c3QgcmVtYWluIHNlcXVlbnRpYWwgc28gTElGTyB0ZWFyZG93biBvcmRlciBpcyBwcmVzZXJ2ZWQuXG4gICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgIGF3YWl0IGRpc3Bvc2VyKClcbiAgICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICAgIGVycm9yID0gZXJyb3IgPT09IHVuZGVmaW5lZCA/IGNhdWdodEVycm9yIDogY3JlYXRlU3VwcHJlc3NlZEVycm9yKGNhdWdodEVycm9yLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWwsIHR5cGVzY3JpcHQvb25seS10aHJvdy1lcnJvciAtLSBQcmVzZXJ2ZSByYXcgYXN5bmMgZGlzcG9zZXIgZmFpbHVyZXMuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxufVxuZGVmaW5lQXN5bmNEaXNwb3NlQWxpYXMoQXN5bmNEaXNwb3NlclN0YWNrLnByb3RvdHlwZSlcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFzeW5jRGlzcG9zZXIoKTogQXN5bmNEaXNwb3NlciB7XG4gIHJldHVybiBuZXcgQXN5bmNEaXNwb3NlclN0YWNrKClcbn1cbiIsCiAgICAiaW1wb3J0IHsgSW50ZXJuYWxEaXNwb3NhYmxlU3RhY2sgfSBmcm9tIFwiLi4vc2hpbXMvZGlzcG9zZXJcIlxuaW1wb3J0IHsgUGFuaWMsIHR5cGUgUGFuaWNDb2RlIH0gZnJvbSBcIi4vZXJyb3JzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFVucmVhY2hhYmxlKHZhbHVlOiBuZXZlciwgY29kZTogUGFuaWNDb2RlKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgUGFuaWMoY29kZSwgeyBtZXNzYWdlOiBgVW5yZWFjaGFibGUgY2FzZTogJHtTdHJpbmcodmFsdWUpfWAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludmFyaWFudChjb25kaXRpb246IHVua25vd24sIGVycm9yOiBFcnJvcik6IGFzc2VydHMgY29uZGl0aW9uIHtcbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChtcyA8PSAwKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKVxuICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc1Byb21pc2VMaWtlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvbWlzZUxpa2U8dW5rbm93bj4ge1xuICByZXR1cm4gKFxuICAgICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIHsgdGhlbj86IHVua25vd24gfSkudGhlbiA9PT0gXCJmdW5jdGlvblwiXG4gIClcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXaXRoQWJvcnQ8ViwgRT4oXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gIHByb21pc2U6IFByb21pc2VMaWtlPFY+LFxuICBjcmVhdGVBYm9ydFJlc3VsdDogKCkgPT4gRVxuKTogUHJvbWlzZTxWIHwgRT4ge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAvLyBXZSByZXR1cm4gdGhlIGFib3J0IHJlc3VsdCBpbW1lZGlhdGVseSwgc28gYXR0YWNoIGEgbm8tb3AgaGFuZGxlciB0b1xuICAgIC8vIGF2b2lkIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gaWYgdGhlIG9yaWdpbmFsIHByb21pc2UgcmVqZWN0cyBsYXRlci5cbiAgICB2b2lkIFByb21pc2UucmVzb2x2ZShwcm9taXNlKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHZvaWQgZXJyb3IpXG4gICAgcmV0dXJuIGNyZWF0ZUFib3J0UmVzdWx0KClcbiAgfVxuXG4gIHVzaW5nIGRpc3Bvc2VyID0gbmV3IEludGVybmFsRGlzcG9zYWJsZVN0YWNrKClcblxuICBjb25zdCBhYm9ydFByb21pc2UgPSBuZXcgUHJvbWlzZTxFPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICByZXNvbHZlKGNyZWF0ZUFib3J0UmVzdWx0KCkpXG4gICAgfVxuXG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBvbkFib3J0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pXG4gICAgZGlzcG9zZXIuZGVmZXIoKCkgPT4ge1xuICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KVxuICAgIH0pXG4gIH0pXG5cbiAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbUHJvbWlzZS5yZXNvbHZlKHByb21pc2UpLCBhYm9ydFByb21pc2VdKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEJ1aWxkZXJDb25maWcgfSBmcm9tIFwiLi4vYnVpbGRlclwiXG5pbXBvcnQgdHlwZSB7IFRyeUN0eCB9IGZyb20gXCIuLi9leGVjdXRvcnMvc2hhcmVkXCJcbmltcG9ydCB7IFBhbmljIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyBhc3NlcnRVbnJlYWNoYWJsZSwgaW52YXJpYW50IH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuaW50ZXJmYWNlIEJhc2VSZXRyeVBvbGljeSB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBmaXJzdCBydW4uXG4gICAqL1xuICBsaW1pdDogbnVtYmVyXG4gIC8qKlxuICAgKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBhdHRlbXB0cy4gRGVmYXVsdHMgdG8gMC5cbiAgICovXG4gIGRlbGF5TXM/OiBudW1iZXJcbiAgLyoqXG4gICAqIEFkZHMgcmFuZG9tIGppdHRlciB0byBkZWxheXMgd2hlbiBlbmFibGVkLlxuICAgKi9cbiAgaml0dGVyPzogYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJuIHRydWUgdG8gcmV0cnkgYWZ0ZXIgYW4gZXJyb3IsIGZhbHNlIHRvIHN0b3AuXG4gICAqL1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93biwgY3R4OiBUcnlDdHgpID0+IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIExpbmVhckJhY2tvZmZSZXRyeVBvbGljeSBleHRlbmRzIEJhc2VSZXRyeVBvbGljeSB7XG4gIC8qKlxuICAgKiBVc2UgbGluZWFybHkgaW5jcmVhc2luZyBkZWxheSBiZXR3ZWVuIGF0dGVtcHRzLlxuICAgKi9cbiAgYmFja29mZjogXCJsaW5lYXJcIlxuICAvKipcbiAgICogTm90IHN1cHBvcnRlZCBmb3IgbGluZWFyIGJhY2tvZmYuXG4gICAqL1xuICBtYXhEZWxheU1zPzogbmV2ZXJcbn1cblxuaW50ZXJmYWNlIEV4cG9uZW50aWFsQmFja29mZlJldHJ5UG9saWN5IGV4dGVuZHMgQmFzZVJldHJ5UG9saWN5IHtcbiAgLyoqXG4gICAqIFVzZSBleHBvbmVudGlhbCBkZWxheSBncm93dGggYmV0d2VlbiBhdHRlbXB0cy5cbiAgICovXG4gIGJhY2tvZmY6IFwiZXhwb25lbnRpYWxcIlxuICAvKipcbiAgICogT3B0aW9uYWwgY2FwIGZvciBleHBvbmVudGlhbCBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBtYXhEZWxheU1zPzogbnVtYmVyXG59XG5cbi8qKlxuICogUmV0cnkgcG9saWN5IHVzaW5nIGEgY29uc3RhbnQgZGVsYXkgc3RyYXRlZ3kuXG4gKi9cbmludGVyZmFjZSBDb25zdGFudEJhY2tvZmZSZXRyeVBvbGljeSBleHRlbmRzIEJhc2VSZXRyeVBvbGljeSB7XG4gIC8qKlxuICAgKiBSZXF1aXJlZCBkaXNjcmltaW5hbnQ6IHVzZSBhIGZpeGVkIGRlbGF5IGJldHdlZW4gYXR0ZW1wdHMuXG4gICAqL1xuICBiYWNrb2ZmOiBcImNvbnN0YW50XCJcbiAgLyoqXG4gICAqIE5vdCBzdXBwb3J0ZWQgZm9yIGNvbnN0YW50IGJhY2tvZmYuXG4gICAqL1xuICBtYXhEZWxheU1zPzogbmV2ZXJcbn1cblxuLyoqXG4gKiBSZXRyeSBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAqL1xuZXhwb3J0IHR5cGUgUmV0cnlQb2xpY3kgPVxuICB8IExpbmVhckJhY2tvZmZSZXRyeVBvbGljeVxuICB8IEV4cG9uZW50aWFsQmFja29mZlJldHJ5UG9saWN5XG4gIHwgQ29uc3RhbnRCYWNrb2ZmUmV0cnlQb2xpY3lcblxuLyoqXG4gKiBSZXRyeSBzaG9ydGhhbmQgb3IgZnVsbCByZXRyeSBjb25maWd1cmF0aW9uLlxuICpcbiAqIC0gYG51bWJlcmA6IGF0dGVtcHQgbGltaXRcbiAqIC0gYFJldHJ5UG9saWN5YDogZGV0YWlsZWQgcmV0cnkgc2V0dGluZ3NcbiAqL1xuZXhwb3J0IHR5cGUgUmV0cnlPcHRpb25zID0gbnVtYmVyIHwgUmV0cnlQb2xpY3lcblxuZXhwb3J0IGZ1bmN0aW9uIHJldHJ5T3B0aW9ucyhwb2xpY3k6IFJldHJ5T3B0aW9ucyk6IFJldHJ5UG9saWN5IHtcbiAgY29uc3QgbGltaXQgPSB0eXBlb2YgcG9saWN5ID09PSBcIm51bWJlclwiID8gcG9saWN5IDogcG9saWN5LmxpbWl0XG5cbiAgaW52YXJpYW50KE51bWJlci5pc0Zpbml0ZShsaW1pdCksIG5ldyBQYW5pYyhcIlJFVFJZX0lOVkFMSURfTElNSVRcIikpXG4gIGludmFyaWFudChsaW1pdCA+PSAwLCBuZXcgUGFuaWMoXCJSRVRSWV9JTlZBTElEX0xJTUlUXCIpKVxuXG4gIGlmICh0eXBlb2YgcG9saWN5ID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhY2tvZmY6IFwiY29uc3RhbnRcIixcbiAgICAgIGRlbGF5TXM6IDAsXG4gICAgICBsaW1pdDogcG9saWN5LFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJhc2UgPSB7XG4gICAgZGVsYXlNczogcG9saWN5LmRlbGF5TXMgPz8gMCxcbiAgICBqaXR0ZXI6IHBvbGljeS5qaXR0ZXIsXG4gICAgbGltaXQ6IHBvbGljeS5saW1pdCxcbiAgICBzaG91bGRSZXRyeTogcG9saWN5LnNob3VsZFJldHJ5LFxuICB9XG5cbiAgc3dpdGNoIChwb2xpY3kuYmFja29mZikge1xuICAgIGNhc2UgXCJjb25zdGFudFwiOlxuICAgIGNhc2UgXCJsaW5lYXJcIjpcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIGJhY2tvZmY6IHBvbGljeS5iYWNrb2ZmIH1cbiAgICBjYXNlIFwiZXhwb25lbnRpYWxcIjpcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIGJhY2tvZmY6IHBvbGljeS5iYWNrb2ZmLCBtYXhEZWxheU1zOiBwb2xpY3kubWF4RGVsYXlNcyB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBhc3NlcnRVbnJlYWNoYWJsZShwb2xpY3ksIFwiVU5SRUFDSEFCTEVfUkVUUllfUE9MSUNZX0JBQ0tPRkZcIilcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlUmV0cnlEZWxheShhdHRlbXB0OiBudW1iZXIsIGNvbmZpZzogQnVpbGRlckNvbmZpZyk6IG51bWJlciB7XG4gIGNvbnN0IHBvbGljeSA9IGNvbmZpZy5yZXRyeVxuXG4gIGlmICghcG9saWN5KSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuXG4gIGNvbnN0IGJhc2VEZWxheSA9IHBvbGljeS5kZWxheU1zID8/IDBcbiAgbGV0IGRlbGF5ID0gMFxuXG4gIHN3aXRjaCAocG9saWN5LmJhY2tvZmYpIHtcbiAgICBjYXNlIFwiY29uc3RhbnRcIjpcbiAgICAgIGRlbGF5ID0gYmFzZURlbGF5XG4gICAgICBicmVha1xuICAgIGNhc2UgXCJsaW5lYXJcIjpcbiAgICAgIGRlbGF5ID0gYmFzZURlbGF5ICogYXR0ZW1wdFxuICAgICAgYnJlYWtcbiAgICBjYXNlIFwiZXhwb25lbnRpYWxcIjpcbiAgICAgIGRlbGF5ID0gYmFzZURlbGF5ICogMiAqKiAoYXR0ZW1wdCAtIDEpXG5cbiAgICAgIGlmIChwb2xpY3kubWF4RGVsYXlNcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGF5ID0gTWF0aC5taW4oZGVsYXksIHBvbGljeS5tYXhEZWxheU1zKVxuICAgICAgfVxuXG4gICAgICBicmVha1xuICB9XG5cbiAgaWYgKCFwb2xpY3kuaml0dGVyIHx8IGRlbGF5IDw9IDApIHtcbiAgICByZXR1cm4gZGVsYXlcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBkZWxheSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrU2hvdWxkQXR0ZW1wdFJldHJ5KFxuICBlcnJvcjogdW5rbm93bixcbiAgY3R4OiBUcnlDdHgsXG4gIGNvbmZpZzogQnVpbGRlckNvbmZpZ1xuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBvbGljeSA9IGNvbmZpZy5yZXRyeVxuXG4gIGlmICghcG9saWN5KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAoY3R4LnJldHJ5LmF0dGVtcHQgPj0gcG9saWN5LmxpbWl0KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAoIXBvbGljeS5zaG91bGRSZXRyeSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gcG9saWN5LnNob3VsZFJldHJ5KGVycm9yLCBjdHgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0lzUmV0cnlFeGhhdXN0ZWQoYXR0ZW1wdDogbnVtYmVyLCBjb25maWc6IEJ1aWxkZXJDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5yZXRyeSAhPT0gdW5kZWZpbmVkICYmIGF0dGVtcHQgPj0gY29uZmlnLnJldHJ5LmxpbWl0XG59XG4iLAogICAgImltcG9ydCB7IGRlZmluZURpc3Bvc2VBbGlhcyB9IGZyb20gXCIuLi8uLi9zaGltcy9kaXNwb3NlclwiXG5pbXBvcnQgeyBDYW5jZWxsYXRpb25FcnJvciwgVGltZW91dEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyByZXNvbHZlV2l0aEFib3J0IH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuZXhwb3J0IGNsYXNzIFNpZ25hbENvbnRyb2xsZXIge1xuICByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbFxuICBkZWNsYXJlIFtTeW1ib2wuZGlzcG9zZV06ICgpID0+IHZvaWRcblxuICBjb25zdHJ1Y3RvcihzaWduYWxzOiByZWFkb25seSBBYm9ydFNpZ25hbFtdID0gW10pIHtcbiAgICBpZiAoc2lnbmFscy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNpZ25hbCA9IEFib3J0U2lnbmFsLmFueShbLi4uc2lnbmFsc10pXG4gICAgfVxuICB9XG5cbiAgY2hlY2tEaWRDYW5jZWwoY2F1c2U/OiB1bmtub3duKTogQ2FuY2VsbGF0aW9uRXJyb3IgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLnNpZ25hbC5yZWFzb24gaW5zdGFuY2VvZiBUaW1lb3V0RXJyb3IpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJldHVybiBuZXcgQ2FuY2VsbGF0aW9uRXJyb3IodW5kZWZpbmVkLCB7IGNhdXNlOiBjYXVzZSA/PyB0aGlzLnNpZ25hbC5yZWFzb24gfSlcbiAgfVxuXG4gIHJhY2U8Vj4ocHJvbWlzZTogUHJvbWlzZUxpa2U8Vj4sIGNhdXNlPzogdW5rbm93bik6IFByb21pc2VMaWtlPFYgfCBDYW5jZWxsYXRpb25FcnJvcj4ge1xuICAgIGNvbnN0IGNhbmNlbGxlZCA9IHRoaXMuY2hlY2tEaWRDYW5jZWwoY2F1c2UpXG5cbiAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNhbmNlbGxlZClcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2lnbmFsKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlV2l0aEFib3J0KFxuICAgICAgdGhpcy5zaWduYWwsXG4gICAgICBwcm9taXNlLFxuICAgICAgKCkgPT4gbmV3IENhbmNlbGxhdGlvbkVycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogY2F1c2UgPz8gdGhpcy5zaWduYWw/LnJlYXNvbiB9KVxuICAgIClcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgLy8gSW50ZW50aW9uYWxseSBhIG5vLW9wOiBBYm9ydFNpZ25hbC5hbnkoKSBkb2VzIG5vdCBjcmVhdGUgcmVzb3VyY2VzIHRoYXRcbiAgICAvLyBuZWVkIGV4cGxpY2l0IHRlYXJkb3duLCBzbyBub3RoaW5nIG5lZWRzIHRvIGJlIHJlbGVhc2VkIGhlcmUuIFRoZSBtZXRob2RcbiAgICAvLyBleGlzdHMgdG8gc2F0aXNmeSB0aGUgRGlzcG9zYWJsZSBpbnRlcmZhY2Ugc2hhcmVkIHdpdGggVGltZW91dENvbnRyb2xsZXIuXG4gICAgdm9pZCB0aGlzLnNpZ25hbFxuICB9XG59XG5kZWZpbmVEaXNwb3NlQWxpYXMoU2lnbmFsQ29udHJvbGxlci5wcm90b3R5cGUpXG4iLAogICAgImltcG9ydCB7IGRlZmluZURpc3Bvc2VBbGlhcyB9IGZyb20gXCIuLi8uLi9zaGltcy9kaXNwb3NlclwiXG5pbXBvcnQgeyBQYW5pYywgVGltZW91dEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyBpbnZhcmlhbnQsIHJlc29sdmVXaXRoQWJvcnQgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG5leHBvcnQgY2xhc3MgVGltZW91dENvbnRyb2xsZXIge1xuICByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbFxuICByZWFkb25seSAjY29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlclxuICByZWFkb25seSAjc3RhcnRlZEF0ID0gRGF0ZS5ub3coKVxuICByZWFkb25seSAjdGltZW91dE1zOiBudW1iZXJcbiAgI3RpbWVvdXRJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWRcbiAgZGVjbGFyZSBbU3ltYm9sLmRpc3Bvc2VdOiAoKSA9PiB2b2lkXG5cbiAgY29uc3RydWN0b3IodGltZW91dE1zPzogbnVtYmVyKSB7XG4gICAgdGhpcy4jdGltZW91dE1zID0gdGltZW91dE1zID8/IC0xXG5cbiAgICBpZiAodGltZW91dE1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGludmFyaWFudChOdW1iZXIuaXNGaW5pdGUodGltZW91dE1zKSwgbmV3IFBhbmljKFwiVElNRU9VVF9JTlZBTElEX01TXCIpKVxuICAgIGludmFyaWFudCh0aW1lb3V0TXMgPj0gMCwgbmV3IFBhbmljKFwiVElNRU9VVF9JTlZBTElEX01TXCIpKVxuXG4gICAgdGhpcy4jY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIHRoaXMuc2lnbmFsID0gdGhpcy4jY29udHJvbGxlci5zaWduYWxcblxuICAgIGlmICh0aGlzLiN0aW1lb3V0TXMgPD0gMCkge1xuICAgICAgdGhpcy4jYWJvcnQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy4jdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLiNhYm9ydCgpXG4gICAgfSwgdGhpcy4jdGltZW91dE1zKVxuICB9XG5cbiAgI2Fib3J0KGNhdXNlPzogdW5rbm93bikge1xuICAgIGNvbnN0IHRpbWVvdXRFcnJvciA9IG5ldyBUaW1lb3V0RXJyb3IoYEV4ZWN1dGlvbiBleGNlZWRlZCB0aW1lb3V0IG9mICR7dGhpcy4jdGltZW91dE1zfW1zYCwge1xuICAgICAgY2F1c2UsXG4gICAgfSlcblxuICAgIGlmICghdGhpcy5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgIHRoaXMuI2NvbnRyb2xsZXI/LmFib3J0KHRpbWVvdXRFcnJvcilcbiAgICB9XG5cbiAgICByZXR1cm4gdGltZW91dEVycm9yXG4gIH1cblxuICBnZXQgI3JlbWFpbmluZygpIHtcbiAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHRoaXMuI3N0YXJ0ZWRBdFxuXG4gICAgcmV0dXJuIHRoaXMuI3RpbWVvdXRNcyAtIGVsYXBzZWRcbiAgfVxuXG4gIGNoZWNrRGlkVGltZW91dChjYXVzZT86IHVua25vd24pOiBUaW1lb3V0RXJyb3IgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5zaWduYWwpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBjb25zdCByZWFzb24gPSB0aGlzLnNpZ25hbC5yZWFzb25cblxuICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFRpbWVvdXRFcnJvcikge1xuICAgICAgICByZXR1cm4gcmVhc29uXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgVGltZW91dEVycm9yKGBFeGVjdXRpb24gZXhjZWVkZWQgdGltZW91dCBvZiAke3RoaXMuI3RpbWVvdXRNc31tc2AsIHtcbiAgICAgICAgY2F1c2U6IGNhdXNlID8/IHJlYXNvbixcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuI3JlbWFpbmluZyA+IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNhYm9ydChjYXVzZSlcbiAgfVxuXG4gIHJhY2U8Vj4ocHJvbWlzZTogUHJvbWlzZUxpa2U8Vj4sIGNhdXNlPzogdW5rbm93bik6IFByb21pc2VMaWtlPFYgfCBUaW1lb3V0RXJyb3I+IHtcbiAgICBpZiAoIXRoaXMuc2lnbmFsKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGlmICh0aGlzLiNyZW1haW5pbmcgPD0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLiNhYm9ydChjYXVzZSkpXG4gICAgfVxuXG4gICAgY29uc3QgdGltZWRPdXQgPSB0aGlzLmNoZWNrRGlkVGltZW91dChjYXVzZSlcblxuICAgIGlmICh0aW1lZE91dCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aW1lZE91dClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZVdpdGhBYm9ydChcbiAgICAgIHRoaXMuc2lnbmFsLFxuICAgICAgcHJvbWlzZSxcbiAgICAgICgpID0+XG4gICAgICAgIHRoaXMuY2hlY2tEaWRUaW1lb3V0KGNhdXNlKSA/P1xuICAgICAgICBuZXcgVGltZW91dEVycm9yKGBFeGVjdXRpb24gZXhjZWVkZWQgdGltZW91dCBvZiAke3RoaXMuI3RpbWVvdXRNc31tc2AsIHsgY2F1c2UgfSlcbiAgICApXG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiN0aW1lb3V0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI3RpbWVvdXRJZClcbiAgICB9XG4gIH1cbn1cbmRlZmluZURpc3Bvc2VBbGlhcyhUaW1lb3V0Q29udHJvbGxlci5wcm90b3R5cGUpXG4iLAogICAgImltcG9ydCB0eXBlIHsgQnVpbGRlckNvbmZpZywgV3JhcEN0eCB9IGZyb20gXCIuLi9idWlsZGVyXCJcbmltcG9ydCB0eXBlIHsgUmV0cnlFeGhhdXN0ZWRFcnJvciwgVW5oYW5kbGVkRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgdHlwZSB7IFRyeUN0eCB9IGZyb20gXCIuL3NoYXJlZFwiXG5pbXBvcnQgeyBkZWZpbmVEaXNwb3NlQWxpYXMsIEludGVybmFsRGlzcG9zYWJsZVN0YWNrIH0gZnJvbSBcIi4uLy4uL3NoaW1zL2Rpc3Bvc2VyXCJcbmltcG9ydCB7IENhbmNlbGxhdGlvbkVycm9yLCBUaW1lb3V0RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCJcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZVJldHJ5RGVsYXksXG4gIGNoZWNrSXNSZXRyeUV4aGF1c3RlZCxcbiAgY2hlY2tTaG91bGRBdHRlbXB0UmV0cnksXG59IGZyb20gXCIuLi9tb2RpZmllcnMvcmV0cnlcIlxuaW1wb3J0IHsgU2lnbmFsQ29udHJvbGxlciB9IGZyb20gXCIuLi9tb2RpZmllcnMvc2lnbmFsXCJcbmltcG9ydCB7IFRpbWVvdXRDb250cm9sbGVyIH0gZnJvbSBcIi4uL21vZGlmaWVycy90aW1lb3V0XCJcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuaW50ZXJmYWNlIEJhc2VFeGVjdXRpb25PcHRpb25zIHtcbiAgcmV0cnlMaW1pdD86IG51bWJlclxufVxuXG5leHBvcnQgdHlwZSBSZXRyeURlY2lzaW9uID0ge1xuICBkZWxheTogbnVtYmVyXG4gIGlzUmV0cnlFeGhhdXN0ZWQ6IGJvb2xlYW5cbiAgc2hvdWxkQXR0ZW1wdFJldHJ5OiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIFJ1bm5lckVycm9yID1cbiAgfCBDYW5jZWxsYXRpb25FcnJvclxuICB8IFJldHJ5RXhoYXVzdGVkRXJyb3JcbiAgfCBUaW1lb3V0RXJyb3JcbiAgfCBVbmhhbmRsZWRFeGNlcHRpb25cblxuZXhwb3J0IGNsYXNzIFJldHJ5RGlyZWN0aXZlIHtcbiAgcmVhZG9ubHkgZGVjaXNpb246IFJldHJ5RGVjaXNpb25cblxuICBjb25zdHJ1Y3RvcihkZWNpc2lvbjogUmV0cnlEZWNpc2lvbikge1xuICAgIHRoaXMuZGVjaXNpb24gPSBkZWNpc2lvblxuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRXhlY3V0aW9uPFRSZXN1bHQgPSB1bmtub3duPiBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29uZmlnOiBCdWlsZGVyQ29uZmlnXG4gIHByb3RlY3RlZCByZWFkb25seSBjdHg6IFRyeUN0eFxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXhlY3V0aW9uU2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZFxuICAjd3JhcEN0eENhY2hlOiBXcmFwQ3R4IHwgdW5kZWZpbmVkXG4gIHJlYWRvbmx5ICNzaWduYWxDb250cm9sbGVyOiBTaWduYWxDb250cm9sbGVyIHwgdW5kZWZpbmVkXG4gIHJlYWRvbmx5ICN0aW1lb3V0Q29udHJvbGxlcjogVGltZW91dENvbnRyb2xsZXIgfCB1bmRlZmluZWRcbiAgZGVjbGFyZSBbU3ltYm9sLmRpc3Bvc2VdOiAoKSA9PiB2b2lkXG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGNvbmZpZzogQnVpbGRlckNvbmZpZywgb3B0aW9uczogQmFzZUV4ZWN1dGlvbk9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnXG4gICAgdGhpcy4jdGltZW91dENvbnRyb2xsZXIgPSBCYXNlRXhlY3V0aW9uLmNyZWF0ZVRpbWVvdXRDb250cm9sbGVyKGNvbmZpZy50aW1lb3V0KVxuICAgIHRoaXMuI3NpZ25hbENvbnRyb2xsZXIgPSBCYXNlRXhlY3V0aW9uLmNyZWF0ZVNpZ25hbENvbnRyb2xsZXIoXG4gICAgICBjb25maWcuc2lnbmFscyxcbiAgICAgIHRoaXMuI3RpbWVvdXRDb250cm9sbGVyPy5zaWduYWxcbiAgICApXG4gICAgdGhpcy5leGVjdXRpb25TaWduYWwgPSB0aGlzLiNzaWduYWxDb250cm9sbGVyPy5zaWduYWxcbiAgICB0aGlzLmN0eCA9IEJhc2VFeGVjdXRpb24uY3JlYXRlQ29udGV4dChjb25maWcsIHRoaXMuZXhlY3V0aW9uU2lnbmFsLCBvcHRpb25zLnJldHJ5TGltaXQpXG4gIH1cblxuICBleGVjdXRlKCk6IFRSZXN1bHQge1xuICAgIC8vIFdyYXBzIGNvdmVyIHRoZSBmdWxsIHJldHJ5IHNjb3BlOyBgY3R4LnJldHJ5LmF0dGVtcHRgIG1heSByZWZsZWN0IHRoZSBmaW5hbFxuICAgIC8vIGF0dGVtcHQgd2hlbiBvYnNlcnZlZCBhZnRlciBgbmV4dCgpYCByZXNvbHZlcy5cbiAgICBjb25zdCB3cmFwcyA9IHRoaXMuY29uZmlnLndyYXBzXG5cbiAgICBpZiAoIXdyYXBzIHx8IHdyYXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUNvcmUoKVxuICAgIH1cblxuICAgIGxldCBuZXh0ID0gKCk6IHVua25vd24gPT4gdGhpcy5leGVjdXRlQ29yZSgpXG5cbiAgICBmb3IgKGNvbnN0IHdyYXAgb2Ygd3JhcHMudG9SZXZlcnNlZCgpKSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IG5leHRcbiAgICAgIG5leHQgPSAoKSA9PiB3cmFwKHRoaXMuI3dyYXBDdHgsIHByZXZpb3VzKVxuICAgIH1cblxuICAgIHJldHVybiBuZXh0KCkgYXMgVFJlc3VsdFxuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGV4ZWN1dGVDb3JlKCk6IFRSZXN1bHRcblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy4jdGltZW91dENvbnRyb2xsZXIgJiYgIXRoaXMuI3NpZ25hbENvbnRyb2xsZXIpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRpc3Bvc2VyID0gbmV3IEludGVybmFsRGlzcG9zYWJsZVN0YWNrKClcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy4jdGltZW91dENvbnRyb2xsZXIpIHtcbiAgICAgICAgZGlzcG9zZXIudXNlKHRoaXMuI3RpbWVvdXRDb250cm9sbGVyKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy4jc2lnbmFsQ29udHJvbGxlcikge1xuICAgICAgICBkaXNwb3Nlci51c2UodGhpcy4jc2lnbmFsQ29udHJvbGxlcilcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgZGlzcG9zZXIuZGlzcG9zZSgpXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBjcmVhdGVDb250ZXh0KFxuICAgIGNvbmZpZzogQnVpbGRlckNvbmZpZyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuICAgIHJldHJ5TGltaXQ/OiBudW1iZXJcbiAgKTogVHJ5Q3R4IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmV0cnk6IHtcbiAgICAgICAgYXR0ZW1wdDogMSxcbiAgICAgICAgbGltaXQ6IHJldHJ5TGltaXQgPz8gY29uZmlnLnJldHJ5Py5saW1pdCA/PyAxLFxuICAgICAgfSxcbiAgICAgIHNpZ25hbCxcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGNyZWF0ZVRpbWVvdXRDb250cm9sbGVyKFxuICAgIHRpbWVvdXRNczogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICk6IFRpbWVvdXRDb250cm9sbGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGltZW91dE1zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBuZXcgVGltZW91dENvbnRyb2xsZXIodGltZW91dE1zKVxuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBjcmVhdGVTaWduYWxDb250cm9sbGVyKFxuICAgIHNpZ25hbHM6IHJlYWRvbmx5IEFib3J0U2lnbmFsW10gfCB1bmRlZmluZWQsXG4gICAgdGltZW91dFNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWRcbiAgKTogU2lnbmFsQ29udHJvbGxlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29tcG9zZWRTaWduYWxzID0gWy4uLihzaWduYWxzID8/IFtdKSwgdGltZW91dFNpZ25hbF0uZmlsdGVyKFxuICAgICAgKHZhbHVlKTogdmFsdWUgaXMgQWJvcnRTaWduYWwgPT4gdmFsdWUgIT09IHVuZGVmaW5lZFxuICAgIClcblxuICAgIHJldHVybiBjb21wb3NlZFNpZ25hbHMubGVuZ3RoID4gMCA/IG5ldyBTaWduYWxDb250cm9sbGVyKGNvbXBvc2VkU2lnbmFscykgOiB1bmRlZmluZWRcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgY3JlYXRlV3JhcENvbnRleHQoY3R4OiBUcnlDdHgpOiBXcmFwQ3R4IHtcbiAgICBjb25zdCByZXRyeSA9IG5ldyBQcm94eShjdHgucmV0cnksIHtcbiAgICAgIGRlZmluZVByb3BlcnR5OiAoKSA9PiBmYWxzZSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiAoKSA9PiBmYWxzZSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5KSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5KVxuXG4gICAgICAgIGlmICghZGVzY3JpcHRvcikge1xuICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlc2NyaXB0b3IsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiAoKSA9PiBmYWxzZSxcbiAgICB9KVxuXG4gICAgY29uc3QgaGFuZGxlcjogUHJveHlIYW5kbGVyPFRyeUN0eD4gPSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eTogKCkgPT4gZmFsc2UsXG4gICAgICBkZWxldGVQcm9wZXJ0eTogKCkgPT4gZmFsc2UsXG4gICAgICBnZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKHByb3BlcnR5ID09PSBcInJldHJ5XCIpIHtcbiAgICAgICAgICByZXR1cm4gcmV0cnlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlOiB1bmtub3duID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5KSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5KVxuXG4gICAgICAgIGlmICghZGVzY3JpcHRvcikge1xuICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHkgPT09IFwicmV0cnlcIikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5kZXNjcmlwdG9yLFxuICAgICAgICAgICAgdmFsdWU6IHJldHJ5LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZGVzY3JpcHRvcixcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6ICgpID0+IGZhbHNlLFxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJveHkoY3R4LCBoYW5kbGVyKVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrRGlkQ2FuY2VsKGNhdXNlPzogdW5rbm93bik6IENhbmNlbGxhdGlvbkVycm9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jc2lnbmFsQ29udHJvbGxlcj8uY2hlY2tEaWRDYW5jZWwoY2F1c2UpXG4gIH1cblxuICBwcm90ZWN0ZWQgcmFjZVdpdGhDYW5jZWxsYXRpb248Vj4oXG4gICAgcHJvbWlzZTogUHJvbWlzZUxpa2U8Vj4sXG4gICAgY2F1c2U/OiB1bmtub3duXG4gICk6IFByb21pc2VMaWtlPFYgfCBDYW5jZWxsYXRpb25FcnJvcj4ge1xuICAgIHJldHVybiB0aGlzLiNzaWduYWxDb250cm9sbGVyID8gdGhpcy4jc2lnbmFsQ29udHJvbGxlci5yYWNlKHByb21pc2UsIGNhdXNlKSA6IHByb21pc2VcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0RpZENvbnRyb2xGYWlsKGNhdXNlPzogdW5rbm93bik6IENhbmNlbGxhdGlvbkVycm9yIHwgVGltZW91dEVycm9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja0RpZENhbmNlbChjYXVzZSkgPz8gdGhpcy4jdGltZW91dENvbnRyb2xsZXI/LmNoZWNrRGlkVGltZW91dChjYXVzZSlcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlU3luY1N1Y2Nlc3M8VD4odmFsdWU6IFQpOiBUIHwgQ2FuY2VsbGF0aW9uRXJyb3IgfCBUaW1lb3V0RXJyb3Ige1xuICAgIHJldHVybiB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoKSA/PyB2YWx1ZVxuICB9XG5cbiAgcHJvdGVjdGVkIHJhY2U8Vj4oXG4gICAgcHJvbWlzZTogUHJvbWlzZUxpa2U8Vj4sXG4gICAgY2F1c2U/OiB1bmtub3duXG4gICk6IFByb21pc2VMaWtlPFYgfCBDYW5jZWxsYXRpb25FcnJvciB8IFRpbWVvdXRFcnJvcj4ge1xuICAgIGNvbnN0IHRpbWVvdXRDb250cm9sbGVyID0gdGhpcy4jdGltZW91dENvbnRyb2xsZXJcblxuICAgIGlmICghdGltZW91dENvbnRyb2xsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJhY2VXaXRoQ2FuY2VsbGF0aW9uKHByb21pc2UsIGNhdXNlKVxuICAgIH1cblxuICAgIC8vIE5lc3QgY2FuY2VsbGF0aW9uIGluc2lkZSB0aGUgdGltZW91dCByYWNlIHNvIGNhbmNlbGxhdGlvbiB0YWtlcyBwcmlvcml0eVxuICAgIC8vIHdoZW4gYm90aCBmaXJlOiBpZiBjYW5jZWxsYXRpb24gd2lucywgdGhlIGlubmVyIHByb21pc2UgYWxyZWFkeSByZXNvbHZlc1xuICAgIC8vIHdpdGggYSBDYW5jZWxsYXRpb25FcnJvcjsgaWYgdGltZW91dCB3aW5zLCByZS1jaGVjayBjYW5jZWxsYXRpb24gaGVyZSBzbyBhXG4gICAgLy8gbmVhci1zaW11bHRhbmVvdXMgY2FuY2VsIGlzIHN0aWxsIHJlcG9ydGVkIG92ZXIgdGhlIHRpbWVvdXQuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIHRpbWVvdXRDb250cm9sbGVyLnJhY2UodGhpcy5yYWNlV2l0aENhbmNlbGxhdGlvbihwcm9taXNlLCBjYXVzZSksIGNhdXNlKVxuICAgICkudGhlbigocmFjZWQpID0+IHtcbiAgICAgIGlmIChyYWNlZCBpbnN0YW5jZW9mIFRpbWVvdXRFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja0RpZENhbmNlbChjYXVzZSkgPz8gcmFjZWRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJhY2VkXG4gICAgfSlcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB3YWl0Rm9yUmV0cnlEZWxheShcbiAgICBkZWxheTogbnVtYmVyXG4gICk6IFByb21pc2U8Q2FuY2VsbGF0aW9uRXJyb3IgfCBUaW1lb3V0RXJyb3IgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoZGVsYXkgPD0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IHNsZWVwUmVzdWx0ID0gYXdhaXQgdGhpcy5yYWNlKHNsZWVwKGRlbGF5KSlcblxuICAgIGlmIChzbGVlcFJlc3VsdCBpbnN0YW5jZW9mIENhbmNlbGxhdGlvbkVycm9yIHx8IHNsZWVwUmVzdWx0IGluc3RhbmNlb2YgVGltZW91dEVycm9yKSB7XG4gICAgICByZXR1cm4gc2xlZXBSZXN1bHRcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvdWxkQXR0ZW1wdFJldHJ5KGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNoZWNrU2hvdWxkQXR0ZW1wdFJldHJ5KGVycm9yLCB0aGlzLmN0eCwgdGhpcy5jb25maWcpXG4gIH1cblxuICBwcm90ZWN0ZWQgcmV0cnlEZWxheUZvckN1cnJlbnRBdHRlbXB0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGNhbGN1bGF0ZVJldHJ5RGVsYXkodGhpcy5jdHgucmV0cnkuYXR0ZW1wdCwgdGhpcy5jb25maWcpXG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tJc1JldHJ5RXhoYXVzdGVkQ3VycmVudEF0dGVtcHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNoZWNrSXNSZXRyeUV4aGF1c3RlZCh0aGlzLmN0eC5yZXRyeS5hdHRlbXB0LCB0aGlzLmNvbmZpZylcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFJldHJ5RGVjaXNpb24oZXJyb3I6IHVua25vd24pOiBSZXRyeURlY2lzaW9uIHtcbiAgICBjb25zdCBzaG91bGRBdHRlbXB0UmV0cnkgPSB0aGlzLnNob3VsZEF0dGVtcHRSZXRyeShlcnJvcilcblxuICAgIHJldHVybiB7XG4gICAgICBkZWxheTogc2hvdWxkQXR0ZW1wdFJldHJ5ID8gdGhpcy5yZXRyeURlbGF5Rm9yQ3VycmVudEF0dGVtcHQoKSA6IDAsXG4gICAgICBpc1JldHJ5RXhoYXVzdGVkOiB0aGlzLmNoZWNrSXNSZXRyeUV4aGF1c3RlZEN1cnJlbnRBdHRlbXB0KCksXG4gICAgICBzaG91bGRBdHRlbXB0UmV0cnksXG4gICAgfVxuICB9XG5cbiAgZ2V0ICN3cmFwQ3R4KCk6IFdyYXBDdHgge1xuICAgIHRoaXMuI3dyYXBDdHhDYWNoZSA/Pz0gQmFzZUV4ZWN1dGlvbi5jcmVhdGVXcmFwQ29udGV4dCh0aGlzLmN0eClcbiAgICByZXR1cm4gdGhpcy4jd3JhcEN0eENhY2hlXG4gIH1cbn1cbmRlZmluZURpc3Bvc2VBbGlhcyhCYXNlRXhlY3V0aW9uLnByb3RvdHlwZSlcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBBc3luY0Rpc3Bvc2VyIH0gZnJvbSBcIi4uLy4uL3NoaW1zL2Rpc3Bvc2VyXCJcbmltcG9ydCB0eXBlIHsgQnVpbGRlckNvbmZpZyB9IGZyb20gXCIuLi9idWlsZGVyXCJcbmltcG9ydCB7IGNyZWF0ZUFzeW5jRGlzcG9zZXIsIGRlZmluZUFzeW5jRGlzcG9zZUFsaWFzIH0gZnJvbSBcIi4uLy4uL3NoaW1zL2Rpc3Bvc2VyXCJcbmltcG9ydCB7IFBhbmljLCBVbmhhbmRsZWRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXJyb3JzXCJcbmltcG9ydCB7IGludmFyaWFudCB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBCYXNlRXhlY3V0aW9uIH0gZnJvbSBcIi4vYmFzZVwiXG5cbnR5cGUgUmVzb2x2ZXJQYWlyID0gWyh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCwgKHJlYXNvbj86IHVua25vd24pID0+IHZvaWRdXG5cbnR5cGUgVGFza0V4ZWN1dGlvbk1vZGUgPSBcImZhaWwtZmFzdFwiIHwgXCJzZXR0bGVkXCJcblxuLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4cGxpY2l0LWFueSAtLSBSZXF1aXJlZCBmb3IgdGFzay1tYXAgaW5mZXJlbmNlXG5leHBvcnQgdHlwZSBUYXNrUmVjb3JkID0gUmVjb3JkPHN0cmluZywgYW55PlxuXG5leHBvcnQgdHlwZSBUYXNrVmFsaWRhdGlvbjxUIGV4dGVuZHMgVGFza1JlY29yZD4gPSB7XG4gIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHBsaWNpdC1hbnkgLS0gUmVxdWlyZWQgZm9yIGZ1bmN0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBjb250ZXh0dWFsIGB0aGlzYFxuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gVFtLXSA6IG5ldmVyXG59XG5cbi8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHBsaWNpdC1hbnkgLS0gUmVxdWlyZWQgZm9yIGZ1bmN0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBjb250ZXh0dWFsIGB0aGlzYFxuZXhwb3J0IHR5cGUgVGFza1Jlc3VsdDxUPiA9IFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGluZmVyIFIgPyBBd2FpdGVkPFI+IDogbmV2ZXJcblxuZXhwb3J0IHR5cGUgUmVzdWx0UHJveHk8VCBleHRlbmRzIFRhc2tSZWNvcmQ+ID0ge1xuICByZWFkb25seSBbSyBpbiBrZXlvZiBUXTogUHJvbWlzZTxUYXNrUmVzdWx0PFRbS10+PlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tDb250ZXh0PFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiB7XG4gICRyZXN1bHQ6IFJlc3VsdFByb3h5PFQ+XG4gICRzaWduYWw6IEFib3J0U2lnbmFsXG4gICRkaXNwb3NlcjogQXN5bmNEaXNwb3NlclxufVxuXG5leHBvcnQgdHlwZSBJbmZlcnJlZFRhc2tDb250ZXh0PFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiA9IHtcbiAgJHJlc3VsdDoge1xuICAgIHJlYWRvbmx5IFtLIGluIGtleW9mIFRdOiBSZXR1cm5UeXBlPFRbS10+IGV4dGVuZHMgUHJvbWlzZTxpbmZlciBSPlxuICAgICAgPyBQcm9taXNlPFI+XG4gICAgICA6IFByb21pc2U8UmV0dXJuVHlwZTxUW0tdPj5cbiAgfVxuICAkc2lnbmFsOiBBYm9ydFNpZ25hbFxuICAkZGlzcG9zZXI6IEFzeW5jRGlzcG9zZXJcbn1cblxuZXhwb3J0IHR5cGUgQWxsVmFsdWU8VCBleHRlbmRzIFRhc2tSZWNvcmQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVGFza1Jlc3VsdDxUW0tdPlxufVxuXG5pbnRlcmZhY2UgQWxsQ2F0Y2hDb250ZXh0PFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiB7XG4gIGZhaWxlZFRhc2s6IChrZXlvZiBUICYgc3RyaW5nKSB8IHVuZGVmaW5lZFxuICBwYXJ0aWFsOiBQYXJ0aWFsPEFsbFZhbHVlPFQ+PlxuICBzaWduYWw6IEFib3J0U2lnbmFsXG59XG5cbnR5cGUgQWxsQ2F0Y2hGbjxUIGV4dGVuZHMgVGFza1JlY29yZCwgQz4gPSAoXG4gIGVycm9yOiB1bmtub3duLFxuICBjdHg6IEFsbENhdGNoQ29udGV4dDxUPlxuKSA9PiBDIHwgUHJvbWlzZTxDPlxuXG5leHBvcnQgaW50ZXJmYWNlIEFsbE9wdGlvbnM8VCBleHRlbmRzIFRhc2tSZWNvcmQsIEM+IHtcbiAgY2F0Y2g6IEFsbENhdGNoRm48VCwgQz5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXR0bGVkRnVsZmlsbGVkPFQ+IHtcbiAgc3RhdHVzOiBcImZ1bGZpbGxlZFwiXG4gIHZhbHVlOiBUXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dGxlZFJlamVjdGVkIHtcbiAgc3RhdHVzOiBcInJlamVjdGVkXCJcbiAgcmVhc29uOiB1bmtub3duXG59XG5cbmV4cG9ydCB0eXBlIFNldHRsZWRSZXN1bHQ8VD4gPSBTZXR0bGVkRnVsZmlsbGVkPFQ+IHwgU2V0dGxlZFJlamVjdGVkXG5cbmV4cG9ydCB0eXBlIEFsbFNldHRsZWRSZXN1bHQ8VCBleHRlbmRzIFRhc2tSZWNvcmQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogU2V0dGxlZFJlc3VsdDxUYXNrUmVzdWx0PFRbS10+PlxufVxuXG5pbnRlcmZhY2UgUmV0cnlJbmZvIHtcbiAgYXR0ZW1wdDogbnVtYmVyXG4gIGxpbWl0OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXNlVHJ5Q3R4IHtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWxcbn1cblxuZXhwb3J0IHR5cGUgVHJ5Q3R4Rm9yPEhhc1JldHJ5IGV4dGVuZHMgYm9vbGVhbj4gPSBCYXNlVHJ5Q3R4ICZcbiAgKEhhc1JldHJ5IGV4dGVuZHMgdHJ1ZSA/IHsgcmV0cnk6IFJldHJ5SW5mbyB9IDogUmVjb3JkPG5ldmVyLCBuZXZlcj4pXG5cbmV4cG9ydCB0eXBlIFRyeUN0eCA9IFRyeUN0eEZvcjx0cnVlPlxuXG5leHBvcnQgdHlwZSBOb25Qcm9taXNlPFQ+ID0gVCBleHRlbmRzIFByb21pc2VMaWtlPHVua25vd24+ID8gbmV2ZXIgOiBUXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBPcmNoZXN0cmF0aW9uRXhlY3V0aW9uPFRSZXN1bHQ+IGV4dGVuZHMgQmFzZUV4ZWN1dGlvbjxQcm9taXNlPFRSZXN1bHQ+PiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihjb25maWc6IEJ1aWxkZXJDb25maWcpIHtcbiAgICBjb25zdCB1bnN1cHBvcnRlZFBvbGljaWVzID0gW1xuICAgICAgY29uZmlnLnJldHJ5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBcInJldHJ5XCIsXG4gICAgICBjb25maWcudGltZW91dCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogXCJ0aW1lb3V0XCIsXG4gICAgXS5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgXCJyZXRyeVwiIHwgXCJ0aW1lb3V0XCIgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcblxuICAgIGludmFyaWFudChcbiAgICAgIHVuc3VwcG9ydGVkUG9saWNpZXMubGVuZ3RoID09PSAwLFxuICAgICAgbmV3IFBhbmljKFwiT1JDSEVTVFJBVElPTl9VTlNVUFBPUlRFRF9QT0xJQ1lcIiwge1xuICAgICAgICBtZXNzYWdlOiBgT3JjaGVzdHJhdGlvbiBkb2VzIG5vdCBzdXBwb3J0ICR7dW5zdXBwb3J0ZWRQb2xpY2llcy5qb2luKFwiIG9yIFwiKX0gcG9saWNpZXMuYCxcbiAgICAgIH0pXG4gICAgKVxuXG4gICAgc3VwZXIoe1xuICAgICAgc2lnbmFsczogY29uZmlnLnNpZ25hbHMsXG4gICAgICB3cmFwczogY29uZmlnLndyYXBzLFxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZXhlY3V0ZUNvcmUoKTogUHJvbWlzZTxUUmVzdWx0PiB7XG4gICAgLy8gT3JjaGVzdHJhdGlvbiBleGVjdXRvcnMgc3RpbGwgc2hhcmUgb3V0ZXIgd3JhcHMvY2FuY2VsbGF0aW9uIGNoZWNrcyBldmVuXG4gICAgLy8gdGhvdWdoIHRoZWlyIHRhc2sgZXhlY3V0aW9uIHN0cmF0ZWdpZXMgZGlmZmVyLlxuICAgIGNvbnN0IGNvbnRyb2xCZWZvcmVFeGVjdXRpb24gPSB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoKVxuXG4gICAgaWYgKGNvbnRyb2xCZWZvcmVFeGVjdXRpb24pIHtcbiAgICAgIHRocm93IGNvbnRyb2xCZWZvcmVFeGVjdXRpb25cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlVGFza3MoKVxuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGV4ZWN1dGVUYXNrcygpOiBQcm9taXNlPFRSZXN1bHQ+XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUYXNrR3JhcGhFeGVjdXRpb25CYXNlPFxuICBUIGV4dGVuZHMgVGFza1JlY29yZCxcbiAgVENvbnRleHQgZXh0ZW5kcyBUYXNrQ29udGV4dDxUPixcbj4gaW1wbGVtZW50cyBBc3luY0Rpc3Bvc2FibGUge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGFza3M6IFRcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhc2tOYW1lczogQXJyYXk8a2V5b2YgVCAmIHN0cmluZz5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc3VsdHMhOiBNYXA8a2V5b2YgVCwgdW5rbm93bj5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVycm9ycyE6IE1hcDxrZXlvZiBULCB1bmtub3duPlxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZXJzITogTWFwPGtleW9mIFQsIFJlc29sdmVyUGFpcltdPlxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW50ZXJuYWxDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhc2tTaWduYWw6IEFib3J0U2lnbmFsXG4gIHByb3RlY3RlZCByZWFkb25seSBkaXNwb3NlcjogQXN5bmNEaXNwb3NlciA9IGNyZWF0ZUFzeW5jRGlzcG9zZXIoKVxuICBwcm90ZWN0ZWQgZmlyc3RSZWplY3Rpb246IHVua25vd25cbiAgZGVjbGFyZSBbU3ltYm9sLmFzeW5jRGlzcG9zZV06ICgpID0+IFByb21pc2U8dm9pZD5cblxuICBjb25zdHJ1Y3RvcihzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLCB0YXNrczogVCkge1xuICAgIHRoaXMudGFza3MgPSB0YXNrc1xuICAgIHRoaXMudGFza05hbWVzID0gT2JqZWN0LmtleXModGFza3MpXG4gICAgdGhpcy5yZXN1bHRzID0gbmV3IE1hcDxrZXlvZiBULCB1bmtub3duPigpXG4gICAgdGhpcy5lcnJvcnMgPSBuZXcgTWFwPGtleW9mIFQsIHVua25vd24+KClcbiAgICB0aGlzLnJlc29sdmVycyA9IG5ldyBNYXA8a2V5b2YgVCwgUmVzb2x2ZXJQYWlyW10+KClcbiAgICB0aGlzLnRhc2tTaWduYWwgPSBzaWduYWxcbiAgICAgID8gQWJvcnRTaWduYWwuYW55KFtzaWduYWwsIHRoaXMuaW50ZXJuYWxDb250cm9sbGVyLnNpZ25hbF0pXG4gICAgICA6IHRoaXMuaW50ZXJuYWxDb250cm9sbGVyLnNpZ25hbFxuICB9XG5cbiAgYXN5bmMgZGlzcG9zZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGlzcG9zZXIuZGlzcG9zZUFzeW5jKClcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRUYXNrSGFuZGxlcih0YXNrTmFtZToga2V5b2YgVCkge1xuICAgIGNvbnN0IHRhc2tGbiA9IHRoaXMudGFza3NbdGFza05hbWVdXG5cbiAgICBpbnZhcmlhbnQoXG4gICAgICB0eXBlb2YgdGFza0ZuID09PSBcImZ1bmN0aW9uXCIsXG4gICAgICBuZXcgUGFuaWMoXCJUQVNLX0lOVkFMSURfSEFORExFUlwiLCB7XG4gICAgICAgIG1lc3NhZ2U6IGBUYXNrIFwiJHtTdHJpbmcodGFza05hbWUpfVwiIGlzIG5vdCBhIGZ1bmN0aW9uYCxcbiAgICAgIH0pXG4gICAgKVxuXG4gICAgcmV0dXJuIHRhc2tGbiBhcyAodGhpczogVENvbnRleHQpID0+IHVua25vd25cbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVSZXN1bHRQcm94eShyZXF1ZXN0ZXJUYXNrTmFtZToga2V5b2YgVCk6IFJlc3VsdFByb3h5PFQ+IHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIFJlc3VsdFByb3h5PFQ+LCB7XG4gICAgICBnZXQ6IChfLCByZWZlcmVuY2VkVGFza05hbWU6IHN0cmluZykgPT5cbiAgICAgICAgdGhpcy53YWl0Rm9yUmVzdWx0KHJlZmVyZW5jZWRUYXNrTmFtZSwgcmVxdWVzdGVyVGFza05hbWUpLFxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEZvclJlc3VsdCh0YXNrTmFtZToga2V5b2YgVCwgcmVxdWVzdGVyVGFza05hbWU/OiBrZXlvZiBUKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKHJlcXVlc3RlclRhc2tOYW1lID09PSB0YXNrTmFtZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgUGFuaWMoXCJUQVNLX1NFTEZfUkVGRVJFTkNFXCIsIHtcbiAgICAgICAgICBtZXNzYWdlOiBgVGFzayBcIiR7U3RyaW5nKHRhc2tOYW1lKX1cIiBjYW5ub3QgYXdhaXQgaXRzIG93biByZXN1bHRgLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICghT2JqZWN0Lmhhc093bih0aGlzLnRhc2tzLCB0YXNrTmFtZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFBhbmljKFwiVEFTS19VTktOT1dOX1JFRkVSRU5DRVwiLCB7XG4gICAgICAgICAgbWVzc2FnZTogYFVua25vd24gdGFzayBcIiR7U3RyaW5nKHRhc2tOYW1lKX1cImAsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0cy5oYXModGFza05hbWUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMucmVzdWx0cy5nZXQodGFza05hbWUpKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmVycm9ycy5oYXModGFza05hbWUpKSB7XG4gICAgICBjb25zdCBzdG9yZWRFcnJvciA9IHRoaXMubWFwU3RvcmVkRXJyb3IodGhpcy5lcnJvcnMuZ2V0KHRhc2tOYW1lKSlcblxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHN0b3JlZEVycm9yKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBxdWV1ZSA9IHRoaXMucmVzb2x2ZXJzLmdldCh0YXNrTmFtZSlcblxuICAgICAgaWYgKHF1ZXVlKSB7XG4gICAgICAgIHF1ZXVlLnB1c2goW3Jlc29sdmUsIHJlamVjdF0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLnJlc29sdmVycy5zZXQodGFza05hbWUsIFtbcmVzb2x2ZSwgcmVqZWN0XV0pXG4gICAgfSlcbiAgfVxuXG4gIHByb3RlY3RlZCBzdG9yZVJlc3VsdCh0YXNrTmFtZToga2V5b2YgVCwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnJlc3VsdHMuc2V0KHRhc2tOYW1lLCB2YWx1ZSlcbiAgICB0aGlzLnJlc29sdmVXYWl0ZXJzKHRhc2tOYW1lLCB2YWx1ZSlcbiAgfVxuXG4gIHByb3RlY3RlZCBzdG9yZUVycm9yKHRhc2tOYW1lOiBrZXlvZiBULCBlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IG1hcHBlZEVycm9yID0gdGhpcy5tYXBTdG9yZWRFcnJvcihlcnJvcilcblxuICAgIHRoaXMuZXJyb3JzLnNldCh0YXNrTmFtZSwgbWFwcGVkRXJyb3IpXG4gICAgdGhpcy5yZWplY3RXYWl0ZXJzKHRhc2tOYW1lLCBtYXBwZWRFcnJvcilcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlV2FpdGVycyh0YXNrTmFtZToga2V5b2YgVCwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBmdWxmaWxsZWQgPSB0aGlzLnJlc29sdmVycy5nZXQodGFza05hbWUpXG5cbiAgICBpZiAoZnVsZmlsbGVkKSB7XG4gICAgICBmb3IgKGNvbnN0IFtyZXNvbHZlXSBvZiBmdWxmaWxsZWQpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXNvbHZlcnMuZGVsZXRlKHRhc2tOYW1lKVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZWplY3RXYWl0ZXJzKHRhc2tOYW1lOiBrZXlvZiBULCBlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHJlamVjdGVkID0gdGhpcy5yZXNvbHZlcnMuZ2V0KHRhc2tOYW1lKVxuXG4gICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICBmb3IgKGNvbnN0IFssIHJlamVjdF0gb2YgcmVqZWN0ZWQpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnJlc29sdmVycy5kZWxldGUodGFza05hbWUpXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFib3J0SW50ZXJuYWwoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW50ZXJuYWxDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICB0aGlzLmludGVybmFsQ29udHJvbGxlci5hYm9ydChlcnJvcilcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25UYXNrUmVzdWx0KF90YXNrTmFtZToga2V5b2YgVCwgX3ZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLnRhc2tzXG4gICAgdm9pZCBfdGFza05hbWVcbiAgICB2b2lkIF92YWx1ZVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uVGFza0Vycm9yKF90YXNrTmFtZToga2V5b2YgVCwgX2Vycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLnRhc2tzXG4gICAgdm9pZCBfdGFza05hbWVcbiAgICB2b2lkIF9lcnJvclxuICB9XG5cbiAgcHJvdGVjdGVkIG1hcFN0b3JlZEVycm9yKGVycm9yOiB1bmtub3duKTogRXJyb3Ige1xuICAgIHZvaWQgdGhpcy50YXNrc1xuICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgVW5oYW5kbGVkRXhjZXB0aW9uKHVuZGVmaW5lZCwgeyBjYXVzZTogZXJyb3IgfSlcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG91bGRBYm9ydE9uVGFza0Vycm9yKF9lcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHZvaWQgdGhpcy50YXNrc1xuICAgIHZvaWQgX2Vycm9yXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvdWxkUmV0aHJvd1Rhc2tFcnJvcihfZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgICB2b2lkIHRoaXMudGFza3NcbiAgICB2b2lkIF9lcnJvclxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0Rmlyc3RSZWplY3Rpb24oZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLmZpcnN0UmVqZWN0aW9uID8/PSBlcnJvclxuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZVRhc2tDb250ZXh0KHJlc3VsdFByb3h5OiBSZXN1bHRQcm94eTxUPik6IFRDb250ZXh0XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJ1blRhc2sodGFza05hbWU6IGtleW9mIFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFza0ZuID0gdGhpcy5nZXRUYXNrSGFuZGxlcih0YXNrTmFtZSlcbiAgICAgIGNvbnN0IHJlc3VsdFByb3h5ID0gdGhpcy5jcmVhdGVSZXN1bHRQcm94eSh0YXNrTmFtZSlcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNyZWF0ZVRhc2tDb250ZXh0KHJlc3VsdFByb3h5KVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFza0ZuLmNhbGwoY29udGV4dClcblxuICAgICAgdGhpcy5zdG9yZVJlc3VsdCh0YXNrTmFtZSwgcmVzdWx0KVxuICAgICAgdGhpcy5vblRhc2tSZXN1bHQodGFza05hbWUsIHJlc3VsdClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5zZXRGaXJzdFJlamVjdGlvbihlcnJvcilcbiAgICAgIHRoaXMuc3RvcmVFcnJvcih0YXNrTmFtZSwgZXJyb3IpXG4gICAgICB0aGlzLm9uVGFza0Vycm9yKHRhc2tOYW1lLCBlcnJvcilcblxuICAgICAgaWYgKHRoaXMuc2hvdWxkQWJvcnRPblRhc2tFcnJvcihlcnJvcikpIHtcbiAgICAgICAgdGhpcy5hYm9ydEludGVybmFsKGVycm9yKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zaG91bGRSZXRocm93VGFza0Vycm9yKGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZGVmaW5lQXN5bmNEaXNwb3NlQWxpYXMoVGFza0dyYXBoRXhlY3V0aW9uQmFzZS5wcm90b3R5cGUpXG5cbmV4cG9ydCBjbGFzcyBUYXNrRXhlY3V0aW9uPFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiBleHRlbmRzIFRhc2tHcmFwaEV4ZWN1dGlvbkJhc2U8VCwgVGFza0NvbnRleHQ8VD4+IHtcbiAgcmVhZG9ubHkgI21vZGU6IFRhc2tFeGVjdXRpb25Nb2RlXG4gIHJlYWRvbmx5ICNyZXR1cm5WYWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAjZmFpbGVkVGFzazogKGtleW9mIFQgJiBzdHJpbmcpIHwgdW5kZWZpbmVkXG4gIHByaXZhdGUgc2V0dGxlZFByb21pc2U6IFByb21pc2U8QXJyYXk8UHJvbWlzZVNldHRsZWRSZXN1bHQ8dm9pZD4+PiB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsIHRhc2tzOiBULCBtb2RlOiBUYXNrRXhlY3V0aW9uTW9kZSkge1xuICAgIHN1cGVyKHNpZ25hbCwgdGFza3MpXG4gICAgdGhpcy4jbW9kZSA9IG1vZGVcbiAgfVxuXG4gIGdldCBmYWlsZWRUYXNrKCk6IChrZXlvZiBUICYgc3RyaW5nKSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2ZhaWxlZFRhc2tcbiAgfVxuXG4gIGdldCBzaWduYWwoKTogQWJvcnRTaWduYWwge1xuICAgIHJldHVybiB0aGlzLnRhc2tTaWduYWxcbiAgfVxuXG4gIGdldCByZXR1cm5WYWx1ZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuI3JldHVyblZhbHVlXG4gIH1cblxuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICBjb25zdCBwcm9taXNlcyA9IHRoaXMudGFza05hbWVzLm1hcChhc3luYyAobmFtZSkgPT4gdGhpcy5ydW5UYXNrKG5hbWUpKVxuICAgIHRoaXMuc2V0dGxlZFByb21pc2UgPSBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpXG5cbiAgICBpZiAodGhpcy4jbW9kZSA9PT0gXCJzZXR0bGVkXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0dGxlZFByb21pc2VcbiAgICAgIHJldHVybiB0aGlzLiNyZXR1cm5WYWx1ZVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IHRoaXMubWFwU3RvcmVkRXJyb3IodGhpcy5maXJzdFJlamVjdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jcmV0dXJuVmFsdWVcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JUYXNrc1RvU2V0dGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2V0dGxlZFByb21pc2VcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVUYXNrQ29udGV4dChyZXN1bHRQcm94eTogUmVzdWx0UHJveHk8VD4pOiBUYXNrQ29udGV4dDxUPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRkaXNwb3NlcjogdGhpcy5kaXNwb3NlcixcbiAgICAgICRyZXN1bHQ6IHJlc3VsdFByb3h5LFxuICAgICAgJHNpZ25hbDogdGhpcy50YXNrU2lnbmFsLFxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBvblRhc2tSZXN1bHQodGFza05hbWU6IGtleW9mIFQsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy4jcmV0dXJuVmFsdWVbdGFza05hbWUgYXMgc3RyaW5nXSA9XG4gICAgICB0aGlzLiNtb2RlID09PSBcInNldHRsZWRcIiA/IHsgc3RhdHVzOiBcImZ1bGZpbGxlZFwiLCB2YWx1ZSB9IDogdmFsdWVcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBvblRhc2tFcnJvcih0YXNrTmFtZToga2V5b2YgVCwgZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLiNmYWlsZWRUYXNrID8/PSB0YXNrTmFtZSBhcyBrZXlvZiBUICYgc3RyaW5nXG5cbiAgICBpZiAodGhpcy4jbW9kZSA9PT0gXCJzZXR0bGVkXCIpIHtcbiAgICAgIHRoaXMuI3JldHVyblZhbHVlW3Rhc2tOYW1lIGFzIHN0cmluZ10gPSB7IHJlYXNvbjogZXJyb3IsIHN0YXR1czogXCJyZWplY3RlZFwiIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2hvdWxkQWJvcnRPblRhc2tFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jbW9kZSA9PT0gXCJmYWlsLWZhc3RcIlxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNob3VsZFJldGhyb3dUYXNrRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI21vZGUgPT09IFwiZmFpbC1mYXN0XCJcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEJ1aWxkZXJDb25maWcgfSBmcm9tIFwiLi4vYnVpbGRlclwiXG5pbXBvcnQgdHlwZSB7XG4gIEFsbE9wdGlvbnMsXG4gIEFsbFZhbHVlLFxuICBJbmZlcnJlZFRhc2tDb250ZXh0LFxuICBUYXNrUmVjb3JkLFxuICBUYXNrUmVzdWx0LFxuICBUYXNrVmFsaWRhdGlvbixcbn0gZnJvbSBcIi4vc2hhcmVkXCJcbmltcG9ydCB7IENhbmNlbGxhdGlvbkVycm9yLCBQYW5pYyB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHsgY2hlY2tJc1Byb21pc2VMaWtlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IE9yY2hlc3RyYXRpb25FeGVjdXRpb24sIFRhc2tFeGVjdXRpb24gfSBmcm9tIFwiLi9zaGFyZWRcIlxuXG5jbGFzcyBBbGxFeGVjdXRpb248VCBleHRlbmRzIFRhc2tSZWNvcmQsIEM+IGV4dGVuZHMgT3JjaGVzdHJhdGlvbkV4ZWN1dGlvbjxBbGxWYWx1ZTxUPiB8IEM+IHtcbiAgcmVhZG9ubHkgI3Rhc2tzOiBUXG4gIHJlYWRvbmx5ICNvcHRpb25zOiBBbGxPcHRpb25zPFQsIEM+IHwgdW5kZWZpbmVkXG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBCdWlsZGVyQ29uZmlnLCB0YXNrczogVCwgb3B0aW9ucz86IEFsbE9wdGlvbnM8VCwgQz4pIHtcbiAgICBzdXBlcihjb25maWcpXG4gICAgdGhpcy4jdGFza3MgPSB0YXNrc1xuICAgIHRoaXMuI29wdGlvbnMgPSBvcHRpb25zXG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZXhlY3V0ZVRhc2tzKCk6IFByb21pc2U8QWxsVmFsdWU8VD4gfCBDPiB7XG4gICAgYXdhaXQgdXNpbmcgZXhlY3V0aW9uID0gbmV3IFRhc2tFeGVjdXRpb24odGhpcy5leGVjdXRpb25TaWduYWwsIHRoaXMuI3Rhc2tzLCBcImZhaWwtZmFzdFwiKVxuICAgIGxldCByZXN1bHQhOiBBbGxWYWx1ZTxUPiB8IENcbiAgICBsZXQgdGhyZXcgPSBmYWxzZVxuICAgIGxldCB0aHJvd25FcnJvcjogdW5rbm93blxuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IChhd2FpdCB0aGlzLnJhY2VXaXRoQ2FuY2VsbGF0aW9uKGV4ZWN1dGlvbi5leGVjdXRlKCkpKSBhcyBBbGxWYWx1ZTxUPlxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBjb250cm9sQWZ0ZXJGYWlsdXJlID0gdGhpcy5jaGVja0RpZENvbnRyb2xGYWlsKGVycm9yKVxuICAgICAgY29uc3QgY2F0Y2hGbiA9IHRoaXMuI29wdGlvbnM/LmNhdGNoXG5cbiAgICAgIGlmIChjb250cm9sQWZ0ZXJGYWlsdXJlKSB7XG4gICAgICAgIHRocmV3ID0gdHJ1ZVxuICAgICAgICB0aHJvd25FcnJvciA9IGNvbnRyb2xBZnRlckZhaWx1cmVcbiAgICAgIH0gZWxzZSBpZiAoY2F0Y2hGbikge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICAgIGZhaWxlZFRhc2s6IGV4ZWN1dGlvbi5mYWlsZWRUYXNrLFxuICAgICAgICAgIHBhcnRpYWw6IGV4ZWN1dGlvbi5yZXR1cm5WYWx1ZSBhcyBQYXJ0aWFsPEFsbFZhbHVlPFQ+PixcbiAgICAgICAgICBzaWduYWw6IGV4ZWN1dGlvbi5zaWduYWwsXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IGNhdGNoRm4oZXJyb3IsIGNvbnRleHQpXG4gICAgICAgICAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZShtYXBwZWQpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXN1bHQgPSAoYXdhaXQgdGhpcy5yYWNlV2l0aENhbmNlbGxhdGlvbihcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUobWFwcGVkKS5jYXRjaCgoY2F0Y2hFcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGNhdGNoRXJyb3IgaW5zdGFuY2VvZiBDYW5jZWxsYXRpb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBjYXRjaEVycm9yXG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYW5pYyhcIkFMTF9DQVRDSF9IQU5ETEVSX1JFSkVDVFwiLCB7IGNhdXNlOiBjYXRjaEVycm9yIH0pXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgICAgKSkgYXMgQ1xuICAgICAgICAgICAgfSBjYXRjaCAobWFwcGVkRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhyZXcgPSB0cnVlXG4gICAgICAgICAgICAgIHRocm93bkVycm9yID0gbWFwcGVkRXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gbWFwcGVkXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChjYXRjaEVycm9yKSB7XG4gICAgICAgICAgdGhyZXcgPSB0cnVlXG4gICAgICAgICAgdGhyb3duRXJyb3IgPSBuZXcgUGFuaWMoXCJBTExfQ0FUQ0hfSEFORExFUl9USFJPV1wiLCB7IGNhdXNlOiBjYXRjaEVycm9yIH0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocmV3ID0gdHJ1ZVxuICAgICAgICB0aHJvd25FcnJvciA9IGVycm9yXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGV4ZWN1dGlvbi53YWl0Rm9yVGFza3NUb1NldHRsZSgpXG4gICAgfVxuXG4gICAgY29uc3QgY2FuY2VsbGF0aW9uID0gdGhpcy5jaGVja0RpZENhbmNlbCh0aHJvd25FcnJvcilcblxuICAgIGlmIChjYW5jZWxsYXRpb24pIHtcbiAgICAgIHRocm93IGNhbmNlbGxhdGlvblxuICAgIH1cblxuICAgIGlmICh0aHJldykge1xuICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWwgLS0gUHJlc2VydmUgcmF3IHRhc2sgZmFpbHVyZXMgZm9yIGNhbGxlcnMvdGVzdHMuXG4gICAgICB0aHJvdyB0aHJvd25FcnJvclxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFsbDxUIGV4dGVuZHMgVGFza1JlY29yZCwgQyA9IG5ldmVyPihcbiAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICB0YXNrczogVCAmIFRhc2tWYWxpZGF0aW9uPE5vSW5mZXI8VD4+ICYgVGhpc1R5cGU8SW5mZXJyZWRUYXNrQ29udGV4dDxUPj4sXG4gIG9wdGlvbnM/OiBBbGxPcHRpb25zPFQsIEM+XG4pOiBQcm9taXNlPHsgW0sgaW4ga2V5b2YgVF06IFRhc2tSZXN1bHQ8VFtLXT4gfSB8IEM+IHtcbiAgdXNpbmcgZXhlY3V0aW9uID0gbmV3IEFsbEV4ZWN1dGlvbihjb25maWcsIHRhc2tzLCBvcHRpb25zKVxuICByZXR1cm4gYXdhaXQgZXhlY3V0aW9uLmV4ZWN1dGUoKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEJ1aWxkZXJDb25maWcgfSBmcm9tIFwiLi4vYnVpbGRlclwiXG5pbXBvcnQgdHlwZSB7IEFsbFNldHRsZWRSZXN1bHQsIEluZmVycmVkVGFza0NvbnRleHQsIFRhc2tSZWNvcmQsIFRhc2tWYWxpZGF0aW9uIH0gZnJvbSBcIi4vc2hhcmVkXCJcbmltcG9ydCB7IE9yY2hlc3RyYXRpb25FeGVjdXRpb24sIFRhc2tFeGVjdXRpb24gfSBmcm9tIFwiLi9zaGFyZWRcIlxuXG5jbGFzcyBBbGxTZXR0bGVkRXhlY3V0aW9uPFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiBleHRlbmRzIE9yY2hlc3RyYXRpb25FeGVjdXRpb248XG4gIEFsbFNldHRsZWRSZXN1bHQ8VD5cbj4ge1xuICByZWFkb25seSAjdGFza3M6IFRcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEJ1aWxkZXJDb25maWcsIHRhc2tzOiBUKSB7XG4gICAgc3VwZXIoY29uZmlnKVxuICAgIHRoaXMuI3Rhc2tzID0gdGFza3NcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBleGVjdXRlVGFza3MoKTogUHJvbWlzZTxBbGxTZXR0bGVkUmVzdWx0PFQ+PiB7XG4gICAgYXdhaXQgdXNpbmcgZXhlY3V0aW9uID0gbmV3IFRhc2tFeGVjdXRpb24odGhpcy5leGVjdXRpb25TaWduYWwsIHRoaXMuI3Rhc2tzLCBcInNldHRsZWRcIilcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJhY2VXaXRoQ2FuY2VsbGF0aW9uKGV4ZWN1dGlvbi5leGVjdXRlKCkpXG4gICAgY29uc3QgY2FuY2VsbGF0aW9uID0gdGhpcy5jaGVja0RpZENhbmNlbCgpXG5cbiAgICBpZiAoY2FuY2VsbGF0aW9uKSB7XG4gICAgICB0aHJvdyBjYW5jZWxsYXRpb25cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIEFsbFNldHRsZWRSZXN1bHQ8VD5cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFsbFNldHRsZWQ8VCBleHRlbmRzIFRhc2tSZWNvcmQ+KFxuICBjb25maWc6IEJ1aWxkZXJDb25maWcsXG4gIHRhc2tzOiBUICYgVGFza1ZhbGlkYXRpb248Tm9JbmZlcjxUPj4gJiBUaGlzVHlwZTxJbmZlcnJlZFRhc2tDb250ZXh0PFQ+PlxuKTogUHJvbWlzZTxBbGxTZXR0bGVkUmVzdWx0PFQ+PiB7XG4gIHVzaW5nIGV4ZWN1dGlvbiA9IG5ldyBBbGxTZXR0bGVkRXhlY3V0aW9uKGNvbmZpZywgdGFza3MpXG4gIHJldHVybiBhd2FpdCBleGVjdXRpb24uZXhlY3V0ZSgpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQnVpbGRlckNvbmZpZyB9IGZyb20gXCIuLi9idWlsZGVyXCJcbmltcG9ydCB0eXBlIHtcbiAgSW5mZXJyZWRUYXNrQ29udGV4dCxcbiAgUmVzdWx0UHJveHksXG4gIFRhc2tDb250ZXh0LFxuICBUYXNrUmVjb3JkLFxuICBUYXNrUmVzdWx0LFxufSBmcm9tIFwiLi9zaGFyZWRcIlxuaW1wb3J0IHsgUGFuaWMgfSBmcm9tIFwiLi4vZXJyb3JzXCJcbmltcG9ydCB7IE9yY2hlc3RyYXRpb25FeGVjdXRpb24sIFRhc2tHcmFwaEV4ZWN1dGlvbkJhc2UgfSBmcm9tIFwiLi9zaGFyZWRcIlxuXG5kZWNsYXJlIGNvbnN0IEZMT1dfRVhJVF9CUkFORDogdW5pcXVlIHN5bWJvbFxuXG5leHBvcnQgdHlwZSBGbG93RXhpdDxUPiA9IHtcbiAgcmVhZG9ubHkgW0ZMT1dfRVhJVF9CUkFORF06IFRcbn1cblxudHlwZSBFeGl0VmFsdWU8VD4gPSBUIGV4dGVuZHMgRmxvd0V4aXQ8aW5mZXIgVj4gPyBWIDogbmV2ZXJcblxudHlwZSBGbG93RXhpdFZhbHVlPFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IEV4aXRWYWx1ZTxUYXNrUmVzdWx0PFRbS10+PlxufVtrZXlvZiBUXVxuXG5pbnRlcmZhY2UgRmxvd1Rhc2tDb250ZXh0PFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiBleHRlbmRzIFRhc2tDb250ZXh0PFQ+IHtcbiAgJGV4aXQ8Vj4odmFsdWU6IFYpOiBGbG93RXhpdDxWPlxufVxuXG5leHBvcnQgdHlwZSBJbmZlcnJlZEZsb3dUYXNrQ29udGV4dDxUIGV4dGVuZHMgVGFza1JlY29yZD4gPSBJbmZlcnJlZFRhc2tDb250ZXh0PFQ+ICYge1xuICAkZXhpdDxWPih2YWx1ZTogVik6IEZsb3dFeGl0PFY+XG59XG5cbmV4cG9ydCB0eXBlIEZsb3dSZXN1bHQ8VCBleHRlbmRzIFRhc2tSZWNvcmQ+ID0gRmxvd0V4aXRWYWx1ZTxUPlxuXG5jbGFzcyBGbG93RXhpdFNpZ25hbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSB2YWx1ZTogdW5rbm93blxuXG4gIGNvbnN0cnVjdG9yKHZhbHVlOiB1bmtub3duKSB7XG4gICAgc3VwZXIoXCJGbG93IGV4aXRlZFwiKVxuICAgIHRoaXMubmFtZSA9IFwiRmxvd0V4aXRTaWduYWxFcnJvclwiXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cbn1cblxuY2xhc3MgRmxvd0V4ZWN1dGlvbjxUIGV4dGVuZHMgVGFza1JlY29yZD4gZXh0ZW5kcyBUYXNrR3JhcGhFeGVjdXRpb25CYXNlPFQsIEZsb3dUYXNrQ29udGV4dDxUPj4ge1xuICAjZmlyc3RSZWplY3Rpb25XYWl0ZXJzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdXG4gICNzZXR0bGVkUHJvbWlzZTogUHJvbWlzZTxBcnJheTxQcm9taXNlU2V0dGxlZFJlc3VsdDx2b2lkPj4+IHwgdW5kZWZpbmVkXG5cbiAgYXN5bmMgZXhlY3V0ZSgpOiBQcm9taXNlPEZsb3dSZXN1bHQ8VD4+IHtcbiAgICBjb25zdCBwcm9taXNlcyA9IHRoaXMudGFza05hbWVzLm1hcChhc3luYyAobmFtZSkgPT4gdGhpcy5ydW5UYXNrKG5hbWUpKVxuICAgIHRoaXMuI3NldHRsZWRQcm9taXNlID0gUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKVxuXG4gICAgLy8gQSBmbG93IHRlcm1pbmF0ZXMgb24gdGhlIGZpcnN0IGV4aXQgb3IgZXJyb3IsIGJ1dCBQcm9taXNlLmFsbFNldHRsZWQoKVxuICAgIC8vIG5ldmVyIHJlamVjdHMsIHNvIGl0IGNhbm5vdCBzaWduYWwgdGhhdCBlYXJseSBjb21wbGV0aW9uIG9uIGl0cyBvd24uXG4gICAgLy8gUmFjaW5nIGl0IGFnYWluc3QgYSBtYW51YWwgZmlyc3QtcmVqZWN0aW9uIHdhaXRlciBsZXRzIGV4ZWN1dGUoKSByZWFjdCB0b1xuICAgIC8vIHRoZSBmaXJzdCAkZXhpdC9lcnJvciBpbW1lZGlhdGVseSwgd2hpbGUgI3NldHRsZWRQcm9taXNlIGlzIHJldGFpbmVkIHNvXG4gICAgLy8gdGhlIG9yY2hlc3RyYXRpb24gbGF5ZXIgY2FuIHN0aWxsIGF3YWl0IGZ1bGwgdGFzayB0ZWFyZG93biBhZnRlcndhcmRzLlxuICAgIGF3YWl0IFByb21pc2UucmFjZShbdGhpcy4jc2V0dGxlZFByb21pc2UsIHRoaXMud2FpdEZvckZpcnN0UmVqZWN0aW9uKCldKVxuXG4gICAgaWYgKHRoaXMuZmlyc3RSZWplY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuZmlyc3RSZWplY3Rpb24gaW5zdGFuY2VvZiBGbG93RXhpdFNpZ25hbEVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpcnN0UmVqZWN0aW9uLnZhbHVlIGFzIEZsb3dSZXN1bHQ8VD5cbiAgICAgIH1cblxuICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvb25seS10aHJvdy1lcnJvciAtLSBQcmVzZXJ2ZSByYXcgdGFzayBmYWlsdXJlcyBmb3IgY2FsbGVycy90ZXN0cy5cbiAgICAgIHRocm93IHRoaXMuZmlyc3RSZWplY3Rpb25cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgUGFuaWMoXCJGTE9XX05PX0VYSVRcIilcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JUYXNrc1RvU2V0dGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuI3NldHRsZWRQcm9taXNlXG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2V0Rmlyc3RSZWplY3Rpb24oZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maXJzdFJlamVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBTdG9yZSB0aGUgbWFwcGVkIHJlamVjdGlvbiBzbyBgZmlyc3RSZWplY3Rpb25gIGlzIGFsd2F5cyBhIG5vbi11bmRlZmluZWRcbiAgICAvLyB2YWx1ZSBvbmNlIHNldC4gVGhpcyBrZWVwcyBgZmlyc3RSZWplY3Rpb24gIT09IHVuZGVmaW5lZGAgYSBzb3VuZCBzaWduYWxcbiAgICAvLyBldmVuIHdoZW4gYSB0YXNrIHRocm93cyBgdW5kZWZpbmVkYCwgd2hpY2ggbWFwcyB0byBhbiBVbmhhbmRsZWRFeGNlcHRpb24uXG4gICAgc3VwZXIuc2V0Rmlyc3RSZWplY3Rpb24odGhpcy5tYXBTdG9yZWRFcnJvcihlcnJvcikpXG5cbiAgICBmb3IgKGNvbnN0IHJlc29sdmUgb2YgdGhpcy4jZmlyc3RSZWplY3Rpb25XYWl0ZXJzKSB7XG4gICAgICByZXNvbHZlKClcbiAgICB9XG5cbiAgICB0aGlzLiNmaXJzdFJlamVjdGlvbldhaXRlcnMgPSBbXVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNyZWF0ZVRhc2tDb250ZXh0KHJlc3VsdFByb3h5OiBSZXN1bHRQcm94eTxUPik6IEZsb3dUYXNrQ29udGV4dDxUPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRkaXNwb3NlcjogdGhpcy5kaXNwb3NlcixcbiAgICAgICRleGl0OiAodmFsdWUpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEZsb3dFeGl0U2lnbmFsRXJyb3IodmFsdWUpXG4gICAgICB9LFxuICAgICAgJHJlc3VsdDogcmVzdWx0UHJveHksXG4gICAgICAkc2lnbmFsOiB0aGlzLnRhc2tTaWduYWwsXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG1hcFN0b3JlZEVycm9yKGVycm9yOiB1bmtub3duKTogRXJyb3Ige1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZsb3dFeGl0U2lnbmFsRXJyb3IpIHtcbiAgICAgIHJldHVybiBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5tYXBTdG9yZWRFcnJvcihlcnJvcilcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzaG91bGRBYm9ydE9uVGFza0Vycm9yKCk6IGJvb2xlYW4ge1xuICAgIHZvaWQgdGhpcy50YXNrTmFtZXNcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcHJpdmF0ZSB3YWl0Rm9yRmlyc3RSZWplY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZmlyc3RSZWplY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLiNmaXJzdFJlamVjdGlvbldhaXRlcnMucHVzaChyZXNvbHZlKVxuICAgIH0pXG4gIH1cbn1cblxuY2xhc3MgRmxvd1J1bm5lckV4ZWN1dGlvbjxUIGV4dGVuZHMgVGFza1JlY29yZD4gZXh0ZW5kcyBPcmNoZXN0cmF0aW9uRXhlY3V0aW9uPEZsb3dSZXN1bHQ8VD4+IHtcbiAgcmVhZG9ubHkgI3Rhc2tzOiBUXG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBCdWlsZGVyQ29uZmlnLCB0YXNrczogVCkge1xuICAgIHN1cGVyKGNvbmZpZylcbiAgICB0aGlzLiN0YXNrcyA9IHRhc2tzXG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZXhlY3V0ZVRhc2tzKCk6IFByb21pc2U8Rmxvd1Jlc3VsdDxUPj4ge1xuICAgIGF3YWl0IHVzaW5nIGV4ZWN1dGlvbiA9IG5ldyBGbG93RXhlY3V0aW9uKHRoaXMuZXhlY3V0aW9uU2lnbmFsLCB0aGlzLiN0YXNrcylcbiAgICBsZXQgcmVzdWx0ITogRmxvd1Jlc3VsdDxUPlxuICAgIGxldCB0aHJldyA9IGZhbHNlXG4gICAgbGV0IHRocm93bkVycm9yOiB1bmtub3duXG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gKGF3YWl0IHRoaXMucmFjZVdpdGhDYW5jZWxsYXRpb24oZXhlY3V0aW9uLmV4ZWN1dGUoKSkpIGFzIEZsb3dSZXN1bHQ8VD5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyZXcgPSB0cnVlXG4gICAgICB0aHJvd25FcnJvciA9IGVycm9yXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGV4ZWN1dGlvbi53YWl0Rm9yVGFza3NUb1NldHRsZSgpXG4gICAgfVxuXG4gICAgY29uc3QgY2FuY2VsbGF0aW9uID0gdGhpcy5jaGVja0RpZENhbmNlbCh0aHJvd25FcnJvcilcblxuICAgIGlmIChjYW5jZWxsYXRpb24pIHtcbiAgICAgIHRocm93IGNhbmNlbGxhdGlvblxuICAgIH1cblxuICAgIGlmICh0aHJldykge1xuICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWwgLS0gUHJlc2VydmUgcmF3IHRhc2sgZmFpbHVyZXMgZm9yIGNhbGxlcnMvdGVzdHMuXG4gICAgICB0aHJvdyB0aHJvd25FcnJvclxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUZsb3c8VCBleHRlbmRzIFRhc2tSZWNvcmQ+KFxuICBjb25maWc6IEJ1aWxkZXJDb25maWcsXG4gIHRhc2tzOiBUICYgVGhpc1R5cGU8SW5mZXJyZWRGbG93VGFza0NvbnRleHQ8VD4+XG4pOiBQcm9taXNlPEZsb3dSZXN1bHQ8VD4+IHtcbiAgdXNpbmcgZXhlY3V0aW9uID0gbmV3IEZsb3dSdW5uZXJFeGVjdXRpb24oY29uZmlnLCB0YXNrcylcbiAgcmV0dXJuIGF3YWl0IGV4ZWN1dGlvbi5leGVjdXRlKClcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBCdWlsZGVyQ29uZmlnIH0gZnJvbSBcIi4uL2J1aWxkZXJcIlxuaW1wb3J0IHR5cGUgeyBCYXNlVHJ5Q3R4LCBOb25Qcm9taXNlIH0gZnJvbSBcIi4vc2hhcmVkXCJcbmltcG9ydCB7IENvbnRyb2xFcnJvciwgUGFuaWMsIFJldHJ5RXhoYXVzdGVkRXJyb3IsIFVuaGFuZGxlZEV4Y2VwdGlvbiB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHsgY2hlY2tJc1Byb21pc2VMaWtlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IEJhc2VFeGVjdXRpb24sIFJldHJ5RGlyZWN0aXZlLCB0eXBlIFJldHJ5RGVjaXNpb24sIHR5cGUgUnVubmVyRXJyb3IgfSBmcm9tIFwiLi9iYXNlXCJcblxuZXhwb3J0IHR5cGUgUnVuVHJ5Rm48VCwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eCA9IEJhc2VUcnlDdHg+ID0gKFxuICBjdHg6IEN0eFxuKSA9PiBOb25Qcm9taXNlPFQ+IHwgUHJvbWlzZTxUPlxuXG50eXBlIFJ1bkNhdGNoRm48RT4gPSAoZXJyb3I6IHVua25vd24pID0+IE5vblByb21pc2U8RT4gfCBQcm9taXNlPEU+XG5cbmludGVyZmFjZSBSdW5Bc3luY09wdGlvbnM8VCwgRSwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eCA9IEJhc2VUcnlDdHg+IHtcbiAgdHJ5OiBSdW5UcnlGbjxULCBDdHg+XG4gIGNhdGNoOiBSdW5DYXRjaEZuPEU+XG59XG5cbmV4cG9ydCB0eXBlIEFzeW5jUnVuSW5wdXQ8VCwgRSwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eCA9IEJhc2VUcnlDdHg+ID1cbiAgfCBSdW5UcnlGbjxULCBDdHg+XG4gIHwgUnVuQXN5bmNPcHRpb25zPFQsIEUsIEN0eD5cblxuLyoqXG4gKiBFbmNhcHN1bGF0ZXMgdGhlIHNoYXJlZCBtdXRhYmxlIHN0YXRlIGFuZCBsb2dpYyBmb3IgYSBzaW5nbGUgcnVuIGV4ZWN1dGlvbi5cbiAqL1xuY2xhc3MgUnVuRXhlY3V0aW9uPFQsIEUsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHg+IGV4dGVuZHMgQmFzZUV4ZWN1dGlvbjxcbiAgUHJvbWlzZTxUIHwgRSB8IFJ1bm5lckVycm9yPlxuPiB7XG4gICNjYXRjaEZuOiBSdW5DYXRjaEZuPEU+IHwgdW5kZWZpbmVkXG4gICN0cnlGbjogUnVuVHJ5Rm48VCwgQ3R4PlxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQnVpbGRlckNvbmZpZywgaW5wdXQ6IEFzeW5jUnVuSW5wdXQ8VCwgRSwgQ3R4Pikge1xuICAgIHN1cGVyKGNvbmZpZylcblxuICAgIHRoaXMuI2NhdGNoRm4gPSB0eXBlb2YgaW5wdXQgPT09IFwiZnVuY3Rpb25cIiA/IHVuZGVmaW5lZCA6IGlucHV0LmNhdGNoXG4gICAgdGhpcy4jdHJ5Rm4gPSB0eXBlb2YgaW5wdXQgPT09IFwiZnVuY3Rpb25cIiA/IGlucHV0IDogaW5wdXQudHJ5XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZXhlY3V0ZUNvcmUoKTogUHJvbWlzZTxUIHwgRSB8IFJ1bm5lckVycm9yPiB7XG4gICAgcmV0dXJuIHRoaXMuI3J1bkF0dGVtcHRMb29wKDEpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhbiBhdHRlbXB0IGVycm9yIGludG8gZWl0aGVyIGEgdGVybWluYWwgcmVzdWx0IG9yIGEgcmV0cnkgZGVjaXNpb24uXG4gICAqL1xuICBhc3luYyAjcmVzb2x2ZUZhaWx1cmUoZXJyb3I6IHVua25vd24pOiBQcm9taXNlPEUgfCBSdW5uZXJFcnJvciB8IFJldHJ5RGlyZWN0aXZlPiB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgUGFuaWMpIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29udHJvbEVycm9yKSB7XG4gICAgICByZXR1cm4gZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sRXJyb3IgPSB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoZXJyb3IpXG5cbiAgICBpZiAoY29udHJvbEVycm9yKSB7XG4gICAgICByZXR1cm4gY29udHJvbEVycm9yXG4gICAgfVxuXG4gICAgY29uc3QgcmV0cnlEZWNpc2lvbiA9IHRoaXMuYnVpbGRSZXRyeURlY2lzaW9uKGVycm9yKVxuXG4gICAgaWYgKHJldHJ5RGVjaXNpb24uc2hvdWxkQXR0ZW1wdFJldHJ5KSB7XG4gICAgICByZXR1cm4gbmV3IFJldHJ5RGlyZWN0aXZlKHJldHJ5RGVjaXNpb24pXG4gICAgfVxuXG4gICAgaWYgKHJldHJ5RGVjaXNpb24uaXNSZXRyeUV4aGF1c3RlZCkge1xuICAgICAgcmV0dXJuIG5ldyBSZXRyeUV4aGF1c3RlZEVycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogZXJyb3IgfSlcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuI2NhdGNoRm4pIHtcbiAgICAgIC8vIEV2ZW4gd2l0aG91dCBhIGNhdGNoIGhhbmRsZXIsIGNhbmNlbGxhdGlvbi90aW1lb3V0IG1heSBoYXZlIHdvbiBzaW5jZVxuICAgICAgLy8gdGhlIG9yaWdpbmFsIGZhaWx1cmUgd2FzIGZpcnN0IG9ic2VydmVkLlxuICAgICAgY29uc3QgZmluYWxpemVDb250cm9sRXJyb3IgPSB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoZXJyb3IpXG5cbiAgICAgIGlmIChmaW5hbGl6ZUNvbnRyb2xFcnJvcikge1xuICAgICAgICByZXR1cm4gZmluYWxpemVDb250cm9sRXJyb3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBVbmhhbmRsZWRFeGNlcHRpb24odW5kZWZpbmVkLCB7IGNhdXNlOiBlcnJvciB9KVxuICAgIH1cblxuICAgIGxldCBtYXBwZWQ6IEUgfCBQcm9taXNlPEU+XG5cbiAgICB0cnkge1xuICAgICAgbWFwcGVkID0gdGhpcy4jY2F0Y2hGbihlcnJvcilcbiAgICB9IGNhdGNoIChjYXRjaEVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgUGFuaWMoXCJSVU5fQ0FUQ0hfSEFORExFUl9USFJPV1wiLCB7IGNhdXNlOiBjYXRjaEVycm9yIH0pXG4gICAgfVxuXG4gICAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZShtYXBwZWQpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yYWNlKG1hcHBlZCwgZXJyb3IpXG4gICAgICB9IGNhdGNoIChjYXRjaEVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBQYW5pYyhcIlJVTl9DQVRDSF9IQU5ETEVSX1JFSkVDVFwiLCB7IGNhdXNlOiBjYXRjaEVycm9yIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29udHJvbCBzdGF0ZSBjYW4gY2hhbmdlIHdoaWxlIHRoZSBjYXRjaCBoYW5kbGVyIHJ1bnMsIHNvIGNoZWNrIGFnYWluXG4gICAgLy8gYmVmb3JlIHJldHVybmluZyBhIG1hcHBlZCBzeW5jIHZhbHVlLlxuICAgIGNvbnN0IGNhdGNoQ29udHJvbEVycm9yID0gdGhpcy5jaGVja0RpZENvbnRyb2xGYWlsKGVycm9yKVxuXG4gICAgaWYgKGNhdGNoQ29udHJvbEVycm9yKSB7XG4gICAgICByZXR1cm4gY2F0Y2hDb250cm9sRXJyb3JcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwcGVkXG4gIH1cblxuICBhc3luYyAjcnVuQXR0ZW1wdExvb3AoYXR0ZW1wdDogbnVtYmVyKTogUHJvbWlzZTxUIHwgRSB8IFJ1bm5lckVycm9yPiB7XG4gICAgbGV0IGN1cnJlbnRBdHRlbXB0ID0gYXR0ZW1wdFxuICAgIGxldCBjdXJyZW50RGVjaXNpb246IFJldHJ5RGVjaXNpb24gfCB1bmRlZmluZWRcblxuICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBjb250cm9sQmVmb3JlQXR0ZW1wdCA9IHRoaXMuY2hlY2tEaWRDb250cm9sRmFpbCgpXG5cbiAgICAgIGlmIChjb250cm9sQmVmb3JlQXR0ZW1wdCkge1xuICAgICAgICByZXR1cm4gY29udHJvbEJlZm9yZUF0dGVtcHRcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnREZWNpc2lvbikge1xuICAgICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICBjb25zdCBkZWxheUNvbnRyb2xSZXN1bHQgPSBhd2FpdCB0aGlzLndhaXRGb3JSZXRyeURlbGF5KGN1cnJlbnREZWNpc2lvbi5kZWxheSlcblxuICAgICAgICBpZiAoZGVsYXlDb250cm9sUmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIGRlbGF5Q29udHJvbFJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3R4LnJldHJ5LmF0dGVtcHQgPSBjdXJyZW50QXR0ZW1wdFxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLiN0cnlGbih0aGlzLmN0eCBhcyB1bmtub3duIGFzIEN0eClcblxuICAgICAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKHJlc3VsdCkpIHtcbiAgICAgICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgIGNvbnN0IHJhY2VkID0gYXdhaXQgdGhpcy5yYWNlKHJlc3VsdClcbiAgICAgICAgICByZXR1cm4gcmFjZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVTeW5jU3VjY2VzcyhyZXN1bHQpXG4gICAgICB9IGNhdGNoIChhdHRlbXB0RXJyb3IpIHtcbiAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLiNyZXNvbHZlRmFpbHVyZShhdHRlbXB0RXJyb3IpXG5cbiAgICAgICAgaWYgKCEocmVzb2x2ZWQgaW5zdGFuY2VvZiBSZXRyeURpcmVjdGl2ZSkpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnREZWNpc2lvbiA9IHJlc29sdmVkLmRlY2lzaW9uXG4gICAgICAgIGN1cnJlbnRBdHRlbXB0ICs9IDFcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVSdW48VCwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eD4oXG4gIGNvbmZpZzogQnVpbGRlckNvbmZpZyxcbiAgaW5wdXQ6IFJ1blRyeUZuPFQsIEN0eD5cbik6IFByb21pc2U8VCB8IFVuaGFuZGxlZEV4Y2VwdGlvbj5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlUnVuPFQsIEUsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHg+KFxuICBjb25maWc6IEJ1aWxkZXJDb25maWcsXG4gIGlucHV0OiBBc3luY1J1bklucHV0PFQsIEUsIEN0eD5cbik6IFByb21pc2U8VCB8IEUgfCBSdW5uZXJFcnJvcj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlUnVuPFQsIEUsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHg+KFxuICBjb25maWc6IEJ1aWxkZXJDb25maWcsXG4gIGlucHV0OiBBc3luY1J1bklucHV0PFQsIEUsIEN0eD5cbik6IFByb21pc2U8VCB8IEUgfCBSdW5uZXJFcnJvcj4ge1xuICB1c2luZyBleGVjdXRpb24gPSBuZXcgUnVuRXhlY3V0aW9uPFQsIEUsIEN0eD4oY29uZmlnLCBpbnB1dClcbiAgcmV0dXJuIGF3YWl0IGV4ZWN1dGlvbi5leGVjdXRlKClcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBCdWlsZGVyQ29uZmlnIH0gZnJvbSBcIi4uL2J1aWxkZXJcIlxuaW1wb3J0IHR5cGUgeyBSdW5uZXJFcnJvciB9IGZyb20gXCIuL2Jhc2VcIlxuaW1wb3J0IHR5cGUgeyBCYXNlVHJ5Q3R4LCBOb25Qcm9taXNlIH0gZnJvbSBcIi4vc2hhcmVkXCJcbmltcG9ydCB7XG4gIENvbnRyb2xFcnJvcixcbiAgUGFuaWMsXG4gIFJldHJ5RXhoYXVzdGVkRXJyb3IsXG4gIFVuaGFuZGxlZEV4Y2VwdGlvbixcbiAgdHlwZSBQYW5pY0NvZGUsXG59IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHsgY2hlY2tJc1Byb21pc2VMaWtlLCBpbnZhcmlhbnQgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgQmFzZUV4ZWN1dGlvbiwgUmV0cnlEaXJlY3RpdmUgfSBmcm9tIFwiLi9iYXNlXCJcblxuZXhwb3J0IHR5cGUgU3luY1J1blRyeUZuPFQsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHggPSBCYXNlVHJ5Q3R4PiA9IChjdHg6IEN0eCkgPT4gTm9uUHJvbWlzZTxUPlxuZXhwb3J0IHR5cGUgU3luY1J1bkNhdGNoRm48RT4gPSAoZXJyb3I6IHVua25vd24pID0+IE5vblByb21pc2U8RT5cblxuZXhwb3J0IGludGVyZmFjZSBTeW5jUnVuT3B0aW9uczxULCBFLCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4ID0gQmFzZVRyeUN0eD4ge1xuICB0cnk6IFN5bmNSdW5UcnlGbjxULCBDdHg+XG4gIGNhdGNoOiBTeW5jUnVuQ2F0Y2hGbjxFPlxufVxuXG5leHBvcnQgdHlwZSBTeW5jUnVuSW5wdXQ8VCwgRSwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eCA9IEJhc2VUcnlDdHg+ID1cbiAgfCBTeW5jUnVuVHJ5Rm48VCwgQ3R4PlxuICB8IFN5bmNSdW5PcHRpb25zPFQsIEUsIEN0eD5cblxuZnVuY3Rpb24gYXNzZXJ0Tm90UHJvbWlzZUxpa2UodmFsdWU6IHVua25vd24sIGNvZGU6IFBhbmljQ29kZSwgbWVzc2FnZT86IHN0cmluZyk6IHZvaWQge1xuICBpbnZhcmlhbnQoXG4gICAgIWNoZWNrSXNQcm9taXNlTGlrZSh2YWx1ZSksXG4gICAgbmV3IFBhbmljKGNvZGUsIG1lc3NhZ2UgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHsgbWVzc2FnZSB9KVxuICApXG59XG5cbmNsYXNzIFJ1blN5bmNFeGVjdXRpb248VCwgRSwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eD4gZXh0ZW5kcyBCYXNlRXhlY3V0aW9uPFQgfCBFIHwgUnVubmVyRXJyb3I+IHtcbiAgI2NhdGNoRm46IFN5bmNSdW5DYXRjaEZuPEU+IHwgdW5kZWZpbmVkXG4gICN0cnlGbjogU3luY1J1blRyeUZuPFQsIEN0eD5cblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEJ1aWxkZXJDb25maWcsIGlucHV0OiBTeW5jUnVuSW5wdXQ8VCwgRSwgQ3R4Pikge1xuICAgIHN1cGVyKGNvbmZpZylcblxuICAgIHRoaXMuI2NhdGNoRm4gPSB0eXBlb2YgaW5wdXQgPT09IFwiZnVuY3Rpb25cIiA/IHVuZGVmaW5lZCA6IGlucHV0LmNhdGNoXG4gICAgdGhpcy4jdHJ5Rm4gPSB0eXBlb2YgaW5wdXQgPT09IFwiZnVuY3Rpb25cIiA/IGlucHV0IDogaW5wdXQudHJ5XG4gIH1cblxuICBvdmVycmlkZSBleGVjdXRlKCk6IFQgfCBFIHwgUnVubmVyRXJyb3Ige1xuICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLmV4ZWN1dGUoKVxuICAgIGFzc2VydE5vdFByb21pc2VMaWtlKHJlc3VsdCwgXCJSVU5fU1lOQ19XUkFQUEVEX1JFU1VMVF9QUk9NSVNFXCIpXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGV4ZWN1dGVDb3JlKCk6IFQgfCBFIHwgUnVubmVyRXJyb3Ige1xuICAgIHJldHVybiB0aGlzLiNydW5BdHRlbXB0TG9vcCgxKVxuICB9XG5cbiAgI3Jlc29sdmVGYWlsdXJlKGVycm9yOiB1bmtub3duKTogRSB8IFJ1bm5lckVycm9yIHwgUmV0cnlEaXJlY3RpdmUge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFBhbmljKSB7XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbnRyb2xFcnJvcikge1xuICAgICAgcmV0dXJuIGVycm9yXG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbEVycm9yID0gdGhpcy5jaGVja0RpZENvbnRyb2xGYWlsKGVycm9yKVxuXG4gICAgaWYgKGNvbnRyb2xFcnJvcikge1xuICAgICAgcmV0dXJuIGNvbnRyb2xFcnJvclxuICAgIH1cblxuICAgIGNvbnN0IHJldHJ5RGVjaXNpb24gPSB0aGlzLmJ1aWxkUmV0cnlEZWNpc2lvbihlcnJvcilcblxuICAgIGlmIChyZXRyeURlY2lzaW9uLnNob3VsZEF0dGVtcHRSZXRyeSkge1xuICAgICAgcmV0dXJuIG5ldyBSZXRyeURpcmVjdGl2ZShyZXRyeURlY2lzaW9uKVxuICAgIH1cblxuICAgIGlmIChyZXRyeURlY2lzaW9uLmlzUmV0cnlFeGhhdXN0ZWQpIHtcbiAgICAgIHJldHVybiBuZXcgUmV0cnlFeGhhdXN0ZWRFcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGVycm9yIH0pXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLiNjYXRjaEZuKSB7XG4gICAgICAvLyBFdmVuIHdpdGhvdXQgYSBjYXRjaCBoYW5kbGVyLCBjYW5jZWxsYXRpb24vdGltZW91dCBtYXkgaGF2ZSB3b24gc2luY2VcbiAgICAgIC8vIHRoZSBvcmlnaW5hbCBmYWlsdXJlIHdhcyBmaXJzdCBvYnNlcnZlZC5cbiAgICAgIGNvbnN0IGZpbmFsaXplQ29udHJvbEVycm9yID0gdGhpcy5jaGVja0RpZENvbnRyb2xGYWlsKGVycm9yKVxuXG4gICAgICBpZiAoZmluYWxpemVDb250cm9sRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGZpbmFsaXplQ29udHJvbEVycm9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgVW5oYW5kbGVkRXhjZXB0aW9uKHVuZGVmaW5lZCwgeyBjYXVzZTogZXJyb3IgfSlcbiAgICB9XG5cbiAgICBsZXQgbWFwcGVkOiBFXG5cbiAgICB0cnkge1xuICAgICAgbWFwcGVkID0gdGhpcy4jY2F0Y2hGbihlcnJvcilcbiAgICB9IGNhdGNoIChjYXRjaEVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgUGFuaWMoXCJSVU5fU1lOQ19DQVRDSF9IQU5ETEVSX1RIUk9XXCIsIHsgY2F1c2U6IGNhdGNoRXJyb3IgfSlcbiAgICB9XG5cbiAgICBhc3NlcnROb3RQcm9taXNlTGlrZShtYXBwZWQsIFwiUlVOX1NZTkNfQ0FUQ0hfUFJPTUlTRVwiKVxuXG4gICAgLy8gQ29udHJvbCBzdGF0ZSBjYW4gY2hhbmdlIHdoaWxlIHRoZSBjYXRjaCBoYW5kbGVyIHJ1bnMsIHNvIGNoZWNrIGFnYWluXG4gICAgLy8gYmVmb3JlIHJldHVybmluZyBhIG1hcHBlZCBzeW5jIHZhbHVlLlxuICAgIGNvbnN0IGNhdGNoQ29udHJvbEVycm9yID0gdGhpcy5jaGVja0RpZENvbnRyb2xGYWlsKGVycm9yKVxuXG4gICAgaWYgKGNhdGNoQ29udHJvbEVycm9yKSB7XG4gICAgICByZXR1cm4gY2F0Y2hDb250cm9sRXJyb3JcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwcGVkXG4gIH1cblxuICAjcnVuQXR0ZW1wdExvb3AoYXR0ZW1wdDogbnVtYmVyKTogVCB8IEUgfCBSdW5uZXJFcnJvciB7XG4gICAgbGV0IGN1cnJlbnRBdHRlbXB0ID0gYXR0ZW1wdFxuXG4gICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xCZWZvcmVBdHRlbXB0ID0gdGhpcy5jaGVja0RpZENvbnRyb2xGYWlsKClcblxuICAgICAgaWYgKGNvbnRyb2xCZWZvcmVBdHRlbXB0KSB7XG4gICAgICAgIHJldHVybiBjb250cm9sQmVmb3JlQXR0ZW1wdFxuICAgICAgfVxuXG4gICAgICB0aGlzLmN0eC5yZXRyeS5hdHRlbXB0ID0gY3VycmVudEF0dGVtcHRcblxuICAgICAgbGV0IHJlc3VsdDogTm9uUHJvbWlzZTxUPlxuXG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSB0aGlzLiN0cnlGbih0aGlzLmN0eCBhcyB1bmtub3duIGFzIEN0eClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gdGhpcy4jcmVzb2x2ZUZhaWx1cmUoZXJyb3IpXG5cbiAgICAgICAgaWYgKHJlc29sdmVkIGluc3RhbmNlb2YgUmV0cnlEaXJlY3RpdmUpIHtcbiAgICAgICAgICBpZiAocmVzb2x2ZWQuZGVjaXNpb24uZGVsYXkgPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGFuaWMoXCJSVU5fU1lOQ19BU1lOQ19SRVRSWV9QT0xJQ1lcIilcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjdXJyZW50QXR0ZW1wdCArPSAxXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNvbHZlZFxuICAgICAgfVxuXG4gICAgICBhc3NlcnROb3RQcm9taXNlTGlrZShyZXN1bHQsIFwiUlVOX1NZTkNfVFJZX1BST01JU0VcIilcblxuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZVN5bmNTdWNjZXNzKHJlc3VsdClcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVSdW5TeW5jPFQsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHg+KFxuICBjb25maWc6IEJ1aWxkZXJDb25maWcsXG4gIGlucHV0OiBTeW5jUnVuVHJ5Rm48VCwgQ3R4PlxuKTogVCB8IFVuaGFuZGxlZEV4Y2VwdGlvbiB8IFJ1bm5lckVycm9yXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZVJ1blN5bmM8VCwgRSwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eD4oXG4gIGNvbmZpZzogQnVpbGRlckNvbmZpZyxcbiAgaW5wdXQ6IFN5bmNSdW5JbnB1dDxULCBFLCBDdHg+XG4pOiBUIHwgRSB8IFJ1bm5lckVycm9yXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZVJ1blN5bmM8VCwgRSwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eD4oXG4gIGNvbmZpZzogQnVpbGRlckNvbmZpZyxcbiAgaW5wdXQ6IFN5bmNSdW5JbnB1dDxULCBFLCBDdHg+XG4pOiBUIHwgRSB8IFJ1bm5lckVycm9yIHtcbiAgLy8gQnVpbGRlciB0eXBpbmcgYmxvY2tzIGFzeW5jLW9ubHkgcmV0cnkgcG9saWNpZXMsIGJ1dCBkaXJlY3QgZXhlY3V0b3IgdXNhZ2UgYW5kXG4gIC8vIHVuc2FmZSBjYXN0cyBzdGlsbCBuZWVkIGEgcnVudGltZSBndWFyZCBoZXJlLlxuICBjb25zdCBpc1N5bmNTYWZlUmV0cnlQb2xpY3kgPVxuICAgIGNvbmZpZy5yZXRyeSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgKGNvbmZpZy5yZXRyeS5iYWNrb2ZmID09PSBcImNvbnN0YW50XCIgJiZcbiAgICAgICFjb25maWcucmV0cnkuaml0dGVyICYmXG4gICAgICAoY29uZmlnLnJldHJ5LmRlbGF5TXMgPz8gMCkgPD0gMClcblxuICBpbnZhcmlhbnQoaXNTeW5jU2FmZVJldHJ5UG9saWN5LCBuZXcgUGFuaWMoXCJSVU5fU1lOQ19BU1lOQ19SRVRSWV9QT0xJQ1lcIikpXG5cbiAgdXNpbmcgZXhlY3V0aW9uID0gbmV3IFJ1blN5bmNFeGVjdXRpb248VCwgRSwgQ3R4Pihjb25maWcsIGlucHV0KVxuICByZXR1cm4gZXhlY3V0aW9uLmV4ZWN1dGUoKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7XG4gIENhbmNlbGxhdGlvbkVycm9yLFxuICBSZXRyeUV4aGF1c3RlZEVycm9yLFxuICBUaW1lb3V0RXJyb3IsXG4gIFVuaGFuZGxlZEV4Y2VwdGlvbixcbn0gZnJvbSBcIi4vZXJyb3JzXCJcbmltcG9ydCB0eXBlIHtcbiAgSW5mZXJyZWRUYXNrQ29udGV4dCxcbiAgVGFza1JlY29yZCxcbiAgVGFza1Jlc3VsdCxcbiAgVGFza1ZhbGlkYXRpb24sXG4gIEFsbE9wdGlvbnMsXG4gIEFsbFNldHRsZWRSZXN1bHQsXG4gIFRyeUN0eCxcbiAgVHJ5Q3R4Rm9yLFxufSBmcm9tIFwiLi9leGVjdXRvcnMvc2hhcmVkXCJcbmltcG9ydCB0eXBlIHsgUmV0cnlPcHRpb25zLCBSZXRyeVBvbGljeSB9IGZyb20gXCIuL21vZGlmaWVycy9yZXRyeVwiXG5pbXBvcnQgeyBQYW5pYyB9IGZyb20gXCIuL2Vycm9yc1wiXG5pbXBvcnQgeyBleGVjdXRlQWxsIH0gZnJvbSBcIi4vZXhlY3V0b3JzL2FsbFwiXG5pbXBvcnQgeyBleGVjdXRlQWxsU2V0dGxlZCB9IGZyb20gXCIuL2V4ZWN1dG9ycy9hbGwtc2V0dGxlZFwiXG5pbXBvcnQgeyBleGVjdXRlRmxvdywgdHlwZSBGbG93UmVzdWx0LCB0eXBlIEluZmVycmVkRmxvd1Rhc2tDb250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0b3JzL2Zsb3dcIlxuaW1wb3J0IHsgZXhlY3V0ZVJ1biwgdHlwZSBBc3luY1J1bklucHV0LCB0eXBlIFJ1blRyeUZuIH0gZnJvbSBcIi4vZXhlY3V0b3JzL3J1blwiXG5pbXBvcnQgeyBleGVjdXRlUnVuU3luYywgdHlwZSBTeW5jUnVuSW5wdXQsIHR5cGUgU3luY1J1blRyeUZuIH0gZnJvbSBcIi4vZXhlY3V0b3JzL3J1bi1zeW5jXCJcbmltcG9ydCB7IHJldHJ5T3B0aW9ucyB9IGZyb20gXCIuL21vZGlmaWVycy9yZXRyeVwiXG5pbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tIFwiLi91dGlsc1wiXG5cbi8qKlxuICogV3JhcHMgYXJlIG9ic2VydmF0aW9uYWwgaG9va3M6IHRoZXkgY2FuIGluc3BlY3QgZXhlY3V0aW9uIGNvbnRleHQgYW5kIHN1cnJvdW5kIGV4ZWN1dGlvbiwgYnV0XG4gKiB0aGV5IG11c3Qgbm90IG11dGF0ZSBjb250ZXh0IG9yIHJlcGxhY2UgaXQuXG4gKi9cbmV4cG9ydCB0eXBlIFdyYXBDdHggPSBSZWFkb25seTxPbWl0PFRyeUN0eCwgXCJyZXRyeVwiPj4gJiB7XG4gIHJlYWRvbmx5IHJldHJ5OiBSZWFkb25seTxUcnlDdHhbXCJyZXRyeVwiXT5cbn1cblxudHlwZSBXcmFwRm4gPSAoY3R4OiBXcmFwQ3R4LCBuZXh0OiAoKSA9PiB1bmtub3duKSA9PiB1bmtub3duXG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRlckNvbmZpZyB7XG4gIC8qKlxuICAgKiBSZXRyeSBjb25maWd1cmF0aW9uIGFwcGxpZWQgdG8gdGhlIHJ1bi5cbiAgICovXG4gIHJldHJ5PzogUmV0cnlQb2xpY3lcbiAgLyoqXG4gICAqIFRpbWVvdXQgY29uZmlndXJhdGlvbiBhcHBsaWVkIHRvIHRoZSBydW4uXG4gICAqL1xuICB0aW1lb3V0PzogbnVtYmVyXG4gIC8qKlxuICAgKiBBYm9ydCBzaWduYWxzIHVzZWQgdG8gY2FuY2VsIGV4ZWN1dGlvbi5cbiAgICovXG4gIHNpZ25hbHM/OiBBYm9ydFNpZ25hbFtdXG4gIC8qKlxuICAgKiBXcmFwcGVyIG1pZGRsZXdhcmUgY2hhaW4gYXJvdW5kIGV4ZWN1dGlvbi5cbiAgICovXG4gIHdyYXBzPzogV3JhcEZuW11cbn1cblxudHlwZSBDb25maWdSdW5FcnJvcnMgPSBSZXRyeUV4aGF1c3RlZEVycm9yIHwgVGltZW91dEVycm9yIHwgQ2FuY2VsbGF0aW9uRXJyb3JcbnR5cGUgT3JjaGVzdHJhdGlvbk1ldGhvZHMgPSBcImFsbFwiIHwgXCJhbGxTZXR0bGVkXCIgfCBcImZsb3dcIlxudHlwZSBTaWduYWxCdWlsZGVySGlkZGVuTWV0aG9kczxTdXBwb3J0c09yY2hlc3RyYXRpb24gZXh0ZW5kcyBib29sZWFuPiA9XG4gIHwgXCJydW5TeW5jXCJcbiAgfCBcIndyYXBcIlxuICB8IChTdXBwb3J0c09yY2hlc3RyYXRpb24gZXh0ZW5kcyB0cnVlID8gbmV2ZXIgOiBPcmNoZXN0cmF0aW9uTWV0aG9kcylcbnR5cGUgRXhlY3V0aW9uQnVpbGRlclN1cmZhY2U8RSBleHRlbmRzIENvbmZpZ1J1bkVycm9ycywgSGFzUmV0cnkgZXh0ZW5kcyBib29sZWFuPiA9IE9taXQ8XG4gIFJ1bkJ1aWxkZXI8RSwgSGFzUmV0cnksIGZhbHNlPixcbiAgT3JjaGVzdHJhdGlvbk1ldGhvZHMgfCBcIndyYXBcIlxuPlxudHlwZSBBc3luY0V4ZWN1dGlvbkJ1aWxkZXJTdXJmYWNlPEUgZXh0ZW5kcyBDb25maWdSdW5FcnJvcnMsIEhhc1JldHJ5IGV4dGVuZHMgYm9vbGVhbj4gPSBPbWl0PFxuICBSdW5CdWlsZGVyPEUsIEhhc1JldHJ5LCBmYWxzZT4sXG4gIE9yY2hlc3RyYXRpb25NZXRob2RzIHwgXCJydW5TeW5jXCIgfCBcIndyYXBcIlxuPlxudHlwZSBTaWduYWxCdWlsZGVyU3VyZmFjZTxcbiAgRSBleHRlbmRzIENvbmZpZ1J1bkVycm9ycyxcbiAgSGFzUmV0cnkgZXh0ZW5kcyBib29sZWFuLFxuICBTdXBwb3J0c09yY2hlc3RyYXRpb24gZXh0ZW5kcyBib29sZWFuLFxuPiA9IE9taXQ8XG4gIFJ1bkJ1aWxkZXI8RSwgSGFzUmV0cnksIFN1cHBvcnRzT3JjaGVzdHJhdGlvbj4sXG4gIFNpZ25hbEJ1aWxkZXJIaWRkZW5NZXRob2RzPFN1cHBvcnRzT3JjaGVzdHJhdGlvbj5cbj5cblxuZXhwb3J0IGNsYXNzIFJ1bkJ1aWxkZXI8XG4gIEUgZXh0ZW5kcyBDb25maWdSdW5FcnJvcnMgPSBuZXZlcixcbiAgSGFzUmV0cnkgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4gIFN1cHBvcnRzT3JjaGVzdHJhdGlvbiBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb25maWc6IEJ1aWxkZXJDb25maWdcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEJ1aWxkZXJDb25maWcgPSB7fSkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnXG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRUaW1lb3V0Q29uZmlnKG1zOiBudW1iZXIpOiBCdWlsZGVyQ29uZmlnIHtcbiAgICBpbnZhcmlhbnQoTnVtYmVyLmlzRmluaXRlKG1zKSwgbmV3IFBhbmljKFwiVElNRU9VVF9JTlZBTElEX01TXCIpKVxuICAgIGludmFyaWFudChtcyA+PSAwLCBuZXcgUGFuaWMoXCJUSU1FT1VUX0lOVkFMSURfTVNcIikpXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICB0aW1lb3V0OiBtcyxcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRTaWduYWxDb25maWcoc2lnbmFsOiBBYm9ydFNpZ25hbCk6IEJ1aWxkZXJDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIHNpZ25hbHM6IFsuLi4odGhpcy5jb25maWcuc2lnbmFscyA/PyBbXSksIHNpZ25hbF0sXG4gICAgfVxuICB9XG5cbiAgcmV0cnkocG9saWN5OiBudW1iZXIpOiBFeGVjdXRpb25CdWlsZGVyU3VyZmFjZTxFIHwgUmV0cnlFeGhhdXN0ZWRFcnJvciwgdHJ1ZT5cbiAgcmV0cnkocG9saWN5OiBSZXRyeU9wdGlvbnMpOiBBc3luY0V4ZWN1dGlvbkJ1aWxkZXJTdXJmYWNlPEUgfCBSZXRyeUV4aGF1c3RlZEVycm9yLCB0cnVlPlxuICByZXRyeShwb2xpY3k6IFJldHJ5T3B0aW9ucyk6IEV4ZWN1dGlvbkJ1aWxkZXJTdXJmYWNlPEUgfCBSZXRyeUV4aGF1c3RlZEVycm9yLCB0cnVlPiB7XG4gICAgcmV0dXJuIG5ldyBFeGVjdXRpb25CdWlsZGVyKHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgcmV0cnk6IHJldHJ5T3B0aW9ucyhwb2xpY3kpLFxuICAgIH0pXG4gIH1cblxuICB0aW1lb3V0KG1zOiBudW1iZXIpOiBBc3luY0V4ZWN1dGlvbkJ1aWxkZXJTdXJmYWNlPEUgfCBUaW1lb3V0RXJyb3IsIEhhc1JldHJ5PiB7XG4gICAgcmV0dXJuIG5ldyBFeGVjdXRpb25CdWlsZGVyKHRoaXMuYnVpbGRUaW1lb3V0Q29uZmlnKG1zKSlcbiAgfVxuXG4gIHNpZ25hbChcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsXG4gICk6IFNpZ25hbEJ1aWxkZXJTdXJmYWNlPEUgfCBDYW5jZWxsYXRpb25FcnJvciwgSGFzUmV0cnksIFN1cHBvcnRzT3JjaGVzdHJhdGlvbj4ge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRXhlY3V0aW9uQnVpbGRlcikge1xuICAgICAgcmV0dXJuIG5ldyBFeGVjdXRpb25CdWlsZGVyKFxuICAgICAgICB0aGlzLmJ1aWxkU2lnbmFsQ29uZmlnKHNpZ25hbClcbiAgICAgICkgYXMgdW5rbm93biBhcyBTaWduYWxCdWlsZGVyU3VyZmFjZTxFIHwgQ2FuY2VsbGF0aW9uRXJyb3IsIEhhc1JldHJ5LCBTdXBwb3J0c09yY2hlc3RyYXRpb24+XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBSdW5CdWlsZGVyKHRoaXMuYnVpbGRTaWduYWxDb25maWcoc2lnbmFsKSkgYXMgdW5rbm93biBhcyBTaWduYWxCdWlsZGVyU3VyZmFjZTxcbiAgICAgIEUgfCBDYW5jZWxsYXRpb25FcnJvcixcbiAgICAgIEhhc1JldHJ5LFxuICAgICAgU3VwcG9ydHNPcmNoZXN0cmF0aW9uXG4gICAgPlxuICB9XG5cbiAgd3JhcChmbjogV3JhcEZuKTogUnVuQnVpbGRlcjxFLCBIYXNSZXRyeSwgU3VwcG9ydHNPcmNoZXN0cmF0aW9uPiB7XG4gICAgcmV0dXJuIG5ldyBSdW5CdWlsZGVyKHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgd3JhcHM6IFsuLi4odGhpcy5jb25maWcud3JhcHMgPz8gW10pLCBmbl0sXG4gICAgfSlcbiAgfVxuXG4gIHJ1bjxUPih0cnlGbjogUnVuVHJ5Rm48VCwgVHJ5Q3R4Rm9yPEhhc1JldHJ5Pj4pOiBQcm9taXNlPFQgfCBVbmhhbmRsZWRFeGNlcHRpb24gfCBFPlxuICBydW48VCwgQz4ob3B0aW9uczogQXN5bmNSdW5JbnB1dDxULCBDLCBUcnlDdHhGb3I8SGFzUmV0cnk+Pik6IFByb21pc2U8VCB8IEMgfCBFPlxuICBydW48VCwgQz4oaW5wdXQ6IEFzeW5jUnVuSW5wdXQ8VCwgQywgVHJ5Q3R4Rm9yPEhhc1JldHJ5Pj4pIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJ1bih0aGlzLmNvbmZpZywgaW5wdXQpXG4gIH1cblxuICBydW5TeW5jPFQ+KHRyeUZuOiBTeW5jUnVuVHJ5Rm48VCwgVHJ5Q3R4Rm9yPEhhc1JldHJ5Pj4pOiBUIHwgVW5oYW5kbGVkRXhjZXB0aW9uIHwgRVxuICBydW5TeW5jPFQsIEM+KGlucHV0OiBTeW5jUnVuSW5wdXQ8VCwgQywgVHJ5Q3R4Rm9yPEhhc1JldHJ5Pj4pOiBUIHwgQyB8IEVcbiAgcnVuU3luYzxULCBDPihpbnB1dDogU3luY1J1bklucHV0PFQsIEMsIFRyeUN0eEZvcjxIYXNSZXRyeT4+KSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSdW5TeW5jKHRoaXMuY29uZmlnLCBpbnB1dClcbiAgfVxuXG4gIGFsbDxUIGV4dGVuZHMgVGFza1JlY29yZCwgQyA9IG5ldmVyPihcbiAgICB0YXNrczogVCAmIFRhc2tWYWxpZGF0aW9uPE5vSW5mZXI8VD4+ICYgVGhpc1R5cGU8SW5mZXJyZWRUYXNrQ29udGV4dDxUPj4sXG4gICAgb3B0aW9ucz86IEFsbE9wdGlvbnM8VCwgQz5cbiAgKTogUHJvbWlzZTx7IFtLIGluIGtleW9mIFRdOiBUYXNrUmVzdWx0PFRbS10+IH0gfCBDPiB7XG4gICAgcmV0dXJuIGV4ZWN1dGVBbGwodGhpcy5jb25maWcsIHRhc2tzLCBvcHRpb25zKVxuICB9XG5cbiAgYWxsU2V0dGxlZDxUIGV4dGVuZHMgVGFza1JlY29yZD4oXG4gICAgdGFza3M6IFQgJiBUYXNrVmFsaWRhdGlvbjxOb0luZmVyPFQ+PiAmIFRoaXNUeXBlPEluZmVycmVkVGFza0NvbnRleHQ8VD4+XG4gICk6IFByb21pc2U8QWxsU2V0dGxlZFJlc3VsdDxUPj4ge1xuICAgIHJldHVybiBleGVjdXRlQWxsU2V0dGxlZCh0aGlzLmNvbmZpZywgdGFza3MpXG4gIH1cblxuICBmbG93PFQgZXh0ZW5kcyBUYXNrUmVjb3JkPihcbiAgICB0YXNrczogVCAmIFRoaXNUeXBlPEluZmVycmVkRmxvd1Rhc2tDb250ZXh0PFQ+PlxuICApOiBQcm9taXNlPEZsb3dSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gZXhlY3V0ZUZsb3codGhpcy5jb25maWcsIHRhc2tzKVxuICB9XG59XG5cbmNsYXNzIEV4ZWN1dGlvbkJ1aWxkZXI8XG4gIEUgZXh0ZW5kcyBDb25maWdSdW5FcnJvcnMgPSBuZXZlcixcbiAgSGFzUmV0cnkgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+IGV4dGVuZHMgUnVuQnVpbGRlcjxFLCBIYXNSZXRyeSwgZmFsc2U+IHtcbiAgY29uc3RydWN0b3IoY29uZmlnOiBCdWlsZGVyQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpXG5cbiAgICAvLyBSZXRyeS90aW1lb3V0IGNoYWlucyBtdXN0IG5vdCBzaWxlbnRseSBrZWVwIG9yY2hlc3RyYXRpb24gZW50cnlwb2ludHMgYXRcbiAgICAvLyBydW50aW1lLCBldmVuIHRob3VnaCB0aGUgdHlwZSBzdXJmYWNlIGFscmVhZHkgcmVtb3ZlcyB0aGVtLlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgIGFsbDogeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQsIHdyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgYWxsU2V0dGxlZDogeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQsIHdyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgZmxvdzogeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQsIHdyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgd3JhcDogeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQsIHdyaXRhYmxlOiBmYWxzZSB9LFxuICAgIH0pXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgY3JlYXRlQXN5bmNEaXNwb3NlciwgdHlwZSBBc3luY0Rpc3Bvc2VyIH0gZnJvbSBcIi4uL3NoaW1zL2Rpc3Bvc2VyXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2UoKTogQXN5bmNEaXNwb3NlciB7XG4gIHJldHVybiBjcmVhdGVBc3luY0Rpc3Bvc2VyKClcbn1cbiIsCiAgICAiaW1wb3J0IHsgY2hlY2tJc1Byb21pc2VMaWtlIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG50eXBlIEdlblVud3JhcDxUPiA9IEV4Y2x1ZGU8QXdhaXRlZDxUPiwgRXJyb3I+XG5leHBvcnQgdHlwZSBHZW5Vc2UgPSA8VD4odmFsdWU6IFQpID0+IEdlbmVyYXRvcjxULCBHZW5VbndyYXA8VD4sIEdlblVud3JhcDxUPj5cblxudHlwZSBHZW5FcnJvcnM8VFlpZWxkPiA9IEV4dHJhY3Q8QXdhaXRlZDxUWWllbGQ+LCBFcnJvcj5cbnR5cGUgQ2hlY2tJc0FzeW5jPFRZaWVsZCwgVFJldHVybj4gPVxuICBFeHRyYWN0PFRZaWVsZCB8IFRSZXR1cm4sIFByb21pc2VMaWtlPHVua25vd24+PiBleHRlbmRzIG5ldmVyID8gZmFsc2UgOiB0cnVlXG5cbmV4cG9ydCB0eXBlIEdlblJlc3VsdDxUWWllbGQsIFRSZXR1cm4+ID1cbiAgQ2hlY2tJc0FzeW5jPFRZaWVsZCwgVFJldHVybj4gZXh0ZW5kcyB0cnVlXG4gICAgPyBQcm9taXNlPEF3YWl0ZWQ8VFJldHVybj4gfCBHZW5FcnJvcnM8VFlpZWxkPj5cbiAgICA6IEF3YWl0ZWQ8VFJldHVybj4gfCBHZW5FcnJvcnM8VFlpZWxkPlxuXG5mdW5jdGlvbiogdXNlPFQ+KHZhbHVlOiBUKTogR2VuZXJhdG9yPFQsIEdlblVud3JhcDxUPiwgR2VuVW53cmFwPFQ+PiB7XG4gIHJldHVybiB5aWVsZCB2YWx1ZVxufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlQXN5bmNHZW5lcmF0b3I8VFlpZWxkLCBUUmV0dXJuPihcbiAgaXRlcmF0b3I6IEdlbmVyYXRvcjxUWWllbGQsIFRSZXR1cm4sIHVua25vd24+LFxuICBpbml0aWFsU3RlcDogSXRlcmF0b3JSZXN1bHQ8VFlpZWxkLCBUUmV0dXJuPlxuKTogUHJvbWlzZTxBd2FpdGVkPFRSZXR1cm4+IHwgR2VuRXJyb3JzPFRZaWVsZD4+IHtcbiAgbGV0IGN1cnJlbnRTdGVwID0gaW5pdGlhbFN0ZXBcblxuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoY3VycmVudFN0ZXAuZG9uZSkge1xuICAgICAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZShjdXJyZW50U3RlcC52YWx1ZSkpIHtcbiAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgcmV0dXJuIGF3YWl0IGN1cnJlbnRTdGVwLnZhbHVlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyZW50U3RlcC52YWx1ZSBhcyBBd2FpdGVkPFRSZXR1cm4+XG4gICAgfVxuXG4gICAgbGV0IGN1cnJlbnRWYWx1ZTogdW5rbm93blxuXG4gICAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZShjdXJyZW50U3RlcC52YWx1ZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IGF3YWl0IGN1cnJlbnRTdGVwLnZhbHVlXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjdXJyZW50U3RlcCA9IGl0ZXJhdG9yLnRocm93KGVycm9yKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50U3RlcC52YWx1ZVxuICAgIH1cblxuICAgIGlmIChjdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZSBhcyBHZW5FcnJvcnM8VFlpZWxkPlxuICAgIH1cblxuICAgIGN1cnJlbnRTdGVwID0gaXRlcmF0b3IubmV4dChjdXJyZW50VmFsdWUpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRyaXZlR2VuPFRZaWVsZCwgVFJldHVybj4oXG4gIGZhY3Rvcnk6ICh1c2VGbjogR2VuVXNlKSA9PiBHZW5lcmF0b3I8VFlpZWxkLCBUUmV0dXJuLCB1bmtub3duPlxuKTogR2VuUmVzdWx0PFRZaWVsZCwgVFJldHVybj4ge1xuICBjb25zdCBpdGVyYXRvciA9IGZhY3RvcnkodXNlKVxuXG4gIGxldCBjdXJyZW50VmFsdWU6IHVua25vd24gPSB1bmRlZmluZWRcblxuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBzdGVwID0gaXRlcmF0b3IubmV4dChjdXJyZW50VmFsdWUpXG5cbiAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKHN0ZXAudmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc3RlcC52YWx1ZSkgYXMgR2VuUmVzdWx0PFRZaWVsZCwgVFJldHVybj5cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0ZXAudmFsdWUgYXMgR2VuUmVzdWx0PFRZaWVsZCwgVFJldHVybj5cbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKHN0ZXAudmFsdWUpKSB7XG4gICAgICByZXR1cm4gZXhlY3V0ZUFzeW5jR2VuZXJhdG9yKGl0ZXJhdG9yLCBzdGVwKSBhcyBHZW5SZXN1bHQ8VFlpZWxkLCBUUmV0dXJuPlxuICAgIH1cblxuICAgIGlmIChzdGVwLnZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiBzdGVwLnZhbHVlIGFzIEdlblJlc3VsdDxUWWllbGQsIFRSZXR1cm4+XG4gICAgfVxuXG4gICAgY3VycmVudFZhbHVlID0gc3RlcC52YWx1ZVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IFJ1bkJ1aWxkZXIgfSBmcm9tIFwiLi9saWIvYnVpbGRlclwiXG5cbmNvbnN0IHJvb3QgPSBuZXcgUnVuQnVpbGRlcigpXG5cbmV4cG9ydCBjb25zdCBhbGw6IFJ1bkJ1aWxkZXJbXCJhbGxcIl0gPSByb290LmFsbC5iaW5kKHJvb3QpXG5leHBvcnQgY29uc3QgYWxsU2V0dGxlZDogUnVuQnVpbGRlcltcImFsbFNldHRsZWRcIl0gPSByb290LmFsbFNldHRsZWQuYmluZChyb290KVxuZXhwb3J0IGNvbnN0IGZsb3c6IFJ1bkJ1aWxkZXJbXCJmbG93XCJdID0gcm9vdC5mbG93LmJpbmQocm9vdClcbmV4cG9ydCBjb25zdCByZXRyeTogUnVuQnVpbGRlcltcInJldHJ5XCJdID0gcm9vdC5yZXRyeS5iaW5kKHJvb3QpXG5leHBvcnQgY29uc3QgcnVuOiBSdW5CdWlsZGVyW1wicnVuXCJdID0gcm9vdC5ydW4uYmluZChyb290KVxuZXhwb3J0IGNvbnN0IHJ1blN5bmM6IFJ1bkJ1aWxkZXJbXCJydW5TeW5jXCJdID0gcm9vdC5ydW5TeW5jLmJpbmQocm9vdClcbmV4cG9ydCBjb25zdCBzaWduYWw6IFJ1bkJ1aWxkZXJbXCJzaWduYWxcIl0gPSByb290LnNpZ25hbC5iaW5kKHJvb3QpXG5leHBvcnQgY29uc3QgdGltZW91dDogUnVuQnVpbGRlcltcInRpbWVvdXRcIl0gPSByb290LnRpbWVvdXQuYmluZChyb290KVxuZXhwb3J0IGNvbnN0IHdyYXA6IFJ1bkJ1aWxkZXJbXCJ3cmFwXCJdID0gcm9vdC53cmFwLmJpbmQocm9vdClcblxuZXhwb3J0IHsgZGlzcG9zZSB9IGZyb20gXCIuL2xpYi9kaXNwb3NlXCJcbmV4cG9ydCB7IGRyaXZlR2VuIGFzIGdlbiB9IGZyb20gXCIuL2xpYi9nZW5cIlxuXG5leHBvcnQgeyByZXRyeU9wdGlvbnMgfSBmcm9tIFwiLi9saWIvbW9kaWZpZXJzL3JldHJ5XCJcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7OztBQUFBLElBQU0sMkJBQTJCO0FBRWpDLElBQU0sZ0JBQWdCLFFBQVEsSUFBSSxRQUFRLFNBQVM7QUFDbkQsSUFBTSxxQkFBcUIsUUFBUSxJQUFJLFFBQVEsY0FBYztBQUV0RCxJQUFNLFVBQ1gsT0FBTyxrQkFBa0IsV0FBVyxnQkFBZ0IsT0FBTyxJQUFJLGdCQUFnQjtBQUMxRSxJQUFNLGdCQUNYLE9BQU8sdUJBQXVCLFdBQVcscUJBQXFCLE9BQU8sSUFBSSxxQkFBcUI7QUF1QnpGLFNBQVMsa0JBQWtCLENBQUMsV0FBc0M7QUFBQSxFQUN2RSxPQUFPLGVBQWUsV0FBVyxTQUFTO0FBQUEsSUFDeEMsY0FBYztBQUFBLElBQ2QsS0FBSyxHQUE0QjtBQUFBLE1BQy9CLEtBQUssUUFBUTtBQUFBO0FBQUEsSUFFZixVQUFVO0FBQUEsRUFDWixDQUFDO0FBQUE7QUFHSSxTQUFTLHVCQUF1QixDQUFDLFdBQW9EO0FBQUEsRUFDMUYsT0FBTyxlQUFlLFdBQVcsZUFBZTtBQUFBLElBQzlDLGNBQWM7QUFBQSxTQUNSLE1BQUssR0FBMEM7QUFBQSxNQUNuRCxNQUFNLEtBQUssYUFBYTtBQUFBO0FBQUEsSUFFMUIsVUFBVTtBQUFBLEVBQ1osQ0FBQztBQUFBO0FBR0gsU0FBUyxxQkFBcUIsQ0FBQyxPQUFnQixZQUE0QjtBQUFBLEVBQ3pFLElBQUksT0FBTyxvQkFBb0IsWUFBWTtBQUFBLElBQ3pDLE9BQU8sSUFBSSxnQkFBZ0IsT0FBTyxZQUFZLHdCQUF3QjtBQUFBLEVBQ3hFO0FBQUEsRUFFQSxNQUFNLFVBQVUsSUFBSSxNQUFNLHdCQUF3QjtBQUFBLEVBS2xELFFBQVEsT0FBTztBQUFBLEVBQ2YsUUFBUSxRQUFRO0FBQUEsRUFDaEIsUUFBUSxhQUFhO0FBQUEsRUFFckIsT0FBTztBQUFBO0FBR1QsU0FB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T0FBTyxNQUFNLFlBQVk7QUFBQSxNQUMzQjtBQUFBLE1BRUEsT0FBTyxZQUFZO0FBQUEsSUFDckI7QUFBQSxJQUVBLElBQUk7QUFBQSxJQUVKLElBQUksbUJBQW1CLFlBQVksS0FBSyxHQUFHO0FBQUEsTUFDekMsSUFBSTtBQUFBLFFBRUYsZUFBZSxNQUFNLFlBQVk7QUFBQSxRQUNqQyxPQUFPLE9BQU87QUFBQSxRQUNkLGNBQWMsU0FBUyxNQUFNLEtBQUs7QUFBQSxRQUNsQztBQUFBO0FBQUEsSUFFSixFQUFPO0FBQUEsTUFDTCxlQUFlLFlBQVk7QUFBQTtBQUFBLElBRzdCLElBQUksd0JBQXdCLE9BQU87QUFBQSxNQUNqQyxPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsY0FBYyxTQUFTLEtBQUssWUFBWTtBQUFBLEVBQzFDO0FBQUE7QUFHSyxTQUFTLFFBQXlCLENBQ3ZDLFNBQzRCO0FBQUEsRUFDNUIsTUFBTSxXQUFXLFFBQVEsR0FBRztBQUFBLEVBRTVCLElBQUksZUFBd0I7QUFBQSxFQUc1QixPQUFPLE1BQU07QUFBQSxJQUNYLE1BQU0sT0FBTyxTQUFTLEtBQUssWUFBWTtBQUFBLElBRXZDLElBQUksS0FBSyxNQUFNO0FBQUEsTUFDYixJQUFJLG1CQUFtQixLQUFLLEtBQUssR0FBRztBQUFBLFFBQ2xDLE9BQU8sUUFBUSxRQUFRLEtBQUssS0FBSztBQUFBLE1BQ25DO0FBQUEsTUFFQSxPQUFPLEtBQUs7QUFBQSxJQUNkO0FBQUEsSUFFQSxJQUFJLG1CQUFtQixLQUFLLEtBQUssR0FBRztBQUFBLE1BQ2xDLE9BQU8sc0JBQXNCLFVBQVUsSUFBSTtBQUFBLElBQzdDO0FBQUEsSUFFQSxJQUFJLEtBQUssaUJBQWlCLE9BQU87QUFBQSxNQUMvQixPQUFPLEtBQUs7QUFBQSxJQUNkO0FBQUEsSUFFQSxlQUFlLEtBQUs7QUFBQSxFQUN0QjtBQUFBOzs7QUNuRkYsSUFBTSxPQUFPLElBQUk7QUFFVixJQUFNLE1BQXlCLEtBQUssSUFBSSxLQUFLLElBQUk7QUFDakQsSUFBTSxhQUF1QyxLQUFLLFdBQVcsS0FBSyxJQUFJO0FBQ3RFLElBQU0sT0FBMkIsS0FBSyxLQUFLLEtBQUssSUFBSTtBQUNwRCxJQUFNLFFBQTZCLEtBQUssTUFBTSxLQUFLLElBQUk7QUFDdkQsSUFBTSxNQUF5QixLQUFLLElBQUksS0FBSyxJQUFJO0FBQ2pELElBQU0sVUFBaUMsS0FBSyxRQUFRLEtBQUssSUFBSTtBQUM3RCxJQUFNLFNBQStCLEtBQUssT0FBTyxLQUFLLElBQUk7QUFDMUQsSUFBTSxVQUFpQyxLQUFLLFFBQVEsS0FBSyxJQUFJO0FBQzdELElBQU0sT0FBMkIsS0FBSyxLQUFLLEtBQUssSUFBSTsiLAogICJkZWJ1Z0lkIjogIjkxRkI5MzNGNEY0NkI1Qzk2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
1327
|
+
//# debugId=FF13B582A6CB2DF764756E2164756E21
|
|
1328
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3NoaW1zL2Rpc3Bvc2VyLnRzIiwgInNyYy9saWIvdXRpbHMudHMiLCAic3JjL2xpYi9tb2RpZmllcnMvcmV0cnkudHMiLCAic3JjL2xpYi9tb2RpZmllcnMvc2lnbmFsLnRzIiwgInNyYy9saWIvbW9kaWZpZXJzL3RpbWVvdXQudHMiLCAic3JjL2xpYi9leGVjdXRvcnMvYmFzZS50cyIsICJzcmMvbGliL2V4ZWN1dG9ycy9zaGFyZWQudHMiLCAic3JjL2xpYi9leGVjdXRvcnMvYWxsLnRzIiwgInNyYy9saWIvZXhlY3V0b3JzL2FsbC1zZXR0bGVkLnRzIiwgInNyYy9saWIvZXhlY3V0b3JzL2Zsb3cudHMiLCAic3JjL2xpYi9leGVjdXRvcnMvcnVuLnRzIiwgInNyYy9saWIvZXhlY3V0b3JzL3J1bi1zeW5jLnRzIiwgInNyYy9saWIvYnVpbGRlci50cyIsICJzcmMvbGliL2Rpc3Bvc2UudHMiLCAic3JjL2xpYi9nZW4udHMiLCAic3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImNvbnN0IFNVUFBSRVNTRURfRVJST1JfTUVTU0FHRSA9IFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsXCJcblxuY29uc3QgbmF0aXZlRGlzcG9zZSA9IFJlZmxlY3QuZ2V0KFN5bWJvbCwgXCJkaXNwb3NlXCIpXG5jb25zdCBuYXRpdmVBc3luY0Rpc3Bvc2UgPSBSZWZsZWN0LmdldChTeW1ib2wsIFwiYXN5bmNEaXNwb3NlXCIpXG5cbmV4cG9ydCBjb25zdCBESVNQT1NFOiBzeW1ib2wgPVxuICB0eXBlb2YgbmF0aXZlRGlzcG9zZSA9PT0gXCJzeW1ib2xcIiA/IG5hdGl2ZURpc3Bvc2UgOiBTeW1ib2wuZm9yKFwiU3ltYm9sLmRpc3Bvc2VcIilcbmV4cG9ydCBjb25zdCBBU1lOQ19ESVNQT1NFOiBzeW1ib2wgPVxuICB0eXBlb2YgbmF0aXZlQXN5bmNEaXNwb3NlID09PSBcInN5bWJvbFwiID8gbmF0aXZlQXN5bmNEaXNwb3NlIDogU3ltYm9sLmZvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2VcIilcblxudHlwZSBTeW5jRGlzcG9zZXIgPSAoKSA9PiB2b2lkXG50eXBlIEFzeW5jRGlzcG9zZXJGbiA9ICgpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPlxuXG5leHBvcnQgdHlwZSBEaXNwb3NhYmxlTGlrZSA9IHtcbiAgW0RJU1BPU0VdKCk6IHZvaWRcbn1cblxuZXhwb3J0IHR5cGUgQXN5bmNEaXNwb3NhYmxlTGlrZSA9IHtcbiAgW0FTWU5DX0RJU1BPU0VdKCk6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPlxufVxuXG5leHBvcnQgdHlwZSBNYXliZURpc3Bvc2FibGUgPSBBc3luY0Rpc3Bvc2FibGVMaWtlIHwgRGlzcG9zYWJsZUxpa2UgfCBudWxsIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNEaXNwb3NlciBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjbGVhbnVwIGNhbGxiYWNrLiBDYWxsYmFja3MgcnVuIGluIHJldmVyc2UgcmVnaXN0cmF0aW9uIG9yZGVyIChMSUZPKSB3aGVuIHRoZVxuICAgKiBkaXNwb3NlciBpcyBkaXNwb3NlZC5cbiAgICovXG4gIGRlZmVyKGZuOiAoKSA9PiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD4pOiB2b2lkXG4gIC8qKlxuICAgKiBUcmFja3MgYSBkaXNwb3NhYmxlIHJlc291cmNlIGFuZCByZXR1cm5zIGl0LlxuICAgKi9cbiAgdXNlPFQgZXh0ZW5kcyBBc3luY0Rpc3Bvc2FibGUgfCBEaXNwb3NhYmxlIHwgbnVsbCB8IHVuZGVmaW5lZD4odmFsdWU6IFQpOiBUXG4gIC8qKlxuICAgKiBSdW5zIGFsbCByZWdpc3RlcmVkIHRlYXJkb3duIGluIHJldmVyc2UgcmVnaXN0cmF0aW9uIG9yZGVyLiBFcXVpdmFsZW50IHRvIGxlYXZpbmcgYW4gYGF3YWl0XG4gICAqIHVzaW5nYCBzY29wZS5cbiAgICovXG4gIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lRGlzcG9zZUFsaWFzKHByb3RvdHlwZTogeyBkaXNwb3NlKCk6IHZvaWQgfSk6IHZvaWQge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBESVNQT1NFLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlKHRoaXM6IHsgZGlzcG9zZSgpOiB2b2lkIH0pIHtcbiAgICAgIHRoaXMuZGlzcG9zZSgpXG4gICAgfSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUFzeW5jRGlzcG9zZUFsaWFzKHByb3RvdHlwZTogeyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4gfSk6IHZvaWQge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBBU1lOQ19ESVNQT1NFLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGFzeW5jIHZhbHVlKHRoaXM6IHsgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IH0pIHtcbiAgICAgIGF3YWl0IHRoaXMuZGlzcG9zZSgpXG4gICAgfSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgfSlcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3VwcHJlc3NlZEVycm9yKGVycm9yOiB1bmtub3duLCBzdXBwcmVzc2VkOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIG5ldyBTdXBwcmVzc2VkRXJyb3IoZXJyb3IsIHN1cHByZXNzZWQsIFNVUFBSRVNTRURfRVJST1JfTUVTU0FHRSlcbiAgfVxuXG4gIGNvbnN0IHdyYXBwZWQgPSBuZXcgRXJyb3IoU1VQUFJFU1NFRF9FUlJPUl9NRVNTQUdFKSBhcyBFcnJvciAmIHtcbiAgICBlcnJvcjogdW5rbm93blxuICAgIHN1cHByZXNzZWQ6IHVua25vd25cbiAgfVxuXG4gIHdyYXBwZWQubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCJcbiAgd3JhcHBlZC5lcnJvciA9IGVycm9yXG4gIHdyYXBwZWQuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWRcblxuICByZXR1cm4gd3JhcHBlZFxufVxuXG5mdW5jdGlvbiBjaGVja0NhblJlZ2lzdGVyKGRpc3Bvc2VkOiBib29sZWFuLCBuYW1lOiBzdHJpbmcpIHtcbiAgaWYgKGRpc3Bvc2VkKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGAke25hbWV9IGFscmVhZHkgZGlzcG9zZWRgKVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTeW5jRGlzcG9zZXIodmFsdWU6IERpc3Bvc2FibGUgfCBEaXNwb3NhYmxlTGlrZSk6IFN5bmNEaXNwb3NlciB7XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlIGFzIERpc3Bvc2FibGVMaWtlXG4gIGNvbnN0IGRpc3Bvc2VyID0gY2FuZGlkYXRlW0RJU1BPU0VdXG5cbiAgaWYgKHR5cGVvZiBkaXNwb3NlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZVwiKVxuICB9XG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBkaXNwb3Nlci5jYWxsKHZhbHVlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBc3luY0Rpc3Bvc2VyKFxuICB2YWx1ZTogQXN5bmNEaXNwb3NhYmxlIHwgRGlzcG9zYWJsZSB8IE1heWJlRGlzcG9zYWJsZVxuKTogQXN5bmNEaXNwb3NlckZuIHtcbiAgY29uc3QgYXN5bmNDYW5kaWRhdGUgPSB2YWx1ZSBhcyBBc3luY0Rpc3Bvc2FibGVMaWtlXG4gIGNvbnN0IGFzeW5jRGlzcG9zZXIgPSBhc3luY0NhbmRpZGF0ZVtBU1lOQ19ESVNQT1NFXVxuXG4gIGlmICh0eXBlb2YgYXN5bmNEaXNwb3NlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuICgpID0+IGFzeW5jRGlzcG9zZXIuY2FsbCh2YWx1ZSlcbiAgfVxuXG4gIGNvbnN0IHN5bmNDYW5kaWRhdGUgPSB2YWx1ZSBhcyBEaXNwb3NhYmxlTGlrZVxuICBjb25zdCBzeW5jRGlzcG9zZXIgPSBzeW5jQ2FuZGlkYXRlW0RJU1BPU0VdXG5cbiAgaWYgKHR5cGVvZiBzeW5jRGlzcG9zZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBzeW5jRGlzcG9zZXIuY2FsbCh2YWx1ZSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlXCIpXG59XG5cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbERpc3Bvc2FibGVTdGFjayBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xuICAjZGlzcG9zZWQgPSBmYWxzZVxuICAjc3RhY2s6IFN5bmNEaXNwb3NlcltdID0gW11cbiAgZGVjbGFyZSBbU3ltYm9sLmRpc3Bvc2VdOiAoKSA9PiB2b2lkXG5cbiAgZGVmZXIoZm46IFN5bmNEaXNwb3Nlcik6IHZvaWQge1xuICAgIGNoZWNrQ2FuUmVnaXN0ZXIodGhpcy4jZGlzcG9zZWQsIFwiRGlzcG9zYWJsZVN0YWNrXCIpXG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke1N0cmluZyhmbil9IGlzIG5vdCBhIGZ1bmN0aW9uYClcbiAgICB9XG4gICAgdGhpcy4jc3RhY2sucHVzaChmbilcbiAgfVxuXG4gIHVzZTxUIGV4dGVuZHMgRGlzcG9zYWJsZSB8IERpc3Bvc2FibGVMaWtlPih2YWx1ZTogVCk6IFRcbiAgdXNlKHZhbHVlOiBudWxsKTogbnVsbFxuICB1c2UodmFsdWU6IHVuZGVmaW5lZCk6IHVuZGVmaW5lZFxuICB1c2UodmFsdWU6IERpc3Bvc2FibGUgfCBEaXNwb3NhYmxlTGlrZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgY2hlY2tDYW5SZWdpc3Rlcih0aGlzLiNkaXNwb3NlZCwgXCJEaXNwb3NhYmxlU3RhY2tcIilcbiAgICB0aGlzLiNzdGFjay5wdXNoKHJlc29sdmVTeW5jRGlzcG9zZXIodmFsdWUpKVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLiNkaXNwb3NlQWxsKClcbiAgfVxuXG4gICNkaXNwb3NlQWxsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy4jZGlzcG9zZWQgPSB0cnVlXG5cbiAgICBsZXQgZXJyb3I6IHVua25vd25cblxuICAgIHdoaWxlICh0aGlzLiNzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkaXNwb3NlciA9IHRoaXMuI3N0YWNrLnBvcCgpXG5cbiAgICAgIGlmICghZGlzcG9zZXIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgZGlzcG9zZXIoKVxuICAgICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgICAgZXJyb3IgPSBlcnJvciA9PT0gdW5kZWZpbmVkID8gY2F1Z2h0RXJyb3IgOiBjcmVhdGVTdXBwcmVzc2VkRXJyb3IoY2F1Z2h0RXJyb3IsIGVycm9yKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbCwgdHlwZXNjcmlwdC9vbmx5LXRocm93LWVycm9yIC0tIFByZXNlcnZlIHJhdyBkaXNwb3NlciBmYWlsdXJlcy5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG59XG5kZWZpbmVEaXNwb3NlQWxpYXMoSW50ZXJuYWxEaXNwb3NhYmxlU3RhY2sucHJvdG90eXBlKVxuXG5jbGFzcyBBc3luY0Rpc3Bvc2VyU3RhY2sgaW1wbGVtZW50cyBBc3luY0Rpc3Bvc2VyIHtcbiAgI2Rpc3Bvc2VkID0gZmFsc2VcbiAgI3N0YWNrOiBBc3luY0Rpc3Bvc2VyRm5bXSA9IFtdXG4gIGRlY2xhcmUgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG5cbiAgZGVmZXIoZm46IEFzeW5jRGlzcG9zZXJGbik6IHZvaWQge1xuICAgIGNoZWNrQ2FuUmVnaXN0ZXIodGhpcy4jZGlzcG9zZWQsIFwiQXN5bmNEaXNwb3NhYmxlU3RhY2tcIilcbiAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7U3RyaW5nKGZuKX0gaXMgbm90IGEgZnVuY3Rpb25gKVxuICAgIH1cbiAgICB0aGlzLiNzdGFjay5wdXNoKGZuKVxuICB9XG5cbiAgdXNlPFQgZXh0ZW5kcyBBc3luY0Rpc3Bvc2FibGUgfCBEaXNwb3NhYmxlPih2YWx1ZTogVCk6IFRcbiAgdXNlKHZhbHVlOiBudWxsKTogbnVsbFxuICB1c2UodmFsdWU6IHVuZGVmaW5lZCk6IHVuZGVmaW5lZFxuICB1c2UodmFsdWU6IEFzeW5jRGlzcG9zYWJsZSB8IERpc3Bvc2FibGUgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGNoZWNrQ2FuUmVnaXN0ZXIodGhpcy4jZGlzcG9zZWQsIFwiQXN5bmNEaXNwb3NhYmxlU3RhY2tcIilcbiAgICB0aGlzLiNzdGFjay5wdXNoKHJlc29sdmVBc3luY0Rpc3Bvc2VyKHZhbHVlKSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy4jZGlzcG9zZUFsbEFzeW5jKClcbiAgfVxuXG4gIGFzeW5jICNkaXNwb3NlQWxsQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLiNkaXNwb3NlZCA9IHRydWVcblxuICAgIGxldCBlcnJvcjogdW5rbm93blxuXG4gICAgd2hpbGUgKHRoaXMuI3N0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGRpc3Bvc2VyID0gdGhpcy4jc3RhY2sucG9wKClcblxuICAgICAgaWYgKCFkaXNwb3Nlcikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBDbGVhbnVwIG11c3QgcmVtYWluIHNlcXVlbnRpYWwgc28gTElGTyB0ZWFyZG93biBvcmRlciBpcyBwcmVzZXJ2ZWQuXG4gICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgIGF3YWl0IGRpc3Bvc2VyKClcbiAgICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICAgIGVycm9yID0gZXJyb3IgPT09IHVuZGVmaW5lZCA/IGNhdWdodEVycm9yIDogY3JlYXRlU3VwcHJlc3NlZEVycm9yKGNhdWdodEVycm9yLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWwsIHR5cGVzY3JpcHQvb25seS10aHJvdy1lcnJvciAtLSBQcmVzZXJ2ZSByYXcgYXN5bmMgZGlzcG9zZXIgZmFpbHVyZXMuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxufVxuZGVmaW5lQXN5bmNEaXNwb3NlQWxpYXMoQXN5bmNEaXNwb3NlclN0YWNrLnByb3RvdHlwZSlcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFzeW5jRGlzcG9zZXIoKTogQXN5bmNEaXNwb3NlciB7XG4gIHJldHVybiBuZXcgQXN5bmNEaXNwb3NlclN0YWNrKClcbn1cbiIsCiAgICAiaW1wb3J0IHsgSW50ZXJuYWxEaXNwb3NhYmxlU3RhY2sgfSBmcm9tIFwiLi4vc2hpbXMvZGlzcG9zZXJcIlxuaW1wb3J0IHsgUGFuaWMsIHR5cGUgUGFuaWNDb2RlIH0gZnJvbSBcIi4vZXJyb3JzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFVucmVhY2hhYmxlKHZhbHVlOiBuZXZlciwgY29kZTogUGFuaWNDb2RlKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgUGFuaWMoY29kZSwgeyBtZXNzYWdlOiBgVW5yZWFjaGFibGUgY2FzZTogJHtTdHJpbmcodmFsdWUpfWAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludmFyaWFudChjb25kaXRpb246IHVua25vd24sIGVycm9yOiBFcnJvcik6IGFzc2VydHMgY29uZGl0aW9uIHtcbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChtcyA8PSAwKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKVxuICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc1Byb21pc2VMaWtlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvbWlzZUxpa2U8dW5rbm93bj4ge1xuICByZXR1cm4gKFxuICAgICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIHsgdGhlbj86IHVua25vd24gfSkudGhlbiA9PT0gXCJmdW5jdGlvblwiXG4gIClcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXaXRoQWJvcnQ8ViwgRT4oXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gIHByb21pc2U6IFByb21pc2VMaWtlPFY+LFxuICBjcmVhdGVBYm9ydFJlc3VsdDogKCkgPT4gRVxuKTogUHJvbWlzZTxWIHwgRT4ge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAvLyBXZSByZXR1cm4gdGhlIGFib3J0IHJlc3VsdCBpbW1lZGlhdGVseSwgc28gYXR0YWNoIGEgbm8tb3AgaGFuZGxlciB0b1xuICAgIC8vIGF2b2lkIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gaWYgdGhlIG9yaWdpbmFsIHByb21pc2UgcmVqZWN0cyBsYXRlci5cbiAgICB2b2lkIFByb21pc2UucmVzb2x2ZShwcm9taXNlKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHZvaWQgZXJyb3IpXG4gICAgcmV0dXJuIGNyZWF0ZUFib3J0UmVzdWx0KClcbiAgfVxuXG4gIHVzaW5nIGRpc3Bvc2VyID0gbmV3IEludGVybmFsRGlzcG9zYWJsZVN0YWNrKClcblxuICBjb25zdCBhYm9ydFByb21pc2UgPSBuZXcgUHJvbWlzZTxFPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICByZXNvbHZlKGNyZWF0ZUFib3J0UmVzdWx0KCkpXG4gICAgfVxuXG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBvbkFib3J0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pXG4gICAgZGlzcG9zZXIuZGVmZXIoKCkgPT4ge1xuICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KVxuICAgIH0pXG4gIH0pXG5cbiAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbUHJvbWlzZS5yZXNvbHZlKHByb21pc2UpLCBhYm9ydFByb21pc2VdKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEJ1aWxkZXJDb25maWcgfSBmcm9tIFwiLi4vYnVpbGRlclwiXG5pbXBvcnQgdHlwZSB7IFRyeUN0eCB9IGZyb20gXCIuLi9leGVjdXRvcnMvc2hhcmVkXCJcbmltcG9ydCB7IFBhbmljIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyBhc3NlcnRVbnJlYWNoYWJsZSwgaW52YXJpYW50IH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuaW50ZXJmYWNlIEJhc2VSZXRyeVBvbGljeSB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBmaXJzdCBydW4uXG4gICAqL1xuICBsaW1pdDogbnVtYmVyXG4gIC8qKlxuICAgKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBhdHRlbXB0cy4gRGVmYXVsdHMgdG8gMC5cbiAgICovXG4gIGRlbGF5TXM/OiBudW1iZXJcbiAgLyoqXG4gICAqIEFkZHMgcmFuZG9tIGppdHRlciB0byBkZWxheXMgd2hlbiBlbmFibGVkLlxuICAgKi9cbiAgaml0dGVyPzogYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJuIHRydWUgdG8gcmV0cnkgYWZ0ZXIgYW4gZXJyb3IsIGZhbHNlIHRvIHN0b3AuXG4gICAqL1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93biwgY3R4OiBUcnlDdHgpID0+IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIExpbmVhckJhY2tvZmZSZXRyeVBvbGljeSBleHRlbmRzIEJhc2VSZXRyeVBvbGljeSB7XG4gIC8qKlxuICAgKiBVc2UgbGluZWFybHkgaW5jcmVhc2luZyBkZWxheSBiZXR3ZWVuIGF0dGVtcHRzLlxuICAgKi9cbiAgYmFja29mZjogXCJsaW5lYXJcIlxuICAvKipcbiAgICogTm90IHN1cHBvcnRlZCBmb3IgbGluZWFyIGJhY2tvZmYuXG4gICAqL1xuICBtYXhEZWxheU1zPzogbmV2ZXJcbn1cblxuaW50ZXJmYWNlIEV4cG9uZW50aWFsQmFja29mZlJldHJ5UG9saWN5IGV4dGVuZHMgQmFzZVJldHJ5UG9saWN5IHtcbiAgLyoqXG4gICAqIFVzZSBleHBvbmVudGlhbCBkZWxheSBncm93dGggYmV0d2VlbiBhdHRlbXB0cy5cbiAgICovXG4gIGJhY2tvZmY6IFwiZXhwb25lbnRpYWxcIlxuICAvKipcbiAgICogT3B0aW9uYWwgY2FwIGZvciBleHBvbmVudGlhbCBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBtYXhEZWxheU1zPzogbnVtYmVyXG59XG5cbi8qKlxuICogUmV0cnkgcG9saWN5IHVzaW5nIGEgY29uc3RhbnQgZGVsYXkgc3RyYXRlZ3kuXG4gKi9cbmludGVyZmFjZSBDb25zdGFudEJhY2tvZmZSZXRyeVBvbGljeSBleHRlbmRzIEJhc2VSZXRyeVBvbGljeSB7XG4gIC8qKlxuICAgKiBSZXF1aXJlZCBkaXNjcmltaW5hbnQ6IHVzZSBhIGZpeGVkIGRlbGF5IGJldHdlZW4gYXR0ZW1wdHMuXG4gICAqL1xuICBiYWNrb2ZmOiBcImNvbnN0YW50XCJcbiAgLyoqXG4gICAqIE5vdCBzdXBwb3J0ZWQgZm9yIGNvbnN0YW50IGJhY2tvZmYuXG4gICAqL1xuICBtYXhEZWxheU1zPzogbmV2ZXJcbn1cblxuLyoqXG4gKiBSZXRyeSBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAqL1xuZXhwb3J0IHR5cGUgUmV0cnlQb2xpY3kgPVxuICB8IExpbmVhckJhY2tvZmZSZXRyeVBvbGljeVxuICB8IEV4cG9uZW50aWFsQmFja29mZlJldHJ5UG9saWN5XG4gIHwgQ29uc3RhbnRCYWNrb2ZmUmV0cnlQb2xpY3lcblxuLyoqXG4gKiBSZXRyeSBzaG9ydGhhbmQgb3IgZnVsbCByZXRyeSBjb25maWd1cmF0aW9uLlxuICpcbiAqIC0gYG51bWJlcmA6IGF0dGVtcHQgbGltaXRcbiAqIC0gYFJldHJ5UG9saWN5YDogZGV0YWlsZWQgcmV0cnkgc2V0dGluZ3NcbiAqL1xuZXhwb3J0IHR5cGUgUmV0cnlPcHRpb25zID0gbnVtYmVyIHwgUmV0cnlQb2xpY3lcblxuZGVjbGFyZSBjb25zdCBJTlZBTElEX1JFVFJZX0xJTUlUOiB1bmlxdWUgc3ltYm9sXG50eXBlIEludmFsaWRSZXRyeUxpbWl0ID0ge1xuICByZWFkb25seSBbSU5WQUxJRF9SRVRSWV9MSU1JVF06IFwicmV0cnkoKSByZXF1aXJlcyBhIHBvc2l0aXZlIGludGVnZXIgbGltaXRcIlxufVxuXG4vKipcbiAqIENvbXBpbGUtdGltZSB2YWxpZGF0aW9uIGZvciBsaXRlcmFsIHJldHJ5IGxpbWl0cy4gUmVqZWN0cyBgMGAsIG5lZ2F0aXZlLCBhbmQgZnJhY3Rpb25hbCBsaXRlcmFscztcbiAqIG5vbi1saXRlcmFsIGBudW1iZXJgIHZhbHVlcyBwYXNzIGFuZCBhcmUgdmFsaWRhdGVkIGF0IHJ1bnRpbWUgYnkge0BsaW5rIHJldHJ5T3B0aW9uc30gaW5zdGVhZC5cbiAqIChgSW5maW5pdHlgL2BOYU5gIGhhdmUgbm8gbGl0ZXJhbCB0eXBlcywgc28gdGhleSBhcmUgcnVudGltZS1vbmx5LilcbiAqL1xuZXhwb3J0IHR5cGUgVmFsaWRhdGVSZXRyeUxpbWl0PE4gZXh0ZW5kcyBudW1iZXI+ID0gbnVtYmVyIGV4dGVuZHMgTlxuICA/IG51bWJlclxuICA6IGAke059YCBleHRlbmRzIGAtJHtzdHJpbmd9YCB8IGAke3N0cmluZ30uJHtzdHJpbmd9YFxuICAgID8gSW52YWxpZFJldHJ5TGltaXRcbiAgICA6IE4gZXh0ZW5kcyAwXG4gICAgICA/IEludmFsaWRSZXRyeUxpbWl0XG4gICAgICA6IG51bWJlclxuXG4vKipcbiAqIENvbXBpbGUtdGltZSB2YWxpZGF0aW9uIGZvciBmdWxsIHtAbGluayBSZXRyeU9wdGlvbnN9IHZhbHVlcywgaW5jbHVkaW5nIHVuaW9ucyBvZiBudW1iZXIgYW5kXG4gKiBwb2xpY3kgZm9ybXMuIERpc3RyaWJ1dGVzIG92ZXIgdW5pb24gbWVtYmVycyBzbyB0aGF0IG1peGVkIGlucHV0cyBsaWtlIGBmbGFnID8gMyA6IHsgYmFja29mZjpcbiAqIFwiY29uc3RhbnRcIiwgbGltaXQ6IDUgfWAgYXJlIGFjY2VwdGVkIHdoaWxlIGFueSBtZW1iZXIgY2FycnlpbmcgYW4gaW52YWxpZCBsaXRlcmFsIGxpbWl0IHN0aWxsXG4gKiBmYWlscyB0byBjb21waWxlLlxuICovXG5leHBvcnQgdHlwZSBWYWxpZGF0ZVJldHJ5T3B0aW9uczxQIGV4dGVuZHMgUmV0cnlPcHRpb25zPiA9IFAgZXh0ZW5kcyBudW1iZXJcbiAgPyBWYWxpZGF0ZVJldHJ5TGltaXQ8UD5cbiAgOiBQIGV4dGVuZHMgeyBsaW1pdDogaW5mZXIgTiBleHRlbmRzIG51bWJlciB9XG4gICAgPyB7IGxpbWl0OiBWYWxpZGF0ZVJldHJ5TGltaXQ8Tj4gfVxuICAgIDogbmV2ZXJcblxuZXhwb3J0IGZ1bmN0aW9uIHJldHJ5T3B0aW9ucyhwb2xpY3k6IFJldHJ5T3B0aW9ucyk6IFJldHJ5UG9saWN5IHtcbiAgY29uc3QgbGltaXQgPSB0eXBlb2YgcG9saWN5ID09PSBcIm51bWJlclwiID8gcG9saWN5IDogcG9saWN5LmxpbWl0XG5cbiAgaW52YXJpYW50KE51bWJlci5pc0ludGVnZXIobGltaXQpLCBuZXcgUGFuaWMoXCJSRVRSWV9JTlZBTElEX0xJTUlUXCIpKVxuICBpbnZhcmlhbnQobGltaXQgPj0gMSwgbmV3IFBhbmljKFwiUkVUUllfSU5WQUxJRF9MSU1JVFwiKSlcblxuICBpZiAodHlwZW9mIHBvbGljeSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiB7XG4gICAgICBiYWNrb2ZmOiBcImNvbnN0YW50XCIsXG4gICAgICBkZWxheU1zOiAwLFxuICAgICAgbGltaXQ6IHBvbGljeSxcbiAgICB9XG4gIH1cblxuICBjb25zdCBiYXNlID0ge1xuICAgIGRlbGF5TXM6IHBvbGljeS5kZWxheU1zID8/IDAsXG4gICAgaml0dGVyOiBwb2xpY3kuaml0dGVyLFxuICAgIGxpbWl0OiBwb2xpY3kubGltaXQsXG4gICAgc2hvdWxkUmV0cnk6IHBvbGljeS5zaG91bGRSZXRyeSxcbiAgfVxuXG4gIHN3aXRjaCAocG9saWN5LmJhY2tvZmYpIHtcbiAgICBjYXNlIFwiY29uc3RhbnRcIjpcbiAgICBjYXNlIFwibGluZWFyXCI6XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBiYWNrb2ZmOiBwb2xpY3kuYmFja29mZiB9XG4gICAgY2FzZSBcImV4cG9uZW50aWFsXCI6XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBiYWNrb2ZmOiBwb2xpY3kuYmFja29mZiwgbWF4RGVsYXlNczogcG9saWN5Lm1heERlbGF5TXMgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gYXNzZXJ0VW5yZWFjaGFibGUocG9saWN5LCBcIlVOUkVBQ0hBQkxFX1JFVFJZX1BPTElDWV9CQUNLT0ZGXCIpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVJldHJ5RGVsYXkoYXR0ZW1wdDogbnVtYmVyLCBjb25maWc6IEJ1aWxkZXJDb25maWcpOiBudW1iZXIge1xuICBjb25zdCBwb2xpY3kgPSBjb25maWcucmV0cnlcblxuICBpZiAoIXBvbGljeSkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICBjb25zdCBiYXNlRGVsYXkgPSBwb2xpY3kuZGVsYXlNcyA/PyAwXG4gIGxldCBkZWxheSA9IDBcblxuICBzd2l0Y2ggKHBvbGljeS5iYWNrb2ZmKSB7XG4gICAgY2FzZSBcImNvbnN0YW50XCI6XG4gICAgICBkZWxheSA9IGJhc2VEZWxheVxuICAgICAgYnJlYWtcbiAgICBjYXNlIFwibGluZWFyXCI6XG4gICAgICBkZWxheSA9IGJhc2VEZWxheSAqIGF0dGVtcHRcbiAgICAgIGJyZWFrXG4gICAgY2FzZSBcImV4cG9uZW50aWFsXCI6XG4gICAgICBkZWxheSA9IGJhc2VEZWxheSAqIDIgKiogKGF0dGVtcHQgLSAxKVxuXG4gICAgICBpZiAocG9saWN5Lm1heERlbGF5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxheSA9IE1hdGgubWluKGRlbGF5LCBwb2xpY3kubWF4RGVsYXlNcylcbiAgICAgIH1cblxuICAgICAgYnJlYWtcbiAgfVxuXG4gIGlmICghcG9saWN5LmppdHRlciB8fCBkZWxheSA8PSAwKSB7XG4gICAgcmV0dXJuIGRlbGF5XG4gIH1cblxuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogZGVsYXkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1Nob3VsZEF0dGVtcHRSZXRyeShcbiAgZXJyb3I6IHVua25vd24sXG4gIGN0eDogVHJ5Q3R4LFxuICBjb25maWc6IEJ1aWxkZXJDb25maWdcbik6IGJvb2xlYW4ge1xuICBjb25zdCBwb2xpY3kgPSBjb25maWcucmV0cnlcblxuICBpZiAoIXBvbGljeSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKGN0eC5yZXRyeS5hdHRlbXB0ID49IHBvbGljeS5saW1pdCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKCFwb2xpY3kuc2hvdWxkUmV0cnkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIHBvbGljeS5zaG91bGRSZXRyeShlcnJvciwgY3R4KVxufVxuIiwKICAgICJpbXBvcnQgeyBkZWZpbmVEaXNwb3NlQWxpYXMgfSBmcm9tIFwiLi4vLi4vc2hpbXMvZGlzcG9zZXJcIlxuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uRXJyb3IsIFRpbWVvdXRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHsgcmVzb2x2ZVdpdGhBYm9ydCB9IGZyb20gXCIuLi91dGlsc1wiXG5cbmV4cG9ydCBjbGFzcyBTaWduYWxDb250cm9sbGVyIHtcbiAgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWxcbiAgZGVjbGFyZSBbU3ltYm9sLmRpc3Bvc2VdOiAoKSA9PiB2b2lkXG5cbiAgY29uc3RydWN0b3Ioc2lnbmFsczogcmVhZG9ubHkgQWJvcnRTaWduYWxbXSA9IFtdKSB7XG4gICAgaWYgKHNpZ25hbHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zaWduYWwgPSBBYm9ydFNpZ25hbC5hbnkoWy4uLnNpZ25hbHNdKVxuICAgIH1cbiAgfVxuXG4gIGNoZWNrRGlkQ2FuY2VsKGNhdXNlPzogdW5rbm93bik6IENhbmNlbGxhdGlvbkVycm9yIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaWduYWwucmVhc29uIGluc3RhbmNlb2YgVGltZW91dEVycm9yKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENhbmNlbGxhdGlvbkVycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogY2F1c2UgPz8gdGhpcy5zaWduYWwucmVhc29uIH0pXG4gIH1cblxuICByYWNlPFY+KHByb21pc2U6IFByb21pc2VMaWtlPFY+LCBjYXVzZT86IHVua25vd24pOiBQcm9taXNlTGlrZTxWIHwgQ2FuY2VsbGF0aW9uRXJyb3I+IHtcbiAgICBjb25zdCBjYW5jZWxsZWQgPSB0aGlzLmNoZWNrRGlkQ2FuY2VsKGNhdXNlKVxuXG4gICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjYW5jZWxsZWQpXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNpZ25hbCkge1xuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZVdpdGhBYm9ydChcbiAgICAgIHRoaXMuc2lnbmFsLFxuICAgICAgcHJvbWlzZSxcbiAgICAgICgpID0+IG5ldyBDYW5jZWxsYXRpb25FcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGNhdXNlID8/IHRoaXMuc2lnbmFsPy5yZWFzb24gfSlcbiAgICApXG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIC8vIEludGVudGlvbmFsbHkgYSBuby1vcDogQWJvcnRTaWduYWwuYW55KCkgZG9lcyBub3QgY3JlYXRlIHJlc291cmNlcyB0aGF0XG4gICAgLy8gbmVlZCBleHBsaWNpdCB0ZWFyZG93biwgc28gbm90aGluZyBuZWVkcyB0byBiZSByZWxlYXNlZCBoZXJlLiBUaGUgbWV0aG9kXG4gICAgLy8gZXhpc3RzIHRvIHNhdGlzZnkgdGhlIERpc3Bvc2FibGUgaW50ZXJmYWNlIHNoYXJlZCB3aXRoIFRpbWVvdXRDb250cm9sbGVyLlxuICAgIHZvaWQgdGhpcy5zaWduYWxcbiAgfVxufVxuZGVmaW5lRGlzcG9zZUFsaWFzKFNpZ25hbENvbnRyb2xsZXIucHJvdG90eXBlKVxuIiwKICAgICJpbXBvcnQgeyBkZWZpbmVEaXNwb3NlQWxpYXMgfSBmcm9tIFwiLi4vLi4vc2hpbXMvZGlzcG9zZXJcIlxuaW1wb3J0IHsgUGFuaWMsIFRpbWVvdXRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHsgaW52YXJpYW50LCByZXNvbHZlV2l0aEFib3J0IH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aW1lb3V0IHZhbGlkYXRpb246IHVzZWQgZWFnZXJseSBieSB0aGUgYnVpbGRlciBhdCBgLnRpbWVvdXQoKWAgY2FsbFxuICogdGltZSBhbmQgZGVmZW5zaXZlbHkgYnkge0BsaW5rIFRpbWVvdXRDb250cm9sbGVyfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFZhbGlkVGltZW91dChtczogbnVtYmVyKTogdm9pZCB7XG4gIGludmFyaWFudChOdW1iZXIuaXNGaW5pdGUobXMpLCBuZXcgUGFuaWMoXCJUSU1FT1VUX0lOVkFMSURfTVNcIikpXG4gIGludmFyaWFudChtcyA+PSAwLCBuZXcgUGFuaWMoXCJUSU1FT1VUX0lOVkFMSURfTVNcIikpXG59XG5cbmV4cG9ydCBjbGFzcyBUaW1lb3V0Q29udHJvbGxlciB7XG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsXG4gIHJlYWRvbmx5ICNjb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyXG4gIHJlYWRvbmx5ICNzdGFydGVkQXQgPSBEYXRlLm5vdygpXG4gIHJlYWRvbmx5ICN0aW1lb3V0TXM6IG51bWJlclxuICAjdGltZW91dElkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZFxuICBkZWNsYXJlIFtTeW1ib2wuZGlzcG9zZV06ICgpID0+IHZvaWRcblxuICBjb25zdHJ1Y3Rvcih0aW1lb3V0TXM/OiBudW1iZXIpIHtcbiAgICB0aGlzLiN0aW1lb3V0TXMgPSB0aW1lb3V0TXMgPz8gLTFcblxuICAgIGlmICh0aW1lb3V0TXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXNzZXJ0VmFsaWRUaW1lb3V0KHRpbWVvdXRNcylcblxuICAgIHRoaXMuI2NvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICB0aGlzLnNpZ25hbCA9IHRoaXMuI2NvbnRyb2xsZXIuc2lnbmFsXG5cbiAgICBpZiAodGhpcy4jdGltZW91dE1zIDw9IDApIHtcbiAgICAgIHRoaXMuI2Fib3J0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuI3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy4jYWJvcnQoKVxuICAgIH0sIHRoaXMuI3RpbWVvdXRNcylcbiAgfVxuXG4gICNhYm9ydChjYXVzZT86IHVua25vd24pIHtcbiAgICBjb25zdCB0aW1lb3V0RXJyb3IgPSBuZXcgVGltZW91dEVycm9yKGBFeGVjdXRpb24gZXhjZWVkZWQgdGltZW91dCBvZiAke3RoaXMuI3RpbWVvdXRNc31tc2AsIHtcbiAgICAgIGNhdXNlLFxuICAgIH0pXG5cbiAgICBpZiAoIXRoaXMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICB0aGlzLiNjb250cm9sbGVyPy5hYm9ydCh0aW1lb3V0RXJyb3IpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbWVvdXRFcnJvclxuICB9XG5cbiAgZ2V0ICNyZW1haW5pbmcoKSB7XG4gICAgY29uc3QgZWxhcHNlZCA9IERhdGUubm93KCkgLSB0aGlzLiNzdGFydGVkQXRcblxuICAgIHJldHVybiB0aGlzLiN0aW1lb3V0TXMgLSBlbGFwc2VkXG4gIH1cblxuICBjaGVja0RpZFRpbWVvdXQoY2F1c2U/OiB1bmtub3duKTogVGltZW91dEVycm9yIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuc2lnbmFsKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgY29uc3QgcmVhc29uID0gdGhpcy5zaWduYWwucmVhc29uXG5cbiAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBUaW1lb3V0RXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHJlYXNvblxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFRpbWVvdXRFcnJvcihgRXhlY3V0aW9uIGV4Y2VlZGVkIHRpbWVvdXQgb2YgJHt0aGlzLiN0aW1lb3V0TXN9bXNgLCB7XG4gICAgICAgIGNhdXNlOiBjYXVzZSA/PyByZWFzb24sXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICh0aGlzLiNyZW1haW5pbmcgPiAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jYWJvcnQoY2F1c2UpXG4gIH1cblxuICByYWNlPFY+KHByb21pc2U6IFByb21pc2VMaWtlPFY+LCBjYXVzZT86IHVua25vd24pOiBQcm9taXNlTGlrZTxWIHwgVGltZW91dEVycm9yPiB7XG4gICAgaWYgKCF0aGlzLnNpZ25hbCkge1xuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBpZiAodGhpcy4jcmVtYWluaW5nIDw9IDApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy4jYWJvcnQoY2F1c2UpKVxuICAgIH1cblxuICAgIGNvbnN0IHRpbWVkT3V0ID0gdGhpcy5jaGVja0RpZFRpbWVvdXQoY2F1c2UpXG5cbiAgICBpZiAodGltZWRPdXQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGltZWRPdXQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVXaXRoQWJvcnQoXG4gICAgICB0aGlzLnNpZ25hbCxcbiAgICAgIHByb21pc2UsXG4gICAgICAoKSA9PlxuICAgICAgICB0aGlzLmNoZWNrRGlkVGltZW91dChjYXVzZSkgPz9cbiAgICAgICAgbmV3IFRpbWVvdXRFcnJvcihgRXhlY3V0aW9uIGV4Y2VlZGVkIHRpbWVvdXQgb2YgJHt0aGlzLiN0aW1lb3V0TXN9bXNgLCB7IGNhdXNlIH0pXG4gICAgKVxuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy4jdGltZW91dElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiN0aW1lb3V0SWQpXG4gICAgfVxuICB9XG59XG5kZWZpbmVEaXNwb3NlQWxpYXMoVGltZW91dENvbnRyb2xsZXIucHJvdG90eXBlKVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEJ1aWxkZXJDb25maWcsIFdyYXBDdHggfSBmcm9tIFwiLi4vYnVpbGRlclwiXG5pbXBvcnQgdHlwZSB7IFRyeUN0eCB9IGZyb20gXCIuL3NoYXJlZFwiXG5pbXBvcnQgeyBkZWZpbmVEaXNwb3NlQWxpYXMsIEludGVybmFsRGlzcG9zYWJsZVN0YWNrIH0gZnJvbSBcIi4uLy4uL3NoaW1zL2Rpc3Bvc2VyXCJcbmltcG9ydCB7XG4gIENhbmNlbGxhdGlvbkVycm9yLFxuICBDb250cm9sRXJyb3IsXG4gIFBhbmljLFxuICBSZXRyeUV4aGF1c3RlZEVycm9yLFxuICBUaW1lb3V0RXJyb3IsXG4gIFVuaGFuZGxlZEV4Y2VwdGlvbixcbn0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyBjYWxjdWxhdGVSZXRyeURlbGF5LCBjaGVja1Nob3VsZEF0dGVtcHRSZXRyeSB9IGZyb20gXCIuLi9tb2RpZmllcnMvcmV0cnlcIlxuaW1wb3J0IHsgU2lnbmFsQ29udHJvbGxlciB9IGZyb20gXCIuLi9tb2RpZmllcnMvc2lnbmFsXCJcbmltcG9ydCB7IFRpbWVvdXRDb250cm9sbGVyIH0gZnJvbSBcIi4uL21vZGlmaWVycy90aW1lb3V0XCJcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuaW50ZXJmYWNlIEJhc2VFeGVjdXRpb25PcHRpb25zIHtcbiAgcmV0cnlMaW1pdD86IG51bWJlclxufVxuXG5leHBvcnQgdHlwZSBSZXRyeURlY2lzaW9uID0ge1xuICBkZWxheTogbnVtYmVyXG4gIHNob3VsZEF0dGVtcHRSZXRyeTogYm9vbGVhblxufVxuXG5leHBvcnQgdHlwZSBSdW5uZXJFcnJvciA9XG4gIHwgQ2FuY2VsbGF0aW9uRXJyb3JcbiAgfCBSZXRyeUV4aGF1c3RlZEVycm9yXG4gIHwgVGltZW91dEVycm9yXG4gIHwgVW5oYW5kbGVkRXhjZXB0aW9uXG5cbmV4cG9ydCBjbGFzcyBSZXRyeURpcmVjdGl2ZSB7XG4gIHJlYWRvbmx5IGRlY2lzaW9uOiBSZXRyeURlY2lzaW9uXG5cbiAgY29uc3RydWN0b3IoZGVjaXNpb246IFJldHJ5RGVjaXNpb24pIHtcbiAgICB0aGlzLmRlY2lzaW9uID0gZGVjaXNpb25cbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUV4ZWN1dGlvbjxUUmVzdWx0ID0gdW5rbm93bj4gaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZzogQnVpbGRlckNvbmZpZ1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3R4OiBUcnlDdHhcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV4ZWN1dGlvblNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWRcbiAgI3dyYXBDdHhDYWNoZTogV3JhcEN0eCB8IHVuZGVmaW5lZFxuICByZWFkb25seSAjc2lnbmFsQ29udHJvbGxlcjogU2lnbmFsQ29udHJvbGxlciB8IHVuZGVmaW5lZFxuICByZWFkb25seSAjdGltZW91dENvbnRyb2xsZXI6IFRpbWVvdXRDb250cm9sbGVyIHwgdW5kZWZpbmVkXG4gIGRlY2xhcmUgW1N5bWJvbC5kaXNwb3NlXTogKCkgPT4gdm9pZFxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihjb25maWc6IEJ1aWxkZXJDb25maWcsIG9wdGlvbnM6IEJhc2VFeGVjdXRpb25PcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZ1xuICAgIHRoaXMuI3RpbWVvdXRDb250cm9sbGVyID0gQmFzZUV4ZWN1dGlvbi5jcmVhdGVUaW1lb3V0Q29udHJvbGxlcihjb25maWcudGltZW91dClcbiAgICB0aGlzLiNzaWduYWxDb250cm9sbGVyID0gQmFzZUV4ZWN1dGlvbi5jcmVhdGVTaWduYWxDb250cm9sbGVyKFxuICAgICAgY29uZmlnLnNpZ25hbHMsXG4gICAgICB0aGlzLiN0aW1lb3V0Q29udHJvbGxlcj8uc2lnbmFsXG4gICAgKVxuICAgIHRoaXMuZXhlY3V0aW9uU2lnbmFsID0gdGhpcy4jc2lnbmFsQ29udHJvbGxlcj8uc2lnbmFsXG4gICAgdGhpcy5jdHggPSBCYXNlRXhlY3V0aW9uLmNyZWF0ZUNvbnRleHQoY29uZmlnLCB0aGlzLmV4ZWN1dGlvblNpZ25hbCwgb3B0aW9ucy5yZXRyeUxpbWl0KVxuICB9XG5cbiAgZXhlY3V0ZSgpOiBUUmVzdWx0IHtcbiAgICAvLyBXcmFwcyBjb3ZlciB0aGUgZnVsbCByZXRyeSBzY29wZTsgYGN0eC5yZXRyeS5hdHRlbXB0YCBtYXkgcmVmbGVjdCB0aGUgZmluYWxcbiAgICAvLyBhdHRlbXB0IHdoZW4gb2JzZXJ2ZWQgYWZ0ZXIgYG5leHQoKWAgcmVzb2x2ZXMuXG4gICAgY29uc3Qgd3JhcHMgPSB0aGlzLmNvbmZpZy53cmFwc1xuXG4gICAgaWYgKCF3cmFwcyB8fCB3cmFwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVDb3JlKClcbiAgICB9XG5cbiAgICBsZXQgbmV4dCA9ICgpOiB1bmtub3duID0+IHRoaXMuZXhlY3V0ZUNvcmUoKVxuXG4gICAgZm9yIChjb25zdCB3cmFwIG9mIHdyYXBzLnRvUmV2ZXJzZWQoKSkge1xuICAgICAgY29uc3QgcHJldmlvdXMgPSBuZXh0XG4gICAgICBuZXh0ID0gKCkgPT4gd3JhcCh0aGlzLiN3cmFwQ3R4LCBwcmV2aW91cylcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dCgpIGFzIFRSZXN1bHRcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBleGVjdXRlQ29yZSgpOiBUUmVzdWx0XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuI3RpbWVvdXRDb250cm9sbGVyICYmICF0aGlzLiNzaWduYWxDb250cm9sbGVyKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBkaXNwb3NlciA9IG5ldyBJbnRlcm5hbERpc3Bvc2FibGVTdGFjaygpXG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuI3RpbWVvdXRDb250cm9sbGVyKSB7XG4gICAgICAgIGRpc3Bvc2VyLnVzZSh0aGlzLiN0aW1lb3V0Q29udHJvbGxlcilcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuI3NpZ25hbENvbnRyb2xsZXIpIHtcbiAgICAgICAgZGlzcG9zZXIudXNlKHRoaXMuI3NpZ25hbENvbnRyb2xsZXIpXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc3Bvc2VyLmRpc3Bvc2UoKVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgY3JlYXRlQ29udGV4dChcbiAgICBjb25maWc6IEJ1aWxkZXJDb25maWcsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCxcbiAgICByZXRyeUxpbWl0PzogbnVtYmVyXG4gICk6IFRyeUN0eCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJldHJ5OiB7XG4gICAgICAgIGF0dGVtcHQ6IDEsXG4gICAgICAgIGxpbWl0OiByZXRyeUxpbWl0ID8/IGNvbmZpZy5yZXRyeT8ubGltaXQgPz8gMSxcbiAgICAgIH0sXG4gICAgICBzaWduYWwsXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBjcmVhdGVUaW1lb3V0Q29udHJvbGxlcihcbiAgICB0aW1lb3V0TXM6IG51bWJlciB8IHVuZGVmaW5lZFxuICApOiBUaW1lb3V0Q29udHJvbGxlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRpbWVvdXRNcyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbmV3IFRpbWVvdXRDb250cm9sbGVyKHRpbWVvdXRNcylcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgY3JlYXRlU2lnbmFsQ29udHJvbGxlcihcbiAgICBzaWduYWxzOiByZWFkb25seSBBYm9ydFNpZ25hbFtdIHwgdW5kZWZpbmVkLFxuICAgIHRpbWVvdXRTaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkXG4gICk6IFNpZ25hbENvbnRyb2xsZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbXBvc2VkU2lnbmFscyA9IFsuLi4oc2lnbmFscyA/PyBbXSksIHRpbWVvdXRTaWduYWxdLmZpbHRlcihcbiAgICAgICh2YWx1ZSk6IHZhbHVlIGlzIEFib3J0U2lnbmFsID0+IHZhbHVlICE9PSB1bmRlZmluZWRcbiAgICApXG5cbiAgICByZXR1cm4gY29tcG9zZWRTaWduYWxzLmxlbmd0aCA+IDAgPyBuZXcgU2lnbmFsQ29udHJvbGxlcihjb21wb3NlZFNpZ25hbHMpIDogdW5kZWZpbmVkXG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGNyZWF0ZVdyYXBDb250ZXh0KGN0eDogVHJ5Q3R4KTogV3JhcEN0eCB7XG4gICAgY29uc3QgcmV0cnkgPSBuZXcgUHJveHkoY3R4LnJldHJ5LCB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eTogKCkgPT4gZmFsc2UsXG4gICAgICBkZWxldGVQcm9wZXJ0eTogKCkgPT4gZmFsc2UsXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eSlcblxuICAgICAgICBpZiAoIWRlc2NyaXB0b3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvclxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5kZXNjcmlwdG9yLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogKCkgPT4gZmFsc2UsXG4gICAgfSlcblxuICAgIGNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjxUcnlDdHg+ID0ge1xuICAgICAgZGVmaW5lUHJvcGVydHk6ICgpID0+IGZhbHNlLFxuICAgICAgZGVsZXRlUHJvcGVydHk6ICgpID0+IGZhbHNlLFxuICAgICAgZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gXCJyZXRyeVwiKSB7XG4gICAgICAgICAgcmV0dXJuIHJldHJ5XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eSlcblxuICAgICAgICBpZiAoIWRlc2NyaXB0b3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvclxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BlcnR5ID09PSBcInJldHJ5XCIpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uZGVzY3JpcHRvcixcbiAgICAgICAgICAgIHZhbHVlOiByZXRyeSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlc2NyaXB0b3IsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiAoKSA9PiBmYWxzZSxcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb3h5KGN0eCwgaGFuZGxlcilcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0RpZENhbmNlbChjYXVzZT86IHVua25vd24pOiBDYW5jZWxsYXRpb25FcnJvciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI3NpZ25hbENvbnRyb2xsZXI/LmNoZWNrRGlkQ2FuY2VsKGNhdXNlKVxuICB9XG5cbiAgcHJvdGVjdGVkIHJhY2VXaXRoQ2FuY2VsbGF0aW9uPFY+KFxuICAgIHByb21pc2U6IFByb21pc2VMaWtlPFY+LFxuICAgIGNhdXNlPzogdW5rbm93blxuICApOiBQcm9taXNlTGlrZTxWIHwgQ2FuY2VsbGF0aW9uRXJyb3I+IHtcbiAgICByZXR1cm4gdGhpcy4jc2lnbmFsQ29udHJvbGxlciA/IHRoaXMuI3NpZ25hbENvbnRyb2xsZXIucmFjZShwcm9taXNlLCBjYXVzZSkgOiBwcm9taXNlXG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tEaWRDb250cm9sRmFpbChjYXVzZT86IHVua25vd24pOiBDYW5jZWxsYXRpb25FcnJvciB8IFRpbWVvdXRFcnJvciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tEaWRDYW5jZWwoY2F1c2UpID8/IHRoaXMuI3RpbWVvdXRDb250cm9sbGVyPy5jaGVja0RpZFRpbWVvdXQoY2F1c2UpXG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZVN5bmNTdWNjZXNzPFQ+KHZhbHVlOiBUKTogVCB8IENhbmNlbGxhdGlvbkVycm9yIHwgVGltZW91dEVycm9yIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja0RpZENvbnRyb2xGYWlsKCkgPz8gdmFsdWVcbiAgfVxuXG4gIHByb3RlY3RlZCByYWNlPFY+KFxuICAgIHByb21pc2U6IFByb21pc2VMaWtlPFY+LFxuICAgIGNhdXNlPzogdW5rbm93blxuICApOiBQcm9taXNlTGlrZTxWIHwgQ2FuY2VsbGF0aW9uRXJyb3IgfCBUaW1lb3V0RXJyb3I+IHtcbiAgICBjb25zdCB0aW1lb3V0Q29udHJvbGxlciA9IHRoaXMuI3RpbWVvdXRDb250cm9sbGVyXG5cbiAgICBpZiAoIXRpbWVvdXRDb250cm9sbGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5yYWNlV2l0aENhbmNlbGxhdGlvbihwcm9taXNlLCBjYXVzZSlcbiAgICB9XG5cbiAgICAvLyBOZXN0IGNhbmNlbGxhdGlvbiBpbnNpZGUgdGhlIHRpbWVvdXQgcmFjZSBzbyBjYW5jZWxsYXRpb24gdGFrZXMgcHJpb3JpdHlcbiAgICAvLyB3aGVuIGJvdGggZmlyZTogaWYgY2FuY2VsbGF0aW9uIHdpbnMsIHRoZSBpbm5lciBwcm9taXNlIGFscmVhZHkgcmVzb2x2ZXNcbiAgICAvLyB3aXRoIGEgQ2FuY2VsbGF0aW9uRXJyb3I7IGlmIHRpbWVvdXQgd2lucywgcmUtY2hlY2sgY2FuY2VsbGF0aW9uIGhlcmUgc28gYVxuICAgIC8vIG5lYXItc2ltdWx0YW5lb3VzIGNhbmNlbCBpcyBzdGlsbCByZXBvcnRlZCBvdmVyIHRoZSB0aW1lb3V0LlxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICB0aW1lb3V0Q29udHJvbGxlci5yYWNlKHRoaXMucmFjZVdpdGhDYW5jZWxsYXRpb24ocHJvbWlzZSwgY2F1c2UpLCBjYXVzZSlcbiAgICApLnRoZW4oKHJhY2VkKSA9PiB7XG4gICAgICBpZiAocmFjZWQgaW5zdGFuY2VvZiBUaW1lb3V0RXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tEaWRDYW5jZWwoY2F1c2UpID8/IHJhY2VkXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByYWNlZFxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgd2FpdEZvclJldHJ5RGVsYXkoXG4gICAgZGVsYXk6IG51bWJlclxuICApOiBQcm9taXNlPENhbmNlbGxhdGlvbkVycm9yIHwgVGltZW91dEVycm9yIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKGRlbGF5IDw9IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCBzbGVlcFJlc3VsdCA9IGF3YWl0IHRoaXMucmFjZShzbGVlcChkZWxheSkpXG5cbiAgICBpZiAoc2xlZXBSZXN1bHQgaW5zdGFuY2VvZiBDYW5jZWxsYXRpb25FcnJvciB8fCBzbGVlcFJlc3VsdCBpbnN0YW5jZW9mIFRpbWVvdXRFcnJvcikge1xuICAgICAgcmV0dXJuIHNsZWVwUmVzdWx0XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgcHJvdGVjdGVkIHNob3VsZEF0dGVtcHRSZXRyeShlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaGVja1Nob3VsZEF0dGVtcHRSZXRyeShlcnJvciwgdGhpcy5jdHgsIHRoaXMuY29uZmlnKVxuICB9XG5cbiAgcHJvdGVjdGVkIHJldHJ5RGVsYXlGb3JDdXJyZW50QXR0ZW1wdCgpOiBudW1iZXIge1xuICAgIHJldHVybiBjYWxjdWxhdGVSZXRyeURlbGF5KHRoaXMuY3R4LnJldHJ5LmF0dGVtcHQsIHRoaXMuY29uZmlnKVxuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUmV0cnlEZWNpc2lvbihlcnJvcjogdW5rbm93bik6IFJldHJ5RGVjaXNpb24ge1xuICAgIGNvbnN0IHNob3VsZEF0dGVtcHRSZXRyeSA9IHRoaXMuc2hvdWxkQXR0ZW1wdFJldHJ5KGVycm9yKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRlbGF5OiBzaG91bGRBdHRlbXB0UmV0cnkgPyB0aGlzLnJldHJ5RGVsYXlGb3JDdXJyZW50QXR0ZW1wdCgpIDogMCxcbiAgICAgIHNob3VsZEF0dGVtcHRSZXRyeSxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hhcmVkIHByZWZpeCBvZiBhdHRlbXB0LWZhaWx1cmUgcmVzb2x1dGlvbjogcmV0aHJvd3MgZGVmZWN0cywgcGFzc2VzIGNvbnRyb2wgZXJyb3JzIHRocm91Z2gsXG4gICAqIGFuZCB0dXJucyByZXRyeWFibGUgZmFpbHVyZXMgaW50byBhIHtAbGluayBSZXRyeURpcmVjdGl2ZX0uIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgZmFpbHVyZVxuICAgKiBzaG91bGQgY29udGludWUgaW50byBjYXRjaCBtYXBwaW5nIChvciB1bm1hcHBlZCB3cmFwcGluZykuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZUNvbnRyb2xPclJldHJ5KGVycm9yOiB1bmtub3duKTogUnVubmVyRXJyb3IgfCBSZXRyeURpcmVjdGl2ZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgUGFuaWMpIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29udHJvbEVycm9yKSB7XG4gICAgICByZXR1cm4gZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sRXJyb3IgPSB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoZXJyb3IpXG5cbiAgICBpZiAoY29udHJvbEVycm9yKSB7XG4gICAgICByZXR1cm4gY29udHJvbEVycm9yXG4gICAgfVxuXG4gICAgY29uc3QgcmV0cnlEZWNpc2lvbiA9IHRoaXMuYnVpbGRSZXRyeURlY2lzaW9uKGVycm9yKVxuXG4gICAgaWYgKHJldHJ5RGVjaXNpb24uc2hvdWxkQXR0ZW1wdFJldHJ5KSB7XG4gICAgICByZXR1cm4gbmV3IFJldHJ5RGlyZWN0aXZlKHJldHJ5RGVjaXNpb24pXG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlZCB0YWlsIG9mIGF0dGVtcHQtZmFpbHVyZSByZXNvbHV0aW9uIHdoZW4gbm8gY2F0Y2ggaGFuZGxlciBleGlzdHMuIFdpdGggcmV0cnkgY29uZmlndXJlZCxcbiAgICogYW55IGdpdmUtdXAgKGxpbWl0IGV4aGF1c3RlZCBvciBzaG91bGRSZXRyeSBkZWNsaW5pbmcpIGlzIHJlcG9ydGVkIHVuaWZvcm1seSBhc1xuICAgKiB7QGxpbmsgUmV0cnlFeGhhdXN0ZWRFcnJvcn0gY2FycnlpbmcgdGhlIGxhc3QgYXR0ZW1wdCdzIGVycm9yOyBvdGhlcndpc2UgdGhlIGZhaWx1cmUgaXMgd3JhcHBlZFxuICAgKiBpbiB7QGxpbmsgVW5oYW5kbGVkRXhjZXB0aW9ufS5cbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlVW5tYXBwZWRGYWlsdXJlKGVycm9yOiB1bmtub3duKTogUnVubmVyRXJyb3Ige1xuICAgIC8vIEV2ZW4gd2l0aG91dCBhIGNhdGNoIGhhbmRsZXIsIGNhbmNlbGxhdGlvbi90aW1lb3V0IG1heSBoYXZlIHdvbiBzaW5jZVxuICAgIC8vIHRoZSBvcmlnaW5hbCBmYWlsdXJlIHdhcyBmaXJzdCBvYnNlcnZlZC5cbiAgICBjb25zdCBmaW5hbGl6ZUNvbnRyb2xFcnJvciA9IHRoaXMuY2hlY2tEaWRDb250cm9sRmFpbChlcnJvcilcblxuICAgIGlmIChmaW5hbGl6ZUNvbnRyb2xFcnJvcikge1xuICAgICAgcmV0dXJuIGZpbmFsaXplQ29udHJvbEVycm9yXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLnJldHJ5KSB7XG4gICAgICByZXR1cm4gbmV3IFJldHJ5RXhoYXVzdGVkRXJyb3IodW5kZWZpbmVkLCB7IGNhdXNlOiBlcnJvciB9KVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgVW5oYW5kbGVkRXhjZXB0aW9uKHVuZGVmaW5lZCwgeyBjYXVzZTogZXJyb3IgfSlcbiAgfVxuXG4gIGdldCAjd3JhcEN0eCgpOiBXcmFwQ3R4IHtcbiAgICB0aGlzLiN3cmFwQ3R4Q2FjaGUgPz89IEJhc2VFeGVjdXRpb24uY3JlYXRlV3JhcENvbnRleHQodGhpcy5jdHgpXG4gICAgcmV0dXJuIHRoaXMuI3dyYXBDdHhDYWNoZVxuICB9XG59XG5kZWZpbmVEaXNwb3NlQWxpYXMoQmFzZUV4ZWN1dGlvbi5wcm90b3R5cGUpXG4iLAogICAgImltcG9ydCB0eXBlIHsgQXN5bmNEaXNwb3NlciB9IGZyb20gXCIuLi8uLi9zaGltcy9kaXNwb3NlclwiXG5pbXBvcnQgdHlwZSB7IEJ1aWxkZXJDb25maWcgfSBmcm9tIFwiLi4vYnVpbGRlclwiXG5pbXBvcnQgeyBjcmVhdGVBc3luY0Rpc3Bvc2VyLCBkZWZpbmVBc3luY0Rpc3Bvc2VBbGlhcyB9IGZyb20gXCIuLi8uLi9zaGltcy9kaXNwb3NlclwiXG5pbXBvcnQgeyBQYW5pYywgVW5oYW5kbGVkRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgQmFzZUV4ZWN1dGlvbiB9IGZyb20gXCIuL2Jhc2VcIlxuXG50eXBlIFJlc29sdmVyUGFpciA9IFsodmFsdWU6IHVua25vd24pID0+IHZvaWQsIChyZWFzb24/OiB1bmtub3duKSA9PiB2b2lkXVxuXG50eXBlIFRhc2tFeGVjdXRpb25Nb2RlID0gXCJmYWlsLWZhc3RcIiB8IFwic2V0dGxlZFwiXG5cbnR5cGUgVGFza0V4ZWN1dGlvblJlc3VsdDxcbiAgVCBleHRlbmRzIFRhc2tSZWNvcmQsXG4gIFRNb2RlIGV4dGVuZHMgVGFza0V4ZWN1dGlvbk1vZGUsXG4+ID0gVE1vZGUgZXh0ZW5kcyBcInNldHRsZWRcIiA/IEFsbFNldHRsZWRSZXN1bHQ8VD4gOiBBbGxWYWx1ZTxUPlxuXG4vLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXhwbGljaXQtYW55IC0tIFJlcXVpcmVkIGZvciB0YXNrLW1hcCBpbmZlcmVuY2VcbmV4cG9ydCB0eXBlIFRhc2tSZWNvcmQgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+XG5cbmV4cG9ydCB0eXBlIFRhc2tWYWxpZGF0aW9uPFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiA9IHtcbiAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4cGxpY2l0LWFueSAtLSBSZXF1aXJlZCBmb3IgZnVuY3Rpb24gY29tcGF0aWJpbGl0eSB3aXRoIGNvbnRleHR1YWwgYHRoaXNgXG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBUW0tdIDogbmV2ZXJcbn1cblxuLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4cGxpY2l0LWFueSAtLSBSZXF1aXJlZCBmb3IgZnVuY3Rpb24gY29tcGF0aWJpbGl0eSB3aXRoIGNvbnRleHR1YWwgYHRoaXNgXG5leHBvcnQgdHlwZSBUYXNrUmVzdWx0PFQ+ID0gVCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gaW5mZXIgUiA/IEF3YWl0ZWQ8Uj4gOiBuZXZlclxuXG5leHBvcnQgdHlwZSBSZXN1bHRQcm94eTxUIGV4dGVuZHMgVGFza1JlY29yZD4gPSB7XG4gIHJlYWRvbmx5IFtLIGluIGtleW9mIFRdOiBQcm9taXNlPFRhc2tSZXN1bHQ8VFtLXT4+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza0NvbnRleHQ8VCBleHRlbmRzIFRhc2tSZWNvcmQ+IHtcbiAgJHJlc3VsdDogUmVzdWx0UHJveHk8VD5cbiAgJHNpZ25hbDogQWJvcnRTaWduYWxcbiAgJGRpc3Bvc2VyOiBBc3luY0Rpc3Bvc2VyXG59XG5cbmV4cG9ydCB0eXBlIEluZmVycmVkVGFza0NvbnRleHQ8VCBleHRlbmRzIFRhc2tSZWNvcmQ+ID0ge1xuICAkcmVzdWx0OiB7XG4gICAgcmVhZG9ubHkgW0sgaW4ga2V5b2YgVF06IFJldHVyblR5cGU8VFtLXT4gZXh0ZW5kcyBQcm9taXNlPGluZmVyIFI+XG4gICAgICA/IFByb21pc2U8Uj5cbiAgICAgIDogUHJvbWlzZTxSZXR1cm5UeXBlPFRbS10+PlxuICB9XG4gICRzaWduYWw6IEFib3J0U2lnbmFsXG4gICRkaXNwb3NlcjogQXN5bmNEaXNwb3NlclxufVxuXG5leHBvcnQgdHlwZSBBbGxWYWx1ZTxUIGV4dGVuZHMgVGFza1JlY29yZD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUYXNrUmVzdWx0PFRbS10+XG59XG5cbmludGVyZmFjZSBBbGxDYXRjaENvbnRleHQ8VCBleHRlbmRzIFRhc2tSZWNvcmQ+IHtcbiAgZmFpbGVkVGFzazogKGtleW9mIFQgJiBzdHJpbmcpIHwgdW5kZWZpbmVkXG4gIHBhcnRpYWw6IFBhcnRpYWw8QWxsVmFsdWU8VD4+XG4gIHNpZ25hbDogQWJvcnRTaWduYWxcbn1cblxudHlwZSBBbGxDYXRjaEZuPFQgZXh0ZW5kcyBUYXNrUmVjb3JkLCBDPiA9IChcbiAgZXJyb3I6IHVua25vd24sXG4gIGN0eDogQWxsQ2F0Y2hDb250ZXh0PFQ+XG4pID0+IEMgfCBQcm9taXNlPEM+XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWxsT3B0aW9uczxUIGV4dGVuZHMgVGFza1JlY29yZCwgQz4ge1xuICBjYXRjaDogQWxsQ2F0Y2hGbjxULCBDPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldHRsZWRGdWxmaWxsZWQ8VD4ge1xuICBzdGF0dXM6IFwiZnVsZmlsbGVkXCJcbiAgdmFsdWU6IFRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXR0bGVkUmVqZWN0ZWQge1xuICBzdGF0dXM6IFwicmVqZWN0ZWRcIlxuICByZWFzb246IHVua25vd25cbn1cblxuZXhwb3J0IHR5cGUgU2V0dGxlZFJlc3VsdDxUPiA9IFNldHRsZWRGdWxmaWxsZWQ8VD4gfCBTZXR0bGVkUmVqZWN0ZWRcblxuZXhwb3J0IHR5cGUgQWxsU2V0dGxlZFJlc3VsdDxUIGV4dGVuZHMgVGFza1JlY29yZD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBTZXR0bGVkUmVzdWx0PFRhc2tSZXN1bHQ8VFtLXT4+XG59XG5cbmludGVyZmFjZSBSZXRyeUluZm8ge1xuICBhdHRlbXB0OiBudW1iZXJcbiAgbGltaXQ6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VUcnlDdHgge1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbFxufVxuXG5leHBvcnQgdHlwZSBUcnlDdHhGb3I8SGFzUmV0cnkgZXh0ZW5kcyBib29sZWFuPiA9IEJhc2VUcnlDdHggJlxuICAoSGFzUmV0cnkgZXh0ZW5kcyB0cnVlID8geyByZXRyeTogUmV0cnlJbmZvIH0gOiBSZWNvcmQ8bmV2ZXIsIG5ldmVyPilcblxuZXhwb3J0IHR5cGUgVHJ5Q3R4ID0gVHJ5Q3R4Rm9yPHRydWU+XG5cbmV4cG9ydCB0eXBlIE5vblByb21pc2U8VD4gPSBUIGV4dGVuZHMgUHJvbWlzZUxpa2U8dW5rbm93bj4gPyBuZXZlciA6IFRcblxuaW50ZXJmYWNlIFRhc2tHcmFwaFJ1bjxSPiBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIGV4ZWN1dGUoKTogUHJvbWlzZTxSPlxuICB3YWl0Rm9yVGFza3NUb1NldHRsZSgpOiBQcm9taXNlPHZvaWQ+XG59XG5cbmV4cG9ydCB0eXBlIFRhc2tHcmFwaEZhaWx1cmVPdXRjb21lPFI+ID0geyBtYXBwZWQ6IFIgfSB8IHsgdGhyb3duOiB1bmtub3duIH1cblxuaW50ZXJmYWNlIFRhc2tHcmFwaE9wdGlvbnM8Uj4ge1xuICBtYXBGYWlsdXJlPzogKGVycm9yOiB1bmtub3duKSA9PiBUYXNrR3JhcGhGYWlsdXJlT3V0Y29tZTxSPiB8IFByb21pc2U8VGFza0dyYXBoRmFpbHVyZU91dGNvbWU8Uj4+XG4gIHdhaXRGb3JUYXNrc1RvU2V0dGxlPzogYm9vbGVhblxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgT3JjaGVzdHJhdGlvbkV4ZWN1dGlvbjxUUmVzdWx0PiBleHRlbmRzIEJhc2VFeGVjdXRpb248UHJvbWlzZTxUUmVzdWx0Pj4ge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoY29uZmlnOiBCdWlsZGVyQ29uZmlnKSB7XG4gICAgY29uc3QgdW5zdXBwb3J0ZWRQb2xpY2llcyA9IFtcbiAgICAgIGNvbmZpZy5yZXRyeSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogXCJyZXRyeVwiLFxuICAgICAgY29uZmlnLnRpbWVvdXQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFwidGltZW91dFwiLFxuICAgIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIFwicmV0cnlcIiB8IFwidGltZW91dFwiID0+IHZhbHVlICE9PSB1bmRlZmluZWQpXG5cbiAgICBpbnZhcmlhbnQoXG4gICAgICB1bnN1cHBvcnRlZFBvbGljaWVzLmxlbmd0aCA9PT0gMCxcbiAgICAgIG5ldyBQYW5pYyhcIk9SQ0hFU1RSQVRJT05fVU5TVVBQT1JURURfUE9MSUNZXCIsIHtcbiAgICAgICAgbWVzc2FnZTogYE9yY2hlc3RyYXRpb24gZG9lcyBub3Qgc3VwcG9ydCAke3Vuc3VwcG9ydGVkUG9saWNpZXMuam9pbihcIiBvciBcIil9IHBvbGljaWVzLmAsXG4gICAgICB9KVxuICAgIClcblxuICAgIHN1cGVyKHtcbiAgICAgIHNpZ25hbHM6IGNvbmZpZy5zaWduYWxzLFxuICAgICAgd3JhcHM6IGNvbmZpZy53cmFwcyxcbiAgICB9KVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGV4ZWN1dGVDb3JlKCk6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgIC8vIE9yY2hlc3RyYXRpb24gZXhlY3V0b3JzIHN0aWxsIHNoYXJlIG91dGVyIHdyYXBzL2NhbmNlbGxhdGlvbiBjaGVja3MgZXZlblxuICAgIC8vIHRob3VnaCB0aGVpciB0YXNrIGV4ZWN1dGlvbiBzdHJhdGVnaWVzIGRpZmZlci5cbiAgICBjb25zdCBjb250cm9sQmVmb3JlRXhlY3V0aW9uID0gdGhpcy5jaGVja0RpZENvbnRyb2xGYWlsKClcblxuICAgIGlmIChjb250cm9sQmVmb3JlRXhlY3V0aW9uKSB7XG4gICAgICB0aHJvdyBjb250cm9sQmVmb3JlRXhlY3V0aW9uXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZVRhc2tzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZWQgdGFzay1ncmFwaCBsaWZlY3ljbGU6IHJhY2UgZXhlY3V0aW9uIGFnYWluc3QgY2FuY2VsbGF0aW9uLCBsZXQgYG1hcEZhaWx1cmVgIHR1cm4gYVxuICAgKiBmYWlsdXJlIGludG8gYSBtYXBwZWQgcmVzdWx0IG9yIGEgdmFsdWUgdG8gcmV0aHJvdywgb3B0aW9uYWxseSB3YWl0IGZvciBzaWJsaW5nIHRhc2tzIHRvIHNldHRsZVxuICAgKiBiZWZvcmUgcmVzb2x2aW5nLCBhbmQgZ2l2ZSBjYW5jZWxsYXRpb24gcHJpb3JpdHkgb3ZlciB3aGF0ZXZlciB3YXMgdGhyb3duIHdoaWxlIGl0IGZpcmVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGV4ZWN1dGVUYXNrR3JhcGg8Uj4oXG4gICAgZ3JhcGg6IFRhc2tHcmFwaFJ1bjxSPixcbiAgICBvcHRpb25zOiBUYXNrR3JhcGhPcHRpb25zPFI+ID0ge31cbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgYXdhaXQgdXNpbmcgZXhlY3V0aW9uID0gZ3JhcGhcbiAgICBjb25zdCB7XG4gICAgICBtYXBGYWlsdXJlID0gKGVycm9yKTogVGFza0dyYXBoRmFpbHVyZU91dGNvbWU8Uj4gPT4gKHsgdGhyb3duOiBlcnJvciB9KSxcbiAgICAgIHdhaXRGb3JUYXNrc1RvU2V0dGxlID0gdHJ1ZSxcbiAgICB9ID0gb3B0aW9uc1xuICAgIGxldCByZXN1bHQhOiBSXG4gICAgbGV0IHRocmV3ID0gZmFsc2VcbiAgICBsZXQgdGhyb3duRXJyb3I6IHVua25vd25cblxuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSAoYXdhaXQgdGhpcy5yYWNlV2l0aENhbmNlbGxhdGlvbihleGVjdXRpb24uZXhlY3V0ZSgpKSkgYXMgUlxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBvdXRjb21lID0gYXdhaXQgbWFwRmFpbHVyZShlcnJvcilcblxuICAgICAgaWYgKFwibWFwcGVkXCIgaW4gb3V0Y29tZSkge1xuICAgICAgICByZXN1bHQgPSBvdXRjb21lLm1hcHBlZFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyZXcgPSB0cnVlXG4gICAgICAgIHRocm93bkVycm9yID0gb3V0Y29tZS50aHJvd25cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHdhaXRGb3JUYXNrc1RvU2V0dGxlKSB7XG4gICAgICAgIGF3YWl0IGV4ZWN1dGlvbi53YWl0Rm9yVGFza3NUb1NldHRsZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2FuY2VsbGF0aW9uID0gdGhpcy5jaGVja0RpZENhbmNlbCh0aHJvd25FcnJvcilcblxuICAgIGlmIChjYW5jZWxsYXRpb24pIHtcbiAgICAgIHRocm93IGNhbmNlbGxhdGlvblxuICAgIH1cblxuICAgIGlmICh0aHJldykge1xuICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWwsIHR5cGVzY3JpcHQvb25seS10aHJvdy1lcnJvciAtLSBQcmVzZXJ2ZSByYXcgdGFzayBmYWlsdXJlcyBmb3IgY2FsbGVycy90ZXN0cy5cbiAgICAgIHRocm93IHRocm93bkVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGV4ZWN1dGVUYXNrcygpOiBQcm9taXNlPFRSZXN1bHQ+XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUYXNrR3JhcGhFeGVjdXRpb25CYXNlPFxuICBUIGV4dGVuZHMgVGFza1JlY29yZCxcbiAgVENvbnRleHQgZXh0ZW5kcyBUYXNrQ29udGV4dDxUPixcbj4gaW1wbGVtZW50cyBBc3luY0Rpc3Bvc2FibGUge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGFza3M6IFRcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhc2tOYW1lczogQXJyYXk8a2V5b2YgVCAmIHN0cmluZz5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc3VsdHMhOiBNYXA8a2V5b2YgVCwgdW5rbm93bj5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVycm9ycyE6IE1hcDxrZXlvZiBULCB1bmtub3duPlxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZXJzITogTWFwPGtleW9mIFQsIFJlc29sdmVyUGFpcltdPlxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW50ZXJuYWxDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhc2tTaWduYWw6IEFib3J0U2lnbmFsXG4gIHByb3RlY3RlZCByZWFkb25seSBkaXNwb3NlcjogQXN5bmNEaXNwb3NlciA9IGNyZWF0ZUFzeW5jRGlzcG9zZXIoKVxuICBwcm90ZWN0ZWQgZmlyc3RSZWplY3Rpb246IHVua25vd25cbiAgZGVjbGFyZSBbU3ltYm9sLmFzeW5jRGlzcG9zZV06ICgpID0+IFByb21pc2U8dm9pZD5cblxuICBjb25zdHJ1Y3RvcihzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLCB0YXNrczogVCkge1xuICAgIHRoaXMudGFza3MgPSB0YXNrc1xuICAgIHRoaXMudGFza05hbWVzID0gT2JqZWN0LmtleXModGFza3MpXG4gICAgdGhpcy5yZXN1bHRzID0gbmV3IE1hcDxrZXlvZiBULCB1bmtub3duPigpXG4gICAgdGhpcy5lcnJvcnMgPSBuZXcgTWFwPGtleW9mIFQsIHVua25vd24+KClcbiAgICB0aGlzLnJlc29sdmVycyA9IG5ldyBNYXA8a2V5b2YgVCwgUmVzb2x2ZXJQYWlyW10+KClcbiAgICB0aGlzLnRhc2tTaWduYWwgPSBzaWduYWxcbiAgICAgID8gQWJvcnRTaWduYWwuYW55KFtzaWduYWwsIHRoaXMuaW50ZXJuYWxDb250cm9sbGVyLnNpZ25hbF0pXG4gICAgICA6IHRoaXMuaW50ZXJuYWxDb250cm9sbGVyLnNpZ25hbFxuICB9XG5cbiAgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc3Bvc2VyLmRpc3Bvc2UoKVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRhc2tIYW5kbGVyKHRhc2tOYW1lOiBrZXlvZiBUKSB7XG4gICAgY29uc3QgdGFza0ZuID0gdGhpcy50YXNrc1t0YXNrTmFtZV1cblxuICAgIGludmFyaWFudChcbiAgICAgIHR5cGVvZiB0YXNrRm4gPT09IFwiZnVuY3Rpb25cIixcbiAgICAgIG5ldyBQYW5pYyhcIlRBU0tfSU5WQUxJRF9IQU5ETEVSXCIsIHtcbiAgICAgICAgbWVzc2FnZTogYFRhc2sgXCIke1N0cmluZyh0YXNrTmFtZSl9XCIgaXMgbm90IGEgZnVuY3Rpb25gLFxuICAgICAgfSlcbiAgICApXG5cbiAgICByZXR1cm4gdGFza0ZuIGFzICh0aGlzOiBUQ29udGV4dCkgPT4gdW5rbm93blxuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVJlc3VsdFByb3h5KHJlcXVlc3RlclRhc2tOYW1lOiBrZXlvZiBUKTogUmVzdWx0UHJveHk8VD4ge1xuICAgIHJldHVybiBuZXcgUHJveHkoe30gYXMgUmVzdWx0UHJveHk8VD4sIHtcbiAgICAgIGdldDogKF8sIHJlZmVyZW5jZWRUYXNrTmFtZTogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLndhaXRGb3JSZXN1bHQocmVmZXJlbmNlZFRhc2tOYW1lLCByZXF1ZXN0ZXJUYXNrTmFtZSksXG4gICAgfSlcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0Rm9yUmVzdWx0KHRhc2tOYW1lOiBrZXlvZiBULCByZXF1ZXN0ZXJUYXNrTmFtZT86IGtleW9mIFQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBpZiAocmVxdWVzdGVyVGFza05hbWUgPT09IHRhc2tOYW1lKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBQYW5pYyhcIlRBU0tfU0VMRl9SRUZFUkVOQ0VcIiwge1xuICAgICAgICAgIG1lc3NhZ2U6IGBUYXNrIFwiJHtTdHJpbmcodGFza05hbWUpfVwiIGNhbm5vdCBhd2FpdCBpdHMgb3duIHJlc3VsdGAsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKCFPYmplY3QuaGFzT3duKHRoaXMudGFza3MsIHRhc2tOYW1lKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgUGFuaWMoXCJUQVNLX1VOS05PV05fUkVGRVJFTkNFXCIsIHtcbiAgICAgICAgICBtZXNzYWdlOiBgVW5rbm93biB0YXNrIFwiJHtTdHJpbmcodGFza05hbWUpfVwiYCxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXN1bHRzLmhhcyh0YXNrTmFtZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5yZXN1bHRzLmdldCh0YXNrTmFtZSkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZXJyb3JzLmhhcyh0YXNrTmFtZSkpIHtcbiAgICAgIGNvbnN0IHN0b3JlZEVycm9yID0gdGhpcy5tYXBTdG9yZWRFcnJvcih0aGlzLmVycm9ycy5nZXQodGFza05hbWUpKVxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoc3RvcmVkRXJyb3IpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlcnMuZ2V0KHRhc2tOYW1lKVxuXG4gICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgcXVldWUucHVzaChbcmVzb2x2ZSwgcmVqZWN0XSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVzb2x2ZXJzLnNldCh0YXNrTmFtZSwgW1tyZXNvbHZlLCByZWplY3RdXSlcbiAgICB9KVxuICB9XG5cbiAgcHJvdGVjdGVkIHN0b3JlUmVzdWx0KHRhc2tOYW1lOiBrZXlvZiBULCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMucmVzdWx0cy5zZXQodGFza05hbWUsIHZhbHVlKVxuICAgIHRoaXMucmVzb2x2ZVdhaXRlcnModGFza05hbWUsIHZhbHVlKVxuICB9XG5cbiAgcHJvdGVjdGVkIHN0b3JlRXJyb3IodGFza05hbWU6IGtleW9mIFQsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgbWFwcGVkRXJyb3IgPSB0aGlzLm1hcFN0b3JlZEVycm9yKGVycm9yKVxuXG4gICAgdGhpcy5lcnJvcnMuc2V0KHRhc2tOYW1lLCBtYXBwZWRFcnJvcilcbiAgICB0aGlzLnJlamVjdFdhaXRlcnModGFza05hbWUsIG1hcHBlZEVycm9yKVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVXYWl0ZXJzKHRhc2tOYW1lOiBrZXlvZiBULCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGZ1bGZpbGxlZCA9IHRoaXMucmVzb2x2ZXJzLmdldCh0YXNrTmFtZSlcblxuICAgIGlmIChmdWxmaWxsZWQpIHtcbiAgICAgIGZvciAoY29uc3QgW3Jlc29sdmVdIG9mIGZ1bGZpbGxlZCkge1xuICAgICAgICByZXNvbHZlKHZhbHVlKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnJlc29sdmVycy5kZWxldGUodGFza05hbWUpXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlamVjdFdhaXRlcnModGFza05hbWU6IGtleW9mIFQsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgcmVqZWN0ZWQgPSB0aGlzLnJlc29sdmVycy5nZXQodGFza05hbWUpXG5cbiAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgIGZvciAoY29uc3QgWywgcmVqZWN0XSBvZiByZWplY3RlZCkge1xuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVzb2x2ZXJzLmRlbGV0ZSh0YXNrTmFtZSlcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJvcnRJbnRlcm5hbChlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbnRlcm5hbENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxDb250cm9sbGVyLmFib3J0KGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBvYnNlcnZhdGlvbiBob29rczogc3ViY2xhc3NlcyBpbXBsZW1lbnQgdGhlc2UgdG8gcmVjb3JkIHRhc2sgb3V0Y29tZXMuIFRoZXNlIG1ldGhvZFxuICAgKiBzaWduYXR1cmVzIGFyZSBlcmFzZWQgYXQgY29tcGlsZSB0aW1lLCBzbyB0aGUgYmFzZSBjbGFzcyBsZWF2ZXMgdGhlbSB1bmRlZmluZWQgd2l0aG91dCBlbWl0dGluZ1xuICAgKiBmaWVsZHMgdGhhdCB3b3VsZCBzaGFkb3cgc3ViY2xhc3MgcHJvdG90eXBlIG1ldGhvZHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25UYXNrUmVzdWx0Pyh0YXNrTmFtZToga2V5b2YgVCwgdmFsdWU6IHVua25vd24pOiB2b2lkXG4gIHByb3RlY3RlZCBvblRhc2tFcnJvcj8odGFza05hbWU6IGtleW9mIFQsIGVycm9yOiB1bmtub3duKTogdm9pZFxuXG4gIC8vIFRoZSB0aHJlZSBtZXRob2RzIGJlbG93IGFyZSBwb2x5bW9ycGhpYyBkZWZhdWx0cyBvdmVycmlkZGVuIGJ5XG4gIC8vIHN1YmNsYXNzZXMgKHRlbXBsYXRlLW1ldGhvZCBwYXR0ZXJuKTsgdGhleSBtdXN0IHN0YXkgaW5zdGFuY2UgbWV0aG9kc1xuICAvLyBldmVuIHRob3VnaCB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IHRvdWNoIGB0aGlzYC5cblxuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAtLSBwb2x5bW9ycGhpYyBkZWZhdWx0XG4gIHByb3RlY3RlZCBtYXBTdG9yZWRFcnJvcihlcnJvcjogdW5rbm93bik6IEVycm9yIHtcbiAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IFVuaGFuZGxlZEV4Y2VwdGlvbih1bmRlZmluZWQsIHsgY2F1c2U6IGVycm9yIH0pXG4gIH1cblxuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAtLSBwb2x5bW9ycGhpYyBkZWZhdWx0XG4gIHByb3RlY3RlZCBzaG91bGRBYm9ydE9uVGFza0Vycm9yKF9lcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgLS0gcG9seW1vcnBoaWMgZGVmYXVsdFxuICBwcm90ZWN0ZWQgc2hvdWxkUmV0aHJvd1Rhc2tFcnJvcihfZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldEZpcnN0UmVqZWN0aW9uKGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5maXJzdFJlamVjdGlvbiA/Pz0gZXJyb3JcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVUYXNrQ29udGV4dChyZXN1bHRQcm94eTogUmVzdWx0UHJveHk8VD4pOiBUQ29udGV4dFxuXG4gIHByb3RlY3RlZCBhc3luYyBydW5UYXNrKHRhc2tOYW1lOiBrZXlvZiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhc2tGbiA9IHRoaXMuZ2V0VGFza0hhbmRsZXIodGFza05hbWUpXG4gICAgICBjb25zdCByZXN1bHRQcm94eSA9IHRoaXMuY3JlYXRlUmVzdWx0UHJveHkodGFza05hbWUpXG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVUYXNrQ29udGV4dChyZXN1bHRQcm94eSlcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhc2tGbi5jYWxsKGNvbnRleHQpXG5cbiAgICAgIHRoaXMuc3RvcmVSZXN1bHQodGFza05hbWUsIHJlc3VsdClcbiAgICAgIHRoaXMub25UYXNrUmVzdWx0Py4odGFza05hbWUsIHJlc3VsdClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5zZXRGaXJzdFJlamVjdGlvbihlcnJvcilcbiAgICAgIHRoaXMuc3RvcmVFcnJvcih0YXNrTmFtZSwgZXJyb3IpXG4gICAgICB0aGlzLm9uVGFza0Vycm9yPy4odGFza05hbWUsIGVycm9yKVxuXG4gICAgICBpZiAodGhpcy5zaG91bGRBYm9ydE9uVGFza0Vycm9yKGVycm9yKSkge1xuICAgICAgICB0aGlzLmFib3J0SW50ZXJuYWwoZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnNob3VsZFJldGhyb3dUYXNrRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5kZWZpbmVBc3luY0Rpc3Bvc2VBbGlhcyhUYXNrR3JhcGhFeGVjdXRpb25CYXNlLnByb3RvdHlwZSlcblxuZXhwb3J0IGNsYXNzIFRhc2tFeGVjdXRpb248XG4gIFQgZXh0ZW5kcyBUYXNrUmVjb3JkLFxuICBUTW9kZSBleHRlbmRzIFRhc2tFeGVjdXRpb25Nb2RlID0gVGFza0V4ZWN1dGlvbk1vZGUsXG4+IGV4dGVuZHMgVGFza0dyYXBoRXhlY3V0aW9uQmFzZTxULCBUYXNrQ29udGV4dDxUPj4ge1xuICByZWFkb25seSAjbW9kZTogVE1vZGVcbiAgcmVhZG9ubHkgI3JldHVyblZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICNmYWlsZWRUYXNrOiAoa2V5b2YgVCAmIHN0cmluZykgfCB1bmRlZmluZWRcbiAgcHJpdmF0ZSBzZXR0bGVkUHJvbWlzZTogUHJvbWlzZTxBcnJheTxQcm9taXNlU2V0dGxlZFJlc3VsdDx2b2lkPj4+IHwgdW5kZWZpbmVkXG5cbiAgY29uc3RydWN0b3Ioc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCwgdGFza3M6IFQsIG1vZGU6IFRNb2RlKSB7XG4gICAgc3VwZXIoc2lnbmFsLCB0YXNrcylcbiAgICB0aGlzLiNtb2RlID0gbW9kZVxuICB9XG5cbiAgZ2V0IGZhaWxlZFRhc2soKTogKGtleW9mIFQgJiBzdHJpbmcpIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jZmFpbGVkVGFza1xuICB9XG5cbiAgZ2V0IHNpZ25hbCgpOiBBYm9ydFNpZ25hbCB7XG4gICAgcmV0dXJuIHRoaXMudGFza1NpZ25hbFxuICB9XG5cbiAgZ2V0IHJldHVyblZhbHVlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy4jcmV0dXJuVmFsdWVcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUoKTogUHJvbWlzZTxUYXNrRXhlY3V0aW9uUmVzdWx0PFQsIFRNb2RlPj4ge1xuICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy50YXNrTmFtZXMubWFwKGFzeW5jIChuYW1lKSA9PiB0aGlzLnJ1blRhc2sobmFtZSkpXG4gICAgdGhpcy5zZXR0bGVkUHJvbWlzZSA9IFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcylcblxuICAgIGlmICh0aGlzLiNtb2RlID09PSBcInNldHRsZWRcIikge1xuICAgICAgYXdhaXQgdGhpcy5zZXR0bGVkUHJvbWlzZVxuICAgICAgcmV0dXJuIHRoaXMuI3JldHVyblZhbHVlIGFzIFRhc2tFeGVjdXRpb25SZXN1bHQ8VCwgVE1vZGU+XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgdGhpcy5tYXBTdG9yZWRFcnJvcih0aGlzLmZpcnN0UmVqZWN0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNyZXR1cm5WYWx1ZSBhcyBUYXNrRXhlY3V0aW9uUmVzdWx0PFQsIFRNb2RlPlxuICB9XG5cbiAgYXN5bmMgd2FpdEZvclRhc2tzVG9TZXR0bGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZXR0bGVkUHJvbWlzZVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNyZWF0ZVRhc2tDb250ZXh0KHJlc3VsdFByb3h5OiBSZXN1bHRQcm94eTxUPik6IFRhc2tDb250ZXh0PFQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgJGRpc3Bvc2VyOiB0aGlzLmRpc3Bvc2VyLFxuICAgICAgJHJlc3VsdDogcmVzdWx0UHJveHksXG4gICAgICAkc2lnbmFsOiB0aGlzLnRhc2tTaWduYWwsXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG9uVGFza1Jlc3VsdCh0YXNrTmFtZToga2V5b2YgVCwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLiNyZXR1cm5WYWx1ZVt0YXNrTmFtZSBhcyBzdHJpbmddID1cbiAgICAgIHRoaXMuI21vZGUgPT09IFwic2V0dGxlZFwiID8geyBzdGF0dXM6IFwiZnVsZmlsbGVkXCIsIHZhbHVlIH0gOiB2YWx1ZVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG9uVGFza0Vycm9yKHRhc2tOYW1lOiBrZXlvZiBULCBlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuI2ZhaWxlZFRhc2sgPz89IHRhc2tOYW1lIGFzIGtleW9mIFQgJiBzdHJpbmdcblxuICAgIGlmICh0aGlzLiNtb2RlID09PSBcInNldHRsZWRcIikge1xuICAgICAgdGhpcy4jcmV0dXJuVmFsdWVbdGFza05hbWUgYXMgc3RyaW5nXSA9IHsgcmVhc29uOiBlcnJvciwgc3RhdHVzOiBcInJlamVjdGVkXCIgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzaG91bGRBYm9ydE9uVGFza0Vycm9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNtb2RlID09PSBcImZhaWwtZmFzdFwiXG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2hvdWxkUmV0aHJvd1Rhc2tFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jbW9kZSA9PT0gXCJmYWlsLWZhc3RcIlxuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQnVpbGRlckNvbmZpZyB9IGZyb20gXCIuLi9idWlsZGVyXCJcbmltcG9ydCB7IENhbmNlbGxhdGlvbkVycm9yLCBQYW5pYyB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHsgY2hlY2tJc1Byb21pc2VMaWtlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7XG4gIE9yY2hlc3RyYXRpb25FeGVjdXRpb24sXG4gIFRhc2tFeGVjdXRpb24sXG4gIHR5cGUgQWxsT3B0aW9ucyxcbiAgdHlwZSBBbGxWYWx1ZSxcbiAgdHlwZSBJbmZlcnJlZFRhc2tDb250ZXh0LFxuICB0eXBlIFRhc2tHcmFwaEZhaWx1cmVPdXRjb21lLFxuICB0eXBlIFRhc2tSZWNvcmQsXG4gIHR5cGUgVGFza1Jlc3VsdCxcbiAgdHlwZSBUYXNrVmFsaWRhdGlvbixcbn0gZnJvbSBcIi4vc2hhcmVkXCJcblxuY2xhc3MgQWxsRXhlY3V0aW9uPFQgZXh0ZW5kcyBUYXNrUmVjb3JkLCBDPiBleHRlbmRzIE9yY2hlc3RyYXRpb25FeGVjdXRpb248QWxsVmFsdWU8VD4gfCBDPiB7XG4gIHJlYWRvbmx5ICN0YXNrczogVFxuICByZWFkb25seSAjb3B0aW9uczogQWxsT3B0aW9uczxULCBDPiB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQnVpbGRlckNvbmZpZywgdGFza3M6IFQsIG9wdGlvbnM/OiBBbGxPcHRpb25zPFQsIEM+KSB7XG4gICAgc3VwZXIoY29uZmlnKVxuICAgIHRoaXMuI3Rhc2tzID0gdGFza3NcbiAgICB0aGlzLiNvcHRpb25zID0gb3B0aW9uc1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGV4ZWN1dGVUYXNrcygpOiBQcm9taXNlPEFsbFZhbHVlPFQ+IHwgQz4ge1xuICAgIGNvbnN0IGV4ZWN1dGlvbiA9IG5ldyBUYXNrRXhlY3V0aW9uKHRoaXMuZXhlY3V0aW9uU2lnbmFsLCB0aGlzLiN0YXNrcywgXCJmYWlsLWZhc3RcIilcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVUYXNrR3JhcGg8QWxsVmFsdWU8VD4gfCBDPihleGVjdXRpb24sIHtcbiAgICAgIG1hcEZhaWx1cmU6IChlcnJvcikgPT4gdGhpcy4jbWFwRmFpbHVyZShleGVjdXRpb24sIGVycm9yKSxcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgI21hcEZhaWx1cmUoXG4gICAgZXhlY3V0aW9uOiBUYXNrRXhlY3V0aW9uPFQsIFwiZmFpbC1mYXN0XCI+LFxuICAgIGVycm9yOiB1bmtub3duXG4gICk6IFByb21pc2U8VGFza0dyYXBoRmFpbHVyZU91dGNvbWU8QWxsVmFsdWU8VD4gfCBDPj4ge1xuICAgIGNvbnN0IGNvbnRyb2xBZnRlckZhaWx1cmUgPSB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoZXJyb3IpXG4gICAgY29uc3QgY2F0Y2hGbiA9IHRoaXMuI29wdGlvbnM/LmNhdGNoXG5cbiAgICBpZiAoY29udHJvbEFmdGVyRmFpbHVyZSkge1xuICAgICAgcmV0dXJuIHsgdGhyb3duOiBjb250cm9sQWZ0ZXJGYWlsdXJlIH1cbiAgICB9XG5cbiAgICBpZiAoIWNhdGNoRm4pIHtcbiAgICAgIHJldHVybiB7IHRocm93bjogZXJyb3IgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICBmYWlsZWRUYXNrOiBleGVjdXRpb24uZmFpbGVkVGFzayxcbiAgICAgIHBhcnRpYWw6IGV4ZWN1dGlvbi5yZXR1cm5WYWx1ZSBhcyBQYXJ0aWFsPEFsbFZhbHVlPFQ+PixcbiAgICAgIHNpZ25hbDogZXhlY3V0aW9uLnNpZ25hbCxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbWFwcGVkID0gY2F0Y2hGbihlcnJvciwgY29udGV4dClcblxuICAgICAgaWYgKCFjaGVja0lzUHJvbWlzZUxpa2UobWFwcGVkKSkge1xuICAgICAgICByZXR1cm4geyBtYXBwZWQgfVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYWNlZCA9IChhd2FpdCB0aGlzLnJhY2VXaXRoQ2FuY2VsbGF0aW9uKFxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZShtYXBwZWQpLmNhdGNoKChjYXRjaEVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2F0Y2hFcnJvciBpbnN0YW5jZW9mIENhbmNlbGxhdGlvbkVycm9yKSB7XG4gICAgICAgICAgICAgIHRocm93IGNhdGNoRXJyb3JcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IFBhbmljKFwiQUxMX0NBVENIX0hBTkRMRVJfUkVKRUNUXCIsIHsgY2F1c2U6IGNhdGNoRXJyb3IgfSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBlcnJvclxuICAgICAgICApKSBhcyBDXG5cbiAgICAgICAgcmV0dXJuIHsgbWFwcGVkOiByYWNlZCB9XG4gICAgICB9IGNhdGNoIChtYXBwZWRFcnJvcikge1xuICAgICAgICByZXR1cm4geyB0aHJvd246IG1hcHBlZEVycm9yIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChjYXRjaEVycm9yKSB7XG4gICAgICByZXR1cm4geyB0aHJvd246IG5ldyBQYW5pYyhcIkFMTF9DQVRDSF9IQU5ETEVSX1RIUk9XXCIsIHsgY2F1c2U6IGNhdGNoRXJyb3IgfSkgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFsbDxUIGV4dGVuZHMgVGFza1JlY29yZCwgQyA9IG5ldmVyPihcbiAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICB0YXNrczogVCAmIFRhc2tWYWxpZGF0aW9uPE5vSW5mZXI8VD4+ICYgVGhpc1R5cGU8SW5mZXJyZWRUYXNrQ29udGV4dDxUPj4sXG4gIG9wdGlvbnM/OiBBbGxPcHRpb25zPFQsIEM+XG4pOiBQcm9taXNlPHsgW0sgaW4ga2V5b2YgVF06IFRhc2tSZXN1bHQ8VFtLXT4gfSB8IEM+IHtcbiAgdXNpbmcgZXhlY3V0aW9uID0gbmV3IEFsbEV4ZWN1dGlvbihjb25maWcsIHRhc2tzLCBvcHRpb25zKVxuICByZXR1cm4gYXdhaXQgZXhlY3V0aW9uLmV4ZWN1dGUoKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEJ1aWxkZXJDb25maWcgfSBmcm9tIFwiLi4vYnVpbGRlclwiXG5pbXBvcnQgdHlwZSB7IEFsbFNldHRsZWRSZXN1bHQsIEluZmVycmVkVGFza0NvbnRleHQsIFRhc2tSZWNvcmQsIFRhc2tWYWxpZGF0aW9uIH0gZnJvbSBcIi4vc2hhcmVkXCJcbmltcG9ydCB7IE9yY2hlc3RyYXRpb25FeGVjdXRpb24sIFRhc2tFeGVjdXRpb24gfSBmcm9tIFwiLi9zaGFyZWRcIlxuXG5jbGFzcyBBbGxTZXR0bGVkRXhlY3V0aW9uPFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiBleHRlbmRzIE9yY2hlc3RyYXRpb25FeGVjdXRpb248XG4gIEFsbFNldHRsZWRSZXN1bHQ8VD5cbj4ge1xuICByZWFkb25seSAjdGFza3M6IFRcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEJ1aWxkZXJDb25maWcsIHRhc2tzOiBUKSB7XG4gICAgc3VwZXIoY29uZmlnKVxuICAgIHRoaXMuI3Rhc2tzID0gdGFza3NcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBleGVjdXRlVGFza3MoKTogUHJvbWlzZTxBbGxTZXR0bGVkUmVzdWx0PFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVRhc2tHcmFwaChuZXcgVGFza0V4ZWN1dGlvbih0aGlzLmV4ZWN1dGlvblNpZ25hbCwgdGhpcy4jdGFza3MsIFwic2V0dGxlZFwiKSwge1xuICAgICAgd2FpdEZvclRhc2tzVG9TZXR0bGU6IGZhbHNlLFxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBbGxTZXR0bGVkPFQgZXh0ZW5kcyBUYXNrUmVjb3JkPihcbiAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICB0YXNrczogVCAmIFRhc2tWYWxpZGF0aW9uPE5vSW5mZXI8VD4+ICYgVGhpc1R5cGU8SW5mZXJyZWRUYXNrQ29udGV4dDxUPj5cbik6IFByb21pc2U8QWxsU2V0dGxlZFJlc3VsdDxUPj4ge1xuICB1c2luZyBleGVjdXRpb24gPSBuZXcgQWxsU2V0dGxlZEV4ZWN1dGlvbihjb25maWcsIHRhc2tzKVxuICByZXR1cm4gYXdhaXQgZXhlY3V0aW9uLmV4ZWN1dGUoKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEJ1aWxkZXJDb25maWcgfSBmcm9tIFwiLi4vYnVpbGRlclwiXG5pbXBvcnQgdHlwZSB7XG4gIEluZmVycmVkVGFza0NvbnRleHQsXG4gIFJlc3VsdFByb3h5LFxuICBUYXNrQ29udGV4dCxcbiAgVGFza1JlY29yZCxcbiAgVGFza1Jlc3VsdCxcbn0gZnJvbSBcIi4vc2hhcmVkXCJcbmltcG9ydCB7IFBhbmljIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyBPcmNoZXN0cmF0aW9uRXhlY3V0aW9uLCBUYXNrR3JhcGhFeGVjdXRpb25CYXNlIH0gZnJvbSBcIi4vc2hhcmVkXCJcblxuZGVjbGFyZSBjb25zdCBGTE9XX0VYSVRfQlJBTkQ6IHVuaXF1ZSBzeW1ib2xcblxuZXhwb3J0IHR5cGUgRmxvd0V4aXQ8VD4gPSB7XG4gIHJlYWRvbmx5IFtGTE9XX0VYSVRfQlJBTkRdOiBUXG59XG5cbnR5cGUgRXhpdFZhbHVlPFQ+ID0gVCBleHRlbmRzIEZsb3dFeGl0PGluZmVyIFY+ID8gViA6IG5ldmVyXG5cbnR5cGUgRmxvd0V4aXRWYWx1ZTxUIGV4dGVuZHMgVGFza1JlY29yZD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBFeGl0VmFsdWU8VGFza1Jlc3VsdDxUW0tdPj5cbn1ba2V5b2YgVF1cblxuaW50ZXJmYWNlIEZsb3dUYXNrQ29udGV4dDxUIGV4dGVuZHMgVGFza1JlY29yZD4gZXh0ZW5kcyBUYXNrQ29udGV4dDxUPiB7XG4gICRleGl0PFY+KHZhbHVlOiBWKTogRmxvd0V4aXQ8Vj5cbn1cblxuZXhwb3J0IHR5cGUgSW5mZXJyZWRGbG93VGFza0NvbnRleHQ8VCBleHRlbmRzIFRhc2tSZWNvcmQ+ID0gSW5mZXJyZWRUYXNrQ29udGV4dDxUPiAmIHtcbiAgJGV4aXQ8Vj4odmFsdWU6IFYpOiBGbG93RXhpdDxWPlxufVxuXG5leHBvcnQgdHlwZSBGbG93UmVzdWx0PFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiA9IEZsb3dFeGl0VmFsdWU8VD5cblxuY2xhc3MgRmxvd0V4aXRTaWduYWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd25cblxuICBjb25zdHJ1Y3Rvcih2YWx1ZTogdW5rbm93bikge1xuICAgIHN1cGVyKFwiRmxvdyBleGl0ZWRcIilcbiAgICB0aGlzLm5hbWUgPSBcIkZsb3dFeGl0U2lnbmFsRXJyb3JcIlxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICB9XG59XG5cbmNsYXNzIEZsb3dFeGVjdXRpb248VCBleHRlbmRzIFRhc2tSZWNvcmQ+IGV4dGVuZHMgVGFza0dyYXBoRXhlY3V0aW9uQmFzZTxULCBGbG93VGFza0NvbnRleHQ8VD4+IHtcbiAgI2ZpcnN0UmVqZWN0aW9uV2FpdGVyczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXVxuICAjc2V0dGxlZFByb21pc2U6IFByb21pc2U8QXJyYXk8UHJvbWlzZVNldHRsZWRSZXN1bHQ8dm9pZD4+PiB8IHVuZGVmaW5lZFxuXG4gIGFzeW5jIGV4ZWN1dGUoKTogUHJvbWlzZTxGbG93UmVzdWx0PFQ+PiB7XG4gICAgY29uc3QgcHJvbWlzZXMgPSB0aGlzLnRhc2tOYW1lcy5tYXAoYXN5bmMgKG5hbWUpID0+IHRoaXMucnVuVGFzayhuYW1lKSlcbiAgICB0aGlzLiNzZXR0bGVkUHJvbWlzZSA9IFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcylcblxuICAgIC8vIEEgZmxvdyB0ZXJtaW5hdGVzIG9uIHRoZSBmaXJzdCBleGl0IG9yIGVycm9yLCBidXQgUHJvbWlzZS5hbGxTZXR0bGVkKClcbiAgICAvLyBuZXZlciByZWplY3RzLCBzbyBpdCBjYW5ub3Qgc2lnbmFsIHRoYXQgZWFybHkgY29tcGxldGlvbiBvbiBpdHMgb3duLlxuICAgIC8vIFJhY2luZyBpdCBhZ2FpbnN0IGEgbWFudWFsIGZpcnN0LXJlamVjdGlvbiB3YWl0ZXIgbGV0cyBleGVjdXRlKCkgcmVhY3QgdG9cbiAgICAvLyB0aGUgZmlyc3QgJGV4aXQvZXJyb3IgaW1tZWRpYXRlbHksIHdoaWxlICNzZXR0bGVkUHJvbWlzZSBpcyByZXRhaW5lZCBzb1xuICAgIC8vIHRoZSBvcmNoZXN0cmF0aW9uIGxheWVyIGNhbiBzdGlsbCBhd2FpdCBmdWxsIHRhc2sgdGVhcmRvd24gYWZ0ZXJ3YXJkcy5cbiAgICBhd2FpdCBQcm9taXNlLnJhY2UoW3RoaXMuI3NldHRsZWRQcm9taXNlLCB0aGlzLndhaXRGb3JGaXJzdFJlamVjdGlvbigpXSlcblxuICAgIGlmICh0aGlzLmZpcnN0UmVqZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLmZpcnN0UmVqZWN0aW9uIGluc3RhbmNlb2YgRmxvd0V4aXRTaWduYWxFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5maXJzdFJlamVjdGlvbi52YWx1ZSBhcyBGbG93UmVzdWx0PFQ+XG4gICAgICB9XG5cbiAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L29ubHktdGhyb3ctZXJyb3IgLS0gUHJlc2VydmUgcmF3IHRhc2sgZmFpbHVyZXMgZm9yIGNhbGxlcnMvdGVzdHMuXG4gICAgICB0aHJvdyB0aGlzLmZpcnN0UmVqZWN0aW9uXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFBhbmljKFwiRkxPV19OT19FWElUXCIpXG4gIH1cblxuICBhc3luYyB3YWl0Rm9yVGFza3NUb1NldHRsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLiNzZXR0bGVkUHJvbWlzZVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNldEZpcnN0UmVqZWN0aW9uKGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmlyc3RSZWplY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gU3RvcmUgdGhlIG1hcHBlZCByZWplY3Rpb24gc28gYGZpcnN0UmVqZWN0aW9uYCBpcyBhbHdheXMgYSBub24tdW5kZWZpbmVkXG4gICAgLy8gdmFsdWUgb25jZSBzZXQuIFRoaXMga2VlcHMgYGZpcnN0UmVqZWN0aW9uICE9PSB1bmRlZmluZWRgIGEgc291bmQgc2lnbmFsXG4gICAgLy8gZXZlbiB3aGVuIGEgdGFzayB0aHJvd3MgYHVuZGVmaW5lZGAsIHdoaWNoIG1hcHMgdG8gYW4gVW5oYW5kbGVkRXhjZXB0aW9uLlxuICAgIHN1cGVyLnNldEZpcnN0UmVqZWN0aW9uKHRoaXMubWFwU3RvcmVkRXJyb3IoZXJyb3IpKVxuXG4gICAgZm9yIChjb25zdCByZXNvbHZlIG9mIHRoaXMuI2ZpcnN0UmVqZWN0aW9uV2FpdGVycykge1xuICAgICAgcmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgdGhpcy4jZmlyc3RSZWplY3Rpb25XYWl0ZXJzID0gW11cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVUYXNrQ29udGV4dChyZXN1bHRQcm94eTogUmVzdWx0UHJveHk8VD4pOiBGbG93VGFza0NvbnRleHQ8VD4ge1xuICAgIHJldHVybiB7XG4gICAgICAkZGlzcG9zZXI6IHRoaXMuZGlzcG9zZXIsXG4gICAgICAkZXhpdDogKHZhbHVlKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBGbG93RXhpdFNpZ25hbEVycm9yKHZhbHVlKVxuICAgICAgfSxcbiAgICAgICRyZXN1bHQ6IHJlc3VsdFByb3h5LFxuICAgICAgJHNpZ25hbDogdGhpcy50YXNrU2lnbmFsLFxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBtYXBTdG9yZWRFcnJvcihlcnJvcjogdW5rbm93bik6IEVycm9yIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGbG93RXhpdFNpZ25hbEVycm9yKSB7XG4gICAgICByZXR1cm4gZXJyb3JcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIubWFwU3RvcmVkRXJyb3IoZXJyb3IpXG4gIH1cblxuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAtLSBwb2x5bW9ycGhpYyBvdmVycmlkZVxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2hvdWxkQWJvcnRPblRhc2tFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcHJpdmF0ZSB3YWl0Rm9yRmlyc3RSZWplY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZmlyc3RSZWplY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLiNmaXJzdFJlamVjdGlvbldhaXRlcnMucHVzaChyZXNvbHZlKVxuICAgIH0pXG4gIH1cbn1cblxuY2xhc3MgRmxvd1J1bm5lckV4ZWN1dGlvbjxUIGV4dGVuZHMgVGFza1JlY29yZD4gZXh0ZW5kcyBPcmNoZXN0cmF0aW9uRXhlY3V0aW9uPEZsb3dSZXN1bHQ8VD4+IHtcbiAgcmVhZG9ubHkgI3Rhc2tzOiBUXG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBCdWlsZGVyQ29uZmlnLCB0YXNrczogVCkge1xuICAgIHN1cGVyKGNvbmZpZylcbiAgICB0aGlzLiN0YXNrcyA9IHRhc2tzXG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZXhlY3V0ZVRhc2tzKCk6IFByb21pc2U8Rmxvd1Jlc3VsdDxUPj4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVUYXNrR3JhcGgobmV3IEZsb3dFeGVjdXRpb24odGhpcy5leGVjdXRpb25TaWduYWwsIHRoaXMuI3Rhc2tzKSlcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUZsb3c8VCBleHRlbmRzIFRhc2tSZWNvcmQ+KFxuICBjb25maWc6IEJ1aWxkZXJDb25maWcsXG4gIHRhc2tzOiBUICYgVGhpc1R5cGU8SW5mZXJyZWRGbG93VGFza0NvbnRleHQ8VD4+XG4pOiBQcm9taXNlPEZsb3dSZXN1bHQ8VD4+IHtcbiAgdXNpbmcgZXhlY3V0aW9uID0gbmV3IEZsb3dSdW5uZXJFeGVjdXRpb24oY29uZmlnLCB0YXNrcylcbiAgcmV0dXJuIGF3YWl0IGV4ZWN1dGlvbi5leGVjdXRlKClcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBCdWlsZGVyQ29uZmlnIH0gZnJvbSBcIi4uL2J1aWxkZXJcIlxuaW1wb3J0IHR5cGUgeyBCYXNlVHJ5Q3R4LCBOb25Qcm9taXNlIH0gZnJvbSBcIi4vc2hhcmVkXCJcbmltcG9ydCB7IFBhbmljLCB0eXBlIFVuaGFuZGxlZEV4Y2VwdGlvbiB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHsgY2hlY2tJc1Byb21pc2VMaWtlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IEJhc2VFeGVjdXRpb24sIFJldHJ5RGlyZWN0aXZlLCB0eXBlIFJldHJ5RGVjaXNpb24sIHR5cGUgUnVubmVyRXJyb3IgfSBmcm9tIFwiLi9iYXNlXCJcblxuZXhwb3J0IHR5cGUgUnVuVHJ5Rm48VCwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eCA9IEJhc2VUcnlDdHg+ID0gKFxuICBjdHg6IEN0eFxuKSA9PiBOb25Qcm9taXNlPFQ+IHwgUHJvbWlzZTxUPlxuXG50eXBlIFJ1bkNhdGNoRm48RT4gPSAoZXJyb3I6IHVua25vd24pID0+IE5vblByb21pc2U8RT4gfCBQcm9taXNlPEU+XG5cbmludGVyZmFjZSBSdW5Bc3luY09wdGlvbnM8VCwgRSwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eCA9IEJhc2VUcnlDdHg+IHtcbiAgdHJ5OiBSdW5UcnlGbjxULCBDdHg+XG4gIC8qKlxuICAgKiBNYXBzIGVycm9ycyB0aGF0IG9yaWdpbmF0ZWQgaW5zaWRlIGB0cnlgIOKAlCB0aHJvd24gZGlyZWN0bHksIG9yIGNhcnJpZWQgb3V0IG9mIHRoZSByZXRyeSBsb29wIGFzXG4gICAqIHRoZSBsYXN0IGF0dGVtcHQncyBlcnJvciBvbmNlIHRoZSByZXRyeSBwb2xpY3kgZ2l2ZXMgdXAuIFBvbGljeSBvdXRjb21lcyAodGltZW91dCxcbiAgICogY2FuY2VsbGF0aW9uKSBhbmQgZGVmZWN0cyAoYFBhbmljYCkgbmV2ZXIgcGFzcyB0aHJvdWdoIGBjYXRjaGA6IHRoZXkgYXJlIHJlcG9ydGVkIGRpcmVjdGx5LFxuICAgKiBldmVuIHdoZW4gdGhleSBmaXJlIHdoaWxlIHRoZSBoYW5kbGVyIGlzIHJ1bm5pbmcuXG4gICAqL1xuICBjYXRjaDogUnVuQ2F0Y2hGbjxFPlxufVxuXG5leHBvcnQgdHlwZSBBc3luY1J1bklucHV0PFQsIEUsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHggPSBCYXNlVHJ5Q3R4PiA9XG4gIHwgUnVuVHJ5Rm48VCwgQ3R4PlxuICB8IFJ1bkFzeW5jT3B0aW9uczxULCBFLCBDdHg+XG5cbi8qKlxuICogRW5jYXBzdWxhdGVzIHRoZSBzaGFyZWQgbXV0YWJsZSBzdGF0ZSBhbmQgbG9naWMgZm9yIGEgc2luZ2xlIHJ1biBleGVjdXRpb24uXG4gKi9cbmNsYXNzIFJ1bkV4ZWN1dGlvbjxULCBFLCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4PiBleHRlbmRzIEJhc2VFeGVjdXRpb248XG4gIFByb21pc2U8VCB8IEUgfCBSdW5uZXJFcnJvcj5cbj4ge1xuICAjY2F0Y2hGbjogUnVuQ2F0Y2hGbjxFPiB8IHVuZGVmaW5lZFxuICAjdHJ5Rm46IFJ1blRyeUZuPFQsIEN0eD5cblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEJ1aWxkZXJDb25maWcsIGlucHV0OiBBc3luY1J1bklucHV0PFQsIEUsIEN0eD4pIHtcbiAgICBzdXBlcihjb25maWcpXG5cbiAgICB0aGlzLiNjYXRjaEZuID0gdHlwZW9mIGlucHV0ID09PSBcImZ1bmN0aW9uXCIgPyB1bmRlZmluZWQgOiBpbnB1dC5jYXRjaFxuICAgIHRoaXMuI3RyeUZuID0gdHlwZW9mIGlucHV0ID09PSBcImZ1bmN0aW9uXCIgPyBpbnB1dCA6IGlucHV0LnRyeVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGV4ZWN1dGVDb3JlKCk6IFByb21pc2U8VCB8IEUgfCBSdW5uZXJFcnJvcj4ge1xuICAgIHJldHVybiB0aGlzLiNydW5BdHRlbXB0TG9vcCgxKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gYXR0ZW1wdCBlcnJvciBpbnRvIGVpdGhlciBhIHRlcm1pbmFsIHJlc3VsdCBvciBhIHJldHJ5IGRlY2lzaW9uLlxuICAgKi9cbiAgYXN5bmMgI3Jlc29sdmVGYWlsdXJlKGVycm9yOiB1bmtub3duKTogUHJvbWlzZTxFIHwgUnVubmVyRXJyb3IgfCBSZXRyeURpcmVjdGl2ZT4ge1xuICAgIGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlQ29udHJvbE9yUmV0cnkoZXJyb3IpXG5cbiAgICBpZiAocmVzb2x2ZWQpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZFxuICAgIH1cblxuICAgIGNvbnN0IGNhdGNoRm4gPSB0aGlzLiNjYXRjaEZuXG5cbiAgICBpZiAoIWNhdGNoRm4pIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVVbm1hcHBlZEZhaWx1cmUoZXJyb3IpXG4gICAgfVxuXG4gICAgbGV0IG1hcHBlZDogRSB8IFByb21pc2U8RT5cblxuICAgIHRyeSB7XG4gICAgICBtYXBwZWQgPSBjYXRjaEZuKGVycm9yKVxuICAgIH0gY2F0Y2ggKGNhdGNoRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBQYW5pYyhcIlJVTl9DQVRDSF9IQU5ETEVSX1RIUk9XXCIsIHsgY2F1c2U6IGNhdGNoRXJyb3IgfSlcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKG1hcHBlZCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJhY2UobWFwcGVkLCBlcnJvcilcbiAgICAgIH0gY2F0Y2ggKGNhdGNoRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbmljKFwiUlVOX0NBVENIX0hBTkRMRVJfUkVKRUNUXCIsIHsgY2F1c2U6IGNhdGNoRXJyb3IgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb250cm9sIHN0YXRlIGNhbiBjaGFuZ2Ugd2hpbGUgdGhlIGNhdGNoIGhhbmRsZXIgcnVucywgc28gY2hlY2sgYWdhaW5cbiAgICAvLyBiZWZvcmUgcmV0dXJuaW5nIGEgbWFwcGVkIHN5bmMgdmFsdWUuXG4gICAgY29uc3QgY2F0Y2hDb250cm9sRXJyb3IgPSB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoZXJyb3IpXG5cbiAgICBpZiAoY2F0Y2hDb250cm9sRXJyb3IpIHtcbiAgICAgIHJldHVybiBjYXRjaENvbnRyb2xFcnJvclxuICAgIH1cblxuICAgIHJldHVybiBtYXBwZWRcbiAgfVxuXG4gIGFzeW5jICNydW5BdHRlbXB0TG9vcChhdHRlbXB0OiBudW1iZXIpOiBQcm9taXNlPFQgfCBFIHwgUnVubmVyRXJyb3I+IHtcbiAgICBsZXQgY3VycmVudEF0dGVtcHQgPSBhdHRlbXB0XG4gICAgbGV0IGN1cnJlbnREZWNpc2lvbjogUmV0cnlEZWNpc2lvbiB8IHVuZGVmaW5lZFxuXG4gICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xCZWZvcmVBdHRlbXB0ID0gdGhpcy5jaGVja0RpZENvbnRyb2xGYWlsKClcblxuICAgICAgaWYgKGNvbnRyb2xCZWZvcmVBdHRlbXB0KSB7XG4gICAgICAgIHJldHVybiBjb250cm9sQmVmb3JlQXR0ZW1wdFxuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudERlY2lzaW9uKSB7XG4gICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgIGNvbnN0IGRlbGF5Q29udHJvbFJlc3VsdCA9IGF3YWl0IHRoaXMud2FpdEZvclJldHJ5RGVsYXkoY3VycmVudERlY2lzaW9uLmRlbGF5KVxuXG4gICAgICAgIGlmIChkZWxheUNvbnRyb2xSZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gZGVsYXlDb250cm9sUmVzdWx0XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5jdHgucmV0cnkuYXR0ZW1wdCA9IGN1cnJlbnRBdHRlbXB0XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3RyeUZuKHRoaXMuY3R4IGFzIHVua25vd24gYXMgQ3R4KVxuXG4gICAgICAgIGlmIChjaGVja0lzUHJvbWlzZUxpa2UocmVzdWx0KSkge1xuICAgICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgICAgY29uc3QgcmFjZWQgPSBhd2FpdCB0aGlzLnJhY2UocmVzdWx0KVxuICAgICAgICAgIHJldHVybiByYWNlZFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZVN5bmNTdWNjZXNzKHJlc3VsdClcbiAgICAgIH0gY2F0Y2ggKGF0dGVtcHRFcnJvcikge1xuICAgICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHRoaXMuI3Jlc29sdmVGYWlsdXJlKGF0dGVtcHRFcnJvcilcblxuICAgICAgICBpZiAoIShyZXNvbHZlZCBpbnN0YW5jZW9mIFJldHJ5RGlyZWN0aXZlKSkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlZFxuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudERlY2lzaW9uID0gcmVzb2x2ZWQuZGVjaXNpb25cbiAgICAgICAgY3VycmVudEF0dGVtcHQgKz0gMVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZVJ1bjxULCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4PihcbiAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICBpbnB1dDogUnVuVHJ5Rm48VCwgQ3R4PlxuKTogUHJvbWlzZTxUIHwgVW5oYW5kbGVkRXhjZXB0aW9uPlxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVSdW48VCwgRSwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eD4oXG4gIGNvbmZpZzogQnVpbGRlckNvbmZpZyxcbiAgaW5wdXQ6IEFzeW5jUnVuSW5wdXQ8VCwgRSwgQ3R4PlxuKTogUHJvbWlzZTxUIHwgRSB8IFJ1bm5lckVycm9yPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVSdW48VCwgRSwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eD4oXG4gIGNvbmZpZzogQnVpbGRlckNvbmZpZyxcbiAgaW5wdXQ6IEFzeW5jUnVuSW5wdXQ8VCwgRSwgQ3R4PlxuKTogUHJvbWlzZTxUIHwgRSB8IFJ1bm5lckVycm9yPiB7XG4gIHVzaW5nIGV4ZWN1dGlvbiA9IG5ldyBSdW5FeGVjdXRpb248VCwgRSwgQ3R4Pihjb25maWcsIGlucHV0KVxuICByZXR1cm4gYXdhaXQgZXhlY3V0aW9uLmV4ZWN1dGUoKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEJ1aWxkZXJDb25maWcgfSBmcm9tIFwiLi4vYnVpbGRlclwiXG5pbXBvcnQgdHlwZSB7IFJ1bm5lckVycm9yIH0gZnJvbSBcIi4vYmFzZVwiXG5pbXBvcnQgdHlwZSB7IEJhc2VUcnlDdHgsIE5vblByb21pc2UgfSBmcm9tIFwiLi9zaGFyZWRcIlxuaW1wb3J0IHsgUGFuaWMsIHR5cGUgUGFuaWNDb2RlLCB0eXBlIFVuaGFuZGxlZEV4Y2VwdGlvbiB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHsgY2hlY2tJc1Byb21pc2VMaWtlLCBpbnZhcmlhbnQgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgQmFzZUV4ZWN1dGlvbiwgUmV0cnlEaXJlY3RpdmUgfSBmcm9tIFwiLi9iYXNlXCJcblxuZXhwb3J0IHR5cGUgU3luY1J1blRyeUZuPFQsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHggPSBCYXNlVHJ5Q3R4PiA9IChjdHg6IEN0eCkgPT4gTm9uUHJvbWlzZTxUPlxuZXhwb3J0IHR5cGUgU3luY1J1bkNhdGNoRm48RT4gPSAoZXJyb3I6IHVua25vd24pID0+IE5vblByb21pc2U8RT5cblxuZXhwb3J0IGludGVyZmFjZSBTeW5jUnVuT3B0aW9uczxULCBFLCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4ID0gQmFzZVRyeUN0eD4ge1xuICB0cnk6IFN5bmNSdW5UcnlGbjxULCBDdHg+XG4gIC8qKlxuICAgKiBNYXBzIGVycm9ycyB0aGF0IG9yaWdpbmF0ZWQgaW5zaWRlIGB0cnlgIOKAlCB0aHJvd24gZGlyZWN0bHksIG9yIGNhcnJpZWQgb3V0IG9mIHRoZSByZXRyeSBsb29wIGFzXG4gICAqIHRoZSBsYXN0IGF0dGVtcHQncyBlcnJvciBvbmNlIHRoZSByZXRyeSBwb2xpY3kgZ2l2ZXMgdXAuIFBvbGljeSBvdXRjb21lcyAodGltZW91dCxcbiAgICogY2FuY2VsbGF0aW9uKSBhbmQgZGVmZWN0cyAoYFBhbmljYCkgbmV2ZXIgcGFzcyB0aHJvdWdoIGBjYXRjaGA6IHRoZXkgYXJlIHJlcG9ydGVkIGRpcmVjdGx5LFxuICAgKiBldmVuIHdoZW4gdGhleSBmaXJlIHdoaWxlIHRoZSBoYW5kbGVyIGlzIHJ1bm5pbmcuXG4gICAqL1xuICBjYXRjaDogU3luY1J1bkNhdGNoRm48RT5cbn1cblxuZXhwb3J0IHR5cGUgU3luY1J1bklucHV0PFQsIEUsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHggPSBCYXNlVHJ5Q3R4PiA9XG4gIHwgU3luY1J1blRyeUZuPFQsIEN0eD5cbiAgfCBTeW5jUnVuT3B0aW9uczxULCBFLCBDdHg+XG5cbmZ1bmN0aW9uIGFzc2VydE5vdFByb21pc2VMaWtlKHZhbHVlOiB1bmtub3duLCBjb2RlOiBQYW5pY0NvZGUsIG1lc3NhZ2U/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaW52YXJpYW50KFxuICAgICFjaGVja0lzUHJvbWlzZUxpa2UodmFsdWUpLFxuICAgIG5ldyBQYW5pYyhjb2RlLCBtZXNzYWdlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IG1lc3NhZ2UgfSlcbiAgKVxufVxuXG5jbGFzcyBSdW5TeW5jRXhlY3V0aW9uPFQsIEUsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHg+IGV4dGVuZHMgQmFzZUV4ZWN1dGlvbjxUIHwgRSB8IFJ1bm5lckVycm9yPiB7XG4gICNjYXRjaEZuOiBTeW5jUnVuQ2F0Y2hGbjxFPiB8IHVuZGVmaW5lZFxuICAjdHJ5Rm46IFN5bmNSdW5UcnlGbjxULCBDdHg+XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBCdWlsZGVyQ29uZmlnLCBpbnB1dDogU3luY1J1bklucHV0PFQsIEUsIEN0eD4pIHtcbiAgICBzdXBlcihjb25maWcpXG5cbiAgICB0aGlzLiNjYXRjaEZuID0gdHlwZW9mIGlucHV0ID09PSBcImZ1bmN0aW9uXCIgPyB1bmRlZmluZWQgOiBpbnB1dC5jYXRjaFxuICAgIHRoaXMuI3RyeUZuID0gdHlwZW9mIGlucHV0ID09PSBcImZ1bmN0aW9uXCIgPyBpbnB1dCA6IGlucHV0LnRyeVxuICB9XG5cbiAgb3ZlcnJpZGUgZXhlY3V0ZSgpOiBUIHwgRSB8IFJ1bm5lckVycm9yIHtcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci5leGVjdXRlKClcbiAgICBhc3NlcnROb3RQcm9taXNlTGlrZShyZXN1bHQsIFwiUlVOX1NZTkNfV1JBUFBFRF9SRVNVTFRfUFJPTUlTRVwiKVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBleGVjdXRlQ29yZSgpOiBUIHwgRSB8IFJ1bm5lckVycm9yIHtcbiAgICByZXR1cm4gdGhpcy4jcnVuQXR0ZW1wdExvb3AoMSlcbiAgfVxuXG4gICNyZXNvbHZlRmFpbHVyZShlcnJvcjogdW5rbm93bik6IEUgfCBSdW5uZXJFcnJvciB8IFJldHJ5RGlyZWN0aXZlIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZUNvbnRyb2xPclJldHJ5KGVycm9yKVxuXG4gICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRcbiAgICB9XG5cbiAgICBjb25zdCBjYXRjaEZuID0gdGhpcy4jY2F0Y2hGblxuXG4gICAgaWYgKCFjYXRjaEZuKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlVW5tYXBwZWRGYWlsdXJlKGVycm9yKVxuICAgIH1cblxuICAgIGxldCBtYXBwZWQ6IEVcblxuICAgIHRyeSB7XG4gICAgICBtYXBwZWQgPSBjYXRjaEZuKGVycm9yKVxuICAgIH0gY2F0Y2ggKGNhdGNoRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBQYW5pYyhcIlJVTl9TWU5DX0NBVENIX0hBTkRMRVJfVEhST1dcIiwgeyBjYXVzZTogY2F0Y2hFcnJvciB9KVxuICAgIH1cblxuICAgIGFzc2VydE5vdFByb21pc2VMaWtlKG1hcHBlZCwgXCJSVU5fU1lOQ19DQVRDSF9QUk9NSVNFXCIpXG5cbiAgICAvLyBDb250cm9sIHN0YXRlIGNhbiBjaGFuZ2Ugd2hpbGUgdGhlIGNhdGNoIGhhbmRsZXIgcnVucywgc28gY2hlY2sgYWdhaW5cbiAgICAvLyBiZWZvcmUgcmV0dXJuaW5nIGEgbWFwcGVkIHN5bmMgdmFsdWUuXG4gICAgY29uc3QgY2F0Y2hDb250cm9sRXJyb3IgPSB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoZXJyb3IpXG5cbiAgICBpZiAoY2F0Y2hDb250cm9sRXJyb3IpIHtcbiAgICAgIHJldHVybiBjYXRjaENvbnRyb2xFcnJvclxuICAgIH1cblxuICAgIHJldHVybiBtYXBwZWRcbiAgfVxuXG4gICNydW5BdHRlbXB0TG9vcChhdHRlbXB0OiBudW1iZXIpOiBUIHwgRSB8IFJ1bm5lckVycm9yIHtcbiAgICBsZXQgY3VycmVudEF0dGVtcHQgPSBhdHRlbXB0XG5cbiAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgY29udHJvbEJlZm9yZUF0dGVtcHQgPSB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoKVxuXG4gICAgICBpZiAoY29udHJvbEJlZm9yZUF0dGVtcHQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xCZWZvcmVBdHRlbXB0XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3R4LnJldHJ5LmF0dGVtcHQgPSBjdXJyZW50QXR0ZW1wdFxuXG4gICAgICBsZXQgcmVzdWx0OiBOb25Qcm9taXNlPFQ+XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuI3RyeUZuKHRoaXMuY3R4IGFzIHVua25vd24gYXMgQ3R4KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLiNyZXNvbHZlRmFpbHVyZShlcnJvcilcblxuICAgICAgICBpZiAocmVzb2x2ZWQgaW5zdGFuY2VvZiBSZXRyeURpcmVjdGl2ZSkge1xuICAgICAgICAgIGlmIChyZXNvbHZlZC5kZWNpc2lvbi5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYW5pYyhcIlJVTl9TWU5DX0FTWU5DX1JFVFJZX1BPTElDWVwiKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1cnJlbnRBdHRlbXB0ICs9IDFcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkXG4gICAgICB9XG5cbiAgICAgIGFzc2VydE5vdFByb21pc2VMaWtlKHJlc3VsdCwgXCJSVU5fU1lOQ19UUllfUFJPTUlTRVwiKVxuXG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlU3luY1N1Y2Nlc3MocmVzdWx0KVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZVJ1blN5bmM8VCwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eD4oXG4gIGNvbmZpZzogQnVpbGRlckNvbmZpZyxcbiAgaW5wdXQ6IFN5bmNSdW5UcnlGbjxULCBDdHg+XG4pOiBUIHwgVW5oYW5kbGVkRXhjZXB0aW9uIHwgUnVubmVyRXJyb3JcbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlUnVuU3luYzxULCBFLCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4PihcbiAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICBpbnB1dDogU3luY1J1bklucHV0PFQsIEUsIEN0eD5cbik6IFQgfCBFIHwgUnVubmVyRXJyb3JcbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlUnVuU3luYzxULCBFLCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4PihcbiAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICBpbnB1dDogU3luY1J1bklucHV0PFQsIEUsIEN0eD5cbik6IFQgfCBFIHwgUnVubmVyRXJyb3Ige1xuICAvLyBCdWlsZGVyIHR5cGluZyBibG9ja3MgYXN5bmMtb25seSByZXRyeSBwb2xpY2llcywgYnV0IGRpcmVjdCBleGVjdXRvciB1c2FnZSBhbmRcbiAgLy8gdW5zYWZlIGNhc3RzIHN0aWxsIG5lZWQgYSBydW50aW1lIGd1YXJkIGhlcmUuXG4gIGNvbnN0IGlzU3luY1NhZmVSZXRyeVBvbGljeSA9XG4gICAgY29uZmlnLnJldHJ5ID09PSB1bmRlZmluZWQgfHxcbiAgICAoY29uZmlnLnJldHJ5LmJhY2tvZmYgPT09IFwiY29uc3RhbnRcIiAmJlxuICAgICAgIWNvbmZpZy5yZXRyeS5qaXR0ZXIgJiZcbiAgICAgIChjb25maWcucmV0cnkuZGVsYXlNcyA/PyAwKSA8PSAwKVxuXG4gIGludmFyaWFudChpc1N5bmNTYWZlUmV0cnlQb2xpY3ksIG5ldyBQYW5pYyhcIlJVTl9TWU5DX0FTWU5DX1JFVFJZX1BPTElDWVwiKSlcblxuICB1c2luZyBleGVjdXRpb24gPSBuZXcgUnVuU3luY0V4ZWN1dGlvbjxULCBFLCBDdHg+KGNvbmZpZywgaW5wdXQpXG4gIHJldHVybiBleGVjdXRpb24uZXhlY3V0ZSgpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHtcbiAgQ2FuY2VsbGF0aW9uRXJyb3IsXG4gIFJldHJ5RXhoYXVzdGVkRXJyb3IsXG4gIFRpbWVvdXRFcnJvcixcbiAgVW5oYW5kbGVkRXhjZXB0aW9uLFxufSBmcm9tIFwiLi9lcnJvcnNcIlxuaW1wb3J0IHR5cGUge1xuICBJbmZlcnJlZFRhc2tDb250ZXh0LFxuICBUYXNrUmVjb3JkLFxuICBUYXNrUmVzdWx0LFxuICBUYXNrVmFsaWRhdGlvbixcbiAgQWxsT3B0aW9ucyxcbiAgQWxsU2V0dGxlZFJlc3VsdCxcbiAgVHJ5Q3R4LFxuICBUcnlDdHhGb3IsXG59IGZyb20gXCIuL2V4ZWN1dG9ycy9zaGFyZWRcIlxuaW1wb3J0IHR5cGUge1xuICBSZXRyeU9wdGlvbnMsXG4gIFJldHJ5UG9saWN5LFxuICBWYWxpZGF0ZVJldHJ5TGltaXQsXG4gIFZhbGlkYXRlUmV0cnlPcHRpb25zLFxufSBmcm9tIFwiLi9tb2RpZmllcnMvcmV0cnlcIlxuaW1wb3J0IHsgZXhlY3V0ZUFsbCB9IGZyb20gXCIuL2V4ZWN1dG9ycy9hbGxcIlxuaW1wb3J0IHsgZXhlY3V0ZUFsbFNldHRsZWQgfSBmcm9tIFwiLi9leGVjdXRvcnMvYWxsLXNldHRsZWRcIlxuaW1wb3J0IHsgZXhlY3V0ZUZsb3csIHR5cGUgRmxvd1Jlc3VsdCwgdHlwZSBJbmZlcnJlZEZsb3dUYXNrQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dG9ycy9mbG93XCJcbmltcG9ydCB7IGV4ZWN1dGVSdW4sIHR5cGUgQXN5bmNSdW5JbnB1dCwgdHlwZSBSdW5UcnlGbiB9IGZyb20gXCIuL2V4ZWN1dG9ycy9ydW5cIlxuaW1wb3J0IHsgZXhlY3V0ZVJ1blN5bmMsIHR5cGUgU3luY1J1bklucHV0LCB0eXBlIFN5bmNSdW5UcnlGbiB9IGZyb20gXCIuL2V4ZWN1dG9ycy9ydW4tc3luY1wiXG5pbXBvcnQgeyByZXRyeU9wdGlvbnMgfSBmcm9tIFwiLi9tb2RpZmllcnMvcmV0cnlcIlxuaW1wb3J0IHsgYXNzZXJ0VmFsaWRUaW1lb3V0IH0gZnJvbSBcIi4vbW9kaWZpZXJzL3RpbWVvdXRcIlxuXG4vKipcbiAqIFdyYXBzIGFyZSBvYnNlcnZhdGlvbmFsIGhvb2tzOiB0aGV5IGNhbiBpbnNwZWN0IGV4ZWN1dGlvbiBjb250ZXh0IGFuZCBzdXJyb3VuZCBleGVjdXRpb24sIGJ1dFxuICogdGhleSBtdXN0IG5vdCBtdXRhdGUgY29udGV4dCBvciByZXBsYWNlIGl0LlxuICovXG5leHBvcnQgdHlwZSBXcmFwQ3R4ID0gUmVhZG9ubHk8T21pdDxUcnlDdHgsIFwicmV0cnlcIj4+ICYge1xuICByZWFkb25seSByZXRyeTogUmVhZG9ubHk8VHJ5Q3R4W1wicmV0cnlcIl0+XG59XG5cbnR5cGUgV3JhcEZuID0gKGN0eDogV3JhcEN0eCwgbmV4dDogKCkgPT4gdW5rbm93bikgPT4gdW5rbm93blxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkZXJDb25maWcge1xuICAvKipcbiAgICogUmV0cnkgY29uZmlndXJhdGlvbiBhcHBsaWVkIHRvIHRoZSBydW4uXG4gICAqL1xuICByZXRyeT86IFJldHJ5UG9saWN5XG4gIC8qKlxuICAgKiBUaW1lb3V0IGNvbmZpZ3VyYXRpb24gYXBwbGllZCB0byB0aGUgcnVuLlxuICAgKi9cbiAgdGltZW91dD86IG51bWJlclxuICAvKipcbiAgICogQWJvcnQgc2lnbmFscyB1c2VkIHRvIGNhbmNlbCBleGVjdXRpb24uXG4gICAqL1xuICBzaWduYWxzPzogQWJvcnRTaWduYWxbXVxuICAvKipcbiAgICogV3JhcHBlciBtaWRkbGV3YXJlIGNoYWluIGFyb3VuZCBleGVjdXRpb24uXG4gICAqL1xuICB3cmFwcz86IFdyYXBGbltdXG59XG5cbnR5cGUgQ29uZmlnUnVuRXJyb3JzID0gVGltZW91dEVycm9yIHwgQ2FuY2VsbGF0aW9uRXJyb3Jcbi8qKlxuICogVGhlIGZhaWx1cmUgdHlwZSBmb3IgdHJ5IGZ1bmN0aW9ucyB3aXRob3V0IGEgY2F0Y2ggaGFuZGxlci4gV2l0aCByZXRyeSBjb25maWd1cmVkLCBhbnkgZ2l2ZS11cFxuICogKGxpbWl0IGV4aGF1c3RlZCBvciBgc2hvdWxkUmV0cnlgIGRlY2xpbmluZykgaXMgcmVwb3J0ZWQgYXMge0BsaW5rIFJldHJ5RXhoYXVzdGVkRXJyb3J9IGNhcnJ5aW5nXG4gKiB0aGUgbGFzdCBhdHRlbXB0J3MgZXJyb3IgYXMgYGNhdXNlYDsgb3RoZXJ3aXNlIGZhaWx1cmVzIGFyZSB3cmFwcGVkIGluIHtAbGluayBVbmhhbmRsZWRFeGNlcHRpb259LlxuICovXG50eXBlIFVubWFwcGVkRXJyb3I8SGFzUmV0cnkgZXh0ZW5kcyBib29sZWFuPiA9IEhhc1JldHJ5IGV4dGVuZHMgdHJ1ZVxuICA/IFJldHJ5RXhoYXVzdGVkRXJyb3JcbiAgOiBVbmhhbmRsZWRFeGNlcHRpb25cbnR5cGUgT3JjaGVzdHJhdGlvbk1ldGhvZHMgPSBcImFsbFwiIHwgXCJhbGxTZXR0bGVkXCIgfCBcImZsb3dcIlxudHlwZSBTaWduYWxCdWlsZGVySGlkZGVuTWV0aG9kczxTdXBwb3J0c09yY2hlc3RyYXRpb24gZXh0ZW5kcyBib29sZWFuPiA9XG4gIHwgXCJydW5TeW5jXCJcbiAgfCBcIndyYXBcIlxuICB8IChTdXBwb3J0c09yY2hlc3RyYXRpb24gZXh0ZW5kcyB0cnVlID8gbmV2ZXIgOiBPcmNoZXN0cmF0aW9uTWV0aG9kcylcbnR5cGUgRXhlY3V0aW9uQnVpbGRlclN1cmZhY2U8RSBleHRlbmRzIENvbmZpZ1J1bkVycm9ycywgSGFzUmV0cnkgZXh0ZW5kcyBib29sZWFuPiA9IE9taXQ8XG4gIFJ1bkJ1aWxkZXI8RSwgSGFzUmV0cnksIGZhbHNlPixcbiAgT3JjaGVzdHJhdGlvbk1ldGhvZHMgfCBcIndyYXBcIlxuPlxudHlwZSBBc3luY0V4ZWN1dGlvbkJ1aWxkZXJTdXJmYWNlPEUgZXh0ZW5kcyBDb25maWdSdW5FcnJvcnMsIEhhc1JldHJ5IGV4dGVuZHMgYm9vbGVhbj4gPSBPbWl0PFxuICBSdW5CdWlsZGVyPEUsIEhhc1JldHJ5LCBmYWxzZT4sXG4gIE9yY2hlc3RyYXRpb25NZXRob2RzIHwgXCJydW5TeW5jXCIgfCBcIndyYXBcIlxuPlxudHlwZSBTaWduYWxCdWlsZGVyU3VyZmFjZTxcbiAgRSBleHRlbmRzIENvbmZpZ1J1bkVycm9ycyxcbiAgSGFzUmV0cnkgZXh0ZW5kcyBib29sZWFuLFxuICBTdXBwb3J0c09yY2hlc3RyYXRpb24gZXh0ZW5kcyBib29sZWFuLFxuPiA9IE9taXQ8XG4gIFJ1bkJ1aWxkZXI8RSwgSGFzUmV0cnksIFN1cHBvcnRzT3JjaGVzdHJhdGlvbj4sXG4gIFNpZ25hbEJ1aWxkZXJIaWRkZW5NZXRob2RzPFN1cHBvcnRzT3JjaGVzdHJhdGlvbj5cbj5cblxuZXhwb3J0IGNsYXNzIFJ1bkJ1aWxkZXI8XG4gIEUgZXh0ZW5kcyBDb25maWdSdW5FcnJvcnMgPSBuZXZlcixcbiAgSGFzUmV0cnkgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4gIFN1cHBvcnRzT3JjaGVzdHJhdGlvbiBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb25maWc6IEJ1aWxkZXJDb25maWdcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEJ1aWxkZXJDb25maWcgPSB7fSkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnXG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRUaW1lb3V0Q29uZmlnKG1zOiBudW1iZXIpOiBCdWlsZGVyQ29uZmlnIHtcbiAgICBhc3NlcnRWYWxpZFRpbWVvdXQobXMpXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICB0aW1lb3V0OiBtcyxcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRTaWduYWxDb25maWcoc2lnbmFsOiBBYm9ydFNpZ25hbCk6IEJ1aWxkZXJDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIHNpZ25hbHM6IFsuLi4odGhpcy5jb25maWcuc2lnbmFscyA/PyBbXSksIHNpZ25hbF0sXG4gICAgfVxuICB9XG5cbiAgLy8gUnVudGltZSBub3RlOiB0aGVyZSBpcyBhIHNpbmdsZSBidWlsZGVyIGNsYXNzLiBQb2xpY3kgbWlzdXNlIHRoYXQgdGhlXG4gIC8vIG5hcnJvd2VkIHR5cGUgc3VyZmFjZSBwcmV2ZW50cyAoZS5nLiBjYWxsaW5nIGFsbCgpIGFmdGVyIHJldHJ5KCkgZnJvbVxuICAvLyB1bnR5cGVkIGNvZGUpIGlzIGd1YXJkZWQgYXQgZXhlY3V0aW9uIHRpbWUgYnkgT3JjaGVzdHJhdGlvbkV4ZWN1dGlvbidzXG4gIC8vIE9SQ0hFU1RSQVRJT05fVU5TVVBQT1JURURfUE9MSUNZIHBhbmljLCBhbmQgd3JhcCBvcmRlcmluZyBpc1xuICAvLyBiZWhhdmlvci1pbnZhcmlhbnQgKHdyYXBzIGFsd2F5cyBjb3ZlciB0aGUgZnVsbCByZXRyeSBzY29wZSksIHNvIG5vXG4gIC8vIHJ1bnRpbWUgbWV0aG9kLWhpZGluZyBpcyBuZWVkZWQuXG5cbiAgcmV0cnk8TiBleHRlbmRzIG51bWJlcj4ocG9saWN5OiBOICYgVmFsaWRhdGVSZXRyeUxpbWl0PE4+KTogRXhlY3V0aW9uQnVpbGRlclN1cmZhY2U8RSwgdHJ1ZT5cbiAgcmV0cnk8TiBleHRlbmRzIG51bWJlcj4oXG4gICAgcG9saWN5OiBSZXRyeVBvbGljeSAmIHsgbGltaXQ6IE4gJiBWYWxpZGF0ZVJldHJ5TGltaXQ8Tj4gfVxuICApOiBBc3luY0V4ZWN1dGlvbkJ1aWxkZXJTdXJmYWNlPEUsIHRydWU+XG4gIHJldHJ5PGNvbnN0IFAgZXh0ZW5kcyBSZXRyeU9wdGlvbnM+KFxuICAgIHBvbGljeTogUCAmIFZhbGlkYXRlUmV0cnlPcHRpb25zPFA+XG4gICk6IEFzeW5jRXhlY3V0aW9uQnVpbGRlclN1cmZhY2U8RSwgdHJ1ZT5cbiAgcmV0cnkocG9saWN5OiBSZXRyeU9wdGlvbnMpOiBFeGVjdXRpb25CdWlsZGVyU3VyZmFjZTxFLCB0cnVlPiB7XG4gICAgcmV0dXJuIG5ldyBSdW5CdWlsZGVyKHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgcmV0cnk6IHJldHJ5T3B0aW9ucyhwb2xpY3kpLFxuICAgIH0pXG4gIH1cblxuICB0aW1lb3V0KG1zOiBudW1iZXIpOiBBc3luY0V4ZWN1dGlvbkJ1aWxkZXJTdXJmYWNlPEUgfCBUaW1lb3V0RXJyb3IsIEhhc1JldHJ5PiB7XG4gICAgcmV0dXJuIG5ldyBSdW5CdWlsZGVyKHRoaXMuYnVpbGRUaW1lb3V0Q29uZmlnKG1zKSlcbiAgfVxuXG4gIHNpZ25hbChcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsXG4gICk6IFNpZ25hbEJ1aWxkZXJTdXJmYWNlPEUgfCBDYW5jZWxsYXRpb25FcnJvciwgSGFzUmV0cnksIFN1cHBvcnRzT3JjaGVzdHJhdGlvbj4ge1xuICAgIHJldHVybiBuZXcgUnVuQnVpbGRlcih0aGlzLmJ1aWxkU2lnbmFsQ29uZmlnKHNpZ25hbCkpIGFzIHVua25vd24gYXMgU2lnbmFsQnVpbGRlclN1cmZhY2U8XG4gICAgICBFIHwgQ2FuY2VsbGF0aW9uRXJyb3IsXG4gICAgICBIYXNSZXRyeSxcbiAgICAgIFN1cHBvcnRzT3JjaGVzdHJhdGlvblxuICAgID5cbiAgfVxuXG4gIHdyYXAoZm46IFdyYXBGbik6IFJ1bkJ1aWxkZXI8RSwgSGFzUmV0cnksIFN1cHBvcnRzT3JjaGVzdHJhdGlvbj4ge1xuICAgIHJldHVybiBuZXcgUnVuQnVpbGRlcih7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIHdyYXBzOiBbLi4uKHRoaXMuY29uZmlnLndyYXBzID8/IFtdKSwgZm5dLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYW4gYXN5bmMgdW5pdCBvZiB3b3JrLlxuICAgKlxuICAgKiBgY2F0Y2hgIG1hcHMgZXJyb3JzIHRoYXQgb3JpZ2luYXRlZCBpbnNpZGUgYHRyeWAg4oCUIHRocm93biBkaXJlY3RseSwgb3IgY2FycmllZCBvdXQgb2YgdGhlIHJldHJ5XG4gICAqIGxvb3AgYXMgdGhlIGxhc3QgYXR0ZW1wdCdzIGVycm9yIG9uY2UgdGhlIHJldHJ5IHBvbGljeSBnaXZlcyB1cC4gUG9saWN5IG91dGNvbWVzICh7QGxpbmtcbiAgICogVGltZW91dEVycm9yfSwge0BsaW5rIENhbmNlbGxhdGlvbkVycm9yfSkgYW5kIGRlZmVjdHMgKGBQYW5pY2ApIG5ldmVyIHBhc3MgdGhyb3VnaCBgY2F0Y2hgOyB0aGV5XG4gICAqIHN1cmZhY2UgdHlwZWQgaW4gdGhlIHJldHVybiB1bmlvbiAob3IgYXJlIHRocm93biwgZm9yIGBQYW5pY2ApLlxuICAgKlxuICAgKiBXaXRob3V0IGBjYXRjaGAsIHVubWFwcGVkIGZhaWx1cmVzIGFyZSB3cmFwcGVkOiB7QGxpbmsgUmV0cnlFeGhhdXN0ZWRFcnJvcn0gd2hlbiBhIHJldHJ5IHBvbGljeVxuICAgKiBnYXZlIHVwLCB7QGxpbmsgVW5oYW5kbGVkRXhjZXB0aW9ufSBvdGhlcndpc2UuIFRoZSBvcmlnaW5hbCBlcnJvciBpcyBhdmFpbGFibGUgYXMgYGNhdXNlYC5cbiAgICovXG4gIHJ1bjxUPih0cnlGbjogUnVuVHJ5Rm48VCwgVHJ5Q3R4Rm9yPEhhc1JldHJ5Pj4pOiBQcm9taXNlPFQgfCBVbm1hcHBlZEVycm9yPEhhc1JldHJ5PiB8IEU+XG4gIHJ1bjxULCBDPihvcHRpb25zOiBBc3luY1J1bklucHV0PFQsIEMsIFRyeUN0eEZvcjxIYXNSZXRyeT4+KTogUHJvbWlzZTxUIHwgQyB8IEU+XG4gIHJ1bjxULCBDPihpbnB1dDogQXN5bmNSdW5JbnB1dDxULCBDLCBUcnlDdHhGb3I8SGFzUmV0cnk+Pikge1xuICAgIHJldHVybiBleGVjdXRlUnVuKHRoaXMuY29uZmlnLCBpbnB1dClcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIHN5bmMgdW5pdCBvZiB3b3JrLlxuICAgKlxuICAgKiBGb2xsb3dzIHRoZSBzYW1lIGBjYXRjaGAgY29udHJhY3QgYXMge0BsaW5rIFJ1bkJ1aWxkZXIucnVufTogYGNhdGNoYCBtYXBzIHRyeS1vcmlnaW5hdGVkIGVycm9yc1xuICAgKiAoaW5jbHVkaW5nIHJldHJ5IGdpdmUtdXApOyBwb2xpY3kgb3V0Y29tZXMgYW5kIGRlZmVjdHMgbmV2ZXIgcGFzcyB0aHJvdWdoIGl0LlxuICAgKi9cbiAgcnVuU3luYzxUPih0cnlGbjogU3luY1J1blRyeUZuPFQsIFRyeUN0eEZvcjxIYXNSZXRyeT4+KTogVCB8IFVubWFwcGVkRXJyb3I8SGFzUmV0cnk+IHwgRVxuICBydW5TeW5jPFQsIEM+KGlucHV0OiBTeW5jUnVuSW5wdXQ8VCwgQywgVHJ5Q3R4Rm9yPEhhc1JldHJ5Pj4pOiBUIHwgQyB8IEVcbiAgcnVuU3luYzxULCBDPihpbnB1dDogU3luY1J1bklucHV0PFQsIEMsIFRyeUN0eEZvcjxIYXNSZXRyeT4+KSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSdW5TeW5jKHRoaXMuY29uZmlnLCBpbnB1dClcbiAgfVxuXG4gIGFsbDxUIGV4dGVuZHMgVGFza1JlY29yZCwgQyA9IG5ldmVyPihcbiAgICB0YXNrczogVCAmIFRhc2tWYWxpZGF0aW9uPE5vSW5mZXI8VD4+ICYgVGhpc1R5cGU8SW5mZXJyZWRUYXNrQ29udGV4dDxUPj4sXG4gICAgb3B0aW9ucz86IEFsbE9wdGlvbnM8VCwgQz5cbiAgKTogUHJvbWlzZTx7IFtLIGluIGtleW9mIFRdOiBUYXNrUmVzdWx0PFRbS10+IH0gfCBDPiB7XG4gICAgcmV0dXJuIGV4ZWN1dGVBbGwodGhpcy5jb25maWcsIHRhc2tzLCBvcHRpb25zKVxuICB9XG5cbiAgYWxsU2V0dGxlZDxUIGV4dGVuZHMgVGFza1JlY29yZD4oXG4gICAgdGFza3M6IFQgJiBUYXNrVmFsaWRhdGlvbjxOb0luZmVyPFQ+PiAmIFRoaXNUeXBlPEluZmVycmVkVGFza0NvbnRleHQ8VD4+XG4gICk6IFByb21pc2U8QWxsU2V0dGxlZFJlc3VsdDxUPj4ge1xuICAgIHJldHVybiBleGVjdXRlQWxsU2V0dGxlZCh0aGlzLmNvbmZpZywgdGFza3MpXG4gIH1cblxuICBmbG93PFQgZXh0ZW5kcyBUYXNrUmVjb3JkPihcbiAgICB0YXNrczogVCAmIFRoaXNUeXBlPEluZmVycmVkRmxvd1Rhc2tDb250ZXh0PFQ+PlxuICApOiBQcm9taXNlPEZsb3dSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gZXhlY3V0ZUZsb3codGhpcy5jb25maWcsIHRhc2tzKVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IGNyZWF0ZUFzeW5jRGlzcG9zZXIsIHR5cGUgQXN5bmNEaXNwb3NlciB9IGZyb20gXCIuLi9zaGltcy9kaXNwb3NlclwiXG5cbi8qKlxuICogQ3JlYXRlcyBhbiB7QGxpbmsgQXN5bmNEaXNwb3Nlcn06IHJlZ2lzdGVyIGNsZWFudXAgd2l0aCBgZGVmZXIoZm4pYCBvciBgdXNlKHJlc291cmNlKWAsIHRoZW4gcnVuXG4gKiB0ZWFyZG93biB3aXRoIGBhd2FpdCBkLmRpc3Bvc2UoKWAgb3IgYnkgZGVjbGFyaW5nIHRoZSBkaXNwb3NlciB3aXRoIGBhd2FpdCB1c2luZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlcigpOiBBc3luY0Rpc3Bvc2VyIHtcbiAgcmV0dXJuIGNyZWF0ZUFzeW5jRGlzcG9zZXIoKVxufVxuIiwKICAgICJpbXBvcnQgeyBjaGVja0lzUHJvbWlzZUxpa2UgfSBmcm9tIFwiLi91dGlsc1wiXG5cbnR5cGUgR2VuVW53cmFwPFQ+ID0gRXhjbHVkZTxBd2FpdGVkPFQ+LCBFcnJvcj5cbmV4cG9ydCB0eXBlIEdlblVzZSA9IDxUPih2YWx1ZTogVCkgPT4gR2VuZXJhdG9yPFQsIEdlblVud3JhcDxUPiwgR2VuVW53cmFwPFQ+PlxuXG50eXBlIEdlbkVycm9yczxUWWllbGQ+ID0gRXh0cmFjdDxBd2FpdGVkPFRZaWVsZD4sIEVycm9yPlxudHlwZSBDaGVja0lzQXN5bmM8VFlpZWxkLCBUUmV0dXJuPiA9XG4gIEV4dHJhY3Q8VFlpZWxkIHwgVFJldHVybiwgUHJvbWlzZUxpa2U8dW5rbm93bj4+IGV4dGVuZHMgbmV2ZXIgPyBmYWxzZSA6IHRydWVcblxuZXhwb3J0IHR5cGUgR2VuUmVzdWx0PFRZaWVsZCwgVFJldHVybj4gPVxuICBDaGVja0lzQXN5bmM8VFlpZWxkLCBUUmV0dXJuPiBleHRlbmRzIHRydWVcbiAgICA/IFByb21pc2U8QXdhaXRlZDxUUmV0dXJuPiB8IEdlbkVycm9yczxUWWllbGQ+PlxuICAgIDogQXdhaXRlZDxUUmV0dXJuPiB8IEdlbkVycm9yczxUWWllbGQ+XG5cbmZ1bmN0aW9uKiB1c2U8VD4odmFsdWU6IFQpOiBHZW5lcmF0b3I8VCwgR2VuVW53cmFwPFQ+LCBHZW5VbndyYXA8VD4+IHtcbiAgcmV0dXJuIHlpZWxkIHZhbHVlXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBc3luY0dlbmVyYXRvcjxUWWllbGQsIFRSZXR1cm4+KFxuICBpdGVyYXRvcjogR2VuZXJhdG9yPFRZaWVsZCwgVFJldHVybiwgdW5rbm93bj4sXG4gIGluaXRpYWxTdGVwOiBJdGVyYXRvclJlc3VsdDxUWWllbGQsIFRSZXR1cm4+XG4pOiBQcm9taXNlPEF3YWl0ZWQ8VFJldHVybj4gfCBHZW5FcnJvcnM8VFlpZWxkPj4ge1xuICBsZXQgY3VycmVudFN0ZXAgPSBpbml0aWFsU3RlcFxuXG4gIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChjdXJyZW50U3RlcC5kb25lKSB7XG4gICAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKGN1cnJlbnRTdGVwLnZhbHVlKSkge1xuICAgICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICByZXR1cm4gYXdhaXQgY3VycmVudFN0ZXAudmFsdWVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGN1cnJlbnRTdGVwLnZhbHVlIGFzIEF3YWl0ZWQ8VFJldHVybj5cbiAgICB9XG5cbiAgICBsZXQgY3VycmVudFZhbHVlOiB1bmtub3duXG5cbiAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKGN1cnJlbnRTdGVwLnZhbHVlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgY3VycmVudFZhbHVlID0gYXdhaXQgY3VycmVudFN0ZXAudmFsdWVcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGN1cnJlbnRTdGVwID0gaXRlcmF0b3IudGhyb3coZXJyb3IpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRTdGVwLnZhbHVlXG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICByZXR1cm4gY3VycmVudFZhbHVlIGFzIEdlbkVycm9yczxUWWllbGQ+XG4gICAgfVxuXG4gICAgY3VycmVudFN0ZXAgPSBpdGVyYXRvci5uZXh0KGN1cnJlbnRWYWx1ZSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZHJpdmVHZW48VFlpZWxkLCBUUmV0dXJuPihcbiAgZmFjdG9yeTogKHVzZUZuOiBHZW5Vc2UpID0+IEdlbmVyYXRvcjxUWWllbGQsIFRSZXR1cm4sIHVua25vd24+XG4pOiBHZW5SZXN1bHQ8VFlpZWxkLCBUUmV0dXJuPiB7XG4gIGNvbnN0IGl0ZXJhdG9yID0gZmFjdG9yeSh1c2UpXG5cbiAgbGV0IGN1cnJlbnRWYWx1ZTogdW5rbm93biA9IHVuZGVmaW5lZFxuXG4gIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHN0ZXAgPSBpdGVyYXRvci5uZXh0KGN1cnJlbnRWYWx1ZSlcblxuICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgIGlmIChjaGVja0lzUHJvbWlzZUxpa2Uoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdGVwLnZhbHVlKSBhcyBHZW5SZXN1bHQ8VFlpZWxkLCBUUmV0dXJuPlxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RlcC52YWx1ZSBhcyBHZW5SZXN1bHQ8VFlpZWxkLCBUUmV0dXJuPlxuICAgIH1cblxuICAgIGlmIChjaGVja0lzUHJvbWlzZUxpa2Uoc3RlcC52YWx1ZSkpIHtcbiAgICAgIHJldHVybiBleGVjdXRlQXN5bmNHZW5lcmF0b3IoaXRlcmF0b3IsIHN0ZXApIGFzIEdlblJlc3VsdDxUWWllbGQsIFRSZXR1cm4+XG4gICAgfVxuXG4gICAgaWYgKHN0ZXAudmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIHN0ZXAudmFsdWUgYXMgR2VuUmVzdWx0PFRZaWVsZCwgVFJldHVybj5cbiAgICB9XG5cbiAgICBjdXJyZW50VmFsdWUgPSBzdGVwLnZhbHVlXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgUnVuQnVpbGRlciB9IGZyb20gXCIuL2xpYi9idWlsZGVyXCJcblxuY29uc3Qgcm9vdCA9IG5ldyBSdW5CdWlsZGVyKClcblxuZXhwb3J0IGNvbnN0IGFsbDogUnVuQnVpbGRlcltcImFsbFwiXSA9IHJvb3QuYWxsLmJpbmQocm9vdClcbmV4cG9ydCBjb25zdCBhbGxTZXR0bGVkOiBSdW5CdWlsZGVyW1wiYWxsU2V0dGxlZFwiXSA9IHJvb3QuYWxsU2V0dGxlZC5iaW5kKHJvb3QpXG5leHBvcnQgY29uc3QgZmxvdzogUnVuQnVpbGRlcltcImZsb3dcIl0gPSByb290LmZsb3cuYmluZChyb290KVxuZXhwb3J0IGNvbnN0IHJldHJ5OiBSdW5CdWlsZGVyW1wicmV0cnlcIl0gPSByb290LnJldHJ5LmJpbmQocm9vdClcbmV4cG9ydCBjb25zdCBydW46IFJ1bkJ1aWxkZXJbXCJydW5cIl0gPSByb290LnJ1bi5iaW5kKHJvb3QpXG5leHBvcnQgY29uc3QgcnVuU3luYzogUnVuQnVpbGRlcltcInJ1blN5bmNcIl0gPSByb290LnJ1blN5bmMuYmluZChyb290KVxuZXhwb3J0IGNvbnN0IHNpZ25hbDogUnVuQnVpbGRlcltcInNpZ25hbFwiXSA9IHJvb3Quc2lnbmFsLmJpbmQocm9vdClcbmV4cG9ydCBjb25zdCB0aW1lb3V0OiBSdW5CdWlsZGVyW1widGltZW91dFwiXSA9IHJvb3QudGltZW91dC5iaW5kKHJvb3QpXG5leHBvcnQgY29uc3Qgd3JhcDogUnVuQnVpbGRlcltcIndyYXBcIl0gPSByb290LndyYXAuYmluZChyb290KVxuXG5leHBvcnQgeyBkaXNwb3NlciB9IGZyb20gXCIuL2xpYi9kaXNwb3NlXCJcbmV4cG9ydCB7IGRyaXZlR2VuIGFzIGdlbiB9IGZyb20gXCIuL2xpYi9nZW5cIlxuXG5leHBvcnQgeyByZXRyeU9wdGlvbnMgfSBmcm9tIFwiLi9saWIvbW9kaWZpZXJzL3JldHJ5XCJcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7OztBQUFBLElBQU0sMkJBQTJCO0FBRWpDLElBQU0sZ0JBQWdCLFFBQVEsSUFBSSxRQUFRLFNBQVM7QUFDbkQsSUFBTSxxQkFBcUIsUUFBUSxJQUFJLFFBQVEsY0FBYztBQUV0RCxJQUFNLFVBQ1gsT0FBTyxrQkFBa0IsV0FBVyxnQkFBZ0IsT0FBTyxJQUFJLGdCQUFnQjtBQUMxRSxJQUFNLGdCQUNYLE9BQU8sdUJBQXVCLFdBQVcscUJBQXFCLE9BQU8sSUFBSSxxQkFBcUI7QUFnQ3pGLFNBQVMsa0JBQWtCLENBQUMsV0FBc0M7QUFBQSxFQUN2RSxPQUFPLGVBQWUsV0FBVyxTQUFTO0FBQUEsSUFDeEMsY0FBYztBQUFBLElBQ2QsS0FBSyxHQUE0QjtBQUFBLE1BQy9CLEtBQUssUUFBUTtBQUFBO0FBQUEsSUFFZixVQUFVO0FBQUEsRUFDWixDQUFDO0FBQUE7QUFHSSxTQUFTLHVCQUF1QixDQUFDLFdBQStDO0FBQUEsRUFDckYsT0FBTyxlQUFlLFdBQVcsZUFBZTtBQUFBLElBQzlDLGNBQWM7QUFBQSxTQUNSLE1BQUssR0FBcUM7QUFBQSxNQUM5QyxNQUFNLEtBQUssUUFBUTtBQUFBO0FBQUEsSUFFckIsVUFBVTtBQUFBLEVBQ1osQ0FBQztBQUFBO0FBR0gsU0FBUyxxQkFBcUIsQ0FBQyxPQUFnQixZQUE0QjtBQUFBLEVBQ3pFLElBQUksT0FBTyxvQkFBb0IsWUFBWTtBQUFBLElBQ3pDLE9BQU8sSUFBSSxnQkFBZ0IsT0FBTyxZQUFZLHdCQUF3QjtBQUFBLEVBQ3hFO0FBQUEsRUFFQSxNQUFNLFVBQVUsSUFBSSxNQUFNLHdCQUF3QjtBQUFBLEVBS2xELFFBQVEsT0FBTztBQUFBLEVBQ2YsUUFBUSxRQUFRO0FBQUEsRUFDaEIsUUFBUSxhQUFhO0FBQUEsRUFFckIsT0FBTztBQUFBO0FBR1QsU0FBUyxnQkFBZ0IsQ0FBQyxVQUFtQixNQUFjO0FBQUEs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
|