@workflow/core 5.0.0-beta.41 → 5.0.0-beta.42
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/dist/events-consumer.d.ts +97 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +147 -14
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +3 -4
- package/dist/runtime/constants.d.ts +35 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +38 -1
- package/dist/runtime/helpers.d.ts +127 -93
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +149 -132
- package/dist/runtime/quickjs-entrypoint.d.ts +8 -9
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +160 -37
- package/dist/runtime/replay-budget.d.ts +8 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -1
- package/dist/runtime/replay-budget.js +3 -3
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +53 -13
- package/dist/runtime/resume-latency.d.ts +143 -0
- package/dist/runtime/resume-latency.d.ts.map +1 -0
- package/dist/runtime/resume-latency.js +153 -0
- package/dist/runtime/step-executor.d.ts +27 -12
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +105 -12
- package/dist/runtime/suspension-handler.d.ts +39 -8
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +147 -36
- package/dist/runtime/world-compatibility.d.ts +6 -5
- package/dist/runtime/world-compatibility.d.ts.map +1 -1
- package/dist/runtime/world-compatibility.js +7 -6
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +459 -128
- package/dist/serialization/codec-devalue.d.ts.map +1 -1
- package/dist/serialization/codec-devalue.js +15 -4
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +8 -3
- package/dist/telemetry/semantic-conventions.d.ts +81 -0
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +67 -1
- package/dist/test-support/orchestrator-context.d.ts +25 -0
- package/dist/test-support/orchestrator-context.d.ts.map +1 -0
- package/dist/test-support/orchestrator-context.js +91 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow.js +35 -2
- package/package.json +5 -5
|
@@ -45,6 +45,16 @@ export interface EventsConsumerOptions {
|
|
|
45
45
|
* downstream subscribe() calls have a chance to cancel the check first.
|
|
46
46
|
*/
|
|
47
47
|
onUnconsumedEvent: (event: Event) => void;
|
|
48
|
+
/**
|
|
49
|
+
* Callback invoked when an event is skipped because it repeats an event
|
|
50
|
+
* class the walk already consumed for the same entity. `firstEventType` is
|
|
51
|
+
* the type that recorded the class, which is the one the workflow observed.
|
|
52
|
+
* Diagnostics only: skipping is a normal outcome, not an error — though a
|
|
53
|
+
* `firstEventType` differing from `event.eventType` says the two writers
|
|
54
|
+
* decided the entity's outcome differently, which is worth more than an
|
|
55
|
+
* info log.
|
|
56
|
+
*/
|
|
57
|
+
onDuplicateEvent?: (event: Event, firstEventType: Event['eventType']) => void;
|
|
48
58
|
/**
|
|
49
59
|
* Returns the current promise queue. The unconsumed event check is chained
|
|
50
60
|
* onto this queue so it only fires after all pending async work (e.g.,
|
|
@@ -87,8 +97,17 @@ export declare class EventsConsumer {
|
|
|
87
97
|
* rather than parked for a consumer that cannot exist.
|
|
88
98
|
*/
|
|
89
99
|
private readonly resolved;
|
|
100
|
+
/**
|
|
101
|
+
* `<class>:<correlationId>` for every event class the walk has already
|
|
102
|
+
* consumed, mapped to the event type that recorded it. The type is kept so a
|
|
103
|
+
* repeat that decided the same class *differently* (a `step_failed` behind a
|
|
104
|
+
* `step_completed`) can be reported as more than a re-commit. See
|
|
105
|
+
* {@link EventsConsumer.firstEventTypeOfClass}.
|
|
106
|
+
*/
|
|
107
|
+
private readonly seenEventClasses;
|
|
90
108
|
private onConsumedEvent?;
|
|
91
109
|
private onUnconsumedEvent;
|
|
110
|
+
private onDuplicateEvent?;
|
|
92
111
|
private getPromiseQueue;
|
|
93
112
|
private isDeliveryIdle;
|
|
94
113
|
private pendingUnconsumedCheck;
|
|
@@ -153,8 +172,86 @@ export declare class EventsConsumer {
|
|
|
153
172
|
* replay diverged.
|
|
154
173
|
*/
|
|
155
174
|
private park;
|
|
175
|
+
/**
|
|
176
|
+
* The key `event`'s class is tracked under, or `undefined` for the event
|
|
177
|
+
* types that belong to no class (`hook_received`, `hook_conflict`,
|
|
178
|
+
* `attr_set`, `run_created`) and are therefore never skipped.
|
|
179
|
+
*
|
|
180
|
+
* Run events carry no correlation id. They are classes of the run itself, so
|
|
181
|
+
* they all key off the same bucket.
|
|
182
|
+
*/
|
|
183
|
+
private eventClassKey;
|
|
184
|
+
/**
|
|
185
|
+
* Remembers that `event`'s class is now decided for its entity, if the type
|
|
186
|
+
* belongs to a class. First writer wins: the recorded type is the one the
|
|
187
|
+
* workflow observed, and a later repeat is measured against it.
|
|
188
|
+
*/
|
|
189
|
+
private recordEventClass;
|
|
190
|
+
/**
|
|
191
|
+
* The type that already decided `event`'s class for the same entity, or
|
|
192
|
+
* `undefined` when nothing has: a second `step_created` for one step, a
|
|
193
|
+
* second terminal outcome, a second `step_started` after the step's result is
|
|
194
|
+
* already in the log.
|
|
195
|
+
*
|
|
196
|
+
* Such an event is committed but inert. Concurrent replays write into one
|
|
197
|
+
* log without a currency guard, so a replay working from a prefix that
|
|
198
|
+
* predates another replay's write can commit its own copy of work the log
|
|
199
|
+
* already records. That copy cannot change what the workflow observed: the
|
|
200
|
+
* outcome was decided by the first event of the class and every later replay
|
|
201
|
+
* reads that same event at the same log position, so ignoring the straggler
|
|
202
|
+
* is deterministic across replays.
|
|
203
|
+
*
|
|
204
|
+
* Classes are tracked separately, so passing one does not suppress another.
|
|
205
|
+
* A step whose result is in the log still reaches its `step_created` and
|
|
206
|
+
* `step_started` consumers if it has yet to see those classes.
|
|
207
|
+
*
|
|
208
|
+
* Consulted only after every registered callback has declined the event, so
|
|
209
|
+
* it can never take an event a consumer wanted. A retry's `step_started` is
|
|
210
|
+
* claimed by the step's live consumer and counts as an attempt exactly as
|
|
211
|
+
* before, and a second `step_created` reaching a step that has not finished
|
|
212
|
+
* is likewise consumed rather than skipped; only the copies nobody claims are
|
|
213
|
+
* skipped.
|
|
214
|
+
*
|
|
215
|
+
* Unlike the divergence report, this does *not* wait out the deferred window
|
|
216
|
+
* first, and it does not need to. The window buys time for a consumer that
|
|
217
|
+
* has yet to register, and no such consumer can want this event: the class
|
|
218
|
+
* was recorded by a consumption in this same replay, which means the entity's
|
|
219
|
+
* consumer was registered and took an event of this class, and correlation
|
|
220
|
+
* ids are minted from a monotonic ULID per body position, so nothing later in
|
|
221
|
+
* the body registers a second consumer under this id. Waiting would cost
|
|
222
|
+
* `getDeferredCheckDelayMs()` per straggler per replay for information that
|
|
223
|
+
* cannot arrive — 0.75% of production runs carry at least one straggler, and
|
|
224
|
+
* the p99 among those carries 155.
|
|
225
|
+
*
|
|
226
|
+
* The invariant to preserve if hook identity ever becomes caller-supplied
|
|
227
|
+
* (an idempotency key rather than a minted id): two `createHook` calls in one
|
|
228
|
+
* body could then share a correlation id, and the second consumer's
|
|
229
|
+
* `hook_created` would be a repeat of a class this replay already recorded.
|
|
230
|
+
* That would make skipping wrong for `hook_created`, and is the reason the
|
|
231
|
+
* class map lives next to the event types rather than being inferred.
|
|
232
|
+
*/
|
|
233
|
+
private firstEventTypeOfClass;
|
|
234
|
+
/** Steps the walk over a repeat of an already-consumed class. */
|
|
235
|
+
private skipDuplicateEvent;
|
|
156
236
|
private handleEndOfLog;
|
|
157
237
|
private scheduleUnconsumedCheck;
|
|
238
|
+
/**
|
|
239
|
+
* Decide what a still-unconsumed event is, now that the promise queue has
|
|
240
|
+
* drained and the delivery gate says the VM is not mid-reaction.
|
|
241
|
+
*
|
|
242
|
+
* `mayPark` is false only for the end-of-log recheck of an event {@link park}
|
|
243
|
+
* already holds. Nothing in the first branch applies to one of those: it is
|
|
244
|
+
* not the event at the cursor, so the identity guard is not meaningful, and
|
|
245
|
+
* it is parked already.
|
|
246
|
+
*
|
|
247
|
+
* A duplicate class never arrives here. {@link consume} steps over one in the
|
|
248
|
+
* pass that offered it, before this check is ever scheduled, and a class
|
|
249
|
+
* recorded while the check was in flight can only have been recorded by a
|
|
250
|
+
* consumption inside {@link consume}, whose next pass re-offers this event
|
|
251
|
+
* and steps over it there — leaving the identity guard above to drop the
|
|
252
|
+
* in-flight check.
|
|
253
|
+
*/
|
|
254
|
+
private resolveUnconsumedEvent;
|
|
158
255
|
/**
|
|
159
256
|
* Run `fn` once no data delivery is in flight, polling the way
|
|
160
257
|
* `scheduleWhenIdle` does: let the promise queue drain, re-check a timer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events-consumer.d.ts","sourceRoot":"","sources":["../src/events-consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"events-consumer.d.ts","sourceRoot":"","sources":["../src/events-consumer.ts"],"names":[],"mappings":"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"}
|
package/dist/events-consumer.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { envNumber } from '@workflow/world';
|
|
1
|
+
import { entityEventClass, envNumber } from '@workflow/world';
|
|
2
2
|
import { eventsLogger } from './logger.js';
|
|
3
3
|
/**
|
|
4
4
|
* Delay before firing the deferred unconsumed-event check after the promise
|
|
@@ -140,8 +140,17 @@ export class EventsConsumer {
|
|
|
140
140
|
* rather than parked for a consumer that cannot exist.
|
|
141
141
|
*/
|
|
142
142
|
resolved = new Set();
|
|
143
|
+
/**
|
|
144
|
+
* `<class>:<correlationId>` for every event class the walk has already
|
|
145
|
+
* consumed, mapped to the event type that recorded it. The type is kept so a
|
|
146
|
+
* repeat that decided the same class *differently* (a `step_failed` behind a
|
|
147
|
+
* `step_completed`) can be reported as more than a re-commit. See
|
|
148
|
+
* {@link EventsConsumer.firstEventTypeOfClass}.
|
|
149
|
+
*/
|
|
150
|
+
seenEventClasses = new Map();
|
|
143
151
|
onConsumedEvent;
|
|
144
152
|
onUnconsumedEvent;
|
|
153
|
+
onDuplicateEvent;
|
|
145
154
|
getPromiseQueue;
|
|
146
155
|
isDeliveryIdle;
|
|
147
156
|
pendingUnconsumedCheck = null;
|
|
@@ -155,6 +164,7 @@ export class EventsConsumer {
|
|
|
155
164
|
this.eventIndex = 0;
|
|
156
165
|
this.onConsumedEvent = options.onConsumedEvent;
|
|
157
166
|
this.onUnconsumedEvent = options.onUnconsumedEvent;
|
|
167
|
+
this.onDuplicateEvent = options.onDuplicateEvent;
|
|
158
168
|
this.getPromiseQueue = options.getPromiseQueue;
|
|
159
169
|
this.isDeliveryIdle = options.isDeliveryIdle;
|
|
160
170
|
}
|
|
@@ -270,6 +280,15 @@ export class EventsConsumer {
|
|
|
270
280
|
return;
|
|
271
281
|
}
|
|
272
282
|
if (!consumed) {
|
|
283
|
+
// Nobody wanted it. If it repeats a class this walk already consumed
|
|
284
|
+
// for the same entity it is a straggler from a concurrent replay:
|
|
285
|
+
// step over it in this pass rather than paying the deferred window for
|
|
286
|
+
// a consumer that cannot come (see `firstEventTypeOfClass`).
|
|
287
|
+
const firstType = this.firstEventTypeOfClass(currentEvent);
|
|
288
|
+
if (firstType !== undefined) {
|
|
289
|
+
this.skipDuplicateEvent(currentEvent, firstType);
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
273
292
|
this.scheduleUnconsumedCheck(currentEvent, true);
|
|
274
293
|
return;
|
|
275
294
|
}
|
|
@@ -300,6 +319,7 @@ export class EventsConsumer {
|
|
|
300
319
|
ONE_SHOT_EVENT_TYPES.has(currentEvent.eventType)) {
|
|
301
320
|
this.resolved.add(resolutionKey(currentEvent.eventType, currentEvent.correlationId));
|
|
302
321
|
}
|
|
322
|
+
this.recordEventClass(currentEvent);
|
|
303
323
|
this.notifyConsumedEvent(currentEvent);
|
|
304
324
|
}
|
|
305
325
|
// remove the callback if it has finished
|
|
@@ -367,6 +387,100 @@ export class EventsConsumer {
|
|
|
367
387
|
});
|
|
368
388
|
return true;
|
|
369
389
|
}
|
|
390
|
+
/**
|
|
391
|
+
* The key `event`'s class is tracked under, or `undefined` for the event
|
|
392
|
+
* types that belong to no class (`hook_received`, `hook_conflict`,
|
|
393
|
+
* `attr_set`, `run_created`) and are therefore never skipped.
|
|
394
|
+
*
|
|
395
|
+
* Run events carry no correlation id. They are classes of the run itself, so
|
|
396
|
+
* they all key off the same bucket.
|
|
397
|
+
*/
|
|
398
|
+
eventClassKey(event) {
|
|
399
|
+
const eventClass = entityEventClass(event.eventType);
|
|
400
|
+
return eventClass === undefined
|
|
401
|
+
? undefined
|
|
402
|
+
: `${eventClass}:${event.correlationId}`;
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Remembers that `event`'s class is now decided for its entity, if the type
|
|
406
|
+
* belongs to a class. First writer wins: the recorded type is the one the
|
|
407
|
+
* workflow observed, and a later repeat is measured against it.
|
|
408
|
+
*/
|
|
409
|
+
recordEventClass(event) {
|
|
410
|
+
const key = this.eventClassKey(event);
|
|
411
|
+
if (key !== undefined && !this.seenEventClasses.has(key)) {
|
|
412
|
+
this.seenEventClasses.set(key, event.eventType);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* The type that already decided `event`'s class for the same entity, or
|
|
417
|
+
* `undefined` when nothing has: a second `step_created` for one step, a
|
|
418
|
+
* second terminal outcome, a second `step_started` after the step's result is
|
|
419
|
+
* already in the log.
|
|
420
|
+
*
|
|
421
|
+
* Such an event is committed but inert. Concurrent replays write into one
|
|
422
|
+
* log without a currency guard, so a replay working from a prefix that
|
|
423
|
+
* predates another replay's write can commit its own copy of work the log
|
|
424
|
+
* already records. That copy cannot change what the workflow observed: the
|
|
425
|
+
* outcome was decided by the first event of the class and every later replay
|
|
426
|
+
* reads that same event at the same log position, so ignoring the straggler
|
|
427
|
+
* is deterministic across replays.
|
|
428
|
+
*
|
|
429
|
+
* Classes are tracked separately, so passing one does not suppress another.
|
|
430
|
+
* A step whose result is in the log still reaches its `step_created` and
|
|
431
|
+
* `step_started` consumers if it has yet to see those classes.
|
|
432
|
+
*
|
|
433
|
+
* Consulted only after every registered callback has declined the event, so
|
|
434
|
+
* it can never take an event a consumer wanted. A retry's `step_started` is
|
|
435
|
+
* claimed by the step's live consumer and counts as an attempt exactly as
|
|
436
|
+
* before, and a second `step_created` reaching a step that has not finished
|
|
437
|
+
* is likewise consumed rather than skipped; only the copies nobody claims are
|
|
438
|
+
* skipped.
|
|
439
|
+
*
|
|
440
|
+
* Unlike the divergence report, this does *not* wait out the deferred window
|
|
441
|
+
* first, and it does not need to. The window buys time for a consumer that
|
|
442
|
+
* has yet to register, and no such consumer can want this event: the class
|
|
443
|
+
* was recorded by a consumption in this same replay, which means the entity's
|
|
444
|
+
* consumer was registered and took an event of this class, and correlation
|
|
445
|
+
* ids are minted from a monotonic ULID per body position, so nothing later in
|
|
446
|
+
* the body registers a second consumer under this id. Waiting would cost
|
|
447
|
+
* `getDeferredCheckDelayMs()` per straggler per replay for information that
|
|
448
|
+
* cannot arrive — 0.75% of production runs carry at least one straggler, and
|
|
449
|
+
* the p99 among those carries 155.
|
|
450
|
+
*
|
|
451
|
+
* The invariant to preserve if hook identity ever becomes caller-supplied
|
|
452
|
+
* (an idempotency key rather than a minted id): two `createHook` calls in one
|
|
453
|
+
* body could then share a correlation id, and the second consumer's
|
|
454
|
+
* `hook_created` would be a repeat of a class this replay already recorded.
|
|
455
|
+
* That would make skipping wrong for `hook_created`, and is the reason the
|
|
456
|
+
* class map lives next to the event types rather than being inferred.
|
|
457
|
+
*/
|
|
458
|
+
firstEventTypeOfClass(event) {
|
|
459
|
+
const key = this.eventClassKey(event);
|
|
460
|
+
return key === undefined ? undefined : this.seenEventClasses.get(key);
|
|
461
|
+
}
|
|
462
|
+
/** Steps the walk over a repeat of an already-consumed class. */
|
|
463
|
+
skipDuplicateEvent(event, firstType) {
|
|
464
|
+
this.eventIndex++;
|
|
465
|
+
// Deliberately not routed through `notifyConsumedEvent`: the deterministic
|
|
466
|
+
// clock advances only on events the workflow actually observed. A skipped
|
|
467
|
+
// event is invisible to the workflow body, and a log that happens to
|
|
468
|
+
// contain one must produce the same timestamps as a log that does not.
|
|
469
|
+
eventsLogger.debug('Skipping event that repeats a class already in the log', {
|
|
470
|
+
eventId: event.eventId,
|
|
471
|
+
eventType: event.eventType,
|
|
472
|
+
firstEventType: firstType,
|
|
473
|
+
correlationId: event.correlationId,
|
|
474
|
+
});
|
|
475
|
+
try {
|
|
476
|
+
this.onDuplicateEvent?.(event, firstType);
|
|
477
|
+
}
|
|
478
|
+
catch (error) {
|
|
479
|
+
eventsLogger.error('onDuplicateEvent callback threw an error', {
|
|
480
|
+
error,
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
}
|
|
370
484
|
handleEndOfLog() {
|
|
371
485
|
// Everything still parked is waiting for a consumer some later replay will
|
|
372
486
|
// register, which is the whole point of parking — except once the log
|
|
@@ -428,22 +542,41 @@ export class EventsConsumer {
|
|
|
428
542
|
return;
|
|
429
543
|
}
|
|
430
544
|
this.pendingUnconsumedCheck = null;
|
|
431
|
-
|
|
432
|
-
if (this.events[this.eventIndex] !== currentEvent) {
|
|
433
|
-
// An append() drain claimed it while the check was in flight.
|
|
434
|
-
// Only subscribe() cancels the check, so this is reachable.
|
|
435
|
-
return;
|
|
436
|
-
}
|
|
437
|
-
if (this.park(currentEvent)) {
|
|
438
|
-
this.consume();
|
|
439
|
-
return;
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
this.onUnconsumedEvent(currentEvent);
|
|
545
|
+
this.resolveUnconsumedEvent(currentEvent, mayPark);
|
|
443
546
|
}, getDeferredCheckDelayMs());
|
|
444
547
|
});
|
|
445
548
|
});
|
|
446
549
|
}
|
|
550
|
+
/**
|
|
551
|
+
* Decide what a still-unconsumed event is, now that the promise queue has
|
|
552
|
+
* drained and the delivery gate says the VM is not mid-reaction.
|
|
553
|
+
*
|
|
554
|
+
* `mayPark` is false only for the end-of-log recheck of an event {@link park}
|
|
555
|
+
* already holds. Nothing in the first branch applies to one of those: it is
|
|
556
|
+
* not the event at the cursor, so the identity guard is not meaningful, and
|
|
557
|
+
* it is parked already.
|
|
558
|
+
*
|
|
559
|
+
* A duplicate class never arrives here. {@link consume} steps over one in the
|
|
560
|
+
* pass that offered it, before this check is ever scheduled, and a class
|
|
561
|
+
* recorded while the check was in flight can only have been recorded by a
|
|
562
|
+
* consumption inside {@link consume}, whose next pass re-offers this event
|
|
563
|
+
* and steps over it there — leaving the identity guard above to drop the
|
|
564
|
+
* in-flight check.
|
|
565
|
+
*/
|
|
566
|
+
resolveUnconsumedEvent(currentEvent, mayPark) {
|
|
567
|
+
if (mayPark) {
|
|
568
|
+
if (this.events[this.eventIndex] !== currentEvent) {
|
|
569
|
+
// An append() drain claimed it while the check was in flight.
|
|
570
|
+
// Only subscribe() cancels the check, so this is reachable.
|
|
571
|
+
return;
|
|
572
|
+
}
|
|
573
|
+
if (this.park(currentEvent)) {
|
|
574
|
+
this.consume();
|
|
575
|
+
return;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
this.onUnconsumedEvent(currentEvent);
|
|
579
|
+
}
|
|
447
580
|
/**
|
|
448
581
|
* Run `fn` once no data delivery is in flight, polling the way
|
|
449
582
|
* `scheduleWhenIdle` does: let the promise queue drain, re-check a timer
|
|
@@ -514,4 +647,4 @@ export class EventsConsumer {
|
|
|
514
647
|
poll();
|
|
515
648
|
}
|
|
516
649
|
}
|
|
517
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWNvbnN1bWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2V2ZW50cy1jb25zdW1lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUzQzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUUzQzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBRTlDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEdBQVcsRUFBRSxDQUMzQyxTQUFTLENBQUMsa0NBQWtDLEVBQUUsdUJBQXVCLEVBQUU7SUFDckUsT0FBTyxFQUFFLElBQUk7SUFDYixHQUFHLEVBQUUsMkJBQTJCO0NBQ2pDLENBQUMsQ0FBQztBQUVMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBb0MsSUFBSSxHQUFHLENBQUM7SUFDcEUsZUFBZTtJQUNmLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsVUFBVTtJQUNWLGVBQWU7Q0FDaEIsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLG9CQUFvQixHQUFvQyxJQUFJLEdBQUcsQ0FBQztJQUNwRSxnQkFBZ0I7Q0FDakIsQ0FBQyxDQUFDO0FBRUgsaUVBQWlFO0FBQ2pFLFNBQVMsYUFBYSxDQUFDLFNBQWlCLEVBQUUsYUFBcUI7SUFDN0QsT0FBTyxHQUFHLFNBQVMsSUFBSSxhQUFhLEVBQUUsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBb0MsSUFBSSxHQUFHLENBQUM7SUFDcEUsZUFBZTtJQUNmLFlBQVk7SUFDWixlQUFlO0NBQ2hCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBTixJQUFZLG1CQWFYO0FBYkQsV0FBWSxtQkFBbUI7SUFDN0I7O09BRUc7SUFDSCxxRUFBUSxDQUFBO0lBQ1I7O09BRUc7SUFDSCwyRUFBVyxDQUFBO0lBQ1g7O09BRUc7SUFDSCxxRUFBUSxDQUFBO0FBQ1YsQ0FBQyxFQWJXLG1CQUFtQixLQUFuQixtQkFBbUIsUUFhOUI7QUF5Q0QsTUFBTSxPQUFPLGNBQWM7SUFDekIsVUFBVSxDQUFTO0lBQ1YsTUFBTSxDQUFVO0lBQ2hCLFNBQVMsR0FBNEIsRUFBRSxDQUFDO0lBQ2pEOzs7Ozs7Ozs7T0FTRztJQUNjLE1BQU0sR0FBc0MsRUFBRSxDQUFDO0lBQ2hFOzs7O09BSUc7SUFDYyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUN0QyxlQUFlLENBQTBCO0lBQ3pDLGlCQUFpQixDQUF5QjtJQUMxQyxlQUFlLENBQXNCO0lBQ3JDLGNBQWMsQ0FBZ0I7SUFDOUIsc0JBQXNCLEdBQXlCLElBQUksQ0FBQztJQUNwRCx3QkFBd0IsR0FBeUMsSUFBSSxDQUFDO0lBQ3RFLHNCQUFzQixHQUFHLENBQUMsQ0FBQztJQUVuQyxZQUFZLE1BQWUsRUFBRSxPQUE4QjtRQUN6RCx5RUFBeUU7UUFDekUsc0VBQXNFO1FBQ3RFLDJDQUEyQztRQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFDL0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztRQUNuRCxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxJQUFJLGFBQWE7UUFHZixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTztZQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFDekIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztTQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFlO1FBQ3BCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFNBQVMsQ0FBQyxFQUF5QjtRQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixrRkFBa0Y7UUFDbEYsOEVBQThFO1FBQzlFLDREQUE0RDtRQUM1RCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1lBQ25DLElBQUksSUFBSSxDQUFDLHdCQUF3QixLQUFLLElBQUksRUFBRSxDQUFDO2dCQUMzQyxZQUFZLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7Z0JBQzVDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU8sbUJBQW1CLENBQUMsS0FBWTtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLFlBQVksQ0FBQyxLQUFLLENBQUMseUNBQXlDLEVBQUU7Z0JBQzVELEtBQUs7YUFDTixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVPLE9BQU8sR0FBRyxHQUFHLEVBQUU7UUFDckIsc0VBQXNFO1FBQ3RFLG9FQUFvRTtRQUNwRSxFQUFFO1FBQ0YsdUVBQXVFO1FBQ3ZFLHNFQUFzRTtRQUN0RSx3RUFBd0U7UUFDeEUsMEVBQTBFO1FBQzFFLHVFQUF1RTtRQUN2RSxzRUFBc0U7UUFDdEUsd0VBQXdFO1FBQ3hFLHNFQUFzRTtRQUN0RSx3RUFBd0U7UUFDeEUsaUVBQWlFO1FBQ2pFLDBFQUEwRTtRQUMxRSxPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1osc0VBQXNFO1lBQ3RFLG1FQUFtRTtZQUNuRSx1RUFBdUU7WUFDdkUsaUNBQWlDO1lBQ2pDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUM7WUFDMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMxQyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixDQUFDO1lBQ0QsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQzFCLG1FQUFtRTtnQkFDbkUsZ0VBQWdFO2dCQUNoRSxtRUFBbUU7Z0JBQ25FLG1FQUFtRTtnQkFDbkUsa0VBQWtFO2dCQUNsRSw0QkFBNEI7Z0JBQzVCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDZCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3hCLENBQUM7Z0JBQ0QsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakQsT0FBTztZQUNULENBQUM7WUFDRCxvRUFBb0U7UUFDdEUsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsWUFBMEI7UUFDdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFJLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7WUFDOUMsSUFBSSxDQUFDO2dCQUNILE9BQU8sR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsWUFBWSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDekUsQ0FBQztZQUNELElBQ0UsT0FBTyxLQUFLLG1CQUFtQixDQUFDLFFBQVE7Z0JBQ3hDLE9BQU8sS0FBSyxtQkFBbUIsQ0FBQyxRQUFRLEVBQ3hDLENBQUM7Z0JBQ0QsU0FBUztZQUNYLENBQUM7WUFDRCxJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDMUIsSUFDRSxZQUFZLENBQUMsYUFBYTtvQkFDMUIsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFDaEQsQ0FBQztvQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FDZixhQUFhLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsYUFBYSxDQUFDLENBQ2xFLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUNELHlDQUF5QztZQUN6QyxJQUFJLE9BQU8sS0FBSyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssV0FBVztRQUNqQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDeEMsT0FBTyxVQUFVLEVBQUUsQ0FBQztZQUNsQixVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM1QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQzlCLElBQUksUUFBaUIsQ0FBQztnQkFDdEIsSUFBSSxDQUFDO29CQUNILFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckMsQ0FBQzt3QkFBUyxDQUFDO29CQUNULElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO2dCQUM5QixDQUFDO2dCQUNELElBQUksUUFBUSxFQUFFLENBQUM7b0JBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN6QixrRUFBa0U7b0JBQ2xFLG9EQUFvRDtvQkFDcEQsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDcEMsTUFBTTtnQkFDUixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxJQUFJLENBQUMsS0FBWTtRQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQy9DLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQ0UsS0FBSyxDQUFDLGFBQWE7WUFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQ3RFLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLFlBQVksQ0FBQyxLQUFLLENBQUMsOENBQThDLEVBQUU7WUFDakUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztZQUMxQixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7WUFDbEMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtTQUMzQixDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxjQUFjO1FBQ3BCLDJFQUEyRTtRQUMzRSxzRUFBc0U7UUFDdEUseUVBQXlFO1FBQ3pFLHlDQUF5QztRQUN6QyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3ZELHFFQUFxRTtZQUNyRSx1RUFBdUU7WUFDdkUsMEVBQTBFO1lBQzFFLHNFQUFzRTtZQUN0RSxzRUFBc0U7WUFDdEUsc0RBQXNEO1lBQ3RELFlBQVksQ0FBQyxLQUFLLENBQUMsaURBQWlELEVBQUU7Z0JBQ3BFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPO2dCQUNyQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUztnQkFDekMsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWE7Z0JBQ2pELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07YUFDM0IsQ0FBQyxDQUFDO1lBQ0gsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVPLHVCQUF1QixDQUFDLFlBQW1CLEVBQUUsT0FBZ0I7UUFDbkUsNERBQTREO1FBQzVELHdFQUF3RTtRQUN4RSxxRUFBcUU7UUFDckUscUVBQXFFO1FBQ3JFLHdFQUF3RTtRQUN4RSx3RUFBd0U7UUFDeEUsTUFBTSxZQUFZLEdBQUcsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDbkQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUU7YUFDakQsSUFBSTtRQUNILHNFQUFzRTtRQUN0RSxxRUFBcUU7UUFDckUscUVBQXFFO1FBQ3JFLHNEQUFzRDtRQUN0RCxHQUFHLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUM3RDthQUNBLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDbEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNULG1FQUFtRTtZQUNuRSxrRUFBa0U7WUFDbEUsa0VBQWtFO1lBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO2dCQUN2QyxvRUFBb0U7Z0JBQ3BFLCtEQUErRDtnQkFDL0QsOERBQThEO2dCQUM5RCxxRUFBcUU7Z0JBQ3JFLGlFQUFpRTtnQkFDakUsK0RBQStEO2dCQUMvRCxtRUFBbUU7Z0JBQ25FLGlEQUFpRDtnQkFDakQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQzlDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7b0JBQ3JDLElBQUksSUFBSSxDQUFDLHNCQUFzQixLQUFLLFlBQVksRUFBRSxDQUFDO3dCQUNqRCxPQUFPO29CQUNULENBQUM7b0JBQ0QsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztvQkFDbkMsSUFBSSxPQUFPLEVBQUUsQ0FBQzt3QkFDWixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLFlBQVksRUFBRSxDQUFDOzRCQUNsRCw4REFBOEQ7NEJBQzlELDREQUE0RDs0QkFDNUQsT0FBTzt3QkFDVCxDQUFDO3dCQUNELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDOzRCQUM1QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7NEJBQ2YsT0FBTzt3QkFDVCxDQUFDO29CQUNILENBQUM7b0JBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN2QyxDQUFDLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BeUNHO0lBQ0ssZ0JBQWdCLENBQUMsWUFBb0IsRUFBRSxFQUFjO1FBQzNELE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtZQUNoQixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1lBQ3JDLElBQUksSUFBSSxDQUFDLHNCQUFzQixLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUNqRCxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7Z0JBQzFCLEVBQUUsRUFBRSxDQUFDO2dCQUNMLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQy9CLElBQUksSUFBSSxDQUFDLHNCQUFzQixLQUFLLFlBQVksRUFBRSxDQUFDO29CQUNqRCxPQUFPO2dCQUNULENBQUM7Z0JBQ0QsdUVBQXVFO2dCQUN2RSx5RUFBeUU7Z0JBQ3pFLHlFQUF5RTtnQkFDekUsc0VBQXNFO2dCQUN0RSxzRUFBc0U7Z0JBQ3RFLHlFQUF5RTtnQkFDekUsd0VBQXdFO2dCQUN4RSxVQUFVO2dCQUNWLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEV2ZW50LCBlbnZOdW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZXZlbnRzTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG4vKipcbiAqIERlbGF5IGJlZm9yZSBmaXJpbmcgdGhlIGRlZmVycmVkIHVuY29uc3VtZWQtZXZlbnQgY2hlY2sgYWZ0ZXIgdGhlIHByb21pc2VcbiAqIHF1ZXVlIGhhcyBkcmFpbmVkLiBNdXN0IGJlIGxvbmcgZW5vdWdoIGZvciBjcm9zcy1WTSBtaWNyb3Rhc2sgY2hhaW5zIHRvXG4gKiBwcm9wYWdhdGUgKHJlc29sdmUgaW4gaG9zdCDihpIgd29ya2Zsb3cgY29kZSBpbiBWTSDihpIgc3Vic2NyaWJlIGNhbGwgYmFja1xuICogaW4gaG9zdCkuIEFueSBzdWJzY3JpYmUoKSBhcnJpdmluZyBkdXJpbmcgdGhpcyB3aW5kb3cgY2FuY2VscyB0aGUgY2hlY2suXG4gKi9cbmV4cG9ydCBjb25zdCBERUZFUlJFRF9DSEVDS19ERUxBWV9NUyA9IDEwMDtcblxuLyoqXG4gKiBGbG9vciBmb3IgdGhlIGRlZmVycmVkLWNoZWNrIGRlbGF5LCBzbyBhIHRvby1sb3cgb3ZlcnJpZGUgY2FuJ3QgbWFudWZhY3R1cmVcbiAqIHNwdXJpb3VzIGRpdmVyZ2VuY2UgKGVhY2ggZmFsc2UgcG9zaXRpdmUgYnVybnMgYSBkaXZlcmdlbmNlLXJlY292ZXJ5IHJldHJ5XG4gKiBhbmQgY2FuIGVzY2FsYXRlIHRvIGEgdGVybWluYWwgYENvcnJ1cHRlZEV2ZW50TG9nRXJyb3JgKS5cbiAqXG4gKiBFeHBvcnRlZCBzbyB0ZXN0cyBuZWVkaW5nIHRoZSBzaG9ydGVzdCBsZWdhbCBkZWxheSBjYW4gYXNrIGZvciBpdCBpbnN0ZWFkIG9mXG4gKiBoYXJkY29kaW5nIGEgbnVtYmVyIHRoaXMgZmxvb3Igd291bGQgc2lsZW50bHkgY2xhbXAgdXAuXG4gKi9cbmV4cG9ydCBjb25zdCBNSU5fREVGRVJSRURfQ0hFQ0tfREVMQVlfTVMgPSAxMDtcblxuLyoqXG4gKiBFZmZlY3RpdmUgZGVmZXJyZWQtY2hlY2sgZGVsYXkuIE92ZXJyaWRlOiBgV09SS0ZMT1dfREVGRVJSRURfQ0hFQ0tfREVMQVlfTVNgLlxuICpcbiAqIFVubGlrZSB0aGUgb3RoZXIgdGltaW5nIGtub2JzIHRoaXMgaXMgbm90IGEgcG9sbGluZyBpbnRlcnZhbCBidXQgYVxuICogZGV0ZXJtaW5pc20gc2FmZXR5IG1hcmdpbjogZmlyaW5nIHRoZSB1bmNvbnN1bWVkLWV2ZW50IGNoZWNrIGJlZm9yZSB0aGVcbiAqIGNyb3NzLVZNIHN1YnNjcmliZSgpIGNoYWluIGhhcyBsYW5kZWQgcmVqZWN0cyBhIGhlYWx0aHkgcnVuIHdpdGhcbiAqIGBSZXBsYXlEaXZlcmdlbmNlRXJyb3JgLlxuICovXG5jb25zdCBnZXREZWZlcnJlZENoZWNrRGVsYXlNcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19ERUZFUlJFRF9DSEVDS19ERUxBWV9NUycsIERFRkVSUkVEX0NIRUNLX0RFTEFZX01TLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IE1JTl9ERUZFUlJFRF9DSEVDS19ERUxBWV9NUyxcbiAgfSk7XG5cbi8qKlxuICogRXZlbnQgdHlwZXMgdGhlIG9yZGVyZWQgd2FsayBtYXkgc3RlcCBvdmVyIGFuZCBkZWxpdmVyIGxhdGVyLlxuICpcbiAqIE1lbWJlcnNoaXAgaXMgbm90IGFib3V0IHdobyB3cm90ZSB0aGUgZXZlbnQuIEl0IGlzIGFib3V0IHdoZXRoZXIgdGhlIGV2ZW50XG4gKiBjYW4gcmVhY2ggdGhlIGhlYWQgb2YgdGhlIHdhbGsgd2l0aCBub3RoaW5nIHJlZ2lzdGVyZWQgdG8gY29uc3VtZSBpdCwgd2hpY2hcbiAqIGlzIHRoZSBvbmx5IHNpdHVhdGlvbiBwYXJraW5nIGV4aXN0cyBmb3IuXG4gKlxuICogTW9zdCB0eXBlcyBjYW5ub3QuIFRoZXkgYXJlIHJlcGxheS1vcmlnaW46IGEgcmVwbGF5IGVtaXRzIHRoZW0sIGluIHRoZSBvcmRlclxuICogaXRzIGNvZGUgcmVhY2hlcyB0aGVtLCBzbyB0aGVpciBwb3NpdGlvbiBpbiB0aGUgbG9nIGlzIHRoZSByZWNvcmQgb2Ygd2hhdFxuICogdGhhdCByZXBsYXkgZGVjaWRlZC4gUmVhY2hpbmcgb25lIG9mIHRob3NlIG91dCBvZiBvcmRlciBtZWFucyB0aGlzIHJlcGxheVxuICogZGVjaWRlZCBkaWZmZXJlbnRseSB0aGFuIHRoZSBsb2cgaG9sZHMsIHdoaWNoIGlzIGRpdmVyZ2VuY2UgYW5kIG5vdGhpbmcgZWxzZS5cbiAqXG4gKiBTdGVwIGxpZmVjeWNsZSBldmVudHMgYXJlIG5vdCByZXBsYXktb3JpZ2luLCBhbmQgYXJlIHN0aWxsIGFic2VudCwgYmVjYXVzZVxuICogdGhleSBhbHdheXMgaGF2ZSBhIGNsYWltYW50LiBgc3RlcCgpYCBzdWJzY3JpYmVzIGl0cyBjb25zdW1lciBiZWZvcmUgdGhlXG4gKiBzdGVwJ3MgZmlyc3QgZXZlbnQgY2FuIGV4aXN0OyBgc3RlcF9jcmVhdGVkYCBpcyBvcmRlcmVkLCBzbyB0aGUgd2FsayBjYW5ub3RcbiAqIHBhc3MgaXQgdW5sZXNzIGEgY29uc3VtZXIgdGFrZXMgaXQ7IGFuZCB0aGF0IGNvbnN1bWVyIHN0YXlzIHN1YnNjcmliZWQgdW50aWxcbiAqIGBzdGVwX2NvbXBsZXRlZGAgb3IgYHN0ZXBfZmFpbGVkYCwgYWZ0ZXIgd2hpY2ggdGhlIFdvcmxkIHJlZnVzZXMgYW55IGZ1cnRoZXJcbiAqIHdyaXRlIGZvciB0aGF0IHN0ZXAuIFRoZXJlIGlzIG5vIHdpbmRvdyBpbiB3aGljaCBhIHJlcGxheSBrbm93cyBhYm91dCBhIHN0ZXBcbiAqIGFuZCBoYXMgbm90aGluZyByZWdpc3RlcmVkIHRvIGNvbnN1bWUgaXRzIGV2ZW50cywgc28gcGFya2luZyB0aGVtIHdvdWxkIG9ubHlcbiAqIGRlZmVyIHJlcG9ydHMgb2Ygd2hhdCBpcyBkaXZlcmdlbmNlIGVpdGhlciB3YXkuIFRoZSBzYW1lIGhvbGRzIGZvclxuICogYHdhaXRfY3JlYXRlZGAgYW5kIGl0cyBjb25zdW1lci4gYHdhaXRfY29tcGxldGVkYCBpcyBsaXN0ZWQgYW55d2F5OiBhIHNsZWVwXG4gKiBjYW4gYWxzbyBiZSBjb21wbGV0ZWQgb3V0IG9mIGJhbmQsIGJ5IHRoZSBBUEkgdGhhdCBmb3JjZS1jb21wbGV0ZXMgcGVuZGluZ1xuICogd2FpdHMsIGFuZCB0b2xlcmF0aW5nIGEgc3RyYXkgb25lIGlzIHRoZSBjaGVhcGVyIGRpcmVjdGlvbiB0byBiZSB3cm9uZyBpbi5cbiAqXG4gKiBBbiBhbGxvd2xpc3QgcmF0aGVyIHRoYW4gdGhlIGNvbXBsZW1lbnQgb2YgdGhlIG9yZGVyZWQgc2V0LCBzbyBhIHR5cGUgdGhpc1xuICogZmlsZSBoYXMgbm90IGJlZW4gdGF1Z2h0IGFib3V0IGtlZXBzIHRoZSBzdHJpY3Qgb2xkIGJlaGF2aW91ci5cbiAqXG4gKiBgaG9va19kaXNwb3NlZGAgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBkZXNwaXRlIGJlaW5nIGFib3V0IGEgaG9vazogaXQgaXNcbiAqIHdyaXR0ZW4gd2hlbiB0aGUgd29ya2Zsb3cncyBvd24gYHVzaW5nYCBzY29wZSBleGl0cywgc28gaXQgaXMgcmVwbGF5LW9yaWdpbi5cbiAqXG4gKiBgYXR0cl9zZXRgIGlzIGxpc3RlZCBieSB0eXBlIGV2ZW4gdGhvdWdoIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgaXQgbWF5IGJlXG4gKiByZXBsYXktb3JpZ2luLCBzaW5jZSBpdCBpcyByZXBsYXktb3JpZ2luIHdoZW4gaXRzIHdyaXRlciBpcyB0aGUgd29ya2Zsb3cuXG4gKiBTcGxpdHRpbmcgdGhhdCBvdXQgcGVyIGV2ZW50IHdhcyBjb25zaWRlcmVkIGFuZCByZWplY3RlZC4gQSByZXBsYXkgdGhhdFxuICogcmVhY2hlcyBvbmUgb2YgaXRzIG93biB3cml0ZXMgb3V0IG9mIHBvc2l0aW9uIGhhcyBkaXZlcmdlZCwgYnV0IGEgcmVwbGF5IHRoYXRcbiAqIHJlYWNoZXMgYW4gZXZlbnQgaXQgZGlkIE5PVCB3cml0ZSwgc2l0dGluZyB3aGVyZSBpdHMgb3duIHdyaXRlIHdvdWxkIGdvLCBoYXNcbiAqIG5vdDogdGhlIHdyaXRlciBmaWVsZCBzYXlzIHdobyB3cm90ZSB0aGUgZXZlbnQsIGFuZCBub3Qgd2hldGhlciB0aGlzIHJlcGxheVxuICogaXMgdGhlIHNhbWUgb25lLiBHdWVzc2luZyB3cm9uZyBpbiB0aGF0IGRpcmVjdGlvbiBmYWlscyBoZWFsdGh5IHJ1bnMsIHdoaWNoXG4gKiBpcyB0aGUgZmFpbHVyZSB0aGlzIGZpbGUgZXhpc3RzIHRvIHN0b3AsIHNvIHRoZSB3aG9sZSB0eXBlIGlzIHRvbGVyYXRlZC4gVGhlXG4gKiBjb3N0IGlzIHRoYXQgYSBkaXZlcmdlbmNlIGludm9sdmluZyBgYXR0cl9zZXRgIHN1cmZhY2VzIGF0IHRoZSBlbmQgb2YgdGhlXG4gKiByZXBsYXksIHRocm91Z2ggYHN0cmFuZGVkRXZlbnRgLCByYXRoZXIgdGhhbiBhdCB0aGUgb2ZmZW5kaW5nIGV2ZW50LlxuICovXG5jb25zdCBQQVJLQUJMRV9FVkVOVF9UWVBFUzogUmVhZG9ubHlTZXQ8RXZlbnRbJ2V2ZW50VHlwZSddPiA9IG5ldyBTZXQoW1xuICAnaG9va19yZWNlaXZlZCcsXG4gICdob29rX2NvbmZsaWN0JyxcbiAgJ3dhaXRfY29tcGxldGVkJyxcbiAgJ2F0dHJfc2V0JyxcbiAgJ3J1bl9jYW5jZWxsZWQnLFxuXSk7XG5cbi8qKlxuICogUGFya2FibGUgdHlwZXMgdGhhdCBjYW4gb25seSBldmVyIHJlc29sdmUgdGhlaXIgY29ycmVsYXRpb24gaWQgb25jZS5cbiAqXG4gKiBBIHNlY29uZCBvbmUgZm9yIHRoZSBzYW1lIGlkIGlzIG5vdCBhIGRlbGl2ZXJ5IHRoaXMgcmVwbGF5IGhhcyBub3QgcmVhY2hlZFxuICogeWV0OiBpdCBpcyBhIHJlc29sdXRpb24gZm9yIHNvbWV0aGluZyBhbHJlYWR5IHJlc29sdmVkLCB3aGljaCBubyBjb25zdW1lclxuICogdGhpcyByZXBsYXkgb3IgYW55IGxhdGVyIG9uZSByZWdpc3RlcnMgY2FuIGV2ZXIgY2xhaW0uIGBob29rX3JlY2VpdmVkYCBpc1xuICogYWJzZW50IGJlY2F1c2UgYSBob29rIGxlZ2l0aW1hdGVseSBmaXJlcyBtYW55IHRpbWVzIHVuZGVyIG9uZSBpZC5cbiAqXG4gKiBNdXN0IHN0YXkgYSBzdWJzZXQgb2Yge0BsaW5rIFBBUktBQkxFX0VWRU5UX1RZUEVTfToge0BsaW5rIHBhcmt9IGlzIHRoZSBvbmx5XG4gKiByZWFkZXIgb2Ygd2hhdCB0aGlzIHJlY29yZHMsIGFuZCBpdCByZWplY3RzIGEgbm9uLXBhcmthYmxlIHR5cGUgYmVmb3JlIGl0XG4gKiBsb29rcywgc28gYW4gZW50cnkgb3V0c2lkZSB0aGF0IHNldCBpcyBkZWFkIHdlaWdodCBvbiBhIGhvdCBwYXRoLlxuICovXG5jb25zdCBPTkVfU0hPVF9FVkVOVF9UWVBFUzogUmVhZG9ubHlTZXQ8RXZlbnRbJ2V2ZW50VHlwZSddPiA9IG5ldyBTZXQoW1xuICAnd2FpdF9jb21wbGV0ZWQnLFxuXSk7XG5cbi8qKiBJZGVudGlmaWVzIHRoZSB0aGluZyBhIG9uZS1zaG90IHJlc29sdXRpb24gZXZlbnQgcmVzb2x2ZXMuICovXG5mdW5jdGlvbiByZXNvbHV0aW9uS2V5KGV2ZW50VHlwZTogc3RyaW5nLCBjb3JyZWxhdGlvbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7ZXZlbnRUeXBlfToke2NvcnJlbGF0aW9uSWR9YDtcbn1cblxuLyoqXG4gKiBUeXBlcyB0aGF0IGVuZCBhIHJ1bi4gT25jZSBvbmUgaXMgaW4gdGhlIGxvZywgbm8gY29uc3VtZXIgd2lsbCBldmVyIGJlXG4gKiByZWdpc3RlcmVkIGFnYWluLCBzbyBhIHBhcmtlZCBldmVudCBzdGlsbCBwYXJrZWQgaGVyZSB3aWxsIG5ldmVyIGJlIGNsYWltZWQuXG4gKi9cbmNvbnN0IFRFUk1JTkFMX0VWRU5UX1RZUEVTOiBSZWFkb25seVNldDxFdmVudFsnZXZlbnRUeXBlJ10+ID0gbmV3IFNldChbXG4gICdydW5fY29tcGxldGVkJyxcbiAgJ3J1bl9mYWlsZWQnLFxuICAncnVuX2NhbmNlbGxlZCcsXG5dKTtcblxuZXhwb3J0IGVudW0gRXZlbnRDb25zdW1lclJlc3VsdCB7XG4gIC8qKlxuICAgKiBDYWxsYmFjayBjb25zdW1lZCB0aGUgZXZlbnQsIGJ1dCBzaG91bGQgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgY2FsbGJhY2tzIGxpc3RcbiAgICovXG4gIENvbnN1bWVkLFxuICAvKipcbiAgICogQ2FsbGJhY2sgZGlkIG5vdCBjb25zdW1lIHRoZSBldmVudCwgc28gaXQgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgbmV4dCBjYWxsYmFja1xuICAgKi9cbiAgTm90Q29uc3VtZWQsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBjb25zdW1lZCB0aGUgZXZlbnQsIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWxsYmFja3MgbGlzdFxuICAgKi9cbiAgRmluaXNoZWQsXG59XG5cbnR5cGUgRXZlbnRDb25zdW1lckNhbGxiYWNrID0gKGV2ZW50OiBFdmVudCB8IG51bGwpID0+IEV2ZW50Q29uc3VtZXJSZXN1bHQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRzQ29uc3VtZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIENhbGxiYWNrIGludm9rZWQgYWZ0ZXIgYW4gZXZlbnQgaGFzIGJlZW4gY29uc3VtZWQuIENvbnN1bWVycyBzdWNoIGFzIHRoZVxuICAgKiBkZXRlcm1pbmlzdGljIHdvcmtmbG93IGNsb2NrIG11c3Qgbm90IG9ic2VydmUgZXZlbnRzIHRoYXQgYXJlIG1lcmVseVxuICAgKiBpbnNwZWN0ZWQgd2hpbGUgd2FpdGluZyBmb3IgdXNlciBjb2RlIHRvIHN1YnNjcmliZSB0byB0aGUgbmV4dCBvcGVyYXRpb24uXG4gICAqL1xuICBvbkNvbnN1bWVkRXZlbnQ/OiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkO1xuICAvKipcbiAgICogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGEgbm9uLW51bGwgZXZlbnQgY2Fubm90IGJlIGNvbnN1bWVkIGJ5IGFueSByZWdpc3RlcmVkXG4gICAqIGNhbGxiYWNrLCBpbmRpY2F0aW5nIGFuIG9ycGhhbmVkIG9yIGludmFsaWQgZXZlbnQgaW4gdGhlIGV2ZW50IGxvZy4gVGhlXG4gICAqIGNoZWNrIGlzIGRlZmVycmVkIHVudGlsIGFmdGVyIHRoZSBwcm9taXNlIHF1ZXVlIGhhcyBkcmFpbmVkLCBlbnN1cmluZyB0aGF0XG4gICAqIGFueSBwZW5kaW5nIGFzeW5jIHdvcmsgKGUuZy4sIGRlc2VyaWFsaXphdGlvbi9kZWNyeXB0aW9uKSBjb21wbGV0ZXMgYW5kXG4gICAqIGRvd25zdHJlYW0gc3Vic2NyaWJlKCkgY2FsbHMgaGF2ZSBhIGNoYW5jZSB0byBjYW5jZWwgdGhlIGNoZWNrIGZpcnN0LlxuICAgKi9cbiAgb25VbmNvbnN1bWVkRXZlbnQ6IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHByb21pc2UgcXVldWUuIFRoZSB1bmNvbnN1bWVkIGV2ZW50IGNoZWNrIGlzIGNoYWluZWRcbiAgICogb250byB0aGlzIHF1ZXVlIHNvIGl0IG9ubHkgZmlyZXMgYWZ0ZXIgYWxsIHBlbmRpbmcgYXN5bmMgd29yayAoZS5nLixcbiAgICogZGVzZXJpYWxpemF0aW9uKSBoYXMgY29tcGxldGVkLiBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyB3aGVuIGFzeW5jXG4gICAqIGRlc2VyaWFsaXphdGlvbiBkZWxheXMgdGhlIHJlc29sdmUoKSB0aGF0IHRyaWdnZXJzIHRoZSBuZXh0IHN1YnNjcmliZSgpLlxuICAgKi9cbiAgZ2V0UHJvbWlzZVF1ZXVlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogV2hldGhlciBubyBkYXRhIGRlbGl2ZXJ5IGlzIGluIGZsaWdodCAoYGlzRGVsaXZlcnlJZGxlYCBpbiBwcml2YXRlLnRzKS5cbiAgICogVGhlIHVuY29uc3VtZWQtZXZlbnQgY2hlY2sgd2FpdHMgZm9yIHRoaXMgYmVmb3JlIGl0IGZpcmVzOiBhIGRlbGl2ZXJ5IGluXG4gICAqIGZsaWdodCBtZWFucyB0aGUgd29ya2Zsb3cgVk0gaXMgbWlkLXJlYWN0aW9uLCBhbmQgYW4gZXZlbnQgaXQgaGFzIG5vdFxuICAgKiBjbGFpbWVkIHlldCBpcyBhbiBldmVudCBpdCBoYXMgbm90IHJlYWNoZWQgeWV0LlxuICAgKlxuICAgKiBSZXF1aXJlZCByYXRoZXIgdGhhbiBkZWZhdWx0aW5nIHRvIGFsd2F5cy1pZGxlOiBhbHdheXMtaWRsZSBpcyBleGFjdGx5IHRoZVxuICAgKiBwcmUtZ2F0ZSBiZWhhdmlvdXIsIHNvIGEgZGVmYXVsdGVkIG9wdGlvbiB3b3VsZCBsZXQgYSBjb25zdHJ1Y3Rpb24gc2l0ZSBvcHRcbiAgICogYSB3aG9sZSByZXBsYXkgcGF0aCBiYWNrIG91dCB3aXRob3V0IHNheWluZyBzby4gVGVzdHMgdGhhdCBkcml2ZSBhIGNvbnN1bWVyXG4gICAqIHdpdGggbm8gb3JjaGVzdHJhdG9yIGNvbnRleHQgcGFzcyBgKCkgPT4gdHJ1ZWAgdG8ga2VlcCB0aGUgcHJlLWV4aXN0aW5nXG4gICAqIHRpbWluZywgYW5kIHNheSBzbyBhdCB0aGUgY2FsbCBzaXRlLlxuICAgKi9cbiAgaXNEZWxpdmVyeUlkbGU6ICgpID0+IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudHNDb25zdW1lciB7XG4gIGV2ZW50SW5kZXg6IG51bWJlcjtcbiAgcmVhZG9ubHkgZXZlbnRzOiBFdmVudFtdO1xuICByZWFkb25seSBjYWxsYmFja3M6IEV2ZW50Q29uc3VtZXJDYWxsYmFja1tdID0gW107XG4gIC8qKlxuICAgKiBFdmVudHMgdGhlIG9yZGVyZWQgd2FsayBzdGVwcGVkIG92ZXIgYmVjYXVzZSBub2JvZHkgY2xhaW1lZCB0aGVtIGFuZCB0aGVpclxuICAgKiB0eXBlIGNhcnJpZXMgbm8gb3JkZXJpbmcgY2xhaW0uIEVhY2gga2VlcHMgdGhlIGluZGV4IGl0IGhlbGQgaW4gdGhlIGxvZzpcbiAgICogY29uc3VtZXJzIHJlYWQge0BsaW5rIGV2ZW50SW5kZXh9IGF0IGNvbnN1bXB0aW9uIHRpbWUgdG8gb3JkZXIgdGhlaXJcbiAgICogZGVsaXZlcnkgYWdhaW5zdCB0aGUgcmVzdCBvZiB0aGUgbG9nLCBhbmQgYSBsYXRlIGRlbGl2ZXJ5IG11c3Qgc3RpbGwgbWFrZVxuICAgKiB0aGUgY2xhaW0gaXRzIHBvc2l0aW9uIGdhdmUgaXQuXG4gICAqXG4gICAqIEhlbGQgaW4gbG9nIG9yZGVyLCBkcmFpbmVkIGluIGxvZyBvcmRlciwgYW5kIGRyYWluZWQgYmVmb3JlIGV2ZXJ5IG9mZmVyIHNvXG4gICAqIGEgY29uc3VtZXIgcmVnaXN0ZXJlZCBhZnRlciB0aGUgd2FsayBwYXNzZWQgdGhlIGV2ZW50IHN0aWxsIHJlY2VpdmVzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJrZWQ6IHsgZXZlbnQ6IEV2ZW50OyBpbmRleDogbnVtYmVyIH1bXSA9IFtdO1xuICAvKipcbiAgICogQ29ycmVsYXRpb24gaWRzIG9mIHRoZSB7QGxpbmsgT05FX1NIT1RfRVZFTlRfVFlQRVN9IGV2ZW50cyBjb25zdW1lZCBzb1xuICAgKiBmYXIsIHNvIGEgc2Vjb25kIHJlc29sdXRpb24gZm9yIG9uZSBvZiB0aGVtIGlzIHJlY29nbml6ZWQgYXMgdW5jbGFpbWFibGVcbiAgICogcmF0aGVyIHRoYW4gcGFya2VkIGZvciBhIGNvbnN1bWVyIHRoYXQgY2Fubm90IGV4aXN0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIG9uQ29uc3VtZWRFdmVudD86IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUgb25VbmNvbnN1bWVkRXZlbnQ6IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUgZ2V0UHJvbWlzZVF1ZXVlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIGlzRGVsaXZlcnlJZGxlOiAoKSA9PiBib29sZWFuO1xuICBwcml2YXRlIHBlbmRpbmdVbmNvbnN1bWVkQ2hlY2s6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdW5jb25zdW1lZENoZWNrVmVyc2lvbiA9IDA7XG5cbiAgY29uc3RydWN0b3IoZXZlbnRzOiBFdmVudFtdLCBvcHRpb25zOiBFdmVudHNDb25zdW1lck9wdGlvbnMpIHtcbiAgICAvLyBPd24gY29weTogdGhlIHJ1bnRpbWUgbXV0YXRlcyBpdHMgZXZlbnQgYXJyYXkgaW4gcGxhY2UsIGFuZCBhIHJldGFpbmVkXG4gICAgLy8gc2Vzc2lvbiBtdXN0IG9ubHkgb2JzZXJ2ZSBuZXcgZXZlbnRzIHRocm91Z2ggYXBwZW5kKCkgc28gcmVzdW1lKCknc1xuICAgIC8vIHN0cmljdC1leHRlbnNpb24gY2hlY2sgc3RheXMgbWVhbmluZ2Z1bC5cbiAgICB0aGlzLmV2ZW50cyA9IFsuLi5ldmVudHNdO1xuICAgIHRoaXMuZXZlbnRJbmRleCA9IDA7XG4gICAgdGhpcy5vbkNvbnN1bWVkRXZlbnQgPSBvcHRpb25zLm9uQ29uc3VtZWRFdmVudDtcbiAgICB0aGlzLm9uVW5jb25zdW1lZEV2ZW50ID0gb3B0aW9ucy5vblVuY29uc3VtZWRFdmVudDtcbiAgICB0aGlzLmdldFByb21pc2VRdWV1ZSA9IG9wdGlvbnMuZ2V0UHJvbWlzZVF1ZXVlO1xuICAgIHRoaXMuaXNEZWxpdmVyeUlkbGUgPSBvcHRpb25zLmlzRGVsaXZlcnlJZGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvbGRlc3QgZXZlbnQgdGhlIHdhbGsgc3RlcHBlZCBvdmVyIHRoYXQgbm8gY29uc3VtZXIgaGFzIGNsYWltZWQgeWV0LFxuICAgKiBpZiBhbnkuIFBhcmtpbmcgaXMgYSBiZXQgdGhhdCBhIGNvbnN1bWVyIHdpbGwgYmUgcmVnaXN0ZXJlZCBsYXRlciwgc28gYXRcbiAgICogYW55IHBvaW50IHdoZXJlIG5vIGNvbnN1bWVyIGV2ZXIgd2lsbCBiZSBhZ2FpbiDigJQgdGhlIHJlcGxheSBmaW5pc2hpbmcgaXNcbiAgICogdGhlIGRlZmluaXRpdmUgb25lIOKAlCB0aGlzIGFuc3dlcnMgd2hpY2ggZXZlbnQgdGhlIGJldCBsb3N0IG9uLlxuICAgKi9cbiAgZ2V0IHN0cmFuZGVkRXZlbnQoKTogRXZlbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmtlZFswXT8uZXZlbnQ7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCB0aGUgd2FsayBpcyBzdGlsbCBob2xkaW5nLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGhvbGRzIG5vdGhpbmcuXG4gICAqXG4gICAqIFJlYWQgYXQgZXZlcnkgcG9pbnQgYSByZXBsYXkgc3RvcHMsIGluY2x1ZGluZyB0aGUgc3VzcGVuc2lvbnMgdGhhdCBhcmUgbm90XG4gICAqIHNldHRsaW5nIHBvaW50cywgc28gdGhlIGhlbGQgc3RhdGUgcmVhY2hlcyB0ZWxlbWV0cnkuIEEgcmVwbGF5IGNhbm5vdCB0ZWxsXG4gICAqIGEgZGVsaXZlcnkgYXdhaXRpbmcgYSBsYXRlciBjb25zdW1lciBmcm9tIG9uZSBubyBjb25zdW1lciB3aWxsIGV2ZXJcbiAgICogcmVnaXN0ZXIsIHNvIGl0IHJlcG9ydHMgcmF0aGVyIHRoYW4gZGVjaWRlczogdGhlIHNhbWUgYGV2ZW50SWRgIHJlcG9ydGVkIG9uXG4gICAqIHN1c3BlbnNpb24gYWZ0ZXIgc3VzcGVuc2lvbiBvZiBvbmUgcnVuIGlzIHRoZSBzaGFwZSB0aGF0IHNheXMgdGhlIGJldFxuICAgKiBwYXJraW5nIG1hZGUgaXMgbm90IGdvaW5nIHRvIHBheSBvZmYsIGFuZCB0aGF0IHNoYXBlIGlzIG9ubHkgdmlzaWJsZSBhY3Jvc3NcbiAgICogcmVwbGF5cy5cbiAgICovXG4gIGdldCBwYXJrZWRTdW1tYXJ5KCk6XG4gICAgfCB7IGNvdW50OiBudW1iZXI7IGV2ZW50SWQ6IHN0cmluZzsgZXZlbnRUeXBlOiBFdmVudFsnZXZlbnRUeXBlJ10gfVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBvbGRlc3QgPSB0aGlzLnBhcmtlZFswXT8uZXZlbnQ7XG4gICAgaWYgKCFvbGRlc3QpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjb3VudDogdGhpcy5wYXJrZWQubGVuZ3RoLFxuICAgICAgZXZlbnRJZDogb2xkZXN0LmV2ZW50SWQsXG4gICAgICBldmVudFR5cGU6IG9sZGVzdC5ldmVudFR5cGUsXG4gICAgfTtcbiAgfVxuXG4gIGFwcGVuZChldmVudHM6IEV2ZW50W10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykgdGhpcy5ldmVudHMucHVzaChldmVudCk7XG4gICAgcHJvY2Vzcy5uZXh0VGljayh0aGlzLmNvbnN1bWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhZnRlciBhbiBldmVudCBoYXMgYmVlbiBjb25zdW1lZFxuICAgKiBieSBhIGRpZmZlcmVudCBjYWxsYmFjay4gVGhlIGNhbGxiYWNrIGNhbiByZXR1cm46XG4gICAqICAtIGBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkYCB0aGUgZXZlbnQgaXMgY29uc2lkZXJlZCBjb25zdW1lZCBhbmQgd2lsbCBub3QgYmUgcGFzc2VkIHRvIGFueSBvdGhlciBjYWxsYmFjaywgYnV0IHRoZSBjYWxsYmFjayB3aWxsIHJlbWFpbiBpbiB0aGUgY2FsbGJhY2tzIGxpc3RcbiAgICogIC0gYEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWRgIHRoZSBldmVudCBpcyBwYXNzZWQgdG8gdGhlIG5leHQgY2FsbGJhY2tcbiAgICogIC0gYEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWRgIHRoZSBldmVudCBpcyBjb25zaWRlcmVkIGNvbnN1bWVkIGFuZCB0aGUgY2FsbGJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjYWxsYmFja3MgbGlzdFxuICAgKlxuICAgKiBAcGFyYW0gZm4gLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVnaXN0ZXIuXG4gICAqL1xuICBzdWJzY3JpYmUoZm46IEV2ZW50Q29uc3VtZXJDYWxsYmFjaykge1xuICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goZm4pO1xuICAgIC8vIENhbmNlbCBhbnkgcGVuZGluZyB1bmNvbnN1bWVkIGNoZWNrIHNpbmNlIGEgbmV3IGNhbGxiYWNrIG1heSBjb25zdW1lIHRoZSBldmVudC5cbiAgICAvLyBJbmNyZW1lbnRpbmcgdGhlIHZlcnNpb24gY2F1c2VzIGFueSBpbi1mbGlnaHQgcHJvbWlzZSBjaGFpbiBjaGVjayB0byBuby1vcC5cbiAgICAvLyBBbHNvIGNsZWFyIHRoZSBwZW5kaW5nIHNldFRpbWVvdXQgaWYgaXQgaGFzbid0IGZpcmVkIHlldC5cbiAgICBpZiAodGhpcy5wZW5kaW5nVW5jb25zdW1lZENoZWNrICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24rKztcbiAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRDaGVjayA9IG51bGw7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBwcm9jZXNzLm5leHRUaWNrKHRoaXMuY29uc3VtZSk7XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeUNvbnN1bWVkRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLm9uQ29uc3VtZWRFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5vbkNvbnN1bWVkRXZlbnQoZXZlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBldmVudHNMb2dnZXIuZXJyb3IoJ29uQ29uc3VtZWRFdmVudCBjYWxsYmFjayB0aHJldyBhbiBlcnJvcicsIHtcbiAgICAgICAgZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWUgPSAoKSA9PiB7XG4gICAgLy8gRHJhaW4gY29uc2VjdXRpdmVseSBjb25zdW1hYmxlIGV2ZW50cyBzeW5jaHJvbm91c2x5IHdpdGhpbiBhIHNpbmdsZVxuICAgIC8vIHBhc3MgaW5zdGVhZCBvZiBwYXlpbmcgb25lIGBwcm9jZXNzLm5leHRUaWNrYCBwZXIgY29uc3VtZWQgZXZlbnQuXG4gICAgLy9cbiAgICAvLyBXaHkgdGhpcyBpcyBzYWZlOiBhIGNhbGxiYWNrIG9ubHkgY29uc3VtZXMgYW4gZXZlbnQgdXNpbmcgYSBjb25zdW1lclxuICAgIC8vIHRoYXQgaXMgQUxSRUFEWSByZWdpc3RlcmVkIChlLmcuIGEgbG9uZy1saXZlZCBzdGVwIGNvbnN1bWVyIHdhbGtpbmdcbiAgICAvLyBgc3RlcF9jcmVhdGVkYCDihpIgYHN0ZXBfc3RhcnRlZGAg4oaSIGBzdGVwX2NvbXBsZXRlZGAsIG9yIHRoZSBzdHJ1Y3R1cmFsXG4gICAgLy8gbGlmZWN5Y2xlIGNvbnN1bWVyKS4gTmV3IGNvbnN1bWVycyBhcmUgb25seSBldmVyIHJlZ2lzdGVyZWQgYnkgd29ya2Zsb3dcbiAgICAvLyBWTSBib2R5IGNvZGUgdGhhdCBydW5zIGFzeW5jaHJvbm91c2x5IG9mZiBgY3R4LnByb21pc2VRdWV1ZWAgYWZ0ZXIgYVxuICAgIC8vIGRlbGl2ZXJ5IGByZXNvbHZlKClgOyBub25lIG9mIHRoZSBjYWxsYmFja3MgaGVyZSBjYWxsIGBzdWJzY3JpYmUoKWBcbiAgICAvLyBzeW5jaHJvbm91c2x5LiBTbyB3aXRoaW4gb25lIHBhc3MgYHRoaXMuY2FsbGJhY2tzYCBpcyBtdXRhdGVkIG9ubHkgYnlcbiAgICAvLyB0aGlzIGxvb3AgKHRoZSBgRmluaXNoZWRgIHNwbGljZSksIGFuZCB0aGUgbmV4dCBldmVudCdzIGNvbnN1bWVyIGlzXG4gICAgLy8gZWl0aGVyIGFscmVhZHkgcHJlc2VudCAoYWR2YW5jZSBub3cpIG9yIG5vdCB5ZXQgcmVnaXN0ZXJlZCDigJQgaW4gd2hpY2hcbiAgICAvLyBjYXNlIG5vIGNhbGxiYWNrIGNvbnN1bWVzIHRoZSBldmVudCBhbmQgd2UgZmFsbCB0aHJvdWdoIHRvIHRoZVxuICAgIC8vIGNyb3NzLVZNLXNhZmUgZGVmZXJyZWQgdW5jb25zdW1lZC1ldmVudCBjaGVjayBiZWxvdywgZXhhY3RseSBhcyBiZWZvcmUuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIEJlZm9yZSBldmVyeSBvZmZlciwgbm90IGp1c3Qgb24gc3Vic2NyaWJlOiBhIGNhbGxiYWNrIHJlZ2lzdGVyZWQgYnlcbiAgICAgIC8vIHRoZSB3b3JrIHRoaXMgc2FtZSBwYXNzIGtpY2tlZCBvZmYgbWF5IGJlIHRoZSBvd25lciBvZiBzb21ldGhpbmdcbiAgICAgIC8vIHBhcmtlZCwgYW5kIHRoZSBwYXJrZWQgZXZlbnQncyBkZWxpdmVyeSBpcyBvcmRlcmVkIGFoZWFkIG9mIHRoZSBoZWFkXG4gICAgICAvLyBldmVudCdzIGJ5IHRoZSBpbmRleCBpdCBob2xkcy5cbiAgICAgIHRoaXMuZHJhaW5QYXJrZWQoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRFdmVudCA9IHRoaXMuZXZlbnRzW3RoaXMuZXZlbnRJbmRleF0gPz8gbnVsbDtcbiAgICAgIGNvbnN0IGNvbnN1bWVkID0gdGhpcy5vZmZlcihjdXJyZW50RXZlbnQpO1xuICAgICAgaWYgKGNvbnN1bWVkKSB7XG4gICAgICAgIHRoaXMuZXZlbnRJbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRFdmVudCA9PT0gbnVsbCkge1xuICAgICAgICAvLyBFbmQgb2YgbG9nLiBDb25zdW1lcnMgcmV0dXJuIE5vdENvbnN1bWVkIGZvciB0aGUgYG51bGxgIHNlbnRpbmVsXG4gICAgICAgIC8vICh0aGUgb25lIHRoYXQgcmVjb2duaXplcyBpdCBhcyBpdHMgb3duIGJvdW5kYXJ5IHNjaGVkdWxlcyB0aGVcbiAgICAgICAgLy8gc3VzcGVuc2lvbiBhcyBhIHNpZGUgZWZmZWN0IGFuZCBzdGlsbCBkZWNsaW5lcyBpdCksIHNvIHRoZSBkcmFpblxuICAgICAgICAvLyBzdG9wcyBoZXJlIHJhdGhlciB0aGFuIHNwaW5uaW5nIHBhc3QgdGhlIGVuZC4gYGNvbnN1bWVkYCBpcyBvbmx5XG4gICAgICAgIC8vIHRydWUgZm9yIGEgY2FsbGJhY2sgdGhhdCBjbGFpbXMgdGhlIHNlbnRpbmVsIG91dHJpZ2h0LCB3aGljaCBub1xuICAgICAgICAvLyBwcm9kdWN0aW9uIGNvbnN1bWVyIGRvZXMuXG4gICAgICAgIGlmICghY29uc3VtZWQpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUVuZE9mTG9nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFjb25zdW1lZCkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlVW5jb25zdW1lZENoZWNrKGN1cnJlbnRFdmVudCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEEgcmVhbCBldmVudCB3YXMgY29uc3VtZWQg4oCUIGFkdmFuY2UgdG8gdGhlIG5leHQgaW4gdGhlIHNhbWUgcGFzcy5cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIE9mZmVyIGBjdXJyZW50RXZlbnRgIHRvIGVhY2ggcmVnaXN0ZXJlZCBjYWxsYmFjayBpbiB0dXJuLiBSZXR1cm5zIHRydWVcbiAgICogd2hlbiBhIGNhbGxiYWNrIGNvbnN1bWVkIGl0LiBEb2VzIG5vdCBtb3ZlIHtAbGluayBldmVudEluZGV4fTogdGhlIG9yZGVyZWRcbiAgICogd2FsayBhbmQgdGhlIHBhcmtlZCBkcmFpbiBhZHZhbmNlIGRpZmZlcmVudGx5LCBzbyBlYWNoIGRvZXMgaXRzIG93bi5cbiAgICovXG4gIHByaXZhdGUgb2ZmZXIoY3VycmVudEV2ZW50OiBFdmVudCB8IG51bGwpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2ldO1xuICAgICAgbGV0IGhhbmRsZWQgPSBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlZCA9IGNhbGxiYWNrKGN1cnJlbnRFdmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBldmVudHNMb2dnZXIuZXJyb3IoJ0V2ZW50Q29uc3VtZXIgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3InLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBoYW5kbGVkICE9PSBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkICYmXG4gICAgICAgIGhhbmRsZWQgIT09IEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWRcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50RXZlbnQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGN1cnJlbnRFdmVudC5jb3JyZWxhdGlvbklkICYmXG4gICAgICAgICAgT05FX1NIT1RfRVZFTlRfVFlQRVMuaGFzKGN1cnJlbnRFdmVudC5ldmVudFR5cGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucmVzb2x2ZWQuYWRkKFxuICAgICAgICAgICAgcmVzb2x1dGlvbktleShjdXJyZW50RXZlbnQuZXZlbnRUeXBlLCBjdXJyZW50RXZlbnQuY29ycmVsYXRpb25JZClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm90aWZ5Q29uc3VtZWRFdmVudChjdXJyZW50RXZlbnQpO1xuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRoZSBjYWxsYmFjayBpZiBpdCBoYXMgZmluaXNoZWRcbiAgICAgIGlmIChoYW5kbGVkID09PSBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogT2ZmZXIgZXZlcnl0aGluZyBwYXJrZWQsIG9sZGVzdCBmaXJzdCwgdW50aWwgYSBwYXNzIGNsYWltcyBub3RoaW5nLlxuICAgKlxuICAgKiBFYWNoIG9mZmVyIHJ1bnMgd2l0aCB7QGxpbmsgZXZlbnRJbmRleH0gbW92ZWQgYmFjayB0byB0aGUgcG9zaXRpb24gdGhlXG4gICAqIHBhcmtlZCBldmVudCBoZWxkIGluIHRoZSBsb2csIGJlY2F1c2UgdGhhdCBpcyB0aGUgcG9zaXRpb24gaXRzIGNvbnN1bWVyXG4gICAqIHdpbGwgcmVnaXN0ZXIgYSBkZWxpdmVyeSBiYXJyaWVyIHVuZGVyLiBSZXN0b3JpbmcgdGhlIHdhbGsgcG9pbnRlclxuICAgKiBhZnRlcndhcmRzIGlzIHdoYXQga2VlcHMgdGhlIHR3byBwb2ludGVycyBmcm9tIGludGVyZmVyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBkcmFpblBhcmtlZCgpOiB2b2lkIHtcbiAgICBsZXQgcHJvZ3Jlc3NlZCA9IHRoaXMucGFya2VkLmxlbmd0aCA+IDA7XG4gICAgd2hpbGUgKHByb2dyZXNzZWQpIHtcbiAgICAgIHByb2dyZXNzZWQgPSBmYWxzZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wYXJrZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLnBhcmtlZFtpXTtcbiAgICAgICAgY29uc3Qgd2Fsa0luZGV4ID0gdGhpcy5ldmVudEluZGV4O1xuICAgICAgICB0aGlzLmV2ZW50SW5kZXggPSBlbnRyeS5pbmRleDtcbiAgICAgICAgbGV0IGNvbnN1bWVkOiBib29sZWFuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN1bWVkID0gdGhpcy5vZmZlcihlbnRyeS5ldmVudCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5ldmVudEluZGV4ID0gd2Fsa0luZGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zdW1lZCkge1xuICAgICAgICAgIHRoaXMucGFya2VkLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAvLyBBIGBGaW5pc2hlZGAgY2FsbGJhY2sgd2FzIHNwbGljZWQgb3V0IG9mIHRoZSBsaXN0IHRoaXMgcGFzcywgc29cbiAgICAgICAgICAvLyByZXN0YXJ0IHJhdGhlciB0aGFuIGtlZXAgd2Fsa2luZyBhIG11dGF0ZWQgYXJyYXkuXG4gICAgICAgICAgcHJvZ3Jlc3NlZCA9IHRoaXMucGFya2VkLmxlbmd0aCA+IDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RlcCB0aGUgb3JkZXJlZCB3YWxrIG92ZXIgYW4gZXZlbnQgbm9ib2R5IGNsYWltZWQsIGhvbGRpbmcgb24gdG8gaXQgZm9yIGFcbiAgICogbGF0ZXIgY29uc3VtZXIuIFJldHVybnMgZmFsc2Ugd2hlbiB0aGUgZXZlbnQncyB0eXBlIG1ha2VzIGl0cyBwb3NpdGlvbiBhXG4gICAqIGRlY2lzaW9uIHJlY29yZCwgd2hpY2ggaXMgdGhlIG9uZSBjYXNlIHdoZXJlIG5vYm9keSBjbGFpbWluZyBpdCBtZWFucyB0aGVcbiAgICogcmVwbGF5IGRpdmVyZ2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXJrKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmICghUEFSS0FCTEVfRVZFTlRfVFlQRVMuaGFzKGV2ZW50LmV2ZW50VHlwZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZXZlbnQuY29ycmVsYXRpb25JZCAmJlxuICAgICAgdGhpcy5yZXNvbHZlZC5oYXMocmVzb2x1dGlvbktleShldmVudC5ldmVudFR5cGUsIGV2ZW50LmNvcnJlbGF0aW9uSWQpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnBhcmtlZC5wdXNoKHsgZXZlbnQsIGluZGV4OiB0aGlzLmV2ZW50SW5kZXggfSk7XG4gICAgdGhpcy5ldmVudEluZGV4Kys7XG4gICAgZXZlbnRzTG9nZ2VyLmRlYnVnKCdQYXJrZWQgYW4gdW5jbGFpbWVkIGV2ZW50IGZvciBsYXRlciBkZWxpdmVyeScsIHtcbiAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZSxcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICBwYXJrZWQ6IHRoaXMucGFya2VkLmxlbmd0aCxcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRW5kT2ZMb2coKSB7XG4gICAgLy8gRXZlcnl0aGluZyBzdGlsbCBwYXJrZWQgaXMgd2FpdGluZyBmb3IgYSBjb25zdW1lciBzb21lIGxhdGVyIHJlcGxheSB3aWxsXG4gICAgLy8gcmVnaXN0ZXIsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBvZiBwYXJraW5nIOKAlCBleGNlcHQgb25jZSB0aGUgbG9nXG4gICAgLy8gYWxyZWFkeSBob2xkcyB0aGUgcnVuJ3MgdGVybWluYWwgZXZlbnQsIGJlY2F1c2UgdGhlbiB0aGVyZSBpcyBubyBsYXRlclxuICAgIC8vIHJlcGxheSBhbmQgbm8gY29uc3VtZXIgd2lsbCBldmVyIGNvbWUuXG4gICAgaWYgKHRoaXMucGFya2VkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXN0ID0gdGhpcy5ldmVudHMuYXQoLTEpO1xuICAgIGlmICghbGFzdCB8fCAhVEVSTUlOQUxfRVZFTlRfVFlQRVMuaGFzKGxhc3QuZXZlbnRUeXBlKSkge1xuICAgICAgLy8gQSBsYXRlciByZXBsYXkgaXMgc3RpbGwgZXhwZWN0ZWQsIHNvIG5vdGhpbmcgaGVyZSBpcyBkZWNpZGFibGUgYW5kXG4gICAgICAvLyBlc2NhbGF0aW5nIHdvdWxkIGZhaWwgdGhlIGhlYWx0aHkgcnVucyBwYXJraW5nIGV4aXN0cyB0byBrZWVwIGFsaXZlLlxuICAgICAgLy8gUmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgbG9nIGhvbGRpbmcgc29tZXRoaW5nIGlzIG5vdCBieSBpdHNlbGYgYSBmYXVsdCxcbiAgICAgIC8vIHNvIHRoaXMgc3RheXMgYXQgYGRlYnVnYDsge0BsaW5rIHBhcmtlZFN1bW1hcnl9IGlzIHdoYXQgY2FycmllcyB0aGVcbiAgICAgIC8vIHN0YXRlIHRvIHRoZSBzcGFuLCB3aGVyZSBhIHJ1biB0aGF0IGtlZXBzIHN0b3BwaW5nIG9uIHRoZSBzYW1lIGhlbGRcbiAgICAgIC8vIGV2ZW50IGlzIHZpc2libGUgYW5kIGEgc2luZ2xlIHJlcGxheSdzIHZpZXcgaXMgbm90LlxuICAgICAgZXZlbnRzTG9nZ2VyLmRlYnVnKCdSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGxvZyBzdGlsbCBob2xkaW5nIGV2ZW50cycsIHtcbiAgICAgICAgZXZlbnRJZDogdGhpcy5wYXJrZWRbMF0uZXZlbnQuZXZlbnRJZCxcbiAgICAgICAgZXZlbnRUeXBlOiB0aGlzLnBhcmtlZFswXS5ldmVudC5ldmVudFR5cGUsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IHRoaXMucGFya2VkWzBdLmV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIHBhcmtlZDogdGhpcy5wYXJrZWQubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2NoZWR1bGVVbmNvbnN1bWVkQ2hlY2sodGhpcy5wYXJrZWRbMF0uZXZlbnQsIGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVVbmNvbnN1bWVkQ2hlY2soY3VycmVudEV2ZW50OiBFdmVudCwgbWF5UGFyazogYm9vbGVhbikge1xuICAgIC8vIEFsbCBjYWxsYmFja3MgcmV0dXJuZWQgTm90Q29uc3VtZWQgZm9yIHRoZSBjdXJyZW50IGV2ZW50LlxuICAgIC8vIFNjaGVkdWxlIGEgZGVmZXJyZWQgY2hlY2suIFdlIGNoYWluIG9udG8gdGhlIHByb21pc2VRdWV1ZSBzbyB0aGF0IGFueVxuICAgIC8vIHBlbmRpbmcgYXN5bmMgd29yayAoZS5nLiwgZGVzZXJpYWxpemF0aW9uL2RlY3J5cHRpb24gdGhhdCB0cmlnZ2Vyc1xuICAgIC8vIHJlc29sdmUoKSDihpIgdXNlciBjb2RlIOKGkiBzdWJzY3JpYmUoKSkgY29tcGxldGVzIGZpcnN0LiBJZiB0aGUgZXZlbnRcbiAgICAvLyBpcyBzdGlsbCB1bmNvbnN1bWVkIGFmdGVyIHRoZSBxdWV1ZSBkcmFpbnMsIGl0J3MgdHJ1bHkgb3JwaGFuZWQg4oCUIG9yLFxuICAgIC8vIHdoZW4gaXRzIHR5cGUgY2FycmllcyBubyBvcmRlcmluZyBjbGFpbSwgcGFya2VkIGZvciBhIGxhdGVyIGNvbnN1bWVyLlxuICAgIGNvbnN0IGNoZWNrVmVyc2lvbiA9ICsrdGhpcy51bmNvbnN1bWVkQ2hlY2tWZXJzaW9uO1xuICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRDaGVjayA9IHRoaXMuZ2V0UHJvbWlzZVF1ZXVlKClcbiAgICAgIC50aGVuKFxuICAgICAgICAvLyBZaWVsZCBvbmNlIGFmdGVyIHRoZSBmaXJzdCBxdWV1ZSBkcmFpbiBzbyBwcm9taXNlIGNoYWlucyByZXN1bWVkIGJ5XG4gICAgICAgIC8vIHRoYXQgZHJhaW4gY2FuIHJ1biBhY3Jvc3MgdGhlIFZNIGJvdW5kYXJ5IGFuZCBhcHBlbmQgYW55IGZvbGxvdy11cFxuICAgICAgICAvLyBhc3luYyB3b3JrIChmb3IgZXhhbXBsZTogc3RlcF9jb21wbGV0ZWQgcmVzb2x2ZXMgLT4gZm9yLWF3YWl0IGxvb3BcbiAgICAgICAgLy8gcmVzdW1lcyAtPiB0aGUgbmV4dCBob29rIHBheWxvYWQgc3RhcnRzIGh5ZHJhdGluZykuXG4gICAgICAgICgpID0+IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDApKVxuICAgICAgKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5nZXRQcm9taXNlUXVldWUoKSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gV2FpdCBvdXQgYW55IGRlbGl2ZXJ5IHN0aWxsIGluIGZsaWdodCBiZWZvcmUgc3RhcnRpbmcgdGhlIHRpbWVyLlxuICAgICAgICAvLyBUaGUgcXVldWUgZHJhaW5pbmcgc2F5cyB0aGUgaG9zdCBoYXMgbm8gaHlkcmF0aW9uIHdvcmsgbGVmdDsgaXRcbiAgICAgICAgLy8gZG9lcyBub3Qgc2F5IHRoZSBWTSBoYXMgZmluaXNoZWQgcmVhY3RpbmcgdG8gd2hhdCB3YXMgaHlkcmF0ZWQuXG4gICAgICAgIHRoaXMud2hlbkRlbGl2ZXJ5SWRsZShjaGVja1ZlcnNpb24sICgpID0+IHtcbiAgICAgICAgICAvLyBVc2UgYSBkZWxheWVkIHNldFRpbWVvdXQgb25jZSBkZWxpdmVyaWVzIGFyZSBpZGxlLiBUaGUgZGVsYXkgbXVzdFxuICAgICAgICAgIC8vIGJlIGxvbmcgZW5vdWdoIGZvciBwcm9taXNlIGNoYWlucyB0byBwcm9wYWdhdGUgYWNyb3NzIHRoZSBWTVxuICAgICAgICAgIC8vIGJvdW5kYXJ5IChmcm9tIHJlc29sdmUoKSBpbiB0aGUgaG9zdCBjb250ZXh0IHRocm91Z2ggdG8gdGhlXG4gICAgICAgICAgLy8gd29ya2Zsb3cgY29kZSBjYWxsaW5nIHN1YnNjcmliZSgpIGluIHRoZSBWTSBjb250ZXh0KS4gTm9kZS5qcyBkb2VzXG4gICAgICAgICAgLy8gbm90IGd1YXJhbnRlZSB0aGF0IHNldFRpbWVvdXQoMCkgZmlyZXMgYWZ0ZXIgYWxsIGNyb3NzLWNvbnRleHRcbiAgICAgICAgICAvLyBtaWNyb3Rhc2tzIHNldHRsZSwgc28gd2UgdXNlIGEgc21hbGwgYnV0IG5vbi16ZXJvIGRlbGF5LiBBbnlcbiAgICAgICAgICAvLyBzdWJzY3JpYmUoKSBjYWxsIHRoYXQgYXJyaXZlcyBkdXJpbmcgdGhpcyB3aW5kb3cgd2lsbCBjYW5jZWwgdGhlXG4gICAgICAgICAgLy8gY2hlY2sgdmlhIHZlcnNpb24gaW52YWxpZGF0aW9uICsgY2xlYXJUaW1lb3V0LlxuICAgICAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy51bmNvbnN1bWVkQ2hlY2tWZXJzaW9uICE9PSBjaGVja1ZlcnNpb24pIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZENoZWNrID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChtYXlQYXJrKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmV2ZW50c1t0aGlzLmV2ZW50SW5kZXhdICE9PSBjdXJyZW50RXZlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBBbiBhcHBlbmQoKSBkcmFpbiBjbGFpbWVkIGl0IHdoaWxlIHRoZSBjaGVjayB3YXMgaW4gZmxpZ2h0LlxuICAgICAgICAgICAgICAgIC8vIE9ubHkgc3Vic2NyaWJlKCkgY2FuY2VscyB0aGUgY2hlY2ssIHNvIHRoaXMgaXMgcmVhY2hhYmxlLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGhpcy5wYXJrKGN1cnJlbnRFdmVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnN1bWUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25VbmNvbnN1bWVkRXZlbnQoY3VycmVudEV2ZW50KTtcbiAgICAgICAgICB9LCBnZXREZWZlcnJlZENoZWNrRGVsYXlNcygpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYGZuYCBvbmNlIG5vIGRhdGEgZGVsaXZlcnkgaXMgaW4gZmxpZ2h0LCBwb2xsaW5nIHRoZSB3YXlcbiAgICogYHNjaGVkdWxlV2hlbklkbGVgIGRvZXM6IGxldCB0aGUgcHJvbWlzZSBxdWV1ZSBkcmFpbiwgcmUtY2hlY2sgYSB0aW1lclxuICAgKiB0aWNrIGxhdGVyLCByZXBlYXQuXG4gICAqXG4gICAqIFdpdGhvdXQgdGhpcyB0aGUgY2hlY2sgaXMgYSBiZXQgdGhhdCBldmVyeSBkZWxpdmVyeSB0aGUgd2FsayBpcyBydW5uaW5nXG4gICAqIGFoZWFkIG9mIGxhbmRzIGluc2lkZSBhIGZpeGVkIHdpbmRvdy4gQ29uc3VtcHRpb24gaXMgc3luY2hyb25vdXMgd2hpbGUgdGhlXG4gICAqIHJlc29sdXRpb24gaXQgdHJpZ2dlcnMgaXMgbm90OiBhIHN0ZXAgcmVzdWx0IGh5ZHJhdGVzIGluIHRoZSBob3N0LCByZXNvbHZlc1xuICAgKiBmcm9tIGEgZGV0YWNoZWQgY29udGludWF0aW9uIGJlaGluZCBgYXdhaXRFYXJsaWVyRGVsaXZlcmllc2AsIGFuZCBvbmx5IHRoZW5cbiAgICogZG9lcyBWTSBjb2RlIHJ1biBmYXIgZW5vdWdoIHRvIHN1YnNjcmliZSB0aGUgbmV4dCBjb25zdW1lci4gUmVwbGF5aW5nIGFcbiAgICogYmF0Y2ggb2YgTiBwYXJhbGxlbCBzdGVwIHJlc3VsdHMgbGVhdmVzIE4tMSBvZiB0aGVtIG9uIHRoYXQgZGV0YWNoZWQgcGF0aFxuICAgKiB3aXRoIHRoZSBxdWV1ZSBhbHJlYWR5IGRyYWluZWQsIHNvIHRoZSB3YWxrIHNpdHMgb24gdGhlIG9yZGVyZWQgZXZlbnQgdGhlXG4gICAqIFZNIGlzIGFib3V0IHRvIGRyYXcgYW5kIHRoZSB3aW5kb3cgaXMgdGhlIG9ubHkgdGhpbmcgc3RhbmRpbmcgYmV0d2VlbiBhXG4gICAqIGhlYWx0aHkgcnVuIGFuZCBgUmVwbGF5RGl2ZXJnZW5jZUVycm9yYC5cbiAgICpcbiAgICogU2hvcnRlbmluZyB0aGUgd2luZG93IHNob3dzIHRoYXQgbWVjaGFuaXNtIGRpcmVjdGx5OiBvbiBpZGVudGljYWwgZXZlbnQgbG9nc1xuICAgKiB0aGUgbG9jYWwgcmFjZSByZXBybyBjb3JydXB0cyAzNCBvZiA0MiBydW5zIGF0IGEgMTBtcyB3aW5kb3cgYW5kIDAgb2YgMTE0IGF0XG4gICAqIHRoZSAxMDBtcyBkZWZhdWx0LiBUaGF0IG1lYXN1cmVzIGhvdyB0aGUgYmV0IGxvc2VzLCBub3QgdGhhdCB0aGUgZGVmYXVsdFxuICAgKiBsb3NlcyBpdCwgYW5kIG5vIG1lYXN1cmVtZW50IG9mIGEgZGVsaXZlcnkgb3V0cnVubmluZyAxMDBtcyBleGlzdHMgZWl0aGVyXG4gICAqIHdheS4gU28gcmVhZCB0aGlzIGFzIHJldGlyaW5nIHRoZSBiZXQgcmF0aGVyIHRoYW4gYXMgcmVwYWlyaW5nIGFuIG9ic2VydmVkXG4gICAqIGZhaWx1cmUgb2YgdGhhdCBudW1iZXI6IHRoZSBkZWxheSBpcyBhIHVzZXItc2V0dGFibGUgZW52IG92ZXJyaWRlLCB3aGljaFxuICAgKiBsZWF2ZXMgdGhlIG9sZCBiZWhhdmlvdXIgb25lIGNvbmZpZ3VyYXRpb24gYXdheSBmcm9tIGxvc2luZyBvbiBhbnkgYmFja2VuZC5cbiAgICpcbiAgICogVGVybWluYXRpb24gaXMgYGhhc1BhcmtlZENvbW1pdHRlZERlbGl2ZXJ5YCdzOiBpdCBjb3VudHMgb25seSBkZWxpdmVyaWVzXG4gICAqIHRoYXQgcmVzb2x2ZSBvbiB0aGVpciBvd24sIHNvIG5vdGhpbmcgaGVyZSBjYW4gZ2F0ZSBpdHMgb3duIHJldGlyZW1lbnQuIEFcbiAgICogZ2VudWluZWx5IG9ycGhhbmVkIGV2ZW50IGhhcyBubyBkZWxpdmVyeSB0byB3YWl0IG9uIGFuZCByZWFjaGVzIGBmbmAgb24gdGhlXG4gICAqIGZpcnN0IHBvbGwuXG4gICAqXG4gICAqIFdoYXQgdGhlIGdhdGUgZ2l2ZXMgdXA6IGZvciB0aGUgb3JkZXJlZCBldmVudHMgdGhhdCBzdGlsbCByZWFjaFxuICAgKiBgb25VbmNvbnN1bWVkRXZlbnRgIHJhdGhlciB0aGFuIHtAbGluayBwYXJrfSwgdGhpcyBzdG9wcyBiZWluZyB0aGUgdGhpbmdcbiAgICogdGhhdCBjYXRjaGVzIGEgZGl2ZXJnZWQgbG9nIHdoaWxlIGEgZGVsaXZlcnkgaXMgaW4gZmxpZ2h0LiBUaGUgc3VzcGVuc2lvblxuICAgKiBhbmQgdGhpcyBjaGVjayBub3cgd2FrZSBmcm9tIHRoZSBzYW1lIGBpc0RlbGl2ZXJ5SWRsZWAgZWRnZSwgYW5kXG4gICAqIGBzY2hlZHVsZVdoZW5JZGxlYCBmaXJlcyBvbiB0aGUgZmlyc3QgdGltZXIgdGljayBhZnRlciBpZGxlIHdoaWxlIHRoaXMgd2FpdHNcbiAgICogYSBmdXJ0aGVyIGBnZXREZWZlcnJlZENoZWNrRGVsYXlNcygpYC4gU28gYSBydW4gd2l0aCBhIHBlbmRpbmcgYHNsZWVwKClgXG4gICAqIHN1c3BlbmRzIGZpcnN0LCBhbmQgYG9uV29ya2Zsb3dFcnJvcmAgZHJvcHMgdGhlIGRpdmVyZ2VuY2UgYXJyaXZpbmcgc2Vjb25kXG4gICAqIChpdHMgYCdzdXNwZW5kZWQnYCBicmFuY2ggZGVtb3RlcyB0byBgJ3JlcGxheSdgIGFuZCBzdXJmYWNlcyBub3RoaW5nKSxcbiAgICogbGVhdmluZyBhIGxhdGVyIGByZXN1bWUoKWAgdG8gZGVjbGluZSBpbnRvIGEgY29sZCByZXBsYXkuIFByZS1nYXRlIHRoZVxuICAgKiBzdXNwZW5zaW9uIGFscmVhZHkgd29uIHRoYXQgcmFjZSB3aGVuZXZlciB0aGUgZGVsaXZlcnkgbGFuZGVkIGluc2lkZSB0aGVcbiAgICogZml4ZWQgd2luZG93LCBzbyB3aGF0IGNoYW5nZWQgaXMgdGhhdCB0aGUgb3V0Y29tZSBzdG9wcGVkIGRlcGVuZGluZyBvblxuICAgKiB0aW1pbmcuIE5vdGhpbmcgc2hvdWxkIHRyZWF0IHRoaXMgY2hlY2sgYXMgdGhlIG1lY2hhbmlzbSB0aGF0IHJlcG9ydHNcbiAgICogZGl2ZXJnZW5jZSBvbiBhIGxvZyB0aGUgcnVuIGlzIHN0aWxsIGRlbGl2ZXJpbmcgaW50by5cbiAgICovXG4gIHByaXZhdGUgd2hlbkRlbGl2ZXJ5SWRsZShjaGVja1ZlcnNpb246IG51bWJlciwgZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zdCBwb2xsID0gKCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBudWxsO1xuICAgICAgaWYgKHRoaXMudW5jb25zdW1lZENoZWNrVmVyc2lvbiAhPT0gY2hlY2tWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzRGVsaXZlcnlJZGxlKCkpIHtcbiAgICAgICAgZm4oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5nZXRQcm9taXNlUXVldWUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudW5jb25zdW1lZENoZWNrVmVyc2lvbiAhPT0gY2hlY2tWZXJzaW9uKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhlbGQgaW4gdGhlIHNhbWUgZmllbGQgdGhlIGZpcmVkIGNoZWNrIHVzZXMgc28gc3Vic2NyaWJlKCkgY2FuY2VscyBhXG4gICAgICAgIC8vIHBvbGwgaW4gcHJvZ3Jlc3MgdG9vLiBUaGUgdHdvIGNhbmNlbGxhdGlvbnMgYXJlIG5vdCBpZGVudGljYWw6IGZvciB0aGVcbiAgICAgICAgLy8gcG9sbCBpdCBpcyB0aGUgdmVyc2lvbiBidW1wIHRoYXQgZG9lcyB0aGUgd29yayBhbmQgdGhlIGNsZWFyVGltZW91dCBpc1xuICAgICAgICAvLyBiZWx0LWFuZC1icmFjZXMuIFR3byBzdGF0ZSBtYWNoaW5lcyB3cml0ZSB0aGlzIG9uZSBmaWVsZCwgc28gYSBwb2xsXG4gICAgICAgIC8vIGludmFsaWRhdGVkIGJldHdlZW4gc2NoZWR1bGluZyBhbmQgZmlyaW5nIGNhbiBudWxsIG91dCBhIGhhbmRsZSB0aGVcbiAgICAgICAgLy8gbGl2ZSBjaGFpbiBoYXMgc2luY2Ugc3RvcmVkLCB3aGljaCBpcyB3aHkgZXZlcnkgcGF0aCBvdXQgb2YgYHBvbGxgIGFuZFxuICAgICAgICAvLyBvdXQgb2YgdGhlIGZpcmVkIGNoZWNrIHJlLWNoZWNrcyB0aGUgdmVyc2lvbiByYXRoZXIgdGhhbiB0cnVzdGluZyB0aGVcbiAgICAgICAgLy8gaGFuZGxlLlxuICAgICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkVGltZW91dCA9IHNldFRpbWVvdXQocG9sbCwgMCk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHBvbGwoKTtcbiAgfVxufVxuIl19
|
|
650
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWNvbnN1bWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2V2ZW50cy1jb25zdW1lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUzQzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUUzQzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBRTlDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEdBQVcsRUFBRSxDQUMzQyxTQUFTLENBQUMsa0NBQWtDLEVBQUUsdUJBQXVCLEVBQUU7SUFDckUsT0FBTyxFQUFFLElBQUk7SUFDYixHQUFHLEVBQUUsMkJBQTJCO0NBQ2pDLENBQUMsQ0FBQztBQUVMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBb0MsSUFBSSxHQUFHLENBQUM7SUFDcEUsZUFBZTtJQUNmLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsVUFBVTtJQUNWLGVBQWU7Q0FDaEIsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLG9CQUFvQixHQUFvQyxJQUFJLEdBQUcsQ0FBQztJQUNwRSxnQkFBZ0I7Q0FDakIsQ0FBQyxDQUFDO0FBRUgsaUVBQWlFO0FBQ2pFLFNBQVMsYUFBYSxDQUFDLFNBQWlCLEVBQUUsYUFBcUI7SUFDN0QsT0FBTyxHQUFHLFNBQVMsSUFBSSxhQUFhLEVBQUUsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBb0MsSUFBSSxHQUFHLENBQUM7SUFDcEUsZUFBZTtJQUNmLFlBQVk7SUFD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QUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNmLE9BQU87WUFDVCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BeUNHO0lBQ0ssZ0JBQWdCLENBQUMsWUFBb0IsRUFBRSxFQUFjO1FBQzNELE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtZQUNoQixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1lBQ3JDLElBQUksSUFBSSxDQUFDLHNCQUFzQixLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUNqRCxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7Z0JBQzFCLEVBQUUsRUFBRSxDQUFDO2dCQUNMLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQy9CLElBQUksSUFBSSxDQUFDLHNCQUFzQixLQUFLLFlBQVksRUFBRSxDQUFDO29CQUNqRCxPQUFPO2dCQUNULENBQUM7Z0JBQ0QsdUVBQXVFO2dCQUN2RSx5RUFBeUU7Z0JBQ3pFLHlFQUF5RTtnQkFDekUsc0VBQXNFO2dCQUN0RSxzRUFBc0U7Z0JBQ3RFLHlFQUF5RTtnQkFDekUsd0VBQXdFO2dCQUN4RSxVQUFVO2dCQUNWLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEV2ZW50LCBlbnRpdHlFdmVudENsYXNzLCBlbnZOdW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZXZlbnRzTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG4vKipcbiAqIERlbGF5IGJlZm9yZSBmaXJpbmcgdGhlIGRlZmVycmVkIHVuY29uc3VtZWQtZXZlbnQgY2hlY2sgYWZ0ZXIgdGhlIHByb21pc2VcbiAqIHF1ZXVlIGhhcyBkcmFpbmVkLiBNdXN0IGJlIGxvbmcgZW5vdWdoIGZvciBjcm9zcy1WTSBtaWNyb3Rhc2sgY2hhaW5zIHRvXG4gKiBwcm9wYWdhdGUgKHJlc29sdmUgaW4gaG9zdCDihpIgd29ya2Zsb3cgY29kZSBpbiBWTSDihpIgc3Vic2NyaWJlIGNhbGwgYmFja1xuICogaW4gaG9zdCkuIEFueSBzdWJzY3JpYmUoKSBhcnJpdmluZyBkdXJpbmcgdGhpcyB3aW5kb3cgY2FuY2VscyB0aGUgY2hlY2suXG4gKi9cbmV4cG9ydCBjb25zdCBERUZFUlJFRF9DSEVDS19ERUxBWV9NUyA9IDEwMDtcblxuLyoqXG4gKiBGbG9vciBmb3IgdGhlIGRlZmVycmVkLWNoZWNrIGRlbGF5LCBzbyBhIHRvby1sb3cgb3ZlcnJpZGUgY2FuJ3QgbWFudWZhY3R1cmVcbiAqIHNwdXJpb3VzIGRpdmVyZ2VuY2UgKGVhY2ggZmFsc2UgcG9zaXRpdmUgYnVybnMgYSBkaXZlcmdlbmNlLXJlY292ZXJ5IHJldHJ5XG4gKiBhbmQgY2FuIGVzY2FsYXRlIHRvIGEgdGVybWluYWwgYENvcnJ1cHRlZEV2ZW50TG9nRXJyb3JgKS5cbiAqXG4gKiBFeHBvcnRlZCBzbyB0ZXN0cyBuZWVkaW5nIHRoZSBzaG9ydGVzdCBsZWdhbCBkZWxheSBjYW4gYXNrIGZvciBpdCBpbnN0ZWFkIG9mXG4gKiBoYXJkY29kaW5nIGEgbnVtYmVyIHRoaXMgZmxvb3Igd291bGQgc2lsZW50bHkgY2xhbXAgdXAuXG4gKi9cbmV4cG9ydCBjb25zdCBNSU5fREVGRVJSRURfQ0hFQ0tfREVMQVlfTVMgPSAxMDtcblxuLyoqXG4gKiBFZmZlY3RpdmUgZGVmZXJyZWQtY2hlY2sgZGVsYXkuIE92ZXJyaWRlOiBgV09SS0ZMT1dfREVGRVJSRURfQ0hFQ0tfREVMQVlfTVNgLlxuICpcbiAqIFVubGlrZSB0aGUgb3RoZXIgdGltaW5nIGtub2JzIHRoaXMgaXMgbm90IGEgcG9sbGluZyBpbnRlcnZhbCBidXQgYVxuICogZGV0ZXJtaW5pc20gc2FmZXR5IG1hcmdpbjogZmlyaW5nIHRoZSB1bmNvbnN1bWVkLWV2ZW50IGNoZWNrIGJlZm9yZSB0aGVcbiAqIGNyb3NzLVZNIHN1YnNjcmliZSgpIGNoYWluIGhhcyBsYW5kZWQgcmVqZWN0cyBhIGhlYWx0aHkgcnVuIHdpdGhcbiAqIGBSZXBsYXlEaXZlcmdlbmNlRXJyb3JgLlxuICovXG5jb25zdCBnZXREZWZlcnJlZENoZWNrRGVsYXlNcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19ERUZFUlJFRF9DSEVDS19ERUxBWV9NUycsIERFRkVSUkVEX0NIRUNLX0RFTEFZX01TLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IE1JTl9ERUZFUlJFRF9DSEVDS19ERUxBWV9NUyxcbiAgfSk7XG5cbi8qKlxuICogRXZlbnQgdHlwZXMgdGhlIG9yZGVyZWQgd2FsayBtYXkgc3RlcCBvdmVyIGFuZCBkZWxpdmVyIGxhdGVyLlxuICpcbiAqIE1lbWJlcnNoaXAgaXMgbm90IGFib3V0IHdobyB3cm90ZSB0aGUgZXZlbnQuIEl0IGlzIGFib3V0IHdoZXRoZXIgdGhlIGV2ZW50XG4gKiBjYW4gcmVhY2ggdGhlIGhlYWQgb2YgdGhlIHdhbGsgd2l0aCBub3RoaW5nIHJlZ2lzdGVyZWQgdG8gY29uc3VtZSBpdCwgd2hpY2hcbiAqIGlzIHRoZSBvbmx5IHNpdHVhdGlvbiBwYXJraW5nIGV4aXN0cyBmb3IuXG4gKlxuICogTW9zdCB0eXBlcyBjYW5ub3QuIFRoZXkgYXJlIHJlcGxheS1vcmlnaW46IGEgcmVwbGF5IGVtaXRzIHRoZW0sIGluIHRoZSBvcmRlclxuICogaXRzIGNvZGUgcmVhY2hlcyB0aGVtLCBzbyB0aGVpciBwb3NpdGlvbiBpbiB0aGUgbG9nIGlzIHRoZSByZWNvcmQgb2Ygd2hhdFxuICogdGhhdCByZXBsYXkgZGVjaWRlZC4gUmVhY2hpbmcgb25lIG9mIHRob3NlIG91dCBvZiBvcmRlciBtZWFucyB0aGlzIHJlcGxheVxuICogZGVjaWRlZCBkaWZmZXJlbnRseSB0aGFuIHRoZSBsb2cgaG9sZHMsIHdoaWNoIGlzIGRpdmVyZ2VuY2UgYW5kIG5vdGhpbmcgZWxzZS5cbiAqXG4gKiBTdGVwIGxpZmVjeWNsZSBldmVudHMgYXJlIG5vdCByZXBsYXktb3JpZ2luLCBhbmQgYXJlIHN0aWxsIGFic2VudCwgYmVjYXVzZVxuICogdGhleSBhbHdheXMgaGF2ZSBhIGNsYWltYW50LiBgc3RlcCgpYCBzdWJzY3JpYmVzIGl0cyBjb25zdW1lciBiZWZvcmUgdGhlXG4gKiBzdGVwJ3MgZmlyc3QgZXZlbnQgY2FuIGV4aXN0OyBgc3RlcF9jcmVhdGVkYCBpcyBvcmRlcmVkLCBzbyB0aGUgd2FsayBjYW5ub3RcbiAqIHBhc3MgaXQgdW5sZXNzIGEgY29uc3VtZXIgdGFrZXMgaXQ7IGFuZCB0aGF0IGNvbnN1bWVyIHN0YXlzIHN1YnNjcmliZWQgdW50aWxcbiAqIGBzdGVwX2NvbXBsZXRlZGAgb3IgYHN0ZXBfZmFpbGVkYCwgYWZ0ZXIgd2hpY2ggdGhlIFdvcmxkIHJlZnVzZXMgYW55IGZ1cnRoZXJcbiAqIHdyaXRlIGZvciB0aGF0IHN0ZXAuIFRoZXJlIGlzIG5vIHdpbmRvdyBpbiB3aGljaCBhIHJlcGxheSBrbm93cyBhYm91dCBhIHN0ZXBcbiAqIGFuZCBoYXMgbm90aGluZyByZWdpc3RlcmVkIHRvIGNvbnN1bWUgaXRzIGV2ZW50cywgc28gcGFya2luZyB0aGVtIHdvdWxkIG9ubHlcbiAqIGRlZmVyIHJlcG9ydHMgb2Ygd2hhdCBpcyBkaXZlcmdlbmNlIGVpdGhlciB3YXkuIFRoZSBzYW1lIGhvbGRzIGZvclxuICogYHdhaXRfY3JlYXRlZGAgYW5kIGl0cyBjb25zdW1lci4gYHdhaXRfY29tcGxldGVkYCBpcyBsaXN0ZWQgYW55d2F5OiBhIHNsZWVwXG4gKiBjYW4gYWxzbyBiZSBjb21wbGV0ZWQgb3V0IG9mIGJhbmQsIGJ5IHRoZSBBUEkgdGhhdCBmb3JjZS1jb21wbGV0ZXMgcGVuZGluZ1xuICogd2FpdHMsIGFuZCB0b2xlcmF0aW5nIGEgc3RyYXkgb25lIGlzIHRoZSBjaGVhcGVyIGRpcmVjdGlvbiB0byBiZSB3cm9uZyBpbi5cbiAqXG4gKiBBbiBhbGxvd2xpc3QgcmF0aGVyIHRoYW4gdGhlIGNvbXBsZW1lbnQgb2YgdGhlIG9yZGVyZWQgc2V0LCBzbyBhIHR5cGUgdGhpc1xuICogZmlsZSBoYXMgbm90IGJlZW4gdGF1Z2h0IGFib3V0IGtlZXBzIHRoZSBzdHJpY3Qgb2xkIGJlaGF2aW91ci5cbiAqXG4gKiBgaG9va19kaXNwb3NlZGAgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBkZXNwaXRlIGJlaW5nIGFib3V0IGEgaG9vazogaXQgaXNcbiAqIHdyaXR0ZW4gd2hlbiB0aGUgd29ya2Zsb3cncyBvd24gYHVzaW5nYCBzY29wZSBleGl0cywgc28gaXQgaXMgcmVwbGF5LW9yaWdpbi5cbiAqXG4gKiBgYXR0cl9zZXRgIGlzIGxpc3RlZCBieSB0eXBlIGV2ZW4gdGhvdWdoIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgaXQgbWF5IGJlXG4gKiByZXBsYXktb3JpZ2luLCBzaW5jZSBpdCBpcyByZXBsYXktb3JpZ2luIHdoZW4gaXRzIHdyaXRlciBpcyB0aGUgd29ya2Zsb3cuXG4gKiBTcGxpdHRpbmcgdGhhdCBvdXQgcGVyIGV2ZW50IHdhcyBjb25zaWRlcmVkIGFuZCByZWplY3RlZC4gQSByZXBsYXkgdGhhdFxuICogcmVhY2hlcyBvbmUgb2YgaXRzIG93biB3cml0ZXMgb3V0IG9mIHBvc2l0aW9uIGhhcyBkaXZlcmdlZCwgYnV0IGEgcmVwbGF5IHRoYXRcbiAqIHJlYWNoZXMgYW4gZXZlbnQgaXQgZGlkIE5PVCB3cml0ZSwgc2l0dGluZyB3aGVyZSBpdHMgb3duIHdyaXRlIHdvdWxkIGdvLCBoYXNcbiAqIG5vdDogdGhlIHdyaXRlciBmaWVsZCBzYXlzIHdobyB3cm90ZSB0aGUgZXZlbnQsIGFuZCBub3Qgd2hldGhlciB0aGlzIHJlcGxheVxuICogaXMgdGhlIHNhbWUgb25lLiBHdWVzc2luZyB3cm9uZyBpbiB0aGF0IGRpcmVjdGlvbiBmYWlscyBoZWFsdGh5IHJ1bnMsIHdoaWNoXG4gKiBpcyB0aGUgZmFpbHVyZSB0aGlzIGZpbGUgZXhpc3RzIHRvIHN0b3AsIHNvIHRoZSB3aG9sZSB0eXBlIGlzIHRvbGVyYXRlZC4gVGhlXG4gKiBjb3N0IGlzIHRoYXQgYSBkaXZlcmdlbmNlIGludm9sdmluZyBgYXR0cl9zZXRgIHN1cmZhY2VzIGF0IHRoZSBlbmQgb2YgdGhlXG4gKiByZXBsYXksIHRocm91Z2ggYHN0cmFuZGVkRXZlbnRgLCByYXRoZXIgdGhhbiBhdCB0aGUgb2ZmZW5kaW5nIGV2ZW50LlxuICovXG5jb25zdCBQQVJLQUJMRV9FVkVOVF9UWVBFUzogUmVhZG9ubHlTZXQ8RXZlbnRbJ2V2ZW50VHlwZSddPiA9IG5ldyBTZXQoW1xuICAnaG9va19yZWNlaXZlZCcsXG4gICdob29rX2NvbmZsaWN0JyxcbiAgJ3dhaXRfY29tcGxldGVkJyxcbiAgJ2F0dHJfc2V0JyxcbiAgJ3J1bl9jYW5jZWxsZWQnLFxuXSk7XG5cbi8qKlxuICogUGFya2FibGUgdHlwZXMgdGhhdCBjYW4gb25seSBldmVyIHJlc29sdmUgdGhlaXIgY29ycmVsYXRpb24gaWQgb25jZS5cbiAqXG4gKiBBIHNlY29uZCBvbmUgZm9yIHRoZSBzYW1lIGlkIGlzIG5vdCBhIGRlbGl2ZXJ5IHRoaXMgcmVwbGF5IGhhcyBub3QgcmVhY2hlZFxuICogeWV0OiBpdCBpcyBhIHJlc29sdXRpb24gZm9yIHNvbWV0aGluZyBhbHJlYWR5IHJlc29sdmVkLCB3aGljaCBubyBjb25zdW1lclxuICogdGhpcyByZXBsYXkgb3IgYW55IGxhdGVyIG9uZSByZWdpc3RlcnMgY2FuIGV2ZXIgY2xhaW0uIGBob29rX3JlY2VpdmVkYCBpc1xuICogYWJzZW50IGJlY2F1c2UgYSBob29rIGxlZ2l0aW1hdGVseSBmaXJlcyBtYW55IHRpbWVzIHVuZGVyIG9uZSBpZC5cbiAqXG4gKiBNdXN0IHN0YXkgYSBzdWJzZXQgb2Yge0BsaW5rIFBBUktBQkxFX0VWRU5UX1RZUEVTfToge0BsaW5rIHBhcmt9IGlzIHRoZSBvbmx5XG4gKiByZWFkZXIgb2Ygd2hhdCB0aGlzIHJlY29yZHMsIGFuZCBpdCByZWplY3RzIGEgbm9uLXBhcmthYmxlIHR5cGUgYmVmb3JlIGl0XG4gKiBsb29rcywgc28gYW4gZW50cnkgb3V0c2lkZSB0aGF0IHNldCBpcyBkZWFkIHdlaWdodCBvbiBhIGhvdCBwYXRoLlxuICovXG5jb25zdCBPTkVfU0hPVF9FVkVOVF9UWVBFUzogUmVhZG9ubHlTZXQ8RXZlbnRbJ2V2ZW50VHlwZSddPiA9IG5ldyBTZXQoW1xuICAnd2FpdF9jb21wbGV0ZWQnLFxuXSk7XG5cbi8qKiBJZGVudGlmaWVzIHRoZSB0aGluZyBhIG9uZS1zaG90IHJlc29sdXRpb24gZXZlbnQgcmVzb2x2ZXMuICovXG5mdW5jdGlvbiByZXNvbHV0aW9uS2V5KGV2ZW50VHlwZTogc3RyaW5nLCBjb3JyZWxhdGlvbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7ZXZlbnRUeXBlfToke2NvcnJlbGF0aW9uSWR9YDtcbn1cblxuLyoqXG4gKiBUeXBlcyB0aGF0IGVuZCBhIHJ1bi4gT25jZSBvbmUgaXMgaW4gdGhlIGxvZywgbm8gY29uc3VtZXIgd2lsbCBldmVyIGJlXG4gKiByZWdpc3RlcmVkIGFnYWluLCBzbyBhIHBhcmtlZCBldmVudCBzdGlsbCBwYXJrZWQgaGVyZSB3aWxsIG5ldmVyIGJlIGNsYWltZWQuXG4gKi9cbmNvbnN0IFRFUk1JTkFMX0VWRU5UX1RZUEVTOiBSZWFkb25seVNldDxFdmVudFsnZXZlbnRUeXBlJ10+ID0gbmV3IFNldChbXG4gICdydW5fY29tcGxldGVkJyxcbiAgJ3J1bl9mYWlsZWQnLFxuICAncnVuX2NhbmNlbGxlZCcsXG5dKTtcblxuZXhwb3J0IGVudW0gRXZlbnRDb25zdW1lclJlc3VsdCB7XG4gIC8qKlxuICAgKiBDYWxsYmFjayBjb25zdW1lZCB0aGUgZXZlbnQsIGJ1dCBzaG91bGQgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgY2FsbGJhY2tzIGxpc3RcbiAgICovXG4gIENvbnN1bWVkLFxuICAvKipcbiAgICogQ2FsbGJhY2sgZGlkIG5vdCBjb25zdW1lIHRoZSBldmVudCwgc28gaXQgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgbmV4dCBjYWxsYmFja1xuICAgKi9cbiAgTm90Q29uc3VtZWQsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBjb25zdW1lZCB0aGUgZXZlbnQsIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWxsYmFja3MgbGlzdFxuICAgKi9cbiAgRmluaXNoZWQsXG59XG5cbnR5cGUgRXZlbnRDb25zdW1lckNhbGxiYWNrID0gKGV2ZW50OiBFdmVudCB8IG51bGwpID0+IEV2ZW50Q29uc3VtZXJSZXN1bHQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRzQ29uc3VtZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIENhbGxiYWNrIGludm9rZWQgYWZ0ZXIgYW4gZXZlbnQgaGFzIGJlZW4gY29uc3VtZWQuIENvbnN1bWVycyBzdWNoIGFzIHRoZVxuICAgKiBkZXRlcm1pbmlzdGljIHdvcmtmbG93IGNsb2NrIG11c3Qgbm90IG9ic2VydmUgZXZlbnRzIHRoYXQgYXJlIG1lcmVseVxuICAgKiBpbnNwZWN0ZWQgd2hpbGUgd2FpdGluZyBmb3IgdXNlciBjb2RlIHRvIHN1YnNjcmliZSB0byB0aGUgbmV4dCBvcGVyYXRpb24uXG4gICAqL1xuICBvbkNvbnN1bWVkRXZlbnQ/OiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkO1xuICAvKipcbiAgICogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGEgbm9uLW51bGwgZXZlbnQgY2Fubm90IGJlIGNvbnN1bWVkIGJ5IGFueSByZWdpc3RlcmVkXG4gICAqIGNhbGxiYWNrLCBpbmRpY2F0aW5nIGFuIG9ycGhhbmVkIG9yIGludmFsaWQgZXZlbnQgaW4gdGhlIGV2ZW50IGxvZy4gVGhlXG4gICAqIGNoZWNrIGlzIGRlZmVycmVkIHVudGlsIGFmdGVyIHRoZSBwcm9taXNlIHF1ZXVlIGhhcyBkcmFpbmVkLCBlbnN1cmluZyB0aGF0XG4gICAqIGFueSBwZW5kaW5nIGFzeW5jIHdvcmsgKGUuZy4sIGRlc2VyaWFsaXphdGlvbi9kZWNyeXB0aW9uKSBjb21wbGV0ZXMgYW5kXG4gICAqIGRvd25zdHJlYW0gc3Vic2NyaWJlKCkgY2FsbHMgaGF2ZSBhIGNoYW5jZSB0byBjYW5jZWwgdGhlIGNoZWNrIGZpcnN0LlxuICAgKi9cbiAgb25VbmNvbnN1bWVkRXZlbnQ6IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gYW4gZXZlbnQgaXMgc2tpcHBlZCBiZWNhdXNlIGl0IHJlcGVhdHMgYW4gZXZlbnRcbiAgICogY2xhc3MgdGhlIHdhbGsgYWxyZWFkeSBjb25zdW1lZCBmb3IgdGhlIHNhbWUgZW50aXR5LiBgZmlyc3RFdmVudFR5cGVgIGlzXG4gICAqIHRoZSB0eXBlIHRoYXQgcmVjb3JkZWQgdGhlIGNsYXNzLCB3aGljaCBpcyB0aGUgb25lIHRoZSB3b3JrZmxvdyBvYnNlcnZlZC5cbiAgICogRGlhZ25vc3RpY3Mgb25seTogc2tpcHBpbmcgaXMgYSBub3JtYWwgb3V0Y29tZSwgbm90IGFuIGVycm9yIOKAlCB0aG91Z2ggYVxuICAgKiBgZmlyc3RFdmVudFR5cGVgIGRpZmZlcmluZyBmcm9tIGBldmVudC5ldmVudFR5cGVgIHNheXMgdGhlIHR3byB3cml0ZXJzXG4gICAqIGRlY2lkZWQgdGhlIGVudGl0eSdzIG91dGNvbWUgZGlmZmVyZW50bHksIHdoaWNoIGlzIHdvcnRoIG1vcmUgdGhhbiBhblxuICAgKiBpbmZvIGxvZy5cbiAgICovXG4gIG9uRHVwbGljYXRlRXZlbnQ/OiAoZXZlbnQ6IEV2ZW50LCBmaXJzdEV2ZW50VHlwZTogRXZlbnRbJ2V2ZW50VHlwZSddKSA9PiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBwcm9taXNlIHF1ZXVlLiBUaGUgdW5jb25zdW1lZCBldmVudCBjaGVjayBpcyBjaGFpbmVkXG4gICAqIG9udG8gdGhpcyBxdWV1ZSBzbyBpdCBvbmx5IGZpcmVzIGFmdGVyIGFsbCBwZW5kaW5nIGFzeW5jIHdvcmsgKGUuZy4sXG4gICAqIGRlc2VyaWFsaXphdGlvbikgaGFzIGNvbXBsZXRlZC4gVGhpcyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgd2hlbiBhc3luY1xuICAgKiBkZXNlcmlhbGl6YXRpb24gZGVsYXlzIHRoZSByZXNvbHZlKCkgdGhhdCB0cmlnZ2VycyB0aGUgbmV4dCBzdWJzY3JpYmUoKS5cbiAgICovXG4gIGdldFByb21pc2VRdWV1ZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgbm8gZGF0YSBkZWxpdmVyeSBpcyBpbiBmbGlnaHQgKGBpc0RlbGl2ZXJ5SWRsZWAgaW4gcHJpdmF0ZS50cykuXG4gICAqIFRoZSB1bmNvbnN1bWVkLWV2ZW50IGNoZWNrIHdhaXRzIGZvciB0aGlzIGJlZm9yZSBpdCBmaXJlczogYSBkZWxpdmVyeSBpblxuICAgKiBmbGlnaHQgbWVhbnMgdGhlIHdvcmtmbG93IFZNIGlzIG1pZC1yZWFjdGlvbiwgYW5kIGFuIGV2ZW50IGl0IGhhcyBub3RcbiAgICogY2xhaW1lZCB5ZXQgaXMgYW4gZXZlbnQgaXQgaGFzIG5vdCByZWFjaGVkIHlldC5cbiAgICpcbiAgICogUmVxdWlyZWQgcmF0aGVyIHRoYW4gZGVmYXVsdGluZyB0byBhbHdheXMtaWRsZTogYWx3YXlzLWlkbGUgaXMgZXhhY3RseSB0aGVcbiAgICogcHJlLWdhdGUgYmVoYXZpb3VyLCBzbyBhIGRlZmF1bHRlZCBvcHRpb24gd291bGQgbGV0IGEgY29uc3RydWN0aW9uIHNpdGUgb3B0XG4gICAqIGEgd2hvbGUgcmVwbGF5IHBhdGggYmFjayBvdXQgd2l0aG91dCBzYXlpbmcgc28uIFRlc3RzIHRoYXQgZHJpdmUgYSBjb25zdW1lclxuICAgKiB3aXRoIG5vIG9yY2hlc3RyYXRvciBjb250ZXh0IHBhc3MgYCgpID0+IHRydWVgIHRvIGtlZXAgdGhlIHByZS1leGlzdGluZ1xuICAgKiB0aW1pbmcsIGFuZCBzYXkgc28gYXQgdGhlIGNhbGwgc2l0ZS5cbiAgICovXG4gIGlzRGVsaXZlcnlJZGxlOiAoKSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRzQ29uc3VtZXIge1xuICBldmVudEluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IGV2ZW50czogRXZlbnRbXTtcbiAgcmVhZG9ubHkgY2FsbGJhY2tzOiBFdmVudENvbnN1bWVyQ2FsbGJhY2tbXSA9IFtdO1xuICAvKipcbiAgICogRXZlbnRzIHRoZSBvcmRlcmVkIHdhbGsgc3RlcHBlZCBvdmVyIGJlY2F1c2Ugbm9ib2R5IGNsYWltZWQgdGhlbSBhbmQgdGhlaXJcbiAgICogdHlwZSBjYXJyaWVzIG5vIG9yZGVyaW5nIGNsYWltLiBFYWNoIGtlZXBzIHRoZSBpbmRleCBpdCBoZWxkIGluIHRoZSBsb2c6XG4gICAqIGNvbnN1bWVycyByZWFkIHtAbGluayBldmVudEluZGV4fSBhdCBjb25zdW1wdGlvbiB0aW1lIHRvIG9yZGVyIHRoZWlyXG4gICAqIGRlbGl2ZXJ5IGFnYWluc3QgdGhlIHJlc3Qgb2YgdGhlIGxvZywgYW5kIGEgbGF0ZSBkZWxpdmVyeSBtdXN0IHN0aWxsIG1ha2VcbiAgICogdGhlIGNsYWltIGl0cyBwb3NpdGlvbiBnYXZlIGl0LlxuICAgKlxuICAgKiBIZWxkIGluIGxvZyBvcmRlciwgZHJhaW5lZCBpbiBsb2cgb3JkZXIsIGFuZCBkcmFpbmVkIGJlZm9yZSBldmVyeSBvZmZlciBzb1xuICAgKiBhIGNvbnN1bWVyIHJlZ2lzdGVyZWQgYWZ0ZXIgdGhlIHdhbGsgcGFzc2VkIHRoZSBldmVudCBzdGlsbCByZWNlaXZlcyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFya2VkOiB7IGV2ZW50OiBFdmVudDsgaW5kZXg6IG51bWJlciB9W10gPSBbXTtcbiAgLyoqXG4gICAqIENvcnJlbGF0aW9uIGlkcyBvZiB0aGUge0BsaW5rIE9ORV9TSE9UX0VWRU5UX1RZUEVTfSBldmVudHMgY29uc3VtZWQgc29cbiAgICogZmFyLCBzbyBhIHNlY29uZCByZXNvbHV0aW9uIGZvciBvbmUgb2YgdGhlbSBpcyByZWNvZ25pemVkIGFzIHVuY2xhaW1hYmxlXG4gICAqIHJhdGhlciB0aGFuIHBhcmtlZCBmb3IgYSBjb25zdW1lciB0aGF0IGNhbm5vdCBleGlzdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIGA8Y2xhc3M+Ojxjb3JyZWxhdGlvbklkPmAgZm9yIGV2ZXJ5IGV2ZW50IGNsYXNzIHRoZSB3YWxrIGhhcyBhbHJlYWR5XG4gICAqIGNvbnN1bWVkLCBtYXBwZWQgdG8gdGhlIGV2ZW50IHR5cGUgdGhhdCByZWNvcmRlZCBpdC4gVGhlIHR5cGUgaXMga2VwdCBzbyBhXG4gICAqIHJlcGVhdCB0aGF0IGRlY2lkZWQgdGhlIHNhbWUgY2xhc3MgKmRpZmZlcmVudGx5KiAoYSBgc3RlcF9mYWlsZWRgIGJlaGluZCBhXG4gICAqIGBzdGVwX2NvbXBsZXRlZGApIGNhbiBiZSByZXBvcnRlZCBhcyBtb3JlIHRoYW4gYSByZS1jb21taXQuIFNlZVxuICAgKiB7QGxpbmsgRXZlbnRzQ29uc3VtZXIuZmlyc3RFdmVudFR5cGVPZkNsYXNzfS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VlbkV2ZW50Q2xhc3NlcyA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudFsnZXZlbnRUeXBlJ10+KCk7XG4gIHByaXZhdGUgb25Db25zdW1lZEV2ZW50PzogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvblVuY29uc3VtZWRFdmVudDogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvbkR1cGxpY2F0ZUV2ZW50PzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBmaXJzdFR5cGU6IEV2ZW50WydldmVudFR5cGUnXVxuICApID0+IHZvaWQ7XG4gIHByaXZhdGUgZ2V0UHJvbWlzZVF1ZXVlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIGlzRGVsaXZlcnlJZGxlOiAoKSA9PiBib29sZWFuO1xuICBwcml2YXRlIHBlbmRpbmdVbmNvbnN1bWVkQ2hlY2s6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdW5jb25zdW1lZENoZWNrVmVyc2lvbiA9IDA7XG5cbiAgY29uc3RydWN0b3IoZXZlbnRzOiBFdmVudFtdLCBvcHRpb25zOiBFdmVudHNDb25zdW1lck9wdGlvbnMpIHtcbiAgICAvLyBPd24gY29weTogdGhlIHJ1bnRpbWUgbXV0YXRlcyBpdHMgZXZlbnQgYXJyYXkgaW4gcGxhY2UsIGFuZCBhIHJldGFpbmVkXG4gICAgLy8gc2Vzc2lvbiBtdXN0IG9ubHkgb2JzZXJ2ZSBuZXcgZXZlbnRzIHRocm91Z2ggYXBwZW5kKCkgc28gcmVzdW1lKCknc1xuICAgIC8vIHN0cmljdC1leHRlbnNpb24gY2hlY2sgc3RheXMgbWVhbmluZ2Z1bC5cbiAgICB0aGlzLmV2ZW50cyA9IFsuLi5ldmVudHNdO1xuICAgIHRoaXMuZXZlbnRJbmRleCA9IDA7XG4gICAgdGhpcy5vbkNvbnN1bWVkRXZlbnQgPSBvcHRpb25zLm9uQ29uc3VtZWRFdmVudDtcbiAgICB0aGlzLm9uVW5jb25zdW1lZEV2ZW50ID0gb3B0aW9ucy5vblVuY29uc3VtZWRFdmVudDtcbiAgICB0aGlzLm9uRHVwbGljYXRlRXZlbnQgPSBvcHRpb25zLm9uRHVwbGljYXRlRXZlbnQ7XG4gICAgdGhpcy5nZXRQcm9taXNlUXVldWUgPSBvcHRpb25zLmdldFByb21pc2VRdWV1ZTtcbiAgICB0aGlzLmlzRGVsaXZlcnlJZGxlID0gb3B0aW9ucy5pc0RlbGl2ZXJ5SWRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb2xkZXN0IGV2ZW50IHRoZSB3YWxrIHN0ZXBwZWQgb3ZlciB0aGF0IG5vIGNvbnN1bWVyIGhhcyBjbGFpbWVkIHlldCxcbiAgICogaWYgYW55LiBQYXJraW5nIGlzIGEgYmV0IHRoYXQgYSBjb25zdW1lciB3aWxsIGJlIHJlZ2lzdGVyZWQgbGF0ZXIsIHNvIGF0XG4gICAqIGFueSBwb2ludCB3aGVyZSBubyBjb25zdW1lciBldmVyIHdpbGwgYmUgYWdhaW4g4oCUIHRoZSByZXBsYXkgZmluaXNoaW5nIGlzXG4gICAqIHRoZSBkZWZpbml0aXZlIG9uZSDigJQgdGhpcyBhbnN3ZXJzIHdoaWNoIGV2ZW50IHRoZSBiZXQgbG9zdCBvbi5cbiAgICovXG4gIGdldCBzdHJhbmRlZEV2ZW50KCk6IEV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJrZWRbMF0/LmV2ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhlIHdhbGsgaXMgc3RpbGwgaG9sZGluZywgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBob2xkcyBub3RoaW5nLlxuICAgKlxuICAgKiBSZWFkIGF0IGV2ZXJ5IHBvaW50IGEgcmVwbGF5IHN0b3BzLCBpbmNsdWRpbmcgdGhlIHN1c3BlbnNpb25zIHRoYXQgYXJlIG5vdFxuICAgKiBzZXR0bGluZyBwb2ludHMsIHNvIHRoZSBoZWxkIHN0YXRlIHJlYWNoZXMgdGVsZW1ldHJ5LiBBIHJlcGxheSBjYW5ub3QgdGVsbFxuICAgKiBhIGRlbGl2ZXJ5IGF3YWl0aW5nIGEgbGF0ZXIgY29uc3VtZXIgZnJvbSBvbmUgbm8gY29uc3VtZXIgd2lsbCBldmVyXG4gICAqIHJlZ2lzdGVyLCBzbyBpdCByZXBvcnRzIHJhdGhlciB0aGFuIGRlY2lkZXM6IHRoZSBzYW1lIGBldmVudElkYCByZXBvcnRlZCBvblxuICAgKiBzdXNwZW5zaW9uIGFmdGVyIHN1c3BlbnNpb24gb2Ygb25lIHJ1biBpcyB0aGUgc2hhcGUgdGhhdCBzYXlzIHRoZSBiZXRcbiAgICogcGFya2luZyBtYWRlIGlzIG5vdCBnb2luZyB0byBwYXkgb2ZmLCBhbmQgdGhhdCBzaGFwZSBpcyBvbmx5IHZpc2libGUgYWNyb3NzXG4gICAqIHJlcGxheXMuXG4gICAqL1xuICBnZXQgcGFya2VkU3VtbWFyeSgpOlxuICAgIHwgeyBjb3VudDogbnVtYmVyOyBldmVudElkOiBzdHJpbmc7IGV2ZW50VHlwZTogRXZlbnRbJ2V2ZW50VHlwZSddIH1cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5wYXJrZWRbMF0/LmV2ZW50O1xuICAgIGlmICghb2xkZXN0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY291bnQ6IHRoaXMucGFya2VkLmxlbmd0aCxcbiAgICAgIGV2ZW50SWQ6IG9sZGVzdC5ldmVudElkLFxuICAgICAgZXZlbnRUeXBlOiBvbGRlc3QuZXZlbnRUeXBlLFxuICAgIH07XG4gIH1cblxuICBhcHBlbmQoZXZlbnRzOiBFdmVudFtdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHRoaXMuZXZlbnRzLnB1c2goZXZlbnQpO1xuICAgIHByb2Nlc3MubmV4dFRpY2sodGhpcy5jb25zdW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYWZ0ZXIgYW4gZXZlbnQgaGFzIGJlZW4gY29uc3VtZWRcbiAgICogYnkgYSBkaWZmZXJlbnQgY2FsbGJhY2suIFRoZSBjYWxsYmFjayBjYW4gcmV0dXJuOlxuICAgKiAgLSBgRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZGAgdGhlIGV2ZW50IGlzIGNvbnNpZGVyZWQgY29uc3VtZWQgYW5kIHdpbGwgbm90IGJlIHBhc3NlZCB0byBhbnkgb3RoZXIgY2FsbGJhY2ssIGJ1dCB0aGUgY2FsbGJhY2sgd2lsbCByZW1haW4gaW4gdGhlIGNhbGxiYWNrcyBsaXN0XG4gICAqICAtIGBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkYCB0aGUgZXZlbnQgaXMgcGFzc2VkIHRvIHRoZSBuZXh0IGNhbGxiYWNrXG4gICAqICAtIGBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkYCB0aGUgZXZlbnQgaXMgY29uc2lkZXJlZCBjb25zdW1lZCBhbmQgdGhlIGNhbGxiYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FsbGJhY2tzIGxpc3RcbiAgICpcbiAgICogQHBhcmFtIGZuIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgc3Vic2NyaWJlKGZuOiBFdmVudENvbnN1bWVyQ2FsbGJhY2spIHtcbiAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKGZuKTtcbiAgICAvLyBDYW5jZWwgYW55IHBlbmRpbmcgdW5jb25zdW1lZCBjaGVjayBzaW5jZSBhIG5ldyBjYWxsYmFjayBtYXkgY29uc3VtZSB0aGUgZXZlbnQuXG4gICAgLy8gSW5jcmVtZW50aW5nIHRoZSB2ZXJzaW9uIGNhdXNlcyBhbnkgaW4tZmxpZ2h0IHByb21pc2UgY2hhaW4gY2hlY2sgdG8gbm8tb3AuXG4gICAgLy8gQWxzbyBjbGVhciB0aGUgcGVuZGluZyBzZXRUaW1lb3V0IGlmIGl0IGhhc24ndCBmaXJlZCB5ZXQuXG4gICAgaWYgKHRoaXMucGVuZGluZ1VuY29uc3VtZWRDaGVjayAhPT0gbnVsbCkge1xuICAgICAgdGhpcy51bmNvbnN1bWVkQ2hlY2tWZXJzaW9uKys7XG4gICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkQ2hlY2sgPSBudWxsO1xuICAgICAgaWYgKHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ICE9PSBudWxsKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBlbmRpbmdVbmNvbnN1bWVkVGltZW91dCk7XG4gICAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvY2Vzcy5uZXh0VGljayh0aGlzLmNvbnN1bWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlDb25zdW1lZEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5vbkNvbnN1bWVkRXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25Db25zdW1lZEV2ZW50KGV2ZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXZlbnRzTG9nZ2VyLmVycm9yKCdvbkNvbnN1bWVkRXZlbnQgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3InLCB7XG4gICAgICAgIGVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lID0gKCkgPT4ge1xuICAgIC8vIERyYWluIGNvbnNlY3V0aXZlbHkgY29uc3VtYWJsZSBldmVudHMgc3luY2hyb25vdXNseSB3aXRoaW4gYSBzaW5nbGVcbiAgICAvLyBwYXNzIGluc3RlYWQgb2YgcGF5aW5nIG9uZSBgcHJvY2Vzcy5uZXh0VGlja2AgcGVyIGNvbnN1bWVkIGV2ZW50LlxuICAgIC8vXG4gICAgLy8gV2h5IHRoaXMgaXMgc2FmZTogYSBjYWxsYmFjayBvbmx5IGNvbnN1bWVzIGFuIGV2ZW50IHVzaW5nIGEgY29uc3VtZXJcbiAgICAvLyB0aGF0IGlzIEFMUkVBRFkgcmVnaXN0ZXJlZCAoZS5nLiBhIGxvbmctbGl2ZWQgc3RlcCBjb25zdW1lciB3YWxraW5nXG4gICAgLy8gYHN0ZXBfY3JlYXRlZGAg4oaSIGBzdGVwX3N0YXJ0ZWRgIOKGkiBgc3RlcF9jb21wbGV0ZWRgLCBvciB0aGUgc3RydWN0dXJhbFxuICAgIC8vIGxpZmVjeWNsZSBjb25zdW1lcikuIE5ldyBjb25zdW1lcnMgYXJlIG9ubHkgZXZlciByZWdpc3RlcmVkIGJ5IHdvcmtmbG93XG4gICAgLy8gVk0gYm9keSBjb2RlIHRoYXQgcnVucyBhc3luY2hyb25vdXNseSBvZmYgYGN0eC5wcm9taXNlUXVldWVgIGFmdGVyIGFcbiAgICAvLyBkZWxpdmVyeSBgcmVzb2x2ZSgpYDsgbm9uZSBvZiB0aGUgY2FsbGJhY2tzIGhlcmUgY2FsbCBgc3Vic2NyaWJlKClgXG4gICAgLy8gc3luY2hyb25vdXNseS4gU28gd2l0aGluIG9uZSBwYXNzIGB0aGlzLmNhbGxiYWNrc2AgaXMgbXV0YXRlZCBvbmx5IGJ5XG4gICAgLy8gdGhpcyBsb29wICh0aGUgYEZpbmlzaGVkYCBzcGxpY2UpLCBhbmQgdGhlIG5leHQgZXZlbnQncyBjb25zdW1lciBpc1xuICAgIC8vIGVpdGhlciBhbHJlYWR5IHByZXNlbnQgKGFkdmFuY2Ugbm93KSBvciBub3QgeWV0IHJlZ2lzdGVyZWQg4oCUIGluIHdoaWNoXG4gICAgLy8gY2FzZSBubyBjYWxsYmFjayBjb25zdW1lcyB0aGUgZXZlbnQgYW5kIHdlIGZhbGwgdGhyb3VnaCB0byB0aGVcbiAgICAvLyBjcm9zcy1WTS1zYWZlIGRlZmVycmVkIHVuY29uc3VtZWQtZXZlbnQgY2hlY2sgYmVsb3csIGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAvLyBCZWZvcmUgZXZlcnkgb2ZmZXIsIG5vdCBqdXN0IG9uIHN1YnNjcmliZTogYSBjYWxsYmFjayByZWdpc3RlcmVkIGJ5XG4gICAgICAvLyB0aGUgd29yayB0aGlzIHNhbWUgcGFzcyBraWNrZWQgb2ZmIG1heSBiZSB0aGUgb3duZXIgb2Ygc29tZXRoaW5nXG4gICAgICAvLyBwYXJrZWQsIGFuZCB0aGUgcGFya2VkIGV2ZW50J3MgZGVsaXZlcnkgaXMgb3JkZXJlZCBhaGVhZCBvZiB0aGUgaGVhZFxuICAgICAgLy8gZXZlbnQncyBieSB0aGUgaW5kZXggaXQgaG9sZHMuXG4gICAgICB0aGlzLmRyYWluUGFya2VkKCk7XG4gICAgICBjb25zdCBjdXJyZW50RXZlbnQgPSB0aGlzLmV2ZW50c1t0aGlzLmV2ZW50SW5kZXhdID8/IG51bGw7XG4gICAgICBjb25zdCBjb25zdW1lZCA9IHRoaXMub2ZmZXIoY3VycmVudEV2ZW50KTtcbiAgICAgIGlmIChjb25zdW1lZCkge1xuICAgICAgICB0aGlzLmV2ZW50SW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50RXZlbnQgPT09IG51bGwpIHtcbiAgICAgICAgLy8gRW5kIG9mIGxvZy4gQ29uc3VtZXJzIHJldHVybiBOb3RDb25zdW1lZCBmb3IgdGhlIGBudWxsYCBzZW50aW5lbFxuICAgICAgICAvLyAodGhlIG9uZSB0aGF0IHJlY29nbml6ZXMgaXQgYXMgaXRzIG93biBib3VuZGFyeSBzY2hlZHVsZXMgdGhlXG4gICAgICAgIC8vIHN1c3BlbnNpb24gYXMgYSBzaWRlIGVmZmVjdCBhbmQgc3RpbGwgZGVjbGluZXMgaXQpLCBzbyB0aGUgZHJhaW5cbiAgICAgICAgLy8gc3RvcHMgaGVyZSByYXRoZXIgdGhhbiBzcGlubmluZyBwYXN0IHRoZSBlbmQuIGBjb25zdW1lZGAgaXMgb25seVxuICAgICAgICAvLyB0cnVlIGZvciBhIGNhbGxiYWNrIHRoYXQgY2xhaW1zIHRoZSBzZW50aW5lbCBvdXRyaWdodCwgd2hpY2ggbm9cbiAgICAgICAgLy8gcHJvZHVjdGlvbiBjb25zdW1lciBkb2VzLlxuICAgICAgICBpZiAoIWNvbnN1bWVkKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVFbmRPZkxvZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghY29uc3VtZWQpIHtcbiAgICAgICAgLy8gTm9ib2R5IHdhbnRlZCBpdC4gSWYgaXQgcmVwZWF0cyBhIGNsYXNzIHRoaXMgd2FsayBhbHJlYWR5IGNvbnN1bWVkXG4gICAgICAgIC8vIGZvciB0aGUgc2FtZSBlbnRpdHkgaXQgaXMgYSBzdHJhZ2dsZXIgZnJvbSBhIGNvbmN1cnJlbnQgcmVwbGF5OlxuICAgICAgICAvLyBzdGVwIG92ZXIgaXQgaW4gdGhpcyBwYXNzIHJhdGhlciB0aGFuIHBheWluZyB0aGUgZGVmZXJyZWQgd2luZG93IGZvclxuICAgICAgICAvLyBhIGNvbnN1bWVyIHRoYXQgY2Fubm90IGNvbWUgKHNlZSBgZmlyc3RFdmVudFR5cGVPZkNsYXNzYCkuXG4gICAgICAgIGNvbnN0IGZpcnN0VHlwZSA9IHRoaXMuZmlyc3RFdmVudFR5cGVPZkNsYXNzKGN1cnJlbnRFdmVudCk7XG4gICAgICAgIGlmIChmaXJzdFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuc2tpcER1cGxpY2F0ZUV2ZW50KGN1cnJlbnRFdmVudCwgZmlyc3RUeXBlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjaGVkdWxlVW5jb25zdW1lZENoZWNrKGN1cnJlbnRFdmVudCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEEgcmVhbCBldmVudCB3YXMgY29uc3VtZWQg4oCUIGFkdmFuY2UgdG8gdGhlIG5leHQgaW4gdGhlIHNhbWUgcGFzcy5cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIE9mZmVyIGBjdXJyZW50RXZlbnRgIHRvIGVhY2ggcmVnaXN0ZXJlZCBjYWxsYmFjayBpbiB0dXJuLiBSZXR1cm5zIHRydWVcbiAgICogd2hlbiBhIGNhbGxiYWNrIGNvbnN1bWVkIGl0LiBEb2VzIG5vdCBtb3ZlIHtAbGluayBldmVudEluZGV4fTogdGhlIG9yZGVyZWRcbiAgICogd2FsayBhbmQgdGhlIHBhcmtlZCBkcmFpbiBhZHZhbmNlIGRpZmZlcmVudGx5LCBzbyBlYWNoIGRvZXMgaXRzIG93bi5cbiAgICovXG4gIHByaXZhdGUgb2ZmZXIoY3VycmVudEV2ZW50OiBFdmVudCB8IG51bGwpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2ldO1xuICAgICAgbGV0IGhhbmRsZWQgPSBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlZCA9IGNhbGxiYWNrKGN1cnJlbnRFdmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBldmVudHNMb2dnZXIuZXJyb3IoJ0V2ZW50Q29uc3VtZXIgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3InLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBoYW5kbGVkICE9PSBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkICYmXG4gICAgICAgIGhhbmRsZWQgIT09IEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWRcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50RXZlbnQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGN1cnJlbnRFdmVudC5jb3JyZWxhdGlvbklkICYmXG4gICAgICAgICAgT05FX1NIT1RfRVZFTlRfVFlQRVMuaGFzKGN1cnJlbnRFdmVudC5ldmVudFR5cGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucmVzb2x2ZWQuYWRkKFxuICAgICAgICAgICAgcmVzb2x1dGlvbktleShjdXJyZW50RXZlbnQuZXZlbnRUeXBlLCBjdXJyZW50RXZlbnQuY29ycmVsYXRpb25JZClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVjb3JkRXZlbnRDbGFzcyhjdXJyZW50RXZlbnQpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbnN1bWVkRXZlbnQoY3VycmVudEV2ZW50KTtcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0aGUgY2FsbGJhY2sgaWYgaXQgaGFzIGZpbmlzaGVkXG4gICAgICBpZiAoaGFuZGxlZCA9PT0gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZCkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9mZmVyIGV2ZXJ5dGhpbmcgcGFya2VkLCBvbGRlc3QgZmlyc3QsIHVudGlsIGEgcGFzcyBjbGFpbXMgbm90aGluZy5cbiAgICpcbiAgICogRWFjaCBvZmZlciBydW5zIHdpdGgge0BsaW5rIGV2ZW50SW5kZXh9IG1vdmVkIGJhY2sgdG8gdGhlIHBvc2l0aW9uIHRoZVxuICAgKiBwYXJrZWQgZXZlbnQgaGVsZCBpbiB0aGUgbG9nLCBiZWNhdXNlIHRoYXQgaXMgdGhlIHBvc2l0aW9uIGl0cyBjb25zdW1lclxuICAgKiB3aWxsIHJlZ2lzdGVyIGEgZGVsaXZlcnkgYmFycmllciB1bmRlci4gUmVzdG9yaW5nIHRoZSB3YWxrIHBvaW50ZXJcbiAgICogYWZ0ZXJ3YXJkcyBpcyB3aGF0IGtlZXBzIHRoZSB0d28gcG9pbnRlcnMgZnJvbSBpbnRlcmZlcmluZy5cbiAgICovXG4gIHByaXZhdGUgZHJhaW5QYXJrZWQoKTogdm9pZCB7XG4gICAgbGV0IHByb2dyZXNzZWQgPSB0aGlzLnBhcmtlZC5sZW5ndGggPiAwO1xuICAgIHdoaWxlIChwcm9ncmVzc2VkKSB7XG4gICAgICBwcm9ncmVzc2VkID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFya2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5wYXJrZWRbaV07XG4gICAgICAgIGNvbnN0IHdhbGtJbmRleCA9IHRoaXMuZXZlbnRJbmRleDtcbiAgICAgICAgdGhpcy5ldmVudEluZGV4ID0gZW50cnkuaW5kZXg7XG4gICAgICAgIGxldCBjb25zdW1lZDogYm9vbGVhbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdW1lZCA9IHRoaXMub2ZmZXIoZW50cnkuZXZlbnQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMuZXZlbnRJbmRleCA9IHdhbGtJbmRleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uc3VtZWQpIHtcbiAgICAgICAgICB0aGlzLnBhcmtlZC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgLy8gQSBgRmluaXNoZWRgIGNhbGxiYWNrIHdhcyBzcGxpY2VkIG91dCBvZiB0aGUgbGlzdCB0aGlzIHBhc3MsIHNvXG4gICAgICAgICAgLy8gcmVzdGFydCByYXRoZXIgdGhhbiBrZWVwIHdhbGtpbmcgYSBtdXRhdGVkIGFycmF5LlxuICAgICAgICAgIHByb2dyZXNzZWQgPSB0aGlzLnBhcmtlZC5sZW5ndGggPiAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgdGhlIG9yZGVyZWQgd2FsayBvdmVyIGFuIGV2ZW50IG5vYm9keSBjbGFpbWVkLCBob2xkaW5nIG9uIHRvIGl0IGZvciBhXG4gICAqIGxhdGVyIGNvbnN1bWVyLiBSZXR1cm5zIGZhbHNlIHdoZW4gdGhlIGV2ZW50J3MgdHlwZSBtYWtlcyBpdHMgcG9zaXRpb24gYVxuICAgKiBkZWNpc2lvbiByZWNvcmQsIHdoaWNoIGlzIHRoZSBvbmUgY2FzZSB3aGVyZSBub2JvZHkgY2xhaW1pbmcgaXQgbWVhbnMgdGhlXG4gICAqIHJlcGxheSBkaXZlcmdlZC5cbiAgICovXG4gIHByaXZhdGUgcGFyayhldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIVBBUktBQkxFX0VWRU5UX1RZUEVTLmhhcyhldmVudC5ldmVudFR5cGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgJiZcbiAgICAgIHRoaXMucmVzb2x2ZWQuaGFzKHJlc29sdXRpb25LZXkoZXZlbnQuZXZlbnRUeXBlLCBldmVudC5jb3JyZWxhdGlvbklkKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5wYXJrZWQucHVzaCh7IGV2ZW50LCBpbmRleDogdGhpcy5ldmVudEluZGV4IH0pO1xuICAgIHRoaXMuZXZlbnRJbmRleCsrO1xuICAgIGV2ZW50c0xvZ2dlci5kZWJ1ZygnUGFya2VkIGFuIHVuY2xhaW1lZCBldmVudCBmb3IgbGF0ZXIgZGVsaXZlcnknLCB7XG4gICAgICBldmVudElkOiBldmVudC5ldmVudElkLFxuICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICBjb3JyZWxhdGlvbklkOiBldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgcGFya2VkOiB0aGlzLnBhcmtlZC5sZW5ndGgsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGtleSBgZXZlbnRgJ3MgY2xhc3MgaXMgdHJhY2tlZCB1bmRlciwgb3IgYHVuZGVmaW5lZGAgZm9yIHRoZSBldmVudFxuICAgKiB0eXBlcyB0aGF0IGJlbG9uZyB0byBubyBjbGFzcyAoYGhvb2tfcmVjZWl2ZWRgLCBgaG9va19jb25mbGljdGAsXG4gICAqIGBhdHRyX3NldGAsIGBydW5fY3JlYXRlZGApIGFuZCBhcmUgdGhlcmVmb3JlIG5ldmVyIHNraXBwZWQuXG4gICAqXG4gICAqIFJ1biBldmVudHMgY2Fycnkgbm8gY29ycmVsYXRpb24gaWQuIFRoZXkgYXJlIGNsYXNzZXMgb2YgdGhlIHJ1biBpdHNlbGYsIHNvXG4gICAqIHRoZXkgYWxsIGtleSBvZmYgdGhlIHNhbWUgYnVja2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBldmVudENsYXNzS2V5KGV2ZW50OiBFdmVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXZlbnRDbGFzcyA9IGVudGl0eUV2ZW50Q2xhc3MoZXZlbnQuZXZlbnRUeXBlKTtcbiAgICByZXR1cm4gZXZlbnRDbGFzcyA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBgJHtldmVudENsYXNzfToke2V2ZW50LmNvcnJlbGF0aW9uSWR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1lbWJlcnMgdGhhdCBgZXZlbnRgJ3MgY2xhc3MgaXMgbm93IGRlY2lkZWQgZm9yIGl0cyBlbnRpdHksIGlmIHRoZSB0eXBlXG4gICAqIGJlbG9uZ3MgdG8gYSBjbGFzcy4gRmlyc3Qgd3JpdGVyIHdpbnM6IHRoZSByZWNvcmRlZCB0eXBlIGlzIHRoZSBvbmUgdGhlXG4gICAqIHdvcmtmbG93IG9ic2VydmVkLCBhbmQgYSBsYXRlciByZXBlYXQgaXMgbWVhc3VyZWQgYWdhaW5zdCBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkRXZlbnRDbGFzcyhldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmV2ZW50Q2xhc3NLZXkoZXZlbnQpO1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5zZWVuRXZlbnRDbGFzc2VzLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLnNlZW5FdmVudENsYXNzZXMuc2V0KGtleSwgZXZlbnQuZXZlbnRUeXBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgdGhhdCBhbHJlYWR5IGRlY2lkZWQgYGV2ZW50YCdzIGNsYXNzIGZvciB0aGUgc2FtZSBlbnRpdHksIG9yXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gbm90aGluZyBoYXM6IGEgc2Vjb25kIGBzdGVwX2NyZWF0ZWRgIGZvciBvbmUgc3RlcCwgYVxuICAgKiBzZWNvbmQgdGVybWluYWwgb3V0Y29tZSwgYSBzZWNvbmQgYHN0ZXBfc3RhcnRlZGAgYWZ0ZXIgdGhlIHN0ZXAncyByZXN1bHQgaXNcbiAgICogYWxyZWFkeSBpbiB0aGUgbG9nLlxuICAgKlxuICAgKiBTdWNoIGFuIGV2ZW50IGlzIGNvbW1pdHRlZCBidXQgaW5lcnQuIENvbmN1cnJlbnQgcmVwbGF5cyB3cml0ZSBpbnRvIG9uZVxuICAgKiBsb2cgd2l0aG91dCBhIGN1cnJlbmN5IGd1YXJkLCBzbyBhIHJlcGxheSB3b3JraW5nIGZyb20gYSBwcmVmaXggdGhhdFxuICAgKiBwcmVkYXRlcyBhbm90aGVyIHJlcGxheSdzIHdyaXRlIGNhbiBjb21taXQgaXRzIG93biBjb3B5IG9mIHdvcmsgdGhlIGxvZ1xuICAgKiBhbHJlYWR5IHJlY29yZHMuIFRoYXQgY29weSBjYW5ub3QgY2hhbmdlIHdoYXQgdGhlIHdvcmtmbG93IG9ic2VydmVkOiB0aGVcbiAgICogb3V0Y29tZSB3YXMgZGVjaWRlZCBieSB0aGUgZmlyc3QgZXZlbnQgb2YgdGhlIGNsYXNzIGFuZCBldmVyeSBsYXRlciByZXBsYXlcbiAgICogcmVhZHMgdGhhdCBzYW1lIGV2ZW50IGF0IHRoZSBzYW1lIGxvZyBwb3NpdGlvbiwgc28gaWdub3JpbmcgdGhlIHN0cmFnZ2xlclxuICAgKiBpcyBkZXRlcm1pbmlzdGljIGFjcm9zcyByZXBsYXlzLlxuICAgKlxuICAgKiBDbGFzc2VzIGFyZSB0cmFja2VkIHNlcGFyYXRlbHksIHNvIHBhc3Npbmcgb25lIGRvZXMgbm90IHN1cHByZXNzIGFub3RoZXIuXG4gICAqIEEgc3RlcCB3aG9zZSByZXN1bHQgaXMgaW4gdGhlIGxvZyBzdGlsbCByZWFjaGVzIGl0cyBgc3RlcF9jcmVhdGVkYCBhbmRcbiAgICogYHN0ZXBfc3RhcnRlZGAgY29uc3VtZXJzIGlmIGl0IGhhcyB5ZXQgdG8gc2VlIHRob3NlIGNsYXNzZXMuXG4gICAqXG4gICAqIENvbnN1bHRlZCBvbmx5IGFmdGVyIGV2ZXJ5IHJlZ2lzdGVyZWQgY2FsbGJhY2sgaGFzIGRlY2xpbmVkIHRoZSBldmVudCwgc29cbiAgICogaXQgY2FuIG5ldmVyIHRha2UgYW4gZXZlbnQgYSBjb25zdW1lciB3YW50ZWQuIEEgcmV0cnkncyBgc3RlcF9zdGFydGVkYCBpc1xuICAgKiBjbGFpbWVkIGJ5IHRoZSBzdGVwJ3MgbGl2ZSBjb25zdW1lciBhbmQgY291bnRzIGFzIGFuIGF0dGVtcHQgZXhhY3RseSBhc1xuICAgKiBiZWZvcmUsIGFuZCBhIHNlY29uZCBgc3RlcF9jcmVhdGVkYCByZWFjaGluZyBhIHN0ZXAgdGhhdCBoYXMgbm90IGZpbmlzaGVkXG4gICAqIGlzIGxpa2V3aXNlIGNvbnN1bWVkIHJhdGhlciB0aGFuIHNraXBwZWQ7IG9ubHkgdGhlIGNvcGllcyBub2JvZHkgY2xhaW1zIGFyZVxuICAgKiBza2lwcGVkLlxuICAgKlxuICAgKiBVbmxpa2UgdGhlIGRpdmVyZ2VuY2UgcmVwb3J0LCB0aGlzIGRvZXMgKm5vdCogd2FpdCBvdXQgdGhlIGRlZmVycmVkIHdpbmRvd1xuICAgKiBmaXJzdCwgYW5kIGl0IGRvZXMgbm90IG5lZWQgdG8uIFRoZSB3aW5kb3cgYnV5cyB0aW1lIGZvciBhIGNvbnN1bWVyIHRoYXRcbiAgICogaGFzIHlldCB0byByZWdpc3RlciwgYW5kIG5vIHN1Y2ggY29uc3VtZXIgY2FuIHdhbnQgdGhpcyBldmVudDogdGhlIGNsYXNzXG4gICAqIHdhcyByZWNvcmRlZCBieSBhIGNvbnN1bXB0aW9uIGluIHRoaXMgc2FtZSByZXBsYXksIHdoaWNoIG1lYW5zIHRoZSBlbnRpdHknc1xuICAgKiBjb25zdW1lciB3YXMgcmVnaXN0ZXJlZCBhbmQgdG9vayBhbiBldmVudCBvZiB0aGlzIGNsYXNzLCBhbmQgY29ycmVsYXRpb25cbiAgICogaWRzIGFyZSBtaW50ZWQgZnJvbSBhIG1vbm90b25pYyBVTElEIHBlciBib2R5IHBvc2l0aW9uLCBzbyBub3RoaW5nIGxhdGVyIGluXG4gICAqIHRoZSBib2R5IHJlZ2lzdGVycyBhIHNlY29uZCBjb25zdW1lciB1bmRlciB0aGlzIGlkLiBXYWl0aW5nIHdvdWxkIGNvc3RcbiAgICogYGdldERlZmVycmVkQ2hlY2tEZWxheU1zKClgIHBlciBzdHJhZ2dsZXIgcGVyIHJlcGxheSBmb3IgaW5mb3JtYXRpb24gdGhhdFxuICAgKiBjYW5ub3QgYXJyaXZlIOKAlCAwLjc1JSBvZiBwcm9kdWN0aW9uIHJ1bnMgY2FycnkgYXQgbGVhc3Qgb25lIHN0cmFnZ2xlciwgYW5kXG4gICAqIHRoZSBwOTkgYW1vbmcgdGhvc2UgY2FycmllcyAxNTUuXG4gICAqXG4gICAqIFRoZSBpbnZhcmlhbnQgdG8gcHJlc2VydmUgaWYgaG9vayBpZGVudGl0eSBldmVyIGJlY29tZXMgY2FsbGVyLXN1cHBsaWVkXG4gICAqIChhbiBpZGVtcG90ZW5jeSBrZXkgcmF0aGVyIHRoYW4gYSBtaW50ZWQgaWQpOiB0d28gYGNyZWF0ZUhvb2tgIGNhbGxzIGluIG9uZVxuICAgKiBib2R5IGNvdWxkIHRoZW4gc2hhcmUgYSBjb3JyZWxhdGlvbiBpZCwgYW5kIHRoZSBzZWNvbmQgY29uc3VtZXInc1xuICAgKiBgaG9va19jcmVhdGVkYCB3b3VsZCBiZSBhIHJlcGVhdCBvZiBhIGNsYXNzIHRoaXMgcmVwbGF5IGFscmVhZHkgcmVjb3JkZWQuXG4gICAqIFRoYXQgd291bGQgbWFrZSBza2lwcGluZyB3cm9uZyBmb3IgYGhvb2tfY3JlYXRlZGAsIGFuZCBpcyB0aGUgcmVhc29uIHRoZVxuICAgKiBjbGFzcyBtYXAgbGl2ZXMgbmV4dCB0byB0aGUgZXZlbnQgdHlwZXMgcmF0aGVyIHRoYW4gYmVpbmcgaW5mZXJyZWQuXG4gICAqL1xuICBwcml2YXRlIGZpcnN0RXZlbnRUeXBlT2ZDbGFzcyhldmVudDogRXZlbnQpOiBFdmVudFsnZXZlbnRUeXBlJ10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZXZlbnRDbGFzc0tleShldmVudCk7XG4gICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5zZWVuRXZlbnRDbGFzc2VzLmdldChrZXkpO1xuICB9XG5cbiAgLyoqIFN0ZXBzIHRoZSB3YWxrIG92ZXIgYSByZXBlYXQgb2YgYW4gYWxyZWFkeS1jb25zdW1lZCBjbGFzcy4gKi9cbiAgcHJpdmF0ZSBza2lwRHVwbGljYXRlRXZlbnQoZXZlbnQ6IEV2ZW50LCBmaXJzdFR5cGU6IEV2ZW50WydldmVudFR5cGUnXSkge1xuICAgIHRoaXMuZXZlbnRJbmRleCsrO1xuICAgIC8vIERlbGliZXJhdGVseSBub3Qgcm91dGVkIHRocm91Z2ggYG5vdGlmeUNvbnN1bWVkRXZlbnRgOiB0aGUgZGV0ZXJtaW5pc3RpY1xuICAgIC8vIGNsb2NrIGFkdmFuY2VzIG9ubHkgb24gZXZlbnRzIHRoZSB3b3JrZmxvdyBhY3R1YWxseSBvYnNlcnZlZC4gQSBza2lwcGVkXG4gICAgLy8gZXZlbnQgaXMgaW52aXNpYmxlIHRvIHRoZSB3b3JrZmxvdyBib2R5LCBhbmQgYSBsb2cgdGhhdCBoYXBwZW5zIHRvXG4gICAgLy8gY29udGFpbiBvbmUgbXVzdCBwcm9kdWNlIHRoZSBzYW1lIHRpbWVzdGFtcHMgYXMgYSBsb2cgdGhhdCBkb2VzIG5vdC5cbiAgICBldmVudHNMb2dnZXIuZGVidWcoXG4gICAgICAnU2tpcHBpbmcgZXZlbnQgdGhhdCByZXBlYXRzIGEgY2xhc3MgYWxyZWFkeSBpbiB0aGUgbG9nJyxcbiAgICAgIHtcbiAgICAgICAgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCxcbiAgICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICAgIGZpcnN0RXZlbnRUeXBlOiBmaXJzdFR5cGUsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICB9XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vbkR1cGxpY2F0ZUV2ZW50Py4oZXZlbnQsIGZpcnN0VHlwZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGV2ZW50c0xvZ2dlci5lcnJvcignb25EdXBsaWNhdGVFdmVudCBjYWxsYmFjayB0aHJldyBhbiBlcnJvcicsIHtcbiAgICAgICAgZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVuZE9mTG9nKCkge1xuICAgIC8vIEV2ZXJ5dGhpbmcgc3RpbGwgcGFya2VkIGlzIHdhaXRpbmcgZm9yIGEgY29uc3VtZXIgc29tZSBsYXRlciByZXBsYXkgd2lsbFxuICAgIC8vIHJlZ2lzdGVyLCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgcGFya2luZyDigJQgZXhjZXB0IG9uY2UgdGhlIGxvZ1xuICAgIC8vIGFscmVhZHkgaG9sZHMgdGhlIHJ1bidzIHRlcm1pbmFsIGV2ZW50LCBiZWNhdXNlIHRoZW4gdGhlcmUgaXMgbm8gbGF0ZXJcbiAgICAvLyByZXBsYXkgYW5kIG5vIGNvbnN1bWVyIHdpbGwgZXZlciBjb21lLlxuICAgIGlmICh0aGlzLnBhcmtlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGFzdCA9IHRoaXMuZXZlbnRzLmF0KC0xKTtcbiAgICBpZiAoIWxhc3QgfHwgIVRFUk1JTkFMX0VWRU5UX1RZUEVTLmhhcyhsYXN0LmV2ZW50VHlwZSkpIHtcbiAgICAgIC8vIEEgbGF0ZXIgcmVwbGF5IGlzIHN0aWxsIGV4cGVjdGVkLCBzbyBub3RoaW5nIGhlcmUgaXMgZGVjaWRhYmxlIGFuZFxuICAgICAgLy8gZXNjYWxhdGluZyB3b3VsZCBmYWlsIHRoZSBoZWFsdGh5IHJ1bnMgcGFya2luZyBleGlzdHMgdG8ga2VlcCBhbGl2ZS5cbiAgICAgIC8vIFJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIGxvZyBob2xkaW5nIHNvbWV0aGluZyBpcyBub3QgYnkgaXRzZWxmIGEgZmF1bHQsXG4gICAgICAvLyBzbyB0aGlzIHN0YXlzIGF0IGBkZWJ1Z2A7IHtAbGluayBwYXJrZWRTdW1tYXJ5fSBpcyB3aGF0IGNhcnJpZXMgdGhlXG4gICAgICAvLyBzdGF0ZSB0byB0aGUgc3Bhbiwgd2hlcmUgYSBydW4gdGhhdCBrZWVwcyBzdG9wcGluZyBvbiB0aGUgc2FtZSBoZWxkXG4gICAgICAvLyBldmVudCBpcyB2aXNpYmxlIGFuZCBhIHNpbmdsZSByZXBsYXkncyB2aWV3IGlzIG5vdC5cbiAgICAgIGV2ZW50c0xvZ2dlci5kZWJ1ZygnUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsb2cgc3RpbGwgaG9sZGluZyBldmVudHMnLCB7XG4gICAgICAgIGV2ZW50SWQ6IHRoaXMucGFya2VkWzBdLmV2ZW50LmV2ZW50SWQsXG4gICAgICAgIGV2ZW50VHlwZTogdGhpcy5wYXJrZWRbMF0uZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiB0aGlzLnBhcmtlZFswXS5ldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgICBwYXJrZWQ6IHRoaXMucGFya2VkLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNjaGVkdWxlVW5jb25zdW1lZENoZWNrKHRoaXMucGFya2VkWzBdLmV2ZW50LCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlVW5jb25zdW1lZENoZWNrKGN1cnJlbnRFdmVudDogRXZlbnQsIG1heVBhcms6IGJvb2xlYW4pIHtcbiAgICAvLyBBbGwgY2FsbGJhY2tzIHJldHVybmVkIE5vdENvbnN1bWVkIGZvciB0aGUgY3VycmVudCBldmVudC5cbiAgICAvLyBTY2hlZHVsZSBhIGRlZmVycmVkIGNoZWNrLiBXZSBjaGFpbiBvbnRvIHRoZSBwcm9taXNlUXVldWUgc28gdGhhdCBhbnlcbiAgICAvLyBwZW5kaW5nIGFzeW5jIHdvcmsgKGUuZy4sIGRlc2VyaWFsaXphdGlvbi9kZWNyeXB0aW9uIHRoYXQgdHJpZ2dlcnNcbiAgICAvLyByZXNvbHZlKCkg4oaSIHVzZXIgY29kZSDihpIgc3Vic2NyaWJlKCkpIGNvbXBsZXRlcyBmaXJzdC4gSWYgdGhlIGV2ZW50XG4gICAgLy8gaXMgc3RpbGwgdW5jb25zdW1lZCBhZnRlciB0aGUgcXVldWUgZHJhaW5zLCBpdCdzIHRydWx5IG9ycGhhbmVkIOKAlCBvcixcbiAgICAvLyB3aGVuIGl0cyB0eXBlIGNhcnJpZXMgbm8gb3JkZXJpbmcgY2xhaW0sIHBhcmtlZCBmb3IgYSBsYXRlciBjb25zdW1lci5cbiAgICBjb25zdCBjaGVja1ZlcnNpb24gPSArK3RoaXMudW5jb25zdW1lZENoZWNrVmVyc2lvbjtcbiAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkQ2hlY2sgPSB0aGlzLmdldFByb21pc2VRdWV1ZSgpXG4gICAgICAudGhlbihcbiAgICAgICAgLy8gWWllbGQgb25jZSBhZnRlciB0aGUgZmlyc3QgcXVldWUgZHJhaW4gc28gcHJvbWlzZSBjaGFpbnMgcmVzdW1lZCBieVxuICAgICAgICAvLyB0aGF0IGRyYWluIGNhbiBydW4gYWNyb3NzIHRoZSBWTSBib3VuZGFyeSBhbmQgYXBwZW5kIGFueSBmb2xsb3ctdXBcbiAgICAgICAgLy8gYXN5bmMgd29yayAoZm9yIGV4YW1wbGU6IHN0ZXBfY29tcGxldGVkIHJlc29sdmVzIC0+IGZvci1hd2FpdCBsb29wXG4gICAgICAgIC8vIHJlc3VtZXMgLT4gdGhlIG5leHQgaG9vayBwYXlsb2FkIHN0YXJ0cyBoeWRyYXRpbmcpLlxuICAgICAgICAoKSA9PiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSlcbiAgICAgIClcbiAgICAgIC50aGVuKCgpID0+IHRoaXMuZ2V0UHJvbWlzZVF1ZXVlKCkpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIFdhaXQgb3V0IGFueSBkZWxpdmVyeSBzdGlsbCBpbiBmbGlnaHQgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0aW1lci5cbiAgICAgICAgLy8gVGhlIHF1ZXVlIGRyYWluaW5nIHNheXMgdGhlIGhvc3QgaGFzIG5vIGh5ZHJhdGlvbiB3b3JrIGxlZnQ7IGl0XG4gICAgICAgIC8vIGRvZXMgbm90IHNheSB0aGUgVk0gaGFzIGZpbmlzaGVkIHJlYWN0aW5nIHRvIHdoYXQgd2FzIGh5ZHJhdGVkLlxuICAgICAgICB0aGlzLndoZW5EZWxpdmVyeUlkbGUoY2hlY2tWZXJzaW9uLCAoKSA9PiB7XG4gICAgICAgICAgLy8gVXNlIGEgZGVsYXllZCBzZXRUaW1lb3V0IG9uY2UgZGVsaXZlcmllcyBhcmUgaWRsZS4gVGhlIGRlbGF5IG11c3RcbiAgICAgICAgICAvLyBiZSBsb25nIGVub3VnaCBmb3IgcHJvbWlzZSBjaGFpbnMgdG8gcHJvcGFnYXRlIGFjcm9zcyB0aGUgVk1cbiAgICAgICAgICAvLyBib3VuZGFyeSAoZnJvbSByZXNvbHZlKCkgaW4gdGhlIGhvc3QgY29udGV4dCB0aHJvdWdoIHRvIHRoZVxuICAgICAgICAgIC8vIHdvcmtmbG93IGNvZGUgY2FsbGluZyBzdWJzY3JpYmUoKSBpbiB0aGUgVk0gY29udGV4dCkuIE5vZGUuanMgZG9lc1xuICAgICAgICAgIC8vIG5vdCBndWFyYW50ZWUgdGhhdCBzZXRUaW1lb3V0KDApIGZpcmVzIGFmdGVyIGFsbCBjcm9zcy1jb250ZXh0XG4gICAgICAgICAgLy8gbWljcm90YXNrcyBzZXR0bGUsIHNvIHdlIHVzZSBhIHNtYWxsIGJ1dCBub24temVybyBkZWxheS4gQW55XG4gICAgICAgICAgLy8gc3Vic2NyaWJlKCkgY2FsbCB0aGF0IGFycml2ZXMgZHVyaW5nIHRoaXMgd2luZG93IHdpbGwgY2FuY2VsIHRoZVxuICAgICAgICAgIC8vIGNoZWNrIHZpYSB2ZXJzaW9uIGludmFsaWRhdGlvbiArIGNsZWFyVGltZW91dC5cbiAgICAgICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMudW5jb25zdW1lZENoZWNrVmVyc2lvbiAhPT0gY2hlY2tWZXJzaW9uKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRDaGVjayA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVVbmNvbnN1bWVkRXZlbnQoY3VycmVudEV2ZW50LCBtYXlQYXJrKTtcbiAgICAgICAgICB9LCBnZXREZWZlcnJlZENoZWNrRGVsYXlNcygpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGUgd2hhdCBhIHN0aWxsLXVuY29uc3VtZWQgZXZlbnQgaXMsIG5vdyB0aGF0IHRoZSBwcm9taXNlIHF1ZXVlIGhhc1xuICAgKiBkcmFpbmVkIGFuZCB0aGUgZGVsaXZlcnkgZ2F0ZSBzYXlzIHRoZSBWTSBpcyBub3QgbWlkLXJlYWN0aW9uLlxuICAgKlxuICAgKiBgbWF5UGFya2AgaXMgZmFsc2Ugb25seSBmb3IgdGhlIGVuZC1vZi1sb2cgcmVjaGVjayBvZiBhbiBldmVudCB7QGxpbmsgcGFya31cbiAgICogYWxyZWFkeSBob2xkcy4gTm90aGluZyBpbiB0aGUgZmlyc3QgYnJhbmNoIGFwcGxpZXMgdG8gb25lIG9mIHRob3NlOiBpdCBpc1xuICAgKiBub3QgdGhlIGV2ZW50IGF0IHRoZSBjdXJzb3IsIHNvIHRoZSBpZGVudGl0eSBndWFyZCBpcyBub3QgbWVhbmluZ2Z1bCwgYW5kXG4gICAqIGl0IGlzIHBhcmtlZCBhbHJlYWR5LlxuICAgKlxuICAgKiBBIGR1cGxpY2F0ZSBjbGFzcyBuZXZlciBhcnJpdmVzIGhlcmUuIHtAbGluayBjb25zdW1lfSBzdGVwcyBvdmVyIG9uZSBpbiB0aGVcbiAgICogcGFzcyB0aGF0IG9mZmVyZWQgaXQsIGJlZm9yZSB0aGlzIGNoZWNrIGlzIGV2ZXIgc2NoZWR1bGVkLCBhbmQgYSBjbGFzc1xuICAgKiByZWNvcmRlZCB3aGlsZSB0aGUgY2hlY2sgd2FzIGluIGZsaWdodCBjYW4gb25seSBoYXZlIGJlZW4gcmVjb3JkZWQgYnkgYVxuICAgKiBjb25zdW1wdGlvbiBpbnNpZGUge0BsaW5rIGNvbnN1bWV9LCB3aG9zZSBuZXh0IHBhc3MgcmUtb2ZmZXJzIHRoaXMgZXZlbnRcbiAgICogYW5kIHN0ZXBzIG92ZXIgaXQgdGhlcmUg4oCUIGxlYXZpbmcgdGhlIGlkZW50aXR5IGd1YXJkIGFib3ZlIHRvIGRyb3AgdGhlXG4gICAqIGluLWZsaWdodCBjaGVjay5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVVuY29uc3VtZWRFdmVudChjdXJyZW50RXZlbnQ6IEV2ZW50LCBtYXlQYXJrOiBib29sZWFuKSB7XG4gICAgaWYgKG1heVBhcmspIHtcbiAgICAgIGlmICh0aGlzLmV2ZW50c1t0aGlzLmV2ZW50SW5kZXhdICE9PSBjdXJyZW50RXZlbnQpIHtcbiAgICAgICAgLy8gQW4gYXBwZW5kKCkgZHJhaW4gY2xhaW1lZCBpdCB3aGlsZSB0aGUgY2hlY2sgd2FzIGluIGZsaWdodC5cbiAgICAgICAgLy8gT25seSBzdWJzY3JpYmUoKSBjYW5jZWxzIHRoZSBjaGVjaywgc28gdGhpcyBpcyByZWFjaGFibGUuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnBhcmsoY3VycmVudEV2ZW50KSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uVW5jb25zdW1lZEV2ZW50KGN1cnJlbnRFdmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGBmbmAgb25jZSBubyBkYXRhIGRlbGl2ZXJ5IGlzIGluIGZsaWdodCwgcG9sbGluZyB0aGUgd2F5XG4gICAqIGBzY2hlZHVsZVdoZW5JZGxlYCBkb2VzOiBsZXQgdGhlIHByb21pc2UgcXVldWUgZHJhaW4sIHJlLWNoZWNrIGEgdGltZXJcbiAgICogdGljayBsYXRlciwgcmVwZWF0LlxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMgdGhlIGNoZWNrIGlzIGEgYmV0IHRoYXQgZXZlcnkgZGVsaXZlcnkgdGhlIHdhbGsgaXMgcnVubmluZ1xuICAgKiBhaGVhZCBvZiBsYW5kcyBpbnNpZGUgYSBmaXhlZCB3aW5kb3cuIENvbnN1bXB0aW9uIGlzIHN5bmNocm9ub3VzIHdoaWxlIHRoZVxuICAgKiByZXNvbHV0aW9uIGl0IHRyaWdnZXJzIGlzIG5vdDogYSBzdGVwIHJlc3VsdCBoeWRyYXRlcyBpbiB0aGUgaG9zdCwgcmVzb2x2ZXNcbiAgICogZnJvbSBhIGRldGFjaGVkIGNvbnRpbnVhdGlvbiBiZWhpbmQgYGF3YWl0RWFybGllckRlbGl2ZXJpZXNgLCBhbmQgb25seSB0aGVuXG4gICAqIGRvZXMgVk0gY29kZSBydW4gZmFyIGVub3VnaCB0byBzdWJzY3JpYmUgdGhlIG5leHQgY29uc3VtZXIuIFJlcGxheWluZyBhXG4gICAqIGJhdGNoIG9mIE4gcGFyYWxsZWwgc3RlcCByZXN1bHRzIGxlYXZlcyBOLTEgb2YgdGhlbSBvbiB0aGF0IGRldGFjaGVkIHBhdGhcbiAgICogd2l0aCB0aGUgcXVldWUgYWxyZWFkeSBkcmFpbmVkLCBzbyB0aGUgd2FsayBzaXRzIG9uIHRoZSBvcmRlcmVkIGV2ZW50IHRoZVxuICAgKiBWTSBpcyBhYm91dCB0byBkcmF3IGFuZCB0aGUgd2luZG93IGlzIHRoZSBvbmx5IHRoaW5nIHN0YW5kaW5nIGJldHdlZW4gYVxuICAgKiBoZWFsdGh5IHJ1biBhbmQgYFJlcGxheURpdmVyZ2VuY2VFcnJvcmAuXG4gICAqXG4gICAqIFNob3J0ZW5pbmcgdGhlIHdpbmRvdyBzaG93cyB0aGF0IG1lY2hhbmlzbSBkaXJlY3RseTogb24gaWRlbnRpY2FsIGV2ZW50IGxvZ3NcbiAgICogdGhlIGxvY2FsIHJhY2UgcmVwcm8gY29ycnVwdHMgMzQgb2YgNDIgcnVucyBhdCBhIDEwbXMgd2luZG93IGFuZCAwIG9mIDExNCBhdFxuICAgKiB0aGUgMTAwbXMgZGVmYXVsdC4gVGhhdCBtZWFzdXJlcyBob3cgdGhlIGJldCBsb3Nlcywgbm90IHRoYXQgdGhlIGRlZmF1bHRcbiAgICogbG9zZXMgaXQsIGFuZCBubyBtZWFzdXJlbWVudCBvZiBhIGRlbGl2ZXJ5IG91dHJ1bm5pbmcgMTAwbXMgZXhpc3RzIGVpdGhlclxuICAgKiB3YXkuIFNvIHJlYWQgdGhpcyBhcyByZXRpcmluZyB0aGUgYmV0IHJhdGhlciB0aGFuIGFzIHJlcGFpcmluZyBhbiBvYnNlcnZlZFxuICAgKiBmYWlsdXJlIG9mIHRoYXQgbnVtYmVyOiB0aGUgZGVsYXkgaXMgYSB1c2VyLXNldHRhYmxlIGVudiBvdmVycmlkZSwgd2hpY2hcbiAgICogbGVhdmVzIHRoZSBvbGQgYmVoYXZpb3VyIG9uZSBjb25maWd1cmF0aW9uIGF3YXkgZnJvbSBsb3Npbmcgb24gYW55IGJhY2tlbmQuXG4gICAqXG4gICAqIFRlcm1pbmF0aW9uIGlzIGBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeWAnczogaXQgY291bnRzIG9ubHkgZGVsaXZlcmllc1xuICAgKiB0aGF0IHJlc29sdmUgb24gdGhlaXIgb3duLCBzbyBub3RoaW5nIGhlcmUgY2FuIGdhdGUgaXRzIG93biByZXRpcmVtZW50LiBBXG4gICAqIGdlbnVpbmVseSBvcnBoYW5lZCBldmVudCBoYXMgbm8gZGVsaXZlcnkgdG8gd2FpdCBvbiBhbmQgcmVhY2hlcyBgZm5gIG9uIHRoZVxuICAgKiBmaXJzdCBwb2xsLlxuICAgKlxuICAgKiBXaGF0IHRoZSBnYXRlIGdpdmVzIHVwOiBmb3IgdGhlIG9yZGVyZWQgZXZlbnRzIHRoYXQgc3RpbGwgcmVhY2hcbiAgICogYG9uVW5jb25zdW1lZEV2ZW50YCByYXRoZXIgdGhhbiB7QGxpbmsgcGFya30sIHRoaXMgc3RvcHMgYmVpbmcgdGhlIHRoaW5nXG4gICAqIHRoYXQgY2F0Y2hlcyBhIGRpdmVyZ2VkIGxvZyB3aGlsZSBhIGRlbGl2ZXJ5IGlzIGluIGZsaWdodC4gVGhlIHN1c3BlbnNpb25cbiAgICogYW5kIHRoaXMgY2hlY2sgbm93IHdha2UgZnJvbSB0aGUgc2FtZSBgaXNEZWxpdmVyeUlkbGVgIGVkZ2UsIGFuZFxuICAgKiBgc2NoZWR1bGVXaGVuSWRsZWAgZmlyZXMgb24gdGhlIGZpcnN0IHRpbWVyIHRpY2sgYWZ0ZXIgaWRsZSB3aGlsZSB0aGlzIHdhaXRzXG4gICAqIGEgZnVydGhlciBgZ2V0RGVmZXJyZWRDaGVja0RlbGF5TXMoKWAuIFNvIGEgcnVuIHdpdGggYSBwZW5kaW5nIGBzbGVlcCgpYFxuICAgKiBzdXNwZW5kcyBmaXJzdCwgYW5kIGBvbldvcmtmbG93RXJyb3JgIGRyb3BzIHRoZSBkaXZlcmdlbmNlIGFycml2aW5nIHNlY29uZFxuICAgKiAoaXRzIGAnc3VzcGVuZGVkJ2AgYnJhbmNoIGRlbW90ZXMgdG8gYCdyZXBsYXknYCBhbmQgc3VyZmFjZXMgbm90aGluZyksXG4gICAqIGxlYXZpbmcgYSBsYXRlciBgcmVzdW1lKClgIHRvIGRlY2xpbmUgaW50byBhIGNvbGQgcmVwbGF5LiBQcmUtZ2F0ZSB0aGVcbiAgICogc3VzcGVuc2lvbiBhbHJlYWR5IHdvbiB0aGF0IHJhY2Ugd2hlbmV2ZXIgdGhlIGRlbGl2ZXJ5IGxhbmRlZCBpbnNpZGUgdGhlXG4gICAqIGZpeGVkIHdpbmRvdywgc28gd2hhdCBjaGFuZ2VkIGlzIHRoYXQgdGhlIG91dGNvbWUgc3RvcHBlZCBkZXBlbmRpbmcgb25cbiAgICogdGltaW5nLiBOb3RoaW5nIHNob3VsZCB0cmVhdCB0aGlzIGNoZWNrIGFzIHRoZSBtZWNoYW5pc20gdGhhdCByZXBvcnRzXG4gICAqIGRpdmVyZ2VuY2Ugb24gYSBsb2cgdGhlIHJ1biBpcyBzdGlsbCBkZWxpdmVyaW5nIGludG8uXG4gICAqL1xuICBwcml2YXRlIHdoZW5EZWxpdmVyeUlkbGUoY2hlY2tWZXJzaW9uOiBudW1iZXIsIGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgcG9sbCA9ICgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0RlbGl2ZXJ5SWRsZSgpKSB7XG4gICAgICAgIGZuKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0UHJvbWlzZVF1ZXVlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBIZWxkIGluIHRoZSBzYW1lIGZpZWxkIHRoZSBmaXJlZCBjaGVjayB1c2VzIHNvIHN1YnNjcmliZSgpIGNhbmNlbHMgYVxuICAgICAgICAvLyBwb2xsIGluIHByb2dyZXNzIHRvby4gVGhlIHR3byBjYW5jZWxsYXRpb25zIGFyZSBub3QgaWRlbnRpY2FsOiBmb3IgdGhlXG4gICAgICAgIC8vIHBvbGwgaXQgaXMgdGhlIHZlcnNpb24gYnVtcCB0aGF0IGRvZXMgdGhlIHdvcmsgYW5kIHRoZSBjbGVhclRpbWVvdXQgaXNcbiAgICAgICAgLy8gYmVsdC1hbmQtYnJhY2VzLiBUd28gc3RhdGUgbWFjaGluZXMgd3JpdGUgdGhpcyBvbmUgZmllbGQsIHNvIGEgcG9sbFxuICAgICAgICAvLyBpbnZhbGlkYXRlZCBiZXR3ZWVuIHNjaGVkdWxpbmcgYW5kIGZpcmluZyBjYW4gbnVsbCBvdXQgYSBoYW5kbGUgdGhlXG4gICAgICAgIC8vIGxpdmUgY2hhaW4gaGFzIHNpbmNlIHN0b3JlZCwgd2hpY2ggaXMgd2h5IGV2ZXJ5IHBhdGggb3V0IG9mIGBwb2xsYCBhbmRcbiAgICAgICAgLy8gb3V0IG9mIHRoZSBmaXJlZCBjaGVjayByZS1jaGVja3MgdGhlIHZlcnNpb24gcmF0aGVyIHRoYW4gdHJ1c3RpbmcgdGhlXG4gICAgICAgIC8vIGhhbmRsZS5cbiAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBzZXRUaW1lb3V0KHBvbGwsIDApO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBwb2xsKCk7XG4gIH1cbn1cbiJdfQ==
|
package/dist/private.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../src/private.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,MAAM,MAAM,YAAY,CACtB,IAAI,SAAS,YAAY,EAAE,GAAG,GAAG,EAAE,EACnC,MAAM,SAAS,YAAY,GAAG,OAAO,GAAG,OAAO,IAC7C,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAsEF;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,QAGxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAoBxE;AAOD,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,UAAU,GAAG,SAAS,CAAC;IACtC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B;;;;;;;;OAQG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B;;;OAGG;IACH,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzC,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACxC;;;;OAIG;IACH,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B;;;;;;OAMG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACH,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC5D;;;OAGG;IACH,kBAAkB,EAAE,kBAAkB,CAAC;CACxC;AAED,iEAAiE;AACjE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpD,UAAU,oBAAoB;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB;;;;;;;;;;OAUG;IACH,KAAK,EAAE,OAAO,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../src/private.ts"],"names":[],"mappings":"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"}
|