@wireio/shared 1.0.100 → 1.0.102

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.
@@ -24,6 +24,7 @@ export declare class FileAppender<Record extends LogRecord> implements Appender<
24
24
  /**
25
25
  * Initialize and setup the appender
26
26
  *
27
+ * @throws When shutdown has started; closed appenders cannot be reopened.
27
28
  * @returns {FileAppender<Record>}
28
29
  */
29
30
  setup(): FileAppender<Record>;
@@ -36,8 +37,14 @@ export declare class FileAppender<Record extends LogRecord> implements Appender<
36
37
  * @returns
37
38
  */
38
39
  rollFile(): void;
40
+ /** The single drain shared by append and close while writes are pending. */
41
+ private pendingFlush;
42
+ /** The first close operation; also prevents appends during shutdown. */
43
+ private closing;
39
44
  /**
40
- * Close the handler
45
+ * Drain all queued and in-flight writes, then close the handler once.
46
+ * Repeated calls share the first close promise. Write failures reject it after
47
+ * draining the queued tail and releasing the descriptor.
41
48
  *
42
49
  * @returns {Promise<void>}
43
50
  */
@@ -54,6 +61,7 @@ export declare class FileAppender<Record extends LogRecord> implements Appender<
54
61
  * Handle log records, transform, push to ES
55
62
  *
56
63
  * @param record
64
+ * @throws When shutdown has started; a closed descriptor cannot accept records.
57
65
  */
58
66
  append(record: Record): void;
