@dbx-tools/core 0.9.58 → 0.9.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/src/exec.js CHANGED
@@ -194,8 +194,13 @@ function lineHandlers(option) {
194
194
  if (Array.isArray(option)) {
195
195
  return option.filter((item) => item !== "capture");
196
196
  }
197
+ if (typeof option === "object")
198
+ return [option.onLine];
197
199
  return [];
198
200
  }
201
+ function capturesLines(option) {
202
+ return typeof option !== "object" || Array.isArray(option) || option.capture !== false;
203
+ }
199
204
  /**
200
205
  * True when a stdio option is a string spawn mode rather than capture/handlers.
201
206
  *
@@ -229,10 +234,12 @@ function resolveStdio(option, lines, defaultMode = "inherit") {
229
234
  if (isPassthroughMode(option) && option !== "pipe")
230
235
  return { mode: option };
231
236
  const handlers = lineHandlers(option);
237
+ const capture = capturesLines(option);
232
238
  return {
233
239
  mode: "pipe",
234
240
  onLine: (line) => {
235
- lines.push(line);
241
+ if (capture)
242
+ lines.push(line);
236
243
  for (const handler of handlers)
237
244
  handler(line);
238
245
  },
@@ -540,4 +547,4 @@ export function shlex(command) {
540
547
  push();
541
548
  return args.length ? args : [command];
542
549
  }
543
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRDRztBQUNILE9BQU8sRUFHTCxLQUFLLElBQUksU0FBUyxFQUNsQixTQUFTLElBQUksYUFBYSxHQUMzQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sS0FBSyxRQUFRLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxDQUFDO0FBMkgvQyxTQUFTLGNBQWMsQ0FBeUIsS0FBbUI7SUFDakUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUMvQixNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQU0sQ0FBQyxDQUFDO0lBRWhELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixNQUFNLE9BQU8sR0FDWCxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZGLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzlELE1BQU0sU0FBUyxHQUNiLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxP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QUFDO1lBQ2YsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsSUFBSSxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ2pCLEtBQUssR0FBRyxTQUFTLENBQUM7Z0JBQ2xCLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDaEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDaEIsQ0FBQztZQUNELFNBQVM7UUFDWCxDQUFDO1FBRUQsSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUM3QixLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ1gsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNkLFNBQVM7UUFDWCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbEIsSUFBSSxFQUFFLENBQUM7WUFDUCxTQUFTO1FBQ1gsQ0FBQztRQUVELE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELCtDQUErQztJQUMvQyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLE9BQU8sSUFBSSxJQUFJLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksRUFBRSxDQUFDO0lBRVAsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUG9ydGFibGUgc3VicHJvY2VzcyBoZWxwZXIgYnVpbHQgb24gYGNoaWxkX3Byb2Nlc3Muc3Bhd25gIGFuZCBsaW5lIHN0cmVhbWluZy5cbiAqXG4gKiBFYWNoIHN0ZGlvIGZkIGRlZmF1bHRzIHRvIGBcImluaGVyaXRcImAuIHtAbGluayBzcGF3bn0gc3RyZWFtcyBvdXRwdXRcbiAqIGxpbmUtYnktbGluZSBpbnRvIHtAbGluayBFeGVjUmVzdWx0LnN0ZG91dExpbmVzfVxuICogLyB7QGxpbmsgRXhlY1Jlc3VsdC5zdGRlcnJMaW5lc307IGl0cyBgc3Rkb3V0YCAvIGBzdGRlcnJgIGdldHRlcnMgam9pbiB0aG9zZSBsaW5lcy5cbiAqIHtAbGluayBzcGF3blN5bmN9IGtlZXBzIHRoZSBjYXB0dXJlZCBzdHJpbmc7IGl0cyBgc3Rkb3V0YCAvIGBzdGRlcnJgIGdldHRlcnMgcmVhZFxuICogdGhhdCBzdHJpbmcgZGlyZWN0bHkgKGxpbmUgYXJyYXlzIHNwbGl0IGxhemlseSBvbiByZWFkKS5cbiAqIE9taXR0ZWQgYHRyaW1gIChkZWZhdWx0KSBhcHBsaWVzIGFkYXB0aXZlIG5vcm1hbGl6YXRpb246IHtAbGluayBzcGF3blN5bmN9IGRyb3BzXG4gKiBhdCBtb3N0IG9uZSB0cmFpbGluZyBlbXB0eSBsaW5lIC8gbmV3bGluZSBgc3Bhd25TeW5jYCBhZGRzOyB7QGxpbmsgc3Bhd259IGRvZXNcbiAqIG5vdCAocmVhZGxpbmUgbmV2ZXIgZW1pdHMgdGhhdCBleHRyYSBsaW5lKS4gYHRyaW06IHRydWVgIHN0cmlwcyBhbGwgbGVhZGluZy9cbiAqIHRyYWlsaW5nIHdoaXRlc3BhY2UgaW4gYm90aCBtb2RlczsgYHRyaW06IGZhbHNlYCBsZWF2ZXMgb3V0cHV0IHVuY2hhbmdlZC5cbiAqXG4gKiBUaGlzIG1vZHVsZSBvd25zIHN1YnByb2Nlc3MgZXhlY3V0aW9uIHBvbGljeSBmb3IgTm9kZSBhbmQgQnVuIHBhY2thZ2VzLiBSZXVzZVxuICogaXQgaW5zdGVhZCBvZiB3cmFwcGluZyBgY2hpbGRfcHJvY2Vzc2AgbG9jYWxseSB3aGVuIGNhbGxlcnMgbmVlZCBjb25zaXN0ZW50XG4gKiBhcmd2IHBhcnNpbmcsIHN0ZGlvIGNhcHR1cmUsIGxpbmUgY2FsbGJhY2tzLCBjYW5jZWxsYXRpb24sIGFuZCBleGl0IGNoZWNraW5nLlxuICpcbiAqIEBleGFtcGxlIENhcHR1cmUgY29tbWFuZCBvdXRwdXRcbiAqIGBgYHRzXG4gKiBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgZXhlYyhcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgXCItLXNob3ctdG9wbGV2ZWxcIl0sIHtcbiAqICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAqICAgc3RkZXJyOiBcImlnbm9yZVwiLFxuICogICBzdGRpbjogXCJpZ25vcmVcIixcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGUgU3RyZWFtIGFuZCBjYXB0dXJlIHRvZ2V0aGVyXG4gKiBgYGB0c1xuICogYXdhaXQgZXhlYyhcInBucG1cIiwgW1wiaW5zdGFsbFwiXSwge1xuICogICBzdGRvdXQ6IFsobGluZSkgPT4gY29uc29sZS5sb2cobGluZSksIFwiY2FwdHVyZVwiXSxcbiAqICAgY2hlY2s6IHRydWUsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFN5bmNocm9ub3VzIGNhcHR1cmUgKG5vIGxpbmUgY2FsbGJhY2tzKVxuICogYGBgdHNcbiAqIGNvbnN0IHsgc3Rkb3V0IH0gPSBleGVjU3luYyhcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgXCItLXNob3ctdG9wbGV2ZWxcIl0sIHtcbiAqICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAqICAgc3RkZXJyOiBcImlnbm9yZVwiLFxuICogICBzdGRpbjogXCJpZ25vcmVcIixcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQge1xuICB0eXBlIENoaWxkUHJvY2VzcyxcbiAgdHlwZSBTcGF3bk9wdGlvbnMsXG4gIHNwYXduIGFzIG5vZGVTcGF3bixcbiAgc3Bhd25TeW5jIGFzIG5vZGVTcGF3blN5bmMsXG59IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCAqIGFzIHJlYWRsaW5lIGZyb20gXCJub2RlOnJlYWRsaW5lXCI7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gXCJub2RlOnN0cmVhbVwiO1xuaW1wb3J0IHsgZmluaXNoZWQgfSBmcm9tIFwibm9kZTpzdHJlYW0vcHJvbWlzZXNcIjtcblxuLyoqIFNoZWxsLWNvbXBhdGlibGUgZXhpdCBjb2RlIHJldHVybmVkIHdoZW4gYW4gZXhlY3V0YWJsZSBjYW5ub3QgYmUgZm91bmQuICovXG5leHBvcnQgY29uc3QgQ09NTUFORF9OT1RfRk9VTkRfRVhJVF9DT0RFID0gMTI3O1xuXG4vKiogU3RkaW8gbW9kZSBmb3IgYSBzdWJwcm9jZXNzIGZkLiAqL1xuZXhwb3J0IHR5cGUgRXhlY1N0ZGlvID0gXCJpbmhlcml0XCIgfCBcInBpcGVcIiB8IFwiaWdub3JlXCI7XG5cbi8qKiBJbnZva2VkIG9uY2UgcGVyIG91dHB1dCBsaW5lIHdoZW4gYSBmZCBpcyBwaXBlZC4gKi9cbmV4cG9ydCB0eXBlIExpbmVIYW5kbGVyID0gKGxpbmU6IHN0cmluZykgPT4gdm9pZDtcblxuLyoqXG4gKiBTdGRpbyBjb25maWcgZm9yIG9uZSBmZC5cbiAqXG4gKiAtIGBcImluaGVyaXRcImAgLyBgXCJwaXBlXCJgIC8gYFwiaWdub3JlXCJgIOKAlCBwYXNzIHRocm91Z2ggdG8gYHNwYXduYFxuICogLSBgXCJjYXB0dXJlXCJgIOKAlCBwaXBlIHRoZSBmZCBhbmQgYXBwZW5kIGVhY2ggbGluZSB0byB0aGUgcmVzdWx0XG4gKiAtIHtAbGluayBMaW5lSGFuZGxlcn0g4oCUIHBpcGUgYW5kIGludm9rZSB0aGUgaGFuZGxlciBwZXIgbGluZSAobGluZXMgYXJlIHN0aWxsIGNhcHR1cmVkKVxuICogLSBgKExpbmVIYW5kbGVyIHwgXCJjYXB0dXJlXCIpW11gIOKAlCBwaXBlOyBgXCJjYXB0dXJlXCJgIGlzIGEgbm8tb3AgbWFya2VyLCBoYW5kbGVycyBydW4gcGVyIGxpbmVcbiAqL1xuZXhwb3J0IHR5cGUgU3RkaW9PcHRpb24gPSBFeGVjU3RkaW8gfCBMaW5lSGFuZGxlciB8IFwiY2FwdHVyZVwiIHwgKExpbmVIYW5kbGVyIHwgXCJjYXB0dXJlXCIpW107XG5cbi8qKiBPdXRjb21lIG9mIHtAbGluayBzcGF3bn0gLyB7QGxpbmsgc3Bhd25TeW5jfTogZXhpdCBjb2RlLCBjYXB0dXJlZCBvdXRwdXQsIGFuZCBsaW5lIHZpZXdzLiAqL1xuZXhwb3J0IHR5cGUgRXhlY1Jlc3VsdCA9IHtcbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZG91dCBsaW5lcy4gRm9yIHtAbGluayBzcGF3bn0gdGhlc2UgYXJlIGJ1aWx0IHdoaWxlIHRoZSBwcm9jZXNzIHJ1bnM7XG4gICAqIGZvciB7QGxpbmsgc3Bhd25TeW5jfSB0aGV5IGFyZSBzcGxpdCBmcm9tIHRoZSBjYXB0dXJlZCBzdHJpbmcgb24gZmlyc3QgcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZG91dExpbmVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZGVyciBsaW5lcy4gRm9yIHtAbGluayBzcGF3bn0gdGhlc2UgYXJlIGJ1aWx0IHdoaWxlIHRoZSBwcm9jZXNzIHJ1bnM7XG4gICAqIGZvciB7QGxpbmsgc3Bhd25TeW5jfSB0aGV5IGFyZSBzcGxpdCBmcm9tIHRoZSBjYXB0dXJlZCBzdHJpbmcgb24gZmlyc3QgcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZGVyckxpbmVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZG91dCB0ZXh0LiB7QGxpbmsgc3Bhd25TeW5jfSByZWFkcyB0aGUgY2FwdHVyZWQgc3RyaW5nO1xuICAgKiB7QGxpbmsgc3Bhd259IGpvaW5zIHtAbGluayBzdGRvdXRMaW5lc30uIFNlZSBgdHJpbWAgZm9yIG5vcm1hbGl6YXRpb24uXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZGVyciB0ZXh0LiB7QGxpbmsgc3Bhd25TeW5jfSByZWFkcyB0aGUgY2FwdHVyZWQgc3RyaW5nO1xuICAgKiB7QGxpbmsgc3Bhd259IGpvaW5zIHtAbGluayBzdGRlcnJMaW5lc30uIFNlZSBgdHJpbWAgZm9yIG5vcm1hbGl6YXRpb24uXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbn07XG5cbi8qKlxuICogV2hhdCB7QGxpbmsgc3Bhd259IHJldHVybnM6IHRoZSBMSVZFIGBDaGlsZFByb2Nlc3NgIGhhbmRsZSB0aGF0IGlzIEFMU08gYVxuICogYFByb21pc2U8RXhlY1Jlc3VsdD5gIHJlc29sdmluZyBvbiBleGl0LlxuICpcbiAqIFRoaXMgaXMgYWRkaXRpdmUgLSB0aGUgb2JqZWN0IHN0aWxsIHNhdGlzZmllcyBgUHJvbWlzZTxFeGVjUmVzdWx0PmAsIHNvIGV2ZXJ5XG4gKiBleGlzdGluZyBgYXdhaXQgc3Bhd24oLi4uKWAgLyBgc3Bhd24oLi4uKS50aGVuKC4uLilgIGNhbGxlciBpcyB1bmNoYW5nZWQuIFdoYXRcbiAqIGlzIG5ldyBpcyB0aGF0IHRoZSBzYW1lIHZhbHVlIGlzIHRoZSBsaXZlIGNoaWxkOiBjYWxsZXJzIHRoYXQgd2FudCB0byBzdXBlcnZpc2VcbiAqIGl0IChyZWFkIGAucGlkYCwgYC5raWxsKHNpZ25hbClgLCBsaXN0ZW4gZm9yIGBleGl0YCkgY2FuLCB3aXRob3V0IGEgc2Vjb25kXG4gKiBzcGF3bi4gYEBkYngtdG9vbHMvYXBwa2l0YCdzIGBiaW5kUHJvY2Vzc2AgY29uc3VtZXMgZXhhY3RseSB0aGlzIC0gb25lIGNvZGUgcGF0aFxuICogc3VwZXJ2aXNlcyBib3RoIGEgYmFyZSBgQ2hpbGRQcm9jZXNzYCAoZS5nLiBwb3J0cikgYW5kIGEgYHNwYXduKClgIHJlc3VsdC5cbiAqXG4gKiBAZXhhbXBsZSBBd2FpdCBpdCAodW5jaGFuZ2VkKVxuICogY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduKFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIkhFQURcIl0sIHsgc3Rkb3V0OiBcImNhcHR1cmVcIiB9KTtcbiAqXG4gKiBAZXhhbXBsZSBTdXBlcnZpc2UgaXRcbiAqIGNvbnN0IHByb2MgPSBzcGF3bihcImJ1blwiLCBbXCJzcmMvc2VydmVyLnRzXCJdKTtcbiAqIGN0eC5iaW5kUHJvY2Vzcyhwcm9jKTsgICAgICAgICAgICAvLyBsaXZlIGhhbmRsZVxuICogY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcHJvYzsgIC8vIHN0aWxsIGEgcHJvbWlzZVxuICovXG5leHBvcnQgdHlwZSBDaGlsZFByb2Nlc3NSZXN1bHQgPSBDaGlsZFByb2Nlc3MgJiBQcm9taXNlPEV4ZWNSZXN1bHQ+O1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHNwYXdufS4gRXh0ZW5kcyBgU3Bhd25PcHRpb25zYCBleGNlcHQgYHN0ZGlvYCwgd2hpY2ggaXMgZHJpdmVuIGJ5IGBzdGRpbmAgLyBgc3Rkb3V0YCAvIGBzdGRlcnJgLiAqL1xuZXhwb3J0IHR5cGUgRXhlY09wdGlvbnMgPSBPbWl0PFNwYXduT3B0aW9ucywgXCJzdGRpb1wiPiAmIHtcbiAgLyoqIGBcImluaGVyaXRcImAgYnkgZGVmYXVsdDsgYFwicGlwZVwiYCAvIGBcImlnbm9yZVwiYCBzZWxlY3QgbW9kZXMsIGFueSBvdGhlciBzdHJpbmcgaXMgaW5wdXQuICovXG4gIHN0ZGluPzogRXhlY1N0ZGlvIHwgc3RyaW5nO1xuICBzdGRvdXQ/OiBTdGRpb09wdGlvbjtcbiAgc3RkZXJyPzogU3RkaW9PcHRpb247XG4gIC8qKiBUaHJvdyB3aGVuIHRoZSBwcm9jZXNzIGV4aXRzIHdpdGggYSBub24temVybyBjb2RlLiAqL1xuICBjaGVjaz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBPbWl0dGVkIOKAlCBhZGFwdGl2ZSB0cmltICh7QGxpbmsgc3Bhd25TeW5jfSBkcm9wcyBvbmUgc3Bhd24gdHJhaWxpbmcgbmV3bGluZSxcbiAgICoge0BsaW5rIHNwYXdufSBkb2VzIG5vdCk7IGB0cnVlYCDigJQgc3RyaXAgYWxsIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZTtcbiAgICogYGZhbHNlYCDigJQgbGVhdmUgY2FwdHVyZWQgb3V0cHV0IHVuY2hhbmdlZC5cbiAgICovXG4gIHRyaW0/OiBib29sZWFuO1xufTtcblxuLyoqIFN0ZGlvIG1vZGUgZm9yIHtAbGluayBzcGF3blN5bmN9IChubyBwZXItbGluZSBjYWxsYmFja3MpLiAqL1xuZXhwb3J0IHR5cGUgU3luY0V4ZWNTdGRpbyA9IEV4ZWNTdGRpbyB8IFwiY2FwdHVyZVwiO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHNwYXduU3luY30uIFNhbWUgc2hhcGUgYXMge0BsaW5rIEV4ZWNPcHRpb25zfSBidXQgd2l0aG91dCBsaW5lLWhhbmRsZXIgc3RkaW8uICovXG5leHBvcnQgdHlwZSBTeW5jRXhlY09wdGlvbnMgPSBPbWl0PFNwYXduT3B0aW9ucywgXCJzdGRpb1wiPiAmIHtcbiAgLyoqIGBcImluaGVyaXRcImAgYnkgZGVmYXVsdDsgYFwicGlwZVwiYCAvIGBcImlnbm9yZVwiYCBzZWxlY3QgbW9kZXMsIGFueSBvdGhlciBzdHJpbmcgaXMgaW5wdXQuICovXG4gIHN0ZGluPzogRXhlY1N0ZGlvIHwgc3RyaW5nO1xuICBzdGRvdXQ/OiBTeW5jRXhlY1N0ZGlvO1xuICBzdGRlcnI/OiBTeW5jRXhlY1N0ZGlvO1xuICAvKiogVGhyb3cgd2hlbiB0aGUgcHJvY2VzcyBleGl0cyB3aXRoIGEgbm9uLXplcm8gY29kZS4gKi9cbiAgY2hlY2s/OiBib29sZWFuO1xuICAvKipcbiAgICogT21pdHRlZCDigJQgYWRhcHRpdmUgdHJpbSAoe0BsaW5rIHNwYXduU3luY30gZHJvcHMgb25lIHNwYXduIHRyYWlsaW5nIG5ld2xpbmUsXG4gICAqIHtAbGluayBzcGF3bn0gZG9lcyBub3QpOyBgdHJ1ZWAg4oCUIHN0cmlwIGFsbCBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2U7XG4gICAqIGBmYWxzZWAg4oCUIGxlYXZlIGNhcHR1cmVkIG91dHB1dCB1bmNoYW5nZWQuXG4gICAqL1xuICB0cmltPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd24gc3RkaW8gbW9kZSBwbHVzIGFuIG9wdGlvbmFsIHBlci1saW5lIGNhbGxiYWNrIGFmdGVyIHtAbGluayByZXNvbHZlU3RkaW99XG4gKiBtYXBzIGEge0BsaW5rIFN0ZGlvT3B0aW9ufSBpbnRvIHNvbWV0aGluZyBgc3Bhd25gIGNhbiBjb25zdW1lLlxuICovXG50eXBlIFJlc29sdmVkU3RkaW8gPSB7XG4gIC8qKiBWYWx1ZSBwYXNzZWQgdG8gYHNwYXduYCdzIGBzdGRpb2AgdHVwbGUgZm9yIHRoaXMgZmQuICovXG4gIG1vZGU6IEV4ZWNTdGRpbztcbiAgLyoqIFdoZW4gc2V0LCBlYWNoIG91dHB1dCBsaW5lIGlzIGFwcGVuZGVkIHRvIHRoZSBjYXB0dXJlIGJ1ZmZlciBhbmQgZm9yd2FyZGVkIGhlcmUuICovXG4gIG9uTGluZT86IExpbmVIYW5kbGVyO1xufTtcblxuLyoqIFN1cHBvcnRlZCBjb21tYW5kLCBhcmd1bWVudC1hcnJheSwgdmFyaWFkaWMtYXJndW1lbnQsIGFuZCBvcHRpb25zIGNhbGwgZm9ybXMuICovXG5leHBvcnQgdHlwZSBTcGF3bkFyZ3M8VCBleHRlbmRzIFNwYXduT3B0aW9ucz4gPVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdXVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdXVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBvcHRpb25zOiBUXVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIC4uLmFyZ3NBbmRPcHRpb25zOiBbLi4uc3RyaW5nW10sIFRdXTtcblxuaW50ZXJmYWNlIFBhcnNlZFNwYXduQXJnczxUIGV4dGVuZHMgU3Bhd25PcHRpb25zPiB7XG4gIGNvbW1hbmQ6IHN0cmluZztcbiAgY29tbWFuZEFyZ3M6IHN0cmluZ1tdO1xuICBvcHRpb25zPzogVDtcbn1cblxuZnVuY3Rpb24gcGFyc2VTcGF3bkFyZ3M8VCBleHRlbmRzIFNwYXduT3B0aW9ucz4oaW5wdXQ6IFNwYXduQXJnczxUPik6IFBhcnNlZFNwYXduQXJnczxUPiB7XG4gIGxldCBbdmFsdWUsIC4uLnZhbHVlc10gPSBpbnB1dDtcbiAgY29uc3QgW2NvbW1hbmQsIC4uLmNvbW1hbmRBcmdzXSA9IHNobGV4KHZhbHVlISk7XG5cbiAgY29uc3QgbGFzdCA9IHZhbHVlcy5hdCgtMSk7XG4gIGNvbnN0IG9wdGlvbnMgPVxuICAgIGxhc3QgIT09IG51bGwgJiYgdHlwZW9mIGxhc3QgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkobGFzdCkgPyBsYXN0IDogdW5kZWZpbmVkO1xuICBjb25zdCBhcmd1bWVudFZhbHVlcyA9IG9wdGlvbnMgPyB2YWx1ZXMuc2xpY2UoMCwgLTEpIDogdmFsdWVzO1xuICBjb25zdCB2YWx1ZUFyZ3M6IHN0cmluZ1tdID1cbiAgICBhcmd1bWVudFZhbHVlcy5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShhcmd1bWVudFZhbHVlc1swXSlcbiAgICAgID8gWy4uLmFyZ3VtZW50VmFsdWVzWzBdXVxuICAgICAgOiBhcmd1bWVudFZhbHVlcztcblxuICByZXR1cm4ge1xuICAgIGNvbW1hbmQ6IGNvbW1hbmQhLFxuICAgIGNvbW1hbmRBcmdzOiBbLi4uY29tbWFuZEFyZ3MsIC4uLnZhbHVlQXJnc10sXG4gICAgb3B0aW9uczogb3B0aW9ucyBhcyBULFxuICB9O1xufVxuXG4vKipcbiAqIERyb3AgdGhlIHNpbmdsZSB0cmFpbGluZyBlbXB0eSBlbnRyeSBgc3Bhd25TeW5jYCBhZGRzIHdoZW4gc3BsaXR0aW5nIG9uIGEgZmluYWxcbiAqIG5ld2xpbmUgKGBcImhpXFxuXCJgIC0+IGBbXCJoaVwiLCBcIlwiXWApLiBEb2VzIG5vdCByZW1vdmUgbXVsdGlwbGUgdHJhaWxpbmcgZW1wdGllcy5cbiAqL1xuZnVuY3Rpb24gd2l0aG91dFNwYXduVHJhaWxpbmdFbXB0eUxpbmUobGluZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBpZiAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9PT0gXCJcIikge1xuICAgIHJldHVybiBsaW5lcy5zbGljZSgwLCAtMSk7XG4gIH1cbiAgcmV0dXJuIGxpbmVzIGFzIHN0cmluZ1tdO1xufVxuXG4vKiogUmVtb3ZlIGF0IG1vc3Qgb25lIHRyYWlsaW5nIG5ld2xpbmUgZnJvbSBjYXB0dXJlZCBzcGF3biBzdGRvdXQvc3RkZXJyIHRleHQuICovXG5mdW5jdGlvbiB0cmltU2luZ2xlVHJhaWxpbmdOZXdsaW5lKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh0ZXh0LmVuZHNXaXRoKFwiXFxyXFxuXCIpKSByZXR1cm4gdGV4dC5zbGljZSgwLCAtMik7XG4gIGlmICh0ZXh0LmVuZHNXaXRoKFwiXFxuXCIpKSByZXR1cm4gdGV4dC5zbGljZSgwLCAtMSk7XG4gIHJldHVybiB0ZXh0O1xufVxuXG4vKiogTGluZS1hcnJheSB2aWV3IG9mIGFzeW5jLWNhcHR1cmVkIG91dHB1dC4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRBc3luY0xpbmVzKGxpbmVzOiByZWFkb25seSBzdHJpbmdbXSwgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgaWYgKHRyaW0gPT09IHRydWUpIHJldHVybiBsaW5lc0Zyb21DYXB0dXJlZE91dHB1dChsaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKSk7XG4gIHJldHVybiBsaW5lcyBhcyBzdHJpbmdbXTtcbn1cblxuLyoqIEpvaW4gYXN5bmMtY2FwdHVyZWQgbGluZXMgaW50byBzdGRvdXQvc3RkZXJyIHRleHQuICovXG5mdW5jdGlvbiBmb3JtYXRBc3luY0NhcHR1cmVkTGluZXMobGluZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgY29uc3Qgam9pbmVkID0gbGluZXMuam9pbihcIlxcblwiKTtcbiAgcmV0dXJuIHRyaW0gPT09IHRydWUgPyBqb2luZWQudHJpbSgpIDogam9pbmVkO1xufVxuXG4vKiogTGluZS1hcnJheSB2aWV3IG9mIHN5bmMtY2FwdHVyZWQgb3V0cHV0LiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplZFN5bmNMaW5lcyhsaW5lczogcmVhZG9ubHkgc3RyaW5nW10sIHRyaW06IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIGlmICh0cmltID09PSBmYWxzZSkgcmV0dXJuIGxpbmVzIGFzIHN0cmluZ1tdO1xuICBpZiAodHJpbSA9PT0gdHJ1ZSkgcmV0dXJuIGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KGxpbmVzLmpvaW4oXCJcXG5cIikudHJpbSgpKTtcbiAgcmV0dXJuIHdpdGhvdXRTcGF3blRyYWlsaW5nRW1wdHlMaW5lKGxpbmVzKTtcbn1cblxuLyoqIEZvcm1hdCBzeW5jLWNhcHR1cmVkIHN0ZG91dC9zdGRlcnIgdGV4dC4gKi9cbmZ1bmN0aW9uIGZvcm1hdFN5bmNDYXB0dXJlZFRleHQoXG4gIHRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0ZXh0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0cmltID09PSBmYWxzZSkgcmV0dXJuIHRleHQ7XG4gIGlmICh0cmltID09PSB0cnVlKSByZXR1cm4gdGV4dC50cmltKCk7XG4gIHJldHVybiB0cmltU2luZ2xlVHJhaWxpbmdOZXdsaW5lKHRleHQpO1xufVxuXG4vKipcbiAqIEh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciBhIHNwYXduZWQgY29tbWFuZCwgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIEV4ZWN1dGFibGUgbmFtZSBvciBwYXRoXG4gKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGV4ZWN1dGFibGVcbiAqIEByZXR1cm5zIEJhY2t0aWNrLXdyYXBwZWQgYGNvbW1hbmQgYXJnMSBhcmcyIC4uLmAgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNvbW1hbmRMYWJlbChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcXGAke2NvbW1hbmR9ICR7YXJncy5qb2luKFwiIFwiKX1cXGBgO1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgTm9kZSBmYWlsZWQgdG8gc3Bhd24gYmVjYXVzZSB0aGUgZXhlY3V0YWJsZSB3YXMgbm90IGZvdW5kLiAqL1xuZnVuY3Rpb24gaXNDb21tYW5kTm90Rm91bmRFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCI7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIHtAbGluayBzcGF3bn0gd2l0aCBsaXZlIGxpbmUgYXJyYXlzIGFuZCBsYXp5XG4gKiB0cmltbWVkIGBzdGRvdXRgIC8gYHN0ZGVycmAgZ2V0dGVycyBkZXJpdmVkIGZyb20gdGhvc2UgbGluZXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUV4ZWNSZXN1bHQoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN0ZG91dExpbmVzOiBzdHJpbmdbXSxcbiAgc3RkZXJyTGluZXM6IHN0cmluZ1tdLFxuICB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogRXhlY1Jlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgZXhpdENvZGUsXG4gICAgZ2V0IHN0ZG91dExpbmVzKCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRBc3luY0xpbmVzKHN0ZG91dExpbmVzLCB0cmltKTtcbiAgICB9LFxuICAgIGdldCBzdGRlcnJMaW5lcygpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkQXN5bmNMaW5lcyhzdGRlcnJMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgICBnZXQgc3Rkb3V0KCkge1xuICAgICAgcmV0dXJuIGZvcm1hdEFzeW5jQ2FwdHVyZWRMaW5lcyhzdGRvdXRMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyKCkge1xuICAgICAgcmV0dXJuIGZvcm1hdEFzeW5jQ2FwdHVyZWRMaW5lcyhzdGRlcnJMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgb2JqZWN0IHJldHVybmVkIGZyb20ge0BsaW5rIHNwYXduU3luY30uIENhcHR1cmVkIHN0cmluZ3MgYXJlIHN0b3JlZFxuICogYXMtaXM7IGBzdGRvdXRgIC8gYHN0ZGVycmAgdHJpbSBkaXJlY3RseSwgYW5kIGxpbmUgYXJyYXlzIHNwbGl0IG9ubHkgb24gcmVhZC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3luY0V4ZWNSZXN1bHQoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN0ZG91dFRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgc3RkZXJyVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogRXhlY1Jlc3VsdCB7XG4gIGxldCBzdGRvdXRMaW5lc0NhY2hlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0ZGVyckxpbmVzQ2FjaGU6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN5bmNMaW5lcyA9ICh0ZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHRleHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbm9ybWFsaXplZFN5bmNMaW5lcyhsaW5lc0Zyb21DYXB0dXJlZE91dHB1dCh0ZXh0KSwgdHJpbSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBleGl0Q29kZSxcbiAgICBnZXQgc3Rkb3V0TGluZXMoKSB7XG4gICAgICBpZiAoc3Rkb3V0VGV4dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG4gICAgICBzdGRvdXRMaW5lc0NhY2hlID8/PSBzeW5jTGluZXMoc3Rkb3V0VGV4dCkgPz8gW107XG4gICAgICByZXR1cm4gc3Rkb3V0TGluZXNDYWNoZTtcbiAgICB9LFxuICAgIGdldCBzdGRlcnJMaW5lcygpIHtcbiAgICAgIGlmIChzdGRlcnJUZXh0ID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgICAgIHN0ZGVyckxpbmVzQ2FjaGUgPz89IHN5bmNMaW5lcyhzdGRlcnJUZXh0KSA/PyBbXTtcbiAgICAgIHJldHVybiBzdGRlcnJMaW5lc0NhY2hlO1xuICAgIH0sXG4gICAgZ2V0IHN0ZG91dCgpIHtcbiAgICAgIHJldHVybiBmb3JtYXRTeW5jQ2FwdHVyZWRUZXh0KHN0ZG91dFRleHQsIHRyaW0pID8/IFwiXCI7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyKCkge1xuICAgICAgcmV0dXJuIGZvcm1hdFN5bmNDYXB0dXJlZFRleHQoc3RkZXJyVGV4dCwgdHJpbSkgPz8gXCJcIjtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdXNlci1zdXBwbGllZCBsaW5lIGhhbmRsZXJzIGZyb20gYSB7QGxpbmsgU3RkaW9PcHRpb259LlxuICpcbiAqIFRoZSBgXCJjYXB0dXJlXCJgIG1hcmtlciBpcyBmaWx0ZXJlZCBvdXQ7IGNhcHR1cmUgaXRzZWxmIGlzIGFsd2F5cyBoYW5kbGVkIGJ5XG4gKiBwdXNoaW5nIGludG8gdGhlIGxpbmUgYnVmZmVyIGluc2lkZSB7QGxpbmsgcmVzb2x2ZVN0ZGlvfS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uIC0gU3RkaW8gb3B0aW9uIHRoYXQgbWF5IGVtYmVkIG9uZSBvciBtb3JlIGhhbmRsZXJzXG4gKiBAcmV0dXJucyBIYW5kbGVycyB0byBpbnZva2UgYWZ0ZXIgZWFjaCBjYXB0dXJlZCBsaW5lIChtYXkgYmUgZW1wdHkpXG4gKi9cbmZ1bmN0aW9uIGxpbmVIYW5kbGVycyhvcHRpb246IFN0ZGlvT3B0aW9uKTogTGluZUhhbmRsZXJbXSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9uID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBbb3B0aW9uXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uKSkge1xuICAgIHJldHVybiBvcHRpb24uZmlsdGVyKChpdGVtKTogaXRlbSBpcyBMaW5lSGFuZGxlciA9PiBpdGVtICE9PSBcImNhcHR1cmVcIik7XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG4vKipcbiAqIFRydWUgd2hlbiBhIHN0ZGlvIG9wdGlvbiBpcyBhIHN0cmluZyBzcGF3biBtb2RlIHJhdGhlciB0aGFuIGNhcHR1cmUvaGFuZGxlcnMuXG4gKlxuICoge0BsaW5rIHJlc29sdmVTdGRpb30gc3RpbGwgdHJlYXRzIGBcInBpcGVcImAgYXMgcGlwZS1hbmQtY2FwdHVyZTsgb25seVxuICogYFwiaW5oZXJpdFwiYCBhbmQgYFwiaWdub3JlXCJgIHJldHVybiB3aXRob3V0IGEgbGluZSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uIC0gU3RkaW8gb3B0aW9uIHRvIGNsYXNzaWZ5XG4gKiBAcmV0dXJucyBXaGV0aGVyIGBvcHRpb25gIGlzIGBcImluaGVyaXRcImAsIGBcInBpcGVcImAsIG9yIGBcImlnbm9yZVwiYFxuICovXG5mdW5jdGlvbiBpc1Bhc3N0aHJvdWdoTW9kZShvcHRpb246IHVua25vd24pOiBvcHRpb24gaXMgRXhlY1N0ZGlvIHtcbiAgcmV0dXJuIG9wdGlvbiA9PT0gXCJpbmhlcml0XCIgfHwgb3B0aW9uID09PSBcInBpcGVcIiB8fCBvcHRpb24gPT09IFwiaWdub3JlXCI7XG59XG5cbi8qKiBUcnVlIHdoZW4gc3RkaW4gaXMgZGF0YSByYXRoZXIgdGhhbiBvbmUgb2YgdGhlIHRocmVlIHJlc2VydmVkIHN0ZGlvIG1vZGVzLiAqL1xuZnVuY3Rpb24gaXNTdGRpblBheWxvYWQoc3RkaW46IEV4ZWNTdGRpbyB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0ZGluIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2Ygc3RkaW4gPT09IFwic3RyaW5nXCIgJiYgIWlzUGFzc3Rocm91Z2hNb2RlKHN0ZGluKTtcbn1cblxuLyoqXG4gKiBNYXAgYSB7QGxpbmsgU3RkaW9PcHRpb259IGludG8gYSBzcGF3biBzdGRpbyBtb2RlIGFuZCBvcHRpb25hbCBsaW5lIGNhbGxiYWNrLlxuICpcbiAqIFBpcGVkIG1vZGVzIChgXCJjYXB0dXJlXCJgLCBgXCJwaXBlXCJgLCBoYW5kbGVycywgYXJyYXlzKSBhcHBlbmQgZXZlcnkgbGluZSB0b1xuICogYGxpbmVzYCBhbmQgaW52b2tlIGFueSBlbWJlZGRlZCBoYW5kbGVycy4gT21pdHRlZCBvcHRpb25zIHVzZSBgZGVmYXVsdE1vZGVgLlxuICpcbiAqIEBwYXJhbSBvcHRpb24gLSBDYWxsZXIgc3RkaW8gcHJlZmVyZW5jZSBmb3Igb25lIGZkXG4gKiBAcGFyYW0gbGluZXMgLSBNdXRhYmxlIGJ1ZmZlciB0aGF0IHJlY2VpdmVzIGVhY2ggcGlwZWQgbGluZVxuICogQHBhcmFtIGRlZmF1bHRNb2RlIC0gU3Bhd24gbW9kZSB3aGVuIGBvcHRpb25gIGlzIG9taXR0ZWQgKGBcImluaGVyaXRcImAgYnkgZGVmYXVsdClcbiAqIEByZXR1cm5zIFJlc29sdmVkIHNwYXduIG1vZGUgYW5kIG9wdGlvbmFsIHBlci1saW5lIGNhbGxiYWNrXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTdGRpbyhcbiAgb3B0aW9uOiBTdGRpb09wdGlvbiB8IHVuZGVmaW5lZCxcbiAgbGluZXM6IHN0cmluZ1tdLFxuICBkZWZhdWx0TW9kZTogRXhlY1N0ZGlvID0gXCJpbmhlcml0XCIsXG4pOiBSZXNvbHZlZFN0ZGlvIHtcbiAgaWYgKG9wdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4geyBtb2RlOiBkZWZhdWx0TW9kZSB9O1xuICBpZiAoaXNQYXNzdGhyb3VnaE1vZGUob3B0aW9uKSAmJiBvcHRpb24gIT09IFwicGlwZVwiKSByZXR1cm4geyBtb2RlOiBvcHRpb24gfTtcblxuICBjb25zdCBoYW5kbGVycyA9IGxpbmVIYW5kbGVycyhvcHRpb24pO1xuICByZXR1cm4ge1xuICAgIG1vZGU6IFwicGlwZVwiLFxuICAgIG9uTGluZTogKGxpbmUpID0+IHtcbiAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIGhhbmRsZXIobGluZSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWFkIGEgcmVhZGFibGUgc3RyZWFtIGxpbmUtYnktbGluZSBhbmQgaW52b2tlIGBvbkxpbmVgIGZvciBlYWNoIGNodW5rLlxuICpcbiAqIFVzZXMgYHJlYWRsaW5lYCBzbyBgXFxyXFxuYCBhbmQgYmFyZSBgXFxuYCBhcmUgbm9ybWFsaXplZC4gVGhlIGludGVyZmFjZSBpc1xuICogYWx3YXlzIGNsb3NlZCBpbiBhIGBmaW5hbGx5YCBibG9jay5cbiAqXG4gKiBAcGFyYW0gc3RyZWFtIC0gU3VicHJvY2VzcyBzdGRvdXQgb3Igc3RkZXJyIHN0cmVhbVxuICogQHBhcmFtIG9uTGluZSAtIENhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgb3V0cHV0IGxpbmVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZExpbmVzKHN0cmVhbTogUmVhZGFibGUsIG9uTGluZTogTGluZUhhbmRsZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2UoeyBpbnB1dDogc3RyZWFtLCBjcmxmRGVsYXk6IEluZmluaXR5IH0pO1xuICB0cnkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgbGluZSBvZiBybCkgb25MaW5lKGxpbmUpO1xuICB9IGZpbmFsbHkge1xuICAgIHJsLmNsb3NlKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGFydCBhIGJhY2tncm91bmQgbGluZSByZWFkIHdoZW4gdGhlIHJlc29sdmVkIGhhbmRsZXIgcGlwZXMgYSBzdHJlYW0uXG4gKlxuICogQHBhcmFtIHJlYWRzIC0gUHJvbWlzZSBsaXN0IGF3YWl0ZWQgYmVmb3JlIHJldHVybmluZyB0aGUge0BsaW5rIEV4ZWNSZXN1bHR9XG4gKiBAcGFyYW0gc3RyZWFtIC0gU3VicHJvY2VzcyBzdHJlYW0gZm9yIHRoaXMgZmQgKGBudWxsYCB3aGVuIHVuYXZhaWxhYmxlKVxuICogQHBhcmFtIGhhbmRsZXIgLSBSZXNvbHZlZCBzdGRpbyBjb25maWcgZnJvbSB7QGxpbmsgcmVzb2x2ZVN0ZGlvfVxuICovXG5mdW5jdGlvbiBxdWV1ZUxpbmVSZWFkcyhcbiAgcmVhZHM6IFByb21pc2U8dm9pZD5bXSxcbiAgc3RyZWFtOiBSZWFkYWJsZSB8IG51bGwsXG4gIGhhbmRsZXI6IFJlc29sdmVkU3RkaW8sXG4pOiB2b2lkIHtcbiAgaWYgKGhhbmRsZXIub25MaW5lICYmIHN0cmVhbSkgcmVhZHMucHVzaChyZWFkTGluZXMoc3RyZWFtLCBoYW5kbGVyLm9uTGluZSkpO1xufVxuXG4vKipcbiAqIFdyaXRlIHN0cmluZyBzdGRpbiB0byBhIHNwYXduZWQgcHJvY2VzcyBhbmQgY2xvc2UgdGhlIHN0cmVhbS5cbiAqXG4gKiBOby1vcCB1bmxlc3MgYHN0ZGluYCBpcyBhIHBheWxvYWQgc3RyaW5nIChub3QgYSBzdGRpbyBtb2RlKSBhbmRcbiAqIGBwcm9jLnN0ZGluYCBpcyBhdmFpbGFibGUuIEEgY2hpbGQgdGhhdCBleGl0cyBiZWZvcmUgY29uc3VtaW5nIHRoZSBwYXlsb2FkXG4gKiBjbG9zZXMgaXRzIHBpcGU7IEVQSVBFIGlzIGV4cGVjdGVkIGluIHRoYXQgY2FzZSBhbmQgaXMgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0gcHJvYyAtIENoaWxkIHByb2Nlc3MgcmV0dXJuZWQgZnJvbSBgc3Bhd25gXG4gKiBAcGFyYW0gc3RkaW4gLSBTdGRpbyBtb2RlIG9yIHN0cmluZyBwYXlsb2FkIGZyb20ge0BsaW5rIEV4ZWNPcHRpb25zfVxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN0ZGluKFxuICBwcm9jOiBDaGlsZFByb2Nlc3MsXG4gIHN0ZGluOiBFeGVjU3RkaW8gfCBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1N0ZGluUGF5bG9hZChzdGRpbikgfHwgIXByb2Muc3RkaW4pIHJldHVybjtcbiAgY29uc3QgY29tcGxldGlvbiA9IGZpbmlzaGVkKHByb2Muc3RkaW4sIHsgY2xlYW51cDogdHJ1ZSB9KTtcbiAgcHJvYy5zdGRpbi5lbmQoc3RkaW4pO1xuICB0cnkge1xuICAgIGF3YWl0IGNvbXBsZXRpb247XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICghKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVyciAmJiBlcnIuY29kZSA9PT0gXCJFUElQRVwiKSkgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogQXdhaXQgcHJvY2VzcyBleGl0IGFuZCBub3JtYWxpemUgYSBtaXNzaW5nIGV4aXQgY29kZSB0byBgMWAuXG4gKlxuICogUmVqZWN0cyB3aGVuIHNwYXduIGZhaWxzIGJlZm9yZSBgY2xvc2VgIChlLmcuIGV4ZWN1dGFibGUgbm90IGZvdW5kKS5cbiAqXG4gKiBAcGFyYW0gcHJvYyAtIENoaWxkIHByb2Nlc3MgcmV0dXJuZWQgZnJvbSBgc3Bhd25gXG4gKiBAcmV0dXJucyBSZXNvbHZlZCBleGl0IGNvZGVcbiAqL1xuZnVuY3Rpb24gd2FpdEZvckV4aXQocHJvYzogQ2hpbGRQcm9jZXNzKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBwcm9jLm9uY2UoXCJlcnJvclwiLCByZWplY3QpO1xuICAgIHByb2Mub25jZShcImNsb3NlXCIsIChjb2RlKSA9PiByZXNvbHZlKGNvZGUgPz8gMSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbiBgRXJyb3JgIGZvciBhIG5vbi16ZXJvIGV4aXQgd2hlbiB7QGxpbmsgRXhlY09wdGlvbnMuY2hlY2t9IGlzIHNldC5cbiAqXG4gKiBQcmVmZXJzIHRyaW1tZWQgc3RkZXJyIHRleHQsIHRoZW4gc3Rkb3V0LCBpbiB0aGUgbWVzc2FnZSBib2R5LlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gRXhlY3V0YWJsZSBuYW1lIG9yIHBhdGhcbiAqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZXhlY3V0YWJsZVxuICogQHBhcmFtIHJlc3VsdCAtIENvbXBsZXRlZCBleGVjIG91dGNvbWUgd2l0aCBjYXB0dXJlZCBvdXRwdXRcbiAqIEByZXR1cm5zIEVycm9yIHN1aXRhYmxlIGZvciB0aHJvd2luZyBmcm9tIHtAbGluayBzcGF3bn1cbiAqL1xuZnVuY3Rpb24gZXhlY0Vycm9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIHJlc3VsdDogRXhlY1Jlc3VsdCk6IEVycm9yIHtcbiAgY29uc3QgZGV0YWlsID0gcmVzdWx0LnN0ZGVyciB8fCByZXN1bHQuc3Rkb3V0O1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGAke2NvbW1hbmRMYWJlbChjb21tYW5kLCBhcmdzKX0gZmFpbGVkIChleGl0ICR7cmVzdWx0LmV4aXRDb2RlfSkke2RldGFpbCA/IGA6ICR7ZGV0YWlsfWAgOiBcIlwifWAsXG4gICk7XG59XG5cbi8qKlxuICogTWFwIGEge0BsaW5rIFN5bmNFeGVjU3RkaW99IG9wdGlvbiB0byBhIGBzcGF3blN5bmNgIHN0ZGlvIG1vZGUuXG4gKlxuICogYFwiY2FwdHVyZVwiYCBwaXBlcyB0aGUgZmQgc28gb3V0cHV0IGNhbiBiZSByZWFkIGludG8gdGhlIHtAbGluayBFeGVjUmVzdWx0fS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uIC0gQ2FsbGVyIHN0ZGlvIHByZWZlcmVuY2UgZm9yIG9uZSBmZFxuICogQHBhcmFtIGRlZmF1bHRNb2RlIC0gU3Bhd24gbW9kZSB3aGVuIGBvcHRpb25gIGlzIG9taXR0ZWQgKGBcImluaGVyaXRcImAgYnkgZGVmYXVsdClcbiAqIEByZXR1cm5zIFZhbHVlIGZvciB0aGUgYHNwYXduU3luY2Agc3RkaW8gdHVwbGVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN5bmNTdGRpbyhcbiAgb3B0aW9uOiBTeW5jRXhlY1N0ZGlvIHwgdW5kZWZpbmVkLFxuICBkZWZhdWx0TW9kZTogRXhlY1N0ZGlvID0gXCJpbmhlcml0XCIsXG4pOiBFeGVjU3RkaW8ge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0TW9kZTtcbiAgaWYgKG9wdGlvbiA9PT0gXCJjYXB0dXJlXCIpIHJldHVybiBcInBpcGVcIjtcbiAgcmV0dXJuIG9wdGlvbjtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgcmF3IGBzcGF3blN5bmNgIG91dHB1dCB0byBhIFVURi04IHN0cmluZyB3aGVuIGNhcHR1cmUgaXMgZW5hYmxlZC5cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZWRUZXh0KG91dHB1dDogc3RyaW5nIHwgQnVmZmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvdXRwdXQgPT09IG51bGwgfHwgb3V0cHV0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2Ygb3V0cHV0ID09PSBcInN0cmluZ1wiID8gb3V0cHV0IDogb3V0cHV0LnRvU3RyaW5nKFwidXRmOFwiKTtcbn1cblxuLyoqXG4gKiBTcGxpdCBjYXB0dXJlZCBwcm9jZXNzIG91dHB1dCBpbnRvIGxpbmVzIGZvciB7QGxpbmsgRXhlY1Jlc3VsdC5zdGRvdXRMaW5lc30gL1xuICoge0BsaW5rIEV4ZWNSZXN1bHQuc3RkZXJyTGluZXN9ICh7QGxpbmsgc3Bhd25TeW5jfSBvbmx5OyBpbnZva2VkIGxhemlseSkuXG4gKi9cbmZ1bmN0aW9uIGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gb3V0cHV0LnJlcGxhY2UoL1xcclxcbi9nLCBcIlxcblwiKS5yZXBsYWNlKC9cXHIvZywgXCJcXG5cIikuc3BsaXQoXCJcXG5cIik7XG59XG5cbi8qKlxuICogU3Bhd24gYSBzdWJwcm9jZXNzLiBSZXR1cm5zIHRoZSBMSVZFIGNoaWxkIGhhbmRsZSB0aGF0IGlzIEFMU08gYVxuICogYFByb21pc2U8RXhlY1Jlc3VsdD5gIHJlc29sdmluZyBvbiBleGl0IC0gc2VlIHtAbGluayBDaGlsZFByb2Nlc3NSZXN1bHR9LlxuICpcbiAqIFRoZSBwcm9taXNlIGhhbGYgaXMgdGhlIGV4YWN0IGJlaGF2aW91ciB0aGlzIGZ1bmN0aW9uIGhhZCBiZWZvcmU6IGl0IGF3YWl0c1xuICogZXhpdCAoYW5kIGFueSBsaW5lIHJlYWRzIC8gc3RkaW4gd3JpdGUpLCB0aGVuIHJlc29sdmVzIHRvIHRoZSB7QGxpbmsgRXhlY1Jlc3VsdH1cbiAqIG9yIHJlamVjdHMgKHNwYXduIGVycm9yIG90aGVyIHRoYW4gYSBtaXNzaW5nIGV4ZWN1dGFibGUsIG9yIGBjaGVja2Agb24gbm9uLXplcm9cbiAqIGV4aXQpLiBFeGlzdGluZyBgYXdhaXQgc3Bhd24oLi4uKWAgY2FsbGVycyBhcmUgdW5hZmZlY3RlZC4gVGhlIGhhbmRsZSBoYWxmIGxldHMgYVxuICogY2FsbGVyIHN1cGVydmlzZSB0aGUgcHJvY2VzcyAoYC5waWRgLCBgLmtpbGwoc2lnbmFsKWAsIGBleGl0YCBldmVudCkgd2l0aG91dCBhXG4gKiBzZWNvbmQgc3Bhd24gLSBlLmcuIGBAZGJ4LXRvb2xzL2FwcGtpdGAncyBgYmluZFByb2Nlc3NgLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gRXhlY3V0YWJsZSB0byBydW4gKHJlc29sdmVkIG9uIGBQQVRIYCB3aGVuIGBzaGVsbGAgaXMgc2V0IG9uIG9wdGlvbnMpXG4gKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdmVyYmF0aW0gdG8gdGhlIGV4ZWN1dGFibGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gU3Bhd24sIHN0ZGlvLCBhbmQgY2hlY2sgb3B0aW9uc1xuICogQHJldHVybnMgVGhlIGxpdmUgYENoaWxkUHJvY2Vzc2AsIGF3YWl0YWJsZSB0byBleGl0IGNvZGUgKyBjYXB0dXJlZCBvdXRwdXRcbiAqIEB0aHJvd3MgKG9uIHRoZSBwcm9taXNlKSBXaGVuIHNwYXduIGZhaWxzIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIGEgbWlzc2luZ1xuICogZXhlY3V0YWJsZSwgbGluZSByZWFkcyBmYWlsLCBvciBgY2hlY2tgIGlzIHRydWUgYW5kIGV4aXQgY29kZSBpcyBub24temVyb1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3Bhd24oLi4uYXJnczogU3Bhd25BcmdzPEV4ZWNPcHRpb25zPik6IENoaWxkUHJvY2Vzc1Jlc3VsdCB7XG4gIGNvbnN0IHsgY29tbWFuZCwgY29tbWFuZEFyZ3MsIG9wdGlvbnMgPSB7fSB9ID0gcGFyc2VTcGF3bkFyZ3MoYXJncyk7XG4gIGNvbnN0IHsgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBjaGVjaywgdHJpbSwgLi4uc3Bhd25PcHRzIH0gPSBvcHRpb25zO1xuICBjb25zdCBzdGRvdXRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc3RkZXJyTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHN0ZG91dEhhbmRsZXIgPSByZXNvbHZlU3RkaW8oc3Rkb3V0LCBzdGRvdXRMaW5lcyk7XG4gIGNvbnN0IHN0ZGVyckhhbmRsZXIgPSByZXNvbHZlU3RkaW8oc3RkZXJyLCBzdGRlcnJMaW5lcyk7XG4gIGNvbnN0IHN0ZGluTW9kZTogRXhlY1N0ZGlvID0gaXNTdGRpblBheWxvYWQoc3RkaW4pID8gXCJwaXBlXCIgOiAoc3RkaW4gPz8gXCJpbmhlcml0XCIpO1xuXG4gIGNvbnN0IHByb2MgPSBub2RlU3Bhd24oY29tbWFuZCwgY29tbWFuZEFyZ3MsIHtcbiAgICAuLi5zcGF3bk9wdHMsXG4gICAgc3RkaW86IFtzdGRpbk1vZGUsIHN0ZG91dEhhbmRsZXIubW9kZSwgc3RkZXJySGFuZGxlci5tb2RlXSxcbiAgfSk7XG5cbiAgY29uc3Qgc3RkaW5Xcml0ZSA9IHdyaXRlU3RkaW4ocHJvYywgc3RkaW4pO1xuXG4gIGNvbnN0IHJlYWRzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgcXVldWVMaW5lUmVhZHMocmVhZHMsIHByb2Muc3Rkb3V0LCBzdGRvdXRIYW5kbGVyKTtcbiAgcXVldWVMaW5lUmVhZHMocmVhZHMsIHByb2Muc3RkZXJyLCBzdGRlcnJIYW5kbGVyKTtcblxuICBjb25zdCBjb21wbGV0aW9uID0gKGFzeW5jICgpOiBQcm9taXNlPEV4ZWNSZXN1bHQ+ID0+IHtcbiAgICBsZXQgZXhpdENvZGUgPSAxO1xuICAgIGxldCBjb21tYW5kTm90Rm91bmRFcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBleGl0Q29kZSA9IGF3YWl0IHdhaXRGb3JFeGl0KHByb2MpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3N0ZGluV3JpdGUsIC4uLnJlYWRzXSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoIWlzQ29tbWFuZE5vdEZvdW5kRXJyb3IoZXJyKSkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3N0ZGluV3JpdGUsIC4uLnJlYWRzXSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHByb2Muc3RkaW4/LmRlc3Ryb3koKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5kZXN0cm95KCk7XG4gICAgICBwcm9jLnN0ZGVycj8uZGVzdHJveSgpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtzdGRpbldyaXRlXSk7XG4gICAgICBmb3IgKGNvbnN0IHJlYWQgb2YgcmVhZHMpIHZvaWQgcmVhZC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgY29tbWFuZE5vdEZvdW5kRXJyb3IgPSBlcnI7XG4gICAgICBleGl0Q29kZSA9IENPTU1BTkRfTk9UX0ZPVU5EX0VYSVRfQ09ERTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjcmVhdGVFeGVjUmVzdWx0KGV4aXRDb2RlLCBzdGRvdXRMaW5lcywgc3RkZXJyTGluZXMsIHRyaW0pO1xuICAgIGlmIChjaGVjayAmJiByZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICAgIGNvbnN0IGVyciA9IGV4ZWNFcnJvcihjb21tYW5kLCBjb21tYW5kQXJncywgcmVzdWx0KTtcbiAgICAgIGlmIChjb21tYW5kTm90Rm91bmRFcnJvcikgZXJyLmNhdXNlID0gY29tbWFuZE5vdEZvdW5kRXJyb3I7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pKCk7XG5cbiAgLy8gQXR0YWNoIHRoZSBwcm9taXNlIGludGVyZmFjZSBvbnRvIHRoZSBsaXZlIGNoaWxkIHNvIE9ORSBvYmplY3QgaXMgYm90aC4gVGhlXG4gIC8vIG1ldGhvZHMgYXJlIGJvdW5kIHRvIGBjb21wbGV0aW9uYCBzbyBgdGhpc2AgaXMgdGhlIHJlYWwgcHJvbWlzZTsgdGhlIGNoaWxkXG4gIC8vIG93bnMgbm8gY29uZmxpY3RpbmcgYHRoZW5gL2BjYXRjaGAvYGZpbmFsbHlgLCBzbyB0aGlzIGlzIHB1cmVseSBhZGRpdGl2ZS5cbiAgcmV0dXJuIGF0dGFjaFByb21pc2UocHJvYywgY29tcGxldGlvbik7XG59XG5cbi8qKlxuICogQXR0YWNoIGEgcHJvbWlzZSdzIGB0aGVuYCAvIGBjYXRjaGAgLyBgZmluYWxseWAgb250byBhIGxpdmUgb2JqZWN0LCByZXR1cm5pbmdcbiAqIHRoZSBzYW1lIG9iamVjdCB0eXBlZCBhcyBib3RoLiBVc2VkIGJ5IHtAbGluayBzcGF3bn0gdG8gbWFrZSBpdHMgYENoaWxkUHJvY2Vzc2BcbiAqIGF3YWl0YWJsZSB3aXRob3V0IHdyYXBwaW5nIGl0IC0gc28gY2FsbGVycyBrZWVwIHRoZSBsaXZlIGhhbmRsZSBBTkQgYGF3YWl0YCBpdC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoUHJvbWlzZTxUIGV4dGVuZHMgb2JqZWN0LCBSPih0YXJnZXQ6IFQsIHByb21pc2U6IFByb21pc2U8Uj4pOiBUICYgUHJvbWlzZTxSPiB7XG4gIGNvbnN0IGh5YnJpZCA9IHRhcmdldCBhcyBUICYgUHJvbWlzZTxSPjtcbiAgaHlicmlkLnRoZW4gPSBwcm9taXNlLnRoZW4uYmluZChwcm9taXNlKTtcbiAgaHlicmlkLmNhdGNoID0gcHJvbWlzZS5jYXRjaC5iaW5kKHByb21pc2UpO1xuICBoeWJyaWQuZmluYWxseSA9IHByb21pc2UuZmluYWxseS5iaW5kKHByb21pc2UpO1xuICByZXR1cm4gaHlicmlkO1xufVxuXG4vKipcbiAqIFNwYXduIGEgc3VicHJvY2VzcyBzeW5jaHJvbm91c2x5IGFuZCB3YWl0IGZvciBleGl0LlxuICpcbiAqIFVubGlrZSB7QGxpbmsgc3Bhd259LCBzdGRpbyBvcHRpb25zIGFyZSBsaW1pdGVkIHRvIGBcImluaGVyaXRcImAsIGBcInBpcGVcImAsXG4gKiBgXCJpZ25vcmVcImAsIGFuZCBgXCJjYXB0dXJlXCJgIOKAlCBubyBwZXItbGluZSBjYWxsYmFja3MuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBFeGVjdXRhYmxlIHRvIHJ1biAocmVzb2x2ZWQgb24gYFBBVEhgIHdoZW4gYHNoZWxsYCBpcyBzZXQgb24gb3B0aW9ucylcbiAqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzIHBhc3NlZCB2ZXJiYXRpbSB0byB0aGUgZXhlY3V0YWJsZVxuICogQHBhcmFtIHNwYXduU3luYyAtIFNwYXduLCBzdGRpbywgYW5kIGNoZWNrIG9wdGlvbnNcbiAqIEByZXR1cm5zIEV4aXQgY29kZSwgY2FwdHVyZWQgbGluZSBhcnJheXMsIGFuZCB0cmltbWVkIGBzdGRvdXRgIC8gYHN0ZGVycmAgZ2V0dGVyc1xuICogQHRocm93cyBXaGVuIHNwYXduIGZhaWxzIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIGEgbWlzc2luZyBleGVjdXRhYmxlLCBvclxuICogYGNoZWNrYCBpcyB0cnVlIGFuZCBleGl0IGNvZGUgaXMgbm9uLXplcm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyguLi5hcmdzOiBTcGF3bkFyZ3M8U3luY0V4ZWNPcHRpb25zPik6IEV4ZWNSZXN1bHQge1xuICBjb25zdCB7IGNvbW1hbmQsIGNvbW1hbmRBcmdzLCBvcHRpb25zID0ge30gfSA9IHBhcnNlU3Bhd25BcmdzKGFyZ3MpO1xuICBjb25zdCB7IHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgY2hlY2ssIHRyaW0sIC4uLnNwYXduT3B0cyB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc3RkaW5Nb2RlOiBFeGVjU3RkaW8gPSBpc1N0ZGluUGF5bG9hZChzdGRpbikgPyBcInBpcGVcIiA6IChzdGRpbiA/PyBcImluaGVyaXRcIik7XG4gIGNvbnN0IGNhcHR1cmVTdGRvdXQgPSBzdGRvdXQgPT09IFwiY2FwdHVyZVwiO1xuICBjb25zdCBjYXB0dXJlU3RkZXJyID0gc3RkZXJyID09PSBcImNhcHR1cmVcIjtcbiAgY29uc3Qgc3Rkb3V0TW9kZSA9IHJlc29sdmVTeW5jU3RkaW8oc3Rkb3V0KTtcbiAgY29uc3Qgc3RkZXJyTW9kZSA9IHJlc29sdmVTeW5jU3RkaW8oc3RkZXJyKTtcblxuICBjb25zdCByZXN1bHQgPSBub2RlU3Bhd25TeW5jKGNvbW1hbmQsIGNvbW1hbmRBcmdzLCB7XG4gICAgLi4uc3Bhd25PcHRzLFxuICAgIGVuY29kaW5nOiBjYXB0dXJlU3Rkb3V0IHx8IGNhcHR1cmVTdGRlcnIgPyBcInV0ZjhcIiA6IHVuZGVmaW5lZCxcbiAgICBzdGRpbzogW3N0ZGluTW9kZSwgc3Rkb3V0TW9kZSwgc3RkZXJyTW9kZV0sXG4gICAgaW5wdXQ6IGlzU3RkaW5QYXlsb2FkKHN0ZGluKSA/IHN0ZGluIDogdW5kZWZpbmVkLFxuICB9KTtcblxuICBjb25zdCBjb21tYW5kTm90Rm91bmQgPSBpc0NvbW1hbmROb3RGb3VuZEVycm9yKHJlc3VsdC5lcnJvcik7XG4gIGNvbnN0IGV4aXRDb2RlID0gY29tbWFuZE5vdEZvdW5kID8gQ09NTUFORF9OT1RfRk9VTkRfRVhJVF9DT0RFIDogKHJlc3VsdC5zdGF0dXMgPz8gMSk7XG4gIGNvbnN0IHN0ZG91dFRleHQgPSBjYXB0dXJlU3Rkb3V0ID8gY2FwdHVyZWRUZXh0KHJlc3VsdC5zdGRvdXQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGRlcnJUZXh0ID0gY2FwdHVyZVN0ZGVyciA/IGNhcHR1cmVkVGV4dChyZXN1bHQuc3RkZXJyKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGNyZWF0ZVN5bmNFeGVjUmVzdWx0KGV4aXRDb2RlLCBzdGRvdXRUZXh0LCBzdGRlcnJUZXh0LCB0cmltKTtcblxuICBpZiAocmVzdWx0LmVycm9yICYmICghY29tbWFuZE5vdEZvdW5kIHx8IGNoZWNrKSkge1xuICAgIGNvbnN0IGVyciA9IGV4ZWNFcnJvcihjb21tYW5kLCBjb21tYW5kQXJncywgZXhlY1Jlc3VsdCk7XG4gICAgZXJyLmNhdXNlID0gcmVzdWx0LmVycm9yO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGlmIChjaGVjayAmJiBleGVjUmVzdWx0LmV4aXRDb2RlICE9PSAwKSB0aHJvdyBleGVjRXJyb3IoY29tbWFuZCwgY29tbWFuZEFyZ3MsIGV4ZWNSZXN1bHQpO1xuICByZXR1cm4gZXhlY1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBzaGVsbC1saWtlIGNvbW1hbmQgaW50byBhcmd2LlxuICpcbiAqIFN1cHBvcnRzOlxuICogICAtIHdoaXRlc3BhY2Ugc2VwYXJhdG9yc1xuICogICAtIHNpbmdsZSBhbmQgZG91YmxlIHF1b3Rlc1xuICogICAtIGJhY2tzbGFzaCBlc2NhcGluZ1xuICogICAtIGVzY2FwZWQgc3BhY2VzXG4gKiAgIC0gZW1wdHkgcXVvdGVkIHN0cmluZ3NcbiAqXG4gKiBJZiB0aGUgaW5wdXQgaXMgbWFsZm9ybWVkIChmb3IgZXhhbXBsZSwgYW4gdW50ZXJtaW5hdGVkIHF1b3RlKSxcbiAqIHJldHVybnMgdGhlIG9yaWdpbmFsIHN0cmluZyBhcyBhIHNpbmdsZSBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNobGV4KGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcblxuICBsZXQgY3VycmVudCA9IFwiXCI7XG4gIGxldCBxdW90ZTogXCInXCIgfCAnXCInIHwgdW5kZWZpbmVkO1xuICBsZXQgZXNjYXBlZCA9IGZhbHNlO1xuICBsZXQgcXVvdGVkID0gZmFsc2U7XG5cbiAgY29uc3QgcHVzaCA9ICgpID0+IHtcbiAgICBpZiAocXVvdGVkIHx8IGN1cnJlbnQubGVuZ3RoID4gMCkge1xuICAgICAgYXJncy5wdXNoKGN1cnJlbnQpO1xuICAgIH1cbiAgICBjdXJyZW50ID0gXCJcIjtcbiAgICBxdW90ZWQgPSBmYWxzZTtcbiAgfTtcblxuICBmb3IgKGNvbnN0IGNoIG9mIGNvbW1hbmQpIHtcbiAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gXCJcXFxcXCIpIHtcbiAgICAgIGVzY2FwZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHF1b3RlKSB7XG4gICAgICBpZiAoY2ggPT09IHF1b3RlKSB7XG4gICAgICAgIHF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgICBxdW90ZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudCArPSBjaDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gXCInXCIgfHwgY2ggPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2g7XG4gICAgICBxdW90ZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKC9cXHMvLnRlc3QoY2gpKSB7XG4gICAgICBwdXNoKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjdXJyZW50ICs9IGNoO1xuICB9XG5cbiAgLy8gTWFsZm9ybWVkIGlucHV0OiB0cmVhdCBhcyBhIGxpdGVyYWwgY29tbWFuZC5cbiAgaWYgKHF1b3RlKSB7XG4gICAgcmV0dXJuIFtjb21tYW5kXTtcbiAgfVxuXG4gIC8vIFRyYWlsaW5nIGJhY2tzbGFzaCBpcyBsaXRlcmFsLlxuICBpZiAoZXNjYXBlZCkge1xuICAgIGN1cnJlbnQgKz0gXCJcXFxcXCI7XG4gIH1cblxuICBwdXNoKCk7XG5cbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID8gYXJncyA6IFtjb21tYW5kXTtcbn1cbiJdfQ==
550
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRDRztBQUNILE9BQU8sRUFHTCxLQUFLLElBQUksU0FBUyxFQUNsQixTQUFTLElBQUksYUFBYSxHQUMzQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sS0FBSyxRQUFRLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxDQUFDO0FBcUkvQyxTQUFTLGNBQWMsQ0FBeUIsS0FBbUI7SUFDakUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUMvQixNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQU0sQ0FBQyxDQUFDO0lBRWhELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixNQUFNLE9BQU8sR0FDWCxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZGLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzlELE1BQU0sU0FBUyxHQUNiLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxP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QUFJLEVBQUUsQ0FBQztJQUVQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBvcnRhYmxlIHN1YnByb2Nlc3MgaGVscGVyIGJ1aWx0IG9uIGBjaGlsZF9wcm9jZXNzLnNwYXduYCBhbmQgbGluZSBzdHJlYW1pbmcuXG4gKlxuICogRWFjaCBzdGRpbyBmZCBkZWZhdWx0cyB0byBgXCJpbmhlcml0XCJgLiB7QGxpbmsgc3Bhd259IHN0cmVhbXMgb3V0cHV0XG4gKiBsaW5lLWJ5LWxpbmUgaW50byB7QGxpbmsgRXhlY1Jlc3VsdC5zdGRvdXRMaW5lc31cbiAqIC8ge0BsaW5rIEV4ZWNSZXN1bHQuc3RkZXJyTGluZXN9OyBpdHMgYHN0ZG91dGAgLyBgc3RkZXJyYCBnZXR0ZXJzIGpvaW4gdGhvc2UgbGluZXMuXG4gKiB7QGxpbmsgc3Bhd25TeW5jfSBrZWVwcyB0aGUgY2FwdHVyZWQgc3RyaW5nOyBpdHMgYHN0ZG91dGAgLyBgc3RkZXJyYCBnZXR0ZXJzIHJlYWRcbiAqIHRoYXQgc3RyaW5nIGRpcmVjdGx5IChsaW5lIGFycmF5cyBzcGxpdCBsYXppbHkgb24gcmVhZCkuXG4gKiBPbWl0dGVkIGB0cmltYCAoZGVmYXVsdCkgYXBwbGllcyBhZGFwdGl2ZSBub3JtYWxpemF0aW9uOiB7QGxpbmsgc3Bhd25TeW5jfSBkcm9wc1xuICogYXQgbW9zdCBvbmUgdHJhaWxpbmcgZW1wdHkgbGluZSAvIG5ld2xpbmUgYHNwYXduU3luY2AgYWRkczsge0BsaW5rIHNwYXdufSBkb2VzXG4gKiBub3QgKHJlYWRsaW5lIG5ldmVyIGVtaXRzIHRoYXQgZXh0cmEgbGluZSkuIGB0cmltOiB0cnVlYCBzdHJpcHMgYWxsIGxlYWRpbmcvXG4gKiB0cmFpbGluZyB3aGl0ZXNwYWNlIGluIGJvdGggbW9kZXM7IGB0cmltOiBmYWxzZWAgbGVhdmVzIG91dHB1dCB1bmNoYW5nZWQuXG4gKlxuICogVGhpcyBtb2R1bGUgb3ducyBzdWJwcm9jZXNzIGV4ZWN1dGlvbiBwb2xpY3kgZm9yIE5vZGUgYW5kIEJ1biBwYWNrYWdlcy4gUmV1c2VcbiAqIGl0IGluc3RlYWQgb2Ygd3JhcHBpbmcgYGNoaWxkX3Byb2Nlc3NgIGxvY2FsbHkgd2hlbiBjYWxsZXJzIG5lZWQgY29uc2lzdGVudFxuICogYXJndiBwYXJzaW5nLCBzdGRpbyBjYXB0dXJlLCBsaW5lIGNhbGxiYWNrcywgY2FuY2VsbGF0aW9uLCBhbmQgZXhpdCBjaGVja2luZy5cbiAqXG4gKiBAZXhhbXBsZSBDYXB0dXJlIGNvbW1hbmQgb3V0cHV0XG4gKiBgYGB0c1xuICogY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWMoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiLS1zaG93LXRvcGxldmVsXCJdLCB7XG4gKiAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gKiAgIHN0ZGVycjogXCJpZ25vcmVcIixcbiAqICAgc3RkaW46IFwiaWdub3JlXCIsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFN0cmVhbSBhbmQgY2FwdHVyZSB0b2dldGhlclxuICogYGBgdHNcbiAqIGF3YWl0IGV4ZWMoXCJwbnBtXCIsIFtcImluc3RhbGxcIl0sIHtcbiAqICAgc3Rkb3V0OiBbKGxpbmUpID0+IGNvbnNvbGUubG9nKGxpbmUpLCBcImNhcHR1cmVcIl0sXG4gKiAgIGNoZWNrOiB0cnVlLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBTeW5jaHJvbm91cyBjYXB0dXJlIChubyBsaW5lIGNhbGxiYWNrcylcbiAqIGBgYHRzXG4gKiBjb25zdCB7IHN0ZG91dCB9ID0gZXhlY1N5bmMoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiLS1zaG93LXRvcGxldmVsXCJdLCB7XG4gKiAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gKiAgIHN0ZGVycjogXCJpZ25vcmVcIixcbiAqICAgc3RkaW46IFwiaWdub3JlXCIsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHtcbiAgdHlwZSBDaGlsZFByb2Nlc3MsXG4gIHR5cGUgU3Bhd25PcHRpb25zLFxuICBzcGF3biBhcyBub2RlU3Bhd24sXG4gIHNwYXduU3luYyBhcyBub2RlU3Bhd25TeW5jLFxufSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tIFwibm9kZTpyZWFkbGluZVwiO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tIFwibm9kZTpzdHJlYW1cIjtcbmltcG9ydCB7IGZpbmlzaGVkIH0gZnJvbSBcIm5vZGU6c3RyZWFtL3Byb21pc2VzXCI7XG5cbi8qKiBTaGVsbC1jb21wYXRpYmxlIGV4aXQgY29kZSByZXR1cm5lZCB3aGVuIGFuIGV4ZWN1dGFibGUgY2Fubm90IGJlIGZvdW5kLiAqL1xuZXhwb3J0IGNvbnN0IENPTU1BTkRfTk9UX0ZPVU5EX0VYSVRfQ09ERSA9IDEyNztcblxuLyoqIFN0ZGlvIG1vZGUgZm9yIGEgc3VicHJvY2VzcyBmZC4gKi9cbmV4cG9ydCB0eXBlIEV4ZWNTdGRpbyA9IFwiaW5oZXJpdFwiIHwgXCJwaXBlXCIgfCBcImlnbm9yZVwiO1xuXG4vKiogSW52b2tlZCBvbmNlIHBlciBvdXRwdXQgbGluZSB3aGVuIGEgZmQgaXMgcGlwZWQuICovXG5leHBvcnQgdHlwZSBMaW5lSGFuZGxlciA9IChsaW5lOiBzdHJpbmcpID0+IHZvaWQ7XG5cbi8qKiBTdHJlYW0gbGluZXMgdG8gYSBoYW5kbGVyIHdpdGggb3B0aW9uYWwgcmVzdWx0IGNhcHR1cmUuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmVPdXRwdXRPcHRpb25zIHtcbiAgLyoqIEludm9rZWQgb25jZSBwZXIgb3V0cHV0IGxpbmUuICovXG4gIG9uTGluZTogTGluZUhhbmRsZXI7XG4gIC8qKiBSZXRhaW4gbGluZXMgaW4gdGhlIGNvbXBsZXRlZCByZXN1bHQuIERlZmF1bHRzIHRvIGB0cnVlYC4gKi9cbiAgY2FwdHVyZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogU3RkaW8gY29uZmlnIGZvciBvbmUgZmQuXG4gKlxuICogLSBgXCJpbmhlcml0XCJgIC8gYFwicGlwZVwiYCAvIGBcImlnbm9yZVwiYCDigJQgcGFzcyB0aHJvdWdoIHRvIGBzcGF3bmBcbiAqIC0gYFwiY2FwdHVyZVwiYCDigJQgcGlwZSB0aGUgZmQgYW5kIGFwcGVuZCBlYWNoIGxpbmUgdG8gdGhlIHJlc3VsdFxuICogLSB7QGxpbmsgTGluZUhhbmRsZXJ9IOKAlCBwaXBlIGFuZCBpbnZva2UgdGhlIGhhbmRsZXIgcGVyIGxpbmUgKGxpbmVzIGFyZSBzdGlsbCBjYXB0dXJlZClcbiAqIC0ge0BsaW5rIExpbmVPdXRwdXRPcHRpb25zfSDigJQgcGlwZSBhbmQgaW52b2tlIHRoZSBoYW5kbGVyLCB3aXRoIG9wdGlvbmFsIGNhcHR1cmVcbiAqIC0gYChMaW5lSGFuZGxlciB8IFwiY2FwdHVyZVwiKVtdYCDigJQgcGlwZTsgYFwiY2FwdHVyZVwiYCBpcyBhIG5vLW9wIG1hcmtlciwgaGFuZGxlcnMgcnVuIHBlciBsaW5lXG4gKi9cbmV4cG9ydCB0eXBlIFN0ZGlvT3B0aW9uID1cbiAgRXhlY1N0ZGlvIHwgTGluZUhhbmRsZXIgfCBMaW5lT3V0cHV0T3B0aW9ucyB8IFwiY2FwdHVyZVwiIHwgKExpbmVIYW5kbGVyIHwgXCJjYXB0dXJlXCIpW107XG5cbi8qKiBPdXRjb21lIG9mIHtAbGluayBzcGF3bn0gLyB7QGxpbmsgc3Bhd25TeW5jfTogZXhpdCBjb2RlLCBjYXB0dXJlZCBvdXRwdXQsIGFuZCBsaW5lIHZpZXdzLiAqL1xuZXhwb3J0IHR5cGUgRXhlY1Jlc3VsdCA9IHtcbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZG91dCBsaW5lcy4gRm9yIHtAbGluayBzcGF3bn0gdGhlc2UgYXJlIGJ1aWx0IHdoaWxlIHRoZSBwcm9jZXNzIHJ1bnM7XG4gICAqIGZvciB7QGxpbmsgc3Bhd25TeW5jfSB0aGV5IGFyZSBzcGxpdCBmcm9tIHRoZSBjYXB0dXJlZCBzdHJpbmcgb24gZmlyc3QgcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZG91dExpbmVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZGVyciBsaW5lcy4gRm9yIHtAbGluayBzcGF3bn0gdGhlc2UgYXJlIGJ1aWx0IHdoaWxlIHRoZSBwcm9jZXNzIHJ1bnM7XG4gICAqIGZvciB7QGxpbmsgc3Bhd25TeW5jfSB0aGV5IGFyZSBzcGxpdCBmcm9tIHRoZSBjYXB0dXJlZCBzdHJpbmcgb24gZmlyc3QgcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZGVyckxpbmVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZG91dCB0ZXh0LiB7QGxpbmsgc3Bhd25TeW5jfSByZWFkcyB0aGUgY2FwdHVyZWQgc3RyaW5nO1xuICAgKiB7QGxpbmsgc3Bhd259IGpvaW5zIHtAbGluayBzdGRvdXRMaW5lc30uIFNlZSBgdHJpbWAgZm9yIG5vcm1hbGl6YXRpb24uXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZGVyciB0ZXh0LiB7QGxpbmsgc3Bhd25TeW5jfSByZWFkcyB0aGUgY2FwdHVyZWQgc3RyaW5nO1xuICAgKiB7QGxpbmsgc3Bhd259IGpvaW5zIHtAbGluayBzdGRlcnJMaW5lc30uIFNlZSBgdHJpbWAgZm9yIG5vcm1hbGl6YXRpb24uXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbn07XG5cbi8qKlxuICogV2hhdCB7QGxpbmsgc3Bhd259IHJldHVybnM6IHRoZSBMSVZFIGBDaGlsZFByb2Nlc3NgIGhhbmRsZSB0aGF0IGlzIEFMU08gYVxuICogYFByb21pc2U8RXhlY1Jlc3VsdD5gIHJlc29sdmluZyBvbiBleGl0LlxuICpcbiAqIFRoaXMgaXMgYWRkaXRpdmUgLSB0aGUgb2JqZWN0IHN0aWxsIHNhdGlzZmllcyBgUHJvbWlzZTxFeGVjUmVzdWx0PmAsIHNvIGV2ZXJ5XG4gKiBleGlzdGluZyBgYXdhaXQgc3Bhd24oLi4uKWAgLyBgc3Bhd24oLi4uKS50aGVuKC4uLilgIGNhbGxlciBpcyB1bmNoYW5nZWQuIFdoYXRcbiAqIGlzIG5ldyBpcyB0aGF0IHRoZSBzYW1lIHZhbHVlIGlzIHRoZSBsaXZlIGNoaWxkOiBjYWxsZXJzIHRoYXQgd2FudCB0byBzdXBlcnZpc2VcbiAqIGl0IChyZWFkIGAucGlkYCwgYC5raWxsKHNpZ25hbClgLCBsaXN0ZW4gZm9yIGBleGl0YCkgY2FuLCB3aXRob3V0IGEgc2Vjb25kXG4gKiBzcGF3bi4gYEBkYngtdG9vbHMvYXBwa2l0YCdzIGBiaW5kUHJvY2Vzc2AgY29uc3VtZXMgZXhhY3RseSB0aGlzIC0gb25lIGNvZGUgcGF0aFxuICogc3VwZXJ2aXNlcyBib3RoIGEgYmFyZSBgQ2hpbGRQcm9jZXNzYCAoZS5nLiBwb3J0cikgYW5kIGEgYHNwYXduKClgIHJlc3VsdC5cbiAqXG4gKiBAZXhhbXBsZSBBd2FpdCBpdCAodW5jaGFuZ2VkKVxuICogY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduKFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIkhFQURcIl0sIHsgc3Rkb3V0OiBcImNhcHR1cmVcIiB9KTtcbiAqXG4gKiBAZXhhbXBsZSBTdXBlcnZpc2UgaXRcbiAqIGNvbnN0IHByb2MgPSBzcGF3bihcImJ1blwiLCBbXCJzcmMvc2VydmVyLnRzXCJdKTtcbiAqIGN0eC5iaW5kUHJvY2Vzcyhwcm9jKTsgICAgICAgICAgICAvLyBsaXZlIGhhbmRsZVxuICogY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcHJvYzsgIC8vIHN0aWxsIGEgcHJvbWlzZVxuICovXG5leHBvcnQgdHlwZSBDaGlsZFByb2Nlc3NSZXN1bHQgPSBDaGlsZFByb2Nlc3MgJiBQcm9taXNlPEV4ZWNSZXN1bHQ+O1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHNwYXdufS4gRXh0ZW5kcyBgU3Bhd25PcHRpb25zYCBleGNlcHQgYHN0ZGlvYCwgd2hpY2ggaXMgZHJpdmVuIGJ5IGBzdGRpbmAgLyBgc3Rkb3V0YCAvIGBzdGRlcnJgLiAqL1xuZXhwb3J0IHR5cGUgRXhlY09wdGlvbnMgPSBPbWl0PFNwYXduT3B0aW9ucywgXCJzdGRpb1wiPiAmIHtcbiAgLyoqIGBcImluaGVyaXRcImAgYnkgZGVmYXVsdDsgYFwicGlwZVwiYCAvIGBcImlnbm9yZVwiYCBzZWxlY3QgbW9kZXMsIGFueSBvdGhlciBzdHJpbmcgaXMgaW5wdXQuICovXG4gIHN0ZGluPzogRXhlY1N0ZGlvIHwgc3RyaW5nO1xuICBzdGRvdXQ/OiBTdGRpb09wdGlvbjtcbiAgc3RkZXJyPzogU3RkaW9PcHRpb247XG4gIC8qKiBUaHJvdyB3aGVuIHRoZSBwcm9jZXNzIGV4aXRzIHdpdGggYSBub24temVybyBjb2RlLiAqL1xuICBjaGVjaz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBPbWl0dGVkIOKAlCBhZGFwdGl2ZSB0cmltICh7QGxpbmsgc3Bhd25TeW5jfSBkcm9wcyBvbmUgc3Bhd24gdHJhaWxpbmcgbmV3bGluZSxcbiAgICoge0BsaW5rIHNwYXdufSBkb2VzIG5vdCk7IGB0cnVlYCDigJQgc3RyaXAgYWxsIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZTtcbiAgICogYGZhbHNlYCDigJQgbGVhdmUgY2FwdHVyZWQgb3V0cHV0IHVuY2hhbmdlZC5cbiAgICovXG4gIHRyaW0/OiBib29sZWFuO1xufTtcblxuLyoqIFN0ZGlvIG1vZGUgZm9yIHtAbGluayBzcGF3blN5bmN9IChubyBwZXItbGluZSBjYWxsYmFja3MpLiAqL1xuZXhwb3J0IHR5cGUgU3luY0V4ZWNTdGRpbyA9IEV4ZWNTdGRpbyB8IFwiY2FwdHVyZVwiO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHNwYXduU3luY30uIFNhbWUgc2hhcGUgYXMge0BsaW5rIEV4ZWNPcHRpb25zfSBidXQgd2l0aG91dCBsaW5lLWhhbmRsZXIgc3RkaW8uICovXG5leHBvcnQgdHlwZSBTeW5jRXhlY09wdGlvbnMgPSBPbWl0PFNwYXduT3B0aW9ucywgXCJzdGRpb1wiPiAmIHtcbiAgLyoqIGBcImluaGVyaXRcImAgYnkgZGVmYXVsdDsgYFwicGlwZVwiYCAvIGBcImlnbm9yZVwiYCBzZWxlY3QgbW9kZXMsIGFueSBvdGhlciBzdHJpbmcgaXMgaW5wdXQuICovXG4gIHN0ZGluPzogRXhlY1N0ZGlvIHwgc3RyaW5nO1xuICBzdGRvdXQ/OiBTeW5jRXhlY1N0ZGlvO1xuICBzdGRlcnI/OiBTeW5jRXhlY1N0ZGlvO1xuICAvKiogVGhyb3cgd2hlbiB0aGUgcHJvY2VzcyBleGl0cyB3aXRoIGEgbm9uLXplcm8gY29kZS4gKi9cbiAgY2hlY2s/OiBib29sZWFuO1xuICAvKipcbiAgICogT21pdHRlZCDigJQgYWRhcHRpdmUgdHJpbSAoe0BsaW5rIHNwYXduU3luY30gZHJvcHMgb25lIHNwYXduIHRyYWlsaW5nIG5ld2xpbmUsXG4gICAqIHtAbGluayBzcGF3bn0gZG9lcyBub3QpOyBgdHJ1ZWAg4oCUIHN0cmlwIGFsbCBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2U7XG4gICAqIGBmYWxzZWAg4oCUIGxlYXZlIGNhcHR1cmVkIG91dHB1dCB1bmNoYW5nZWQuXG4gICAqL1xuICB0cmltPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd24gc3RkaW8gbW9kZSBwbHVzIGFuIG9wdGlvbmFsIHBlci1saW5lIGNhbGxiYWNrIGFmdGVyIHtAbGluayByZXNvbHZlU3RkaW99XG4gKiBtYXBzIGEge0BsaW5rIFN0ZGlvT3B0aW9ufSBpbnRvIHNvbWV0aGluZyBgc3Bhd25gIGNhbiBjb25zdW1lLlxuICovXG50eXBlIFJlc29sdmVkU3RkaW8gPSB7XG4gIC8qKiBWYWx1ZSBwYXNzZWQgdG8gYHNwYXduYCdzIGBzdGRpb2AgdHVwbGUgZm9yIHRoaXMgZmQuICovXG4gIG1vZGU6IEV4ZWNTdGRpbztcbiAgLyoqIFdoZW4gc2V0LCBlYWNoIG91dHB1dCBsaW5lIGlzIGFwcGVuZGVkIHRvIHRoZSBjYXB0dXJlIGJ1ZmZlciBhbmQgZm9yd2FyZGVkIGhlcmUuICovXG4gIG9uTGluZT86IExpbmVIYW5kbGVyO1xufTtcblxuLyoqIFN1cHBvcnRlZCBjb21tYW5kLCBhcmd1bWVudC1hcnJheSwgdmFyaWFkaWMtYXJndW1lbnQsIGFuZCBvcHRpb25zIGNhbGwgZm9ybXMuICovXG5leHBvcnQgdHlwZSBTcGF3bkFyZ3M8VCBleHRlbmRzIFNwYXduT3B0aW9ucz4gPVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdXVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdXVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBvcHRpb25zOiBUXVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIC4uLmFyZ3NBbmRPcHRpb25zOiBbLi4uc3RyaW5nW10sIFRdXTtcblxuaW50ZXJmYWNlIFBhcnNlZFNwYXduQXJnczxUIGV4dGVuZHMgU3Bhd25PcHRpb25zPiB7XG4gIGNvbW1hbmQ6IHN0cmluZztcbiAgY29tbWFuZEFyZ3M6IHN0cmluZ1tdO1xuICBvcHRpb25zPzogVDtcbn1cblxuZnVuY3Rpb24gcGFyc2VTcGF3bkFyZ3M8VCBleHRlbmRzIFNwYXduT3B0aW9ucz4oaW5wdXQ6IFNwYXduQXJnczxUPik6IFBhcnNlZFNwYXduQXJnczxUPiB7XG4gIGxldCBbdmFsdWUsIC4uLnZhbHVlc10gPSBpbnB1dDtcbiAgY29uc3QgW2NvbW1hbmQsIC4uLmNvbW1hbmRBcmdzXSA9IHNobGV4KHZhbHVlISk7XG5cbiAgY29uc3QgbGFzdCA9IHZhbHVlcy5hdCgtMSk7XG4gIGNvbnN0IG9wdGlvbnMgPVxuICAgIGxhc3QgIT09IG51bGwgJiYgdHlwZW9mIGxhc3QgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkobGFzdCkgPyBsYXN0IDogdW5kZWZpbmVkO1xuICBjb25zdCBhcmd1bWVudFZhbHVlcyA9IG9wdGlvbnMgPyB2YWx1ZXMuc2xpY2UoMCwgLTEpIDogdmFsdWVzO1xuICBjb25zdCB2YWx1ZUFyZ3M6IHN0cmluZ1tdID1cbiAgICBhcmd1bWVudFZhbHVlcy5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShhcmd1bWVudFZhbHVlc1swXSlcbiAgICAgID8gWy4uLmFyZ3VtZW50VmFsdWVzWzBdXVxuICAgICAgOiBhcmd1bWVudFZhbHVlcztcblxuICByZXR1cm4ge1xuICAgIGNvbW1hbmQ6IGNvbW1hbmQhLFxuICAgIGNvbW1hbmRBcmdzOiBbLi4uY29tbWFuZEFyZ3MsIC4uLnZhbHVlQXJnc10sXG4gICAgb3B0aW9uczogb3B0aW9ucyBhcyBULFxuICB9O1xufVxuXG4vKipcbiAqIERyb3AgdGhlIHNpbmdsZSB0cmFpbGluZyBlbXB0eSBlbnRyeSBgc3Bhd25TeW5jYCBhZGRzIHdoZW4gc3BsaXR0aW5nIG9uIGEgZmluYWxcbiAqIG5ld2xpbmUgKGBcImhpXFxuXCJgIC0+IGBbXCJoaVwiLCBcIlwiXWApLiBEb2VzIG5vdCByZW1vdmUgbXVsdGlwbGUgdHJhaWxpbmcgZW1wdGllcy5cbiAqL1xuZnVuY3Rpb24gd2l0aG91dFNwYXduVHJhaWxpbmdFbXB0eUxpbmUobGluZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBpZiAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9PT0gXCJcIikge1xuICAgIHJldHVybiBsaW5lcy5zbGljZSgwLCAtMSk7XG4gIH1cbiAgcmV0dXJuIGxpbmVzIGFzIHN0cmluZ1tdO1xufVxuXG4vKiogUmVtb3ZlIGF0IG1vc3Qgb25lIHRyYWlsaW5nIG5ld2xpbmUgZnJvbSBjYXB0dXJlZCBzcGF3biBzdGRvdXQvc3RkZXJyIHRleHQuICovXG5mdW5jdGlvbiB0cmltU2luZ2xlVHJhaWxpbmdOZXdsaW5lKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh0ZXh0LmVuZHNXaXRoKFwiXFxyXFxuXCIpKSByZXR1cm4gdGV4dC5zbGljZSgwLCAtMik7XG4gIGlmICh0ZXh0LmVuZHNXaXRoKFwiXFxuXCIpKSByZXR1cm4gdGV4dC5zbGljZSgwLCAtMSk7XG4gIHJldHVybiB0ZXh0O1xufVxuXG4vKiogTGluZS1hcnJheSB2aWV3IG9mIGFzeW5jLWNhcHR1cmVkIG91dHB1dC4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRBc3luY0xpbmVzKGxpbmVzOiByZWFkb25seSBzdHJpbmdbXSwgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgaWYgKHRyaW0gPT09IHRydWUpIHJldHVybiBsaW5lc0Zyb21DYXB0dXJlZE91dHB1dChsaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKSk7XG4gIHJldHVybiBsaW5lcyBhcyBzdHJpbmdbXTtcbn1cblxuLyoqIEpvaW4gYXN5bmMtY2FwdHVyZWQgbGluZXMgaW50byBzdGRvdXQvc3RkZXJyIHRleHQuICovXG5mdW5jdGlvbiBmb3JtYXRBc3luY0NhcHR1cmVkTGluZXMobGluZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgY29uc3Qgam9pbmVkID0gbGluZXMuam9pbihcIlxcblwiKTtcbiAgcmV0dXJuIHRyaW0gPT09IHRydWUgPyBqb2luZWQudHJpbSgpIDogam9pbmVkO1xufVxuXG4vKiogTGluZS1hcnJheSB2aWV3IG9mIHN5bmMtY2FwdHVyZWQgb3V0cHV0LiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplZFN5bmNMaW5lcyhsaW5lczogcmVhZG9ubHkgc3RyaW5nW10sIHRyaW06IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIGlmICh0cmltID09PSBmYWxzZSkgcmV0dXJuIGxpbmVzIGFzIHN0cmluZ1tdO1xuICBpZiAodHJpbSA9PT0gdHJ1ZSkgcmV0dXJuIGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KGxpbmVzLmpvaW4oXCJcXG5cIikudHJpbSgpKTtcbiAgcmV0dXJuIHdpdGhvdXRTcGF3blRyYWlsaW5nRW1wdHlMaW5lKGxpbmVzKTtcbn1cblxuLyoqIEZvcm1hdCBzeW5jLWNhcHR1cmVkIHN0ZG91dC9zdGRlcnIgdGV4dC4gKi9cbmZ1bmN0aW9uIGZvcm1hdFN5bmNDYXB0dXJlZFRleHQoXG4gIHRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0ZXh0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0cmltID09PSBmYWxzZSkgcmV0dXJuIHRleHQ7XG4gIGlmICh0cmltID09PSB0cnVlKSByZXR1cm4gdGV4dC50cmltKCk7XG4gIHJldHVybiB0cmltU2luZ2xlVHJhaWxpbmdOZXdsaW5lKHRleHQpO1xufVxuXG4vKipcbiAqIEh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciBhIHNwYXduZWQgY29tbWFuZCwgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIEV4ZWN1dGFibGUgbmFtZSBvciBwYXRoXG4gKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGV4ZWN1dGFibGVcbiAqIEByZXR1cm5zIEJhY2t0aWNrLXdyYXBwZWQgYGNvbW1hbmQgYXJnMSBhcmcyIC4uLmAgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNvbW1hbmRMYWJlbChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcXGAke2NvbW1hbmR9ICR7YXJncy5qb2luKFwiIFwiKX1cXGBgO1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgTm9kZSBmYWlsZWQgdG8gc3Bhd24gYmVjYXVzZSB0aGUgZXhlY3V0YWJsZSB3YXMgbm90IGZvdW5kLiAqL1xuZnVuY3Rpb24gaXNDb21tYW5kTm90Rm91bmRFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCI7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIHtAbGluayBzcGF3bn0gd2l0aCBsaXZlIGxpbmUgYXJyYXlzIGFuZCBsYXp5XG4gKiB0cmltbWVkIGBzdGRvdXRgIC8gYHN0ZGVycmAgZ2V0dGVycyBkZXJpdmVkIGZyb20gdGhvc2UgbGluZXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUV4ZWNSZXN1bHQoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN0ZG91dExpbmVzOiBzdHJpbmdbXSxcbiAgc3RkZXJyTGluZXM6IHN0cmluZ1tdLFxuICB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogRXhlY1Jlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgZXhpdENvZGUsXG4gICAgZ2V0IHN0ZG91dExpbmVzKCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRBc3luY0xpbmVzKHN0ZG91dExpbmVzLCB0cmltKTtcbiAgICB9LFxuICAgIGdldCBzdGRlcnJMaW5lcygpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkQXN5bmNMaW5lcyhzdGRlcnJMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgICBnZXQgc3Rkb3V0KCkge1xuICAgICAgcmV0dXJuIGZvcm1hdEFzeW5jQ2FwdHVyZWRMaW5lcyhzdGRvdXRMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyKCkge1xuICAgICAgcmV0dXJuIGZvcm1hdEFzeW5jQ2FwdHVyZWRMaW5lcyhzdGRlcnJMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgb2JqZWN0IHJldHVybmVkIGZyb20ge0BsaW5rIHNwYXduU3luY30uIENhcHR1cmVkIHN0cmluZ3MgYXJlIHN0b3JlZFxuICogYXMtaXM7IGBzdGRvdXRgIC8gYHN0ZGVycmAgdHJpbSBkaXJlY3RseSwgYW5kIGxpbmUgYXJyYXlzIHNwbGl0IG9ubHkgb24gcmVhZC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3luY0V4ZWNSZXN1bHQoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN0ZG91dFRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgc3RkZXJyVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogRXhlY1Jlc3VsdCB7XG4gIGxldCBzdGRvdXRMaW5lc0NhY2hlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0ZGVyckxpbmVzQ2FjaGU6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN5bmNMaW5lcyA9ICh0ZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHRleHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbm9ybWFsaXplZFN5bmNMaW5lcyhsaW5lc0Zyb21DYXB0dXJlZE91dHB1dCh0ZXh0KSwgdHJpbSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBleGl0Q29kZSxcbiAgICBnZXQgc3Rkb3V0TGluZXMoKSB7XG4gICAgICBpZiAoc3Rkb3V0VGV4dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG4gICAgICBzdGRvdXRMaW5lc0NhY2hlID8/PSBzeW5jTGluZXMoc3Rkb3V0VGV4dCkgPz8gW107XG4gICAgICByZXR1cm4gc3Rkb3V0TGluZXNDYWNoZTtcbiAgICB9LFxuICAgIGdldCBzdGRlcnJMaW5lcygpIHtcbiAgICAgIGlmIChzdGRlcnJUZXh0ID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgICAgIHN0ZGVyckxpbmVzQ2FjaGUgPz89IHN5bmNMaW5lcyhzdGRlcnJUZXh0KSA/PyBbXTtcbiAgICAgIHJldHVybiBzdGRlcnJMaW5lc0NhY2hlO1xuICAgIH0sXG4gICAgZ2V0IHN0ZG91dCgpIHtcbiAgICAgIHJldHVybiBmb3JtYXRTeW5jQ2FwdHVyZWRUZXh0KHN0ZG91dFRleHQsIHRyaW0pID8/IFwiXCI7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyKCkge1xuICAgICAgcmV0dXJuIGZvcm1hdFN5bmNDYXB0dXJlZFRleHQoc3RkZXJyVGV4dCwgdHJpbSkgPz8gXCJcIjtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdXNlci1zdXBwbGllZCBsaW5lIGhhbmRsZXJzIGZyb20gYSB7QGxpbmsgU3RkaW9PcHRpb259LlxuICpcbiAqIFRoZSBgXCJjYXB0dXJlXCJgIG1hcmtlciBpcyBmaWx0ZXJlZCBvdXQ7IGNhcHR1cmUgaXRzZWxmIGlzIGFsd2F5cyBoYW5kbGVkIGJ5XG4gKiBwdXNoaW5nIGludG8gdGhlIGxpbmUgYnVmZmVyIGluc2lkZSB7QGxpbmsgcmVzb2x2ZVN0ZGlvfS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uIC0gU3RkaW8gb3B0aW9uIHRoYXQgbWF5IGVtYmVkIG9uZSBvciBtb3JlIGhhbmRsZXJzXG4gKiBAcmV0dXJucyBIYW5kbGVycyB0byBpbnZva2UgYWZ0ZXIgZWFjaCBjYXB0dXJlZCBsaW5lIChtYXkgYmUgZW1wdHkpXG4gKi9cbmZ1bmN0aW9uIGxpbmVIYW5kbGVycyhvcHRpb246IFN0ZGlvT3B0aW9uKTogTGluZUhhbmRsZXJbXSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9uID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBbb3B0aW9uXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uKSkge1xuICAgIHJldHVybiBvcHRpb24uZmlsdGVyKChpdGVtKTogaXRlbSBpcyBMaW5lSGFuZGxlciA9PiBpdGVtICE9PSBcImNhcHR1cmVcIik7XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRpb24gPT09IFwib2JqZWN0XCIpIHJldHVybiBbb3B0aW9uLm9uTGluZV07XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gY2FwdHVyZXNMaW5lcyhvcHRpb246IFN0ZGlvT3B0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygb3B0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkob3B0aW9uKSB8fCBvcHRpb24uY2FwdHVyZSAhPT0gZmFsc2U7XG59XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGEgc3RkaW8gb3B0aW9uIGlzIGEgc3RyaW5nIHNwYXduIG1vZGUgcmF0aGVyIHRoYW4gY2FwdHVyZS9oYW5kbGVycy5cbiAqXG4gKiB7QGxpbmsgcmVzb2x2ZVN0ZGlvfSBzdGlsbCB0cmVhdHMgYFwicGlwZVwiYCBhcyBwaXBlLWFuZC1jYXB0dXJlOyBvbmx5XG4gKiBgXCJpbmhlcml0XCJgIGFuZCBgXCJpZ25vcmVcImAgcmV0dXJuIHdpdGhvdXQgYSBsaW5lIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSBvcHRpb24gLSBTdGRpbyBvcHRpb24gdG8gY2xhc3NpZnlcbiAqIEByZXR1cm5zIFdoZXRoZXIgYG9wdGlvbmAgaXMgYFwiaW5oZXJpdFwiYCwgYFwicGlwZVwiYCwgb3IgYFwiaWdub3JlXCJgXG4gKi9cbmZ1bmN0aW9uIGlzUGFzc3Rocm91Z2hNb2RlKG9wdGlvbjogdW5rbm93bik6IG9wdGlvbiBpcyBFeGVjU3RkaW8ge1xuICByZXR1cm4gb3B0aW9uID09PSBcImluaGVyaXRcIiB8fCBvcHRpb24gPT09IFwicGlwZVwiIHx8IG9wdGlvbiA9PT0gXCJpZ25vcmVcIjtcbn1cblxuLyoqIFRydWUgd2hlbiBzdGRpbiBpcyBkYXRhIHJhdGhlciB0aGFuIG9uZSBvZiB0aGUgdGhyZWUgcmVzZXJ2ZWQgc3RkaW8gbW9kZXMuICovXG5mdW5jdGlvbiBpc1N0ZGluUGF5bG9hZChzdGRpbjogRXhlY1N0ZGlvIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RkaW4gaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBzdGRpbiA9PT0gXCJzdHJpbmdcIiAmJiAhaXNQYXNzdGhyb3VnaE1vZGUoc3RkaW4pO1xufVxuXG4vKipcbiAqIE1hcCBhIHtAbGluayBTdGRpb09wdGlvbn0gaW50byBhIHNwYXduIHN0ZGlvIG1vZGUgYW5kIG9wdGlvbmFsIGxpbmUgY2FsbGJhY2suXG4gKlxuICogUGlwZWQgbW9kZXMgKGBcImNhcHR1cmVcImAsIGBcInBpcGVcImAsIGhhbmRsZXJzLCBhcnJheXMpIGFwcGVuZCBldmVyeSBsaW5lIHRvXG4gKiBgbGluZXNgIGFuZCBpbnZva2UgYW55IGVtYmVkZGVkIGhhbmRsZXJzLiBPbWl0dGVkIG9wdGlvbnMgdXNlIGBkZWZhdWx0TW9kZWAuXG4gKlxuICogQHBhcmFtIG9wdGlvbiAtIENhbGxlciBzdGRpbyBwcmVmZXJlbmNlIGZvciBvbmUgZmRcbiAqIEBwYXJhbSBsaW5lcyAtIE11dGFibGUgYnVmZmVyIHRoYXQgcmVjZWl2ZXMgZWFjaCBwaXBlZCBsaW5lXG4gKiBAcGFyYW0gZGVmYXVsdE1vZGUgLSBTcGF3biBtb2RlIHdoZW4gYG9wdGlvbmAgaXMgb21pdHRlZCAoYFwiaW5oZXJpdFwiYCBieSBkZWZhdWx0KVxuICogQHJldHVybnMgUmVzb2x2ZWQgc3Bhd24gbW9kZSBhbmQgb3B0aW9uYWwgcGVyLWxpbmUgY2FsbGJhY2tcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN0ZGlvKFxuICBvcHRpb246IFN0ZGlvT3B0aW9uIHwgdW5kZWZpbmVkLFxuICBsaW5lczogc3RyaW5nW10sXG4gIGRlZmF1bHRNb2RlOiBFeGVjU3RkaW8gPSBcImluaGVyaXRcIixcbik6IFJlc29sdmVkU3RkaW8ge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB7IG1vZGU6IGRlZmF1bHRNb2RlIH07XG4gIGlmIChpc1Bhc3N0aHJvdWdoTW9kZShvcHRpb24pICYmIG9wdGlvbiAhPT0gXCJwaXBlXCIpIHJldHVybiB7IG1vZGU6IG9wdGlvbiB9O1xuXG4gIGNvbnN0IGhhbmRsZXJzID0gbGluZUhhbmRsZXJzKG9wdGlvbik7XG4gIGNvbnN0IGNhcHR1cmUgPSBjYXB0dXJlc0xpbmVzKG9wdGlvbik7XG4gIHJldHVybiB7XG4gICAgbW9kZTogXCJwaXBlXCIsXG4gICAgb25MaW5lOiAobGluZSkgPT4ge1xuICAgICAgaWYgKGNhcHR1cmUpIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIGhhbmRsZXIobGluZSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWFkIGEgcmVhZGFibGUgc3RyZWFtIGxpbmUtYnktbGluZSBhbmQgaW52b2tlIGBvbkxpbmVgIGZvciBlYWNoIGNodW5rLlxuICpcbiAqIFVzZXMgYHJlYWRsaW5lYCBzbyBgXFxyXFxuYCBhbmQgYmFyZSBgXFxuYCBhcmUgbm9ybWFsaXplZC4gVGhlIGludGVyZmFjZSBpc1xuICogYWx3YXlzIGNsb3NlZCBpbiBhIGBmaW5hbGx5YCBibG9jay5cbiAqXG4gKiBAcGFyYW0gc3RyZWFtIC0gU3VicHJvY2VzcyBzdGRvdXQgb3Igc3RkZXJyIHN0cmVhbVxuICogQHBhcmFtIG9uTGluZSAtIENhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgb3V0cHV0IGxpbmVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZExpbmVzKHN0cmVhbTogUmVhZGFibGUsIG9uTGluZTogTGluZUhhbmRsZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2UoeyBpbnB1dDogc3RyZWFtLCBjcmxmRGVsYXk6IEluZmluaXR5IH0pO1xuICB0cnkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgbGluZSBvZiBybCkgb25MaW5lKGxpbmUpO1xuICB9IGZpbmFsbHkge1xuICAgIHJsLmNsb3NlKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGFydCBhIGJhY2tncm91bmQgbGluZSByZWFkIHdoZW4gdGhlIHJlc29sdmVkIGhhbmRsZXIgcGlwZXMgYSBzdHJlYW0uXG4gKlxuICogQHBhcmFtIHJlYWRzIC0gUHJvbWlzZSBsaXN0IGF3YWl0ZWQgYmVmb3JlIHJldHVybmluZyB0aGUge0BsaW5rIEV4ZWNSZXN1bHR9XG4gKiBAcGFyYW0gc3RyZWFtIC0gU3VicHJvY2VzcyBzdHJlYW0gZm9yIHRoaXMgZmQgKGBudWxsYCB3aGVuIHVuYXZhaWxhYmxlKVxuICogQHBhcmFtIGhhbmRsZXIgLSBSZXNvbHZlZCBzdGRpbyBjb25maWcgZnJvbSB7QGxpbmsgcmVzb2x2ZVN0ZGlvfVxuICovXG5mdW5jdGlvbiBxdWV1ZUxpbmVSZWFkcyhcbiAgcmVhZHM6IFByb21pc2U8dm9pZD5bXSxcbiAgc3RyZWFtOiBSZWFkYWJsZSB8IG51bGwsXG4gIGhhbmRsZXI6IFJlc29sdmVkU3RkaW8sXG4pOiB2b2lkIHtcbiAgaWYgKGhhbmRsZXIub25MaW5lICYmIHN0cmVhbSkgcmVhZHMucHVzaChyZWFkTGluZXMoc3RyZWFtLCBoYW5kbGVyLm9uTGluZSkpO1xufVxuXG4vKipcbiAqIFdyaXRlIHN0cmluZyBzdGRpbiB0byBhIHNwYXduZWQgcHJvY2VzcyBhbmQgY2xvc2UgdGhlIHN0cmVhbS5cbiAqXG4gKiBOby1vcCB1bmxlc3MgYHN0ZGluYCBpcyBhIHBheWxvYWQgc3RyaW5nIChub3QgYSBzdGRpbyBtb2RlKSBhbmRcbiAqIGBwcm9jLnN0ZGluYCBpcyBhdmFpbGFibGUuIEEgY2hpbGQgdGhhdCBleGl0cyBiZWZvcmUgY29uc3VtaW5nIHRoZSBwYXlsb2FkXG4gKiBjbG9zZXMgaXRzIHBpcGU7IEVQSVBFIGlzIGV4cGVjdGVkIGluIHRoYXQgY2FzZSBhbmQgaXMgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0gcHJvYyAtIENoaWxkIHByb2Nlc3MgcmV0dXJuZWQgZnJvbSBgc3Bhd25gXG4gKiBAcGFyYW0gc3RkaW4gLSBTdGRpbyBtb2RlIG9yIHN0cmluZyBwYXlsb2FkIGZyb20ge0BsaW5rIEV4ZWNPcHRpb25zfVxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN0ZGluKFxuICBwcm9jOiBDaGlsZFByb2Nlc3MsXG4gIHN0ZGluOiBFeGVjU3RkaW8gfCBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1N0ZGluUGF5bG9hZChzdGRpbikgfHwgIXByb2Muc3RkaW4pIHJldHVybjtcbiAgY29uc3QgY29tcGxldGlvbiA9IGZpbmlzaGVkKHByb2Muc3RkaW4sIHsgY2xlYW51cDogdHJ1ZSB9KTtcbiAgcHJvYy5zdGRpbi5lbmQoc3RkaW4pO1xuICB0cnkge1xuICAgIGF3YWl0IGNvbXBsZXRpb247XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICghKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVyciAmJiBlcnIuY29kZSA9PT0gXCJFUElQRVwiKSkgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogQXdhaXQgcHJvY2VzcyBleGl0IGFuZCBub3JtYWxpemUgYSBtaXNzaW5nIGV4aXQgY29kZSB0byBgMWAuXG4gKlxuICogUmVqZWN0cyB3aGVuIHNwYXduIGZhaWxzIGJlZm9yZSBgY2xvc2VgIChlLmcuIGV4ZWN1dGFibGUgbm90IGZvdW5kKS5cbiAqXG4gKiBAcGFyYW0gcHJvYyAtIENoaWxkIHByb2Nlc3MgcmV0dXJuZWQgZnJvbSBgc3Bhd25gXG4gKiBAcmV0dXJucyBSZXNvbHZlZCBleGl0IGNvZGVcbiAqL1xuZnVuY3Rpb24gd2FpdEZvckV4aXQocHJvYzogQ2hpbGRQcm9jZXNzKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBwcm9jLm9uY2UoXCJlcnJvclwiLCByZWplY3QpO1xuICAgIHByb2Mub25jZShcImNsb3NlXCIsIChjb2RlKSA9PiByZXNvbHZlKGNvZGUgPz8gMSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbiBgRXJyb3JgIGZvciBhIG5vbi16ZXJvIGV4aXQgd2hlbiB7QGxpbmsgRXhlY09wdGlvbnMuY2hlY2t9IGlzIHNldC5cbiAqXG4gKiBQcmVmZXJzIHRyaW1tZWQgc3RkZXJyIHRleHQsIHRoZW4gc3Rkb3V0LCBpbiB0aGUgbWVzc2FnZSBib2R5LlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gRXhlY3V0YWJsZSBuYW1lIG9yIHBhdGhcbiAqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZXhlY3V0YWJsZVxuICogQHBhcmFtIHJlc3VsdCAtIENvbXBsZXRlZCBleGVjIG91dGNvbWUgd2l0aCBjYXB0dXJlZCBvdXRwdXRcbiAqIEByZXR1cm5zIEVycm9yIHN1aXRhYmxlIGZvciB0aHJvd2luZyBmcm9tIHtAbGluayBzcGF3bn1cbiAqL1xuZnVuY3Rpb24gZXhlY0Vycm9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIHJlc3VsdDogRXhlY1Jlc3VsdCk6IEVycm9yIHtcbiAgY29uc3QgZGV0YWlsID0gcmVzdWx0LnN0ZGVyciB8fCByZXN1bHQuc3Rkb3V0O1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGAke2NvbW1hbmRMYWJlbChjb21tYW5kLCBhcmdzKX0gZmFpbGVkIChleGl0ICR7cmVzdWx0LmV4aXRDb2RlfSkke2RldGFpbCA/IGA6ICR7ZGV0YWlsfWAgOiBcIlwifWAsXG4gICk7XG59XG5cbi8qKlxuICogTWFwIGEge0BsaW5rIFN5bmNFeGVjU3RkaW99IG9wdGlvbiB0byBhIGBzcGF3blN5bmNgIHN0ZGlvIG1vZGUuXG4gKlxuICogYFwiY2FwdHVyZVwiYCBwaXBlcyB0aGUgZmQgc28gb3V0cHV0IGNhbiBiZSByZWFkIGludG8gdGhlIHtAbGluayBFeGVjUmVzdWx0fS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uIC0gQ2FsbGVyIHN0ZGlvIHByZWZlcmVuY2UgZm9yIG9uZSBmZFxuICogQHBhcmFtIGRlZmF1bHRNb2RlIC0gU3Bhd24gbW9kZSB3aGVuIGBvcHRpb25gIGlzIG9taXR0ZWQgKGBcImluaGVyaXRcImAgYnkgZGVmYXVsdClcbiAqIEByZXR1cm5zIFZhbHVlIGZvciB0aGUgYHNwYXduU3luY2Agc3RkaW8gdHVwbGVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN5bmNTdGRpbyhcbiAgb3B0aW9uOiBTeW5jRXhlY1N0ZGlvIHwgdW5kZWZpbmVkLFxuICBkZWZhdWx0TW9kZTogRXhlY1N0ZGlvID0gXCJpbmhlcml0XCIsXG4pOiBFeGVjU3RkaW8ge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0TW9kZTtcbiAgaWYgKG9wdGlvbiA9PT0gXCJjYXB0dXJlXCIpIHJldHVybiBcInBpcGVcIjtcbiAgcmV0dXJuIG9wdGlvbjtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgcmF3IGBzcGF3blN5bmNgIG91dHB1dCB0byBhIFVURi04IHN0cmluZyB3aGVuIGNhcHR1cmUgaXMgZW5hYmxlZC5cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZWRUZXh0KG91dHB1dDogc3RyaW5nIHwgQnVmZmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvdXRwdXQgPT09IG51bGwgfHwgb3V0cHV0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2Ygb3V0cHV0ID09PSBcInN0cmluZ1wiID8gb3V0cHV0IDogb3V0cHV0LnRvU3RyaW5nKFwidXRmOFwiKTtcbn1cblxuLyoqXG4gKiBTcGxpdCBjYXB0dXJlZCBwcm9jZXNzIG91dHB1dCBpbnRvIGxpbmVzIGZvciB7QGxpbmsgRXhlY1Jlc3VsdC5zdGRvdXRMaW5lc30gL1xuICoge0BsaW5rIEV4ZWNSZXN1bHQuc3RkZXJyTGluZXN9ICh7QGxpbmsgc3Bhd25TeW5jfSBvbmx5OyBpbnZva2VkIGxhemlseSkuXG4gKi9cbmZ1bmN0aW9uIGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gb3V0cHV0LnJlcGxhY2UoL1xcclxcbi9nLCBcIlxcblwiKS5yZXBsYWNlKC9cXHIvZywgXCJcXG5cIikuc3BsaXQoXCJcXG5cIik7XG59XG5cbi8qKlxuICogU3Bhd24gYSBzdWJwcm9jZXNzLiBSZXR1cm5zIHRoZSBMSVZFIGNoaWxkIGhhbmRsZSB0aGF0IGlzIEFMU08gYVxuICogYFByb21pc2U8RXhlY1Jlc3VsdD5gIHJlc29sdmluZyBvbiBleGl0IC0gc2VlIHtAbGluayBDaGlsZFByb2Nlc3NSZXN1bHR9LlxuICpcbiAqIFRoZSBwcm9taXNlIGhhbGYgaXMgdGhlIGV4YWN0IGJlaGF2aW91ciB0aGlzIGZ1bmN0aW9uIGhhZCBiZWZvcmU6IGl0IGF3YWl0c1xuICogZXhpdCAoYW5kIGFueSBsaW5lIHJlYWRzIC8gc3RkaW4gd3JpdGUpLCB0aGVuIHJlc29sdmVzIHRvIHRoZSB7QGxpbmsgRXhlY1Jlc3VsdH1cbiAqIG9yIHJlamVjdHMgKHNwYXduIGVycm9yIG90aGVyIHRoYW4gYSBtaXNzaW5nIGV4ZWN1dGFibGUsIG9yIGBjaGVja2Agb24gbm9uLXplcm9cbiAqIGV4aXQpLiBFeGlzdGluZyBgYXdhaXQgc3Bhd24oLi4uKWAgY2FsbGVycyBhcmUgdW5hZmZlY3RlZC4gVGhlIGhhbmRsZSBoYWxmIGxldHMgYVxuICogY2FsbGVyIHN1cGVydmlzZSB0aGUgcHJvY2VzcyAoYC5waWRgLCBgLmtpbGwoc2lnbmFsKWAsIGBleGl0YCBldmVudCkgd2l0aG91dCBhXG4gKiBzZWNvbmQgc3Bhd24gLSBlLmcuIGBAZGJ4LXRvb2xzL2FwcGtpdGAncyBgYmluZFByb2Nlc3NgLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gRXhlY3V0YWJsZSB0byBydW4gKHJlc29sdmVkIG9uIGBQQVRIYCB3aGVuIGBzaGVsbGAgaXMgc2V0IG9uIG9wdGlvbnMpXG4gKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdmVyYmF0aW0gdG8gdGhlIGV4ZWN1dGFibGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gU3Bhd24sIHN0ZGlvLCBhbmQgY2hlY2sgb3B0aW9uc1xuICogQHJldHVybnMgVGhlIGxpdmUgYENoaWxkUHJvY2Vzc2AsIGF3YWl0YWJsZSB0byBleGl0IGNvZGUgKyBjYXB0dXJlZCBvdXRwdXRcbiAqIEB0aHJvd3MgKG9uIHRoZSBwcm9taXNlKSBXaGVuIHNwYXduIGZhaWxzIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIGEgbWlzc2luZ1xuICogZXhlY3V0YWJsZSwgbGluZSByZWFkcyBmYWlsLCBvciBgY2hlY2tgIGlzIHRydWUgYW5kIGV4aXQgY29kZSBpcyBub24temVyb1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3Bhd24oLi4uYXJnczogU3Bhd25BcmdzPEV4ZWNPcHRpb25zPik6IENoaWxkUHJvY2Vzc1Jlc3VsdCB7XG4gIGNvbnN0IHsgY29tbWFuZCwgY29tbWFuZEFyZ3MsIG9wdGlvbnMgPSB7fSB9ID0gcGFyc2VTcGF3bkFyZ3MoYXJncyk7XG4gIGNvbnN0IHsgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBjaGVjaywgdHJpbSwgLi4uc3Bhd25PcHRzIH0gPSBvcHRpb25zO1xuICBjb25zdCBzdGRvdXRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc3RkZXJyTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHN0ZG91dEhhbmRsZXIgPSByZXNvbHZlU3RkaW8oc3Rkb3V0LCBzdGRvdXRMaW5lcyk7XG4gIGNvbnN0IHN0ZGVyckhhbmRsZXIgPSByZXNvbHZlU3RkaW8oc3RkZXJyLCBzdGRlcnJMaW5lcyk7XG4gIGNvbnN0IHN0ZGluTW9kZTogRXhlY1N0ZGlvID0gaXNTdGRpblBheWxvYWQoc3RkaW4pID8gXCJwaXBlXCIgOiAoc3RkaW4gPz8gXCJpbmhlcml0XCIpO1xuXG4gIGNvbnN0IHByb2MgPSBub2RlU3Bhd24oY29tbWFuZCwgY29tbWFuZEFyZ3MsIHtcbiAgICAuLi5zcGF3bk9wdHMsXG4gICAgc3RkaW86IFtzdGRpbk1vZGUsIHN0ZG91dEhhbmRsZXIubW9kZSwgc3RkZXJySGFuZGxlci5tb2RlXSxcbiAgfSk7XG5cbiAgY29uc3Qgc3RkaW5Xcml0ZSA9IHdyaXRlU3RkaW4ocHJvYywgc3RkaW4pO1xuXG4gIGNvbnN0IHJlYWRzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgcXVldWVMaW5lUmVhZHMocmVhZHMsIHByb2Muc3Rkb3V0LCBzdGRvdXRIYW5kbGVyKTtcbiAgcXVldWVMaW5lUmVhZHMocmVhZHMsIHByb2Muc3RkZXJyLCBzdGRlcnJIYW5kbGVyKTtcblxuICBjb25zdCBjb21wbGV0aW9uID0gKGFzeW5jICgpOiBQcm9taXNlPEV4ZWNSZXN1bHQ+ID0+IHtcbiAgICBsZXQgZXhpdENvZGUgPSAxO1xuICAgIGxldCBjb21tYW5kTm90Rm91bmRFcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBleGl0Q29kZSA9IGF3YWl0IHdhaXRGb3JFeGl0KHByb2MpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3N0ZGluV3JpdGUsIC4uLnJlYWRzXSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoIWlzQ29tbWFuZE5vdEZvdW5kRXJyb3IoZXJyKSkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3N0ZGluV3JpdGUsIC4uLnJlYWRzXSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHByb2Muc3RkaW4/LmRlc3Ryb3koKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5kZXN0cm95KCk7XG4gICAgICBwcm9jLnN0ZGVycj8uZGVzdHJveSgpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtzdGRpbldyaXRlXSk7XG4gICAgICBmb3IgKGNvbnN0IHJlYWQgb2YgcmVhZHMpIHZvaWQgcmVhZC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgY29tbWFuZE5vdEZvdW5kRXJyb3IgPSBlcnI7XG4gICAgICBleGl0Q29kZSA9IENPTU1BTkRfTk9UX0ZPVU5EX0VYSVRfQ09ERTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjcmVhdGVFeGVjUmVzdWx0KGV4aXRDb2RlLCBzdGRvdXRMaW5lcywgc3RkZXJyTGluZXMsIHRyaW0pO1xuICAgIGlmIChjaGVjayAmJiByZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICAgIGNvbnN0IGVyciA9IGV4ZWNFcnJvcihjb21tYW5kLCBjb21tYW5kQXJncywgcmVzdWx0KTtcbiAgICAgIGlmIChjb21tYW5kTm90Rm91bmRFcnJvcikgZXJyLmNhdXNlID0gY29tbWFuZE5vdEZvdW5kRXJyb3I7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pKCk7XG5cbiAgLy8gQXR0YWNoIHRoZSBwcm9taXNlIGludGVyZmFjZSBvbnRvIHRoZSBsaXZlIGNoaWxkIHNvIE9ORSBvYmplY3QgaXMgYm90aC4gVGhlXG4gIC8vIG1ldGhvZHMgYXJlIGJvdW5kIHRvIGBjb21wbGV0aW9uYCBzbyBgdGhpc2AgaXMgdGhlIHJlYWwgcHJvbWlzZTsgdGhlIGNoaWxkXG4gIC8vIG93bnMgbm8gY29uZmxpY3RpbmcgYHRoZW5gL2BjYXRjaGAvYGZpbmFsbHlgLCBzbyB0aGlzIGlzIHB1cmVseSBhZGRpdGl2ZS5cbiAgcmV0dXJuIGF0dGFjaFByb21pc2UocHJvYywgY29tcGxldGlvbik7XG59XG5cbi8qKlxuICogQXR0YWNoIGEgcHJvbWlzZSdzIGB0aGVuYCAvIGBjYXRjaGAgLyBgZmluYWxseWAgb250byBhIGxpdmUgb2JqZWN0LCByZXR1cm5pbmdcbiAqIHRoZSBzYW1lIG9iamVjdCB0eXBlZCBhcyBib3RoLiBVc2VkIGJ5IHtAbGluayBzcGF3bn0gdG8gbWFrZSBpdHMgYENoaWxkUHJvY2Vzc2BcbiAqIGF3YWl0YWJsZSB3aXRob3V0IHdyYXBwaW5nIGl0IC0gc28gY2FsbGVycyBrZWVwIHRoZSBsaXZlIGhhbmRsZSBBTkQgYGF3YWl0YCBpdC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoUHJvbWlzZTxUIGV4dGVuZHMgb2JqZWN0LCBSPih0YXJnZXQ6IFQsIHByb21pc2U6IFByb21pc2U8Uj4pOiBUICYgUHJvbWlzZTxSPiB7XG4gIGNvbnN0IGh5YnJpZCA9IHRhcmdldCBhcyBUICYgUHJvbWlzZTxSPjtcbiAgaHlicmlkLnRoZW4gPSBwcm9taXNlLnRoZW4uYmluZChwcm9taXNlKTtcbiAgaHlicmlkLmNhdGNoID0gcHJvbWlzZS5jYXRjaC5iaW5kKHByb21pc2UpO1xuICBoeWJyaWQuZmluYWxseSA9IHByb21pc2UuZmluYWxseS5iaW5kKHByb21pc2UpO1xuICByZXR1cm4gaHlicmlkO1xufVxuXG4vKipcbiAqIFNwYXduIGEgc3VicHJvY2VzcyBzeW5jaHJvbm91c2x5IGFuZCB3YWl0IGZvciBleGl0LlxuICpcbiAqIFVubGlrZSB7QGxpbmsgc3Bhd259LCBzdGRpbyBvcHRpb25zIGFyZSBsaW1pdGVkIHRvIGBcImluaGVyaXRcImAsIGBcInBpcGVcImAsXG4gKiBgXCJpZ25vcmVcImAsIGFuZCBgXCJjYXB0dXJlXCJgIOKAlCBubyBwZXItbGluZSBjYWxsYmFja3MuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBFeGVjdXRhYmxlIHRvIHJ1biAocmVzb2x2ZWQgb24gYFBBVEhgIHdoZW4gYHNoZWxsYCBpcyBzZXQgb24gb3B0aW9ucylcbiAqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzIHBhc3NlZCB2ZXJiYXRpbSB0byB0aGUgZXhlY3V0YWJsZVxuICogQHBhcmFtIHNwYXduU3luYyAtIFNwYXduLCBzdGRpbywgYW5kIGNoZWNrIG9wdGlvbnNcbiAqIEByZXR1cm5zIEV4aXQgY29kZSwgY2FwdHVyZWQgbGluZSBhcnJheXMsIGFuZCB0cmltbWVkIGBzdGRvdXRgIC8gYHN0ZGVycmAgZ2V0dGVyc1xuICogQHRocm93cyBXaGVuIHNwYXduIGZhaWxzIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIGEgbWlzc2luZyBleGVjdXRhYmxlLCBvclxuICogYGNoZWNrYCBpcyB0cnVlIGFuZCBleGl0IGNvZGUgaXMgbm9uLXplcm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyguLi5hcmdzOiBTcGF3bkFyZ3M8U3luY0V4ZWNPcHRpb25zPik6IEV4ZWNSZXN1bHQge1xuICBjb25zdCB7IGNvbW1hbmQsIGNvbW1hbmRBcmdzLCBvcHRpb25zID0ge30gfSA9IHBhcnNlU3Bhd25BcmdzKGFyZ3MpO1xuICBjb25zdCB7IHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgY2hlY2ssIHRyaW0sIC4uLnNwYXduT3B0cyB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc3RkaW5Nb2RlOiBFeGVjU3RkaW8gPSBpc1N0ZGluUGF5bG9hZChzdGRpbikgPyBcInBpcGVcIiA6IChzdGRpbiA/PyBcImluaGVyaXRcIik7XG4gIGNvbnN0IGNhcHR1cmVTdGRvdXQgPSBzdGRvdXQgPT09IFwiY2FwdHVyZVwiO1xuICBjb25zdCBjYXB0dXJlU3RkZXJyID0gc3RkZXJyID09PSBcImNhcHR1cmVcIjtcbiAgY29uc3Qgc3Rkb3V0TW9kZSA9IHJlc29sdmVTeW5jU3RkaW8oc3Rkb3V0KTtcbiAgY29uc3Qgc3RkZXJyTW9kZSA9IHJlc29sdmVTeW5jU3RkaW8oc3RkZXJyKTtcblxuICBjb25zdCByZXN1bHQgPSBub2RlU3Bhd25TeW5jKGNvbW1hbmQsIGNvbW1hbmRBcmdzLCB7XG4gICAgLi4uc3Bhd25PcHRzLFxuICAgIGVuY29kaW5nOiBjYXB0dXJlU3Rkb3V0IHx8IGNhcHR1cmVTdGRlcnIgPyBcInV0ZjhcIiA6IHVuZGVmaW5lZCxcbiAgICBzdGRpbzogW3N0ZGluTW9kZSwgc3Rkb3V0TW9kZSwgc3RkZXJyTW9kZV0sXG4gICAgaW5wdXQ6IGlzU3RkaW5QYXlsb2FkKHN0ZGluKSA/IHN0ZGluIDogdW5kZWZpbmVkLFxuICB9KTtcblxuICBjb25zdCBjb21tYW5kTm90Rm91bmQgPSBpc0NvbW1hbmROb3RGb3VuZEVycm9yKHJlc3VsdC5lcnJvcik7XG4gIGNvbnN0IGV4aXRDb2RlID0gY29tbWFuZE5vdEZvdW5kID8gQ09NTUFORF9OT1RfRk9VTkRfRVhJVF9DT0RFIDogKHJlc3VsdC5zdGF0dXMgPz8gMSk7XG4gIGNvbnN0IHN0ZG91dFRleHQgPSBjYXB0dXJlU3Rkb3V0ID8gY2FwdHVyZWRUZXh0KHJlc3VsdC5zdGRvdXQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGRlcnJUZXh0ID0gY2FwdHVyZVN0ZGVyciA/IGNhcHR1cmVkVGV4dChyZXN1bHQuc3RkZXJyKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGNyZWF0ZVN5bmNFeGVjUmVzdWx0KGV4aXRDb2RlLCBzdGRvdXRUZXh0LCBzdGRlcnJUZXh0LCB0cmltKTtcblxuICBpZiAocmVzdWx0LmVycm9yICYmICghY29tbWFuZE5vdEZvdW5kIHx8IGNoZWNrKSkge1xuICAgIGNvbnN0IGVyciA9IGV4ZWNFcnJvcihjb21tYW5kLCBjb21tYW5kQXJncywgZXhlY1Jlc3VsdCk7XG4gICAgZXJyLmNhdXNlID0gcmVzdWx0LmVycm9yO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGlmIChjaGVjayAmJiBleGVjUmVzdWx0LmV4aXRDb2RlICE9PSAwKSB0aHJvdyBleGVjRXJyb3IoY29tbWFuZCwgY29tbWFuZEFyZ3MsIGV4ZWNSZXN1bHQpO1xuICByZXR1cm4gZXhlY1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBzaGVsbC1saWtlIGNvbW1hbmQgaW50byBhcmd2LlxuICpcbiAqIFN1cHBvcnRzOlxuICogICAtIHdoaXRlc3BhY2Ugc2VwYXJhdG9yc1xuICogICAtIHNpbmdsZSBhbmQgZG91YmxlIHF1b3Rlc1xuICogICAtIGJhY2tzbGFzaCBlc2NhcGluZ1xuICogICAtIGVzY2FwZWQgc3BhY2VzXG4gKiAgIC0gZW1wdHkgcXVvdGVkIHN0cmluZ3NcbiAqXG4gKiBJZiB0aGUgaW5wdXQgaXMgbWFsZm9ybWVkIChmb3IgZXhhbXBsZSwgYW4gdW50ZXJtaW5hdGVkIHF1b3RlKSxcbiAqIHJldHVybnMgdGhlIG9yaWdpbmFsIHN0cmluZyBhcyBhIHNpbmdsZSBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNobGV4KGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcblxuICBsZXQgY3VycmVudCA9IFwiXCI7XG4gIGxldCBxdW90ZTogXCInXCIgfCAnXCInIHwgdW5kZWZpbmVkO1xuICBsZXQgZXNjYXBlZCA9IGZhbHNlO1xuICBsZXQgcXVvdGVkID0gZmFsc2U7XG5cbiAgY29uc3QgcHVzaCA9ICgpID0+IHtcbiAgICBpZiAocXVvdGVkIHx8IGN1cnJlbnQubGVuZ3RoID4gMCkge1xuICAgICAgYXJncy5wdXNoKGN1cnJlbnQpO1xuICAgIH1cbiAgICBjdXJyZW50ID0gXCJcIjtcbiAgICBxdW90ZWQgPSBmYWxzZTtcbiAgfTtcblxuICBmb3IgKGNvbnN0IGNoIG9mIGNvbW1hbmQpIHtcbiAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gXCJcXFxcXCIpIHtcbiAgICAgIGVzY2FwZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHF1b3RlKSB7XG4gICAgICBpZiAoY2ggPT09IHF1b3RlKSB7XG4gICAgICAgIHF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgICBxdW90ZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudCArPSBjaDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gXCInXCIgfHwgY2ggPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2g7XG4gICAgICBxdW90ZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKC9cXHMvLnRlc3QoY2gpKSB7XG4gICAgICBwdXNoKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjdXJyZW50ICs9IGNoO1xuICB9XG5cbiAgLy8gTWFsZm9ybWVkIGlucHV0OiB0cmVhdCBhcyBhIGxpdGVyYWwgY29tbWFuZC5cbiAgaWYgKHF1b3RlKSB7XG4gICAgcmV0dXJuIFtjb21tYW5kXTtcbiAgfVxuXG4gIC8vIFRyYWlsaW5nIGJhY2tzbGFzaCBpcyBsaXRlcmFsLlxuICBpZiAoZXNjYXBlZCkge1xuICAgIGN1cnJlbnQgKz0gXCJcXFxcXCI7XG4gIH1cblxuICBwdXNoKCk7XG5cbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID8gYXJncyA6IFtjb21tYW5kXTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -25,7 +25,7 @@
25
25
  "typescript": "^5.9.3"
26
26
  },
27
27
  "dependencies": {
28
- "@dbx-tools/shared-core": "^0.9.58",
28
+ "@dbx-tools/shared-core": "^0.9.61",
29
29
  "extract-zip": "^2.0.1",
30
30
  "proper-lockfile": "^4.1.2",
31
31
  "semver": "^7.7.3",
@@ -87,7 +87,7 @@
87
87
  "./package.json": "./package.json"
88
88
  }
89
89
  },
90
- "version": "0.9.58",
90
+ "version": "0.9.61",
91
91
  "types": "./lib/index.d.ts",
92
92
  "dbxToolsConfig": {
93
93
  "tags": [
package/src/bin.ts CHANGED
@@ -7,6 +7,7 @@ import { execFile } from "node:child_process";
7
7
  import { createHash, randomUUID } from "node:crypto";
8
8
  import {
9
9
  chmod,
10
+ cp,
10
11
  copyFile,
11
12
  mkdir,
12
13
  mkdtemp,
@@ -17,7 +18,7 @@ import {
17
18
  writeFile,
18
19
  } from "node:fs/promises";
19
20
  import { homedir, tmpdir } from "node:os";
20
- import { basename, join } from "node:path";
21
+ import { basename, dirname, isAbsolute, join, resolve, sep } from "node:path";
21
22
  import { fileURLToPath } from "node:url";
22
23
  import { promisify } from "node:util";
23
24
 
@@ -74,6 +75,8 @@ export type BinVersionParser = (output: BinVersionOutput) => string | undefined;
74
75
  /** Options for {@link ensure}. */
