@blokjs/trigger-pubsub 0.6.18 → 0.6.20

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.
@@ -66,6 +66,18 @@ export class PubSubTrigger extends TriggerBase {
66
66
  // aren't available in parent constructor)
67
67
  this.loadNodes();
68
68
  this.loadWorkflows();
69
+ // F5 · install crash/orphan/janitor/shutdown handlers so a
70
+ // pubsub-only process gets the same run-state integrity + storage
71
+ // hygiene guarantees as HTTP/Worker. Each handler is idempotent.
72
+ this.installOperationalHandlers(this.logger);
73
+ // F6 · feed the WorkflowRegistry from the nodeMap so `subworkflow:`
74
+ // steps + trigger/workflow/process-global middleware resolve in a
75
+ // pubsub-only deployment.
76
+ this.registerWorkflowsFromNodeMap(this.logger);
77
+ // F14 · seed the process-global middleware chain from
78
+ // `BLOK_GLOBAL_MIDDLEWARE` (idempotent — programmatic
79
+ // setGlobalMiddleware takes precedence).
80
+ this.seedGlobalMiddlewareFromEnv(this.logger);
69
81
  try {
70
82
  // Find all workflows with pub/sub triggers
71
83
  const pubsubWorkflows = this.getPubSubWorkflows();
@@ -210,6 +222,13 @@ export class PubSubTrigger extends TriggerBase {
210
222
  attributes: JSON.stringify(message.attributes),
211
223
  };
212
224
  ctx.logger.log(`Processing message from ${config.topic}: ${id}`);
225
+ // F1 · apply the merged middleware chain (process-global →
226
+ // workflow-level → trigger-level) before the main workflow
227
+ // body, after ctx.request is populated so middleware sees the
228
+ // real body/headers. A throwing middleware propagates to the
229
+ // outer catch (nack). Pre-fix pubsub silently skipped ALL
230
+ // middleware — including auth gates.
231
+ await this.applyMiddlewareChain(ctx, this.nodeMap);
213
232
  // Execute workflow
214
233
  const response = await this.run(ctx);
215
234
  const end = performance.now();
@@ -265,4 +284,4 @@ export class PubSubTrigger extends TriggerBase {
265
284
  }
266
285
  }
267
286
  export default PubSubTrigger;
268
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHViU3ViVHJpZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QdWJTdWJUcmlnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFHSCxPQUFPLEVBRU4sYUFBYSxFQUViLE9BQU8sRUFDUCxXQUFXLEdBRVgsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQWEsY0FBYyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWdGbEM7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLGFBQWMsU0FBUSxXQUFXO0lBQzVDLE9BQU8sR0FBa0IsRUFBbUIsQ0FBQztJQUNwQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUkseUJBQXlCLEVBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FDdEMsQ0FBQztJQUNpQixNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztJQUVoRDs7Ozs7O09BTUc7SUFDTyxPQUFPLENBQWlCO0lBRWxDOzs7O09BSUc7SUFDTyxXQUFXLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7SUFNOUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFH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LEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7Z0JBRXRFLHVCQUF1QjtnQkFDdkIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ25CLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7b0JBQ3pCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztvQkFDbkIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLElBQUksUUFBUTtvQkFDN0MsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksV0FBVztvQkFDeEMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxJQUFJLFNBQVM7aUJBQ3BELENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLFlBQVksRUFBRSxFQUFHLEtBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFOUYsZUFBZTtnQkFDZixJQUFJLE1BQU0sQ0FBQyxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUM7b0JBQzFCLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztZQUNGLENBQUM7b0JBQVMsQ0FBQztnQkFDVixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDWixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Q7QUFFRCxlQUFlLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHViU3ViVHJpZ2dlciAtIEJhc2UgY2xhc3MgZm9yIHB1Yi9zdWItYmFzZWQgd29ya2Zsb3cgdHJpZ2dlcnNcbiAqXG4gKiBFeHRlbmRzIFRyaWdnZXJCYXNlIHRvIHN1cHBvcnQgcHViL3N1YiB0cmlnZ2VyczpcbiAqIC0gR0NQIFB1Yi9TdWJcbiAqIC0gQVdTIFNOUyAodmlhIFNRUyBzdWJzY3JpcHRpb24pXG4gKiAtIEF6dXJlIFNlcnZpY2UgQnVzXG4gKlxuICogUGF0dGVybjpcbiAqIDEuIGxvYWROb2RlcygpIC0gTG9hZCBhdmFpbGFibGUgbm9kZXMgaW50byBOb2RlTWFwXG4gKiAyLiBsb2FkV29ya2Zsb3dzKCkgLSBMb2FkIHdvcmtmbG93cyB3aXRoIHB1YnN1YiB0cmlnZ2Vyc1xuICogMy4gc3RhcnRTdWJzY3JpYmVyKCkgLSBDb25uZWN0IHRvIHB1Yi9zdWIgYW5kIHN0YXJ0IHJlY2VpdmluZyBtZXNzYWdlc1xuICogNC4gRm9yIGVhY2ggbWVzc2FnZTpcbiAqICAgIC0gTWF0Y2ggd29ya2Zsb3cgYnkgdHJpZ2dlciBjb25maWcgKHRvcGljL3N1YnNjcmlwdGlvbilcbiAqICAgIC0gQ3JlYXRlIGNvbnRleHQgd2l0aCB0aGlzLmNyZWF0ZUNvbnRleHQoKVxuICogICAgLSBQb3B1bGF0ZSBjdHgucmVxdWVzdCB3aXRoIG1lc3NhZ2UgZGF0YVxuICogICAgLSBFeGVjdXRlIHdvcmtmbG93IHZpYSB0aGlzLnJ1bihjdHgpXG4gKiAgICAtIEFjay9uYWNrIGJhc2VkIG9uIHJlc3BvbnNlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBIZWxwZXJSZXNwb25zZSwgUHViU3ViUHJvdmlkZXIsIFB1YlN1YlRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9ranMvaGVscGVyXCI7XG5pbXBvcnQge1xuXHR0eXBlIEJsb2tTZXJ2aWNlLFxuXHREZWZhdWx0TG9nZ2VyLFxuXHR0eXBlIEdsb2JhbE9wdGlvbnMsXG5cdE5vZGVNYXAsXG5cdFRyaWdnZXJCYXNlLFxuXHR0eXBlIFRyaWdnZXJSZXNwb25zZSxcbn0gZnJvbSBcIkBibG9ranMvcnVubmVyXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQsIFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBibG9ranMvc2hhcmVkXCI7XG5pbXBvcnQgeyB0eXBlIFNwYW4sIFNwYW5TdGF0dXNDb2RlLCBtZXRyaWNzLCB0cmFjZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuXG4vKipcbiAqIE1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBwdWIvc3ViXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHViU3ViTWVzc2FnZSB7XG5cdC8qKiBVbmlxdWUgbWVzc2FnZSBJRCAqL1xuXHRpZDogc3RyaW5nO1xuXHQvKiogTWVzc2FnZSBib2R5IChwYXJzZWQpICovXG5cdGJvZHk6IHVua25vd247XG5cdC8qKiBNZXNzYWdlIGF0dHJpYnV0ZXMvbWV0YWRhdGEgKi9cblx0YXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblx0LyoqIE9yaWdpbmFsIHJhdyBtZXNzYWdlIGZyb20gcHJvdmlkZXIgKi9cblx0cmF3OiB1bmtub3duO1xuXHQvKiogVG9waWMgbmFtZSAqL1xuXHR0b3BpYzogc3RyaW5nO1xuXHQvKiogU3Vic2NyaXB0aW9uIG5hbWUgKi9cblx0c3Vic2NyaXB0aW9uPzogc3RyaW5nO1xuXHQvKiogUHVibGlzaCB0aW1lc3RhbXAgKi9cblx0cHVibGlzaFRpbWU/OiBEYXRlO1xuXHQvKiogQWNrbm93bGVkZ2UgdGhlIG1lc3NhZ2UgKi9cblx0YWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHQvKiogUmVqZWN0L25hY2sgdGhlIG1lc3NhZ2UgKi9cblx0bmFjazogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBQdWIvU3ViIGFkYXB0ZXIgaW50ZXJmYWNlIC0gaW1wbGVtZW50ZWQgYnkgZWFjaCBwcm92aWRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1YlN1YkFkYXB0ZXIge1xuXHQvKiogUHJvdmlkZXIgbmFtZSAqL1xuXHRyZWFkb25seSBwcm92aWRlcjogUHViU3ViUHJvdmlkZXI7XG5cblx0LyoqIENvbm5lY3QgdG8gdGhlIHB1Yi9zdWIgc3lzdGVtICovXG5cdGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKiogRGlzY29ubmVjdCBmcm9tIHRoZSBwdWIvc3ViIHN5c3RlbSAqL1xuXHRkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqIFN1YnNjcmliZSB0byBhIHRvcGljIGFuZCByZWNlaXZlIG1lc3NhZ2VzICovXG5cdHN1YnNjcmliZShjb25maWc6IFB1YlN1YlRyaWdnZXJPcHRzLCBoYW5kbGVyOiAobWVzc2FnZTogUHViU3ViTWVzc2FnZSkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD47XG5cblx0LyoqIFVuc3Vic2NyaWJlIGZyb20gYSB0b3BpYyAqL1xuXHR1bnN1YnNjcmliZShzdWJzY3JpcHRpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIHYwLjcgUFIgNiDigJQgcHVibGlzaCBhIHNpbmdsZSBtZXNzYWdlIHRvIGEgdG9waWMuIFVzZWQgYnkgdGhlXG5cdCAqIGBAYmxva2pzL3B1YnN1Yi1wdWJsaXNoYCBoZWxwZXIgYW5kIGFueSB3b3JrZmxvdyB0aGF0IGZhbi1vdXRzXG5cdCAqIGV2ZW50cyB0byBzdWJzY3JpYmVycy4gUHJvdmlkZXItcG9ydGFibGU6IGVhY2ggYWRhcHRlciB3cmFwcyBpdHNcblx0ICogbmF0aXZlIHByb2R1Y2VyIGNsaWVudC5cblx0ICpcblx0ICogT3B0aW9uYWwgYHBhcnRpdGlvbktleWAgLyBgb3JkZXJpbmdLZXlgIGlzIGhvbm9yZWQgYnkgcHJvdmlkZXJzXG5cdCAqIHRoYXQgc3VwcG9ydCBwZXIta2V5IG9yZGVyaW5nIChLYWZrYSwgR0NQIFB1Yi9TdWIgb3JkZXJlZFxuXHQgKiBkZWxpdmVyeSkuIElnbm9yZWQgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGlzaCh0b3BpYzogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duLCBvcHRzPzogeyBwYXJ0aXRpb25LZXk/OiBzdHJpbmc7IG9yZGVyaW5nS2V5Pzogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKiBDaGVjayBpZiBjb25uZWN0ZWQgKi9cblx0aXNDb25uZWN0ZWQoKTogYm9vbGVhbjtcblxuXHQvKiogSGVhbHRoIGNoZWNrICovXG5cdGhlYWx0aENoZWNrKCk6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogV29ya2Zsb3cgbW9kZWwgd2l0aCBwdWIvc3ViIHRyaWdnZXIgY29uZmlndXJhdGlvblxuICovXG5pbnRlcmZhY2UgUHViU3ViV29ya2Zsb3dNb2RlbCB7XG5cdHBhdGg6IHN0cmluZztcblx0Y29uZmlnOiB7XG5cdFx0bmFtZTogc3RyaW5nO1xuXHRcdHZlcnNpb246IHN0cmluZztcblx0XHR0cmlnZ2VyPzoge1xuXHRcdFx0cHVic3ViPzogUHViU3ViVHJpZ2dlck9wdHM7XG5cdFx0XHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xuXHRcdH07XG5cdFx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0fTtcbn1cblxuLyoqXG4gKiBQdWJTdWJUcmlnZ2VyIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcHViL3N1Yi1iYXNlZCB0cmlnZ2Vyc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUHViU3ViVHJpZ2dlciBleHRlbmRzIFRyaWdnZXJCYXNlIHtcblx0cHJvdGVjdGVkIG5vZGVNYXA6IEdsb2JhbE9wdGlvbnMgPSB7fSBhcyBHbG9iYWxPcHRpb25zO1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhY2VyID0gdHJhY2UuZ2V0VHJhY2VyKFxuXHRcdHByb2Nlc3MuZW52LlBST0pFQ1RfTkFNRSB8fCBcInRyaWdnZXItcHVic3ViLXdvcmtmbG93XCIsXG5cdFx0cHJvY2Vzcy5lbnYuUFJPSkVDVF9WRVJTSU9OIHx8IFwiMC4wLjFcIixcblx0KTtcblx0cHJvdGVjdGVkIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBEZWZhdWx0TG9nZ2VyKCk7XG5cblx0LyoqXG5cdCAqIHYwLjcgUFIgNiDigJQgYmFjay1jb21wYXQgZGVmYXVsdCBhZGFwdGVyLiBXaGVuIHN1YmNsYXNzZXMgc2V0XG5cdCAqIGBwcm90ZWN0ZWQgYWRhcHRlciA9IG5ldyBHQ1BQdWJTdWJBZGFwdGVyKClgIChwcmUtdjAuNyBwYXR0ZXJuKSxcblx0ICogQUxMIHdvcmtmbG93cyByb3V0ZSB0aHJvdWdoIGl0IHJlZ2FyZGxlc3Mgb2YgdGhlaXIgYHByb3ZpZGVyYFxuXHQgKiBmaWVsZC4gV2hlbiB1bnNldCwgZWFjaCB3b3JrZmxvdydzIGBwcm92aWRlcmAgaXMgcmVzb2x2ZWQgdmlhXG5cdCAqIHRoZSBmYWN0b3J5LlxuXHQgKi9cblx0cHJvdGVjdGVkIGFkYXB0ZXI/OiBQdWJTdWJBZGFwdGVyO1xuXG5cdC8qKlxuXHQgKiB2MC43IFBSIDYg4oCUIGFkYXB0ZXIgcG9vbCwga2V5ZWQgYnkgcHJvdmlkZXIuIFBvcHVsYXRlZCBsYXppbHkgaW5cblx0ICogYGxpc3RlbigpYCBhcyB3b3JrZmxvd3MgYXJlIG1hdGNoZWQgdG8gcHJvdmlkZXJzLiBEcmFpbmVkIGluXG5cdCAqIGBzdG9wKClgLiBPbmUgYWRhcHRlciAob25lIGJyb2tlciBjb25uZWN0aW9uKSBwZXIgcHJvdmlkZXIuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYWRhcHRlclBvb2w6IE1hcDxzdHJpbmcsIFB1YlN1YkFkYXB0ZXI+ID0gbmV3IE1hcCgpO1xuXG5cdC8vIFN1YmNsYXNzZXMgcHJvdmlkZSB0aGVzZVxuXHRwcm90ZWN0ZWQgYWJzdHJhY3Qgbm9kZXM6IFJlY29yZDxzdHJpbmcsIEJsb2tTZXJ2aWNlPHVua25vd24+Pjtcblx0cHJvdGVjdGVkIGFic3RyYWN0IHdvcmtmbG93czogUmVjb3JkPHN0cmluZywgSGVscGVyUmVzcG9uc2U+O1xuXG5cdC8qKlxuXHQgKiBMb2FkIG5vZGVzIGludG8gdGhlIG5vZGUgbWFwXG5cdCAqL1xuXHRsb2FkTm9kZXMoKTogdm9pZCB7XG5cdFx0dGhpcy5ub2RlTWFwLm5vZGVzID0gbmV3IE5vZGVNYXAoKTtcblx0XHRjb25zdCBub2RlS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMubm9kZXMpO1xuXHRcdGZvciAoY29uc3Qga2V5IG9mIG5vZGVLZXlzKSB7XG5cdFx0XHR0aGlzLm5vZGVNYXAubm9kZXMuYWRkTm9kZShrZXksIHRoaXMubm9kZXNba2V5XSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgd29ya2Zsb3dzIGludG8gdGhlIHdvcmtmbG93IG1hcFxuXHQgKi9cblx0bG9hZFdvcmtmbG93cygpOiB2b2lkIHtcblx0XHR0aGlzLm5vZGVNYXAud29ya2Zsb3dzID0gdGhpcy53b3JrZmxvd3M7XG5cdH1cblxuXHQvKipcblx0ICogU3RhcnQgdGhlIHB1Yi9zdWIgc3Vic2NyaWJlciAtIG1haW4gZW50cnkgcG9pbnRcblx0ICovXG5cdGFzeW5jIGxpc3RlbigpOiBQcm9taXNlPG51bWJlcj4ge1xuXHRcdGNvbnN0IHN0YXJ0VGltZSA9IHRoaXMuc3RhcnRDb3VudGVyKCk7XG5cblx0XHQvLyBJbml0aWFsaXplIG5vZGVzIGFuZCB3b3JrZmxvd3MgKGNhbGxlZCBoZXJlIGJlY2F1c2Ugc3ViY2xhc3MgcHJvcGVydGllc1xuXHRcdC8vIGFyZW4ndCBhdmFpbGFibGUgaW4gcGFyZW50IGNvbnN0cnVjdG9yKVxuXHRcdHRoaXMubG9hZE5vZGVzKCk7XG5cdFx0dGhpcy5sb2FkV29ya2Zsb3dzKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gRmluZCBhbGwgd29ya2Zsb3dzIHdpdGggcHViL3N1YiB0cmlnZ2Vyc1xuXHRcdFx0Y29uc3QgcHVic3ViV29ya2Zsb3dzID0gdGhpcy5nZXRQdWJTdWJXb3JrZmxvd3MoKTtcblxuXHRcdFx0aWYgKHB1YnN1YldvcmtmbG93cy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKFwiTm8gd29ya2Zsb3dzIHdpdGggcHViL3N1YiB0cmlnZ2VycyBmb3VuZFwiKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZW5kQ291bnRlcihzdGFydFRpbWUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdWJzY3JpYmUgdG8gZWFjaCB0b3BpYyB2aWEgdGhlIGFkYXB0ZXIgdGhhdCBvd25zIGl0c1xuXHRcdFx0Ly8gcHJvdmlkZXIuIFBlci13b3JrZmxvdyBgcHJvdmlkZXJgIGZpZWxkIHdpdGggc3ViY2xhc3MtXG5cdFx0XHQvLyBhZGFwdGVyIGJhY2stY29tcGF0IChoYW5kbGVkIGluIHJlc29sdmVBZGFwdGVyRm9yV29ya2Zsb3cpLlxuXHRcdFx0Zm9yIChjb25zdCB3b3JrZmxvdyBvZiBwdWJzdWJXb3JrZmxvd3MpIHtcblx0XHRcdFx0Y29uc3QgY29uZmlnID0gd29ya2Zsb3cuY29uZmlnLnRyaWdnZXI/LnB1YnN1YiBhcyBQdWJTdWJUcmlnZ2VyT3B0cztcblx0XHRcdFx0Y29uc3QgYWRhcHRlciA9IGF3YWl0IHRoaXMucmVzb2x2ZUFkYXB0ZXJGb3JXb3JrZmxvdyhjb25maWcpO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0YFN1YnNjcmliaW5nIHRvIHRvcGljOiAke2NvbmZpZy50b3BpY30gdmlhICR7YWRhcHRlci5wcm92aWRlcn0gKHN1YnNjcmlwdGlvbjogJHtjb25maWcuc3Vic2NyaXB0aW9uID8/IFwiPGF1dG8+XCJ9LCBncm91cDogJHtjb25maWcuY29uc3VtZXJHcm91cCA/PyBcIjxmYW4tb3V0PlwifSlgLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGF3YWl0IGFkYXB0ZXIuc3Vic2NyaWJlKGNvbmZpZywgYXN5bmMgKG1lc3NhZ2UpID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmhhbmRsZU1lc3NhZ2UobWVzc2FnZSwgd29ya2Zsb3csIGNvbmZpZyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmxvZ2dlci5sb2coYFB1Yi9TdWIgdHJpZ2dlciBzdGFydGVkLiBMaXN0ZW5pbmcgdG8gJHtwdWJzdWJXb3JrZmxvd3MubGVuZ3RofSBzdWJzY3JpcHRpb24ocylgKTtcblxuXHRcdFx0Ly8gRW5hYmxlIEhNUiBpbiBkZXZlbG9wbWVudCBtb2RlXG5cdFx0XHRpZiAocHJvY2Vzcy5lbnYuQkxPS19ITVIgPT09IFwidHJ1ZVwiIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5lbmFibGVIb3RSZWxvYWQoKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuZW5kQ291bnRlcihzdGFydFRpbWUpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHN0YXJ0IHB1Yi9zdWIgdHJpZ2dlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3RvcCB0aGUgcHViL3N1YiBzdWJzY3JpYmVyIOKAlCBkcmFpbnMgZXZlcnkgYWRhcHRlciBpbiB0aGUgcG9vbFxuXHQgKiBwbHVzIHRoZSBzdWJjbGFzcy1zZXQgYWRhcHRlciAoaWYgYW55KS5cblx0ICovXG5cdGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Zm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlclBvb2wudmFsdWVzKCkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGFkYXB0ZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBbYmxva11bcHVic3ViXSBkaXNjb25uZWN0IGZhaWxlZDogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmFkYXB0ZXJQb29sLmNsZWFyKCk7XG5cdFx0dGhpcy5sb2dnZXIubG9nKFwiUHViL1N1YiB0cmlnZ2VyIHN0b3BwZWRcIik7XG5cdH1cblxuXHQvKipcblx0ICogdjAuNyBQUiA2IOKAlCBwaWNrIHRoZSBhZGFwdGVyIGZvciBhIHdvcmtmbG93J3MgYHByb3ZpZGVyYCBmaWVsZC5cblx0ICpcblx0ICogUmVzb2x1dGlvbiBvcmRlcjpcblx0ICogICAxLiBTdWJjbGFzcy1zZXQgYHRoaXMuYWRhcHRlcmAgKGJhY2stY29tcGF0KS5cblx0ICogICAyLiBQZXItd29ya2Zsb3cgYHByb3ZpZGVyYCBmaWVsZCB2aWEgdGhlIGZhY3RvcnkuXG5cdCAqICAgMy4gYEJMT0tfUFVCU1VCX0FEQVBURVJgIGVudiB2YXIuXG5cdCAqICAgNC4gYFwibmF0c1wiYCBmYWxsYmFjay5cblx0ICpcblx0ICogQWRhcHRlcnMgYXJlIGNvbm5lY3RlZCBvbiBmaXJzdCB1c2UgYW5kIHBvb2xlZCBwZXIgcHJvdmlkZXIuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYXN5bmMgcmVzb2x2ZUFkYXB0ZXJGb3JXb3JrZmxvdyhjb25maWc6IFB1YlN1YlRyaWdnZXJPcHRzKTogUHJvbWlzZTxQdWJTdWJBZGFwdGVyPiB7XG5cdFx0aWYgKHRoaXMuYWRhcHRlcikge1xuXHRcdFx0aWYgKCF0aGlzLmFkYXB0ZXIuaXNDb25uZWN0ZWQoKSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmFkYXB0ZXIuY29ubmVjdCgpO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coYENvbm5lY3RlZCB0byAke3RoaXMuYWRhcHRlci5wcm92aWRlcn0gcHViL3N1YiBzeXN0ZW0gKHN1YmNsYXNzIGFkYXB0ZXIpYCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmFkYXB0ZXJQb29sLnNldCh0aGlzLmFkYXB0ZXIucHJvdmlkZXIsIHRoaXMuYWRhcHRlcik7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGFwdGVyO1xuXHRcdH1cblx0XHRjb25zdCB7IHJlc29sdmVQcm92aWRlciwgY3JlYXRlUHViU3ViQWRhcHRlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi9hZGFwdGVycy9mYWN0b3J5XCIpO1xuXHRcdGNvbnN0IHByb3ZpZGVyID0gcmVzb2x2ZVByb3ZpZGVyKGNvbmZpZy5wcm92aWRlcik7XG5cdFx0bGV0IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJQb29sLmdldChwcm92aWRlcik7XG5cdFx0aWYgKCFhZGFwdGVyKSB7XG5cdFx0XHRhZGFwdGVyID0gY3JlYXRlUHViU3ViQWRhcHRlcihwcm92aWRlcik7XG5cdFx0XHRhd2FpdCBhZGFwdGVyLmNvbm5lY3QoKTtcblx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgQ29ubmVjdGVkIHRvICR7YWRhcHRlci5wcm92aWRlcn0gcHViL3N1YiBzeXN0ZW1gKTtcblx0XHRcdHRoaXMuYWRhcHRlclBvb2wuc2V0KHByb3ZpZGVyLCBhZGFwdGVyKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFkYXB0ZXI7XG5cdH1cblxuXHRwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgb25IbXJXb3JrZmxvd0NoYW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmxvZ2dlci5sb2coXCJbSE1SXSBQdWIvU3ViIHdvcmtmbG93IGNoYW5nZWQsIHJlbG9hZGluZy4uLlwiKTtcblx0XHRhd2FpdCB0aGlzLndhaXRGb3JJbkZsaWdodFJlcXVlc3RzKCk7XG5cdFx0YXdhaXQgdGhpcy5zdG9wKCk7XG5cdFx0dGhpcy5sb2FkV29ya2Zsb3dzKCk7XG5cdFx0YXdhaXQgdGhpcy5saXN0ZW4oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYWxsIHdvcmtmbG93cyB0aGF0IGhhdmUgcHViL3N1YiB0cmlnZ2Vyc1xuXHQgKi9cblx0cHJvdGVjdGVkIGdldFB1YlN1YldvcmtmbG93cygpOiBQdWJTdWJXb3JrZmxvd01vZGVsW10ge1xuXHRcdGNvbnN0IHdvcmtmbG93czogUHViU3ViV29ya2Zsb3dNb2RlbFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IFtwYXRoLCB3b3JrZmxvd10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ub2RlTWFwLndvcmtmbG93cyB8fCB7fSkpIHtcblx0XHRcdC8vIEhlbHBlclJlc3BvbnNlIGhhcyBhIHByb3RlY3RlZCBfY29uZmlnIHByb3BlcnR5XG5cdFx0XHRjb25zdCB3b3JrZmxvd0NvbmZpZyA9ICh3b3JrZmxvdyBhcyB1bmtub3duIGFzIHsgX2NvbmZpZzogUHViU3ViV29ya2Zsb3dNb2RlbFtcImNvbmZpZ1wiXSB9KS5fY29uZmlnO1xuXG5cdFx0XHRpZiAod29ya2Zsb3dDb25maWc/LnRyaWdnZXIpIHtcblx0XHRcdFx0Y29uc3QgdHJpZ2dlclR5cGUgPSBPYmplY3Qua2V5cyh3b3JrZmxvd0NvbmZpZy50cmlnZ2VyKVswXTtcblxuXHRcdFx0XHRpZiAodHJpZ2dlclR5cGUgPT09IFwicHVic3ViXCIgJiYgd29ya2Zsb3dDb25maWcudHJpZ2dlci5wdWJzdWIpIHtcblx0XHRcdFx0XHR3b3JrZmxvd3MucHVzaCh7XG5cdFx0XHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRcdFx0Y29uZmlnOiB3b3JrZmxvd0NvbmZpZyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB3b3JrZmxvd3M7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlIGFuIGluY29taW5nIG1lc3NhZ2Vcblx0ICovXG5cdHByb3RlY3RlZCBhc3luYyBoYW5kbGVNZXNzYWdlKFxuXHRcdG1lc3NhZ2U6IFB1YlN1Yk1lc3NhZ2UsXG5cdFx0d29ya2Zsb3c6IFB1YlN1YldvcmtmbG93TW9kZWwsXG5cdFx0Y29uZmlnOiBQdWJTdWJUcmlnZ2VyT3B0cyxcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgaWQgPSBtZXNzYWdlLmlkIHx8IHV1aWQoKTtcblx0XHRjb25zdCBkZWZhdWx0TWV0ZXIgPSBtZXRyaWNzLmdldE1ldGVyKFwiZGVmYXVsdFwiKTtcblx0XHRjb25zdCBwdWJzdWJNZXNzYWdlcyA9IGRlZmF1bHRNZXRlci5jcmVhdGVDb3VudGVyKFwicHVic3ViX21lc3NhZ2VzXCIsIHtcblx0XHRcdGRlc2NyaXB0aW9uOiBcIlB1Yi9TdWIgbWVzc2FnZXMgcHJvY2Vzc2VkXCIsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcHVic3ViRXJyb3JzID0gZGVmYXVsdE1ldGVyLmNyZWF0ZUNvdW50ZXIoXCJwdWJzdWJfZXJyb3JzXCIsIHtcblx0XHRcdGRlc2NyaXB0aW9uOiBcIlB1Yi9TdWIgbWVzc2FnZSBwcm9jZXNzaW5nIGVycm9yc1wiLFxuXHRcdH0pO1xuXG5cdFx0YXdhaXQgdGhpcy50cmFjZXIuc3RhcnRBY3RpdmVTcGFuKGBwdWJzdWI6JHtjb25maWcudG9waWN9YCwgYXN5bmMgKHNwYW46IFNwYW4pID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cblx0XHRcdFx0Ly8gSW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHdvcmtmbG93XG5cdFx0XHRcdGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5pbml0KHdvcmtmbG93LnBhdGgsIHRoaXMubm9kZU1hcCk7XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIGNvbnRleHRcblx0XHRcdFx0Y29uc3QgY3R4OiBDb250ZXh0ID0gdGhpcy5jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCwgd29ya2Zsb3cucGF0aCwgaWQpO1xuXG5cdFx0XHRcdC8vIFBvcHVsYXRlIHJlcXVlc3Qgd2l0aCBtZXNzYWdlIGRhdGFcblx0XHRcdFx0Y3R4LnJlcXVlc3QgPSB7XG5cdFx0XHRcdFx0Ym9keTogbWVzc2FnZS5ib2R5LFxuXHRcdFx0XHRcdGhlYWRlcnM6IG1lc3NhZ2UuYXR0cmlidXRlcyxcblx0XHRcdFx0XHRxdWVyeToge30sXG5cdFx0XHRcdFx0cGFyYW1zOiB7XG5cdFx0XHRcdFx0XHR0b3BpYzogbWVzc2FnZS50b3BpYyxcblx0XHRcdFx0XHRcdHN1YnNjcmlwdGlvbjogbWVzc2FnZS5zdWJzY3JpcHRpb24gfHwgXCJcIixcblx0XHRcdFx0XHRcdG1lc3NhZ2VJZDogbWVzc2FnZS5pZCxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9IGFzIHVua25vd24gYXMgUmVxdWVzdENvbnRleHQ7XG5cblx0XHRcdFx0Ly8gU3RvcmUgbWVzc2FnZSBtZXRhZGF0YSBpbiBjb250ZXh0XG5cdFx0XHRcdGlmICghY3R4LnZhcnMpIGN0eC52YXJzID0ge307XG5cdFx0XHRcdGN0eC52YXJzLl9wdWJzdWJfbWVzc2FnZSA9IHtcblx0XHRcdFx0XHR0b3BpYzogbWVzc2FnZS50b3BpYyxcblx0XHRcdFx0XHRzdWJzY3JpcHRpb246IG1lc3NhZ2Uuc3Vic2NyaXB0aW9uIHx8IFwiXCIsXG5cdFx0XHRcdFx0cHVibGlzaFRpbWU6IG1lc3NhZ2UucHVibGlzaFRpbWU/LnRvSVNPU3RyaW5nKCkgPz8gXCJcIixcblx0XHRcdFx0XHRhdHRyaWJ1dGVzOiBKU09OLnN0cmluZ2lmeShtZXNzYWdlLmF0dHJpYnV0ZXMpLFxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGN0eC5sb2dnZXIubG9nKGBQcm9jZXNzaW5nIG1lc3NhZ2UgZnJvbSAke2NvbmZpZy50b3BpY306ICR7aWR9YCk7XG5cblx0XHRcdFx0Ly8gRXhlY3V0ZSB3b3JrZmxvd1xuXHRcdFx0XHRjb25zdCByZXNwb25zZTogVHJpZ2dlclJlc3BvbnNlID0gYXdhaXQgdGhpcy5ydW4oY3R4KTtcblx0XHRcdFx0Y29uc3QgZW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cblx0XHRcdFx0Ly8gU2V0IHNwYW4gYXR0cmlidXRlc1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInN1Y2Nlc3NcIiwgdHJ1ZSk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwibWVzc2FnZV9pZFwiLCBpZCk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwidG9waWNcIiwgY29uZmlnLnRvcGljKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWJzY3JpcHRpb25cIiwgY29uZmlnLnN1YnNjcmlwdGlvbiA/PyBcIjxhdXRvPlwiKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJwcm92aWRlclwiLCBjb25maWcucHJvdmlkZXIgPz8gXCI8ZGVmYXVsdD5cIik7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwiZWxhcHNlZF9tc1wiLCBlbmQgLSBzdGFydCk7XG5cdFx0XHRcdHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuT0sgfSk7XG5cblx0XHRcdFx0Ly8gUmVjb3JkIG1ldHJpY3Ncblx0XHRcdFx0cHVic3ViTWVzc2FnZXMuYWRkKDEsIHtcblx0XHRcdFx0XHRlbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WLFxuXHRcdFx0XHRcdHRvcGljOiBjb25maWcudG9waWMsXG5cdFx0XHRcdFx0c3Vic2NyaXB0aW9uOiBjb25maWcuc3Vic2NyaXB0aW9uID8/IFwiPGF1dG8+XCIsXG5cdFx0XHRcdFx0cHJvdmlkZXI6IGNvbmZpZy5wcm92aWRlciA/PyBcIjxkZWZhdWx0PlwiLFxuXHRcdFx0XHRcdHdvcmtmbG93X25hbWU6IHRoaXMuY29uZmlndXJhdGlvbi5uYW1lLFxuXHRcdFx0XHRcdHN1Y2Nlc3M6IFwidHJ1ZVwiLFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRjdHgubG9nZ2VyLmxvZyhgTWVzc2FnZSBwcm9jZXNzZWQgaW4gJHsoZW5kIC0gc3RhcnQpLnRvRml4ZWQoMil9bXM6ICR7aWR9YCk7XG5cblx0XHRcdFx0Ly8gQWNrbm93bGVkZ2UgbWVzc2FnZSBpZiBjb25maWd1cmVkXG5cdFx0XHRcdGlmIChjb25maWcuYWNrICE9PSBmYWxzZSkge1xuXHRcdFx0XHRcdGF3YWl0IG1lc3NhZ2UuYWNrKCk7XG5cdFx0XHRcdFx0Y3R4LmxvZ2dlci5sb2coYE1lc3NhZ2UgYWNrbm93bGVkZ2VkOiAke2lkfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2U7XG5cblx0XHRcdFx0Ly8gU2V0IHNwYW4gZXJyb3Jcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIGZhbHNlKTtcblx0XHRcdFx0c3Bhbi5yZWNvcmRFeGNlcHRpb24oZXJyb3IgYXMgRXJyb3IpO1xuXHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLCBtZXNzYWdlOiBlcnJvck1lc3NhZ2UgfSk7XG5cblx0XHRcdFx0Ly8gUmVjb3JkIGVycm9yIG1ldHJpY3Ncblx0XHRcdFx0cHVic3ViRXJyb3JzLmFkZCgxLCB7XG5cdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHR0b3BpYzogY29uZmlnLnRvcGljLFxuXHRcdFx0XHRcdHN1YnNjcmlwdGlvbjogY29uZmlnLnN1YnNjcmlwdGlvbiA/PyBcIjxhdXRvPlwiLFxuXHRcdFx0XHRcdHByb3ZpZGVyOiBjb25maWcucHJvdmlkZXIgPz8gXCI8ZGVmYXVsdD5cIixcblx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24/Lm5hbWUgfHwgXCJ1bmtub3duXCIsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyBtZXNzYWdlICR7aWR9OiAke2Vycm9yTWVzc2FnZX1gLCAoZXJyb3IgYXMgRXJyb3IpLnN0YWNrKTtcblxuXHRcdFx0XHQvLyBOYWNrIG1lc3NhZ2Vcblx0XHRcdFx0aWYgKGNvbmZpZy5hY2sgIT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0YXdhaXQgbWVzc2FnZS5uYWNrKCk7XG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKGBNZXNzYWdlIG5hY2tlZDogJHtpZH1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0c3Bhbi5lbmQoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBQdWJTdWJUcmlnZ2VyO1xuIl19
287
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHViU3ViVHJpZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QdWJTdWJUcmlnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFHSCxPQUFPLEVBRU4sYUFBYSxFQUViLE9BQU8sRUFDUCxXQUFXLEdBRVgsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQWEsY0FBYyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWdGbEM7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLGFBQWMsU0FBUSxXQUFXO0lBQzVDLE9BQU8sR0FBa0IsRUFBbUIsQ0FBQztJQUNwQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUkseUJBQXlCLEVBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FDdEMsQ0FBQztJQUNpQixNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztJQUVoRDs7Ozs7O09BTUc7SUFDTyxPQUFPLENBQWlCO0lBRWxDOzs7O09BSUc7SUFDTyxXQUFXLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7SUFNOUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFH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QUFHLEtBQUssS0FBSyxFQUFFLENBQUM7b0JBQzFCLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztZQUNGLENBQUM7b0JBQVMsQ0FBQztnQkFDVixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDWixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Q7QUFFRCxlQUFlLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHViU3ViVHJpZ2dlciAtIEJhc2UgY2xhc3MgZm9yIHB1Yi9zdWItYmFzZWQgd29ya2Zsb3cgdHJpZ2dlcnNcbiAqXG4gKiBFeHRlbmRzIFRyaWdnZXJCYXNlIHRvIHN1cHBvcnQgcHViL3N1YiB0cmlnZ2VyczpcbiAqIC0gR0NQIFB1Yi9TdWJcbiAqIC0gQVdTIFNOUyAodmlhIFNRUyBzdWJzY3JpcHRpb24pXG4gKiAtIEF6dXJlIFNlcnZpY2UgQnVzXG4gKlxuICogUGF0dGVybjpcbiAqIDEuIGxvYWROb2RlcygpIC0gTG9hZCBhdmFpbGFibGUgbm9kZXMgaW50byBOb2RlTWFwXG4gKiAyLiBsb2FkV29ya2Zsb3dzKCkgLSBMb2FkIHdvcmtmbG93cyB3aXRoIHB1YnN1YiB0cmlnZ2Vyc1xuICogMy4gc3RhcnRTdWJzY3JpYmVyKCkgLSBDb25uZWN0IHRvIHB1Yi9zdWIgYW5kIHN0YXJ0IHJlY2VpdmluZyBtZXNzYWdlc1xuICogNC4gRm9yIGVhY2ggbWVzc2FnZTpcbiAqICAgIC0gTWF0Y2ggd29ya2Zsb3cgYnkgdHJpZ2dlciBjb25maWcgKHRvcGljL3N1YnNjcmlwdGlvbilcbiAqICAgIC0gQ3JlYXRlIGNvbnRleHQgd2l0aCB0aGlzLmNyZWF0ZUNvbnRleHQoKVxuICogICAgLSBQb3B1bGF0ZSBjdHgucmVxdWVzdCB3aXRoIG1lc3NhZ2UgZGF0YVxuICogICAgLSBFeGVjdXRlIHdvcmtmbG93IHZpYSB0aGlzLnJ1bihjdHgpXG4gKiAgICAtIEFjay9uYWNrIGJhc2VkIG9uIHJlc3BvbnNlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBIZWxwZXJSZXNwb25zZSwgUHViU3ViUHJvdmlkZXIsIFB1YlN1YlRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9ranMvaGVscGVyXCI7XG5pbXBvcnQge1xuXHR0eXBlIEJsb2tTZXJ2aWNlLFxuXHREZWZhdWx0TG9nZ2VyLFxuXHR0eXBlIEdsb2JhbE9wdGlvbnMsXG5cdE5vZGVNYXAsXG5cdFRyaWdnZXJCYXNlLFxuXHR0eXBlIFRyaWdnZXJSZXNwb25zZSxcbn0gZnJvbSBcIkBibG9ranMvcnVubmVyXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQsIFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBibG9ranMvc2hhcmVkXCI7XG5pbXBvcnQgeyB0eXBlIFNwYW4sIFNwYW5TdGF0dXNDb2RlLCBtZXRyaWNzLCB0cmFjZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuXG4vKipcbiAqIE1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBwdWIvc3ViXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHViU3ViTWVzc2FnZSB7XG5cdC8qKiBVbmlxdWUgbWVzc2FnZSBJRCAqL1xuXHRpZDogc3RyaW5nO1xuXHQvKiogTWVzc2FnZSBib2R5IChwYXJzZWQpICovXG5cdGJvZHk6IHVua25vd247XG5cdC8qKiBNZXNzYWdlIGF0dHJpYnV0ZXMvbWV0YWRhdGEgKi9cblx0YXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblx0LyoqIE9yaWdpbmFsIHJhdyBtZXNzYWdlIGZyb20gcHJvdmlkZXIgKi9cblx0cmF3OiB1bmtub3duO1xuXHQvKiogVG9waWMgbmFtZSAqL1xuXHR0b3BpYzogc3RyaW5nO1xuXHQvKiogU3Vic2NyaXB0aW9uIG5hbWUgKi9cblx0c3Vic2NyaXB0aW9uPzogc3RyaW5nO1xuXHQvKiogUHVibGlzaCB0aW1lc3RhbXAgKi9cblx0cHVibGlzaFRpbWU/OiBEYXRlO1xuXHQvKiogQWNrbm93bGVkZ2UgdGhlIG1lc3NhZ2UgKi9cblx0YWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHQvKiogUmVqZWN0L25hY2sgdGhlIG1lc3NhZ2UgKi9cblx0bmFjazogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBQdWIvU3ViIGFkYXB0ZXIgaW50ZXJmYWNlIC0gaW1wbGVtZW50ZWQgYnkgZWFjaCBwcm92aWRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1YlN1YkFkYXB0ZXIge1xuXHQvKiogUHJvdmlkZXIgbmFtZSAqL1xuXHRyZWFkb25seSBwcm92aWRlcjogUHViU3ViUHJvdmlkZXI7XG5cblx0LyoqIENvbm5lY3QgdG8gdGhlIHB1Yi9zdWIgc3lzdGVtICovXG5cdGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKiogRGlzY29ubmVjdCBmcm9tIHRoZSBwdWIvc3ViIHN5c3RlbSAqL1xuXHRkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqIFN1YnNjcmliZSB0byBhIHRvcGljIGFuZCByZWNlaXZlIG1lc3NhZ2VzICovXG5cdHN1YnNjcmliZShjb25maWc6IFB1YlN1YlRyaWdnZXJPcHRzLCBoYW5kbGVyOiAobWVzc2FnZTogUHViU3ViTWVzc2FnZSkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD47XG5cblx0LyoqIFVuc3Vic2NyaWJlIGZyb20gYSB0b3BpYyAqL1xuXHR1bnN1YnNjcmliZShzdWJzY3JpcHRpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIHYwLjcgUFIgNiDigJQgcHVibGlzaCBhIHNpbmdsZSBtZXNzYWdlIHRvIGEgdG9waWMuIFVzZWQgYnkgdGhlXG5cdCAqIGBAYmxva2pzL3B1YnN1Yi1wdWJsaXNoYCBoZWxwZXIgYW5kIGFueSB3b3JrZmxvdyB0aGF0IGZhbi1vdXRzXG5cdCAqIGV2ZW50cyB0byBzdWJzY3JpYmVycy4gUHJvdmlkZXItcG9ydGFibGU6IGVhY2ggYWRhcHRlciB3cmFwcyBpdHNcblx0ICogbmF0aXZlIHByb2R1Y2VyIGNsaWVudC5cblx0ICpcblx0ICogT3B0aW9uYWwgYHBhcnRpdGlvbktleWAgLyBgb3JkZXJpbmdLZXlgIGlzIGhvbm9yZWQgYnkgcHJvdmlkZXJzXG5cdCAqIHRoYXQgc3VwcG9ydCBwZXIta2V5IG9yZGVyaW5nIChLYWZrYSwgR0NQIFB1Yi9TdWIgb3JkZXJlZFxuXHQgKiBkZWxpdmVyeSkuIElnbm9yZWQgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGlzaCh0b3BpYzogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duLCBvcHRzPzogeyBwYXJ0aXRpb25LZXk/OiBzdHJpbmc7IG9yZGVyaW5nS2V5Pzogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKiBDaGVjayBpZiBjb25uZWN0ZWQgKi9cblx0aXNDb25uZWN0ZWQoKTogYm9vbGVhbjtcblxuXHQvKiogSGVhbHRoIGNoZWNrICovXG5cdGhlYWx0aENoZWNrKCk6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogV29ya2Zsb3cgbW9kZWwgd2l0aCBwdWIvc3ViIHRyaWdnZXIgY29uZmlndXJhdGlvblxuICovXG5pbnRlcmZhY2UgUHViU3ViV29ya2Zsb3dNb2RlbCB7XG5cdHBhdGg6IHN0cmluZztcblx0Y29uZmlnOiB7XG5cdFx0bmFtZTogc3RyaW5nO1xuXHRcdHZlcnNpb246IHN0cmluZztcblx0XHR0cmlnZ2VyPzoge1xuXHRcdFx0cHVic3ViPzogUHViU3ViVHJpZ2dlck9wdHM7XG5cdFx0XHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xuXHRcdH07XG5cdFx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0fTtcbn1cblxuLyoqXG4gKiBQdWJTdWJUcmlnZ2VyIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcHViL3N1Yi1iYXNlZCB0cmlnZ2Vyc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUHViU3ViVHJpZ2dlciBleHRlbmRzIFRyaWdnZXJCYXNlIHtcblx0cHJvdGVjdGVkIG5vZGVNYXA6IEdsb2JhbE9wdGlvbnMgPSB7fSBhcyBHbG9iYWxPcHRpb25zO1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhY2VyID0gdHJhY2UuZ2V0VHJhY2VyKFxuXHRcdHByb2Nlc3MuZW52LlBST0pFQ1RfTkFNRSB8fCBcInRyaWdnZXItcHVic3ViLXdvcmtmbG93XCIsXG5cdFx0cHJvY2Vzcy5lbnYuUFJPSkVDVF9WRVJTSU9OIHx8IFwiMC4wLjFcIixcblx0KTtcblx0cHJvdGVjdGVkIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBEZWZhdWx0TG9nZ2VyKCk7XG5cblx0LyoqXG5cdCAqIHYwLjcgUFIgNiDigJQgYmFjay1jb21wYXQgZGVmYXVsdCBhZGFwdGVyLiBXaGVuIHN1YmNsYXNzZXMgc2V0XG5cdCAqIGBwcm90ZWN0ZWQgYWRhcHRlciA9IG5ldyBHQ1BQdWJTdWJBZGFwdGVyKClgIChwcmUtdjAuNyBwYXR0ZXJuKSxcblx0ICogQUxMIHdvcmtmbG93cyByb3V0ZSB0aHJvdWdoIGl0IHJlZ2FyZGxlc3Mgb2YgdGhlaXIgYHByb3ZpZGVyYFxuXHQgKiBmaWVsZC4gV2hlbiB1bnNldCwgZWFjaCB3b3JrZmxvdydzIGBwcm92aWRlcmAgaXMgcmVzb2x2ZWQgdmlhXG5cdCAqIHRoZSBmYWN0b3J5LlxuXHQgKi9cblx0cHJvdGVjdGVkIGFkYXB0ZXI/OiBQdWJTdWJBZGFwdGVyO1xuXG5cdC8qKlxuXHQgKiB2MC43IFBSIDYg4oCUIGFkYXB0ZXIgcG9vbCwga2V5ZWQgYnkgcHJvdmlkZXIuIFBvcHVsYXRlZCBsYXppbHkgaW5cblx0ICogYGxpc3RlbigpYCBhcyB3b3JrZmxvd3MgYXJlIG1hdGNoZWQgdG8gcHJvdmlkZXJzLiBEcmFpbmVkIGluXG5cdCAqIGBzdG9wKClgLiBPbmUgYWRhcHRlciAob25lIGJyb2tlciBjb25uZWN0aW9uKSBwZXIgcHJvdmlkZXIuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYWRhcHRlclBvb2w6IE1hcDxzdHJpbmcsIFB1YlN1YkFkYXB0ZXI+ID0gbmV3IE1hcCgpO1xuXG5cdC8vIFN1YmNsYXNzZXMgcHJvdmlkZSB0aGVzZVxuXHRwcm90ZWN0ZWQgYWJzdHJhY3Qgbm9kZXM6IFJlY29yZDxzdHJpbmcsIEJsb2tTZXJ2aWNlPHVua25vd24+Pjtcblx0cHJvdGVjdGVkIGFic3RyYWN0IHdvcmtmbG93czogUmVjb3JkPHN0cmluZywgSGVscGVyUmVzcG9uc2U+O1xuXG5cdC8qKlxuXHQgKiBMb2FkIG5vZGVzIGludG8gdGhlIG5vZGUgbWFwXG5cdCAqL1xuXHRsb2FkTm9kZXMoKTogdm9pZCB7XG5cdFx0dGhpcy5ub2RlTWFwLm5vZGVzID0gbmV3IE5vZGVNYXAoKTtcblx0XHRjb25zdCBub2RlS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMubm9kZXMpO1xuXHRcdGZvciAoY29uc3Qga2V5IG9mIG5vZGVLZXlzKSB7XG5cdFx0XHR0aGlzLm5vZGVNYXAubm9kZXMuYWRkTm9kZShrZXksIHRoaXMubm9kZXNba2V5XSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgd29ya2Zsb3dzIGludG8gdGhlIHdvcmtmbG93IG1hcFxuXHQgKi9cblx0bG9hZFdvcmtmbG93cygpOiB2b2lkIHtcblx0XHR0aGlzLm5vZGVNYXAud29ya2Zsb3dzID0gdGhpcy53b3JrZmxvd3M7XG5cdH1cblxuXHQvKipcblx0ICogU3RhcnQgdGhlIHB1Yi9zdWIgc3Vic2NyaWJlciAtIG1haW4gZW50cnkgcG9pbnRcblx0ICovXG5cdGFzeW5jIGxpc3RlbigpOiBQcm9taXNlPG51bWJlcj4ge1xuXHRcdGNvbnN0IHN0YXJ0VGltZSA9IHRoaXMuc3RhcnRDb3VudGVyKCk7XG5cblx0XHQvLyBJbml0aWFsaXplIG5vZGVzIGFuZCB3b3JrZmxvd3MgKGNhbGxlZCBoZXJlIGJlY2F1c2Ugc3ViY2xhc3MgcHJvcGVydGllc1xuXHRcdC8vIGFyZW4ndCBhdmFpbGFibGUgaW4gcGFyZW50IGNvbnN0cnVjdG9yKVxuXHRcdHRoaXMubG9hZE5vZGVzKCk7XG5cdFx0dGhpcy5sb2FkV29ya2Zsb3dzKCk7XG5cblx0XHQvLyBGNSDCtyBpbnN0YWxsIGNyYXNoL29ycGhhbi9qYW5pdG9yL3NodXRkb3duIGhhbmRsZXJzIHNvIGFcblx0XHQvLyBwdWJzdWItb25seSBwcm9jZXNzIGdldHMgdGhlIHNhbWUgcnVuLXN0YXRlIGludGVncml0eSArIHN0b3JhZ2Vcblx0XHQvLyBoeWdpZW5lIGd1YXJhbnRlZXMgYXMgSFRUUC9Xb3JrZXIuIEVhY2ggaGFuZGxlciBpcyBpZGVtcG90ZW50LlxuXHRcdHRoaXMuaW5zdGFsbE9wZXJhdGlvbmFsSGFuZGxlcnModGhpcy5sb2dnZXIpO1xuXG5cdFx0Ly8gRjYgwrcgZmVlZCB0aGUgV29ya2Zsb3dSZWdpc3RyeSBmcm9tIHRoZSBub2RlTWFwIHNvIGBzdWJ3b3JrZmxvdzpgXG5cdFx0Ly8gc3RlcHMgKyB0cmlnZ2VyL3dvcmtmbG93L3Byb2Nlc3MtZ2xvYmFsIG1pZGRsZXdhcmUgcmVzb2x2ZSBpbiBhXG5cdFx0Ly8gcHVic3ViLW9ubHkgZGVwbG95bWVudC5cblx0XHR0aGlzLnJlZ2lzdGVyV29ya2Zsb3dzRnJvbU5vZGVNYXAodGhpcy5sb2dnZXIpO1xuXG5cdFx0Ly8gRjE0IMK3IHNlZWQgdGhlIHByb2Nlc3MtZ2xvYmFsIG1pZGRsZXdhcmUgY2hhaW4gZnJvbVxuXHRcdC8vIGBCTE9LX0dMT0JBTF9NSURETEVXQVJFYCAoaWRlbXBvdGVudCDigJQgcHJvZ3JhbW1hdGljXG5cdFx0Ly8gc2V0R2xvYmFsTWlkZGxld2FyZSB0YWtlcyBwcmVjZWRlbmNlKS5cblx0XHR0aGlzLnNlZWRHbG9iYWxNaWRkbGV3YXJlRnJvbUVudih0aGlzLmxvZ2dlcik7XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gRmluZCBhbGwgd29ya2Zsb3dzIHdpdGggcHViL3N1YiB0cmlnZ2Vyc1xuXHRcdFx0Y29uc3QgcHVic3ViV29ya2Zsb3dzID0gdGhpcy5nZXRQdWJTdWJXb3JrZmxvd3MoKTtcblxuXHRcdFx0aWYgKHB1YnN1YldvcmtmbG93cy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKFwiTm8gd29ya2Zsb3dzIHdpdGggcHViL3N1YiB0cmlnZ2VycyBmb3VuZFwiKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZW5kQ291bnRlcihzdGFydFRpbWUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdWJzY3JpYmUgdG8gZWFjaCB0b3BpYyB2aWEgdGhlIGFkYXB0ZXIgdGhhdCBvd25zIGl0c1xuXHRcdFx0Ly8gcHJvdmlkZXIuIFBlci13b3JrZmxvdyBgcHJvdmlkZXJgIGZpZWxkIHdpdGggc3ViY2xhc3MtXG5cdFx0XHQvLyBhZGFwdGVyIGJhY2stY29tcGF0IChoYW5kbGVkIGluIHJlc29sdmVBZGFwdGVyRm9yV29ya2Zsb3cpLlxuXHRcdFx0Zm9yIChjb25zdCB3b3JrZmxvdyBvZiBwdWJzdWJXb3JrZmxvd3MpIHtcblx0XHRcdFx0Y29uc3QgY29uZmlnID0gd29ya2Zsb3cuY29uZmlnLnRyaWdnZXI/LnB1YnN1YiBhcyBQdWJTdWJUcmlnZ2VyT3B0cztcblx0XHRcdFx0Y29uc3QgYWRhcHRlciA9IGF3YWl0IHRoaXMucmVzb2x2ZUFkYXB0ZXJGb3JXb3JrZmxvdyhjb25maWcpO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0YFN1YnNjcmliaW5nIHRvIHRvcGljOiAke2NvbmZpZy50b3BpY30gdmlhICR7YWRhcHRlci5wcm92aWRlcn0gKHN1YnNjcmlwdGlvbjogJHtjb25maWcuc3Vic2NyaXB0aW9uID8/IFwiPGF1dG8+XCJ9LCBncm91cDogJHtjb25maWcuY29uc3VtZXJHcm91cCA/PyBcIjxmYW4tb3V0PlwifSlgLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGF3YWl0IGFkYXB0ZXIuc3Vic2NyaWJlKGNvbmZpZywgYXN5bmMgKG1lc3NhZ2UpID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmhhbmRsZU1lc3NhZ2UobWVzc2FnZSwgd29ya2Zsb3csIGNvbmZpZyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmxvZ2dlci5sb2coYFB1Yi9TdWIgdHJpZ2dlciBzdGFydGVkLiBMaXN0ZW5pbmcgdG8gJHtwdWJzdWJXb3JrZmxvd3MubGVuZ3RofSBzdWJzY3JpcHRpb24ocylgKTtcblxuXHRcdFx0Ly8gRW5hYmxlIEhNUiBpbiBkZXZlbG9wbWVudCBtb2RlXG5cdFx0XHRpZiAocHJvY2Vzcy5lbnYuQkxPS19ITVIgPT09IFwidHJ1ZVwiIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5lbmFibGVIb3RSZWxvYWQoKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuZW5kQ291bnRlcihzdGFydFRpbWUpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHN0YXJ0IHB1Yi9zdWIgdHJpZ2dlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3RvcCB0aGUgcHViL3N1YiBzdWJzY3JpYmVyIOKAlCBkcmFpbnMgZXZlcnkgYWRhcHRlciBpbiB0aGUgcG9vbFxuXHQgKiBwbHVzIHRoZSBzdWJjbGFzcy1zZXQgYWRhcHRlciAoaWYgYW55KS5cblx0ICovXG5cdGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Zm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlclBvb2wudmFsdWVzKCkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGFkYXB0ZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBbYmxva11bcHVic3ViXSBkaXNjb25uZWN0IGZhaWxlZDogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmFkYXB0ZXJQb29sLmNsZWFyKCk7XG5cdFx0dGhpcy5sb2dnZXIubG9nKFwiUHViL1N1YiB0cmlnZ2VyIHN0b3BwZWRcIik7XG5cdH1cblxuXHQvKipcblx0ICogdjAuNyBQUiA2IOKAlCBwaWNrIHRoZSBhZGFwdGVyIGZvciBhIHdvcmtmbG93J3MgYHByb3ZpZGVyYCBmaWVsZC5cblx0ICpcblx0ICogUmVzb2x1dGlvbiBvcmRlcjpcblx0ICogICAxLiBTdWJjbGFzcy1zZXQgYHRoaXMuYWRhcHRlcmAgKGJhY2stY29tcGF0KS5cblx0ICogICAyLiBQZXItd29ya2Zsb3cgYHByb3ZpZGVyYCBmaWVsZCB2aWEgdGhlIGZhY3RvcnkuXG5cdCAqICAgMy4gYEJMT0tfUFVCU1VCX0FEQVBURVJgIGVudiB2YXIuXG5cdCAqICAgNC4gYFwibmF0c1wiYCBmYWxsYmFjay5cblx0ICpcblx0ICogQWRhcHRlcnMgYXJlIGNvbm5lY3RlZCBvbiBmaXJzdCB1c2UgYW5kIHBvb2xlZCBwZXIgcHJvdmlkZXIuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYXN5bmMgcmVzb2x2ZUFkYXB0ZXJGb3JXb3JrZmxvdyhjb25maWc6IFB1YlN1YlRyaWdnZXJPcHRzKTogUHJvbWlzZTxQdWJTdWJBZGFwdGVyPiB7XG5cdFx0aWYgKHRoaXMuYWRhcHRlcikge1xuXHRcdFx0aWYgKCF0aGlzLmFkYXB0ZXIuaXNDb25uZWN0ZWQoKSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmFkYXB0ZXIuY29ubmVjdCgpO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coYENvbm5lY3RlZCB0byAke3RoaXMuYWRhcHRlci5wcm92aWRlcn0gcHViL3N1YiBzeXN0ZW0gKHN1YmNsYXNzIGFkYXB0ZXIpYCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmFkYXB0ZXJQb29sLnNldCh0aGlzLmFkYXB0ZXIucHJvdmlkZXIsIHRoaXMuYWRhcHRlcik7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGFwdGVyO1xuXHRcdH1cblx0XHRjb25zdCB7IHJlc29sdmVQcm92aWRlciwgY3JlYXRlUHViU3ViQWRhcHRlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi9hZGFwdGVycy9mYWN0b3J5XCIpO1xuXHRcdGNvbnN0IHByb3ZpZGVyID0gcmVzb2x2ZVByb3ZpZGVyKGNvbmZpZy5wcm92aWRlcik7XG5cdFx0bGV0IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJQb29sLmdldChwcm92aWRlcik7XG5cdFx0aWYgKCFhZGFwdGVyKSB7XG5cdFx0XHRhZGFwdGVyID0gY3JlYXRlUHViU3ViQWRhcHRlcihwcm92aWRlcik7XG5cdFx0XHRhd2FpdCBhZGFwdGVyLmNvbm5lY3QoKTtcblx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgQ29ubmVjdGVkIHRvICR7YWRhcHRlci5wcm92aWRlcn0gcHViL3N1YiBzeXN0ZW1gKTtcblx0XHRcdHRoaXMuYWRhcHRlclBvb2wuc2V0KHByb3ZpZGVyLCBhZGFwdGVyKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFkYXB0ZXI7XG5cdH1cblxuXHRwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgb25IbXJXb3JrZmxvd0NoYW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmxvZ2dlci5sb2coXCJbSE1SXSBQdWIvU3ViIHdvcmtmbG93IGNoYW5nZWQsIHJlbG9hZGluZy4uLlwiKTtcblx0XHRhd2FpdCB0aGlzLndhaXRGb3JJbkZsaWdodFJlcXVlc3RzKCk7XG5cdFx0YXdhaXQgdGhpcy5zdG9wKCk7XG5cdFx0dGhpcy5sb2FkV29ya2Zsb3dzKCk7XG5cdFx0YXdhaXQgdGhpcy5saXN0ZW4oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYWxsIHdvcmtmbG93cyB0aGF0IGhhdmUgcHViL3N1YiB0cmlnZ2Vyc1xuXHQgKi9cblx0cHJvdGVjdGVkIGdldFB1YlN1YldvcmtmbG93cygpOiBQdWJTdWJXb3JrZmxvd01vZGVsW10ge1xuXHRcdGNvbnN0IHdvcmtmbG93czogUHViU3ViV29ya2Zsb3dNb2RlbFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IFtwYXRoLCB3b3JrZmxvd10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ub2RlTWFwLndvcmtmbG93cyB8fCB7fSkpIHtcblx0XHRcdC8vIEhlbHBlclJlc3BvbnNlIGhhcyBhIHByb3RlY3RlZCBfY29uZmlnIHByb3BlcnR5XG5cdFx0XHRjb25zdCB3b3JrZmxvd0NvbmZpZyA9ICh3b3JrZmxvdyBhcyB1bmtub3duIGFzIHsgX2NvbmZpZzogUHViU3ViV29ya2Zsb3dNb2RlbFtcImNvbmZpZ1wiXSB9KS5fY29uZmlnO1xuXG5cdFx0XHRpZiAod29ya2Zsb3dDb25maWc/LnRyaWdnZXIpIHtcblx0XHRcdFx0Y29uc3QgdHJpZ2dlclR5cGUgPSBPYmplY3Qua2V5cyh3b3JrZmxvd0NvbmZpZy50cmlnZ2VyKVswXTtcblxuXHRcdFx0XHRpZiAodHJpZ2dlclR5cGUgPT09IFwicHVic3ViXCIgJiYgd29ya2Zsb3dDb25maWcudHJpZ2dlci5wdWJzdWIpIHtcblx0XHRcdFx0XHR3b3JrZmxvd3MucHVzaCh7XG5cdFx0XHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRcdFx0Y29uZmlnOiB3b3JrZmxvd0NvbmZpZyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB3b3JrZmxvd3M7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlIGFuIGluY29taW5nIG1lc3NhZ2Vcblx0ICovXG5cdHByb3RlY3RlZCBhc3luYyBoYW5kbGVNZXNzYWdlKFxuXHRcdG1lc3NhZ2U6IFB1YlN1Yk1lc3NhZ2UsXG5cdFx0d29ya2Zsb3c6IFB1YlN1YldvcmtmbG93TW9kZWwsXG5cdFx0Y29uZmlnOiBQdWJTdWJUcmlnZ2VyT3B0cyxcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgaWQgPSBtZXNzYWdlLmlkIHx8IHV1aWQoKTtcblx0XHRjb25zdCBkZWZhdWx0TWV0ZXIgPSBtZXRyaWNzLmdldE1ldGVyKFwiZGVmYXVsdFwiKTtcblx0XHRjb25zdCBwdWJzdWJNZXNzYWdlcyA9IGRlZmF1bHRNZXRlci5jcmVhdGVDb3VudGVyKFwicHVic3ViX21lc3NhZ2VzXCIsIHtcblx0XHRcdGRlc2NyaXB0aW9uOiBcIlB1Yi9TdWIgbWVzc2FnZXMgcHJvY2Vzc2VkXCIsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcHVic3ViRXJyb3JzID0gZGVmYXVsdE1ldGVyLmNyZWF0ZUNvdW50ZXIoXCJwdWJzdWJfZXJyb3JzXCIsIHtcblx0XHRcdGRlc2NyaXB0aW9uOiBcIlB1Yi9TdWIgbWVzc2FnZSBwcm9jZXNzaW5nIGVycm9yc1wiLFxuXHRcdH0pO1xuXG5cdFx0YXdhaXQgdGhpcy50cmFjZXIuc3RhcnRBY3RpdmVTcGFuKGBwdWJzdWI6JHtjb25maWcudG9waWN9YCwgYXN5bmMgKHNwYW46IFNwYW4pID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cblx0XHRcdFx0Ly8gSW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHdvcmtmbG93XG5cdFx0XHRcdGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5pbml0KHdvcmtmbG93LnBhdGgsIHRoaXMubm9kZU1hcCk7XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIGNvbnRleHRcblx0XHRcdFx0Y29uc3QgY3R4OiBDb250ZXh0ID0gdGhpcy5jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCwgd29ya2Zsb3cucGF0aCwgaWQpO1xuXG5cdFx0XHRcdC8vIFBvcHVsYXRlIHJlcXVlc3Qgd2l0aCBtZXNzYWdlIGRhdGFcblx0XHRcdFx0Y3R4LnJlcXVlc3QgPSB7XG5cdFx0XHRcdFx0Ym9keTogbWVzc2FnZS5ib2R5LFxuXHRcdFx0XHRcdGhlYWRlcnM6IG1lc3NhZ2UuYXR0cmlidXRlcyxcblx0XHRcdFx0XHRxdWVyeToge30sXG5cdFx0XHRcdFx0cGFyYW1zOiB7XG5cdFx0XHRcdFx0XHR0b3BpYzogbWVzc2FnZS50b3BpYyxcblx0XHRcdFx0XHRcdHN1YnNjcmlwdGlvbjogbWVzc2FnZS5zdWJzY3JpcHRpb24gfHwgXCJcIixcblx0XHRcdFx0XHRcdG1lc3NhZ2VJZDogbWVzc2FnZS5pZCxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9IGFzIHVua25vd24gYXMgUmVxdWVzdENvbnRleHQ7XG5cblx0XHRcdFx0Ly8gU3RvcmUgbWVzc2FnZSBtZXRhZGF0YSBpbiBjb250ZXh0XG5cdFx0XHRcdGlmICghY3R4LnZhcnMpIGN0eC52YXJzID0ge307XG5cdFx0XHRcdGN0eC52YXJzLl9wdWJzdWJfbWVzc2FnZSA9IHtcblx0XHRcdFx0XHR0b3BpYzogbWVzc2FnZS50b3BpYyxcblx0XHRcdFx0XHRzdWJzY3JpcHRpb246IG1lc3NhZ2Uuc3Vic2NyaXB0aW9uIHx8IFwiXCIsXG5cdFx0XHRcdFx0cHVibGlzaFRpbWU6IG1lc3NhZ2UucHVibGlzaFRpbWU/LnRvSVNPU3RyaW5nKCkgPz8gXCJcIixcblx0XHRcdFx0XHRhdHRyaWJ1dGVzOiBKU09OLnN0cmluZ2lmeShtZXNzYWdlLmF0dHJpYnV0ZXMpLFxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGN0eC5sb2dnZXIubG9nKGBQcm9jZXNzaW5nIG1lc3NhZ2UgZnJvbSAke2NvbmZpZy50b3BpY306ICR7aWR9YCk7XG5cblx0XHRcdFx0Ly8gRjEgwrcgYXBwbHkgdGhlIG1lcmdlZCBtaWRkbGV3YXJlIGNoYWluIChwcm9jZXNzLWdsb2JhbCDihpJcblx0XHRcdFx0Ly8gd29ya2Zsb3ctbGV2ZWwg4oaSIHRyaWdnZXItbGV2ZWwpIGJlZm9yZSB0aGUgbWFpbiB3b3JrZmxvd1xuXHRcdFx0XHQvLyBib2R5LCBhZnRlciBjdHgucmVxdWVzdCBpcyBwb3B1bGF0ZWQgc28gbWlkZGxld2FyZSBzZWVzIHRoZVxuXHRcdFx0XHQvLyByZWFsIGJvZHkvaGVhZGVycy4gQSB0aHJvd2luZyBtaWRkbGV3YXJlIHByb3BhZ2F0ZXMgdG8gdGhlXG5cdFx0XHRcdC8vIG91dGVyIGNhdGNoIChuYWNrKS4gUHJlLWZpeCBwdWJzdWIgc2lsZW50bHkgc2tpcHBlZCBBTExcblx0XHRcdFx0Ly8gbWlkZGxld2FyZSDigJQgaW5jbHVkaW5nIGF1dGggZ2F0ZXMuXG5cdFx0XHRcdGF3YWl0IHRoaXMuYXBwbHlNaWRkbGV3YXJlQ2hhaW4oY3R4LCB0aGlzLm5vZGVNYXApO1xuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgd29ya2Zsb3dcblx0XHRcdFx0Y29uc3QgcmVzcG9uc2U6IFRyaWdnZXJSZXNwb25zZSA9IGF3YWl0IHRoaXMucnVuKGN0eCk7XG5cdFx0XHRcdGNvbnN0IGVuZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG5cdFx0XHRcdC8vIFNldCBzcGFuIGF0dHJpYnV0ZXNcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIHRydWUpO1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcIm1lc3NhZ2VfaWRcIiwgaWQpO1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInRvcGljXCIsIGNvbmZpZy50b3BpYyk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic3Vic2NyaXB0aW9uXCIsIGNvbmZpZy5zdWJzY3JpcHRpb24gPz8gXCI8YXV0bz5cIik7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwicHJvdmlkZXJcIiwgY29uZmlnLnByb3ZpZGVyID8/IFwiPGRlZmF1bHQ+XCIpO1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcImVsYXBzZWRfbXNcIiwgZW5kIC0gc3RhcnQpO1xuXHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLk9LIH0pO1xuXG5cdFx0XHRcdC8vIFJlY29yZCBtZXRyaWNzXG5cdFx0XHRcdHB1YnN1Yk1lc3NhZ2VzLmFkZCgxLCB7XG5cdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHR0b3BpYzogY29uZmlnLnRvcGljLFxuXHRcdFx0XHRcdHN1YnNjcmlwdGlvbjogY29uZmlnLnN1YnNjcmlwdGlvbiA/PyBcIjxhdXRvPlwiLFxuXHRcdFx0XHRcdHByb3ZpZGVyOiBjb25maWcucHJvdmlkZXIgPz8gXCI8ZGVmYXVsdD5cIixcblx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24ubmFtZSxcblx0XHRcdFx0XHRzdWNjZXNzOiBcInRydWVcIixcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Y3R4LmxvZ2dlci5sb2coYE1lc3NhZ2UgcHJvY2Vzc2VkIGluICR7KGVuZCAtIHN0YXJ0KS50b0ZpeGVkKDIpfW1zOiAke2lkfWApO1xuXG5cdFx0XHRcdC8vIEFja25vd2xlZGdlIG1lc3NhZ2UgaWYgY29uZmlndXJlZFxuXHRcdFx0XHRpZiAoY29uZmlnLmFjayAhPT0gZmFsc2UpIHtcblx0XHRcdFx0XHRhd2FpdCBtZXNzYWdlLmFjaygpO1xuXHRcdFx0XHRcdGN0eC5sb2dnZXIubG9nKGBNZXNzYWdlIGFja25vd2xlZGdlZDogJHtpZH1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlO1xuXG5cdFx0XHRcdC8vIFNldCBzcGFuIGVycm9yXG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic3VjY2Vzc1wiLCBmYWxzZSk7XG5cdFx0XHRcdHNwYW4ucmVjb3JkRXhjZXB0aW9uKGVycm9yIGFzIEVycm9yKTtcblx0XHRcdFx0c3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUiwgbWVzc2FnZTogZXJyb3JNZXNzYWdlIH0pO1xuXG5cdFx0XHRcdC8vIFJlY29yZCBlcnJvciBtZXRyaWNzXG5cdFx0XHRcdHB1YnN1YkVycm9ycy5hZGQoMSwge1xuXHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0dG9waWM6IGNvbmZpZy50b3BpYyxcblx0XHRcdFx0XHRzdWJzY3JpcHRpb246IGNvbmZpZy5zdWJzY3JpcHRpb24gPz8gXCI8YXV0bz5cIixcblx0XHRcdFx0XHRwcm92aWRlcjogY29uZmlnLnByb3ZpZGVyID8/IFwiPGRlZmF1bHQ+XCIsXG5cdFx0XHRcdFx0d29ya2Zsb3dfbmFtZTogdGhpcy5jb25maWd1cmF0aW9uPy5uYW1lIHx8IFwidW5rbm93blwiLFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgbWVzc2FnZSAke2lkfTogJHtlcnJvck1lc3NhZ2V9YCwgKGVycm9yIGFzIEVycm9yKS5zdGFjayk7XG5cblx0XHRcdFx0Ly8gTmFjayBtZXNzYWdlXG5cdFx0XHRcdGlmIChjb25maWcuYWNrICE9PSBmYWxzZSkge1xuXHRcdFx0XHRcdGF3YWl0IG1lc3NhZ2UubmFjaygpO1xuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgTWVzc2FnZSBuYWNrZWQ6ICR7aWR9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdHNwYW4uZW5kKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHViU3ViVHJpZ2dlcjtcbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@blokjs/trigger-pubsub",
3
- "version": "0.6.18",
3
+ "version": "0.6.20",
4
+ "files": ["dist"],
4
5
  "description": "Pub/Sub trigger for Blok workflows — supports NATS (Core + JetStream), Redis Streams, Kafka, GCP Pub/Sub, AWS SNS+SQS, and Azure Service Bus.",
5
6
  "type": "module",
6
7
  "main": "dist/index.js",
@@ -14,9 +15,9 @@
14
15
  "author": "Deskree Technologies Inc.",
15
16
  "license": "Apache-2.0",
16
17
  "dependencies": {
17
- "@blokjs/helper": "^0.6.18",
18
- "@blokjs/runner": "^0.6.18",
19
- "@blokjs/shared": "^0.6.18",
18
+ "@blokjs/helper": "^0.6.20",
19
+ "@blokjs/runner": "^0.6.20",
20
+ "@blokjs/shared": "^0.6.20",
20
21
  "@opentelemetry/api": "^1.9.0",
21
22
  "uuid": "^11.1.0"
22
23
  },
package/CHANGELOG.md DELETED
@@ -1,22 +0,0 @@
1
- # @blokjs/trigger-pubsub
2
-
3
- ## 0.2.0
4
-
5
- ### Minor Changes
6
-
7
- - Initial public release of Blok packages.
8
-
9
- This release includes:
10
-
11
- - Core packages: @blokjs/shared, @blokjs/helper, @blokjs/runner
12
- - Node packages: @blokjs/api-call, @blokjs/if-else, @blokjs/react
13
- - Trigger packages: pubsub, queue, webhook, websocket, worker, cron, grpc
14
- - CLI tool: blokctl
15
- - Editor support: @blokjs/lsp-server, @blokjs/syntax
16
-
17
- ### Patch Changes
18
-
19
- - Updated dependencies
20
- - @blokjs/shared@0.2.0
21
- - @blokjs/helper@0.2.0
22
- - @blokjs/runner@0.2.0
@@ -1,235 +0,0 @@
1
- import type { PubSubMessage } from "@blokjs/runner";
2
- import { afterAll, afterEach, beforeAll, describe, expect, it } from "vitest";
3
- import { GCPPubSubAdapter } from "../../src/adapters/GCPPubSubAdapter";
4
-
5
- /**
6
- * Real-GCP-emulator integration test for `GCPPubSubAdapter` (closes
7
- * Phase 2.1 broker-adapter test debt deferred from PR #91).
8
- *
9
- * Gated on `BLOK_INTEGRATION_GCP_PUBSUB_ENDPOINT`. Skipped when unset.
10
- *
11
- * Bring up the emulator via:
12
- * docker compose -f infra/testing/docker-compose.yml up -d pubsub-emulator
13
- *
14
- * Then run:
15
- * BLOK_INTEGRATION_GCP_PUBSUB_ENDPOINT=localhost:8086 \
16
- * PUBSUB_EMULATOR_HOST=localhost:8086 \
17
- * PUBSUB_PROJECT_ID=blok-test \
18
- * bun run test
19
- *
20
- * Note: the GCP SDK's `PubSub` client only routes to the emulator when
21
- * `PUBSUB_EMULATOR_HOST` is set BEFORE import. We set it in beforeAll
22
- * to keep developers from having to remember the dance.
23
- */
24
-
25
- const GCP_PUBSUB_ENDPOINT = process.env.BLOK_INTEGRATION_GCP_PUBSUB_ENDPOINT;
26
- const d = GCP_PUBSUB_ENDPOINT ? describe : describe.skip;
27
-
28
- const TEST_TIMEOUT_MS = 30_000;
29
- const TEST_PROJECT = "blok-test";
30
-
31
- /**
32
- * Narrow shape for the bits of `@google-cloud/pubsub` we drive directly
33
- * from this test (topic + subscription creation). Keeps us off `any`
34
- * per the repo's no-`any`-in-tests rule.
35
- */
36
- interface GcpTopic {
37
- createSubscription(name: string): Promise<unknown>;
38
- delete(): Promise<unknown>;
39
- get(opts?: { autoCreate?: boolean }): Promise<unknown>;
40
- }
41
-
42
- interface GcpSubscription {
43
- delete(): Promise<unknown>;
44
- }
45
-
46
- interface GcpPubSubClient {
47
- topic(name: string): GcpTopic;
48
- subscription(name: string): GcpSubscription;
49
- createTopic(name: string): Promise<[GcpTopic, unknown]>;
50
- close(): Promise<void>;
51
- }
52
-
53
- interface GcpPubSubModule {
54
- PubSub: new (opts: { projectId: string }) => GcpPubSubClient;
55
- }
56
-
57
- d("GCPPubSubAdapter — real GCP Pub/Sub emulator", () => {
58
- let adapter: GCPPubSubAdapter;
59
- let testClient: GcpPubSubClient | null = null;
60
- const createdTopics: string[] = [];
61
- const createdSubscriptions: string[] = [];
62
-
63
- beforeAll(async () => {
64
- // Both the SDK and the adapter look at PUBSUB_EMULATOR_HOST — set
65
- // it BEFORE importing to make sure the gRPC client routes to the
66
- // emulator instead of trying production endpoints (and waiting
67
- // for credentials we don't have).
68
- process.env.PUBSUB_EMULATOR_HOST = GCP_PUBSUB_ENDPOINT;
69
- process.env.PUBSUB_PROJECT_ID = TEST_PROJECT;
70
- process.env.GOOGLE_CLOUD_PROJECT = TEST_PROJECT;
71
-
72
- adapter = new GCPPubSubAdapter({ projectId: TEST_PROJECT });
73
- await adapter.connect();
74
-
75
- // Direct SDK client used only to create / tear down topics +
76
- // subscriptions. The adapter doesn't expose these (production
77
- // users provision them ahead of time via Terraform / gcloud).
78
- const sdk = (await import("@google-cloud/pubsub")) as unknown as GcpPubSubModule;
79
- testClient = new sdk.PubSub({ projectId: TEST_PROJECT });
80
- }, TEST_TIMEOUT_MS);
81
-
82
- async function createTopicAndSub(topicName: string, subscriptionName: string): Promise<void> {
83
- if (!testClient) throw new Error("test client not initialised — beforeAll didn't run");
84
- const [topic] = await testClient.createTopic(topicName);
85
- createdTopics.push(topicName);
86
- await topic.createSubscription(subscriptionName);
87
- createdSubscriptions.push(subscriptionName);
88
- }
89
-
90
- afterEach(async () => {
91
- // Tear down per-test resources so a flaky test doesn't poison
92
- // the next one with stale messages or shared subscriptions.
93
- for (const name of createdSubscriptions.splice(0)) {
94
- try {
95
- await testClient?.subscription(name).delete();
96
- } catch {
97
- /* ignore — best-effort */
98
- }
99
- }
100
- for (const name of createdTopics.splice(0)) {
101
- try {
102
- await testClient?.topic(name).delete();
103
- } catch {
104
- /* ignore */
105
- }
106
- }
107
- });
108
-
109
- afterAll(async () => {
110
- await adapter.disconnect();
111
- try {
112
- await testClient?.close();
113
- } catch {
114
- /* ignore */
115
- }
116
- });
117
-
118
- it(
119
- "publishes a message and the subscriber receives it",
120
- async () => {
121
- const topic = `blok-test-gcp-publish-${Math.random().toString(36).slice(2)}`;
122
- const subscription = `${topic}-sub`;
123
- await createTopicAndSub(topic, subscription);
124
-
125
- const received: PubSubMessage[] = [];
126
- await adapter.subscribe({ topic, subscription, durable: true }, async (msg) => {
127
- received.push(msg);
128
- await msg.ack();
129
- });
130
-
131
- // Pub/Sub subscriptions can take a moment to register the
132
- // streaming pull connection. Give it a short warm-up so the
133
- // first publish lands after the subscriber is actively pulling.
134
- await new Promise((r) => setTimeout(r, 500));
135
-
136
- await adapter.publish(topic, { hello: "gcp", n: 1 });
137
-
138
- await waitFor(() => received.length === 1, TEST_TIMEOUT_MS - 5_000);
139
-
140
- expect(received[0].body).toEqual({ hello: "gcp", n: 1 });
141
- expect(received[0].topic).toBe(topic);
142
- expect(received[0].subscription).toBe(subscription);
143
-
144
- await adapter.unsubscribe(subscription);
145
- },
146
- TEST_TIMEOUT_MS,
147
- );
148
-
149
- it(
150
- "delivers multiple messages to a single subscriber in publish order",
151
- async () => {
152
- const topic = `blok-test-gcp-order-${Math.random().toString(36).slice(2)}`;
153
- const subscription = `${topic}-sub`;
154
- await createTopicAndSub(topic, subscription);
155
-
156
- const received: number[] = [];
157
- await adapter.subscribe({ topic, subscription, durable: true }, async (msg) => {
158
- const body = msg.body as { n: number };
159
- received.push(body.n);
160
- await msg.ack();
161
- });
162
- await new Promise((r) => setTimeout(r, 500));
163
-
164
- for (let i = 0; i < 5; i++) {
165
- await adapter.publish(topic, { n: i });
166
- }
167
-
168
- await waitFor(() => received.length === 5, TEST_TIMEOUT_MS - 5_000);
169
-
170
- // GCP Pub/Sub doesn't guarantee order across a topic without
171
- // `messageOrdering: true` + an `orderingKey`. Assert the set
172
- // of values, not the sequence.
173
- const seen = new Set(received);
174
- expect(seen.size).toBe(5);
175
- for (let i = 0; i < 5; i++) {
176
- expect(seen.has(i)).toBe(true);
177
- }
178
-
179
- await adapter.unsubscribe(subscription);
180
- },
181
- TEST_TIMEOUT_MS,
182
- );
183
-
184
- it(
185
- "isolates subscriptions across topics",
186
- async () => {
187
- const topicA = `blok-test-gcp-iso-a-${Math.random().toString(36).slice(2)}`;
188
- const topicB = `blok-test-gcp-iso-b-${Math.random().toString(36).slice(2)}`;
189
- const subA = `${topicA}-sub`;
190
- const subB = `${topicB}-sub`;
191
- await createTopicAndSub(topicA, subA);
192
- await createTopicAndSub(topicB, subB);
193
-
194
- const receivedA: PubSubMessage[] = [];
195
- const receivedB: PubSubMessage[] = [];
196
-
197
- await adapter.subscribe({ topic: topicA, subscription: subA, durable: true }, async (msg) => {
198
- receivedA.push(msg);
199
- await msg.ack();
200
- });
201
- await adapter.subscribe({ topic: topicB, subscription: subB, durable: true }, async (msg) => {
202
- receivedB.push(msg);
203
- await msg.ack();
204
- });
205
- await new Promise((r) => setTimeout(r, 500));
206
-
207
- await adapter.publish(topicA, { from: "A" });
208
- await adapter.publish(topicB, { from: "B" });
209
-
210
- await waitFor(() => receivedA.length === 1 && receivedB.length === 1, TEST_TIMEOUT_MS - 5_000);
211
-
212
- expect(receivedA[0].body).toEqual({ from: "A" });
213
- expect(receivedB[0].body).toEqual({ from: "B" });
214
-
215
- await adapter.unsubscribe(subA);
216
- await adapter.unsubscribe(subB);
217
- },
218
- TEST_TIMEOUT_MS,
219
- );
220
-
221
- it("isConnected + healthCheck reflect the live state", async () => {
222
- expect(adapter.isConnected()).toBe(true);
223
- const healthy = await adapter.healthCheck();
224
- expect(healthy).toBe(true);
225
- });
226
- });
227
-
228
- async function waitFor(predicate: () => boolean, timeoutMs: number): Promise<void> {
229
- const start = Date.now();
230
- while (Date.now() - start < timeoutMs) {
231
- if (predicate()) return;
232
- await new Promise((r) => setTimeout(r, 100));
233
- }
234
- throw new Error(`waitFor timed out after ${timeoutMs}ms`);
235
- }