footprintjs 4.4.1 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -99,6 +99,8 @@ class ScopeFacade {
99
99
  notifyStageStart() {
100
100
  this._invokeHook('onStageStart', {
101
101
  stageName: this._stageName,
102
+ stageId: this._stageContext.stageId,
103
+ runtimeStageId: this._stageContext.runtimeStageId,
102
104
  pipelineId: this._stageContext.runId,
103
105
  timestamp: Date.now(),
104
106
  });
@@ -107,28 +109,32 @@ class ScopeFacade {
107
109
  notifyStageEnd(duration) {
108
110
  this._invokeHook('onStageEnd', {
109
111
  stageName: this._stageName,
112
+ stageId: this._stageContext.stageId,
113
+ runtimeStageId: this._stageContext.runtimeStageId,
110
114
  pipelineId: this._stageContext.runId,
111
115
  timestamp: Date.now(),
112
116
  duration,
113
117
  });
114
118
  }
115
119
  /** @internal */
116
- notifyPause(stageId, pauseData) {
120
+ notifyPause(pauseData) {
117
121
  this._invokeHook('onPause', {
118
122
  stageName: this._stageName,
123
+ stageId: this._stageContext.stageId,
124
+ runtimeStageId: this._stageContext.runtimeStageId,
119
125
  pipelineId: this._stageContext.runId,
120
126
  timestamp: Date.now(),
121
- stageId,
122
127
  pauseData,
123
128
  });
124
129
  }
125
130
  /** @internal */
126
- notifyResume(stageId, hasInput) {
131
+ notifyResume(hasInput) {
127
132
  this._invokeHook('onResume', {
128
133
  stageName: this._stageName,
134
+ stageId: this._stageContext.stageId,
135
+ runtimeStageId: this._stageContext.runtimeStageId,
129
136
  pipelineId: this._stageContext.runId,
130
137
  timestamp: Date.now(),
131
- stageId,
132
138
  hasInput,
133
139
  });
134
140
  }
@@ -136,6 +142,8 @@ class ScopeFacade {
136
142
  notifyCommit(mutations) {
137
143
  this._invokeHook('onCommit', {
138
144
  stageName: this._stageName,
145
+ stageId: this._stageContext.stageId,
146
+ runtimeStageId: this._stageContext.runtimeStageId,
139
147
  pipelineId: this._stageContext.runId,
140
148
  timestamp: Date.now(),
141
149
  mutations,
@@ -235,6 +243,8 @@ class ScopeFacade {
235
243
  }
236
244
  this._invokeHook('onRead', {
237
245
  stageName: this._stageName,
246
+ stageId: this._stageContext.stageId,
247
+ runtimeStageId: this._stageContext.runtimeStageId,
238
248
  pipelineId: this._stageContext.runId,
239
249
  timestamp: Date.now(),
240
250
  key,
@@ -280,6 +290,8 @@ class ScopeFacade {
280
290
  }
281
291
  this._invokeHook('onWrite', {
282
292
  stageName: this._stageName,
293
+ stageId: this._stageContext.stageId,
294
+ runtimeStageId: this._stageContext.runtimeStageId,
283
295
  pipelineId: this._stageContext.runId,
284
296
  timestamp: Date.now(),
285
297
  key,
@@ -316,6 +328,8 @@ class ScopeFacade {
316
328
  }
317
329
  this._invokeHook('onWrite', {
318
330
  stageName: this._stageName,
331
+ stageId: this._stageContext.stageId,
332
+ runtimeStageId: this._stageContext.runtimeStageId,
319
333
  pipelineId: this._stageContext.runId,
320
334
  timestamp: Date.now(),
321
335
  key,
@@ -334,6 +348,8 @@ class ScopeFacade {
334
348
  if (this._recorders.length > 0) {
335
349
  this._invokeHook('onWrite', {
336
350
  stageName: this._stageName,
351
+ stageId: this._stageContext.stageId,
352
+ runtimeStageId: this._stageContext.runtimeStageId,
337
353
  pipelineId: this._stageContext.runId,
338
354
  timestamp: Date.now(),
339
355
  key,
@@ -463,6 +479,8 @@ class ScopeFacade {
463
479
  if (hook !== 'onError') {
464
480
  this._invokeHook('onError', {
465
481
  stageName: this._stageName,
482
+ stageId: this._stageContext.stageId,
483
+ runtimeStageId: this._stageContext.runtimeStageId,
466
484
  pipelineId: this._stageContext.runId,
467
485
  timestamp: Date.now(),
468
486
  error: error,
@@ -484,4 +502,4 @@ ScopeFacade.BRAND = Symbol.for('ScopeFacade@v1');
484
502
  * 256 characters comfortably exceeds any realistic scope-state key name.
485
503
  */
486
504
  ScopeFacade._MAX_PATTERN_KEY_LEN = 256;
487
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NvcGVGYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL1Njb3BlRmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBR0gscURBQXNGO0FBRXRGLDJEQUFzRTtBQUN0RSxvRUFBb0Y7QUFHcEYsTUFBYSxXQUFXO0lBa0J0QixZQUFZLE9BQXFCLEVBQUUsU0FBaUIsRUFBRSxjQUF3QixFQUFFLFlBQTJCO1FBTG5HLGVBQVUsR0FBZSxFQUFFLENBQUM7UUFHNUIseUJBQW9CLEdBQTZCLElBQUksR0FBRyxFQUFFLENBQUM7UUFHakUsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFBLG1DQUFnQixFQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFFdkMsOEZBQThGO1FBQzlGLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxxQkFBcUIsQ0FBQyxTQUFzQjtRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFD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QUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QixJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUNoQyxNQUFtQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzdELENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUU7d0JBQzFCLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVTt3QkFDMUIsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSzt3QkFDcEMsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7d0JBQ3JCLEtBQUssRUFBRSxLQUFjO3dCQUNyQixTQUFTLEVBQUUsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU87cUJBQ2pGLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDOztBQWxoQkgsa0NBbWhCQztBQWxoQndCLGlCQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxBQUEvQixDQUFnQztBQStkNUQ7Ozs7Ozs7R0FPRztBQUNxQixnQ0FBb0IsR0FBRyxHQUFHLEFBQU4sQ0FBTyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2NvcGVGYWNhZGUg4oCUIEJhc2UgY2xhc3MgdGhhdCBsaWJyYXJ5IGNvbnN1bWVycyBleHRlbmQgdG8gY3JlYXRlIGN1c3RvbSBzY29wZSBjbGFzc2VzXG4gKlxuICogV3JhcHMgU3RhZ2VDb250ZXh0IChmcm9tIG1lbW9yeS8pIHRvIHByb3ZpZGUgYSBjb25zdW1lci1mcmllbmRseSBBUEkgZm9yXG4gKiBzdGF0ZSBhY2Nlc3MsIGRlYnVnIGxvZ2dpbmcsIG1ldHJpY3MsIGFuZCByZWNvcmRlciBob29rcy5cbiAqXG4gKiBDb25zdW1lcnMgZXh0ZW5kIHRoaXMgY2xhc3MgdG8gYWRkIGRvbWFpbi1zcGVjaWZpYyBwcm9wZXJ0aWVzOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIE15U2NvcGUgZXh0ZW5kcyBTY29wZUZhY2FkZSB7XG4gKiAgIGdldCB1c2VyTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRWYWx1ZSgnbmFtZScpIGFzIHN0cmluZzsgfVxuICogICBzZXQgdXNlck5hbWUodmFsdWU6IHN0cmluZykgeyB0aGlzLnNldFZhbHVlKCduYW1lJywgdmFsdWUpOyB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkVudiB9IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBuYXRpdmVIYXMgYXMgbG9kYXNoSGFzLCBuYXRpdmVTZXQgYXMgbG9kYXNoU2V0IH0gZnJvbSAnLi4vbWVtb3J5L3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBoYXNDaXJjdWxhclJlZmVyZW5jZSwgaXNEZXZNb2RlIH0gZnJvbSAnLi9kZXRlY3RDaXJjdWxhci5qcyc7XG5pbXBvcnQgeyBhc3NlcnROb3RSZWFkb25seSwgY3JlYXRlRnJvemVuQXJncyB9IGZyb20gJy4vcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0RXZlbnQsIFJlY29yZGVyLCBSZWRhY3Rpb25Qb2xpY3ksIFJlZGFjdGlvblJlcG9ydCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgU2NvcGVGYWNhZGUge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJSQU5EID0gU3ltYm9sLmZvcignU2NvcGVGYWNhZGVAdjEnKTtcblxuICBwcm90ZWN0ZWQgX3N0YWdlQ29udGV4dDogU3RhZ2VDb250ZXh0O1xuICBwcm90ZWN0ZWQgX3N0YWdlTmFtZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3JlYWRPbmx5VmFsdWVzPzogdW5rbm93bjtcblxuICAvKiogQ2FjaGVkIGRlZXBseS1mcm96ZW4gY29weSBvZiByZWFkT25seVZhbHVlcyBmb3IgZ2V0QXJncygpLiBDcmVhdGVkIG9uY2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Zyb3plbkFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKiBFeGVjdXRpb24gZW52aXJvbm1lbnQg4oCUIHJlYWQtb25seSwgaW5oZXJpdGVkIGZyb20gcGFyZW50IGV4ZWN1dG9yLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leGVjdXRpb25FbnY6IFJlYWRvbmx5PEV4ZWN1dGlvbkVudj47XG5cbiAgcHJpdmF0ZSBfcmVjb3JkZXJzOiBSZWNvcmRlcltdID0gW107XG4gIHByaXZhdGUgX3JlZGFjdGVkS2V5czogU2V0PHN0cmluZz47XG4gIHByaXZhdGUgX3JlZGFjdGlvblBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9yZWRhY3RlZEZpZWxkc0J5S2V5OiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IoY29udGV4dDogU3RhZ2VDb250ZXh0LCBzdGFnZU5hbWU6IHN0cmluZywgcmVhZE9ubHlWYWx1ZXM/OiB1bmtub3duLCBleGVjdXRpb25FbnY/OiBFeGVjdXRpb25FbnYpIHtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMuX3N0YWdlTmFtZSA9IHN0YWdlTmFtZTtcbiAgICB0aGlzLl9yZWFkT25seVZhbHVlcyA9IHJlYWRPbmx5VmFsdWVzO1xuICAgIHRoaXMuX2Zyb3plbkFyZ3MgPSBjcmVhdGVGcm96ZW5BcmdzKHJlYWRPbmx5VmFsdWVzKTtcbiAgICB0aGlzLl9leGVjdXRpb25FbnYgPSBPYmplY3QuZnJlZXplKHsgLi4uZXhlY3V0aW9uRW52IH0pO1xuICAgIHRoaXMuX3JlZGFjdGVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgLy8gUmVnaXN0ZXIgYXMgY29tbWl0IG9ic2VydmVyIHNvIFJlY29yZGVyLm9uQ29tbWl0IGZpcmVzIHdoZW4gU3RhZ2VDb250ZXh0LmNvbW1pdCgpIGlzIGNhbGxlZFxuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRDb21taXRPYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICB0aGlzLl9vbkNvbW1pdEZpcmVkKG11dGF0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgYSByZWRhY3RlZC1rZXlzIHNldCBhY3Jvc3MgbXVsdGlwbGUgU2NvcGVGYWNhZGUgaW5zdGFuY2VzLlxuICAgKiBDYWxsIHRoaXMgdG8gbWFrZSByZWRhY3Rpb24gcGVyc2lzdCBhY3Jvc3Mgc3RhZ2VzIGluIHRoZSBzYW1lIHBpcGVsaW5lLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVzZVNoYXJlZFJlZGFjdGVkS2V5cyhzaGFyZWRTZXQ6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5fcmVkYWN0ZWRLZXlzID0gc2hhcmVkU2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcmVkYWN0ZWQta2V5cyBzZXQgKGZvciBzaGFyaW5nIHdpdGggb3RoZXIgc2NvcGVzKS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRSZWRhY3RlZEtleXMoKTogU2V0PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9yZWRhY3RlZEtleXM7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYSBkZWNsYXJhdGl2ZSByZWRhY3Rpb24gcG9saWN5LiBUaGUgcG9saWN5IGlzIGFkZGl0aXZlIOKAlFxuICAgKiBpdCB3b3JrcyBhbG9uZ3NpZGUgbWFudWFsIGBzZXRWYWx1ZSguLi4sIHRydWUpYCBjYWxscy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICB1c2VSZWRhY3Rpb25Qb2xpY3kocG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWRhY3Rpb25Qb2xpY3kgPSBwb2xpY3k7XG4gICAgLy8gUHJlLXBvcHVsYXRlIGZpZWxkLWxldmVsIHJlZGFjdGlvbiBtYXAgZnJvbSBwb2xpY3lcbiAgICBpZiAocG9saWN5LmZpZWxkcykge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHBvbGljeS5maWVsZHMpKSB7XG4gICAgICAgIHRoaXMuX3JlZGFjdGVkRmllbGRzQnlLZXkuc2V0KGtleSwgbmV3IFNldChmaWVsZHMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJlZGFjdGlvblBvbGljeSgpOiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9yZWRhY3Rpb25Qb2xpY3k7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsaWFuY2UtZnJpZW5kbHkgcmVwb3J0IG9mIGFsbCByZWRhY3Rpb24gYWN0aXZpdHkuXG4gICAqIE5ldmVyIGluY2x1ZGVzIGFjdHVhbCB2YWx1ZXMg4oCUIG9ubHkga2V5IG5hbWVzLCBmaWVsZCBuYW1lcywgYW5kIHBhdHRlcm5zLlxuICAgKi9cbiAgZ2V0UmVkYWN0aW9uUmVwb3J0KCk6IFJlZGFjdGlvblJlcG9ydCB7XG4gICAgY29uc3QgZmllbGRSZWRhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgdGhpcy5fcmVkYWN0ZWRGaWVsZHNCeUtleSkge1xuICAgICAgZmllbGRSZWRhY3Rpb25zW2tleV0gPSBbLi4uZmllbGRzXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZGFjdGVkS2V5czogWy4uLnRoaXMuX3JlZGFjdGVkS2V5c10sXG4gICAgICBmaWVsZFJlZGFjdGlvbnMsXG4gICAgICBwYXR0ZXJuczogKHRoaXMuX3JlZGFjdGlvblBvbGljeT8ucGF0dGVybnMgPz8gW10pLm1hcCgocCkgPT4gcC5zb3VyY2UpLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIAgUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhdHRhY2hSZWNvcmRlcihyZWNvcmRlcjogUmVjb3JkZXIpOiB2b2lkIHtcbiAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBJRCAoaWRlbXBvdGVudCDigJQgcHJldmVudHMgZG91YmxlLWNvdW50aW5nKVxuICAgIHRoaXMuX3JlY29yZGVycyA9IHRoaXMuX3JlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlY29yZGVyLmlkKTtcbiAgICB0aGlzLl9yZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gIH1cblxuICBkZXRhY2hSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWNvcmRlcnMgPSB0aGlzLl9yZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlcklkKTtcbiAgfVxuXG4gIGdldFJlY29yZGVycygpOiBSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3JlY29yZGVyc107XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeVN0YWdlU3RhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25TdGFnZVN0YXJ0Jywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeVN0YWdlRW5kKGR1cmF0aW9uPzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25TdGFnZUVuZCcsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgZHVyYXRpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeVBhdXNlKHN0YWdlSWQ6IHN0cmluZywgcGF1c2VEYXRhPzogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uUGF1c2UnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIHN0YWdlSWQsXG4gICAgICBwYXVzZURhdGEsXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeVJlc3VtZShzdGFnZUlkOiBzdHJpbmcsIGhhc0lucHV0OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25SZXN1bWUnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIHN0YWdlSWQsXG4gICAgICBoYXNJbnB1dCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5Q29tbWl0KG11dGF0aW9uczogQ29tbWl0RXZlbnRbJ211dGF0aW9ucyddKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25Db21taXQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG11dGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgYnkgU3RhZ2VDb250ZXh0LmNvbW1pdCgpIG9ic2VydmVyLiBDb252ZXJ0cyB0cmFja2VkIHdyaXRlcyB0byBDb21taXRFdmVudCBmb3JtYXQuXG4gICAqICBFcnJvcnMgYXJlIGNhdWdodCB0byBwcmV2ZW50IHJlY29yZGVyIGlzc3VlcyBmcm9tIGFib3J0aW5nIHRoZSB0cmF2ZXJzYWwuICovXG4gIHByaXZhdGUgX29uQ29tbWl0RmlyZWQobXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9Pik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29tbWl0TXV0YXRpb25zOiBDb21taXRFdmVudFsnbXV0YXRpb25zJ10gPSBPYmplY3QuZW50cmllcyhtdXRhdGlvbnMpLm1hcCgoW2tleSwgZW50cnldKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzUmVkYWN0ZWQgPSB0aGlzLl9pc0tleVJlZGFjdGVkKGtleSkgfHwgdGhpcy5faXNQb2xpY3lSZWRhY3RlZChrZXkpO1xuICAgICAgICBjb25zdCBmaWVsZFNldCA9IHRoaXMuX3JlZGFjdGVkRmllbGRzQnlLZXkuZ2V0KGtleSk7XG5cbiAgICAgICAgbGV0IHJlY29yZGVyVmFsdWU6IHVua25vd247XG4gICAgICAgIGlmIChpc1JlZGFjdGVkKSB7XG4gICAgICAgICAgcmVjb3JkZXJWYWx1ZSA9ICdbUkVEQUNURURdJztcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZFNldCAmJiBlbnRyeS52YWx1ZSAmJiB0eXBlb2YgZW50cnkudmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgcmVjb3JkZXJWYWx1ZSA9IHRoaXMuX3NjcnViRmllbGRzKGVudHJ5LnZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBmaWVsZFNldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjb3JkZXJWYWx1ZSA9IGVudHJ5LnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgdmFsdWU6IHJlY29yZGVyVmFsdWUsXG4gICAgICAgICAgb3BlcmF0aW9uOiBlbnRyeS5vcGVyYXRpb24sXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ub3RpZnlDb21taXQoY29tbWl0TXV0YXRpb25zKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFN3YWxsb3cg4oCUIHJlY29yZGVyIGVycm9ycyBtdXN0IG5vdCBhYm9ydCB0aGUgdHJhdmVyc2FsLlxuICAgICAgLy8gSW5kaXZpZHVhbCByZWNvcmRlciBlcnJvcnMgYXJlIGFscmVhZHkgaXNvbGF0ZWQgYnkgX2ludm9rZUhvb2suXG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIERlYnVnIC8gRGlhZ25vc3RpY3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYWRkRGVidWdJbmZvKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5hZGRMb2coa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBhZGREZWJ1Z01lc3NhZ2UodmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuYWRkTG9nKCdtZXNzYWdlcycsIFt2YWx1ZV0pO1xuICB9XG5cbiAgYWRkRXJyb3JJbmZvKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5hZGRFcnJvcihrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGFkZE1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LmFkZE1ldHJpYyhtZXRyaWNOYW1lLCB2YWx1ZSk7XG4gIH1cblxuICBhZGRFdmFsKG1ldHJpY05hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuYWRkRXZhbChtZXRyaWNOYW1lLCB2YWx1ZSk7XG4gIH1cblxuICAvLyDilIDilIAgTm9uLVRyYWNraW5nIFN0YXRlIEluc3BlY3Rpb24gKGZvciBUeXBlZFNjb3BlIHByb3h5IGludGVybmFscykg4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFJldHVybnMgYWxsIHN0YXRlIGtleXMgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IFR5cGVkU2NvcGUgb3duS2V5cy9oYXMgdHJhcHMuICovXG4gIGdldFN0YXRlS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIHVuZGVmaW5lZCk7XG4gICAgaWYgKCFzbmFwc2hvdCB8fCB0eXBlb2Ygc25hcHNob3QgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNuYXBzaG90IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgfVxuXG4gIC8qKiBDaGVjayBrZXkgZXhpc3RlbmNlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBUeXBlZFNjb3BlIGhhcyB0cmFwLlxuICAgKiAgQ29udHJhY3Q6IHJldHVybnMgZmFsc2UgZm9yIGtleXMgbmV2ZXIgc2V0IE9SIGtleXMgc2V0IHRvIHVuZGVmaW5lZC5cbiAgICogIFRoaXMgbWF0Y2hlcyBkZWxldGVWYWx1ZSgpIHNlbWFudGljcyAoc2V0cyB0byB1bmRlZmluZWQgPSBkZWxldGVkKS4gKi9cbiAgaGFzS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZShbXSwga2V5KSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IGFycmF5IHByb3h5IGdldEN1cnJlbnQoKSB0byBhdm9pZFxuICAgKiAgcGhhbnRvbSByZWFkcyBvbiBpbnRlcm5hbCBhcnJheSBvcGVyYXRpb25zICgubGVuZ3RoLCAuaGFzLCBpdGVyYXRpb24sIGV0Yy4pLlxuICAgKiAgVGhlIGluaXRpYWwgcHJvcGVydHkgYWNjZXNzIGZpcmVzIG9uZSB0cmFja2VkIG9uUmVhZCB2aWEgZ2V0VmFsdWUoKTsgc3Vic2VxdWVudFxuICAgKiAgaW50ZXJuYWwgYXJyYXkgb3BlcmF0aW9ucyB1c2UgdGhpcyBtZXRob2QgdG8gc3RheSBzaWxlbnQuXG4gICAqICBOT1RFOiBMaWtlIGdldFZhbHVlKCksIHJldHVybnMgdGhlIHJhdyB2YWx1ZSB0byB0aGUgY2FsbGVyLiBSZWRhY3Rpb24gYXBwbGllc1xuICAgKiAgb25seSB0byByZWNvcmRlciBkaXNwYXRjaCDigJQgaXQgZG9lcyBub3QgZmlsdGVyIHRoZSByZXR1cm5lZCB2YWx1ZS4gVGhpcyBtYXRjaGVzXG4gICAqICB0aGUgZXhpc3RpbmcgZ2V0VmFsdWUoKSBjb250cmFjdCB3aGVyZSB1c2VyIGNvZGUgYWx3YXlzIHJlY2VpdmVzIHJhdyBkYXRhLiAqL1xuICBnZXRWYWx1ZVNpbGVudChrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LmdldFZhbHVlRGlyZWN0KFtdLCBrZXkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFN0YXRlIEFjY2VzcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXRJbml0aWFsVmFsdWVGb3Ioa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LmdldEdsb2JhbD8uKGtleSk7XG4gIH1cblxuICBnZXRWYWx1ZShrZXk/OiBzdHJpbmcpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZShbXSwga2V5KTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaXNSZWRhY3RlZCA9IGtleSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX2lzS2V5UmVkYWN0ZWQoa2V5KTtcbiAgICAgIGNvbnN0IGZpZWxkU2V0ID0ga2V5ICE9PSB1bmRlZmluZWQgPyB0aGlzLl9yZWRhY3RlZEZpZWxkc0J5S2V5LmdldChrZXkpIDogdW5kZWZpbmVkO1xuXG4gICAgICBsZXQgcmVjb3JkZXJWYWx1ZTogdW5rbm93bjtcbiAgICAgIGlmIChpc1JlZGFjdGVkKSB7XG4gICAgICAgIHJlY29yZGVyVmFsdWUgPSAnW1JFREFDVEVEXSc7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkU2V0ICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmVjb3JkZXJWYWx1ZSA9IHRoaXMuX3NjcnViRmllbGRzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBmaWVsZFNldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWNvcmRlclZhbHVlID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uUmVhZCcsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiByZWNvcmRlclZhbHVlLFxuICAgICAgICByZWRhY3RlZDogaXNSZWRhY3RlZCB8fCBmaWVsZFNldCAhPT0gdW5kZWZpbmVkIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHNldFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBhc3NlcnROb3RSZWFkb25seSh0aGlzLl9yZWFkT25seVZhbHVlcywga2V5LCAnd3JpdGUnKTtcblxuICAgIC8vIERldi1tb2RlOiB3YXJuIGlmIHRoZSB2YWx1ZSBjb250YWlucyBjaXJjdWxhciByZWZlcmVuY2VzLlxuICAgIC8vIENoZWNrIEFGVEVSIGFzc2VydE5vdFJlYWRvbmx5IOKAlCBkb24ndCB3YXJuIGZvciB3cml0ZXMgdGhhdCB3aWxsIGJlIGJsb2NrZWQuXG4gICAgLy8gQ2lyY3VsYXIgdmFsdWVzIHdvcmsgKHRlcm1pbmFsIHByb3h5IGhhbmRsZXMgdGhlbSkgYnV0IGNhbiBwcm9kdWNlXG4gICAgLy8gc3VycHJpc2luZyBiZWhhdmlvciBpbiBuYXJyYXRpdmUsIEpTT04gc2VyaWFsaXphdGlvbiwgYW5kIHNuYXBzaG90cy5cbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKGhhc0NpcmN1bGFyUmVmZXJlbmNlKHZhbHVlKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtmb290cHJpbnRdIENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiBzZXRWYWx1ZSgnJHtrZXl9JykuIGAgK1xuICAgICAgICAgICAgJ1dyaXRlcyBwYXN0IHRoZSBjeWNsZSBkZXB0aCB3aWxsIHVzZSB0ZXJtaW5hbCBwcm94eSB0cmFja2luZy4gJyArXG4gICAgICAgICAgICAnQ29uc2lkZXIgZmxhdHRlbmluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBdXRvLXJlZGFjdCBpZiBrZXkgbWF0Y2hlcyBwb2xpY3kgKGV4YWN0IGtleXMgb3IgcGF0dGVybnMpLCBvciBpZiB0aGUga2V5IHdhc1xuICAgIC8vIHByZXZpb3VzbHkgbWFya2VkIHJlZGFjdGVkIChlLmcuIGNhcnJpZWQgb3ZlciBmcm9tIGEgc3ViZmxvdyB2aWEgb3V0cHV0TWFwcGVyKS5cbiAgICBjb25zdCBlZmZlY3RpdmVSZWRhY3QgPSBzaG91bGRSZWRhY3QgfHwgdGhpcy5faXNQb2xpY3lSZWRhY3RlZChrZXkpIHx8IHRoaXMuX3JlZGFjdGVkS2V5cy5oYXMoa2V5KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5zZXRPYmplY3QoW10sIGtleSwgdmFsdWUsIGVmZmVjdGl2ZVJlZGFjdCwgZGVzY3JpcHRpb24pO1xuXG4gICAgaWYgKGVmZmVjdGl2ZVJlZGFjdCkge1xuICAgICAgdGhpcy5fcmVkYWN0ZWRLZXlzLmFkZChrZXkpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBmaWVsZC1sZXZlbCByZWRhY3Rpb24gZnJvbSBwb2xpY3lcbiAgICBjb25zdCBmaWVsZFNldCA9IHRoaXMuX3JlZGFjdGVkRmllbGRzQnlLZXkuZ2V0KGtleSk7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCByZWNvcmRlclZhbHVlOiB1bmtub3duO1xuICAgICAgaWYgKGVmZmVjdGl2ZVJlZGFjdCkge1xuICAgICAgICByZWNvcmRlclZhbHVlID0gJ1tSRURBQ1RFRF0nO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFNldCAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJlY29yZGVyVmFsdWUgPSB0aGlzLl9zY3J1YkZpZWxkcyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZmllbGRTZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVjb3JkZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvbldyaXRlJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHJlY29yZGVyVmFsdWUsXG4gICAgICAgIG9wZXJhdGlvbjogJ3NldCcsXG4gICAgICAgIHJlZGFjdGVkOiBlZmZlY3RpdmVSZWRhY3QgfHwgZmllbGRTZXQgIT09IHVuZGVmaW5lZCB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdXBkYXRlVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGFzc2VydE5vdFJlYWRvbmx5KHRoaXMuX3JlYWRPbmx5VmFsdWVzLCBrZXksICd3cml0ZScpO1xuXG4gICAgLy8gRGV2LW1vZGU6IHNhbWUgY2lyY3VsYXIgY2hlY2sgYXMgc2V0VmFsdWUgKG1lcmdlIHRhcmdldHMgY2FuIGJlIGNpcmN1bGFyIHRvbylcbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKGhhc0NpcmN1bGFyUmVmZXJlbmNlKHZhbHVlKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtmb290cHJpbnRdIENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiB1cGRhdGVWYWx1ZSgnJHtrZXl9JykuIGAgK1xuICAgICAgICAgICAgJ0NvbnNpZGVyIGZsYXR0ZW5pbmcgdGhlIGRhdGEgc3RydWN0dXJlLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNSZWRhY3RlZCA9IHRoaXMuX2lzS2V5UmVkYWN0ZWQoa2V5KSB8fCB0aGlzLl9pc1BvbGljeVJlZGFjdGVkKGtleSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnVwZGF0ZU9iamVjdChbXSwga2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24sIGlzUmVkYWN0ZWQpO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWVsZFNldCA9IHRoaXMuX3JlZGFjdGVkRmllbGRzQnlLZXkuZ2V0KGtleSk7XG5cbiAgICAgIGxldCByZWNvcmRlclZhbHVlOiB1bmtub3duO1xuICAgICAgaWYgKGlzUmVkYWN0ZWQpIHtcbiAgICAgICAgcmVjb3JkZXJWYWx1ZSA9ICdbUkVEQUNURURdJztcbiAgICAgIH0gZWxzZSBpZiAoZmllbGRTZXQgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZWNvcmRlclZhbHVlID0gdGhpcy5fc2NydWJGaWVsZHModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGZpZWxkU2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY29yZGVyVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25Xcml0ZScsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiByZWNvcmRlclZhbHVlLFxuICAgICAgICBvcGVyYXRpb246ICd1cGRhdGUnLFxuICAgICAgICByZWRhY3RlZDogaXNSZWRhY3RlZCB8fCBmaWVsZFNldCAhPT0gdW5kZWZpbmVkIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBkZWxldGVWYWx1ZShrZXk6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBhc3NlcnROb3RSZWFkb25seSh0aGlzLl9yZWFkT25seVZhbHVlcywga2V5LCAnZGVsZXRlJyk7XG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9zdGFnZUNvbnRleHQuc2V0T2JqZWN0KFtdLCBrZXksIHVuZGVmaW5lZCwgZmFsc2UsIGRlc2NyaXB0aW9uID8/IGBkZWxldGVkICR7a2V5fWAsICdkZWxldGUnKTtcblxuICAgIC8vIERlbGV0aW5nIGEgcmVkYWN0ZWQga2V5IGNsZWFycyBpdHMgcmVkYWN0aW9uIHN0YXR1c1xuICAgIHRoaXMuX3JlZGFjdGVkS2V5cy5kZWxldGUoa2V5KTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25Xcml0ZScsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIG9wZXJhdGlvbjogJ2RlbGV0ZScsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRHbG9iYWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuc2V0R2xvYmFsPy4oa2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRHbG9iYWwoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LmdldEdsb2JhbD8uKGtleSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldE9iamVjdEluUm9vdChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LnNldFJvb3Q/LihrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkLW9ubHkgKyBtaXNjIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZWFkb25seSBpbnB1dCB2YWx1ZXMgcGFzc2VkIHRvIHRoaXMgcGlwZWxpbmUsIGNhc3QgdG8gYFRgLlxuICAgKiBUaGUgcmV0dXJuZWQgb2JqZWN0IGlzIGRlZXBseSBmcm96ZW4g4oCUIGFueSBhdHRlbXB0IHRvIG11dGF0ZSBpdCB0aHJvd3MuXG4gICAqIENhY2hlZCBhdCBjb25zdHJ1Y3Rpb24gdGltZSBmb3IgemVyby1hbGxvY2F0aW9uIHJlcGVhdGVkIGFjY2Vzcy5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB7IGFwcGxpY2FudE5hbWUsIGluY29tZSB9ID0gc2NvcGUuZ2V0QXJnczx7IGFwcGxpY2FudE5hbWU6IHN0cmluZzsgaW5jb21lOiBudW1iZXIgfT4oKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRBcmdzPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zyb3plbkFyZ3MgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQg4oCUIHJlYWQtb25seSBpbmZyYXN0cnVjdHVyZSB2YWx1ZXNcbiAgICogdGhhdCBwcm9wYWdhdGUgdGhyb3VnaCBuZXN0ZWQgZXhlY3V0b3JzIChsaWtlIGBwcm9jZXNzLmVudmAgZm9yIGZsb3djaGFydHMpLlxuICAgKlxuICAgKiBDb250YWluczogc2lnbmFsIChhYm9ydCksIHRpbWVvdXRNcywgdHJhY2VJZC5cbiAgICogRnJvemVuIGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBJbmhlcml0ZWQgYnkgc3ViZmxvd3MgYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB7IHNpZ25hbCwgdHJhY2VJZCB9ID0gc2NvcGUuZ2V0RW52KCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0RW52KCk6IFJlYWRvbmx5PEV4ZWN1dGlvbkVudj4ge1xuICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25FbnY7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFBpcGVsaW5lSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbnRlcm5hbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQ2hlY2tzIGlmIGEga2V5IGlzIHJlZGFjdGVkIChleHBsaWNpdCBfcmVkYWN0ZWRLZXlzIHNldCkuICovXG4gIHByaXZhdGUgX2lzS2V5UmVkYWN0ZWQoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVkYWN0ZWRLZXlzLmhhcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGtleSBzaG91bGQgYmUgYXV0by1yZWRhY3RlZCBieSB0aGUgcG9saWN5IChleGFjdCBrZXlzICsgcGF0dGVybnMpLlxuICAgKlxuICAgKiBSZURvUyBndWFyZDogcGF0dGVybiB0ZXN0aW5nIGlzIGNhcHBlZCBhdCBNQVhfUEFUVEVSTl9LRVlfTEVOIGNoYXJhY3RlcnMuXG4gICAqIFNjb3BlIHN0YXRlIGtleXMgYXJlIGFsd2F5cyBzaG9ydCBpZGVudGlmaWVyczsgYW55IGtleSBleGNlZWRpbmcgdGhlIGNhcFxuICAgKiBpcyBhbG1vc3QgY2VydGFpbmx5IG5vdCBhIGxlZ2l0aW1hdGUgc2NvcGUga2V5LCBzbyBza2lwcGluZyBwYXR0ZXJuIG1hdGNoaW5nXG4gICAqIGZvciBpdCBkb2VzIG5vdCByaXNrIGxlYWtpbmcgUElJLiBFeGFjdC1rZXkgbWF0Y2hpbmcgKEFycmF5LmluY2x1ZGVzKSBpc1xuICAgKiBzdGlsbCBhcHBsaWVkIHJlZ2FyZGxlc3Mgb2YgbGVuZ3RoIGFuZCBpcyBub3QgdnVsbmVyYWJsZSB0byBSZURvUy5cbiAgICovXG4gIHByaXZhdGUgX2lzUG9saWN5UmVkYWN0ZWQoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX3JlZGFjdGlvblBvbGljeSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9yZWRhY3Rpb25Qb2xpY3kua2V5cz8uaW5jbHVkZXMoa2V5KSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuX3JlZGFjdGlvblBvbGljeS5wYXR0ZXJucykge1xuICAgICAgaWYgKGtleS5sZW5ndGggPiBTY29wZUZhY2FkZS5fTUFYX1BBVFRFUk5fS0VZX0xFTikge1xuICAgICAgICAvLyBEZXYtbW9kZSB3YXJuaW5nOiBwYXR0ZXJuIG1hdGNoaW5nIHdhcyBzaWxlbnRseSBza2lwcGVkIGZvciB0aGlzIGtleS5cbiAgICAgICAgLy8gVXNlIHBvbGljeS5rZXlzIGZvciBleGFjdCBtYXRjaGluZyBvZiBsb25nIGtleSBuYW1lcy5cbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgW2Zvb3RwcmludF0gUmVkYWN0aW9uUG9saWN5OiBrZXkgJyR7a2V5LnNsaWNlKDAsIDQwKX0uLi4nICgke2tleS5sZW5ndGh9IGNoYXJzKSBleGNlZWRzIGAgK1xuICAgICAgICAgICAgICAndGhlIHBhdHRlcm4tbWF0Y2hpbmcgbGVuZ3RoIGNhcCBhbmQgd2FzIHNraXBwZWQuICcgK1xuICAgICAgICAgICAgICAnVXNlIHBvbGljeS5rZXlzIGZvciBleGFjdCBtYXRjaGluZyBvZiBsb25nIGtleSBuYW1lcy4nLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLl9yZWRhY3Rpb25Qb2xpY3kucGF0dGVybnMpIHtcbiAgICAgICAgICBwLmxhc3RJbmRleCA9IDA7IC8vIFJlc2V0IHN0YXRlZnVsIGdsb2JhbC9zdGlja3kgcmVnZXhlc1xuICAgICAgICAgIGlmIChwLnRlc3Qoa2V5KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heGltdW0ga2V5IGxlbmd0aCAoY2hhcmFjdGVycykgdGhhdCB3aWxsIGJlIHRlc3RlZCBhZ2FpbnN0IHJlZ2V4IHJlZGFjdGlvblxuICAgKiBwYXR0ZXJucy4gS2V5cyBsb25nZXIgdGhhbiB0aGlzIGFyZSBza2lwcGVkIGZvciBwYXR0ZXJuIG1hdGNoaW5nIHRvIHByZXZlbnRcbiAgICogUmVEb1M6IGEgcGF0aG9sb2dpY2FsIHJlZ2V4IHRlc3RlZCBhZ2FpbnN0IGFuIHVuYm91bmRlZGx5IGxvbmcga2V5IHN0cmluZ1xuICAgKiBjYW4gY2F1c2UgY2F0YXN0cm9waGljIGJhY2t0cmFja2luZy5cbiAgICpcbiAgICogMjU2IGNoYXJhY3RlcnMgY29tZm9ydGFibHkgZXhjZWVkcyBhbnkgcmVhbGlzdGljIHNjb3BlLXN0YXRlIGtleSBuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgX01BWF9QQVRURVJOX0tFWV9MRU4gPSAyNTY7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkZWVwLWNsb25lZCBjb3B5IHdpdGggc3BlY2lmaWVkIGZpZWxkcyByZXBsYWNlZCBieSAnW1JFREFDVEVEXScuXG4gICAqIFN1cHBvcnRzIGRvdC1ub3RhdGlvbiBwYXRocyAoZS5nLiAnYWRkcmVzcy56aXAnKSBmb3IgbmVzdGVkIG9iamVjdHMuXG4gICAqL1xuICBwcml2YXRlIF9zY3J1YkZpZWxkcyhvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBmaWVsZHM6IFNldDxzdHJpbmc+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IGNvcHkgPSBzdHJ1Y3R1cmVkQ2xvbmUob2JqKTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKCcuJykgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb3B5LCBmaWVsZCkpIHtcbiAgICAgICAgLy8gRG90LW5vdGF0aW9uIHBhdGgg4oaSIGRlZXAgc2NydWIgKG9ubHkgaWYgbm90IGEgbGl0ZXJhbCBmbGF0IGtleSlcbiAgICAgICAgaWYgKGxvZGFzaEhhcyhjb3B5LCBmaWVsZCkpIHtcbiAgICAgICAgICBsb2Rhc2hTZXQoY29weSwgZmllbGQsICdbUkVEQUNURURdJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29weSwgZmllbGQpKSB7XG4gICAgICAgICAgY29weVtmaWVsZF0gPSAnW1JFREFDVEVEXSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvcHk7XG4gIH1cblxuICBwcml2YXRlIF9pbnZva2VIb29rKGhvb2s6IGtleW9mIE9taXQ8UmVjb3JkZXIsICdpZCc+LCBldmVudDogdW5rbm93bik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcmVjb3JkZXIgb2YgdGhpcy5fcmVjb3JkZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBob29rRm4gPSByZWNvcmRlcltob29rXTtcbiAgICAgICAgaWYgKHR5cGVvZiBob29rRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAoaG9va0ZuIGFzIChldmVudDogdW5rbm93bikgPT4gdm9pZCkuY2FsbChyZWNvcmRlciwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaG9vayAhPT0gJ29uRXJyb3InKSB7XG4gICAgICAgICAgdGhpcy5faW52b2tlSG9vaygnb25FcnJvcicsIHtcbiAgICAgICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGFzIEVycm9yLFxuICAgICAgICAgICAgb3BlcmF0aW9uOiBob29rID09PSAnb25SZWFkJyA/ICdyZWFkJyA6IGhvb2sgPT09ICdvbkNvbW1pdCcgPyAnY29tbWl0JyA6ICd3cml0ZScsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
505
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NvcGVGYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL1Njb3BlRmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBR0gscURBQXNGO0FBRXRGLDJEQUFzRTtBQUN0RSxvRUFBb0Y7QUFHcEYsTUFBYSxXQUFXO0lBa0J0QixZQUFZLE9BQXFCLEVBQUUsU0FBaUIsRUFBRSxjQUF3QixFQUFFLFlBQTJCO1FBTG5HLGVBQVUsR0FBZSxFQUFFLENBQUM7UUFHNUIseUJBQW9CLEdBQTZCLElBQUksR0FBRyxFQUFFLENBQUM7UUFHakUsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFBLG1DQUFnQixFQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFFdkMsOEZBQThGO1FBQzlGLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxxQkFBcUIsQ0FBQyxTQUFzQjtRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFD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QUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFO3dCQUMxQixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7d0JBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU87d0JBQ25DLGNBQWMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWM7d0JBQ2pELFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUs7d0JBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO3dCQUNyQixLQUFLLEVBQUUsS0FBYzt3QkFDckIsU0FBUyxFQUFFLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPO3FCQUNqRixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzs7QUFwaUJILGtDQXFpQkM7QUFwaUJ3QixpQkFBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQUFBL0IsQ0FBZ0M7QUErZTVEOzs7Ozs7O0dBT0c7QUFDcUIsZ0NBQW9CLEdBQUcsR0FBRyxBQUFOLENBQU8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNjb3BlRmFjYWRlIOKAlCBCYXNlIGNsYXNzIHRoYXQgbGlicmFyeSBjb25zdW1lcnMgZXh0ZW5kIHRvIGNyZWF0ZSBjdXN0b20gc2NvcGUgY2xhc3Nlc1xuICpcbiAqIFdyYXBzIFN0YWdlQ29udGV4dCAoZnJvbSBtZW1vcnkvKSB0byBwcm92aWRlIGEgY29uc3VtZXItZnJpZW5kbHkgQVBJIGZvclxuICogc3RhdGUgYWNjZXNzLCBkZWJ1ZyBsb2dnaW5nLCBtZXRyaWNzLCBhbmQgcmVjb3JkZXIgaG9va3MuXG4gKlxuICogQ29uc3VtZXJzIGV4dGVuZCB0aGlzIGNsYXNzIHRvIGFkZCBkb21haW4tc3BlY2lmaWMgcHJvcGVydGllczpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBNeVNjb3BlIGV4dGVuZHMgU2NvcGVGYWNhZGUge1xuICogICBnZXQgdXNlck5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoJ25hbWUnKSBhcyBzdHJpbmc7IH1cbiAqICAgc2V0IHVzZXJOYW1lKHZhbHVlOiBzdHJpbmcpIHsgdGhpcy5zZXRWYWx1ZSgnbmFtZScsIHZhbHVlKTsgfVxuICogfVxuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25FbnYgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgbmF0aXZlSGFzIGFzIGxvZGFzaEhhcywgbmF0aXZlU2V0IGFzIGxvZGFzaFNldCB9IGZyb20gJy4uL21lbW9yeS9wYXRoT3BzLmpzJztcbmltcG9ydCB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaGFzQ2lyY3VsYXJSZWZlcmVuY2UsIGlzRGV2TW9kZSB9IGZyb20gJy4vZGV0ZWN0Q2lyY3VsYXIuanMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90UmVhZG9ubHksIGNyZWF0ZUZyb3plbkFyZ3MgfSBmcm9tICcuL3Byb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEV2ZW50LCBSZWNvcmRlciwgUmVkYWN0aW9uUG9saWN5LCBSZWRhY3Rpb25SZXBvcnQgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIFNjb3BlRmFjYWRlIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBCUkFORCA9IFN5bWJvbC5mb3IoJ1Njb3BlRmFjYWRlQHYxJyk7XG5cbiAgcHJvdGVjdGVkIF9zdGFnZUNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcHJvdGVjdGVkIF9zdGFnZU5hbWU6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9yZWFkT25seVZhbHVlcz86IHVua25vd247XG5cbiAgLyoqIENhY2hlZCBkZWVwbHktZnJvemVuIGNvcHkgb2YgcmVhZE9ubHlWYWx1ZXMgZm9yIGdldEFyZ3MoKS4gQ3JlYXRlZCBvbmNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9mcm96ZW5BcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKiogRXhlY3V0aW9uIGVudmlyb25tZW50IOKAlCByZWFkLW9ubHksIGluaGVyaXRlZCBmcm9tIHBhcmVudCBleGVjdXRvci4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZXhlY3V0aW9uRW52OiBSZWFkb25seTxFeGVjdXRpb25FbnY+O1xuXG4gIHByaXZhdGUgX3JlY29yZGVyczogUmVjb3JkZXJbXSA9IFtdO1xuICBwcml2YXRlIF9yZWRhY3RlZEtleXM6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIF9yZWRhY3Rpb25Qb2xpY3k6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfcmVkYWN0ZWRGaWVsZHNCeUtleTogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQ6IFN0YWdlQ29udGV4dCwgc3RhZ2VOYW1lOiBzdHJpbmcsIHJlYWRPbmx5VmFsdWVzPzogdW5rbm93biwgZXhlY3V0aW9uRW52PzogRXhlY3V0aW9uRW52KSB7XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLl9zdGFnZU5hbWUgPSBzdGFnZU5hbWU7XG4gICAgdGhpcy5fcmVhZE9ubHlWYWx1ZXMgPSByZWFkT25seVZhbHVlcztcbiAgICB0aGlzLl9mcm96ZW5BcmdzID0gY3JlYXRlRnJvemVuQXJncyhyZWFkT25seVZhbHVlcyk7XG4gICAgdGhpcy5fZXhlY3V0aW9uRW52ID0gT2JqZWN0LmZyZWV6ZSh7IC4uLmV4ZWN1dGlvbkVudiB9KTtcbiAgICB0aGlzLl9yZWRhY3RlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIC8vIFJlZ2lzdGVyIGFzIGNvbW1pdCBvYnNlcnZlciBzbyBSZWNvcmRlci5vbkNvbW1pdCBmaXJlcyB3aGVuIFN0YWdlQ29udGV4dC5jb21taXQoKSBpcyBjYWxsZWRcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuc2V0Q29tbWl0T2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgdGhpcy5fb25Db21taXRGaXJlZChtdXRhdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIGEgcmVkYWN0ZWQta2V5cyBzZXQgYWNyb3NzIG11bHRpcGxlIFNjb3BlRmFjYWRlIGluc3RhbmNlcy5cbiAgICogQ2FsbCB0aGlzIHRvIG1ha2UgcmVkYWN0aW9uIHBlcnNpc3QgYWNyb3NzIHN0YWdlcyBpbiB0aGUgc2FtZSBwaXBlbGluZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICB1c2VTaGFyZWRSZWRhY3RlZEtleXMoc2hhcmVkU2V0OiBTZXQ8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMuX3JlZGFjdGVkS2V5cyA9IHNoYXJlZFNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlZGFjdGVkLWtleXMgc2V0IChmb3Igc2hhcmluZyB3aXRoIG90aGVyIHNjb3BlcykuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0UmVkYWN0ZWRLZXlzKCk6IFNldDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVkYWN0ZWRLZXlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGEgZGVjbGFyYXRpdmUgcmVkYWN0aW9uIHBvbGljeS4gVGhlIHBvbGljeSBpcyBhZGRpdGl2ZSDigJRcbiAgICogaXQgd29ya3MgYWxvbmdzaWRlIG1hbnVhbCBgc2V0VmFsdWUoLi4uLCB0cnVlKWAgY2FsbHMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdXNlUmVkYWN0aW9uUG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5fcmVkYWN0aW9uUG9saWN5ID0gcG9saWN5O1xuICAgIC8vIFByZS1wb3B1bGF0ZSBmaWVsZC1sZXZlbCByZWRhY3Rpb24gbWFwIGZyb20gcG9saWN5XG4gICAgaWYgKHBvbGljeS5maWVsZHMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiBPYmplY3QuZW50cmllcyhwb2xpY3kuZmllbGRzKSkge1xuICAgICAgICB0aGlzLl9yZWRhY3RlZEZpZWxkc0J5S2V5LnNldChrZXksIG5ldyBTZXQoZmllbGRzKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSZWRhY3Rpb25Qb2xpY3koKTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcmVkYWN0aW9uUG9saWN5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGlhbmNlLWZyaWVuZGx5IHJlcG9ydCBvZiBhbGwgcmVkYWN0aW9uIGFjdGl2aXR5LlxuICAgKiBOZXZlciBpbmNsdWRlcyBhY3R1YWwgdmFsdWVzIOKAlCBvbmx5IGtleSBuYW1lcywgZmllbGQgbmFtZXMsIGFuZCBwYXR0ZXJucy5cbiAgICovXG4gIGdldFJlZGFjdGlvblJlcG9ydCgpOiBSZWRhY3Rpb25SZXBvcnQge1xuICAgIGNvbnN0IGZpZWxkUmVkYWN0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIHRoaXMuX3JlZGFjdGVkRmllbGRzQnlLZXkpIHtcbiAgICAgIGZpZWxkUmVkYWN0aW9uc1trZXldID0gWy4uLmZpZWxkc107XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZWRhY3RlZEtleXM6IFsuLi50aGlzLl9yZWRhY3RlZEtleXNdLFxuICAgICAgZmllbGRSZWRhY3Rpb25zLFxuICAgICAgcGF0dGVybnM6ICh0aGlzLl9yZWRhY3Rpb25Qb2xpY3k/LnBhdHRlcm5zID8/IFtdKS5tYXAoKHApID0+IHAuc291cmNlKSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXR0YWNoUmVjb3JkZXIocmVjb3JkZXI6IFJlY29yZGVyKTogdm9pZCB7XG4gICAgLy8gUmVwbGFjZSBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgSUQgKGlkZW1wb3RlbnQg4oCUIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZylcbiAgICB0aGlzLl9yZWNvcmRlcnMgPSB0aGlzLl9yZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlci5pZCk7XG4gICAgdGhpcy5fcmVjb3JkZXJzLnB1c2gocmVjb3JkZXIpO1xuICB9XG5cbiAgZGV0YWNoUmVjb3JkZXIocmVjb3JkZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fcmVjb3JkZXJzID0gdGhpcy5fcmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXJJZCk7XG4gIH1cblxuICBnZXRSZWNvcmRlcnMoKTogUmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9yZWNvcmRlcnNdO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlTdGFnZVN0YXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uU3RhZ2VTdGFydCcsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlTdGFnZUVuZChkdXJhdGlvbj86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uU3RhZ2VFbmQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlQYXVzZShwYXVzZURhdGE/OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25QYXVzZScsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgcGF1c2VEYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlSZXN1bWUoaGFzSW5wdXQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvblJlc3VtZScsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgaGFzSW5wdXQsXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeUNvbW1pdChtdXRhdGlvbnM6IENvbW1pdEV2ZW50WydtdXRhdGlvbnMnXSk6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uQ29tbWl0Jywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBtdXRhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogQ2FsbGVkIGJ5IFN0YWdlQ29udGV4dC5jb21taXQoKSBvYnNlcnZlci4gQ29udmVydHMgdHJhY2tlZCB3cml0ZXMgdG8gQ29tbWl0RXZlbnQgZm9ybWF0LlxuICAgKiAgRXJyb3JzIGFyZSBjYXVnaHQgdG8gcHJldmVudCByZWNvcmRlciBpc3N1ZXMgZnJvbSBhYm9ydGluZyB0aGUgdHJhdmVyc2FsLiAqL1xuICBwcml2YXRlIF9vbkNvbW1pdEZpcmVkKG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbW1pdE11dGF0aW9uczogQ29tbWl0RXZlbnRbJ211dGF0aW9ucyddID0gT2JqZWN0LmVudHJpZXMobXV0YXRpb25zKS5tYXAoKFtrZXksIGVudHJ5XSkgPT4ge1xuICAgICAgICBjb25zdCBpc1JlZGFjdGVkID0gdGhpcy5faXNLZXlSZWRhY3RlZChrZXkpIHx8IHRoaXMuX2lzUG9saWN5UmVkYWN0ZWQoa2V5KTtcbiAgICAgICAgY29uc3QgZmllbGRTZXQgPSB0aGlzLl9yZWRhY3RlZEZpZWxkc0J5S2V5LmdldChrZXkpO1xuXG4gICAgICAgIGxldCByZWNvcmRlclZhbHVlOiB1bmtub3duO1xuICAgICAgICBpZiAoaXNSZWRhY3RlZCkge1xuICAgICAgICAgIHJlY29yZGVyVmFsdWUgPSAnW1JFREFDVEVEXSc7XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGRTZXQgJiYgZW50cnkudmFsdWUgJiYgdHlwZW9mIGVudHJ5LnZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJlY29yZGVyVmFsdWUgPSB0aGlzLl9zY3J1YkZpZWxkcyhlbnRyeS52YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZmllbGRTZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY29yZGVyVmFsdWUgPSBlbnRyeS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHZhbHVlOiByZWNvcmRlclZhbHVlLFxuICAgICAgICAgIG9wZXJhdGlvbjogZW50cnkub3BlcmF0aW9uLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubm90aWZ5Q29tbWl0KGNvbW1pdE11dGF0aW9ucyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTd2FsbG93IOKAlCByZWNvcmRlciBlcnJvcnMgbXVzdCBub3QgYWJvcnQgdGhlIHRyYXZlcnNhbC5cbiAgICAgIC8vIEluZGl2aWR1YWwgcmVjb3JkZXIgZXJyb3JzIGFyZSBhbHJlYWR5IGlzb2xhdGVkIGJ5IF9pbnZva2VIb29rLlxuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBEZWJ1ZyAvIERpYWdub3N0aWNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFkZERlYnVnSW5mbyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuYWRkTG9nKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgYWRkRGVidWdNZXNzYWdlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LmFkZExvZygnbWVzc2FnZXMnLCBbdmFsdWVdKTtcbiAgfVxuXG4gIGFkZEVycm9ySW5mbyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuYWRkRXJyb3Ioa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBhZGRNZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5hZGRNZXRyaWMobWV0cmljTmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgYWRkRXZhbChtZXRyaWNOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LmFkZEV2YWwobWV0cmljTmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIE5vbi1UcmFja2luZyBTdGF0ZSBJbnNwZWN0aW9uIChmb3IgVHlwZWRTY29wZSBwcm94eSBpbnRlcm5hbHMpIOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBSZXR1cm5zIGFsbCBzdGF0ZSBrZXlzIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBUeXBlZFNjb3BlIG93bktleXMvaGFzIHRyYXBzLiAqL1xuICBnZXRTdGF0ZUtleXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmdldFZhbHVlKFtdLCB1bmRlZmluZWQpO1xuICAgIGlmICghc25hcHNob3QgfHwgdHlwZW9mIHNuYXBzaG90ICE9PSAnb2JqZWN0JykgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzbmFwc2hvdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gIH1cblxuICAvKiogQ2hlY2sga2V5IGV4aXN0ZW5jZSB3aXRob3V0IGZpcmluZyBvblJlYWQuIFVzZWQgYnkgVHlwZWRTY29wZSBoYXMgdHJhcC5cbiAgICogIENvbnRyYWN0OiByZXR1cm5zIGZhbHNlIGZvciBrZXlzIG5ldmVyIHNldCBPUiBrZXlzIHNldCB0byB1bmRlZmluZWQuXG4gICAqICBUaGlzIG1hdGNoZXMgZGVsZXRlVmFsdWUoKSBzZW1hbnRpY3MgKHNldHMgdG8gdW5kZWZpbmVkID0gZGVsZXRlZCkuICovXG4gIGhhc0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIGtleSkgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBhcnJheSBwcm94eSBnZXRDdXJyZW50KCkgdG8gYXZvaWRcbiAgICogIHBoYW50b20gcmVhZHMgb24gaW50ZXJuYWwgYXJyYXkgb3BlcmF0aW9ucyAoLmxlbmd0aCwgLmhhcywgaXRlcmF0aW9uLCBldGMuKS5cbiAgICogIFRoZSBpbml0aWFsIHByb3BlcnR5IGFjY2VzcyBmaXJlcyBvbmUgdHJhY2tlZCBvblJlYWQgdmlhIGdldFZhbHVlKCk7IHN1YnNlcXVlbnRcbiAgICogIGludGVybmFsIGFycmF5IG9wZXJhdGlvbnMgdXNlIHRoaXMgbWV0aG9kIHRvIHN0YXkgc2lsZW50LlxuICAgKiAgTk9URTogTGlrZSBnZXRWYWx1ZSgpLCByZXR1cm5zIHRoZSByYXcgdmFsdWUgdG8gdGhlIGNhbGxlci4gUmVkYWN0aW9uIGFwcGxpZXNcbiAgICogIG9ubHkgdG8gcmVjb3JkZXIgZGlzcGF0Y2gg4oCUIGl0IGRvZXMgbm90IGZpbHRlciB0aGUgcmV0dXJuZWQgdmFsdWUuIFRoaXMgbWF0Y2hlc1xuICAgKiAgdGhlIGV4aXN0aW5nIGdldFZhbHVlKCkgY29udHJhY3Qgd2hlcmUgdXNlciBjb2RlIGFsd2F5cyByZWNlaXZlcyByYXcgZGF0YS4gKi9cbiAgZ2V0VmFsdWVTaWxlbnQoa2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZURpcmVjdChbXSwga2V5KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTdGF0ZSBBY2Nlc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0SW5pdGlhbFZhbHVlRm9yKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRHbG9iYWw/LihrZXkpO1xuICB9XG5cbiAgZ2V0VmFsdWUoa2V5Pzogc3RyaW5nKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIGtleSk7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlzUmVkYWN0ZWQgPSBrZXkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9pc0tleVJlZGFjdGVkKGtleSk7XG4gICAgICBjb25zdCBmaWVsZFNldCA9IGtleSAhPT0gdW5kZWZpbmVkID8gdGhpcy5fcmVkYWN0ZWRGaWVsZHNCeUtleS5nZXQoa2V5KSA6IHVuZGVmaW5lZDtcblxuICAgICAgbGV0IHJlY29yZGVyVmFsdWU6IHVua25vd247XG4gICAgICBpZiAoaXNSZWRhY3RlZCkge1xuICAgICAgICByZWNvcmRlclZhbHVlID0gJ1tSRURBQ1RFRF0nO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFNldCAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJlY29yZGVyVmFsdWUgPSB0aGlzLl9zY3J1YkZpZWxkcyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZmllbGRTZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVjb3JkZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvblJlYWQnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHJlY29yZGVyVmFsdWUsXG4gICAgICAgIHJlZGFjdGVkOiBpc1JlZGFjdGVkIHx8IGZpZWxkU2V0ICE9PSB1bmRlZmluZWQgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgc2V0VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGFzc2VydE5vdFJlYWRvbmx5KHRoaXMuX3JlYWRPbmx5VmFsdWVzLCBrZXksICd3cml0ZScpO1xuXG4gICAgLy8gRGV2LW1vZGU6IHdhcm4gaWYgdGhlIHZhbHVlIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4gICAgLy8gQ2hlY2sgQUZURVIgYXNzZXJ0Tm90UmVhZG9ubHkg4oCUIGRvbid0IHdhcm4gZm9yIHdyaXRlcyB0aGF0IHdpbGwgYmUgYmxvY2tlZC5cbiAgICAvLyBDaXJjdWxhciB2YWx1ZXMgd29yayAodGVybWluYWwgcHJveHkgaGFuZGxlcyB0aGVtKSBidXQgY2FuIHByb2R1Y2VcbiAgICAvLyBzdXJwcmlzaW5nIGJlaGF2aW9yIGluIG5hcnJhdGl2ZSwgSlNPTiBzZXJpYWxpemF0aW9uLCBhbmQgc25hcHNob3RzLlxuICAgIGlmIChpc0Rldk1vZGUoKSAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaGFzQ2lyY3VsYXJSZWZlcmVuY2UodmFsdWUpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2Zvb3RwcmludF0gQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluIHNldFZhbHVlKCcke2tleX0nKS4gYCArXG4gICAgICAgICAgICAnV3JpdGVzIHBhc3QgdGhlIGN5Y2xlIGRlcHRoIHdpbGwgdXNlIHRlcm1pbmFsIHByb3h5IHRyYWNraW5nLiAnICtcbiAgICAgICAgICAgICdDb25zaWRlciBmbGF0dGVuaW5nIHRoZSBkYXRhIHN0cnVjdHVyZS4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEF1dG8tcmVkYWN0IGlmIGtleSBtYXRjaGVzIHBvbGljeSAoZXhhY3Qga2V5cyBvciBwYXR0ZXJucyksIG9yIGlmIHRoZSBrZXkgd2FzXG4gICAgLy8gcHJldmlvdXNseSBtYXJrZWQgcmVkYWN0ZWQgKGUuZy4gY2FycmllZCBvdmVyIGZyb20gYSBzdWJmbG93IHZpYSBvdXRwdXRNYXBwZXIpLlxuICAgIGNvbnN0IGVmZmVjdGl2ZVJlZGFjdCA9IHNob3VsZFJlZGFjdCB8fCB0aGlzLl9pc1BvbGljeVJlZGFjdGVkKGtleSkgfHwgdGhpcy5fcmVkYWN0ZWRLZXlzLmhhcyhrZXkpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChbXSwga2V5LCB2YWx1ZSwgZWZmZWN0aXZlUmVkYWN0LCBkZXNjcmlwdGlvbik7XG5cbiAgICBpZiAoZWZmZWN0aXZlUmVkYWN0KSB7XG4gICAgICB0aGlzLl9yZWRhY3RlZEtleXMuYWRkKGtleSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGZpZWxkLWxldmVsIHJlZGFjdGlvbiBmcm9tIHBvbGljeVxuICAgIGNvbnN0IGZpZWxkU2V0ID0gdGhpcy5fcmVkYWN0ZWRGaWVsZHNCeUtleS5nZXQoa2V5KTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IHJlY29yZGVyVmFsdWU6IHVua25vd247XG4gICAgICBpZiAoZWZmZWN0aXZlUmVkYWN0KSB7XG4gICAgICAgIHJlY29yZGVyVmFsdWUgPSAnW1JFREFDVEVEXSc7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkU2V0ICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmVjb3JkZXJWYWx1ZSA9IHRoaXMuX3NjcnViRmllbGRzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBmaWVsZFNldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWNvcmRlclZhbHVlID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uV3JpdGUnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHJlY29yZGVyVmFsdWUsXG4gICAgICAgIG9wZXJhdGlvbjogJ3NldCcsXG4gICAgICAgIHJlZGFjdGVkOiBlZmZlY3RpdmVSZWRhY3QgfHwgZmllbGRTZXQgIT09IHVuZGVmaW5lZCB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdXBkYXRlVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGFzc2VydE5vdFJlYWRvbmx5KHRoaXMuX3JlYWRPbmx5VmFsdWVzLCBrZXksICd3cml0ZScpO1xuXG4gICAgLy8gRGV2LW1vZGU6IHNhbWUgY2lyY3VsYXIgY2hlY2sgYXMgc2V0VmFsdWUgKG1lcmdlIHRhcmdldHMgY2FuIGJlIGNpcmN1bGFyIHRvbylcbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKGhhc0NpcmN1bGFyUmVmZXJlbmNlKHZhbHVlKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtmb290cHJpbnRdIENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiB1cGRhdGVWYWx1ZSgnJHtrZXl9JykuIGAgK1xuICAgICAgICAgICAgJ0NvbnNpZGVyIGZsYXR0ZW5pbmcgdGhlIGRhdGEgc3RydWN0dXJlLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNSZWRhY3RlZCA9IHRoaXMuX2lzS2V5UmVkYWN0ZWQoa2V5KSB8fCB0aGlzLl9pc1BvbGljeVJlZGFjdGVkKGtleSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnVwZGF0ZU9iamVjdChbXSwga2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24sIGlzUmVkYWN0ZWQpO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWVsZFNldCA9IHRoaXMuX3JlZGFjdGVkRmllbGRzQnlLZXkuZ2V0KGtleSk7XG5cbiAgICAgIGxldCByZWNvcmRlclZhbHVlOiB1bmtub3duO1xuICAgICAgaWYgKGlzUmVkYWN0ZWQpIHtcbiAgICAgICAgcmVjb3JkZXJWYWx1ZSA9ICdbUkVEQUNURURdJztcbiAgICAgIH0gZWxzZSBpZiAoZmllbGRTZXQgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZWNvcmRlclZhbHVlID0gdGhpcy5fc2NydWJGaWVsZHModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGZpZWxkU2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY29yZGVyVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25Xcml0ZScsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogcmVjb3JkZXJWYWx1ZSxcbiAgICAgICAgb3BlcmF0aW9uOiAndXBkYXRlJyxcbiAgICAgICAgcmVkYWN0ZWQ6IGlzUmVkYWN0ZWQgfHwgZmllbGRTZXQgIT09IHVuZGVmaW5lZCB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZGVsZXRlVmFsdWUoa2V5OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgYXNzZXJ0Tm90UmVhZG9ubHkodGhpcy5fcmVhZE9ubHlWYWx1ZXMsIGtleSwgJ2RlbGV0ZScpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChbXSwga2V5LCB1bmRlZmluZWQsIGZhbHNlLCBkZXNjcmlwdGlvbiA/PyBgZGVsZXRlZCAke2tleX1gLCAnZGVsZXRlJyk7XG5cbiAgICAvLyBEZWxldGluZyBhIHJlZGFjdGVkIGtleSBjbGVhcnMgaXRzIHJlZGFjdGlvbiBzdGF0dXNcbiAgICB0aGlzLl9yZWRhY3RlZEtleXMuZGVsZXRlKGtleSk7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uV3JpdGUnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgb3BlcmF0aW9uOiAnZGVsZXRlJyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldEdsb2JhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRHbG9iYWw/LihrZXksIHZhbHVlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0R2xvYmFsPy4oa2V5KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc2V0T2JqZWN0SW5Sb290KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuc2V0Um9vdD8uKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlYWQtb25seSArIG1pc2Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlYWRvbmx5IGlucHV0IHZhbHVlcyBwYXNzZWQgdG8gdGhpcyBwaXBlbGluZSwgY2FzdCB0byBgVGAuXG4gICAqIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgZGVlcGx5IGZyb3plbiDigJQgYW55IGF0dGVtcHQgdG8gbXV0YXRlIGl0IHRocm93cy5cbiAgICogQ2FjaGVkIGF0IGNvbnN0cnVjdGlvbiB0aW1lIGZvciB6ZXJvLWFsbG9jYXRpb24gcmVwZWF0ZWQgYWNjZXNzLlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgYXBwbGljYW50TmFtZSwgaW5jb21lIH0gPSBzY29wZS5nZXRBcmdzPHsgYXBwbGljYW50TmFtZTogc3RyaW5nOyBpbmNvbWU6IG51bWJlciB9PigpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldEFyZ3M8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvemVuQXJncyBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcmVhZC1vbmx5IGluZnJhc3RydWN0dXJlIHZhbHVlc1xuICAgKiB0aGF0IHByb3BhZ2F0ZSB0aHJvdWdoIG5lc3RlZCBleGVjdXRvcnMgKGxpa2UgYHByb2Nlc3MuZW52YCBmb3IgZmxvd2NoYXJ0cykuXG4gICAqXG4gICAqIENvbnRhaW5zOiBzaWduYWwgKGFib3J0KSwgdGltZW91dE1zLCB0cmFjZUlkLlxuICAgKiBGcm96ZW4gYXQgY29uc3RydWN0aW9uIHRpbWUuIEluaGVyaXRlZCBieSBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgc2lnbmFsLCB0cmFjZUlkIH0gPSBzY29wZS5nZXRFbnYoKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRFbnYoKTogUmVhZG9ubHk8RXhlY3V0aW9uRW52PiB7XG4gICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGlvbkVudjtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UGlwZWxpbmVJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIEludGVybmFsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDaGVja3MgaWYgYSBrZXkgaXMgcmVkYWN0ZWQgKGV4cGxpY2l0IF9yZWRhY3RlZEtleXMgc2V0KS4gKi9cbiAgcHJpdmF0ZSBfaXNLZXlSZWRhY3RlZChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZWRhY3RlZEtleXMuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEga2V5IHNob3VsZCBiZSBhdXRvLXJlZGFjdGVkIGJ5IHRoZSBwb2xpY3kgKGV4YWN0IGtleXMgKyBwYXR0ZXJucykuXG4gICAqXG4gICAqIFJlRG9TIGd1YXJkOiBwYXR0ZXJuIHRlc3RpbmcgaXMgY2FwcGVkIGF0IE1BWF9QQVRURVJOX0tFWV9MRU4gY2hhcmFjdGVycy5cbiAgICogU2NvcGUgc3RhdGUga2V5cyBhcmUgYWx3YXlzIHNob3J0IGlkZW50aWZpZXJzOyBhbnkga2V5IGV4Y2VlZGluZyB0aGUgY2FwXG4gICAqIGlzIGFsbW9zdCBjZXJ0YWlubHkgbm90IGEgbGVnaXRpbWF0ZSBzY29wZSBrZXksIHNvIHNraXBwaW5nIHBhdHRlcm4gbWF0Y2hpbmdcbiAgICogZm9yIGl0IGRvZXMgbm90IHJpc2sgbGVha2luZyBQSUkuIEV4YWN0LWtleSBtYXRjaGluZyAoQXJyYXkuaW5jbHVkZXMpIGlzXG4gICAqIHN0aWxsIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBsZW5ndGggYW5kIGlzIG5vdCB2dWxuZXJhYmxlIHRvIFJlRG9TLlxuICAgKi9cbiAgcHJpdmF0ZSBfaXNQb2xpY3lSZWRhY3RlZChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fcmVkYWN0aW9uUG9saWN5KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuX3JlZGFjdGlvblBvbGljeS5rZXlzPy5pbmNsdWRlcyhrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5fcmVkYWN0aW9uUG9saWN5LnBhdHRlcm5zKSB7XG4gICAgICBpZiAoa2V5Lmxlbmd0aCA+IFNjb3BlRmFjYWRlLl9NQVhfUEFUVEVSTl9LRVlfTEVOKSB7XG4gICAgICAgIC8vIERldi1tb2RlIHdhcm5pbmc6IHBhdHRlcm4gbWF0Y2hpbmcgd2FzIHNpbGVudGx5IHNraXBwZWQgZm9yIHRoaXMga2V5LlxuICAgICAgICAvLyBVc2UgcG9saWN5LmtleXMgZm9yIGV4YWN0IG1hdGNoaW5nIG9mIGxvbmcga2V5IG5hbWVzLlxuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbZm9vdHByaW50XSBSZWRhY3Rpb25Qb2xpY3k6IGtleSAnJHtrZXkuc2xpY2UoMCwgNDApfS4uLicgKCR7a2V5Lmxlbmd0aH0gY2hhcnMpIGV4Y2VlZHMgYCArXG4gICAgICAgICAgICAgICd0aGUgcGF0dGVybi1tYXRjaGluZyBsZW5ndGggY2FwIGFuZCB3YXMgc2tpcHBlZC4gJyArXG4gICAgICAgICAgICAgICdVc2UgcG9saWN5LmtleXMgZm9yIGV4YWN0IG1hdGNoaW5nIG9mIGxvbmcga2V5IG5hbWVzLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX3JlZGFjdGlvblBvbGljeS5wYXR0ZXJucykge1xuICAgICAgICAgIHAubGFzdEluZGV4ID0gMDsgLy8gUmVzZXQgc3RhdGVmdWwgZ2xvYmFsL3N0aWNreSByZWdleGVzXG4gICAgICAgICAgaWYgKHAudGVzdChrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTWF4aW11bSBrZXkgbGVuZ3RoIChjaGFyYWN0ZXJzKSB0aGF0IHdpbGwgYmUgdGVzdGVkIGFnYWluc3QgcmVnZXggcmVkYWN0aW9uXG4gICAqIHBhdHRlcm5zLiBLZXlzIGxvbmdlciB0aGFuIHRoaXMgYXJlIHNraXBwZWQgZm9yIHBhdHRlcm4gbWF0Y2hpbmcgdG8gcHJldmVudFxuICAgKiBSZURvUzogYSBwYXRob2xvZ2ljYWwgcmVnZXggdGVzdGVkIGFnYWluc3QgYW4gdW5ib3VuZGVkbHkgbG9uZyBrZXkgc3RyaW5nXG4gICAqIGNhbiBjYXVzZSBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nLlxuICAgKlxuICAgKiAyNTYgY2hhcmFjdGVycyBjb21mb3J0YWJseSBleGNlZWRzIGFueSByZWFsaXN0aWMgc2NvcGUtc3RhdGUga2V5IG5hbWUuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBfTUFYX1BBVFRFUk5fS0VZX0xFTiA9IDI1NjtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGRlZXAtY2xvbmVkIGNvcHkgd2l0aCBzcGVjaWZpZWQgZmllbGRzIHJlcGxhY2VkIGJ5ICdbUkVEQUNURURdJy5cbiAgICogU3VwcG9ydHMgZG90LW5vdGF0aW9uIHBhdGhzIChlLmcuICdhZGRyZXNzLnppcCcpIGZvciBuZXN0ZWQgb2JqZWN0cy5cbiAgICovXG4gIHByaXZhdGUgX3NjcnViRmllbGRzKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGZpZWxkczogU2V0PHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZShvYmopO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQuaW5jbHVkZXMoJy4nKSAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvcHksIGZpZWxkKSkge1xuICAgICAgICAvLyBEb3Qtbm90YXRpb24gcGF0aCDihpIgZGVlcCBzY3J1YiAob25seSBpZiBub3QgYSBsaXRlcmFsIGZsYXQga2V5KVxuICAgICAgICBpZiAobG9kYXNoSGFzKGNvcHksIGZpZWxkKSkge1xuICAgICAgICAgIGxvZGFzaFNldChjb3B5LCBmaWVsZCwgJ1tSRURBQ1RFRF0nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb3B5LCBmaWVsZCkpIHtcbiAgICAgICAgICBjb3B5W2ZpZWxkXSA9ICdbUkVEQUNURURdJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29weTtcbiAgfVxuXG4gIHByaXZhdGUgX2ludm9rZUhvb2soaG9vazoga2V5b2YgT21pdDxSZWNvcmRlciwgJ2lkJz4sIGV2ZW50OiB1bmtub3duKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCByZWNvcmRlciBvZiB0aGlzLl9yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhvb2tGbiA9IHJlY29yZGVyW2hvb2tdO1xuICAgICAgICBpZiAodHlwZW9mIGhvb2tGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIChob29rRm4gYXMgKGV2ZW50OiB1bmtub3duKSA9PiB2b2lkKS5jYWxsKHJlY29yZGVyLCBldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChob29rICE9PSAnb25FcnJvcicpIHtcbiAgICAgICAgICB0aGlzLl9pbnZva2VIb29rKCdvbkVycm9yJywge1xuICAgICAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgYXMgRXJyb3IsXG4gICAgICAgICAgICBvcGVyYXRpb246IGhvb2sgPT09ICdvblJlYWQnID8gJ3JlYWQnIDogaG9vayA9PT0gJ29uQ29tbWl0JyA/ICdjb21taXQnIDogJ3dyaXRlJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -7,4 +7,4 @@
7
7
  * attached to Scope instances to observe read/write/commit operations.
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNjb3BlIFR5cGUgRGVmaW5pdGlvbnNcbiAqXG4gKiBDb3JlIHR5cGVzIGZvciB0aGUgY29tcG9zYWJsZSBTY29wZSBzeXN0ZW0gd2l0aCBwbHVnZ2FibGUgUmVjb3JkZXJzLlxuICogQXJjaGl0ZWN0dXJlIGZvbGxvd3MgY29tcG9zaXRpb24tb3Zlci1pbmhlcml0YW5jZTogUmVjb3JkZXJzIGFyZVxuICogYXR0YWNoZWQgdG8gU2NvcGUgaW5zdGFuY2VzIHRvIG9ic2VydmUgcmVhZC93cml0ZS9jb21taXQgb3BlcmF0aW9ucy5cbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFdmVudCBUeXBlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGVyQ29udGV4dCB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRFdmVudCBleHRlbmRzIFJlY29yZGVyQ29udGV4dCB7XG4gIGtleT86IHN0cmluZztcbiAgdmFsdWU6IHVua25vd247XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHZhbHVlIGhhcyBiZWVuIHJlZGFjdGVkIGZvciBQSUkgcHJvdGVjdGlvbi4gKi9cbiAgcmVkYWN0ZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdyaXRlRXZlbnQgZXh0ZW5kcyBSZWNvcmRlckNvbnRleHQge1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IHVua25vd247XG4gIG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSB2YWx1ZSBoYXMgYmVlbiByZWRhY3RlZCBmb3IgUElJIHByb3RlY3Rpb24uICovXG4gIHJlZGFjdGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21taXRFdmVudCBleHRlbmRzIFJlY29yZGVyQ29udGV4dCB7XG4gIG11dGF0aW9uczogQXJyYXk8e1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiB1bmtub3duO1xuICAgIG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnO1xuICB9Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckV2ZW50IGV4dGVuZHMgUmVjb3JkZXJDb250ZXh0IHtcbiAgZXJyb3I6IEVycm9yO1xuICBvcGVyYXRpb246ICdyZWFkJyB8ICd3cml0ZScgfCAnY29tbWl0JztcbiAga2V5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlRXZlbnQgZXh0ZW5kcyBSZWNvcmRlckNvbnRleHQge1xuICBkdXJhdGlvbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXVzZUV2ZW50IGV4dGVuZHMgUmVjb3JkZXJDb250ZXh0IHtcbiAgc3RhZ2VJZDogc3RyaW5nO1xuICBwYXVzZURhdGE/OiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VtZUV2ZW50IGV4dGVuZHMgUmVjb3JkZXJDb250ZXh0IHtcbiAgc3RhZ2VJZDogc3RyaW5nO1xuICBoYXNJbnB1dDogYm9vbGVhbjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVkYWN0aW9uIFBvbGljeVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIERlY2xhcmF0aXZlIHJlZGFjdGlvbiBjb25maWd1cmF0aW9uIOKAlCBkZWZpbmUgb25jZSwgYXBwbGllZCBldmVyeXdoZXJlLlxuICpcbiAqIENvbmZpZ3VyZSBhdCB0aGUgc2NvcGUgY2xhc3MgbGV2ZWwgKHN0YXRpYyBwcm9wZXJ0eSkgb3IgcGFzcyB0b1xuICogRmxvd0NoYXJ0RXhlY3V0b3IgdG8gYXBwbHkgYWNyb3NzIGFsbCBzdGFnZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVkYWN0aW9uUG9saWN5IHtcbiAgLyoqIEV4YWN0IGtleSBuYW1lcyB0byBhbHdheXMgcmVkYWN0IChlLmcuIFsnc3NuJywgJ2NyZWRpdENhcmQnXSkuICovXG4gIGtleXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFJlZ2V4IHBhdHRlcm5zIOKAlCBhbnkga2V5IG1hdGNoaW5nIGEgcGF0dGVybiBpcyBhdXRvLXJlZGFjdGVkLlxuICAgKlxuICAgKiBQYXR0ZXJuIG1hdGNoaW5nIGlzIHNraXBwZWQgZm9yIGtleXMgdGhhdCBleGNlZWQgYW4gaW50ZXJuYWwgbGVuZ3RoIGNhcFxuICAgKiAoZGVzaWduZWQgdG8gcHJldmVudCBSZURvUyBvbiBwYXRob2xvZ2ljYWwgcGF0dGVybnMpLiBGb3IgdmVyeSBsb25nIGtleVxuICAgKiBuYW1lcywgdXNlIGBrZXlzYCAoZXhhY3QgbWF0Y2gpIGluc3RlYWQgb2YgcGF0dGVybnMuXG4gICAqL1xuICBwYXR0ZXJucz86IFJlZ0V4cFtdO1xuICAvKiogRmllbGQtbGV2ZWwgcmVkYWN0aW9uIHdpdGhpbiBvYmplY3RzIOKAlCBrZXkg4oaSIGFycmF5IG9mIGZpZWxkcyB0byBzY3J1Yi5cbiAgICogIFN1cHBvcnRzIGRvdC1ub3RhdGlvbiBmb3IgbmVzdGVkIHBhdGhzIChlLmcuICdhZGRyZXNzLnppcCcpLiAqL1xuICBmaWVsZHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG59XG5cbi8qKlxuICogQ29tcGxpYW5jZS1mcmllbmRseSByZXBvcnQgb2Ygd2hhdCB3YXMgcmVkYWN0ZWQuIE5ldmVyIGluY2x1ZGVzIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRhY3Rpb25SZXBvcnQge1xuICAvKiogS2V5cyBmdWxseSByZWRhY3RlZCAoZXhhY3QgbWF0Y2ggb3IgcGF0dGVybiBtYXRjaCkuICovXG4gIHJlZGFjdGVkS2V5czogc3RyaW5nW107XG4gIC8qKiBLZXlzIHdpdGggZmllbGQtbGV2ZWwgcmVkYWN0aW9uIOKGkiB3aGljaCBmaWVsZHMgd2VyZSBzY3J1YmJlZC4gKi9cbiAgZmllbGRSZWRhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIC8qKiBTb3VyY2Ugc3RyaW5ncyBvZiByZWdpc3RlcmVkIHBhdHRlcm5zLiAqL1xuICBwYXR0ZXJuczogc3RyaW5nW107XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJlY29yZGVyIEludGVyZmFjZVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFBsdWdnYWJsZSBvYnNlcnZlciBmb3Igc2NvcGUgb3BlcmF0aW9ucy5cbiAqXG4gKiBBbGwgbWV0aG9kcyBhcmUgb3B0aW9uYWwg4oCUIGltcGxlbWVudCBvbmx5IHRoZSBob29rcyB5b3UgbmVlZC5cbiAqIFJlY29yZGVycyBhcmUgaW52b2tlZCBzeW5jaHJvbm91c2x5IGluIGF0dGFjaG1lbnQgb3JkZXIuXG4gKiBJZiBhIHJlY29yZGVyIHRocm93cywgdGhlIGVycm9yIGlzIGNhdWdodCBhbmQgcGFzc2VkIHRvIG9uRXJyb3JcbiAqIGhvb2tzIG9mIG90aGVyIHJlY29yZGVyczsgdGhlIHNjb3BlIG9wZXJhdGlvbiBjb250aW51ZXMgbm9ybWFsbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkZXIge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICBvblJlYWQ/KGV2ZW50OiBSZWFkRXZlbnQpOiB2b2lkO1xuICBvbldyaXRlPyhldmVudDogV3JpdGVFdmVudCk6IHZvaWQ7XG4gIG9uQ29tbWl0PyhldmVudDogQ29tbWl0RXZlbnQpOiB2b2lkO1xuICBvbkVycm9yPyhldmVudDogRXJyb3JFdmVudCk6IHZvaWQ7XG4gIG9uU3RhZ2VTdGFydD8oZXZlbnQ6IFN0YWdlRXZlbnQpOiB2b2lkO1xuICBvblN0YWdlRW5kPyhldmVudDogU3RhZ2VFdmVudCk6IHZvaWQ7XG4gIG9uUGF1c2U/KGV2ZW50OiBQYXVzZUV2ZW50KTogdm9pZDtcbiAgb25SZXN1bWU/KGV2ZW50OiBSZXN1bWVFdmVudCk6IHZvaWQ7XG4gIC8qKiBSZXNldCBzdGF0ZSBiZWZvcmUgZWFjaCBleGVjdXRvci5ydW4oKSDigJQgcHJldmVudHMgY3Jvc3MtcnVuIGFjY3VtdWxhdGlvbi4gKi9cbiAgY2xlYXI/KCk6IHZvaWQ7XG4gIC8qKiBFeHBvc2UgY29sbGVjdGVkIGRhdGEgZm9yIGluY2x1c2lvbiBpbiBleGVjdXRvci5nZXRTbmFwc2hvdCgpLnJlY29yZGVycy4gKi9cbiAgdG9TbmFwc2hvdD8oKTogeyBuYW1lOiBzdHJpbmc7IGRhdGE6IHVua25vd24gfTtcbn1cbiJdfQ==
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNjb3BlIFR5cGUgRGVmaW5pdGlvbnNcbiAqXG4gKiBDb3JlIHR5cGVzIGZvciB0aGUgY29tcG9zYWJsZSBTY29wZSBzeXN0ZW0gd2l0aCBwbHVnZ2FibGUgUmVjb3JkZXJzLlxuICogQXJjaGl0ZWN0dXJlIGZvbGxvd3MgY29tcG9zaXRpb24tb3Zlci1pbmhlcml0YW5jZTogUmVjb3JkZXJzIGFyZVxuICogYXR0YWNoZWQgdG8gU2NvcGUgaW5zdGFuY2VzIHRvIG9ic2VydmUgcmVhZC93cml0ZS9jb21taXQgb3BlcmF0aW9ucy5cbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFdmVudCBUeXBlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGVyQ29udGV4dCB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIgKG1hdGNoZXMgc3BlYyBub2RlIGlkKS4gKi9cbiAgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBGb3JtYXQ6IFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleCAqL1xuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRFdmVudCBleHRlbmRzIFJlY29yZGVyQ29udGV4dCB7XG4gIGtleT86IHN0cmluZztcbiAgdmFsdWU6IHVua25vd247XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHZhbHVlIGhhcyBiZWVuIHJlZGFjdGVkIGZvciBQSUkgcHJvdGVjdGlvbi4gKi9cbiAgcmVkYWN0ZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdyaXRlRXZlbnQgZXh0ZW5kcyBSZWNvcmRlckNvbnRleHQge1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IHVua25vd247XG4gIG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSB2YWx1ZSBoYXMgYmVlbiByZWRhY3RlZCBmb3IgUElJIHByb3RlY3Rpb24uICovXG4gIHJlZGFjdGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21taXRFdmVudCBleHRlbmRzIFJlY29yZGVyQ29udGV4dCB7XG4gIG11dGF0aW9uczogQXJyYXk8e1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiB1bmtub3duO1xuICAgIG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnO1xuICB9Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckV2ZW50IGV4dGVuZHMgUmVjb3JkZXJDb250ZXh0IHtcbiAgZXJyb3I6IEVycm9yO1xuICBvcGVyYXRpb246ICdyZWFkJyB8ICd3cml0ZScgfCAnY29tbWl0JztcbiAga2V5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlRXZlbnQgZXh0ZW5kcyBSZWNvcmRlckNvbnRleHQge1xuICBkdXJhdGlvbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXVzZUV2ZW50IGV4dGVuZHMgUmVjb3JkZXJDb250ZXh0IHtcbiAgcGF1c2VEYXRhPzogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXN1bWVFdmVudCBleHRlbmRzIFJlY29yZGVyQ29udGV4dCB7XG4gIGhhc0lucHV0OiBib29sZWFuO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSZWRhY3Rpb24gUG9saWN5XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRGVjbGFyYXRpdmUgcmVkYWN0aW9uIGNvbmZpZ3VyYXRpb24g4oCUIGRlZmluZSBvbmNlLCBhcHBsaWVkIGV2ZXJ5d2hlcmUuXG4gKlxuICogQ29uZmlndXJlIGF0IHRoZSBzY29wZSBjbGFzcyBsZXZlbCAoc3RhdGljIHByb3BlcnR5KSBvciBwYXNzIHRvXG4gKiBGbG93Q2hhcnRFeGVjdXRvciB0byBhcHBseSBhY3Jvc3MgYWxsIHN0YWdlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRhY3Rpb25Qb2xpY3kge1xuICAvKiogRXhhY3Qga2V5IG5hbWVzIHRvIGFsd2F5cyByZWRhY3QgKGUuZy4gWydzc24nLCAnY3JlZGl0Q2FyZCddKS4gKi9cbiAga2V5cz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogUmVnZXggcGF0dGVybnMg4oCUIGFueSBrZXkgbWF0Y2hpbmcgYSBwYXR0ZXJuIGlzIGF1dG8tcmVkYWN0ZWQuXG4gICAqXG4gICAqIFBhdHRlcm4gbWF0Y2hpbmcgaXMgc2tpcHBlZCBmb3Iga2V5cyB0aGF0IGV4Y2VlZCBhbiBpbnRlcm5hbCBsZW5ndGggY2FwXG4gICAqIChkZXNpZ25lZCB0byBwcmV2ZW50IFJlRG9TIG9uIHBhdGhvbG9naWNhbCBwYXR0ZXJucykuIEZvciB2ZXJ5IGxvbmcga2V5XG4gICAqIG5hbWVzLCB1c2UgYGtleXNgIChleGFjdCBtYXRjaCkgaW5zdGVhZCBvZiBwYXR0ZXJucy5cbiAgICovXG4gIHBhdHRlcm5zPzogUmVnRXhwW107XG4gIC8qKiBGaWVsZC1sZXZlbCByZWRhY3Rpb24gd2l0aGluIG9iamVjdHMg4oCUIGtleSDihpIgYXJyYXkgb2YgZmllbGRzIHRvIHNjcnViLlxuICAgKiAgU3VwcG9ydHMgZG90LW5vdGF0aW9uIGZvciBuZXN0ZWQgcGF0aHMgKGUuZy4gJ2FkZHJlc3MuemlwJykuICovXG4gIGZpZWxkcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbn1cblxuLyoqXG4gKiBDb21wbGlhbmNlLWZyaWVuZGx5IHJlcG9ydCBvZiB3aGF0IHdhcyByZWRhY3RlZC4gTmV2ZXIgaW5jbHVkZXMgdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvblJlcG9ydCB7XG4gIC8qKiBLZXlzIGZ1bGx5IHJlZGFjdGVkIChleGFjdCBtYXRjaCBvciBwYXR0ZXJuIG1hdGNoKS4gKi9cbiAgcmVkYWN0ZWRLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIEtleXMgd2l0aCBmaWVsZC1sZXZlbCByZWRhY3Rpb24g4oaSIHdoaWNoIGZpZWxkcyB3ZXJlIHNjcnViYmVkLiAqL1xuICBmaWVsZFJlZGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqIFNvdXJjZSBzdHJpbmdzIG9mIHJlZ2lzdGVyZWQgcGF0dGVybnMuICovXG4gIHBhdHRlcm5zOiBzdHJpbmdbXTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVjb3JkZXIgSW50ZXJmYWNlXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUGx1Z2dhYmxlIG9ic2VydmVyIGZvciBzY29wZSBvcGVyYXRpb25zLlxuICpcbiAqIEFsbCBtZXRob2RzIGFyZSBvcHRpb25hbCDigJQgaW1wbGVtZW50IG9ubHkgdGhlIGhvb2tzIHlvdSBuZWVkLlxuICogUmVjb3JkZXJzIGFyZSBpbnZva2VkIHN5bmNocm9ub3VzbHkgaW4gYXR0YWNobWVudCBvcmRlci5cbiAqIElmIGEgcmVjb3JkZXIgdGhyb3dzLCB0aGUgZXJyb3IgaXMgY2F1Z2h0IGFuZCBwYXNzZWQgdG8gb25FcnJvclxuICogaG9va3Mgb2Ygb3RoZXIgcmVjb3JkZXJzOyB0aGUgc2NvcGUgb3BlcmF0aW9uIGNvbnRpbnVlcyBub3JtYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIG9uUmVhZD8oZXZlbnQ6IFJlYWRFdmVudCk6IHZvaWQ7XG4gIG9uV3JpdGU/KGV2ZW50OiBXcml0ZUV2ZW50KTogdm9pZDtcbiAgb25Db21taXQ/KGV2ZW50OiBDb21taXRFdmVudCk6IHZvaWQ7XG4gIG9uRXJyb3I/KGV2ZW50OiBFcnJvckV2ZW50KTogdm9pZDtcbiAgb25TdGFnZVN0YXJ0PyhldmVudDogU3RhZ2VFdmVudCk6IHZvaWQ7XG4gIG9uU3RhZ2VFbmQ/KGV2ZW50OiBTdGFnZUV2ZW50KTogdm9pZDtcbiAgb25QYXVzZT8oZXZlbnQ6IFBhdXNlRXZlbnQpOiB2b2lkO1xuICBvblJlc3VtZT8oZXZlbnQ6IFJlc3VtZUV2ZW50KTogdm9pZDtcbiAgLyoqIFJlc2V0IHN0YXRlIGJlZm9yZSBlYWNoIGV4ZWN1dG9yLnJ1bigpIOKAlCBwcmV2ZW50cyBjcm9zcy1ydW4gYWNjdW11bGF0aW9uLiAqL1xuICBjbGVhcj8oKTogdm9pZDtcbiAgLyoqIEV4cG9zZSBjb2xsZWN0ZWQgZGF0YSBmb3IgaW5jbHVzaW9uIGluIGV4ZWN1dG9yLmdldFNuYXBzaG90KCkucmVjb3JkZXJzLiAqL1xuICB0b1NuYXBzaG90PygpOiB7IG5hbWU6IHN0cmluZzsgZGF0YTogdW5rbm93biB9O1xufVxuIl19
@@ -54,6 +54,8 @@ export interface IControlFlowNarrative {
54
54
  export interface TraversalContext {
55
55
  /** Stable stage identifier from the builder (matches spec node id). */
56
56
  readonly stageId: string;
57
+ /** Unique per-execution-step identifier. Format: [subflowPath/]stageId#executionIndex */
58
+ readonly runtimeStageId: string;
57
59
  /** Human-readable stage name. */
58
60
  readonly stageName: string;
59
61
  /** Parent stage ID — walk up to reconstruct the tree. Undefined at root. */
@@ -0,0 +1,47 @@
1
+ /**
2
+ * runtimeStageId — unique identifier for each execution step during traversal.
3
+ *
4
+ * Format: [subflowPath/]stageId#executionIndex
5
+ *
6
+ * Components:
7
+ * stageId — stable node ID from the builder ('call-llm', 'seed')
8
+ * executionIndex — monotonic counter incremented per stage execution (0, 1, 2...)
9
+ * subflowPath — optional path for subflow stages ('sf-tools', 'sf-outer/sf-inner')
10
+ *
11
+ * Properties:
12
+ * - Unique within a run (executionIndex never repeats)
13
+ * - Execution-ordered (sort by executionIndex = execution order)
14
+ * - Human-readable ('sf-tools/execute-tool-calls#8')
15
+ * - Parseable (split on '#' for stageId and index, split stageId on '/' for subflow path)
16
+ *
17
+ * @example
18
+ * ```
19
+ * buildRuntimeStageId('call-llm', 5) // 'call-llm#5'
20
+ * buildRuntimeStageId('execute-tool-calls', 8, 'sf-tools') // 'sf-tools/execute-tool-calls#8'
21
+ * buildRuntimeStageId('validate', 3, 'sf-outer/sf-inner') // 'sf-outer/sf-inner/validate#3'
22
+ * ```
23
+ */
24
+ /**
25
+ * Build a runtimeStageId from its components.
26
+ *
27
+ * Note: The traverser does NOT use the subflowPath parameter — node.id already
28
+ * includes the subflow prefix from the builder. This parameter exists for external
29
+ * consumers constructing IDs from parsed components (round-trip via parseRuntimeStageId).
30
+ */
31
+ export declare function buildRuntimeStageId(stageId: string, executionIndex: number, subflowPath?: string): string;
32
+ /** Parse a runtimeStageId into its components. */
33
+ export declare function parseRuntimeStageId(runtimeStageId: string): {
34
+ stageId: string;
35
+ executionIndex: number;
36
+ subflowPath: string | undefined;
37
+ };
38
+ /**
39
+ * Shared mutable counter for execution index.
40
+ * Passed by reference to child traversers (subflows) so they
41
+ * continue the global numbering instead of restarting at 0.
42
+ */
43
+ export interface ExecutionCounter {
44
+ value: number;
45
+ }
46
+ /** Create a new execution counter starting at 0. */
47
+ export declare function createExecutionCounter(): ExecutionCounter;
@@ -61,6 +61,10 @@ export interface TraverserOptions<TOut = any, TScope = any> {
61
61
  * Propagated to TraversalContext so narrative entries carry the correct subflowId.
62
62
  */
63
63
  parentSubflowId?: string;
64
+ /** Shared execution counter from parent traverser. Subflows continue the parent's numbering. */
65
+ executionCounter?: {
66
+ value: number;
67
+ };
64
68
  }
65
69
  export declare class FlowchartTraverser<TOut = any, TScope = any> {
66
70
  private readonly root;
@@ -95,6 +99,11 @@ export declare class FlowchartTraverser<TOut = any, TScope = any> {
95
99
  * Prevents call-stack overflow on infinite loops or excessively deep stage chains.
96
100
  */
97
101
  private _executeDepth;
102
+ /**
103
+ * Shared mutable execution counter — monotonic, incremented per stage execution.
104
+ * Shared with child traversers (subflows) so indices are globally unique within a run.
105
+ */
106
+ private readonly _executionCounter;
98
107
  /**
99
108
  * Per-instance maximum depth (set from TraverserOptions.maxDepth or the class default).
100
109
  */
@@ -19,6 +19,8 @@ export declare class StageContext {
19
19
  stageName: string;
20
20
  /** Unique stage identifier from the builder (matches spec node id). */
21
21
  stageId: string;
22
+ /** Unique per-execution-step identifier. Set by traverser before stage execution. */
23
+ runtimeStageId: string;
22
24
  runId: string;
23
25
  branchId?: string;
24
26
  isDecider: boolean;
@@ -20,6 +20,10 @@ export interface CommitBundle {
20
20
  idx?: number;
21
21
  /** Human-readable stage name. */
22
22
  stage: string;
23
+ /** Stable stage identifier (matches spec node id). */
24
+ stageId: string;
25
+ /** Unique per-execution-step identifier. Format: [subflowPath/]stageId#executionIndex */
26
+ runtimeStageId: string;
23
27
  /** Chronological write log for deterministic replay. */
24
28
  trace: TraceEntry[];
25
29
  /** Paths that should be redacted in UI (sensitive data). */
@@ -81,6 +81,8 @@ export interface FlowChartExecutorOptions<TScope = any> {
81
81
  }
82
82
  export declare class FlowChartExecutor<TOut = any, TScope = any> {
83
83
  private traverser;
84
+ /** Shared execution counter — survives pause/resume. Reset on fresh run(). */
85
+ private _executionCounter;
84
86
  private narrativeEnabled;
85
87
  private narrativeOptions?;
86
88
  private combinedRecorder;
@@ -62,9 +62,9 @@ export declare class ScopeFacade {
62
62
  /** @internal */
63
63
  notifyStageEnd(duration?: number): void;
64
64
  /** @internal */
65
- notifyPause(stageId: string, pauseData?: unknown): void;
65
+ notifyPause(pauseData?: unknown): void;
66
66
  /** @internal */
67
- notifyResume(stageId: string, hasInput: boolean): void;
67
+ notifyResume(hasInput: boolean): void;
68
68
  /** @internal */
69
69
  notifyCommit(mutations: CommitEvent['mutations']): void;
70
70
  /** Called by StageContext.commit() observer. Converts tracked writes to CommitEvent format.
@@ -7,6 +7,10 @@
7
7
  */
8
8
  export interface RecorderContext {
9
9
  stageName: string;
10
+ /** Stable stage identifier (matches spec node id). */
11
+ stageId: string;
12
+ /** Unique per-execution-step identifier. Format: [subflowPath/]stageId#executionIndex */
13
+ runtimeStageId: string;
10
14
  pipelineId: string;
11
15
  timestamp: number;
12
16
  }
@@ -39,11 +43,9 @@ export interface StageEvent extends RecorderContext {
39
43
  duration?: number;
40
44
  }
41
45
  export interface PauseEvent extends RecorderContext {
42
- stageId: string;
43
46
  pauseData?: unknown;
44
47
  }
45
48
  export interface ResumeEvent extends RecorderContext {
46
- stageId: string;
47
49
  hasInput: boolean;
48
50
  }
49
51
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "footprintjs",
3
- "version": "4.4.1",
3
+ "version": "4.6.0",
4
4
  "description": "Explainable backend flows — automatic causal traces, decision evidence, and MCP tool generation for AI agents",
5
5
  "license": "MIT",
6
6
  "author": "Sanjay Krishna Anbalagan",