75
76
  export interface BinOptions {
76
77
  autoUnpackage?: boolean;
78
+ /** Preserve an unpacked multi-file package rooted at {@link BinContext.root}. */
79
+ package?: BinPackageOptions;
77
80
  selector?: BinSelector;
78
81
  homeDir?: string;
79
82
  /** Exact installation paths. Omission keeps `$HOME/.<name>/bin/<name>`. */
@@ -90,6 +93,14 @@ export interface BinOptions {
90
93
  force?: boolean;
91
94
  }
92
95
 
96
+ /** Multi-file archive layout retained beside its executable entrypoint. */
97
+ export interface BinPackageOptions {
98
+ /** Executable path relative to the unpacked package root. */
99
+ entrypoint: string;
100
+ /** Companion files or directories required before an installation can be reused. */
101
+ requiredPaths?: readonly string[];
102
+ }
103
+
93
104
  /** Temporary directory created for one `ensure` attempt after the install lock. */
94
105
  export interface BinUrlResolveContext {
95
106
  readonly tempDir: string;
@@ -117,6 +128,29 @@ function context(name: string, homeDir: string, destination?: BinContext): BinCo
117
128
  return { root, binDir, path: join(binDir, name) };
118
129
  }
119
130
 
131
+ function packagePath(root: string, path: string): string {
132
+ if (!path || isAbsolute(path)) {
133
+ throw new TypeError(`invalid binary package path: ${path}`);
134
+ }
135
+ const packageRoot = resolve(root);
136
+ const resolved = resolve(packageRoot, path);
137
+ if (resolved === packageRoot || !resolved.startsWith(`${packageRoot}${sep}`)) {
138
+ throw new TypeError(`binary package path escapes its root: ${path}`);
139
+ }
140
+ return resolved;
141
+ }
142
+
143
+ function packageDestination(destination: BinContext, options: BinOptions): void {
144
+ if (!options.package) return;
145
+ const entrypoint = packagePath(destination.root, options.package.entrypoint);
146
+ if (resolve(destination.path) !== entrypoint) {
147
+ throw new TypeError("binary package destination path must match its entrypoint");
148
+ }
149
+ for (const path of options.package.requiredPaths ?? []) {
150
+ packagePath(destination.root, path);
151
+ }
152
+ }
153
+
120
154
  function displayUrl(raw: string): string {
121
155
  try {
122
156
  const url = new URL(raw);
@@ -233,6 +267,25 @@ async function isValidBin(path: string, options: BinOptions): Promise<boolean> {
233
267
  return valid;
234
268
  }
235
269
 
270
+ async function pathExists(path: string): Promise<boolean> {
271
+ try {
272
+ await stat(path);
273
+ return true;
274
+ } catch {
275
+ return false;
276
+ }
277
+ }
278
+
279
+ async function isValidInstall(destination: BinContext, options: BinOptions): Promise<boolean> {
280
+ if (!(await isValidBin(destination.path, options))) return false;
281
+ if (!options.package) return true;
282
+ const required = [options.package.entrypoint, ...(options.package.requiredPaths ?? [])];
283
+ const available = await Promise.all(
284
+ required.map((path) => pathExists(packagePath(destination.root, path))),
285
+ );
286
+ return available.every(Boolean);
287
+ }
288
+
236
289
  function downloadName(url: string, name: string): string {
237
290
  try {
238
291
  const candidate = basename(decodeURIComponent(new URL(url).pathname));
@@ -288,53 +341,66 @@ function fileUrlPath(url: string): string | undefined {
288
341
  }
289
342
  }
290
343
 
344
+ interface SelectedBin {
345
+ path: string;
346
+ packageRoot?: string;
347
+ }
348
+
291
349
  async function selectedBin(
292
350
  destination: BinContext,
293
351
  source: BinSource,
294
352
  temp: string,
295
353
  options: BinOptions,
296
- ): Promise<string> {
354
+ ): Promise<SelectedBin> {
297
355
  const { url } = source;
298
356
  const localPath = fileUrlPath(url);
357
+ let downloadPath: string;
299
358
  if (localPath) {
300
359
  const access = await accessContext(localPath);
301
360
  if (!access.file) {
302
361
  throw new Error(`binary file URL does not exist: ${displayUrl(url)}`);
303
362
  }
304
363
  logger.debug("using local binary", { from: displayUrl(url), path: localPath });
305
- return localPath;
306
- }
307
- const name = downloadName(url, basename(destination.path));
308
- const downloadPath = join(temp, name);
309
- logger.debug("downloading binary", {
310
- from: displayUrl(url),
311
- to: downloadPath,
312
- });
313
- const response = await fetch(url);
314
- if (!response.ok) {
315
- throw new Error(`binary download failed (${response.status})`);
316
- }
317
- const downloaded = Buffer.from(await response.arrayBuffer());
318
- if (source.sha256) {
319
- if (!/^[0-9a-f]{64}$/i.test(source.sha256)) {
320
- throw new TypeError("binary download SHA-256 digest must contain 64 hexadecimal characters");
364
+ downloadPath = localPath;
365
+ } else {
366
+ const name = downloadName(url, basename(destination.path));
367
+ downloadPath = join(temp, name);
368
+ const download = {
369
+ from: displayUrl(url),
370
+ to: downloadPath,
371
+ };
372
+ if (download.from === "data:") logger.debug("downloading binary", download);
373
+ else logger.info("downloading binary", download);
374
+ const response = await fetch(url);
375
+ if (!response.ok) {
376
+ throw new Error(`binary download failed (${response.status})`);
321
377
  }
322
- const actual = createHash("sha256").update(downloaded).digest("hex");
323
- if (actual.toLowerCase() !== source.sha256.toLowerCase()) {
324
- throw new Error(`binary download digest mismatch: ${displayUrl(url)}`);
378
+ const downloaded = Buffer.from(await response.arrayBuffer());
379
+ if (source.sha256) {
380
+ if (!/^[0-9a-f]{64}$/i.test(source.sha256)) {
381
+ throw new TypeError(
382
+ "binary download SHA-256 digest must contain 64 hexadecimal characters",
383
+ );
384
+ }
385
+ const actual = createHash("sha256").update(downloaded).digest("hex");
386
+ if (actual.toLowerCase() !== source.sha256.toLowerCase()) {
387
+ throw new Error(`binary download digest mismatch: ${displayUrl(url)}`);
388
+ }
325
389
  }
390
+ await writeFile(downloadPath, downloaded, { mode: 0o755 });
326
391
  }
327
- await writeFile(downloadPath, downloaded, { mode: 0o755 });
328
392
 
329
393
  let selectedSource = downloadPath;
330
- if (options.autoUnpackage) {
394
+ let unpacked = false;
395
+ if (options.package || (options.autoUnpackage && !localPath)) {
331
396
  selectedSource = join(temp, `unpacked-${randomUUID()}`);
332
397
  await mkdir(selectedSource);
333
- logger.debug("unpacking binary archive", {
398
+ logger.info("unpacking binary archive", {
334
399
  archive: downloadPath,
335
400
  to: selectedSource,
336
401
  });
337
402
  await unpack(downloadPath, selectedSource);
403
+ unpacked = true;
338
404
  }
339
405
 
340
406
  if (options.selector) {
@@ -344,19 +410,72 @@ async function selectedBin(
344
410
  source: selectedSource,
345
411
  });
346
412
  logger.debug("selected binary", { path: selected });
347
- return selected;
413
+ return { path: selected, ...(options.package ? { packageRoot: selectedSource } : {}) };
414
+ }
415
+ if (options.package) {
416
+ const selected = packagePath(selectedSource, options.package.entrypoint);
417
+ logger.debug("selected binary package entrypoint", { path: selected });
418
+ return { path: selected, packageRoot: selectedSource };
348
419
  }
349
- const selected = options.autoUnpackage ? await selectSingleFile(selectedSource) : selectedSource;
420
+ const selected = unpacked ? await selectSingleFile(selectedSource) : selectedSource;
350
421
  logger.debug("selected binary", { path: selected });
351
- return selected;
422
+ return { path: selected };
423
+ }
424
+
425
+ async function installPackage(
426
+ source: string,
427
+ destination: BinContext,
428
+ options: BinOptions,
429
+ ): Promise<void> {
430
+ if (!options.package) throw new Error("binary package options are required");
431
+ const parent = dirname(destination.root);
432
+ const name = basename(destination.root);
433
+ const stagedRoot = join(parent, `.${name}-staged-${randomUUID()}`);
434
+ const backupRoot = join(parent, `.${name}-backup-${randomUUID()}`);
435
+ await mkdir(parent, { recursive: true });
436
+ logger.info("staging binary package", {
437
+ from: source,
438
+ to: destination.root,
439
+ });
440
+ await cp(source, stagedRoot, { recursive: true });
441
+ const stagedPath = packagePath(stagedRoot, options.package.entrypoint);
442
+ await chmod(stagedPath, 0o755);
443
+ const staged: BinContext = {
444
+ root: stagedRoot,
445
+ binDir: dirname(stagedPath),
446
+ path: stagedPath,
447
+ };
448
+ if (!(await isValidInstall(staged, options))) {
449
+ await rm(stagedRoot, { recursive: true, force: true });
450
+ throw new Error(`selected binary package is invalid: ${source}`);
451
+ }
452
+
453
+ let backedUp = false;
454
+ try {
455
+ if (await pathExists(destination.root)) {
456
+ await rename(destination.root, backupRoot);
457
+ backedUp = true;
458
+ }
459
+ await rename(stagedRoot, destination.root);
460
+ if (!(await isValidInstall(destination, options))) {
461
+ throw new Error(`installed binary package is invalid after rename: ${destination.root}`);
462
+ }
463
+ if (backedUp) await rm(backupRoot, { recursive: true, force: true });
464
+ } catch (error) {
465
+ await rm(destination.root, { recursive: true, force: true });
466
+ if (backedUp) await rename(backupRoot, destination.root);
467
+ throw error;
468
+ } finally {
469
+ await rm(stagedRoot, { recursive: true, force: true });
470
+ }
352
471
  }
353
472
 
354
473
  /**
355
474
  * Return an existing executable or install it atomically under
356
- * `$HOME/.<name>/bin/<name>`. Installation uses a check-lock-check-load
357
- * sequence so concurrent callers resolve and download the binary only once.
358
- * The downloaded candidate and final renamed executable must both pass the
359
- * same executable and version checks.
475
+ * `$HOME/.<name>/bin/<name>`. Multi-file package mode atomically preserves the
476
+ * unpacked package at an explicit destination root. Installation uses a
477
+ * check-lock-check-load sequence so concurrent callers resolve and download
478
+ * only once. Candidates and final destinations must pass the same checks.
360
479
  */
361
480
  export async function ensure(
362
481
  name: string,
@@ -367,14 +486,15 @@ export async function ensure(
367
486
  throw new TypeError(`invalid minimum binary version: ${options.minVersion}`);
368
487
  }
369
488
  const destination = context(name, options.homeDir ?? homedir(), options.destination);
370
- if (!options.force && (await isValidBin(destination.path, options))) {
489
+ packageDestination(destination, options);
490
+ if (!options.force && (await isValidInstall(destination, options))) {
371
491
  logger.debug("using installed binary", { name, path: destination.path });
372
492
  return destination;
373
493
  }
374
494
 
375
495
  logger.debug("waiting for binary install lock", { name, path: destination.path });
376
496
  return withFileLock(["bin.ensure", destination.path], async () => {
377
- if (!options.force && (await isValidBin(destination.path, options))) {
497
+ if (!options.force && (await isValidInstall(destination, options))) {
378
498
  logger.debug("using binary installed by another caller", {
379
499
  name,
380
500
  path: destination.path,
@@ -395,19 +515,23 @@ export async function ensure(
395
515
  const from = displayUrl(source.url);
396
516
  logger.debug("resolved binary source", { name, from });
397
517
  const selected = await selectedBin(destination, source, temp, options);
398
- await chmod(selected, 0o755);
399
- if (!(await isValidBin(selected, options))) {
400
- throw new Error(`selected binary has no acceptable version: ${selected}`);
518
+ await chmod(selected.path, 0o755);
519
+ if (!(await isValidBin(selected.path, options))) {
520
+ throw new Error(`selected binary has no acceptable version: ${selected.path}`);
401
521
  }
402
-
403
- await mkdir(destination.binDir, { recursive: true });
404
- staged = join(destination.binDir, `.${name}-${randomUUID()}`);
405
- await copyFile(selected, staged);
406
- await chmod(staged, 0o755);
407
- await rename(staged, destination.path);
408
- staged = undefined;
409
- if (!(await isValidBin(destination.path, options))) {
410
- throw new Error(`installed binary is invalid after rename: ${destination.path}`);
522
+ if (options.package) {
523
+ if (!selected.packageRoot) throw new Error("binary package root was not selected");
524
+ await installPackage(selected.packageRoot, destination, options);
525
+ } else {
526
+ await mkdir(destination.binDir, { recursive: true });
527
+ staged = join(destination.binDir, `.${name}-${randomUUID()}`);
528
+ await copyFile(selected.path, staged);
529
+ await chmod(staged, 0o755);
530
+ await rename(staged, destination.path);
531
+ staged = undefined;
532
+ if (!(await isValidInstall(destination, options))) {
533
+ throw new Error(`installed binary is invalid after rename: ${destination.path}`);
534
+ }
411
535
  }
412
536
  logger.info("installed binary", {
413
537
  name,