59
67
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"FileAppender.d.ts","sourceRoot":"","sources":["../../../../../src/node/logging/appenders/FileAppender.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAE5D,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAsB/B,MAAM,WAAW,kBAAkB,CAAC,MAAM,SAAS,SAAS,GAAG,GAAG;IAChE,QAAQ,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf,aAAa,EAAE,OAAO,CAAA;IACtB,WAAW,EAAE,OAAO,CAAA;IACpB,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,MAAM,mBAAmB,CAAC,MAAM,SAAS,SAAS,GAAG,GAAG,IAAI,OAAO,CACvE,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAA;AAED,qBAAa,YAAY,CACvB,MAAM,SAAS,SAAS,CACxB,YAAW,QAAQ,CAAC,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAE3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAiBrB;IAED,IAAI,aAAa,YAEhB;IAED,OAAO;IAIP;;;;OAIG;IACH,KAAK,IAAI,YAAY,CAAC,MAAM,CAAC;IA2B7B;;;;;;;OAOG;IACH,QAAQ;IAkDR;;;;OAIG;IACH,KAAK;IAML,IAAI,KAAK,8BAER;IAED,IAAI,IAAI,WAEP;IAED,IAAI,QAAQ,YAEX;IAED,IAAI,QAAQ,WAEX;IAED;;OAEG;IACH,OAAO,CAAC,KAAK;IAoCb;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAsB5B;;;OAGG;gBACS,OAAO,GAAE,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAM;CAW/D"}
1
+ {"version":3,"file":"FileAppender.d.ts","sourceRoot":"","sources":["../../../../../src/node/logging/appenders/FileAppender.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAE5D,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAsB/B,MAAM,WAAW,kBAAkB,CAAC,MAAM,SAAS,SAAS,GAAG,GAAG;IAChE,QAAQ,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf,aAAa,EAAE,OAAO,CAAA;IACtB,WAAW,EAAE,OAAO,CAAA;IACpB,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,MAAM,mBAAmB,CAAC,MAAM,SAAS,SAAS,GAAG,GAAG,IAAI,OAAO,CACvE,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAA;AAED,qBAAa,YAAY,CACvB,MAAM,SAAS,SAAS,CACxB,YAAW,QAAQ,CAAC,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAE3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAiBrB;IAED,IAAI,aAAa,YAEhB;IAED,OAAO;IAIP;;;;;OAKG;IACH,KAAK,IAAI,YAAY,CAAC,MAAM,CAAC;IA8B7B;;;;;;;OAOG;IACH,QAAQ;IAkDR,4EAA4E;IAC5E,OAAO,CAAC,YAAY,CAAiB;IAErC,wEAAwE;IACxE,OAAO,CAAC,OAAO,CAAe;IAE9B;;;;;;OAMG;IACH,KAAK;IAaL,IAAI,KAAK,8BAER;IAED,IAAI,IAAI,WAEP;IAED,IAAI,QAAQ,YAEX;IAED,IAAI,QAAQ,WAEX;IAED;;OAEG;IACH,OAAO,CAAC,KAAK;IA4Cb;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAyB5B;;;OAGG;gBACS,OAAO,GAAE,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAM;CAW/D"}
@@ -79,10 +79,14 @@ class FileAppender {
79
79
  /**
80
80
  * Initialize and setup the appender
81
81
  *
82
+ * @throws When shutdown has started; closed appenders cannot be reopened.
82
83
  * @returns {FileAppender<Record>}
83
84
  */
84
85
  setup() {
85
86
  const { state } = this;
87
+ if (this.closing) {
88
+ throw Error(`${this.filename} is closing or closed`);
89
+ }
86
90
  if (!!state.ready) {
87
91
  return this;
88
92
  }
@@ -157,15 +161,28 @@ class FileAppender {
157
161
  file: Fs.openSync(filename, "a")
158
162
  });
159
163
  }
164
+ /** The single drain shared by append and close while writes are pending. */
165
+ pendingFlush;
166
+ /** The first close operation; also prevents appends during shutdown. */
167
+ closing;
160
168
  /**
161
- * Close the handler
169
+ * Drain all queued and in-flight writes, then close the handler once.
170
+ * Repeated calls share the first close promise. Write failures reject it after
171
+ * draining the queued tail and releasing the descriptor.
162
172
  *
163
173
  * @returns {Promise<void>}
164
174
  */
165
175
  close() {
166
- return this.flush()
167
- .onComplete(() => prelude_ts_1.Option.of(this.state.file).map(Fs.closeSync))
168
- .toPromise();
176
+ return (this.closing ??= this.flush()
177
+ .map(() => {
178
+ prelude_ts_1.Option.of(this.state.file).map(Fs.closeSync);
179
+ this.state.file = null;
180
+ this.state.ready = false;
181
+ if (this.state.error) {
182
+ throw this.state.error;
183
+ }
184
+ })
185
+ .toPromise());
169
186
  }
170
187
  get queue() {
171
188
  return this.state.queue;
@@ -184,7 +201,12 @@ class FileAppender {
184
201
  */
185
202
  flush() {
186
203
  const { state } = this;
187
- return prelude_ts_1.Future.do(async () => {
204
+ if (this.pendingFlush) {
205
+ return this.pendingFlush;
206
+ }
207
+ return (this.pendingFlush = prelude_ts_1.Future.do(async () => {
208
+ // Defer the drain until pendingFlush owns it, including an empty queue.
209
+ await Promise.resolve();
188
210
  state.flushing = true;
189
211
  try {
190
212
  const { file } = this;
@@ -193,8 +215,14 @@ class FileAppender {
193
215
  }
194
216
  while (this.queue.length) {
195
217
  const buf = this.queue.shift();
196
- await bluebird_1.default.fromCallback(cb => Fs.appendFile(file, buf, "utf-8", cb));
197
- state.currentSize += buf.byteLength;
218
+ try {
219
+ await bluebird_1.default.fromCallback(cb => Fs.appendFile(file, buf, "utf-8", cb));
220
+ state.currentSize += buf.byteLength;
221
+ }
222
+ catch (err) {
223
+ // Keep draining the queued tail, but close must report lost writes.
224
+ state.error ??= err;
225
+ }
198
226
  }
199
227
  const { maxSize } = this.config;
200
228
  if (maxSize > 0 && state.currentSize >= maxSize) {
@@ -203,22 +231,25 @@ class FileAppender {
203
231
  //await Bluebird.fromCallback((cb) => Fs.fdatasync(this.file, cb))
204
232
  }
205
233
  catch (err) {
206
- console.error(`Failed to append file ${this.filename}`, err);
234
+ state.error ??= err;
207
235
  }
208
236
  finally {
209
237
  this.state.flushing = false;
210
- if (this.queue.length) {
211
- queueMicrotask(() => this.flush());
212
- }
238
+ this.pendingFlush = null;
213
239
  }
214
- });
240
+ return true;
241
+ }));
215
242
  }
216
243
  /**
217
244
  * Handle log records, transform, push to ES
218
245
  *
219
246
  * @param record
247
+ * @throws When shutdown has started; a closed descriptor cannot accept records.
220
248
  */
221
249
  append(record) {
250
+ if (this.closing) {
251
+ throw Error(`${this.filename} is closing or closed`);
252
+ }
222
253
  try {
223
254
  const { queue, filename } = this.state;
224
255
  const count = queue.length;
@@ -251,4 +282,4 @@ class FileAppender {
251
282
  }
252
283
  }
253
284
  exports.FileAppender = FileAppender;
254
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZUFwcGVuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL25vZGUvbG9nZ2luZy9hcHBlbmRlcnMvRmlsZUFwcGVuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1DQUFtRDtBQUNuRCwyQ0FBNEI7QUFDNUIsdUNBQXdCO0FBR3hCLGdEQUFnRDtBQUNoRCxtQ0FBK0I7QUFDL0Isa0RBQXlCO0FBQ3pCLHdEQUErQjtBQUUvQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFBO0FBRTNCLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBSyxFQUFDLHlCQUF5QixDQUFDLENBQUE7QUFDOUMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFBO0FBQy9ELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxDQUFBLENBQUMsRUFBRTtBQUMvRSxNQUFNLGdCQUFnQixHQUFHLEdBQXVCLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUM7SUFDdkMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFlBQVk7SUFDbEQsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNYLFFBQVEsRUFBRSxDQUFDO0lBQ1gsYUFBYSxFQUFFLEtBQUs7SUFDcEIsSUFBSSxFQUFFLEtBQUs7Q0FDWixDQUFDLENBQUE7QUFFRixTQUFTLG1CQUFtQixDQUFDLE9BQTRCO0lBQ3ZELE9BQU8sSUFBQSxpQkFBUSxFQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUE7QUFDOUMsQ0FBQztBQXdCRCxNQUFhLFlBQVk7SUFHZCxNQUFNLENBQTRCO0lBRTFCLEtBQUssR0FTbEI7UUFDRixpQkFBaUIsRUFBRSxFQUFFO1FBQ3JCLFFBQVEsRUFBRSxTQUFTO1FBQ25CLElBQUksRUFBRSxTQUFTO1FBQ2YsS0FBSyxFQUFFLEtBQUs7UUFDWixXQUFXLEVBQUUsQ0FBQztRQUNkLFFBQVEsRUFBRSxLQUFLO1FBQ2YsS0FBSyxFQUFFLEVBQUU7S0FDVixDQUFBO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQTtJQUNsQyxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUE7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLO1FBQ0gsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQTtRQUN0QixJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQTtZQUN6QixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUV2QyxJQUFBLGVBQU0sRUFBQyxLQUFLLEVBQUU7Z0JBQ1osUUFBUTtnQkFDUixJQUFJO2dCQUNKLEtBQUssRUFBRSxJQUFJO2FBQ1osQ0FBQyxDQUFBO1lBRUYsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUEsZUFBTSxFQUFDLEtBQUssRUFBRTtnQkFDWixLQUFLLEVBQUUsR0FBRztnQkFDVixJQUFJLEVBQUUsU0FBUztnQkFDZixLQUFLLEVBQUUsS0FBSzthQUNiLENBQUMsQ0FBQTtZQUNGLE1BQU0sR0FBRyxDQUFBO1FBQ1gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsUUFBUTtRQUNOLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFBO1FBQzlCLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLEdBQUcsS0FBSyxDQUFBO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3QixLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQTtZQUN2QyxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1FBQzlDLElBQUksTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2RCxpQkFBaUIsQ0FBQyxJQUFJLENBQ3BCLFFBQVEsR0FBRyxHQUFHLEdBQUcsSUFBQSxpQkFBUSxFQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUMxRCxDQUFBO1FBQ0gsQ0FBQztRQUNELEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdEIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNsQixJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUE7UUFDN0IsTUFBTSxTQUFTLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxDQUFBO1FBRWxELElBQUksSUFBSSxHQUFXLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUNsQyxPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4QixJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUE7WUFDekIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxDQUFDLGdDQUFnQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO1lBQzlDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLENBQUMsZUFBZSxHQUFHLGNBQWMsSUFBSSxHQUFHLENBQUMsQ0FBQTtnQkFDOUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3hCLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ3JCLENBQUM7Z0JBQ0QsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUE7Z0JBQ3hCLDBCQUEwQjtnQkFDMUIsK0JBQStCO2dCQUMvQiw0QkFBNEI7Z0JBQzVCLFdBQVc7Z0JBQ1gsNkJBQTZCO2dCQUM3QixJQUFJO1lBQ04sQ0FBQztZQUNELElBQUksR0FBRyxHQUFHLENBQUE7UUFDWixDQUFDO1FBRUQsSUFBQSxlQUFNLEVBQUMsS0FBSyxFQUFFO1lBQ1osV0FBVyxFQUFFLENBQUM7WUFDZCxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO1NBQ2pDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSztRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRTthQUNoQixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQzlELFNBQVMsRUFBRSxDQUFBO0lBQ2hCLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFBO0lBQ3pCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFBO0lBQ3hCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFBO0lBQzVCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUM1RSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLO1FBQ1gsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQTtRQUN0QixPQUFPLG1CQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQzFCLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFBO1lBQ3JCLElBQUksQ0FBQztnQkFDSCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFBO2dCQUNyQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ1YsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSwwQkFBMEIsQ0FBQyxDQUFBO2dCQUN6RCxDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDekIsTUFBTSxHQUFHLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQTtvQkFFdEMsTUFBTSxrQkFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUMvQixFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUN0QyxDQUFBO29CQUVELEtBQUssQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQTtnQkFDckMsQ0FBQztnQkFFRCxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTtnQkFDL0IsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ2hELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtnQkFDakIsQ0FBQztnQkFFRCxrRUFBa0U7WUFDcEUsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1lBQzlELENBQUM7b0JBQVMsQ0FBQztnQkFDVCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUE7Z0JBQzNCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDdEIsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO2dCQUNwQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsTUFBYztRQUNuQixJQUFJLENBQUM7WUFDSCxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUE7WUFDdEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQTtZQUMxQixJQUFJLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDaEIsS0FBSyxDQUNILHlCQUF5QixLQUFLLHdDQUF3QyxRQUFRLHdCQUF3QixFQUN0RyxNQUFNLENBQ1AsQ0FBQTtnQkFDRCxPQUFNO1lBQ1IsQ0FBQztZQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVztnQkFDbEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQzFCLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7WUFDN0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ2QsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQzdDLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWSxVQUFnRCxFQUFFO1FBQzVELElBQUksQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFMUMsSUFBQSxlQUFNLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNqQixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO1NBQy9CLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNaLEtBQUssQ0FBQyxzQ0FBc0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBQ2xFLG1CQUFtQjtJQUNyQixDQUFDO0NBQ0Y7QUF0T0Qsb0NBc09DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXNzaWduLCBkZWZhdWx0cywgcGFkU3RhcnQgfSBmcm9tIFwibG9kYXNoXCJcbmltcG9ydCAqIGFzIFBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0ICogYXMgRnMgZnJvbSBcImZzXCJcbmltcG9ydCB0eXBlIHsgTG9nUmVjb3JkIH0gZnJvbSBcIi4uLy4uLy4uL2xvZ2dpbmcvTG9nUmVjb3JkLmpzXCJcbmltcG9ydCB0eXBlIHsgQXBwZW5kZXIgfSBmcm9tIFwiLi4vLi4vLi4vbG9nZ2luZy9BcHBlbmRlci5qc1wiXG5pbXBvcnQgeyBPcHRpb24sIEZ1dHVyZSB9IGZyb20gXCJAM2Z2L3ByZWx1ZGUtdHNcIlxuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcImJ1ZmZlclwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCBCbHVlYmlyZCBmcm9tIFwiYmx1ZWJpcmRcIlxuXG5jb25zdCBGc0FzeW5jID0gRnMucHJvbWlzZXNcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcIjNmdjpsb2dnZXI6RmlsZUFwcGVuZGVyXCIpXG5jb25zdCBvc1RlbXBEaXIgPSBwcm9jZXNzLmVudi5UTVAgPz8gcHJvY2Vzcy5lbnYuVEVNUCA/PyBcIi90bXBcIlxuY29uc3QgdGVtcERpciA9IEZzLm1rZHRlbXBTeW5jKFBhdGguam9pbihvc1RlbXBEaXIsIFwibG9nZ2VyLXByb3h5LWV4YW1wbGVcIikpIC8vXG5jb25zdCBnZXREZWZhdWx0Q29uZmlnID0gKCk6IEZpbGVBcHBlbmRlckNvbmZpZyA9PiAoe1xuICBmaWxlbmFtZTogUGF0aC5qb2luKHRlbXBEaXIsIFwiYXBwLmxvZ1wiKSxcbiAgcHJldHR5UHJpbnQ6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIixcbiAgbWF4U2l6ZTogLTEsXG4gIG1heEZpbGVzOiA1LFxuICBlbmFibGVSb2xsaW5nOiBmYWxzZSxcbiAgc3luYzogZmFsc2Vcbn0pXG5cbmZ1bmN0aW9uIGFwcGx5Q29uZmlnRGVmYXVsdHMob3B0aW9uczogRmlsZUFwcGVuZGVyT3B0aW9ucyk6IEZpbGVBcHBlbmRlckNvbmZpZyB7XG4gIHJldHVybiBkZWZhdWx0cyhvcHRpb25zLCBnZXREZWZhdWx0Q29uZmlnKCkpXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUFwcGVuZGVyQ29uZmlnPFJlY29yZCBleHRlbmRzIExvZ1JlY29yZCA9IGFueT4ge1xuICBmaWxlbmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEZvciByb2xsaW5nXG4gICAqL1xuICBtYXhGaWxlczogbnVtYmVyXG5cbiAgLyoqXG4gICAqIEZvciByb2xsaW5nXG4gICAqL1xuICBtYXhTaXplOiBudW1iZXJcblxuICBlbmFibGVSb2xsaW5nOiBib29sZWFuXG4gIHByZXR0eVByaW50OiBib29sZWFuXG4gIHN5bmM6IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgRmlsZUFwcGVuZGVyT3B0aW9uczxSZWNvcmQgZXh0ZW5kcyBMb2dSZWNvcmQgPSBhbnk+ID0gUGFydGlhbDxcbiAgRmlsZUFwcGVuZGVyQ29uZmlnPFJlY29yZD5cbj5cblxuZXhwb3J0IGNsYXNzIEZpbGVBcHBlbmRlcjxcbiAgUmVjb3JkIGV4dGVuZHMgTG9nUmVjb3JkXG4+IGltcGxlbWVudHMgQXBwZW5kZXI8UmVjb3JkPiB7XG4gIHJlYWRvbmx5IGNvbmZpZzogRmlsZUFwcGVuZGVyQ29uZmlnPFJlY29yZD5cblxuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlOiB7XG4gICAgZmlsZW5hbWU6IHN0cmluZ1xuICAgIGZpbGU6IG51bWJlclxuICAgIGZsdXNoaW5nOiBib29sZWFuXG4gICAgcXVldWU6IEFycmF5PEJ1ZmZlcj5cbiAgICByZWFkeTogYm9vbGVhblxuICAgIGVycm9yPzogRXJyb3JcbiAgICBjdXJyZW50U2l6ZTogbnVtYmVyXG4gICAgYXJjaGl2ZWRGaWxlbmFtZXM6IHN0cmluZ1tdXG4gIH0gPSB7XG4gICAgYXJjaGl2ZWRGaWxlbmFtZXM6IFtdLFxuICAgIGZpbGVuYW1lOiB1bmRlZmluZWQsXG4gICAgZmlsZTogdW5kZWZpbmVkLFxuICAgIHJlYWR5OiBmYWxzZSxcbiAgICBjdXJyZW50U2l6ZTogMCxcbiAgICBmbHVzaGluZzogZmFsc2UsXG4gICAgcXVldWU6IFtdXG4gIH1cblxuICBnZXQgZW5hYmxlUm9sbGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZW5hYmxlUm9sbGluZ1xuICB9XG5cbiAgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5yZWFkeVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYW5kIHNldHVwIHRoZSBhcHBlbmRlclxuICAgKlxuICAgKiBAcmV0dXJucyB7RmlsZUFwcGVuZGVyPFJlY29yZD59XG4gICAqL1xuICBzZXR1cCgpOiBGaWxlQXBwZW5kZXI8UmVjb3JkPiB7XG4gICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpc1xuICAgIGlmICghIXN0YXRlLnJlYWR5KSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGZpbGVuYW1lIH0gPSB0aGlzXG4gICAgICBjb25zdCBmaWxlID0gRnMub3BlblN5bmMoZmlsZW5hbWUsIFwiYVwiKVxuXG4gICAgICBhc3NpZ24oc3RhdGUsIHtcbiAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgIGZpbGUsXG4gICAgICAgIHJlYWR5OiB0cnVlXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYXNzaWduKHN0YXRlLCB7XG4gICAgICAgIGVycm9yOiBlcnIsXG4gICAgICAgIGZpbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgcmVhZHk6IGZhbHNlXG4gICAgICB9KVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9ubHkgZXhwb3NlZCBmb3IgdGhlIHNha2Ugb2YgdGVzdHMgJiBleGFtcGxlc1xuICAgKiBETyBOT1QgVVNFXG4gICAqXG4gICAqIFRoaXMgc2hvdWxkIGFsbCBiZSBhc3luYywgYnV0IGkgd2FzIGluIGEgcnVzaCA6KFxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcm9sbEZpbGUoKSB7XG4gICAgY29uc3QgeyBzdGF0ZSwgY29uZmlnIH0gPSB0aGlzXG4gICAgbGV0IHsgZmlsZSwgZmlsZW5hbWUsIGFyY2hpdmVkRmlsZW5hbWVzIH0gPSBzdGF0ZVxuICAgIGlmICghdGhpcy5pc1JlYWR5KCkgfHwgIWZpbGUpIHtcbiAgICAgIGRlYnVnKGBDYW4gbm90IHJvbGwgZmlsZSBiZWZvcmUgcmVhZHlgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmVuYWJsZVJvbGxpbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGZpbGVDb3VudCA9IGFyY2hpdmVkRmlsZW5hbWVzLmxlbmd0aCArIDFcbiAgICBpZiAoY29uZmlnLm1heEZpbGVzIDwgMSB8fCBmaWxlQ291bnQgPCBjb25maWcubWF4RmlsZXMpIHtcbiAgICAgIGFyY2hpdmVkRmlsZW5hbWVzLnB1c2goXG4gICAgICAgIGZpbGVuYW1lICsgXCIuXCIgKyBwYWRTdGFydChmaWxlQ291bnQudG9TdHJpbmcoMTApLCA0LCBcIjBcIilcbiAgICAgIClcbiAgICB9XG4gICAgRnMuZmRhdGFzeW5jU3luYyhmaWxlKVxuICAgIEZzLmNsb3NlU3luYyhmaWxlKVxuICAgIGZpbGUgPSBzdGF0ZS5maWxlID0gdW5kZWZpbmVkXG4gICAgY29uc3QgZmlsZW5hbWVzID0gW2ZpbGVuYW1lLCAuLi5hcmNoaXZlZEZpbGVuYW1lc11cblxuICAgIGxldCBkZXN0OiBzdHJpbmcgPSBmaWxlbmFtZXMucG9wKClcbiAgICB3aGlsZSAoZmlsZW5hbWVzLmxlbmd0aCkge1xuICAgICAgbGV0IHNyYyA9IGZpbGVuYW1lcy5wb3AoKVxuICAgICAgaWYgKCFGcy5leGlzdHNTeW5jKHNyYykpIHtcbiAgICAgICAgZGVidWcoYHNyYyBkb2VzIG5vdCBleGlzdCwgc2tpcHBpbmcgJHtzcmN9YClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlYnVnKGBNb3Zpbmcgc3JjICgke3NyY30pIHRvIGRlc3QgKCR7ZGVzdH0pYClcbiAgICAgICAgaWYgKEZzLmV4aXN0c1N5bmMoZGVzdCkpIHtcbiAgICAgICAgICBGcy51bmxpbmtTeW5jKGRlc3QpXG4gICAgICAgIH1cbiAgICAgICAgRnMucmVuYW1lU3luYyhzcmMsIGRlc3QpXG4gICAgICAgIC8vIGlmIChzcmMgPT09IGZpbGVuYW1lKSB7XG4gICAgICAgIC8vICAgRnMuY29weUZpbGVTeW5jKHNyYywgZGVzdClcbiAgICAgICAgLy8gICBGcy50cnVuY2F0ZVN5bmMoc3JjLCAwKVxuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgIEZzLnJlbmFtZVN5bmMoc3JjLCBkZXN0KVxuICAgICAgICAvLyB9XG4gICAgICB9XG4gICAgICBkZXN0ID0gc3JjXG4gICAgfVxuXG4gICAgYXNzaWduKHN0YXRlLCB7XG4gICAgICBjdXJyZW50U2l6ZTogMCxcbiAgICAgIGZpbGU6IEZzLm9wZW5TeW5jKGZpbGVuYW1lLCBcImFcIilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBoYW5kbGVyXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmx1c2goKVxuICAgICAgLm9uQ29tcGxldGUoKCkgPT4gT3B0aW9uLm9mKHRoaXMuc3RhdGUuZmlsZSkubWFwKEZzLmNsb3NlU3luYykpXG4gICAgICAudG9Qcm9taXNlKClcbiAgfVxuXG4gIGdldCBxdWV1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5xdWV1ZVxuICB9XG5cbiAgZ2V0IGZpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZmlsZVxuICB9XG5cbiAgZ2V0IGZsdXNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmZsdXNoaW5nXG4gIH1cblxuICBnZXQgZmlsZW5hbWUoKSB7XG4gICAgcmV0dXJuICh0aGlzLnN0YXRlLmZpbGVuYW1lID0gdGhpcy5zdGF0ZS5maWxlbmFtZSA/PyB0aGlzLmNvbmZpZy5maWxlbmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIHRoZSBsb2cgcXVldWUgcmVjb3JkcyB0byB0aGUgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBmbHVzaCgpIHtcbiAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzXG4gICAgcmV0dXJuIEZ1dHVyZS5kbyhhc3luYyAoKSA9PiB7XG4gICAgICBzdGF0ZS5mbHVzaGluZyA9IHRydWVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgZmlsZSB9ID0gdGhpc1xuICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihgJHt0aGlzLmZpbGVuYW1lfSB3YXMgbm90IG9wZW5lZCBwcm9wZXJseWApXG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgYnVmOiBCdWZmZXIgPSB0aGlzLnF1ZXVlLnNoaWZ0KClcblxuICAgICAgICAgIGF3YWl0IEJsdWViaXJkLmZyb21DYWxsYmFjayhjYiA9PlxuICAgICAgICAgICAgRnMuYXBwZW5kRmlsZShmaWxlLCBidWYsIFwidXRmLThcIiwgY2IpXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgc3RhdGUuY3VycmVudFNpemUgKz0gYnVmLmJ5dGVMZW5ndGhcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgbWF4U2l6ZSB9ID0gdGhpcy5jb25maWdcbiAgICAgICAgaWYgKG1heFNpemUgPiAwICYmIHN0YXRlLmN1cnJlbnRTaXplID49IG1heFNpemUpIHtcbiAgICAgICAgICB0aGlzLnJvbGxGaWxlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vYXdhaXQgQmx1ZWJpcmQuZnJvbUNhbGxiYWNrKChjYikgPT4gRnMuZmRhdGFzeW5jKHRoaXMuZmlsZSwgY2IpKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBhcHBlbmQgZmlsZSAke3RoaXMuZmlsZW5hbWV9YCwgZXJyKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5zdGF0ZS5mbHVzaGluZyA9IGZhbHNlXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuZmx1c2goKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGxvZyByZWNvcmRzLCB0cmFuc2Zvcm0sIHB1c2ggdG8gRVNcbiAgICpcbiAgICogQHBhcmFtIHJlY29yZFxuICAgKi9cbiAgYXBwZW5kKHJlY29yZDogUmVjb3JkKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgcXVldWUsIGZpbGVuYW1lIH0gPSB0aGlzLnN0YXRlXG4gICAgICBjb25zdCBjb3VudCA9IHF1ZXVlLmxlbmd0aFxuICAgICAgaWYgKGNvdW50ID4gOTk5KSB7XG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgIGBUb28gbWFueSBsb2cgcmVjb3JkcyAoJHtjb3VudH0pIGFyZSBpbiB0aGUgcXVldWUgd2l0aG91dCB0aGUgZmlsZSAoJHtmaWxlbmFtZX0pIG9wZW5pbmcsIHNraXBwaW5nICVPYCxcbiAgICAgICAgICByZWNvcmRcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY29uZmlnLnByZXR0eVByaW50XG4gICAgICAgID8gSlNPTi5zdHJpbmdpZnkocmVjb3JkLCBudWxsLCAyKVxuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHJlY29yZClcbiAgICAgIHF1ZXVlLnB1c2goQnVmZmVyLmZyb20oZGF0YSArIFwiXFxuXCIsIFwidXRmLThcIikpXG4gICAgICB0aGlzLmZsdXNoKClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHN5bmNocm9uaXplIGAsIGVycilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEZpbGVBcHBlbmRlck9wdGlvbnM8UmVjb3JkPj59IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFBhcnRpYWw8RmlsZUFwcGVuZGVyT3B0aW9uczxSZWNvcmQ+PiA9IHt9KSB7XG4gICAgdGhpcy5jb25maWcgPSBhcHBseUNvbmZpZ0RlZmF1bHRzKG9wdGlvbnMpXG5cbiAgICBhc3NpZ24odGhpcy5zdGF0ZSwge1xuICAgICAgZmlsZW5hbWU6IHRoaXMuY29uZmlnLmZpbGVuYW1lXG4gICAgfSlcblxuICAgIHRoaXMuc2V0dXAoKVxuICAgIGRlYnVnKGBGaWxlIGFwcGVuZGVyIGlzIHJlYWR5LCBsb2dnaW5nIHRvICR7dGhpcy5zdGF0ZS5maWxlbmFtZX1gKVxuICAgIC8vICAgICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuIl19
285
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZUFwcGVuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL25vZGUvbG9nZ2luZy9hcHBlbmRlcnMvRmlsZUFwcGVuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1DQUFtRDtBQUNuRCwyQ0FBNEI7QUFDNUIsdUNBQXdCO0FBR3hCLGdEQUFnRDtBQUNoRCxtQ0FBK0I7QUFDL0Isa0RBQXlCO0FBQ3pCLHdEQUErQjtBQUUvQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFBO0FBRTNCLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBSyxFQUFDLHlCQUF5QixDQUFDLENBQUE7QUFDOUMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFBO0FBQy9ELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxDQUFBLENBQUMsRUFBRTtBQUMvRSxNQUFNLGdCQUFnQixHQUFHLEdBQXVCLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUM7SUFDdkMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFlBQVk7SUFDbEQsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNYLFFBQVEsRUFBRSxDQUFDO0lBQ1gsYUFBYSxFQUFFLEtBQUs7SUFDcEIsSUFBSSxFQUFFLEtBQUs7Q0FDWixDQUFDLENBQUE7QUFFRixTQUFTLG1CQUFtQixDQUFDLE9BQTRCO0lBQ3ZELE9BQU8sSUFBQSxpQkFBUSxFQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxDQUFD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UUFDNUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUUxQyxJQUFBLGVBQU0sRUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2pCLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7U0FDL0IsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ1osS0FBSyxDQUFDLHNDQUFzQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDbEUsbUJBQW1CO0lBQ3JCLENBQUM7Q0FDRjtBQXJRRCxvQ0FxUUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NpZ24sIGRlZmF1bHRzLCBwYWRTdGFydCB9IGZyb20gXCJsb2Rhc2hcIlxuaW1wb3J0ICogYXMgUGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgKiBhcyBGcyBmcm9tIFwiZnNcIlxuaW1wb3J0IHR5cGUgeyBMb2dSZWNvcmQgfSBmcm9tIFwiLi4vLi4vLi4vbG9nZ2luZy9Mb2dSZWNvcmQuanNcIlxuaW1wb3J0IHR5cGUgeyBBcHBlbmRlciB9IGZyb20gXCIuLi8uLi8uLi9sb2dnaW5nL0FwcGVuZGVyLmpzXCJcbmltcG9ydCB7IE9wdGlvbiwgRnV0dXJlIH0gZnJvbSBcIkAzZnYvcHJlbHVkZS10c1wiXG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tIFwiYnVmZmVyXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IEJsdWViaXJkIGZyb20gXCJibHVlYmlyZFwiXG5cbmNvbnN0IEZzQXN5bmMgPSBGcy5wcm9taXNlc1xuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwiM2Z2OmxvZ2dlcjpGaWxlQXBwZW5kZXJcIilcbmNvbnN0IG9zVGVtcERpciA9IHByb2Nlc3MuZW52LlRNUCA/PyBwcm9jZXNzLmVudi5URU1QID8/IFwiL3RtcFwiXG5jb25zdCB0ZW1wRGlyID0gRnMubWtkdGVtcFN5bmMoUGF0aC5qb2luKG9zVGVtcERpciwgXCJsb2dnZXItcHJveHktZXhhbXBsZVwiKSkgLy9cbmNvbnN0IGdldERlZmF1bHRDb25maWcgPSAoKTogRmlsZUFwcGVuZGVyQ29uZmlnID0+ICh7XG4gIGZpbGVuYW1lOiBQYXRoLmpvaW4odGVtcERpciwgXCJhcHAubG9nXCIpLFxuICBwcmV0dHlQcmludDogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiLFxuICBtYXhTaXplOiAtMSxcbiAgbWF4RmlsZXM6IDUsXG4gIGVuYWJsZVJvbGxpbmc6IGZhbHNlLFxuICBzeW5jOiBmYWxzZVxufSlcblxuZnVuY3Rpb24gYXBwbHlDb25maWdEZWZhdWx0cyhvcHRpb25zOiBGaWxlQXBwZW5kZXJPcHRpb25zKTogRmlsZUFwcGVuZGVyQ29uZmlnIHtcbiAgcmV0dXJuIGRlZmF1bHRzKG9wdGlvbnMsIGdldERlZmF1bHRDb25maWcoKSlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlQXBwZW5kZXJDb25maWc8UmVjb3JkIGV4dGVuZHMgTG9nUmVjb3JkID0gYW55PiB7XG4gIGZpbGVuYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogRm9yIHJvbGxpbmdcbiAgICovXG4gIG1heEZpbGVzOiBudW1iZXJcblxuICAvKipcbiAgICogRm9yIHJvbGxpbmdcbiAgICovXG4gIG1heFNpemU6IG51bWJlclxuXG4gIGVuYWJsZVJvbGxpbmc6IGJvb2xlYW5cbiAgcHJldHR5UHJpbnQ6IGJvb2xlYW5cbiAgc3luYzogYm9vbGVhblxufVxuXG5leHBvcnQgdHlwZSBGaWxlQXBwZW5kZXJPcHRpb25zPFJlY29yZCBleHRlbmRzIExvZ1JlY29yZCA9IGFueT4gPSBQYXJ0aWFsPFxuICBGaWxlQXBwZW5kZXJDb25maWc8UmVjb3JkPlxuPlxuXG5leHBvcnQgY2xhc3MgRmlsZUFwcGVuZGVyPFxuICBSZWNvcmQgZXh0ZW5kcyBMb2dSZWNvcmRcbj4gaW1wbGVtZW50cyBBcHBlbmRlcjxSZWNvcmQ+IHtcbiAgcmVhZG9ubHkgY29uZmlnOiBGaWxlQXBwZW5kZXJDb25maWc8UmVjb3JkPlxuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGU6IHtcbiAgICBmaWxlbmFtZTogc3RyaW5nXG4gICAgZmlsZTogbnVtYmVyXG4gICAgZmx1c2hpbmc6IGJvb2xlYW5cbiAgICBxdWV1ZTogQXJyYXk8QnVmZmVyPlxuICAgIHJlYWR5OiBib29sZWFuXG4gICAgZXJyb3I/OiBFcnJvclxuICAgIGN1cnJlbnRTaXplOiBudW1iZXJcbiAgICBhcmNoaXZlZEZpbGVuYW1lczogc3RyaW5nW11cbiAgfSA9IHtcbiAgICBhcmNoaXZlZEZpbGVuYW1lczogW10sXG4gICAgZmlsZW5hbWU6IHVuZGVmaW5lZCxcbiAgICBmaWxlOiB1bmRlZmluZWQsXG4gICAgcmVhZHk6IGZhbHNlLFxuICAgIGN1cnJlbnRTaXplOiAwLFxuICAgIGZsdXNoaW5nOiBmYWxzZSxcbiAgICBxdWV1ZTogW11cbiAgfVxuXG4gIGdldCBlbmFibGVSb2xsaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5lbmFibGVSb2xsaW5nXG4gIH1cblxuICBpc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLnJlYWR5XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhbmQgc2V0dXAgdGhlIGFwcGVuZGVyXG4gICAqXG4gICAqIEB0aHJvd3MgV2hlbiBzaHV0ZG93biBoYXMgc3RhcnRlZDsgY2xvc2VkIGFwcGVuZGVycyBjYW5ub3QgYmUgcmVvcGVuZWQuXG4gICAqIEByZXR1cm5zIHtGaWxlQXBwZW5kZXI8UmVjb3JkPn1cbiAgICovXG4gIHNldHVwKCk6IEZpbGVBcHBlbmRlcjxSZWNvcmQ+IHtcbiAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzXG4gICAgaWYgKHRoaXMuY2xvc2luZykge1xuICAgICAgdGhyb3cgRXJyb3IoYCR7dGhpcy5maWxlbmFtZX0gaXMgY2xvc2luZyBvciBjbG9zZWRgKVxuICAgIH1cbiAgICBpZiAoISFzdGF0ZS5yZWFkeSkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBmaWxlbmFtZSB9ID0gdGhpc1xuICAgICAgY29uc3QgZmlsZSA9IEZzLm9wZW5TeW5jKGZpbGVuYW1lLCBcImFcIilcblxuICAgICAgYXNzaWduKHN0YXRlLCB7XG4gICAgICAgIGZpbGVuYW1lLFxuICAgICAgICBmaWxlLFxuICAgICAgICByZWFkeTogdHJ1ZVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGFzc2lnbihzdGF0ZSwge1xuICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgICBmaWxlOiB1bmRlZmluZWQsXG4gICAgICAgIHJlYWR5OiBmYWxzZVxuICAgICAgfSlcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPbmx5IGV4cG9zZWQgZm9yIHRoZSBzYWtlIG9mIHRlc3RzICYgZXhhbXBsZXNcbiAgICogRE8gTk9UIFVTRVxuICAgKlxuICAgKiBUaGlzIHNob3VsZCBhbGwgYmUgYXN5bmMsIGJ1dCBpIHdhcyBpbiBhIHJ1c2ggOihcbiAgICpcbiAgICogQHJldHVybnNcbiAgICovXG4gIHJvbGxGaWxlKCkge1xuICAgIGNvbnN0IHsgc3RhdGUsIGNvbmZpZyB9ID0gdGhpc1xuICAgIGxldCB7IGZpbGUsIGZpbGVuYW1lLCBhcmNoaXZlZEZpbGVuYW1lcyB9ID0gc3RhdGVcbiAgICBpZiAoIXRoaXMuaXNSZWFkeSgpIHx8ICFmaWxlKSB7XG4gICAgICBkZWJ1ZyhgQ2FuIG5vdCByb2xsIGZpbGUgYmVmb3JlIHJlYWR5YClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5lbmFibGVSb2xsaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQ291bnQgPSBhcmNoaXZlZEZpbGVuYW1lcy5sZW5ndGggKyAxXG4gICAgaWYgKGNvbmZpZy5tYXhGaWxlcyA8IDEgfHwgZmlsZUNvdW50IDwgY29uZmlnLm1heEZpbGVzKSB7XG4gICAgICBhcmNoaXZlZEZpbGVuYW1lcy5wdXNoKFxuICAgICAgICBmaWxlbmFtZSArIFwiLlwiICsgcGFkU3RhcnQoZmlsZUNvdW50LnRvU3RyaW5nKDEwKSwgNCwgXCIwXCIpXG4gICAgICApXG4gICAgfVxuICAgIEZzLmZkYXRhc3luY1N5bmMoZmlsZSlcbiAgICBGcy5jbG9zZVN5bmMoZmlsZSlcbiAgICBmaWxlID0gc3RhdGUuZmlsZSA9IHVuZGVmaW5lZFxuICAgIGNvbnN0IGZpbGVuYW1lcyA9IFtmaWxlbmFtZSwgLi4uYXJjaGl2ZWRGaWxlbmFtZXNdXG5cbiAgICBsZXQgZGVzdDogc3RyaW5nID0gZmlsZW5hbWVzLnBvcCgpXG4gICAgd2hpbGUgKGZpbGVuYW1lcy5sZW5ndGgpIHtcbiAgICAgIGxldCBzcmMgPSBmaWxlbmFtZXMucG9wKClcbiAgICAgIGlmICghRnMuZXhpc3RzU3luYyhzcmMpKSB7XG4gICAgICAgIGRlYnVnKGBzcmMgZG9lcyBub3QgZXhpc3QsIHNraXBwaW5nICR7c3JjfWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWJ1ZyhgTW92aW5nIHNyYyAoJHtzcmN9KSB0byBkZXN0ICgke2Rlc3R9KWApXG4gICAgICAgIGlmIChGcy5leGlzdHNTeW5jKGRlc3QpKSB7XG4gICAgICAgICAgRnMudW5saW5rU3luYyhkZXN0KVxuICAgICAgICB9XG4gICAgICAgIEZzLnJlbmFtZVN5bmMoc3JjLCBkZXN0KVxuICAgICAgICAvLyBpZiAoc3JjID09PSBmaWxlbmFtZSkge1xuICAgICAgICAvLyAgIEZzLmNvcHlGaWxlU3luYyhzcmMsIGRlc3QpXG4gICAgICAgIC8vICAgRnMudHJ1bmNhdGVTeW5jKHNyYywgMClcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICBGcy5yZW5hbWVTeW5jKHNyYywgZGVzdClcbiAgICAgICAgLy8gfVxuICAgICAgfVxuICAgICAgZGVzdCA9IHNyY1xuICAgIH1cblxuICAgIGFzc2lnbihzdGF0ZSwge1xuICAgICAgY3VycmVudFNpemU6IDAsXG4gICAgICBmaWxlOiBGcy5vcGVuU3luYyhmaWxlbmFtZSwgXCJhXCIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBUaGUgc2luZ2xlIGRyYWluIHNoYXJlZCBieSBhcHBlbmQgYW5kIGNsb3NlIHdoaWxlIHdyaXRlcyBhcmUgcGVuZGluZy4gKi9cbiAgcHJpdmF0ZSBwZW5kaW5nRmx1c2g6IEZ1dHVyZTxib29sZWFuPlxuXG4gIC8qKiBUaGUgZmlyc3QgY2xvc2Ugb3BlcmF0aW9uOyBhbHNvIHByZXZlbnRzIGFwcGVuZHMgZHVyaW5nIHNodXRkb3duLiAqL1xuICBwcml2YXRlIGNsb3Npbmc6IFByb21pc2U8dm9pZD5cblxuICAvKipcbiAgICogRHJhaW4gYWxsIHF1ZXVlZCBhbmQgaW4tZmxpZ2h0IHdyaXRlcywgdGhlbiBjbG9zZSB0aGUgaGFuZGxlciBvbmNlLlxuICAgKiBSZXBlYXRlZCBjYWxscyBzaGFyZSB0aGUgZmlyc3QgY2xvc2UgcHJvbWlzZS4gV3JpdGUgZmFpbHVyZXMgcmVqZWN0IGl0IGFmdGVyXG4gICAqIGRyYWluaW5nIHRoZSBxdWV1ZWQgdGFpbCBhbmQgcmVsZWFzaW5nIHRoZSBkZXNjcmlwdG9yLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGNsb3NlKCkge1xuICAgIHJldHVybiAodGhpcy5jbG9zaW5nID8/PSB0aGlzLmZsdXNoKClcbiAgICAgIC5tYXAoKCkgPT4ge1xuICAgICAgICBPcHRpb24ub2YodGhpcy5zdGF0ZS5maWxlKS5tYXAoRnMuY2xvc2VTeW5jKVxuICAgICAgICB0aGlzLnN0YXRlLmZpbGUgPSBudWxsXG4gICAgICAgIHRoaXMuc3RhdGUucmVhZHkgPSBmYWxzZVxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgICAgIHRocm93IHRoaXMuc3RhdGUuZXJyb3JcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC50b1Byb21pc2UoKSlcbiAgfVxuXG4gIGdldCBxdWV1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5xdWV1ZVxuICB9XG5cbiAgZ2V0IGZpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZmlsZVxuICB9XG5cbiAgZ2V0IGZsdXNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmZsdXNoaW5nXG4gIH1cblxuICBnZXQgZmlsZW5hbWUoKSB7XG4gICAgcmV0dXJuICh0aGlzLnN0YXRlLmZpbGVuYW1lID0gdGhpcy5zdGF0ZS5maWxlbmFtZSA/PyB0aGlzLmNvbmZpZy5maWxlbmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIHRoZSBsb2cgcXVldWUgcmVjb3JkcyB0byB0aGUgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBmbHVzaCgpIHtcbiAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzXG4gICAgaWYgKHRoaXMucGVuZGluZ0ZsdXNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wZW5kaW5nRmx1c2hcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLnBlbmRpbmdGbHVzaCA9IEZ1dHVyZS5kbyhhc3luYyAoKSA9PiB7XG4gICAgICAvLyBEZWZlciB0aGUgZHJhaW4gdW50aWwgcGVuZGluZ0ZsdXNoIG93bnMgaXQsIGluY2x1ZGluZyBhbiBlbXB0eSBxdWV1ZS5cbiAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpXG4gICAgICBzdGF0ZS5mbHVzaGluZyA9IHRydWVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgZmlsZSB9ID0gdGhpc1xuICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihgJHt0aGlzLmZpbGVuYW1lfSB3YXMgbm90IG9wZW5lZCBwcm9wZXJseWApXG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgYnVmOiBCdWZmZXIgPSB0aGlzLnF1ZXVlLnNoaWZ0KClcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBCbHVlYmlyZC5mcm9tQ2FsbGJhY2soY2IgPT5cbiAgICAgICAgICAgICAgRnMuYXBwZW5kRmlsZShmaWxlLCBidWYsIFwidXRmLThcIiwgY2IpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBzdGF0ZS5jdXJyZW50U2l6ZSArPSBidWYuYnl0ZUxlbmd0aFxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gS2VlcCBkcmFpbmluZyB0aGUgcXVldWVkIHRhaWwsIGJ1dCBjbG9zZSBtdXN0IHJlcG9ydCBsb3N0IHdyaXRlcy5cbiAgICAgICAgICAgIHN0YXRlLmVycm9yID8/PSBlcnJcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IG1heFNpemUgfSA9IHRoaXMuY29uZmlnXG4gICAgICAgIGlmIChtYXhTaXplID4gMCAmJiBzdGF0ZS5jdXJyZW50U2l6ZSA+PSBtYXhTaXplKSB7XG4gICAgICAgICAgdGhpcy5yb2xsRmlsZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvL2F3YWl0IEJsdWViaXJkLmZyb21DYWxsYmFjaygoY2IpID0+IEZzLmZkYXRhc3luYyh0aGlzLmZpbGUsIGNiKSlcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzdGF0ZS5lcnJvciA/Pz0gZXJyXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnN0YXRlLmZsdXNoaW5nID0gZmFsc2VcbiAgICAgICAgdGhpcy5wZW5kaW5nRmx1c2ggPSBudWxsXG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBsb2cgcmVjb3JkcywgdHJhbnNmb3JtLCBwdXNoIHRvIEVTXG4gICAqXG4gICAqIEBwYXJhbSByZWNvcmRcbiAgICogQHRocm93cyBXaGVuIHNodXRkb3duIGhhcyBzdGFydGVkOyBhIGNsb3NlZCBkZXNjcmlwdG9yIGNhbm5vdCBhY2NlcHQgcmVjb3Jkcy5cbiAgICovXG4gIGFwcGVuZChyZWNvcmQ6IFJlY29yZCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NpbmcpIHtcbiAgICAgIHRocm93IEVycm9yKGAke3RoaXMuZmlsZW5hbWV9IGlzIGNsb3Npbmcgb3IgY2xvc2VkYClcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgcXVldWUsIGZpbGVuYW1lIH0gPSB0aGlzLnN0YXRlXG4gICAgICBjb25zdCBjb3VudCA9IHF1ZXVlLmxlbmd0aFxuICAgICAgaWYgKGNvdW50ID4gOTk5KSB7XG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgIGBUb28gbWFueSBsb2cgcmVjb3JkcyAoJHtjb3VudH0pIGFyZSBpbiB0aGUgcXVldWUgd2l0aG91dCB0aGUgZmlsZSAoJHtmaWxlbmFtZX0pIG9wZW5pbmcsIHNraXBwaW5nICVPYCxcbiAgICAgICAgICByZWNvcmRcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY29uZmlnLnByZXR0eVByaW50XG4gICAgICAgID8gSlNPTi5zdHJpbmdpZnkocmVjb3JkLCBudWxsLCAyKVxuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHJlY29yZClcbiAgICAgIHF1ZXVlLnB1c2goQnVmZmVyLmZyb20oZGF0YSArIFwiXFxuXCIsIFwidXRmLThcIikpXG4gICAgICB0aGlzLmZsdXNoKClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHN5bmNocm9uaXplIGAsIGVycilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEZpbGVBcHBlbmRlck9wdGlvbnM8UmVjb3JkPj59IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFBhcnRpYWw8RmlsZUFwcGVuZGVyT3B0aW9uczxSZWNvcmQ+PiA9IHt9KSB7XG4gICAgdGhpcy5jb25maWcgPSBhcHBseUNvbmZpZ0RlZmF1bHRzKG9wdGlvbnMpXG5cbiAgICBhc3NpZ24odGhpcy5zdGF0ZSwge1xuICAgICAgZmlsZW5hbWU6IHRoaXMuY29uZmlnLmZpbGVuYW1lXG4gICAgfSlcblxuICAgIHRoaXMuc2V0dXAoKVxuICAgIGRlYnVnKGBGaWxlIGFwcGVuZGVyIGlzIHJlYWR5LCBsb2dnaW5nIHRvICR7dGhpcy5zdGF0ZS5maWxlbmFtZX1gKVxuICAgIC8vICAgICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuIl19
@@ -24,6 +24,7 @@ export declare class FileAppender<Record extends LogRecord> implements Appender<
24
24
  /**
25
25
  * Initialize and setup the appender
26
26
  *
27
+ * @throws When shutdown has started; closed appenders cannot be reopened.
27
28
  * @returns {FileAppender<Record>}
28
29
  */
29
30
  setup(): FileAppender<Record>;
@@ -36,8 +37,14 @@ export declare class FileAppender<Record extends LogRecord> implements Appender<
36
37
  * @returns
37
38
  */
38
39
  rollFile(): void;
40
+ /** The single drain shared by append and close while writes are pending. */
41
+ private pendingFlush;
42
+ /** The first close operation; also prevents appends during shutdown. */
43
+ private closing;
39
44
  /**
40
- * Close the handler
45
+ * Drain all queued and in-flight writes, then close the handler once.
46
+ * Repeated calls share the first close promise. Write failures reject it after
47
+ * draining the queued tail and releasing the descriptor.
41
48
  *
42
49
  * @returns {Promise<void>}
43
50
  */
@@ -54,6 +61,7 @@ export declare class FileAppender<Record extends LogRecord> implements Appender<
54
61
  * Handle log records, transform, push to ES
55
62
  *
56
63
  * @param record
64
+ * @throws When shutdown has started; a closed descriptor cannot accept records.
57
65
  */
58
66
  append(record: Record): void;
59
67
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"FileAppender.d.ts","sourceRoot":"","sources":["../../../../../src/node/logging/appenders/FileAppender.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAE5D,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAsB/B,MAAM,WAAW,kBAAkB,CAAC,MAAM,SAAS,SAAS,GAAG,GAAG;IAChE,QAAQ,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf,aAAa,EAAE,OAAO,CAAA;IACtB,WAAW,EAAE,OAAO,CAAA;IACpB,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,MAAM,mBAAmB,CAAC,MAAM,SAAS,SAAS,GAAG,GAAG,IAAI,OAAO,CACvE,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAA;AAED,qBAAa,YAAY,CACvB,MAAM,SAAS,SAAS,CACxB,YAAW,QAAQ,CAAC,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAE3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAiBrB;IAED,IAAI,aAAa,YAEhB;IAED,OAAO;IAIP;;;;OAIG;IACH,KAAK,IAAI,YAAY,CAAC,MAAM,CAAC;IA2B7B;;;;;;;OAOG;IACH,QAAQ;IAkDR;;;;OAIG;IACH,KAAK;IAML,IAAI,KAAK,8BAER;IAED,IAAI,IAAI,WAEP;IAED,IAAI,QAAQ,YAEX;IAED,IAAI,QAAQ,WAEX;IAED;;OAEG;IACH,OAAO,CAAC,KAAK;IAoCb;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAsB5B;;;OAGG;gBACS,OAAO,GAAE,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAM;CAW/D"}
1
+ {"version":3,"file":"FileAppender.d.ts","sourceRoot":"","sources":["../../../../../src/node/logging/appenders/FileAppender.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAE5D,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAsB/B,MAAM,WAAW,kBAAkB,CAAC,MAAM,SAAS,SAAS,GAAG,GAAG;IAChE,QAAQ,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf,aAAa,EAAE,OAAO,CAAA;IACtB,WAAW,EAAE,OAAO,CAAA;IACpB,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,MAAM,mBAAmB,CAAC,MAAM,SAAS,SAAS,GAAG,GAAG,IAAI,OAAO,CACvE,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAA;AAED,qBAAa,YAAY,CACvB,MAAM,SAAS,SAAS,CACxB,YAAW,QAAQ,CAAC,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAE3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAiBrB;IAED,IAAI,aAAa,YAEhB;IAED,OAAO;IAIP;;;;;OAKG;IACH,KAAK,IAAI,YAAY,CAAC,MAAM,CAAC;IA8B7B;;;;;;;OAOG;IACH,QAAQ;IAkDR,4EAA4E;IAC5E,OAAO,CAAC,YAAY,CAAiB;IAErC,wEAAwE;IACxE,OAAO,CAAC,OAAO,CAAe;IAE9B;;;;;;OAMG;IACH,KAAK;IAaL,IAAI,KAAK,8BAER;IAED,IAAI,IAAI,WAEP;IAED,IAAI,QAAQ,YAEX;IAED,IAAI,QAAQ,WAEX;IAED;;OAEG;IACH,OAAO,CAAC,KAAK;IA4Cb;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAyB5B;;;OAGG;gBACS,OAAO,GAAE,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAM;CAW/D"}
@@ -40,10 +40,14 @@ export class FileAppender {
40
40
  /**
41
41
  * Initialize and setup the appender
42
42
  *
43
+ * @throws When shutdown has started; closed appenders cannot be reopened.
43
44
  * @returns {FileAppender<Record>}
44
45
  */
45
46
  setup() {
46
47
  const { state } = this;
48
+ if (this.closing) {
49
+ throw Error(`${this.filename} is closing or closed`);
50
+ }
47
51
  if (!!state.ready) {
48
52
  return this;
49
53
  }
@@ -118,15 +122,28 @@ export class FileAppender {
118
122
  file: Fs.openSync(filename, "a")
119
123
  });
120
124
  }
125
+ /** The single drain shared by append and close while writes are pending. */
126
+ pendingFlush;
127
+ /** The first close operation; also prevents appends during shutdown. */
128
+ closing;
121
129
  /**
122
- * Close the handler
130
+ * Drain all queued and in-flight writes, then close the handler once.
131
+ * Repeated calls share the first close promise. Write failures reject it after
132
+ * draining the queued tail and releasing the descriptor.
123
133
  *
124
134
  * @returns {Promise<void>}
125
135
  */
126
136
  close() {
127
- return this.flush()
128
- .onComplete(() => Option.of(this.state.file).map(Fs.closeSync))
129
- .toPromise();
137
+ return (this.closing ??= this.flush()
138
+ .map(() => {
139
+ Option.of(this.state.file).map(Fs.closeSync);
140
+ this.state.file = null;
141
+ this.state.ready = false;
142
+ if (this.state.error) {
143
+ throw this.state.error;
144
+ }
145
+ })
146
+ .toPromise());
130
147
  }
131
148
  get queue() {
132
149
  return this.state.queue;
@@ -145,7 +162,12 @@ export class FileAppender {
145
162
  */
146
163
  flush() {
147
164
  const { state } = this;
148
- return Future.do(async () => {
165
+ if (this.pendingFlush) {
166
+ return this.pendingFlush;
167
+ }
168
+ return (this.pendingFlush = Future.do(async () => {
169
+ // Defer the drain until pendingFlush owns it, including an empty queue.
170
+ await Promise.resolve();
149
171
  state.flushing = true;
150
172
  try {
151
173
  const { file } = this;
@@ -154,8 +176,14 @@ export class FileAppender {
154
176
  }
155
177
  while (this.queue.length) {
156
178
  const buf = this.queue.shift();
157
- await Bluebird.fromCallback(cb => Fs.appendFile(file, buf, "utf-8", cb));
158
- state.currentSize += buf.byteLength;
179
+ try {
180
+ await Bluebird.fromCallback(cb => Fs.appendFile(file, buf, "utf-8", cb));
181
+ state.currentSize += buf.byteLength;
182
+ }
183
+ catch (err) {
184
+ // Keep draining the queued tail, but close must report lost writes.
185
+ state.error ??= err;
186
+ }
159
187
  }
160
188
  const { maxSize } = this.config;
161
189
  if (maxSize > 0 && state.currentSize >= maxSize) {
@@ -164,22 +192,25 @@ export class FileAppender {
164
192
  //await Bluebird.fromCallback((cb) => Fs.fdatasync(this.file, cb))
165
193
  }
166
194
  catch (err) {
167
- console.error(`Failed to append file ${this.filename}`, err);
195
+ state.error ??= err;
168
196
  }
169
197
  finally {
170
198
  this.state.flushing = false;
171
- if (this.queue.length) {
172
- queueMicrotask(() => this.flush());
173
- }
199
+ this.pendingFlush = null;
174
200
  }
175
- });
201
+ return true;
202
+ }));
176
203
  }
177
204
  /**
178
205
  * Handle log records, transform, push to ES
179
206
  *
180
207
  * @param record
208
+ * @throws When shutdown has started; a closed descriptor cannot accept records.
181
209
  */
182
210
  append(record) {
211
+ if (this.closing) {
212
+ throw Error(`${this.filename} is closing or closed`);
213
+ }
183
214
  try {
184
215
  const { queue, filename } = this.state;
185
216
  const count = queue.length;
@@ -211,4 +242,4 @@ export class FileAppender {
211
242
  // return this
212
243
  }
213
244
  }
214
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZUFwcGVuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL25vZGUvbG9nZ2luZy9hcHBlbmRlcnMvRmlsZUFwcGVuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNuRCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUM1QixPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQTtBQUd4QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDL0IsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBQ3pCLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQTtBQUUvQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFBO0FBRTNCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO0FBQzlDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQTtBQUMvRCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUU7QUFDL0UsTUFBTSxnQkFBZ0IsR0FBRyxHQUF1QixFQUFFLENBQUMsQ0FBQztJQUNsRCxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDO0lBQ3ZDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxZQUFZO0lBQ2xELE9BQU8sRUFBRSxDQUFDLENBQUM7SUFD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QyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQzFCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7WUFDN0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ2QsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQzdDLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWSxVQUFnRCxFQUFFO1FBQzVELElBQUksQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDakIsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtTQUMvQixDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDWixLQUFLLENBQUMsc0NBQXNDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUNsRSxtQkFBbUI7SUFDckIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXNzaWduLCBkZWZhdWx0cywgcGFkU3RhcnQgfSBmcm9tIFwibG9kYXNoXCJcbmltcG9ydCAqIGFzIFBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0ICogYXMgRnMgZnJvbSBcImZzXCJcbmltcG9ydCB0eXBlIHsgTG9nUmVjb3JkIH0gZnJvbSBcIi4uLy4uLy4uL2xvZ2dpbmcvTG9nUmVjb3JkLmpzXCJcbmltcG9ydCB0eXBlIHsgQXBwZW5kZXIgfSBmcm9tIFwiLi4vLi4vLi4vbG9nZ2luZy9BcHBlbmRlci5qc1wiXG5pbXBvcnQgeyBPcHRpb24sIEZ1dHVyZSB9IGZyb20gXCJAM2Z2L3ByZWx1ZGUtdHNcIlxuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcImJ1ZmZlclwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCBCbHVlYmlyZCBmcm9tIFwiYmx1ZWJpcmRcIlxuXG5jb25zdCBGc0FzeW5jID0gRnMucHJvbWlzZXNcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcIjNmdjpsb2dnZXI6RmlsZUFwcGVuZGVyXCIpXG5jb25zdCBvc1RlbXBEaXIgPSBwcm9jZXNzLmVudi5UTVAgPz8gcHJvY2Vzcy5lbnYuVEVNUCA/PyBcIi90bXBcIlxuY29uc3QgdGVtcERpciA9IEZzLm1rZHRlbXBTeW5jKFBhdGguam9pbihvc1RlbXBEaXIsIFwibG9nZ2VyLXByb3h5LWV4YW1wbGVcIikpIC8vXG5jb25zdCBnZXREZWZhdWx0Q29uZmlnID0gKCk6IEZpbGVBcHBlbmRlckNvbmZpZyA9PiAoe1xuICBmaWxlbmFtZTogUGF0aC5qb2luKHRlbXBEaXIsIFwiYXBwLmxvZ1wiKSxcbiAgcHJldHR5UHJpbnQ6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIixcbiAgbWF4U2l6ZTogLTEsXG4gIG1heEZpbGVzOiA1LFxuICBlbmFibGVSb2xsaW5nOiBmYWxzZSxcbiAgc3luYzogZmFsc2Vcbn0pXG5cbmZ1bmN0aW9uIGFwcGx5Q29uZmlnRGVmYXVsdHMob3B0aW9uczogRmlsZUFwcGVuZGVyT3B0aW9ucyk6IEZpbGVBcHBlbmRlckNvbmZpZyB7XG4gIHJldHVybiBkZWZhdWx0cyhvcHRpb25zLCBnZXREZWZhdWx0Q29uZmlnKCkpXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUFwcGVuZGVyQ29uZmlnPFJlY29yZCBleHRlbmRzIExvZ1JlY29yZCA9IGFueT4ge1xuICBmaWxlbmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEZvciByb2xsaW5nXG4gICAqL1xuICBtYXhGaWxlczogbnVtYmVyXG5cbiAgLyoqXG4gICAqIEZvciByb2xsaW5nXG4gICAqL1xuICBtYXhTaXplOiBudW1iZXJcblxuICBlbmFibGVSb2xsaW5nOiBib29sZWFuXG4gIHByZXR0eVByaW50OiBib29sZWFuXG4gIHN5bmM6IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgRmlsZUFwcGVuZGVyT3B0aW9uczxSZWNvcmQgZXh0ZW5kcyBMb2dSZWNvcmQgPSBhbnk+ID0gUGFydGlhbDxcbiAgRmlsZUFwcGVuZGVyQ29uZmlnPFJlY29yZD5cbj5cblxuZXhwb3J0IGNsYXNzIEZpbGVBcHBlbmRlcjxcbiAgUmVjb3JkIGV4dGVuZHMgTG9nUmVjb3JkXG4+IGltcGxlbWVudHMgQXBwZW5kZXI8UmVjb3JkPiB7XG4gIHJlYWRvbmx5IGNvbmZpZzogRmlsZUFwcGVuZGVyQ29uZmlnPFJlY29yZD5cblxuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlOiB7XG4gICAgZmlsZW5hbWU6IHN0cmluZ1xuICAgIGZpbGU6IG51bWJlclxuICAgIGZsdXNoaW5nOiBib29sZWFuXG4gICAgcXVldWU6IEFycmF5PEJ1ZmZlcj5cbiAgICByZWFkeTogYm9vbGVhblxuICAgIGVycm9yPzogRXJyb3JcbiAgICBjdXJyZW50U2l6ZTogbnVtYmVyXG4gICAgYXJjaGl2ZWRGaWxlbmFtZXM6IHN0cmluZ1tdXG4gIH0gPSB7XG4gICAgYXJjaGl2ZWRGaWxlbmFtZXM6IFtdLFxuICAgIGZpbGVuYW1lOiB1bmRlZmluZWQsXG4gICAgZmlsZTogdW5kZWZpbmVkLFxuICAgIHJlYWR5OiBmYWxzZSxcbiAgICBjdXJyZW50U2l6ZTogMCxcbiAgICBmbHVzaGluZzogZmFsc2UsXG4gICAgcXVldWU6IFtdXG4gIH1cblxuICBnZXQgZW5hYmxlUm9sbGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZW5hYmxlUm9sbGluZ1xuICB9XG5cbiAgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5yZWFkeVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYW5kIHNldHVwIHRoZSBhcHBlbmRlclxuICAgKlxuICAgKiBAcmV0dXJucyB7RmlsZUFwcGVuZGVyPFJlY29yZD59XG4gICAqL1xuICBzZXR1cCgpOiBGaWxlQXBwZW5kZXI8UmVjb3JkPiB7XG4gICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpc1xuICAgIGlmICghIXN0YXRlLnJlYWR5KSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGZpbGVuYW1lIH0gPSB0aGlzXG4gICAgICBjb25zdCBmaWxlID0gRnMub3BlblN5bmMoZmlsZW5hbWUsIFwiYVwiKVxuXG4gICAgICBhc3NpZ24oc3RhdGUsIHtcbiAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgIGZpbGUsXG4gICAgICAgIHJlYWR5OiB0cnVlXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYXNzaWduKHN0YXRlLCB7XG4gICAgICAgIGVycm9yOiBlcnIsXG4gICAgICAgIGZpbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgcmVhZHk6IGZhbHNlXG4gICAgICB9KVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9ubHkgZXhwb3NlZCBmb3IgdGhlIHNha2Ugb2YgdGVzdHMgJiBleGFtcGxlc1xuICAgKiBETyBOT1QgVVNFXG4gICAqXG4gICAqIFRoaXMgc2hvdWxkIGFsbCBiZSBhc3luYywgYnV0IGkgd2FzIGluIGEgcnVzaCA6KFxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcm9sbEZpbGUoKSB7XG4gICAgY29uc3QgeyBzdGF0ZSwgY29uZmlnIH0gPSB0aGlzXG4gICAgbGV0IHsgZmlsZSwgZmlsZW5hbWUsIGFyY2hpdmVkRmlsZW5hbWVzIH0gPSBzdGF0ZVxuICAgIGlmICghdGhpcy5pc1JlYWR5KCkgfHwgIWZpbGUpIHtcbiAgICAgIGRlYnVnKGBDYW4gbm90IHJvbGwgZmlsZSBiZWZvcmUgcmVhZHlgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmVuYWJsZVJvbGxpbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGZpbGVDb3VudCA9IGFyY2hpdmVkRmlsZW5hbWVzLmxlbmd0aCArIDFcbiAgICBpZiAoY29uZmlnLm1heEZpbGVzIDwgMSB8fCBmaWxlQ291bnQgPCBjb25maWcubWF4RmlsZXMpIHtcbiAgICAgIGFyY2hpdmVkRmlsZW5hbWVzLnB1c2goXG4gICAgICAgIGZpbGVuYW1lICsgXCIuXCIgKyBwYWRTdGFydChmaWxlQ291bnQudG9TdHJpbmcoMTApLCA0LCBcIjBcIilcbiAgICAgIClcbiAgICB9XG4gICAgRnMuZmRhdGFzeW5jU3luYyhmaWxlKVxuICAgIEZzLmNsb3NlU3luYyhmaWxlKVxuICAgIGZpbGUgPSBzdGF0ZS5maWxlID0gdW5kZWZpbmVkXG4gICAgY29uc3QgZmlsZW5hbWVzID0gW2ZpbGVuYW1lLCAuLi5hcmNoaXZlZEZpbGVuYW1lc11cblxuICAgIGxldCBkZXN0OiBzdHJpbmcgPSBmaWxlbmFtZXMucG9wKClcbiAgICB3aGlsZSAoZmlsZW5hbWVzLmxlbmd0aCkge1xuICAgICAgbGV0IHNyYyA9IGZpbGVuYW1lcy5wb3AoKVxuICAgICAgaWYgKCFGcy5leGlzdHNTeW5jKHNyYykpIHtcbiAgICAgICAgZGVidWcoYHNyYyBkb2VzIG5vdCBleGlzdCwgc2tpcHBpbmcgJHtzcmN9YClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlYnVnKGBNb3Zpbmcgc3JjICgke3NyY30pIHRvIGRlc3QgKCR7ZGVzdH0pYClcbiAgICAgICAgaWYgKEZzLmV4aXN0c1N5bmMoZGVzdCkpIHtcbiAgICAgICAgICBGcy51bmxpbmtTeW5jKGRlc3QpXG4gICAgICAgIH1cbiAgICAgICAgRnMucmVuYW1lU3luYyhzcmMsIGRlc3QpXG4gICAgICAgIC8vIGlmIChzcmMgPT09IGZpbGVuYW1lKSB7XG4gICAgICAgIC8vICAgRnMuY29weUZpbGVTeW5jKHNyYywgZGVzdClcbiAgICAgICAgLy8gICBGcy50cnVuY2F0ZVN5bmMoc3JjLCAwKVxuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgIEZzLnJlbmFtZVN5bmMoc3JjLCBkZXN0KVxuICAgICAgICAvLyB9XG4gICAgICB9XG4gICAgICBkZXN0ID0gc3JjXG4gICAgfVxuXG4gICAgYXNzaWduKHN0YXRlLCB7XG4gICAgICBjdXJyZW50U2l6ZTogMCxcbiAgICAgIGZpbGU6IEZzLm9wZW5TeW5jKGZpbGVuYW1lLCBcImFcIilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBoYW5kbGVyXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmx1c2goKVxuICAgICAgLm9uQ29tcGxldGUoKCkgPT4gT3B0aW9uLm9mKHRoaXMuc3RhdGUuZmlsZSkubWFwKEZzLmNsb3NlU3luYykpXG4gICAgICAudG9Qcm9taXNlKClcbiAgfVxuXG4gIGdldCBxdWV1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5xdWV1ZVxuICB9XG5cbiAgZ2V0IGZpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZmlsZVxuICB9XG5cbiAgZ2V0IGZsdXNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmZsdXNoaW5nXG4gIH1cblxuICBnZXQgZmlsZW5hbWUoKSB7XG4gICAgcmV0dXJuICh0aGlzLnN0YXRlLmZpbGVuYW1lID0gdGhpcy5zdGF0ZS5maWxlbmFtZSA/PyB0aGlzLmNvbmZpZy5maWxlbmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIHRoZSBsb2cgcXVldWUgcmVjb3JkcyB0byB0aGUgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBmbHVzaCgpIHtcbiAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzXG4gICAgcmV0dXJuIEZ1dHVyZS5kbyhhc3luYyAoKSA9PiB7XG4gICAgICBzdGF0ZS5mbHVzaGluZyA9IHRydWVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgZmlsZSB9ID0gdGhpc1xuICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihgJHt0aGlzLmZpbGVuYW1lfSB3YXMgbm90IG9wZW5lZCBwcm9wZXJseWApXG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgYnVmOiBCdWZmZXIgPSB0aGlzLnF1ZXVlLnNoaWZ0KClcblxuICAgICAgICAgIGF3YWl0IEJsdWViaXJkLmZyb21DYWxsYmFjayhjYiA9PlxuICAgICAgICAgICAgRnMuYXBwZW5kRmlsZShmaWxlLCBidWYsIFwidXRmLThcIiwgY2IpXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgc3RhdGUuY3VycmVudFNpemUgKz0gYnVmLmJ5dGVMZW5ndGhcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgbWF4U2l6ZSB9ID0gdGhpcy5jb25maWdcbiAgICAgICAgaWYgKG1heFNpemUgPiAwICYmIHN0YXRlLmN1cnJlbnRTaXplID49IG1heFNpemUpIHtcbiAgICAgICAgICB0aGlzLnJvbGxGaWxlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vYXdhaXQgQmx1ZWJpcmQuZnJvbUNhbGxiYWNrKChjYikgPT4gRnMuZmRhdGFzeW5jKHRoaXMuZmlsZSwgY2IpKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBhcHBlbmQgZmlsZSAke3RoaXMuZmlsZW5hbWV9YCwgZXJyKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5zdGF0ZS5mbHVzaGluZyA9IGZhbHNlXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuZmx1c2goKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGxvZyByZWNvcmRzLCB0cmFuc2Zvcm0sIHB1c2ggdG8gRVNcbiAgICpcbiAgICogQHBhcmFtIHJlY29yZFxuICAgKi9cbiAgYXBwZW5kKHJlY29yZDogUmVjb3JkKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgcXVldWUsIGZpbGVuYW1lIH0gPSB0aGlzLnN0YXRlXG4gICAgICBjb25zdCBjb3VudCA9IHF1ZXVlLmxlbmd0aFxuICAgICAgaWYgKGNvdW50ID4gOTk5KSB7XG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgIGBUb28gbWFueSBsb2cgcmVjb3JkcyAoJHtjb3VudH0pIGFyZSBpbiB0aGUgcXVldWUgd2l0aG91dCB0aGUgZmlsZSAoJHtmaWxlbmFtZX0pIG9wZW5pbmcsIHNraXBwaW5nICVPYCxcbiAgICAgICAgICByZWNvcmRcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY29uZmlnLnByZXR0eVByaW50XG4gICAgICAgID8gSlNPTi5zdHJpbmdpZnkocmVjb3JkLCBudWxsLCAyKVxuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHJlY29yZClcbiAgICAgIHF1ZXVlLnB1c2goQnVmZmVyLmZyb20oZGF0YSArIFwiXFxuXCIsIFwidXRmLThcIikpXG4gICAgICB0aGlzLmZsdXNoKClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHN5bmNocm9uaXplIGAsIGVycilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEZpbGVBcHBlbmRlck9wdGlvbnM8UmVjb3JkPj59IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFBhcnRpYWw8RmlsZUFwcGVuZGVyT3B0aW9uczxSZWNvcmQ+PiA9IHt9KSB7XG4gICAgdGhpcy5jb25maWcgPSBhcHBseUNvbmZpZ0RlZmF1bHRzKG9wdGlvbnMpXG5cbiAgICBhc3NpZ24odGhpcy5zdGF0ZSwge1xuICAgICAgZmlsZW5hbWU6IHRoaXMuY29uZmlnLmZpbGVuYW1lXG4gICAgfSlcblxuICAgIHRoaXMuc2V0dXAoKVxuICAgIGRlYnVnKGBGaWxlIGFwcGVuZGVyIGlzIHJlYWR5LCBsb2dnaW5nIHRvICR7dGhpcy5zdGF0ZS5maWxlbmFtZX1gKVxuICAgIC8vICAgICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuIl19
245
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZUFwcGVuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL25vZGUvbG9nZ2luZy9hcHBlbmRlcnMvRmlsZUFwcGVuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNuRCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUM1QixPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQTtBQUd4QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDL0IsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBQ3pCLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQTtBQUUvQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFBO0FBRTNCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO0FBQzlDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQTtBQUMvRCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUU7QUFDL0UsTUFBTSxnQkFBZ0IsR0FBRyxHQUF1QixFQUFFLENBQUMsQ0FBQztJQUNsRCxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDO0lBQ3ZDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxZQUFZO0lBQ2xELE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDWCxRQUFRLEVBQUUsQ0FBQztJQUNYLGFBQWEsRUFBRSxLQUFLO0lBQ3BCLElBQUksRUFBRSxLQUFLO0NBQ1osQ0FBQyxDQUFBO0FBRUYsU0FBUyxtQkFBbUIsQ0FBQyxPQUE0QjtJQUN2RCxPQUFPLFFBQVEsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFBO0FBQzlDLENBQUM7QUF3QkQsTUFBTSxPQUFPLFlBQVk7SUFHZCxNQUFNLENBQTRCO0lBRTFCLEtBQUssR0FTbEI7UUFDRixpQkFBaUIsRUFBRSxFQUFFO1FBQ3JCLFFBQVEsRUFBRSxTQUFTO1FBQ25CLElBQUksRUFBRSxTQUFTO1FBQ2YsS0FBSyxFQUFFLEtBQUs7UUFDWixXQUFXLEVBQUUsQ0FBQztRQUNkLFFBQVEsRUFBRSxLQUFLO1FBQ2YsS0FBSyxFQUFFLEVBQUU7S0FDVixDQUFBO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQTtJQUNsQyxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUE7SUFDekIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSztRQUNILE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUE7UUFDdEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSx1QkFBdUIsQ0FBQyxDQUFBO1FBQ3RELENBQUM7UUFDRCxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQTtZQUN6QixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUV2QyxNQUFNLENBQUMsS0FBSyxFQUFFO2dCQUNaLFFBQVE7Z0JBQ1IsSUFBSTtnQkFDSixLQUFLLEVBQUUsSUFBSTthQUNaLENBQUMsQ0FBQTtZQUVGLE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLENBQUMsS0FBSyxFQUFFO2dCQUNaLEtBQUssRUFBRSxHQUFHO2dCQUNWLElBQUksRUFBRSxTQUFTO2dCQUNmLEtBQUssRUFBRSxLQUFLO2FBQ2IsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxHQUFHLENBQUE7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxRQUFRO1FBQ04sTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUE7UUFDOUIsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxLQUFLLENBQUE7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzdCLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFBO1lBQ3ZDLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7UUFDOUMsSUFBSSxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZELGlCQUFpQixDQUFDLElBQUksQ0FDcEIsUUFBUSxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQzFELENBQUE7UUFDSCxDQUFDO1FBQ0QsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN0QixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2xCLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQTtRQUM3QixNQUFNLFNBQVMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLGlCQUFpQixDQUFDLENBQUE7UUFFbEQsSUFBSSxJQUFJLEdBQVcsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ2xDLE9BQU8sU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtZQUN6QixJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUMsZ0NBQWdDLEdBQUcsRUFBRSxDQUFDLENBQUE7WUFDOUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssQ0FBQyxlQUFlLEdBQUcsY0FBYyxJQUFJLEdBQUcsQ0FBQyxDQUFBO2dCQUM5QyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDckIsQ0FBQztnQkFDRCxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQTtnQkFDeEIsMEJBQTBCO2dCQUMxQiwrQkFBK0I7Z0JBQy9CLDRCQUE0QjtnQkFDNUIsV0FBVztnQkFDWCw2QkFBNkI7Z0JBQzdCLElBQUk7WUFDTixDQUFDO1lBQ0QsSUFBSSxHQUFHLEdBQUcsQ0FBQTtRQUNaLENBQUM7UUFFRCxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQ1osV0FBVyxFQUFFLENBQUM7WUFDZCxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO1NBQ2pDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCw0RUFBNEU7SUFDcEUsWUFBWSxDQUFpQjtJQUVyQyx3RUFBd0U7SUFDaEUsT0FBTyxDQUFlO0lBRTlCOzs7Ozs7T0FNRztJQUNILEtBQUs7UUFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFO2FBQ2xDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUixNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7WUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1lBQ3hCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQTtZQUN4QixDQUFDO1FBQ0gsQ0FBQyxDQUFDO2FBQ0QsU0FBUyxFQUFFLENBQUMsQ0FBQTtJQUNqQixDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQTtJQUN6QixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQTtJQUN4QixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQTtJQUM1QixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDNUUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSztRQUNYLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUE7UUFDdEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFBO1FBQzFCLENBQUM7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQy9DLHdFQUF3RTtZQUN4RSxNQUFNLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUN2QixLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtZQUNyQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQTtnQkFDckIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNWLE1BQU0sS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsMEJBQTBCLENBQUMsQ0FBQTtnQkFDekQsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3pCLE1BQU0sR0FBRyxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUE7b0JBRXRDLElBQUksQ0FBQzt3QkFDSCxNQUFNLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FDL0IsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FDdEMsQ0FBQTt3QkFDRCxLQUFLLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUE7b0JBQ3JDLENBQUM7b0JBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQzt3QkFDYixvRUFBb0U7d0JBQ3BFLEtBQUssQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFBO29CQUNyQixDQUFDO2dCQUNILENBQUM7Z0JBRUQsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUE7Z0JBQy9CLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNoRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUE7Z0JBQ2pCLENBQUM7Z0JBRUQsa0VBQWtFO1lBQ3BFLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLEtBQUssQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFBO1lBQ3JCLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUE7Z0JBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFBO1lBQzFCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQTtRQUNiLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsTUFBYztRQUNuQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLHVCQUF1QixDQUFDLENBQUE7UUFDdEQsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQTtZQUN0QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFBO1lBQzFCLElBQUksS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixLQUFLLENBQ0gseUJBQXlCLEtBQUssd0NBQXdDLFFBQVEsd0JBQXdCLEVBQ3RHLE1BQU0sQ0FDUCxDQUFBO2dCQUNELE9BQU07WUFDUixDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXO2dCQUNsQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDMUIsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtZQUM3QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDZCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZLFVBQWdELEVBQUU7UUFDNUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUUxQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNqQixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO1NBQy9CLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNaLEtBQUssQ0FBQyxzQ0FBc0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBQ2xFLG1CQUFtQjtJQUNyQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NpZ24sIGRlZmF1bHRzLCBwYWRTdGFydCB9IGZyb20gXCJsb2Rhc2hcIlxuaW1wb3J0ICogYXMgUGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgKiBhcyBGcyBmcm9tIFwiZnNcIlxuaW1wb3J0IHR5cGUgeyBMb2dSZWNvcmQgfSBmcm9tIFwiLi4vLi4vLi4vbG9nZ2luZy9Mb2dSZWNvcmQuanNcIlxuaW1wb3J0IHR5cGUgeyBBcHBlbmRlciB9IGZyb20gXCIuLi8uLi8uLi9sb2dnaW5nL0FwcGVuZGVyLmpzXCJcbmltcG9ydCB7IE9wdGlvbiwgRnV0dXJlIH0gZnJvbSBcIkAzZnYvcHJlbHVkZS10c1wiXG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tIFwiYnVmZmVyXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IEJsdWViaXJkIGZyb20gXCJibHVlYmlyZFwiXG5cbmNvbnN0IEZzQXN5bmMgPSBGcy5wcm9taXNlc1xuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwiM2Z2OmxvZ2dlcjpGaWxlQXBwZW5kZXJcIilcbmNvbnN0IG9zVGVtcERpciA9IHByb2Nlc3MuZW52LlRNUCA/PyBwcm9jZXNzLmVudi5URU1QID8/IFwiL3RtcFwiXG5jb25zdCB0ZW1wRGlyID0gRnMubWtkdGVtcFN5bmMoUGF0aC5qb2luKG9zVGVtcERpciwgXCJsb2dnZXItcHJveHktZXhhbXBsZVwiKSkgLy9cbmNvbnN0IGdldERlZmF1bHRDb25maWcgPSAoKTogRmlsZUFwcGVuZGVyQ29uZmlnID0+ICh7XG4gIGZpbGVuYW1lOiBQYXRoLmpvaW4odGVtcERpciwgXCJhcHAubG9nXCIpLFxuICBwcmV0dHlQcmludDogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiLFxuICBtYXhTaXplOiAtMSxcbiAgbWF4RmlsZXM6IDUsXG4gIGVuYWJsZVJvbGxpbmc6IGZhbHNlLFxuICBzeW5jOiBmYWxzZVxufSlcblxuZnVuY3Rpb24gYXBwbHlDb25maWdEZWZhdWx0cyhvcHRpb25zOiBGaWxlQXBwZW5kZXJPcHRpb25zKTogRmlsZUFwcGVuZGVyQ29uZmlnIHtcbiAgcmV0dXJuIGRlZmF1bHRzKG9wdGlvbnMsIGdldERlZmF1bHRDb25maWcoKSlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlQXBwZW5kZXJDb25maWc8UmVjb3JkIGV4dGVuZHMgTG9nUmVjb3JkID0gYW55PiB7XG4gIGZpbGVuYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogRm9yIHJvbGxpbmdcbiAgICovXG4gIG1heEZpbGVzOiBudW1iZXJcblxuICAvKipcbiAgICogRm9yIHJvbGxpbmdcbiAgICovXG4gIG1heFNpemU6IG51bWJlclxuXG4gIGVuYWJsZVJvbGxpbmc6IGJvb2xlYW5cbiAgcHJldHR5UHJpbnQ6IGJvb2xlYW5cbiAgc3luYzogYm9vbGVhblxufVxuXG5leHBvcnQgdHlwZSBGaWxlQXBwZW5kZXJPcHRpb25zPFJlY29yZCBleHRlbmRzIExvZ1JlY29yZCA9IGFueT4gPSBQYXJ0aWFsPFxuICBGaWxlQXBwZW5kZXJDb25maWc8UmVjb3JkPlxuPlxuXG5leHBvcnQgY2xhc3MgRmlsZUFwcGVuZGVyPFxuICBSZWNvcmQgZXh0ZW5kcyBMb2dSZWNvcmRcbj4gaW1wbGVtZW50cyBBcHBlbmRlcjxSZWNvcmQ+IHtcbiAgcmVhZG9ubHkgY29uZmlnOiBGaWxlQXBwZW5kZXJDb25maWc8UmVjb3JkPlxuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGU6IHtcbiAgICBmaWxlbmFtZTogc3RyaW5nXG4gICAgZmlsZTogbnVtYmVyXG4gICAgZmx1c2hpbmc6IGJvb2xlYW5cbiAgICBxdWV1ZTogQXJyYXk8QnVmZmVyPlxuICAgIHJlYWR5OiBib29sZWFuXG4gICAgZXJyb3I/OiBFcnJvclxuICAgIGN1cnJlbnRTaXplOiBudW1iZXJcbiAgICBhcmNoaXZlZEZpbGVuYW1lczogc3RyaW5nW11cbiAgfSA9IHtcbiAgICBhcmNoaXZlZEZpbGVuYW1lczogW10sXG4gICAgZmlsZW5hbWU6IHVuZGVmaW5lZCxcbiAgICBmaWxlOiB1bmRlZmluZWQsXG4gICAgcmVhZHk6IGZhbHNlLFxuICAgIGN1cnJlbnRTaXplOiAwLFxuICAgIGZsdXNoaW5nOiBmYWxzZSxcbiAgICBxdWV1ZTogW11cbiAgfVxuXG4gIGdldCBlbmFibGVSb2xsaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5lbmFibGVSb2xsaW5nXG4gIH1cblxuICBpc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLnJlYWR5XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhbmQgc2V0dXAgdGhlIGFwcGVuZGVyXG4gICAqXG4gICAqIEB0aHJvd3MgV2hlbiBzaHV0ZG93biBoYXMgc3RhcnRlZDsgY2xvc2VkIGFwcGVuZGVycyBjYW5ub3QgYmUgcmVvcGVuZWQuXG4gICAqIEByZXR1cm5zIHtGaWxlQXBwZW5kZXI8UmVjb3JkPn1cbiAgICovXG4gIHNldHVwKCk6IEZpbGVBcHBlbmRlcjxSZWNvcmQ+IHtcbiAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzXG4gICAgaWYgKHRoaXMuY2xvc2luZykge1xuICAgICAgdGhyb3cgRXJyb3IoYCR7dGhpcy5maWxlbmFtZX0gaXMgY2xvc2luZyBvciBjbG9zZWRgKVxuICAgIH1cbiAgICBpZiAoISFzdGF0ZS5yZWFkeSkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBmaWxlbmFtZSB9ID0gdGhpc1xuICAgICAgY29uc3QgZmlsZSA9IEZzLm9wZW5TeW5jKGZpbGVuYW1lLCBcImFcIilcblxuICAgICAgYXNzaWduKHN0YXRlLCB7XG4gICAgICAgIGZpbGVuYW1lLFxuICAgICAgICBmaWxlLFxuICAgICAgICByZWFkeTogdHJ1ZVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGFzc2lnbihzdGF0ZSwge1xuICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgICBmaWxlOiB1bmRlZmluZWQsXG4gICAgICAgIHJlYWR5OiBmYWxzZVxuICAgICAgfSlcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPbmx5IGV4cG9zZWQgZm9yIHRoZSBzYWtlIG9mIHRlc3RzICYgZXhhbXBsZXNcbiAgICogRE8gTk9UIFVTRVxuICAgKlxuICAgKiBUaGlzIHNob3VsZCBhbGwgYmUgYXN5bmMsIGJ1dCBpIHdhcyBpbiBhIHJ1c2ggOihcbiAgICpcbiAgICogQHJldHVybnNcbiAgICovXG4gIHJvbGxGaWxlKCkge1xuICAgIGNvbnN0IHsgc3RhdGUsIGNvbmZpZyB9ID0gdGhpc1xuICAgIGxldCB7IGZpbGUsIGZpbGVuYW1lLCBhcmNoaXZlZEZpbGVuYW1lcyB9ID0gc3RhdGVcbiAgICBpZiAoIXRoaXMuaXNSZWFkeSgpIHx8ICFmaWxlKSB7XG4gICAgICBkZWJ1ZyhgQ2FuIG5vdCByb2xsIGZpbGUgYmVmb3JlIHJlYWR5YClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5lbmFibGVSb2xsaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQ291bnQgPSBhcmNoaXZlZEZpbGVuYW1lcy5sZW5ndGggKyAxXG4gICAgaWYgKGNvbmZpZy5tYXhGaWxlcyA8IDEgfHwgZmlsZUNvdW50IDwgY29uZmlnLm1heEZpbGVzKSB7XG4gICAgICBhcmNoaXZlZEZpbGVuYW1lcy5wdXNoKFxuICAgICAgICBmaWxlbmFtZSArIFwiLlwiICsgcGFkU3RhcnQoZmlsZUNvdW50LnRvU3RyaW5nKDEwKSwgNCwgXCIwXCIpXG4gICAgICApXG4gICAgfVxuICAgIEZzLmZkYXRhc3luY1N5bmMoZmlsZSlcbiAgICBGcy5jbG9zZVN5bmMoZmlsZSlcbiAgICBmaWxlID0gc3RhdGUuZmlsZSA9IHVuZGVmaW5lZFxuICAgIGNvbnN0IGZpbGVuYW1lcyA9IFtmaWxlbmFtZSwgLi4uYXJjaGl2ZWRGaWxlbmFtZXNdXG5cbiAgICBsZXQgZGVzdDogc3RyaW5nID0gZmlsZW5hbWVzLnBvcCgpXG4gICAgd2hpbGUgKGZpbGVuYW1lcy5sZW5ndGgpIHtcbiAgICAgIGxldCBzcmMgPSBmaWxlbmFtZXMucG9wKClcbiAgICAgIGlmICghRnMuZXhpc3RzU3luYyhzcmMpKSB7XG4gICAgICAgIGRlYnVnKGBzcmMgZG9lcyBub3QgZXhpc3QsIHNraXBwaW5nICR7c3JjfWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWJ1ZyhgTW92aW5nIHNyYyAoJHtzcmN9KSB0byBkZXN0ICgke2Rlc3R9KWApXG4gICAgICAgIGlmIChGcy5leGlzdHNTeW5jKGRlc3QpKSB7XG4gICAgICAgICAgRnMudW5saW5rU3luYyhkZXN0KVxuICAgICAgICB9XG4gICAgICAgIEZzLnJlbmFtZVN5bmMoc3JjLCBkZXN0KVxuICAgICAgICAvLyBpZiAoc3JjID09PSBmaWxlbmFtZSkge1xuICAgICAgICAvLyAgIEZzLmNvcHlGaWxlU3luYyhzcmMsIGRlc3QpXG4gICAgICAgIC8vICAgRnMudHJ1bmNhdGVTeW5jKHNyYywgMClcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICBGcy5yZW5hbWVTeW5jKHNyYywgZGVzdClcbiAgICAgICAgLy8gfVxuICAgICAgfVxuICAgICAgZGVzdCA9IHNyY1xuICAgIH1cblxuICAgIGFzc2lnbihzdGF0ZSwge1xuICAgICAgY3VycmVudFNpemU6IDAsXG4gICAgICBmaWxlOiBGcy5vcGVuU3luYyhmaWxlbmFtZSwgXCJhXCIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBUaGUgc2luZ2xlIGRyYWluIHNoYXJlZCBieSBhcHBlbmQgYW5kIGNsb3NlIHdoaWxlIHdyaXRlcyBhcmUgcGVuZGluZy4gKi9cbiAgcHJpdmF0ZSBwZW5kaW5nRmx1c2g6IEZ1dHVyZTxib29sZWFuPlxuXG4gIC8qKiBUaGUgZmlyc3QgY2xvc2Ugb3BlcmF0aW9uOyBhbHNvIHByZXZlbnRzIGFwcGVuZHMgZHVyaW5nIHNodXRkb3duLiAqL1xuICBwcml2YXRlIGNsb3Npbmc6IFByb21pc2U8dm9pZD5cblxuICAvKipcbiAgICogRHJhaW4gYWxsIHF1ZXVlZCBhbmQgaW4tZmxpZ2h0IHdyaXRlcywgdGhlbiBjbG9zZSB0aGUgaGFuZGxlciBvbmNlLlxuICAgKiBSZXBlYXRlZCBjYWxscyBzaGFyZSB0aGUgZmlyc3QgY2xvc2UgcHJvbWlzZS4gV3JpdGUgZmFpbHVyZXMgcmVqZWN0IGl0IGFmdGVyXG4gICAqIGRyYWluaW5nIHRoZSBxdWV1ZWQgdGFpbCBhbmQgcmVsZWFzaW5nIHRoZSBkZXNjcmlwdG9yLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGNsb3NlKCkge1xuICAgIHJldHVybiAodGhpcy5jbG9zaW5nID8/PSB0aGlzLmZsdXNoKClcbiAgICAgIC5tYXAoKCkgPT4ge1xuICAgICAgICBPcHRpb24ub2YodGhpcy5zdGF0ZS5maWxlKS5tYXAoRnMuY2xvc2VTeW5jKVxuICAgICAgICB0aGlzLnN0YXRlLmZpbGUgPSBudWxsXG4gICAgICAgIHRoaXMuc3RhdGUucmVhZHkgPSBmYWxzZVxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgICAgIHRocm93IHRoaXMuc3RhdGUuZXJyb3JcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC50b1Byb21pc2UoKSlcbiAgfVxuXG4gIGdldCBxdWV1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5xdWV1ZVxuICB9XG5cbiAgZ2V0IGZpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZmlsZVxuICB9XG5cbiAgZ2V0IGZsdXNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmZsdXNoaW5nXG4gIH1cblxuICBnZXQgZmlsZW5hbWUoKSB7XG4gICAgcmV0dXJuICh0aGlzLnN0YXRlLmZpbGVuYW1lID0gdGhpcy5zdGF0ZS5maWxlbmFtZSA/PyB0aGlzLmNvbmZpZy5maWxlbmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIHRoZSBsb2cgcXVldWUgcmVjb3JkcyB0byB0aGUgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBmbHVzaCgpIHtcbiAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzXG4gICAgaWYgKHRoaXMucGVuZGluZ0ZsdXNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wZW5kaW5nRmx1c2hcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLnBlbmRpbmdGbHVzaCA9IEZ1dHVyZS5kbyhhc3luYyAoKSA9PiB7XG4gICAgICAvLyBEZWZlciB0aGUgZHJhaW4gdW50aWwgcGVuZGluZ0ZsdXNoIG93bnMgaXQsIGluY2x1ZGluZyBhbiBlbXB0eSBxdWV1ZS5cbiAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpXG4gICAgICBzdGF0ZS5mbHVzaGluZyA9IHRydWVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgZmlsZSB9ID0gdGhpc1xuICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihgJHt0aGlzLmZpbGVuYW1lfSB3YXMgbm90IG9wZW5lZCBwcm9wZXJseWApXG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgYnVmOiBCdWZmZXIgPSB0aGlzLnF1ZXVlLnNoaWZ0KClcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBCbHVlYmlyZC5mcm9tQ2FsbGJhY2soY2IgPT5cbiAgICAgICAgICAgICAgRnMuYXBwZW5kRmlsZShmaWxlLCBidWYsIFwidXRmLThcIiwgY2IpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBzdGF0ZS5jdXJyZW50U2l6ZSArPSBidWYuYnl0ZUxlbmd0aFxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gS2VlcCBkcmFpbmluZyB0aGUgcXVldWVkIHRhaWwsIGJ1dCBjbG9zZSBtdXN0IHJlcG9ydCBsb3N0IHdyaXRlcy5cbiAgICAgICAgICAgIHN0YXRlLmVycm9yID8/PSBlcnJcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IG1heFNpemUgfSA9IHRoaXMuY29uZmlnXG4gICAgICAgIGlmIChtYXhTaXplID4gMCAmJiBzdGF0ZS5jdXJyZW50U2l6ZSA+PSBtYXhTaXplKSB7XG4gICAgICAgICAgdGhpcy5yb2xsRmlsZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvL2F3YWl0IEJsdWViaXJkLmZyb21DYWxsYmFjaygoY2IpID0+IEZzLmZkYXRhc3luYyh0aGlzLmZpbGUsIGNiKSlcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzdGF0ZS5lcnJvciA/Pz0gZXJyXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnN0YXRlLmZsdXNoaW5nID0gZmFsc2VcbiAgICAgICAgdGhpcy5wZW5kaW5nRmx1c2ggPSBudWxsXG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBsb2cgcmVjb3JkcywgdHJhbnNmb3JtLCBwdXNoIHRvIEVTXG4gICAqXG4gICAqIEBwYXJhbSByZWNvcmRcbiAgICogQHRocm93cyBXaGVuIHNodXRkb3duIGhhcyBzdGFydGVkOyBhIGNsb3NlZCBkZXNjcmlwdG9yIGNhbm5vdCBhY2NlcHQgcmVjb3Jkcy5cbiAgICovXG4gIGFwcGVuZChyZWNvcmQ6IFJlY29yZCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NpbmcpIHtcbiAgICAgIHRocm93IEVycm9yKGAke3RoaXMuZmlsZW5hbWV9IGlzIGNsb3Npbmcgb3IgY2xvc2VkYClcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgcXVldWUsIGZpbGVuYW1lIH0gPSB0aGlzLnN0YXRlXG4gICAgICBjb25zdCBjb3VudCA9IHF1ZXVlLmxlbmd0aFxuICAgICAgaWYgKGNvdW50ID4gOTk5KSB7XG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgIGBUb28gbWFueSBsb2cgcmVjb3JkcyAoJHtjb3VudH0pIGFyZSBpbiB0aGUgcXVldWUgd2l0aG91dCB0aGUgZmlsZSAoJHtmaWxlbmFtZX0pIG9wZW5pbmcsIHNraXBwaW5nICVPYCxcbiAgICAgICAgICByZWNvcmRcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY29uZmlnLnByZXR0eVByaW50XG4gICAgICAgID8gSlNPTi5zdHJpbmdpZnkocmVjb3JkLCBudWxsLCAyKVxuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHJlY29yZClcbiAgICAgIHF1ZXVlLnB1c2goQnVmZmVyLmZyb20oZGF0YSArIFwiXFxuXCIsIFwidXRmLThcIikpXG4gICAgICB0aGlzLmZsdXNoKClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHN5bmNocm9uaXplIGAsIGVycilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEZpbGVBcHBlbmRlck9wdGlvbnM8UmVjb3JkPj59IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFBhcnRpYWw8RmlsZUFwcGVuZGVyT3B0aW9uczxSZWNvcmQ+PiA9IHt9KSB7XG4gICAgdGhpcy5jb25maWcgPSBhcHBseUNvbmZpZ0RlZmF1bHRzKG9wdGlvbnMpXG5cbiAgICBhc3NpZ24odGhpcy5zdGF0ZSwge1xuICAgICAgZmlsZW5hbWU6IHRoaXMuY29uZmlnLmZpbGVuYW1lXG4gICAgfSlcblxuICAgIHRoaXMuc2V0dXAoKVxuICAgIGRlYnVnKGBGaWxlIGFwcGVuZGVyIGlzIHJlYWR5LCBsb2dnaW5nIHRvICR7dGhpcy5zdGF0ZS5maWxlbmFtZX1gKVxuICAgIC8vICAgICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=FileAppender.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileAppender.test.d.ts","sourceRoot":"","sources":["../../../../../tests/node/logging/appenders/FileAppender.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Fs = require("node:fs");
7
+ const node_os_1 = __importDefault(require("node:os"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const FileAppender_1 = require("@wireio/shared/node/logging/appenders/FileAppender");
10
+ const Level_1 = require("@wireio/shared/logging/Level");
11
+ /** Exercise shutdown with a real file and an explicitly held asynchronous write. */
12
+ describe("FileAppender shutdown", () => {
13
+ let directory;
14
+ beforeEach(() => {
15
+ directory = Fs.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), "file-appender-"));
16
+ });
17
+ afterEach(() => {
18
+ jest.restoreAllMocks();
19
+ Fs.rmSync(directory, { recursive: true, force: true });
20
+ });
21
+ it("waits for the active write and queued records before closing once", async () => {
22
+ const filename = node_path_1.default.join(directory, "app.log"), appender = new FileAppender_1.FileAppender({ filename, prettyPrint: false }), originalAppend = Fs.appendFile, originalClose = Fs.closeSync, descriptor = appender.file;
23
+ let releaseWrite;
24
+ let notifyStarted;
25
+ const started = new Promise(resolve => {
26
+ notifyStarted = resolve;
27
+ });
28
+ const append = jest
29
+ .spyOn(Fs, "appendFile")
30
+ .mockImplementationOnce((...args) => {
31
+ releaseWrite = () => originalAppend(...args);
32
+ notifyStarted();
33
+ });
34
+ const close = jest.spyOn(Fs, "closeSync").mockImplementation(originalClose);
35
+ const first = {
36
+ timestamp: Date.now(),
37
+ category: "test",
38
+ level: Level_1.Level.info,
39
+ message: "first"
40
+ }, second = { ...first, message: "second" };
41
+ appender.append(first);
42
+ await started;
43
+ appender.append(second);
44
+ const closing = appender.close();
45
+ let settled = false;
46
+ void closing.then(() => {
47
+ settled = true;
48
+ });
49
+ try {
50
+ await new Promise(resolve => setImmediate(resolve));
51
+ expect(settled).toBe(false);
52
+ expect(close).not.toHaveBeenCalled();
53
+ expect(append).toHaveBeenCalledTimes(1);
54
+ expect(appender.close()).toBe(closing);
55
+ }
56
+ finally {
57
+ releaseWrite();
58
+ await closing;
59
+ }
60
+ expect(Fs.readFileSync(filename, "utf8")
61
+ .trim()
62
+ .split("\n")
63
+ .map(line => JSON.parse(line).message)).toEqual(["first", "second"]);
64
+ expect(close.mock.calls.filter(([file]) => file === descriptor)).toHaveLength(1);
65
+ expect(appender.isReady()).toBe(false);
66
+ expect(() => appender.append(first)).toThrow("closing or closed");
67
+ });
68
+ it("drains the queued tail and rejects close after a failed write", async () => {
69
+ const filename = node_path_1.default.join(directory, "failed.log"), appender = new FileAppender_1.FileAppender({ filename, prettyPrint: false }), failure = new Error("write failed"), first = {
70
+ timestamp: Date.now(),
71
+ category: "test",
72
+ level: Level_1.Level.info,
73
+ message: "first"
74
+ }, second = { ...first, message: "second" };
75
+ let failWrite;
76
+ let notifyStarted;
77
+ const started = new Promise(resolve => {
78
+ notifyStarted = resolve;
79
+ });
80
+ jest
81
+ .spyOn(Fs, "appendFile")
82
+ .mockImplementationOnce((...args) => {
83
+ const callback = args[args.length - 1];
84
+ failWrite = () => callback(failure);
85
+ notifyStarted();
86
+ });
87
+ appender.append(first);
88
+ await started;
89
+ appender.append(second);
90
+ const closing = appender.close(), rejected = expect(closing).rejects.toThrow(failure.message);
91
+ failWrite();
92
+ await rejected;
93
+ expect(appender.queue).toHaveLength(0);
94
+ expect(JSON.parse(Fs.readFileSync(filename, "utf8")).message).toBe("second");
95
+ expect(appender.isReady()).toBe(false);
96
+ expect(appender.file).toBeNull();
97
+ expect(appender.close()).toBe(closing);
98
+ await expect(appender.close()).rejects.toThrow(failure.message);
99
+ });
100
+ it("does not reopen the descriptor after shutdown starts or completes", async () => {
101
+ const appender = new FileAppender_1.FileAppender({
102
+ filename: node_path_1.default.join(directory, "closed.log")
103
+ }), open = jest.spyOn(Fs, "openSync"), closing = appender.close();
104
+ expect(() => appender.setup()).toThrow("closing or closed");
105
+ await closing;
106
+ expect(() => appender.setup()).toThrow("closing or closed");
107
+ await appender.close();
108
+ expect(open).not.toHaveBeenCalled();
109
+ expect(appender.file).toBeNull();
110
+ });
111
+ it("closes an empty appender idempotently", async () => {
112
+ const appender = new FileAppender_1.FileAppender({
113
+ filename: node_path_1.default.join(directory, "empty.log")
114
+ }), closing = appender.close();
115
+ expect(appender.close()).toBe(closing);
116
+ await closing;
117
+ await appender.close();
118
+ expect(appender.isReady()).toBe(false);
119
+ });
120
+ });
121
+ //# sourceMappingURL=FileAppender.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileAppender.test.js","sourceRoot":"","sources":["../../../../../tests/node/logging/appenders/FileAppender.test.ts"],"names":[],"mappings":"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","sourcesContent":["import Fs = require(\"node:fs\")\nimport Os from \"node:os\"\nimport Path from \"node:path\"\nimport { FileAppender } from \"@wireio/shared/node/logging/appenders/FileAppender\"\nimport { Level } from \"@wireio/shared/logging/Level\"\nimport type { LogRecord } from \"@wireio/shared/logging/LogRecord\"\n\n/** Exercise shutdown with a real file and an explicitly held asynchronous write. */\ndescribe(\"FileAppender shutdown\", () => {\n let directory: string\n\n beforeEach(() => {\n directory = Fs.mkdtempSync(Path.join(Os.tmpdir(), \"file-appender-\"))\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n Fs.rmSync(directory, { recursive: true, force: true })\n })\n\n it(\"waits for the active write and queued records before closing once\", async () => {\n const filename = Path.join(directory, \"app.log\"),\n appender = new FileAppender<LogRecord>({ filename, prettyPrint: false }),\n originalAppend = Fs.appendFile,\n originalClose = Fs.closeSync,\n descriptor = appender.file\n let releaseWrite: () => void\n let notifyStarted: () => void\n const started = new Promise<void>(resolve => {\n notifyStarted = resolve\n })\n const append = jest\n .spyOn(Fs, \"appendFile\")\n .mockImplementationOnce((...args: Parameters<typeof Fs.appendFile>) => {\n releaseWrite = () => originalAppend(...args)\n notifyStarted()\n })\n const close = jest.spyOn(Fs, \"closeSync\").mockImplementation(originalClose)\n const first: LogRecord = {\n timestamp: Date.now(),\n category: \"test\",\n level: Level.info,\n message: \"first\"\n },\n second: LogRecord = { ...first, message: \"second\" }\n appender.append(first)\n await started\n appender.append(second)\n const closing = appender.close()\n let settled = false\n void closing.then(() => {\n settled = true\n })\n try {\n await new Promise<void>(resolve => setImmediate(resolve))\n expect(settled).toBe(false)\n expect(close).not.toHaveBeenCalled()\n expect(append).toHaveBeenCalledTimes(1)\n expect(appender.close()).toBe(closing)\n } finally {\n releaseWrite()\n await closing\n }\n expect(\n Fs.readFileSync(filename, \"utf8\")\n .trim()\n .split(\"\\n\")\n .map(line => JSON.parse(line).message)\n ).toEqual([\"first\", \"second\"])\n expect(\n close.mock.calls.filter(([file]) => file === descriptor)\n ).toHaveLength(1)\n expect(appender.isReady()).toBe(false)\n expect(() => appender.append(first)).toThrow(\"closing or closed\")\n })\n\n it(\"drains the queued tail and rejects close after a failed write\", async () => {\n const filename = Path.join(directory, \"failed.log\"),\n appender = new FileAppender<LogRecord>({ filename, prettyPrint: false }),\n failure = new Error(\"write failed\"),\n first: LogRecord = {\n timestamp: Date.now(),\n category: \"test\",\n level: Level.info,\n message: \"first\"\n },\n second: LogRecord = { ...first, message: \"second\" }\n let failWrite: () => void\n let notifyStarted: () => void\n const started = new Promise<void>(resolve => {\n notifyStarted = resolve\n })\n jest\n .spyOn(Fs, \"appendFile\")\n .mockImplementationOnce((...args: Parameters<typeof Fs.appendFile>) => {\n const callback = args[args.length - 1] as Fs.NoParamCallback\n failWrite = () => callback(failure)\n notifyStarted()\n })\n appender.append(first)\n await started\n appender.append(second)\n const closing = appender.close(),\n rejected = expect(closing).rejects.toThrow(failure.message)\n failWrite()\n await rejected\n expect(appender.queue).toHaveLength(0)\n expect(JSON.parse(Fs.readFileSync(filename, \"utf8\")).message).toBe(\"second\")\n expect(appender.isReady()).toBe(false)\n expect(appender.file).toBeNull()\n expect(appender.close()).toBe(closing)\n await expect(appender.close()).rejects.toThrow(failure.message)\n })\n\n it(\"does not reopen the descriptor after shutdown starts or completes\", async () => {\n const appender = new FileAppender<LogRecord>({\n filename: Path.join(directory, \"closed.log\")\n }),\n open = jest.spyOn(Fs, \"openSync\"),\n closing = appender.close()\n expect(() => appender.setup()).toThrow(\"closing or closed\")\n await closing\n expect(() => appender.setup()).toThrow(\"closing or closed\")\n await appender.close()\n expect(open).not.toHaveBeenCalled()\n expect(appender.file).toBeNull()\n })\n\n it(\"closes an empty appender idempotently\", async () => {\n const appender = new FileAppender<LogRecord>({\n filename: Path.join(directory, \"empty.log\")\n }),\n closing = appender.close()\n expect(appender.close()).toBe(closing)\n await closing\n await appender.close()\n expect(appender.isReady()).toBe(false)\n })\n})\n"]}