@dbx-tools/appkit-model-gateway 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.
@@ -4,7 +4,7 @@
4
4
  * @module
5
5
  */
6
6
  import { getExecutionContext } from "@databricks/appkit";
7
- import { metadata, modelCatalog, policy, resolve as modelResolve } from "@dbx-tools/model";
7
+ import { metadata, modelCatalog, policy, resolve as modelResolve, } from "@dbx-tools/model";
8
8
  import { log } from "@dbx-tools/shared-core";
9
9
  import { ModelClass, } from "@dbx-tools/shared-model/contracts";
10
10
  const DEFAULT_CACHE_TTL_MS = 60_000;
@@ -13,17 +13,16 @@ const logger = log.logger("appkit/model-gateway/registry");
13
13
  export class DatabricksModelRegistry {
14
14
  ttlMs;
15
15
  overrides;
16
+ client;
16
17
  constructor(options = {}) {
17
18
  this.ttlMs = positiveTtl(options.ttlMs);
18
19
  this.overrides = options.overrides ?? [];
20
+ this.client = options.client;
19
21
  }
20
22
  async list() {
21
- const context = await registryContext();
23
+ const context = await this.context();
22
24
  logger.debug("loading catalogue", { host: context.host, ttlMs: this.ttlMs });
23
- const endpoints = await modelCatalog.listServingEndpoints(context.client, context.host, {
24
- cacheIdentity: context.identity,
25
- ttlMs: this.ttlMs,
26
- });
25
+ const endpoints = await modelCatalog.listServingEndpoints(context.client, context.host, catalogueOptions(context, this.ttlMs));
27
26
  const targets = endpoints.map((endpoint) => this.target(endpoint));
28
27
  logger.debug("loaded catalogue", {
29
28
  endpointCount: endpoints.length,
@@ -74,13 +73,12 @@ export class DatabricksModelRegistry {
74
73
  .filter((target, index, all) => all.findIndex((candidate) => candidate.id === target.id) === index);
75
74
  }
76
75
  async refresh() {
77
- const context = await registryContext();
76
+ const context = await this.context();
78
77
  logger.debug("clearing catalogue", { host: context.host });
79
- await modelCatalog.clearServingEndpointsCache(context.host, context.identity);
80
- await modelCatalog.listServingEndpoints(context.client, context.host, {
81
- cacheIdentity: context.identity,
82
- ttlMs: this.ttlMs,
83
- });
78
+ if (context.identity) {
79
+ await modelCatalog.clearServingEndpointsCache(context.host, context.identity);
80
+ }
81
+ await modelCatalog.listServingEndpoints(context.client, context.host, catalogueOptions(context, this.ttlMs));
84
82
  logger.debug("refreshed catalogue", { host: context.host });
85
83
  }
86
84
  target(endpoint) {
@@ -124,6 +122,19 @@ export class DatabricksModelRegistry {
124
122
  reasoningEfforts: endpoint.reasoningEfforts ?? [],
125
123
  };
126
124
  }
125
+ async context() {
126
+ if (this.client) {
127
+ const host = (await this.client.config.getHost()).toString();
128
+ return { client: this.client, host };
129
+ }
130
+ return registryContext();
131
+ }
132
+ }
133
+ function catalogueOptions(context, ttlMs) {
134
+ return {
135
+ ttlMs,
136
+ ...(context.identity ? { cacheIdentity: context.identity } : {}),
137
+ };
127
138
  }
128
139
  async function registryContext() {
129
140
  const context = getExecutionContext();
@@ -164,4 +175,4 @@ function matchesResolveOptions(target, options) {
164
175
  return target.capabilities.chat;
165
176
  return true;
166
177
  }
167
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsVUFBVSxHQUdYLE1BQU0sbUNBQW1DLENBQUM7QUFPM0MsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFDcEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0FBeUIzRCxvRUFBb0U7QUFDcEUsTUFBTSxPQUFPLHVCQUF1QjtJQUNqQixLQUFLLENBQVM7SUFDZCxTQUFTLENBQXFDO0lBRS9ELFlBQVksVUFBZ0MsRUFBRTtRQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixNQUFNLE9BQU8sR0FBRyxNQUFNLGVBQWUsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0UsTUFBTSxTQUFTLEdBQUcsTUFBTSxZQUFZLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsSUFB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bnQiOlsiLyoqXG4gKiBSZXF1ZXN0LXNjb3BlZCBEYXRhYnJpY2tzIG1vZGVsIGRpc2NvdmVyeSBmb3IgdGhlIEFwcEtpdCBnYXRld2F5LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0LCB0eXBlIFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IG1ldGFkYXRhLCBtb2RlbENhdGFsb2csIHBvbGljeSwgcmVzb2x2ZSBhcyBtb2RlbFJlc29sdmUgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MsXG4gIHR5cGUgUmVzb2x2ZU1vZGVsSW5wdXQsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuaW1wb3J0IHR5cGUge1xuICBNb2RlbENhcGFiaWxpdGllcyxcbiAgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGUsXG4gIE1vZGVsVGFyZ2V0LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuXG5jb25zdCBERUZBVUxUX0NBQ0hFX1RUTF9NUyA9IDYwXzAwMDtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheS9yZWdpc3RyeVwiKTtcblxuLyoqIFJlc29sdXRpb24gY29udHJvbHMgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG1vZGVsIHBvbGljeSBvd25lci4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucyA9IFBpY2s8UmVzb2x2ZU1vZGVsSW5wdXQsIFwibW9kZWxDbGFzc1wiIHwgXCJyZXF1aXJlc1Rvb2xzXCI+O1xuXG4vKiogRHluYW1pYyBtb2RlbCBjYXRhbG9ndWUgdXNlZCBieSByZXF1ZXN0IHJvdXRpbmcgYW5kIG1vZGVsLWxpc3QgcmVzcG9uc2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJlZ2lzdHJ5IHtcbiAgbGlzdCgpOiBQcm9taXNlPE1vZGVsVGFyZ2V0W10+O1xuICBzZWFyY2gocXVlcnk6IHN0cmluZyk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT47XG4gIHJlc29sdmUobW9kZWw6IHN0cmluZywgb3B0aW9ucz86IE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucyk6IFByb21pc2U8TW9kZWxUYXJnZXQgfCB1bmRlZmluZWQ+O1xuICByZWZyZXNoKCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciB7QGxpbmsgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnl9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHR0bE1zPzogbnVtYmVyO1xuICByZWFkb25seSBvdmVycmlkZXM/OiByZWFkb25seSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVtdO1xufVxuXG5pbnRlcmZhY2UgUmVnaXN0cnlDb250ZXh0IHtcbiAgcmVhZG9ubHkgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgaWRlbnRpdHk6IHN0cmluZztcbn1cblxuLyoqIE1vZGVsIHJlZ2lzdHJ5IGJhY2tlZCBieSB0aGUgYWN0aXZlIEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSBpbXBsZW1lbnRzIE1vZGVsUmVnaXN0cnkge1xuICBwcml2YXRlIHJlYWRvbmx5IHR0bE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3ZlcnJpZGVzOiByZWFkb25seSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVtdO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1vZGVsUmVnaXN0cnlPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLnR0bE1zID0gcG9zaXRpdmVUdGwob3B0aW9ucy50dGxNcyk7XG4gICAgdGhpcy5vdmVycmlkZXMgPSBvcHRpb25zLm92ZXJyaWRlcyA/PyBbXTtcbiAgfVxuXG4gIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxNb2RlbFRhcmdldFtdPiB7XG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHJlZ2lzdHJ5Q29udGV4dCgpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxvYWRpbmcgY2F0YWxvZ3VlXCIsIHsgaG9zdDogY29udGV4dC5ob3N0LCB0dGxNczogdGhpcy50dGxNcyB9KTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBtb2RlbENhdGFsb2cubGlzdFNlcnZpbmdFbmRwb2ludHMoY29udGV4dC5jbGllbnQsIGNvbnRleHQuaG9zdCwge1xuICAgICAgY2FjaGVJZGVudGl0eTogY29udGV4dC5pZGVudGl0eSxcbiAgICAgIHR0bE1zOiB0aGlzLnR0bE1zLFxuICAgIH0pO1xuICAgIGNvbnN0IHRhcmdldHMgPSBlbmRwb2ludHMubWFwKChlbmRwb2ludCkgPT4gdGhpcy50YXJnZXQoZW5kcG9pbnQpKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsb2FkZWQgY2F0YWxvZ3VlXCIsIHtcbiAgICAgIGVuZHBvaW50Q291bnQ6IGVuZHBvaW50cy5sZW5ndGgsXG4gICAgICBob3N0OiBjb250ZXh0Lmhvc3QsXG4gICAgICB0YXJnZXRDb3VudDogdGFyZ2V0cy5sZW5ndGgsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldHM7XG4gIH1cblxuICBhc3luYyByZXNvbHZlKFxuICAgIG1vZGVsOiBzdHJpbmcsXG4gICAgb3B0aW9uczogTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8TW9kZWxUYXJnZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSB1bnF1YWxpZmllZE1vZGVsKG1vZGVsKTtcbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgY29uc3QgZXhhY3QgPSB0YXJnZXRzLmZpbmQoKHRhcmdldCkgPT5cbiAgICAgIHRhcmdldC5hbGlhc2VzLnNvbWUoXG4gICAgICAgIChhbGlhcykgPT4gYWxpYXMubG9jYWxlQ29tcGFyZShyZXF1ZXN0ZWQsIHVuZGVmaW5lZCwgeyBzZW5zaXRpdml0eTogXCJhY2NlbnRcIiB9KSA9PT0gMCxcbiAgICAgICksXG4gICAgKTtcbiAgICBpZiAoZXhhY3QgJiYgbWF0Y2hlc1Jlc29sdmVPcHRpb25zKGV4YWN0LCBvcHRpb25zKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2ZWQgZXhhY3QgbW9kZWxcIiwgeyByZXF1ZXN0ZWQsIHJlc29sdmVkOiBleGFjdC5pZCB9KTtcbiAgICAgIHJldHVybiBleGFjdDtcbiAgICB9XG5cbiAgICBjb25zdCBlbmRwb2ludHMgPSB0YXJnZXRzXG4gICAgICAubWFwKCh0YXJnZXQpID0+IHRhcmdldC5lbmRwb2ludClcbiAgICAgIC5maWx0ZXIoKGVuZHBvaW50KTogZW5kcG9pbnQgaXMgU2VydmluZ0VuZHBvaW50U3VtbWFyeSA9PiBlbmRwb2ludCAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCByZXNvbHZlZCA9IG1vZGVsUmVzb2x2ZS5yZXNvbHZlTW9kZWwoZW5kcG9pbnRzLCB7XG4gICAgICBleHBsaWNpdDogcmVxdWVzdGVkLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSByZXNvbHZlZC5tb2RlbElkKTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBmdXp6eSBtb2RlbFwiLCB7XG4gICAgICByZXF1ZXN0ZWQsXG4gICAgICByZXNvbHZlZDogdGFyZ2V0Py5pZCxcbiAgICAgIHNvdXJjZTogcmVzb2x2ZWQuc291cmNlLFxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICBhc3luYyBzZWFyY2gocXVlcnk6IHN0cmluZyk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT4ge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBieUlkID0gbmV3IE1hcCh0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiBbdGFyZ2V0LmlkLCB0YXJnZXRdKSk7XG4gICAgY29uc3QgZW5kcG9pbnRzID0gdGFyZ2V0c1xuICAgICAgLm1hcCgodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQpXG4gICAgICAuZmlsdGVyKChlbmRwb2ludCk6IGVuZHBvaW50IGlzIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPT4gZW5kcG9pbnQgIT09IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcmFua2VkID0gW1xuICAgICAgLi4ubW9kZWxSZXNvbHZlLmxvb2t1cE1vZGVscyhlbmRwb2ludHMsIHsgc2VhcmNoOiBxdWVyeSB9KSxcbiAgICAgIC4uLm1vZGVsUmVzb2x2ZS5sb29rdXBNb2RlbHMoZW5kcG9pbnRzLCB7XG4gICAgICAgIHNlYXJjaDogcXVlcnksXG4gICAgICAgIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nLFxuICAgICAgfSksXG4gICAgXS5zb3J0KChsZWZ0LCByaWdodCkgPT4gKGxlZnQuc2NvcmUgPz8gMCkgLSAocmlnaHQuc2NvcmUgPz8gMCkpO1xuICAgIHJldHVybiByYW5rZWRcbiAgICAgIC5tYXAoKHsgZW5kcG9pbnQgfSkgPT4gYnlJZC5nZXQoZW5kcG9pbnQubmFtZSkpXG4gICAgICAuZmlsdGVyKCh0YXJnZXQpOiB0YXJnZXQgaXMgTW9kZWxUYXJnZXQgPT4gdGFyZ2V0ICE9PSB1bmRlZmluZWQpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAodGFyZ2V0LCBpbmRleCwgYWxsKSA9PiBhbGwuZmluZEluZGV4KChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gdGFyZ2V0LmlkKSA9PT0gaW5kZXgsXG4gICAgICApO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgcmVnaXN0cnlDb250ZXh0KCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY2xlYXJpbmcgY2F0YWxvZ3VlXCIsIHsgaG9zdDogY29udGV4dC5ob3N0IH0pO1xuICAgIGF3YWl0IG1vZGVsQ2F0YWxvZy5jbGVhclNlcnZpbmdFbmRwb2ludHNDYWNoZShjb250ZXh0Lmhvc3QsIGNvbnRleHQuaWRlbnRpdHkpO1xuICAgIGF3YWl0IG1vZGVsQ2F0YWxvZy5saXN0U2VydmluZ0VuZHBvaW50cyhjb250ZXh0LmNsaWVudCwgY29udGV4dC5ob3N0LCB7XG4gICAgICBjYWNoZUlkZW50aXR5OiBjb250ZXh0LmlkZW50aXR5LFxuICAgICAgdHRsTXM6IHRoaXMudHRsTXMsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVmcmVzaGVkIGNhdGFsb2d1ZVwiLCB7IGhvc3Q6IGNvbnRleHQuaG9zdCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdGFyZ2V0KGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogTW9kZWxUYXJnZXQge1xuICAgIGNvbnN0IHB1Ymxpc2hlZCA9IG1ldGFkYXRhLm1vZGVsQ2FwYWJpbGl0aWVzRm9yKGVuZHBvaW50KTtcbiAgICBjb25zdCBmYW1pbHkgPSBlbmRwb2ludC5mYW1pbHk/LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3Qgb3BlbkFpRmFtaWx5ID0gZmFtaWx5ID09PSBcImdwdFwiIHx8IGZhbWlseSA9PT0gXCJvcGVuYWlcIiB8fCBlbmRwb2ludC5uYW1lLmluY2x1ZGVzKFwiY29kZXhcIik7XG4gICAgY29uc3QgbW9kZWxTZXJ2aWNlTmFtZSA9IG5vcm1hbGl6ZWRNb2RlbFNlcnZpY2VOYW1lKGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUpO1xuICAgIGNvbnN0IGVtYmVkZGluZ3MgPVxuICAgICAgZW5kcG9pbnQuY2xhc3MgPT09IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIHx8IGVuZHBvaW50LnRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcIjtcbiAgICBjb25zdCBjYXBhYmlsaXRpZXM6IE1vZGVsQ2FwYWJpbGl0aWVzID0ge1xuICAgICAgcmVzcG9uc2VzOiAhZW1iZWRkaW5ncyAmJiAob3BlbkFpRmFtaWx5IHx8IHB1Ymxpc2hlZC5yZXNwb25zZXMpLFxuICAgICAgb3BlblJlc3BvbnNlczogIWVtYmVkZGluZ3MgJiYgIW9wZW5BaUZhbWlseSxcbiAgICAgIGNoYXQ6ICFlbWJlZGRpbmdzLFxuICAgICAgYW50aHJvcGljOiBmYW1pbHkgPT09IFwiY2xhdWRlXCIsXG4gICAgICBlbWJlZGRpbmdzLFxuICAgICAgYWlHYXRld2F5Q29kZXg6XG4gICAgICAgICFlbWJlZGRpbmdzICYmIEJvb2xlYW4obW9kZWxTZXJ2aWNlTmFtZSkgJiYgZmFtaWx5ICE9PSBcImNsYXVkZVwiICYmIGZhbWlseSAhPT0gXCJnZW1pbmlcIixcbiAgICAgIHRvb2xzOiBlbmRwb2ludC5zdXBwb3J0c1Rvb2xzID09PSB0cnVlLFxuICAgICAgcmVhc29uaW5nOiBwb2xpY3kubW9kZWxSZWFzb25pbmdFZmZvcnRzKGVuZHBvaW50Lm5hbWUpLmxlbmd0aCA+IDAsXG4gICAgICBzdHJlYW1pbmc6IHRydWUsXG4gICAgICBwYXJhbGxlbFRvb2xzOiBlbmRwb2ludC5zdXBwb3J0c1Rvb2xzID09PSB0cnVlLFxuICAgICAgY3VzdG9tVG9vbHM6IHB1Ymxpc2hlZC5hcHBseVBhdGNoIHx8IGVuZHBvaW50Lm5hbWUuaW5jbHVkZXMoXCJjb2RleFwiKSxcbiAgICAgIHN0cnVjdHVyZWRPdXRwdXQ6IHRydWUsXG4gICAgICB3ZWJTZWFyY2g6IHB1Ymxpc2hlZC53ZWJTZWFyY2gsXG4gICAgfTtcbiAgICBjb25zdCBhbGlhc2VzID0gbmV3IFNldChcbiAgICAgIFtcbiAgICAgICAgZW5kcG9pbnQubmFtZSxcbiAgICAgICAgZW5kcG9pbnQuZGlzcGxheU5hbWUsXG4gICAgICAgIGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUsXG4gICAgICAgIG1vZGVsU2VydmljZU5hbWUsXG4gICAgICAgIC4uLk9iamVjdC52YWx1ZXMoZW5kcG9pbnQuc2VydmljZU5hbWVzID8/IHt9KSxcbiAgICAgIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlPy50cmltKCkpKSxcbiAgICApO1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5vdmVycmlkZXMuZmluZChcbiAgICAgIChjYW5kaWRhdGUpID0+XG4gICAgICAgIGNhbmRpZGF0ZS5tb2RlbCA9PT0gZW5kcG9pbnQubmFtZSB8fFxuICAgICAgICBbLi4uYWxpYXNlc10uc29tZSgoYWxpYXMpID0+IGFsaWFzID09PSBjYW5kaWRhdGUubW9kZWwpLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBlbmRwb2ludC5uYW1lLFxuICAgICAgYWxpYXNlczogWy4uLmFsaWFzZXNdLFxuICAgICAgZGlzcGxheU5hbWU6IGVuZHBvaW50LmRpc3BsYXlOYW1lID8/IGVuZHBvaW50Lm5hbWUsXG4gICAgICAuLi4oZW5kcG9pbnQuZmFtaWx5ID8geyBmYW1pbHk6IGVuZHBvaW50LmZhbWlseSB9IDoge30pLFxuICAgICAgLi4uKG1vZGVsU2VydmljZU5hbWUgPyB7IG1vZGVsU2VydmljZU5hbWUgfSA6IHt9KSxcbiAgICAgIGVuZHBvaW50LFxuICAgICAgY2FwYWJpbGl0aWVzOiB7IC4uLmNhcGFiaWxpdGllcywgLi4ub3ZlcnJpZGU/LmNhcGFiaWxpdGllcyB9LFxuICAgICAgcmVhc29uaW5nRWZmb3J0czogZW5kcG9pbnQucmVhc29uaW5nRWZmb3J0cyA/PyBbXSxcbiAgICB9O1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZ2lzdHJ5Q29udGV4dCgpOiBQcm9taXNlPFJlZ2lzdHJ5Q29udGV4dD4ge1xuICBjb25zdCBjb250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIHJldHVybiB7XG4gICAgY2xpZW50OiBjb250ZXh0LmNsaWVudCxcbiAgICBob3N0LFxuICAgIGlkZW50aXR5OiBcInVzZXJJZFwiIGluIGNvbnRleHQgPyBjb250ZXh0LnVzZXJJZCA6IGNvbnRleHQuc2VydmljZVVzZXJJZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5xdWFsaWZpZWRNb2RlbChtb2RlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG1vZGVsLnRyaW0oKS5yZXBsYWNlKC9eKD86ZGJ4fGRhdGFicmlja3MpXFwvL2ksIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBwb3NpdGl2ZVR0bCh2YWx1ZSA9IERFRkFVTFRfQ0FDSEVfVFRMX01TKTogbnVtYmVyIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNb2RlbCByZWdpc3RyeSB0dGxNcyBtdXN0IGJlIGEgcG9zaXRpdmUgZmluaXRlIG51bWJlclwiKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRNb2RlbFNlcnZpY2VOYW1lKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBub3JtYWxpemVkID0gdmFsdWU/LnRyaW0oKS5yZXBsYWNlKC9eZGF0YWJyaWNrc1xcLy8sIFwiXCIpO1xuICBpZiAoIW5vcm1hbGl6ZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJzeXN0ZW0uYWkuZGF0YWJyaWNrcy1cIikpIHtcbiAgICByZXR1cm4gYHN5c3RlbS5haS4ke25vcm1hbGl6ZWQuc2xpY2UoXCJzeXN0ZW0uYWkuZGF0YWJyaWNrcy1cIi5sZW5ndGgpfWA7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWQuc3RhcnRzV2l0aChcImRhdGFicmlja3MtXCIpKSB7XG4gICAgcmV0dXJuIGBzeXN0ZW0uYWkuJHtub3JtYWxpemVkLnNsaWNlKFwiZGF0YWJyaWNrcy1cIi5sZW5ndGgpfWA7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXNSZXNvbHZlT3B0aW9ucyh0YXJnZXQ6IE1vZGVsVGFyZ2V0LCBvcHRpb25zOiBNb2RlbFJlZ2lzdHJ5UmVzb2x2ZU9wdGlvbnMpOiBib29sZWFuIHtcbiAgaWYgKG9wdGlvbnMucmVxdWlyZXNUb29scyAmJiAhdGFyZ2V0LmNhcGFiaWxpdGllcy50b29scykgcmV0dXJuIGZhbHNlO1xuICBpZiAob3B0aW9ucy5tb2RlbENsYXNzID09PSBNb2RlbENsYXNzLkVtYmVkZGluZykgcmV0dXJuIHRhcmdldC5jYXBhYmlsaXRpZXMuZW1iZWRkaW5ncztcbiAgaWYgKG9wdGlvbnMubW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGFyZ2V0LmNhcGFiaWxpdGllcy5jaGF0O1xuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFDWixNQUFNLEVBQ04sT0FBTyxJQUFJLFlBQVksR0FFeEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsR0FHWCxNQUFNLG1DQUFtQyxDQUFDO0FBTzNDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBQ3BDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQTJCM0Qsb0VBQW9FO0FBQ3BFLE1BQU0sT0FBTyx1QkFBdUI7SUFDakIsS0FBSyxDQUFTO0lBQ2QsU0FBUyxDQUFxQztJQUM5QyxNQUFNLENBQThCO0lBRXJELFlBQVksVUFBZ0MsRUFBRTtRQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDL0IsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3RSxN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QkFBdUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQ3pFLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUN6QyxPQUFPLGFBQWEsVUFBVSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsTUFBbUIsRUFBRSxPQUFvQztJQUN0RixJQUFJLE9BQU8sQ0FBQyxhQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0RSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLFNBQVM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO0lBQ3ZGLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUN0RSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlcXVlc3Qtc2NvcGVkIERhdGFicmlja3MgbW9kZWwgZGlzY292ZXJ5IGZvciB0aGUgQXBwS2l0IGdhdGV3YXkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQsIHR5cGUgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgbWV0YWRhdGEsXG4gIG1vZGVsQ2F0YWxvZyxcbiAgcG9saWN5LFxuICByZXNvbHZlIGFzIG1vZGVsUmVzb2x2ZSxcbiAgdHlwZSBMaXN0U2VydmluZ0VuZHBvaW50c09wdGlvbnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgTW9kZWxDbGFzcyxcbiAgdHlwZSBSZXNvbHZlTW9kZWxJbnB1dCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsQ2FwYWJpbGl0aWVzLFxuICBNb2RlbENhcGFiaWxpdHlPdmVycmlkZSxcbiAgTW9kZWxUYXJnZXQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmNvbnN0IERFRkFVTFRfQ0FDSEVfVFRMX01TID0gNjBfMDAwO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdC9tb2RlbC1nYXRld2F5L3JlZ2lzdHJ5XCIpO1xuXG4vKiogUmVzb2x1dGlvbiBjb250cm9scyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbW9kZWwgcG9saWN5IG93bmVyLiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zID0gUGljazxSZXNvbHZlTW9kZWxJbnB1dCwgXCJtb2RlbENsYXNzXCIgfCBcInJlcXVpcmVzVG9vbHNcIj47XG5cbi8qKiBEeW5hbWljIG1vZGVsIGNhdGFsb2d1ZSB1c2VkIGJ5IHJlcXVlc3Qgcm91dGluZyBhbmQgbW9kZWwtbGlzdCByZXNwb25zZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUmVnaXN0cnkge1xuICBsaXN0KCk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT47XG4gIHNlYXJjaChxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxNb2RlbFRhcmdldFtdPjtcbiAgcmVzb2x2ZShtb2RlbDogc3RyaW5nLCBvcHRpb25zPzogTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zKTogUHJvbWlzZTxNb2RlbFRhcmdldCB8IHVuZGVmaW5lZD47XG4gIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIHtAbGluayBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeX0uICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUmVnaXN0cnlPcHRpb25zIHtcbiAgcmVhZG9ubHkgdHRsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IHJlYWRvbmx5IE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlW107XG4gIC8qKiBEaXNjb3ZlciBtb2RlbHMgd2l0aCB0aGlzIGNsaWVudCBpbnN0ZWFkIG9mIHRoZSBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQuICovXG4gIHJlYWRvbmx5IGNsaWVudD86IFdvcmtzcGFjZUNsaWVudDtcbn1cblxuaW50ZXJmYWNlIFJlZ2lzdHJ5Q29udGV4dCB7XG4gIHJlYWRvbmx5IGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICByZWFkb25seSBob3N0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlkZW50aXR5Pzogc3RyaW5nO1xufVxuXG4vKiogTW9kZWwgcmVnaXN0cnkgYmFja2VkIGJ5IHRoZSBhY3RpdmUgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiAqL1xuZXhwb3J0IGNsYXNzIERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5IGltcGxlbWVudHMgTW9kZWxSZWdpc3RyeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHRsTXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBvdmVycmlkZXM6IHJlYWRvbmx5IE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTW9kZWxSZWdpc3RyeU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMudHRsTXMgPSBwb3NpdGl2ZVR0bChvcHRpb25zLnR0bE1zKTtcbiAgICB0aGlzLm92ZXJyaWRlcyA9IG9wdGlvbnMub3ZlcnJpZGVzID8/IFtdO1xuICAgIHRoaXMuY2xpZW50ID0gb3B0aW9ucy5jbGllbnQ7XG4gIH1cblxuICBhc3luYyBsaXN0KCk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmNvbnRleHQoKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsb2FkaW5nIGNhdGFsb2d1ZVwiLCB7IGhvc3Q6IGNvbnRleHQuaG9zdCwgdHRsTXM6IHRoaXMudHRsTXMgfSk7XG4gICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbW9kZWxDYXRhbG9nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKFxuICAgICAgY29udGV4dC5jbGllbnQsXG4gICAgICBjb250ZXh0Lmhvc3QsXG4gICAgICBjYXRhbG9ndWVPcHRpb25zKGNvbnRleHQsIHRoaXMudHRsTXMpLFxuICAgICk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGVuZHBvaW50cy5tYXAoKGVuZHBvaW50KSA9PiB0aGlzLnRhcmdldChlbmRwb2ludCkpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxvYWRlZCBjYXRhbG9ndWVcIiwge1xuICAgICAgZW5kcG9pbnRDb3VudDogZW5kcG9pbnRzLmxlbmd0aCxcbiAgICAgIGhvc3Q6IGNvbnRleHQuaG9zdCxcbiAgICAgIHRhcmdldENvdW50OiB0YXJnZXRzLmxlbmd0aCxcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0cztcbiAgfVxuXG4gIGFzeW5jIHJlc29sdmUoXG4gICAgbW9kZWw6IHN0cmluZyxcbiAgICBvcHRpb25zOiBNb2RlbFJlZ2lzdHJ5UmVzb2x2ZU9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxNb2RlbFRhcmdldCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHJlcXVlc3RlZCA9IHVucXVhbGlmaWVkTW9kZWwobW9kZWwpO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBleGFjdCA9IHRhcmdldHMuZmluZCgodGFyZ2V0KSA9PlxuICAgICAgdGFyZ2V0LmFsaWFzZXMuc29tZShcbiAgICAgICAgKGFsaWFzKSA9PiBhbGlhcy5sb2NhbGVDb21wYXJlKHJlcXVlc3RlZCwgdW5kZWZpbmVkLCB7IHNlbnNpdGl2aXR5OiBcImFjY2VudFwiIH0pID09PSAwLFxuICAgICAgKSxcbiAgICApO1xuICAgIGlmIChleGFjdCAmJiBtYXRjaGVzUmVzb2x2ZU9wdGlvbnMoZXhhY3QsIG9wdGlvbnMpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBleGFjdCBtb2RlbFwiLCB7IHJlcXVlc3RlZCwgcmVzb2x2ZWQ6IGV4YWN0LmlkIH0pO1xuICAgICAgcmV0dXJuIGV4YWN0O1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50cyA9IHRhcmdldHNcbiAgICAgIC5tYXAoKHRhcmdldCkgPT4gdGFyZ2V0LmVuZHBvaW50KVxuICAgICAgLmZpbHRlcigoZW5kcG9pbnQpOiBlbmRwb2ludCBpcyBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5ID0+IGVuZHBvaW50ICE9PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IHJlc29sdmVkID0gbW9kZWxSZXNvbHZlLnJlc29sdmVNb2RlbChlbmRwb2ludHMsIHtcbiAgICAgIGV4cGxpY2l0OiByZXF1ZXN0ZWQsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICAgIGNvbnN0IHRhcmdldCA9IHRhcmdldHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IHJlc29sdmVkLm1vZGVsSWQpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlc29sdmVkIGZ1enp5IG1vZGVsXCIsIHtcbiAgICAgIHJlcXVlc3RlZCxcbiAgICAgIHJlc29sdmVkOiB0YXJnZXQ/LmlkLFxuICAgICAgc291cmNlOiByZXNvbHZlZC5zb3VyY2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIGFzeW5jIHNlYXJjaChxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxNb2RlbFRhcmdldFtdPiB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IGJ5SWQgPSBuZXcgTWFwKHRhcmdldHMubWFwKCh0YXJnZXQpID0+IFt0YXJnZXQuaWQsIHRhcmdldF0pKTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSB0YXJnZXRzXG4gICAgICAubWFwKCh0YXJnZXQpID0+IHRhcmdldC5lbmRwb2ludClcbiAgICAgIC5maWx0ZXIoKGVuZHBvaW50KTogZW5kcG9pbnQgaXMgU2VydmluZ0VuZHBvaW50U3VtbWFyeSA9PiBlbmRwb2ludCAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCByYW5rZWQgPSBbXG4gICAgICAuLi5tb2RlbFJlc29sdmUubG9va3VwTW9kZWxzKGVuZHBvaW50cywgeyBzZWFyY2g6IHF1ZXJ5IH0pLFxuICAgICAgLi4ubW9kZWxSZXNvbHZlLmxvb2t1cE1vZGVscyhlbmRwb2ludHMsIHtcbiAgICAgICAgc2VhcmNoOiBxdWVyeSxcbiAgICAgICAgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcsXG4gICAgICB9KSxcbiAgICBdLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiAobGVmdC5zY29yZSA/PyAwKSAtIChyaWdodC5zY29yZSA/PyAwKSk7XG4gICAgcmV0dXJuIHJhbmtlZFxuICAgICAgLm1hcCgoeyBlbmRwb2ludCB9KSA9PiBieUlkLmdldChlbmRwb2ludC5uYW1lKSlcbiAgICAgIC5maWx0ZXIoKHRhcmdldCk6IHRhcmdldCBpcyBNb2RlbFRhcmdldCA9PiB0YXJnZXQgIT09IHVuZGVmaW5lZClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgICh0YXJnZXQsIGluZGV4LCBhbGwpID0+IGFsbC5maW5kSW5kZXgoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSB0YXJnZXQuaWQpID09PSBpbmRleCxcbiAgICAgICk7XG4gIH1cblxuICBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmNvbnRleHQoKTtcbiAgICBsb2dnZXIuZGVidWcoXCJjbGVhcmluZyBjYXRhbG9ndWVcIiwgeyBob3N0OiBjb250ZXh0Lmhvc3QgfSk7XG4gICAgaWYgKGNvbnRleHQuaWRlbnRpdHkpIHtcbiAgICAgIGF3YWl0IG1vZGVsQ2F0YWxvZy5jbGVhclNlcnZpbmdFbmRwb2ludHNDYWNoZShjb250ZXh0Lmhvc3QsIGNvbnRleHQuaWRlbnRpdHkpO1xuICAgIH1cbiAgICBhd2FpdCBtb2RlbENhdGFsb2cubGlzdFNlcnZpbmdFbmRwb2ludHMoXG4gICAgICBjb250ZXh0LmNsaWVudCxcbiAgICAgIGNvbnRleHQuaG9zdCxcbiAgICAgIGNhdGFsb2d1ZU9wdGlvbnMoY29udGV4dCwgdGhpcy50dGxNcyksXG4gICAgKTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZWZyZXNoZWQgY2F0YWxvZ3VlXCIsIHsgaG9zdDogY29udGV4dC5ob3N0IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0YXJnZXQoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbFRhcmdldCB7XG4gICAgY29uc3QgcHVibGlzaGVkID0gbWV0YWRhdGEubW9kZWxDYXBhYmlsaXRpZXNGb3IoZW5kcG9pbnQpO1xuICAgIGNvbnN0IGZhbWlseSA9IGVuZHBvaW50LmZhbWlseT8udG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBvcGVuQWlGYW1pbHkgPSBmYW1pbHkgPT09IFwiZ3B0XCIgfHwgZmFtaWx5ID09PSBcIm9wZW5haVwiIHx8IGVuZHBvaW50Lm5hbWUuaW5jbHVkZXMoXCJjb2RleFwiKTtcbiAgICBjb25zdCBtb2RlbFNlcnZpY2VOYW1lID0gbm9ybWFsaXplZE1vZGVsU2VydmljZU5hbWUoZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZSk7XG4gICAgY29uc3QgZW1iZWRkaW5ncyA9XG4gICAgICBlbmRwb2ludC5jbGFzcyA9PT0gTW9kZWxDbGFzcy5FbWJlZGRpbmcgfHwgZW5kcG9pbnQudGFzayA9PT0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiO1xuICAgIGNvbnN0IGNhcGFiaWxpdGllczogTW9kZWxDYXBhYmlsaXRpZXMgPSB7XG4gICAgICByZXNwb25zZXM6ICFlbWJlZGRpbmdzICYmIChvcGVuQWlGYW1pbHkgfHwgcHVibGlzaGVkLnJlc3BvbnNlcyksXG4gICAgICBvcGVuUmVzcG9uc2VzOiAhZW1iZWRkaW5ncyAmJiAhb3BlbkFpRmFtaWx5LFxuICAgICAgY2hhdDogIWVtYmVkZGluZ3MsXG4gICAgICBhbnRocm9waWM6IGZhbWlseSA9PT0gXCJjbGF1ZGVcIixcbiAgICAgIGVtYmVkZGluZ3MsXG4gICAgICBhaUdhdGV3YXlDb2RleDpcbiAgICAgICAgIWVtYmVkZGluZ3MgJiYgQm9vbGVhbihtb2RlbFNlcnZpY2VOYW1lKSAmJiBmYW1pbHkgIT09IFwiY2xhdWRlXCIgJiYgZmFtaWx5ICE9PSBcImdlbWluaVwiLFxuICAgICAgdG9vbHM6IGVuZHBvaW50LnN1cHBvcnRzVG9vbHMgPT09IHRydWUsXG4gICAgICByZWFzb25pbmc6IHBvbGljeS5tb2RlbFJlYXNvbmluZ0VmZm9ydHMoZW5kcG9pbnQubmFtZSkubGVuZ3RoID4gMCxcbiAgICAgIHN0cmVhbWluZzogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsVG9vbHM6IGVuZHBvaW50LnN1cHBvcnRzVG9vbHMgPT09IHRydWUsXG4gICAgICBjdXN0b21Ub29sczogcHVibGlzaGVkLmFwcGx5UGF0Y2ggfHwgZW5kcG9pbnQubmFtZS5pbmNsdWRlcyhcImNvZGV4XCIpLFxuICAgICAgc3RydWN0dXJlZE91dHB1dDogdHJ1ZSxcbiAgICAgIHdlYlNlYXJjaDogcHVibGlzaGVkLndlYlNlYXJjaCxcbiAgICB9O1xuICAgIGNvbnN0IGFsaWFzZXMgPSBuZXcgU2V0KFxuICAgICAgW1xuICAgICAgICBlbmRwb2ludC5uYW1lLFxuICAgICAgICBlbmRwb2ludC5kaXNwbGF5TmFtZSxcbiAgICAgICAgZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZSxcbiAgICAgICAgbW9kZWxTZXJ2aWNlTmFtZSxcbiAgICAgICAgLi4uT2JqZWN0LnZhbHVlcyhlbmRwb2ludC5zZXJ2aWNlTmFtZXMgPz8ge30pLFxuICAgICAgXS5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odmFsdWU/LnRyaW0oKSkpLFxuICAgICk7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSB0aGlzLm92ZXJyaWRlcy5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgY2FuZGlkYXRlLm1vZGVsID09PSBlbmRwb2ludC5uYW1lIHx8XG4gICAgICAgIFsuLi5hbGlhc2VzXS5zb21lKChhbGlhcykgPT4gYWxpYXMgPT09IGNhbmRpZGF0ZS5tb2RlbCksXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGVuZHBvaW50Lm5hbWUsXG4gICAgICBhbGlhc2VzOiBbLi4uYWxpYXNlc10sXG4gICAgICBkaXNwbGF5TmFtZTogZW5kcG9pbnQuZGlzcGxheU5hbWUgPz8gZW5kcG9pbnQubmFtZSxcbiAgICAgIC4uLihlbmRwb2ludC5mYW1pbHkgPyB7IGZhbWlseTogZW5kcG9pbnQuZmFtaWx5IH0gOiB7fSksXG4gICAgICAuLi4obW9kZWxTZXJ2aWNlTmFtZSA/IHsgbW9kZWxTZXJ2aWNlTmFtZSB9IDoge30pLFxuICAgICAgZW5kcG9pbnQsXG4gICAgICBjYXBhYmlsaXRpZXM6IHsgLi4uY2FwYWJpbGl0aWVzLCAuLi5vdmVycmlkZT8uY2FwYWJpbGl0aWVzIH0sXG4gICAgICByZWFzb25pbmdFZmZvcnRzOiBlbmRwb2ludC5yZWFzb25pbmdFZmZvcnRzID8/IFtdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbnRleHQoKTogUHJvbWlzZTxSZWdpc3RyeUNvbnRleHQ+IHtcbiAgICBpZiAodGhpcy5jbGllbnQpIHtcbiAgICAgIGNvbnN0IGhvc3QgPSAoYXdhaXQgdGhpcy5jbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiB7IGNsaWVudDogdGhpcy5jbGllbnQsIGhvc3QgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJ5Q29udGV4dCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhdGFsb2d1ZU9wdGlvbnMoY29udGV4dDogUmVnaXN0cnlDb250ZXh0LCB0dGxNczogbnVtYmVyKTogTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICB0dGxNcyxcbiAgICAuLi4oY29udGV4dC5pZGVudGl0eSA/IHsgY2FjaGVJZGVudGl0eTogY29udGV4dC5pZGVudGl0eSB9IDoge30pLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWdpc3RyeUNvbnRleHQoKTogUHJvbWlzZTxSZWdpc3RyeUNvbnRleHQ+IHtcbiAgY29uc3QgY29udGV4dCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICByZXR1cm4ge1xuICAgIGNsaWVudDogY29udGV4dC5jbGllbnQsXG4gICAgaG9zdCxcbiAgICBpZGVudGl0eTogXCJ1c2VySWRcIiBpbiBjb250ZXh0ID8gY29udGV4dC51c2VySWQgOiBjb250ZXh0LnNlcnZpY2VVc2VySWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVucXVhbGlmaWVkTW9kZWwobW9kZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBtb2RlbC50cmltKCkucmVwbGFjZSgvXig/OmRieHxkYXRhYnJpY2tzKVxcLy9pLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpdmVUdGwodmFsdWUgPSBERUZBVUxUX0NBQ0hFX1RUTF9NUyk6IG51bWJlciB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTW9kZWwgcmVnaXN0cnkgdHRsTXMgbXVzdCBiZSBhIHBvc2l0aXZlIGZpbml0ZSBudW1iZXJcIik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVkTW9kZWxTZXJ2aWNlTmFtZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHZhbHVlPy50cmltKCkucmVwbGFjZSgvXmRhdGFicmlja3NcXC8vLCBcIlwiKTtcbiAgaWYgKCFub3JtYWxpemVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKFwic3lzdGVtLmFpLmRhdGFicmlja3MtXCIpKSB7XG4gICAgcmV0dXJuIGBzeXN0ZW0uYWkuJHtub3JtYWxpemVkLnNsaWNlKFwic3lzdGVtLmFpLmRhdGFicmlja3MtXCIubGVuZ3RoKX1gO1xuICB9XG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJkYXRhYnJpY2tzLVwiKSkge1xuICAgIHJldHVybiBgc3lzdGVtLmFpLiR7bm9ybWFsaXplZC5zbGljZShcImRhdGFicmlja3MtXCIubGVuZ3RoKX1gO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVzUmVzb2x2ZU9wdGlvbnModGFyZ2V0OiBNb2RlbFRhcmdldCwgb3B0aW9uczogTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zKTogYm9vbGVhbiB7XG4gIGlmIChvcHRpb25zLnJlcXVpcmVzVG9vbHMgJiYgIXRhcmdldC5jYXBhYmlsaXRpZXMudG9vbHMpIHJldHVybiBmYWxzZTtcbiAgaWYgKG9wdGlvbnMubW9kZWxDbGFzcyA9PT0gTW9kZWxDbGFzcy5FbWJlZGRpbmcpIHJldHVybiB0YXJnZXQuY2FwYWJpbGl0aWVzLmVtYmVkZGluZ3M7XG4gIGlmIChvcHRpb25zLm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRhcmdldC5jYXBhYmlsaXRpZXMuY2hhdDtcbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
package/lib/src/router.js CHANGED
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * @module
5
5
  */
6
+ import { object } from "@dbx-tools/shared-core";
6
7
  /** Error returned when preserving a requested protocol feature is impossible. */
7
8
  export class UnsupportedGatewayFeatureError extends Error {
8
9
  features;
@@ -25,17 +26,14 @@ export function resolveRoute(input) {
25
26
  if (clientProtocol === "openai-responses") {
26
27
  rejectStatefulResponses(features);
27
28
  if (isCodexOriginator(input.originator) &&
28
- targetsModelService(requestedModel, target) &&
29
- target.capabilities.aiGatewayCodex &&
30
- supportsDirectResponses(target, features)) {
29
+ canUseAiGatewayCodex(target, features) &&
30
+ !requestedServingEndpoint(requestedModel, target)) {
31
31
  return directRoute(input, "databricks-ai-gateway-codex", target.modelServiceName);
32
32
  }
33
33
  if (target.capabilities.responses && supportsDirectResponses(target, features)) {
34
34
  return directRoute(input, "databricks-responses", target.id);
35
35
  }
36
- if (target.capabilities.aiGatewayCodex &&
37
- target.modelServiceName &&
38
- supportsDirectResponses(target, features)) {
36
+ if (canUseAiGatewayCodex(target, features)) {
39
37
  return directRoute(input, "databricks-ai-gateway-codex", target.modelServiceName);
40
38
  }
41
39
  if (target.capabilities.openResponses && supportsOpenResponses(target, features)) {
@@ -58,16 +56,16 @@ export function resolveRoute(input) {
58
56
  export function requestedFeatures(body) {
59
57
  const tools = Array.isArray(body.tools) ? body.tools : [];
60
58
  const toolTypes = tools
61
- .filter((tool) => isRecord(tool))
59
+ .filter((tool) => object.isRecord(tool))
62
60
  .map((tool) => tool.type);
63
- const text = isRecord(body.text) ? body.text : {};
64
- const format = isRecord(text.format) ? text.format.type : text.format;
61
+ const text = object.isRecord(body.text) ? body.text : {};
62
+ const format = object.isRecord(text.format) ? text.format.type : text.format;
65
63
  return {
66
64
  background: body.background === true,
67
65
  customTools: toolTypes.some((type) => type === "custom"),
68
66
  parallelTools: body.parallel_tool_calls === true,
69
67
  previousResponse: typeof body.previous_response_id === "string" && body.previous_response_id.length > 0,
70
- reasoning: isRecord(body.reasoning) || body.reasoning_effort !== undefined,
68
+ reasoning: object.isRecord(body.reasoning) || body.reasoning_effort !== undefined,
71
69
  storage: body.store === true,
72
70
  structuredOutput: format !== undefined && format !== "text",
73
71
  tools: tools.length > 0,
@@ -127,13 +125,12 @@ function rejectStatefulResponses(features) {
127
125
  if (unsupported.length > 0)
128
126
  throw new UnsupportedGatewayFeatureError(unsupported);
129
127
  }
130
- function targetsModelService(requestedModel, target) {
131
- if (!target.modelServiceName)
132
- return false;
133
- const unqualified = requestedModel.trim().replace(/^(?:dbx|databricks)\//i, "");
134
- return unqualified === target.modelServiceName;
128
+ function canUseAiGatewayCodex(target, features) {
129
+ return (Boolean(target.capabilities.aiGatewayCodex && target.modelServiceName) &&
130
+ supportsDirectResponses(target, features));
135
131
  }
136
- function isRecord(value) {
137
- return value !== null && typeof value === "object" && !Array.isArray(value);
132
+ /** Serving-endpoint ids stay on Databricks Responses; aliases and model-service slugs use Codex. */
133
+ function requestedServingEndpoint(requestedModel, target) {
134
+ return requestedModel.trim().replace(/^(?:dbx|databricks)\//i, "") === target.id;
138
135
  }
139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBVUgsaUZBQWlGO0FBQ2pGLE1BQU0sT0FBTyw4QkFBK0IsU0FBUSxLQUFLO0lBR2xDO0lBRlosTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUV0QixZQUFxQixRQUEyQjtRQUM5QyxLQUFLLENBQUMsMERBQTBELFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRHBFLGFBQVEsR0FBUixRQUFRLENBQW1CO1FBRTlDLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0NBQWdDLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBRUQsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBd0I7SUFDbkQsTUFBTSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQztJQUNuRSxJQUFJLGNBQWMsS0FBSyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSw4QkFBOEIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUNELElBQUksY0FBYyxLQUFLLGtCQUFrQixFQUFFLENBQUM7UUFDMUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsSUFDRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ25DLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUM7WUFDM0MsTUFBTSxDQUFDLFlBQVksQ0FBQyxjQUFjO1lBQ2xDLHVCQUF1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LFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHVyZSBjYXBhYmlsaXR5LWRyaXZlbiByb3V0ZSBzZWxlY3Rpb24gZm9yIG1vZGVsLWdhdGV3YXkgcmVxdWVzdHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgR2F0ZXdheVJvdXRlLFxuICBNb2RlbFRhcmdldCxcbiAgUmVxdWVzdGVkRmVhdHVyZXMsXG4gIFJlc29sdmVSb3V0ZUlucHV0LFxuICBVcHN0cmVhbVByb3RvY29sLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuXG4vKiogRXJyb3IgcmV0dXJuZWQgd2hlbiBwcmVzZXJ2aW5nIGEgcmVxdWVzdGVkIHByb3RvY29sIGZlYXR1cmUgaXMgaW1wb3NzaWJsZS4gKi9cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1cyA9IDQwMDtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBmZWF0dXJlczogcmVhZG9ubHkgc3RyaW5nW10pIHtcbiAgICBzdXBlcihgVGhlIHNlbGVjdGVkIG1vZGVsIGNhbm5vdCBwcmVzZXJ2ZSByZXF1ZXN0ZWQgZmVhdHVyZXM6ICR7ZmVhdHVyZXMuam9pbihcIiwgXCIpfWApO1xuICAgIHRoaXMubmFtZSA9IFwiVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yXCI7XG4gIH1cbn1cblxuLyoqIFNlbGVjdCB0aGUgbG93ZXN0LW92ZXJoZWFkIHVwc3RyZWFtIHRoYXQgcHJlc2VydmVzIHRoZSBjbGllbnQgY29udHJhY3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJvdXRlKGlucHV0OiBSZXNvbHZlUm91dGVJbnB1dCk6IEdhdGV3YXlSb3V0ZSB7XG4gIGNvbnN0IHsgY2xpZW50UHJvdG9jb2wsIHJlcXVlc3RlZE1vZGVsLCBmZWF0dXJlcywgdGFyZ2V0IH0gPSBpbnB1dDtcbiAgaWYgKGNsaWVudFByb3RvY29sID09PSBcIm9wZW5haS1lbWJlZGRpbmdzXCIpIHtcbiAgICBpZiAoIXRhcmdldC5jYXBhYmlsaXRpZXMuZW1iZWRkaW5ncykge1xuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvcihbXCJlbWJlZGRpbmdzXCJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpcmVjdFJvdXRlKGlucHV0LCBcImRhdGFicmlja3MtZW1iZWRkaW5nc1wiLCB0YXJnZXQuaWQpO1xuICB9XG4gIGlmIChjbGllbnRQcm90b2NvbCA9PT0gXCJvcGVuYWktcmVzcG9uc2VzXCIpIHtcbiAgICByZWplY3RTdGF0ZWZ1bFJlc3BvbnNlcyhmZWF0dXJlcyk7XG4gICAgaWYgKFxuICAgICAgaXNDb2RleE9yaWdpbmF0b3IoaW5wdXQub3JpZ2luYXRvcikgJiZcbiAgICAgIHRhcmdldHNNb2RlbFNlcnZpY2UocmVxdWVzdGVkTW9kZWwsIHRhcmdldCkgJiZcbiAgICAgIHRhcmdldC5jYXBhYmlsaXRpZXMuYWlHYXRld2F5Q29kZXggJiZcbiAgICAgIHN1cHBvcnRzRGlyZWN0UmVzcG9uc2VzKHRhcmdldCwgZmVhdHVyZXMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1haS1nYXRld2F5LWNvZGV4XCIsIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lISk7XG4gICAgfVxuICAgIGlmICh0YXJnZXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyAmJiBzdXBwb3J0c0RpcmVjdFJlc3BvbnNlcyh0YXJnZXQsIGZlYXR1cmVzKSkge1xuICAgICAgcmV0dXJuIGRpcmVjdFJvdXRlKGlucHV0LCBcImRhdGFicmlja3MtcmVzcG9uc2VzXCIsIHRhcmdldC5pZCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRhcmdldC5jYXBhYmlsaXRpZXMuYWlHYXRld2F5Q29kZXggJiZcbiAgICAgIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lICYmXG4gICAgICBzdXBwb3J0c0RpcmVjdFJlc3BvbnNlcyh0YXJnZXQsIGZlYXR1cmVzKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRpcmVjdFJvdXRlKGlucHV0LCBcImRhdGFicmlja3MtYWktZ2F0ZXdheS1jb2RleFwiLCB0YXJnZXQubW9kZWxTZXJ2aWNlTmFtZSk7XG4gICAgfVxuICAgIGlmICh0YXJnZXQuY2FwYWJpbGl0aWVzLm9wZW5SZXNwb25zZXMgJiYgc3VwcG9ydHNPcGVuUmVzcG9uc2VzKHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1vcGVuLXJlc3BvbnNlc1wiLCB0YXJnZXQuaWQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNsYXRlZFJvdXRlKGlucHV0KTtcbiAgfVxuXG4gIGlmIChjbGllbnRQcm90b2NvbCA9PT0gXCJvcGVuYWktY2hhdFwiKSB7XG4gICAgaWYgKHRhcmdldC5jYXBhYmlsaXRpZXMuY2hhdCAmJiBzdXBwb3J0c1Rvb2xzKHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1jaGF0XCIsIHRhcmdldC5pZCk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2xhdGVkUm91dGUoaW5wdXQpO1xuICB9XG5cbiAgaWYgKHRhcmdldC5jYXBhYmlsaXRpZXMuYW50aHJvcGljICYmIHN1cHBvcnRzVG9vbHModGFyZ2V0LCBmZWF0dXJlcykpIHtcbiAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1hbnRocm9waWNcIiwgdGFyZ2V0LmlkKTtcbiAgfVxuICByZXR1cm4gdHJhbnNsYXRlZFJvdXRlKGlucHV0KTtcbn1cblxuLyoqIERldGVjdCByb3V0ZS1hZmZlY3RpbmcgZmVhdHVyZXMgZnJvbSBhbiBPcGVuQUkgb3IgQW50aHJvcGljIHJlcXVlc3QgYm9keS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0ZWRGZWF0dXJlcyhib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBSZXF1ZXN0ZWRGZWF0dXJlcyB7XG4gIGNvbnN0IHRvb2xzID0gQXJyYXkuaXNBcnJheShib2R5LnRvb2xzKSA/IGJvZHkudG9vbHMgOiBbXTtcbiAgY29uc3QgdG9vbFR5cGVzID0gdG9vbHNcbiAgICAuZmlsdGVyKCh0b29sKTogdG9vbCBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiBpc1JlY29yZCh0b29sKSlcbiAgICAubWFwKCh0b29sKSA9PiB0b29sLnR5cGUpO1xuICBjb25zdCB0ZXh0ID0gaXNSZWNvcmQoYm9keS50ZXh0KSA/IGJvZHkudGV4dCA6IHt9O1xuICBjb25zdCBmb3JtYXQgPSBpc1JlY29yZCh0ZXh0LmZvcm1hdCkgPyB0ZXh0LmZvcm1hdC50eXBlIDogdGV4dC5mb3JtYXQ7XG4gIHJldHVybiB7XG4gICAgYmFja2dyb3VuZDogYm9keS5iYWNrZ3JvdW5kID09PSB0cnVlLFxuICAgIGN1c3RvbVRvb2xzOiB0b29sVHlwZXMuc29tZSgodHlwZSkgPT4gdHlwZSA9PT0gXCJjdXN0b21cIiksXG4gICAgcGFyYWxsZWxUb29sczogYm9keS5wYXJhbGxlbF90b29sX2NhbGxzID09PSB0cnVlLFxuICAgIHByZXZpb3VzUmVzcG9uc2U6XG4gICAgICB0eXBlb2YgYm9keS5wcmV2aW91c19yZXNwb25zZV9pZCA9PT0gXCJzdHJpbmdcIiAmJiBib2R5LnByZXZpb3VzX3Jlc3BvbnNlX2lkLmxlbmd0aCA+IDAsXG4gICAgcmVhc29uaW5nOiBpc1JlY29yZChib2R5LnJlYXNvbmluZykgfHwgYm9keS5yZWFzb25pbmdfZWZmb3J0ICE9PSB1bmRlZmluZWQsXG4gICAgc3RvcmFnZTogYm9keS5zdG9yZSA9PT0gdHJ1ZSxcbiAgICBzdHJ1Y3R1cmVkT3V0cHV0OiBmb3JtYXQgIT09IHVuZGVmaW5lZCAmJiBmb3JtYXQgIT09IFwidGV4dFwiLFxuICAgIHRvb2xzOiB0b29scy5sZW5ndGggPiAwLFxuICAgIHVuc3VwcG9ydGVkT3BlblJlc3BvbnNlc1Rvb2xzOiB0b29sVHlwZXMuc29tZShcbiAgICAgICh0eXBlKSA9PiB0eXBlICE9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZSAhPT0gXCJ3ZWJfc2VhcmNoXCIgJiYgdHlwZSAhPT0gXCJ3ZWJfc2VhcmNoX3ByZXZpZXdcIixcbiAgICApLFxuICAgIHdlYlNlYXJjaDogdG9vbFR5cGVzLnNvbWUoKHR5cGUpID0+IHR5cGUgPT09IFwid2ViX3NlYXJjaFwiIHx8IHR5cGUgPT09IFwid2ViX3NlYXJjaF9wcmV2aWV3XCIpLFxuICB9O1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgYW4gT3JpZ2luYXRvciBoZWFkZXIgc2VsZWN0cyBDb2RleCBjb21wYXRpYmlsaXR5IGJlaGF2aW9yLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29kZXhPcmlnaW5hdG9yKG9yaWdpbmF0b3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3JpZ2luYXRvcj8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcImNvZGV4XCIpID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiBkaXJlY3RSb3V0ZShcbiAgaW5wdXQ6IFJlc29sdmVSb3V0ZUlucHV0LFxuICB1cHN0cmVhbVByb3RvY29sOiBFeGNsdWRlPFVwc3RyZWFtUHJvdG9jb2wsIFwiYWktc2RrXCI+LFxuICB1cHN0cmVhbU1vZGVsOiBzdHJpbmcsXG4pOiBHYXRld2F5Um91dGUge1xuICByZXR1cm4ge1xuICAgIGNsaWVudFByb3RvY29sOiBpbnB1dC5jbGllbnRQcm90b2NvbCxcbiAgICB1cHN0cmVhbVByb3RvY29sLFxuICAgIHRhcmdldDogaW5wdXQudGFyZ2V0LFxuICAgIHVwc3RyZWFtTW9kZWwsXG4gICAgdHJhbnNsYXRlUmVxdWVzdDogZmFsc2UsXG4gICAgdHJhbnNsYXRlUmVzcG9uc2U6IGZhbHNlLFxuICB9O1xufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVkUm91dGUoaW5wdXQ6IFJlc29sdmVSb3V0ZUlucHV0KTogR2F0ZXdheVJvdXRlIHtcbiAgcmV0dXJuIHtcbiAgICBjbGllbnRQcm90b2NvbDogaW5wdXQuY2xpZW50UHJvdG9jb2wsXG4gICAgdXBzdHJlYW1Qcm90b2NvbDogXCJhaS1zZGtcIixcbiAgICB0YXJnZXQ6IGlucHV0LnRhcmdldCxcbiAgICB1cHN0cmVhbU1vZGVsOiBpbnB1dC50YXJnZXQuaWQsXG4gICAgdHJhbnNsYXRlUmVxdWVzdDogdHJ1ZSxcbiAgICB0cmFuc2xhdGVSZXNwb25zZTogdHJ1ZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNEaXJlY3RSZXNwb25zZXModGFyZ2V0OiBNb2RlbFRhcmdldCwgZmVhdHVyZXM6IFJlcXVlc3RlZEZlYXR1cmVzKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgc3VwcG9ydHNUb29scyh0YXJnZXQsIGZlYXR1cmVzKSAmJlxuICAgICghZmVhdHVyZXMuY3VzdG9tVG9vbHMgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy5jdXN0b21Ub29scykgJiZcbiAgICAoIWZlYXR1cmVzLnN0cnVjdHVyZWRPdXRwdXQgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy5zdHJ1Y3R1cmVkT3V0cHV0KVxuICApO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c09wZW5SZXNwb25zZXModGFyZ2V0OiBNb2RlbFRhcmdldCwgZmVhdHVyZXM6IFJlcXVlc3RlZEZlYXR1cmVzKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgc3VwcG9ydHNUb29scyh0YXJnZXQsIGZlYXR1cmVzKSAmJlxuICAgICFmZWF0dXJlcy5jdXN0b21Ub29scyAmJlxuICAgICFmZWF0dXJlcy5wcmV2aW91c1Jlc3BvbnNlICYmXG4gICAgIWZlYXR1cmVzLnN0b3JhZ2UgJiZcbiAgICAhZmVhdHVyZXMuYmFja2dyb3VuZCAmJlxuICAgICFmZWF0dXJlcy51bnN1cHBvcnRlZE9wZW5SZXNwb25zZXNUb29scyAmJlxuICAgICghZmVhdHVyZXMud2ViU2VhcmNoIHx8IHRhcmdldC5jYXBhYmlsaXRpZXMud2ViU2VhcmNoKSAmJlxuICAgICghZmVhdHVyZXMuc3RydWN0dXJlZE91dHB1dCB8fCB0YXJnZXQuY2FwYWJpbGl0aWVzLnN0cnVjdHVyZWRPdXRwdXQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzVG9vbHModGFyZ2V0OiBNb2RlbFRhcmdldCwgZmVhdHVyZXM6IFJlcXVlc3RlZEZlYXR1cmVzKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgKCFmZWF0dXJlcy50b29scyB8fCB0YXJnZXQuY2FwYWJpbGl0aWVzLnRvb2xzKSAmJlxuICAgICghZmVhdHVyZXMucGFyYWxsZWxUb29scyB8fCB0YXJnZXQuY2FwYWJpbGl0aWVzLnBhcmFsbGVsVG9vbHMpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlamVjdFN0YXRlZnVsUmVzcG9uc2VzKGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcyk6IHZvaWQge1xuICBjb25zdCB1bnN1cHBvcnRlZCA9IFtcbiAgICAuLi4oZmVhdHVyZXMucHJldmlvdXNSZXNwb25zZSA/IFtcInByZXZpb3VzX3Jlc3BvbnNlX2lkXCJdIDogW10pLFxuICAgIC4uLihmZWF0dXJlcy5zdG9yYWdlID8gW1wic3RvcmVcIl0gOiBbXSksXG4gICAgLi4uKGZlYXR1cmVzLmJhY2tncm91bmQgPyBbXCJiYWNrZ3JvdW5kXCJdIDogW10pLFxuICBdO1xuICBpZiAodW5zdXBwb3J0ZWQubGVuZ3RoID4gMCkgdGhyb3cgbmV3IFVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvcih1bnN1cHBvcnRlZCk7XG59XG5cbmZ1bmN0aW9uIHRhcmdldHNNb2RlbFNlcnZpY2UocmVxdWVzdGVkTW9kZWw6IHN0cmluZywgdGFyZ2V0OiBNb2RlbFRhcmdldCk6IGJvb2xlYW4ge1xuICBpZiAoIXRhcmdldC5tb2RlbFNlcnZpY2VOYW1lKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHVucXVhbGlmaWVkID0gcmVxdWVzdGVkTW9kZWwudHJpbSgpLnJlcGxhY2UoL14oPzpkYnh8ZGF0YWJyaWNrcylcXC8vaSwgXCJcIik7XG4gIHJldHVybiB1bnF1YWxpZmllZCA9PT0gdGFyZ2V0Lm1vZGVsU2VydmljZU5hbWU7XG59XG5cbmZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbiJdfQ==
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBU2hELGlGQUFpRjtBQUNqRixNQUFNLE9BQU8sOEJBQStCLFNBQVEsS0FBSztJQUdsQztJQUZaLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFFdEIsWUFBcUIsUUFBMkI7UUFDOUMsS0FBSyxDQUFDLDBEQUEwRCxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQURwRSxhQUFRLEdBQVIsUUFBUSxDQUFtQjtRQUU5QyxJQUFJLENBQUMsSUFBSSxHQUFHLGdDQUFnQyxDQUFDO0lBQy9DLENBQUM7Q0FDRjtBQUVELDhFQUE4RTtBQUM5RSxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQXdCO0lBQ25ELE1BQU0sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDbkUsSUFBSSxjQUFjLEtBQUssbUJBQW1CLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksOEJBQThCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxPQUFPLFdBQVcsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxJQUFJLGNBQWMsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQ0UsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUNuQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFD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S0FBSyxNQUFNLENBQUMsRUFBRSxDQUFDO0FBQ25GLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFB1cmUgY2FwYWJpbGl0eS1kcml2ZW4gcm91dGUgc2VsZWN0aW9uIGZvciBtb2RlbC1nYXRld2F5IHJlcXVlc3RzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUge1xuICBHYXRld2F5Um91dGUsXG4gIE1vZGVsVGFyZ2V0LFxuICBSZXF1ZXN0ZWRGZWF0dXJlcyxcbiAgUmVzb2x2ZVJvdXRlSW5wdXQsXG4gIFVwc3RyZWFtUHJvdG9jb2wsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbi8qKiBFcnJvciByZXR1cm5lZCB3aGVuIHByZXNlcnZpbmcgYSByZXF1ZXN0ZWQgcHJvdG9jb2wgZmVhdHVyZSBpcyBpbXBvc3NpYmxlLiAqL1xuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgc3RhdHVzID0gNDAwO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGZlYXR1cmVzOiByZWFkb25seSBzdHJpbmdbXSkge1xuICAgIHN1cGVyKGBUaGUgc2VsZWN0ZWQgbW9kZWwgY2Fubm90IHByZXNlcnZlIHJlcXVlc3RlZCBmZWF0dXJlczogJHtmZWF0dXJlcy5qb2luKFwiLCBcIil9YCk7XG4gICAgdGhpcy5uYW1lID0gXCJVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3JcIjtcbiAgfVxufVxuXG4vKiogU2VsZWN0IHRoZSBsb3dlc3Qtb3ZlcmhlYWQgdXBzdHJlYW0gdGhhdCBwcmVzZXJ2ZXMgdGhlIGNsaWVudCBjb250cmFjdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUm91dGUoaW5wdXQ6IFJlc29sdmVSb3V0ZUlucHV0KTogR2F0ZXdheVJvdXRlIHtcbiAgY29uc3QgeyBjbGllbnRQcm90b2NvbCwgcmVxdWVzdGVkTW9kZWwsIGZlYXR1cmVzLCB0YXJnZXQgfSA9IGlucHV0O1xuICBpZiAoY2xpZW50UHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIikge1xuICAgIGlmICghdGFyZ2V0LmNhcGFiaWxpdGllcy5lbWJlZGRpbmdzKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yKFtcImVtYmVkZGluZ3NcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1lbWJlZGRpbmdzXCIsIHRhcmdldC5pZCk7XG4gIH1cbiAgaWYgKGNsaWVudFByb3RvY29sID09PSBcIm9wZW5haS1yZXNwb25zZXNcIikge1xuICAgIHJlamVjdFN0YXRlZnVsUmVzcG9uc2VzKGZlYXR1cmVzKTtcbiAgICBpZiAoXG4gICAgICBpc0NvZGV4T3JpZ2luYXRvcihpbnB1dC5vcmlnaW5hdG9yKSAmJlxuICAgICAgY2FuVXNlQWlHYXRld2F5Q29kZXgodGFyZ2V0LCBmZWF0dXJlcykgJiZcbiAgICAgICFyZXF1ZXN0ZWRTZXJ2aW5nRW5kcG9pbnQocmVxdWVzdGVkTW9kZWwsIHRhcmdldClcbiAgICApIHtcbiAgICAgIHJldHVybiBkaXJlY3RSb3V0ZShpbnB1dCwgXCJkYXRhYnJpY2tzLWFpLWdhdGV3YXktY29kZXhcIiwgdGFyZ2V0Lm1vZGVsU2VydmljZU5hbWUhKTtcbiAgICB9XG4gICAgaWYgKHRhcmdldC5jYXBhYmlsaXRpZXMucmVzcG9uc2VzICYmIHN1cHBvcnRzRGlyZWN0UmVzcG9uc2VzKHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1yZXNwb25zZXNcIiwgdGFyZ2V0LmlkKTtcbiAgICB9XG4gICAgaWYgKGNhblVzZUFpR2F0ZXdheUNvZGV4KHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1haS1nYXRld2F5LWNvZGV4XCIsIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lISk7XG4gICAgfVxuICAgIGlmICh0YXJnZXQuY2FwYWJpbGl0aWVzLm9wZW5SZXNwb25zZXMgJiYgc3VwcG9ydHNPcGVuUmVzcG9uc2VzKHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1vcGVuLXJlc3BvbnNlc1wiLCB0YXJnZXQuaWQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNsYXRlZFJvdXRlKGlucHV0KTtcbiAgfVxuXG4gIGlmIChjbGllbnRQcm90b2NvbCA9PT0gXCJvcGVuYWktY2hhdFwiKSB7XG4gICAgaWYgKHRhcmdldC5jYXBhYmlsaXRpZXMuY2hhdCAmJiBzdXBwb3J0c1Rvb2xzKHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1jaGF0XCIsIHRhcmdldC5pZCk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2xhdGVkUm91dGUoaW5wdXQpO1xuICB9XG5cbiAgaWYgKHRhcmdldC5jYXBhYmlsaXRpZXMuYW50aHJvcGljICYmIHN1cHBvcnRzVG9vbHModGFyZ2V0LCBmZWF0dXJlcykpIHtcbiAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1hbnRocm9waWNcIiwgdGFyZ2V0LmlkKTtcbiAgfVxuICByZXR1cm4gdHJhbnNsYXRlZFJvdXRlKGlucHV0KTtcbn1cblxuLyoqIERldGVjdCByb3V0ZS1hZmZlY3RpbmcgZmVhdHVyZXMgZnJvbSBhbiBPcGVuQUkgb3IgQW50aHJvcGljIHJlcXVlc3QgYm9keS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0ZWRGZWF0dXJlcyhib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBSZXF1ZXN0ZWRGZWF0dXJlcyB7XG4gIGNvbnN0IHRvb2xzID0gQXJyYXkuaXNBcnJheShib2R5LnRvb2xzKSA/IGJvZHkudG9vbHMgOiBbXTtcbiAgY29uc3QgdG9vbFR5cGVzID0gdG9vbHNcbiAgICAuZmlsdGVyKCh0b29sKTogdG9vbCBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiBvYmplY3QuaXNSZWNvcmQodG9vbCkpXG4gICAgLm1hcCgodG9vbCkgPT4gdG9vbC50eXBlKTtcbiAgY29uc3QgdGV4dCA9IG9iamVjdC5pc1JlY29yZChib2R5LnRleHQpID8gYm9keS50ZXh0IDoge307XG4gIGNvbnN0IGZvcm1hdCA9IG9iamVjdC5pc1JlY29yZCh0ZXh0LmZvcm1hdCkgPyB0ZXh0LmZvcm1hdC50eXBlIDogdGV4dC5mb3JtYXQ7XG4gIHJldHVybiB7XG4gICAgYmFja2dyb3VuZDogYm9keS5iYWNrZ3JvdW5kID09PSB0cnVlLFxuICAgIGN1c3RvbVRvb2xzOiB0b29sVHlwZXMuc29tZSgodHlwZSkgPT4gdHlwZSA9PT0gXCJjdXN0b21cIiksXG4gICAgcGFyYWxsZWxUb29sczogYm9keS5wYXJhbGxlbF90b29sX2NhbGxzID09PSB0cnVlLFxuICAgIHByZXZpb3VzUmVzcG9uc2U6XG4gICAgICB0eXBlb2YgYm9keS5wcmV2aW91c19yZXNwb25zZV9pZCA9PT0gXCJzdHJpbmdcIiAmJiBib2R5LnByZXZpb3VzX3Jlc3BvbnNlX2lkLmxlbmd0aCA+IDAsXG4gICAgcmVhc29uaW5nOiBvYmplY3QuaXNSZWNvcmQoYm9keS5yZWFzb25pbmcpIHx8IGJvZHkucmVhc29uaW5nX2VmZm9ydCAhPT0gdW5kZWZpbmVkLFxuICAgIHN0b3JhZ2U6IGJvZHkuc3RvcmUgPT09IHRydWUsXG4gICAgc3RydWN0dXJlZE91dHB1dDogZm9ybWF0ICE9PSB1bmRlZmluZWQgJiYgZm9ybWF0ICE9PSBcInRleHRcIixcbiAgICB0b29sczogdG9vbHMubGVuZ3RoID4gMCxcbiAgICB1bnN1cHBvcnRlZE9wZW5SZXNwb25zZXNUb29sczogdG9vbFR5cGVzLnNvbWUoXG4gICAgICAodHlwZSkgPT4gdHlwZSAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGUgIT09IFwid2ViX3NlYXJjaFwiICYmIHR5cGUgIT09IFwid2ViX3NlYXJjaF9wcmV2aWV3XCIsXG4gICAgKSxcbiAgICB3ZWJTZWFyY2g6IHRvb2xUeXBlcy5zb21lKCh0eXBlKSA9PiB0eXBlID09PSBcIndlYl9zZWFyY2hcIiB8fCB0eXBlID09PSBcIndlYl9zZWFyY2hfcHJldmlld1wiKSxcbiAgfTtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIGFuIE9yaWdpbmF0b3IgaGVhZGVyIHNlbGVjdHMgQ29kZXggY29tcGF0aWJpbGl0eSBiZWhhdmlvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvZGV4T3JpZ2luYXRvcihvcmlnaW5hdG9yOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9yaWdpbmF0b3I/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJjb2RleFwiKSA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZGlyZWN0Um91dGUoXG4gIGlucHV0OiBSZXNvbHZlUm91dGVJbnB1dCxcbiAgdXBzdHJlYW1Qcm90b2NvbDogRXhjbHVkZTxVcHN0cmVhbVByb3RvY29sLCBcImFpLXNka1wiPixcbiAgdXBzdHJlYW1Nb2RlbDogc3RyaW5nLFxuKTogR2F0ZXdheVJvdXRlIHtcbiAgcmV0dXJuIHtcbiAgICBjbGllbnRQcm90b2NvbDogaW5wdXQuY2xpZW50UHJvdG9jb2wsXG4gICAgdXBzdHJlYW1Qcm90b2NvbCxcbiAgICB0YXJnZXQ6IGlucHV0LnRhcmdldCxcbiAgICB1cHN0cmVhbU1vZGVsLFxuICAgIHRyYW5zbGF0ZVJlcXVlc3Q6IGZhbHNlLFxuICAgIHRyYW5zbGF0ZVJlc3BvbnNlOiBmYWxzZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlZFJvdXRlKGlucHV0OiBSZXNvbHZlUm91dGVJbnB1dCk6IEdhdGV3YXlSb3V0ZSB7XG4gIHJldHVybiB7XG4gICAgY2xpZW50UHJvdG9jb2w6IGlucHV0LmNsaWVudFByb3RvY29sLFxuICAgIHVwc3RyZWFtUHJvdG9jb2w6IFwiYWktc2RrXCIsXG4gICAgdGFyZ2V0OiBpbnB1dC50YXJnZXQsXG4gICAgdXBzdHJlYW1Nb2RlbDogaW5wdXQudGFyZ2V0LmlkLFxuICAgIHRyYW5zbGF0ZVJlcXVlc3Q6IHRydWUsXG4gICAgdHJhbnNsYXRlUmVzcG9uc2U6IHRydWUsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzRGlyZWN0UmVzcG9uc2VzKHRhcmdldDogTW9kZWxUYXJnZXQsIGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHN1cHBvcnRzVG9vbHModGFyZ2V0LCBmZWF0dXJlcykgJiZcbiAgICAoIWZlYXR1cmVzLmN1c3RvbVRvb2xzIHx8IHRhcmdldC5jYXBhYmlsaXRpZXMuY3VzdG9tVG9vbHMpICYmXG4gICAgKCFmZWF0dXJlcy5zdHJ1Y3R1cmVkT3V0cHV0IHx8IHRhcmdldC5jYXBhYmlsaXRpZXMuc3RydWN0dXJlZE91dHB1dClcbiAgKTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNPcGVuUmVzcG9uc2VzKHRhcmdldDogTW9kZWxUYXJnZXQsIGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHN1cHBvcnRzVG9vbHModGFyZ2V0LCBmZWF0dXJlcykgJiZcbiAgICAhZmVhdHVyZXMuY3VzdG9tVG9vbHMgJiZcbiAgICAhZmVhdHVyZXMucHJldmlvdXNSZXNwb25zZSAmJlxuICAgICFmZWF0dXJlcy5zdG9yYWdlICYmXG4gICAgIWZlYXR1cmVzLmJhY2tncm91bmQgJiZcbiAgICAhZmVhdHVyZXMudW5zdXBwb3J0ZWRPcGVuUmVzcG9uc2VzVG9vbHMgJiZcbiAgICAoIWZlYXR1cmVzLndlYlNlYXJjaCB8fCB0YXJnZXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCkgJiZcbiAgICAoIWZlYXR1cmVzLnN0cnVjdHVyZWRPdXRwdXQgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy5zdHJ1Y3R1cmVkT3V0cHV0KVxuICApO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c1Rvb2xzKHRhcmdldDogTW9kZWxUYXJnZXQsIGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgICghZmVhdHVyZXMudG9vbHMgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy50b29scykgJiZcbiAgICAoIWZlYXR1cmVzLnBhcmFsbGVsVG9vbHMgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy5wYXJhbGxlbFRvb2xzKVxuICApO1xufVxuXG5mdW5jdGlvbiByZWplY3RTdGF0ZWZ1bFJlc3BvbnNlcyhmZWF0dXJlczogUmVxdWVzdGVkRmVhdHVyZXMpOiB2b2lkIHtcbiAgY29uc3QgdW5zdXBwb3J0ZWQgPSBbXG4gICAgLi4uKGZlYXR1cmVzLnByZXZpb3VzUmVzcG9uc2UgPyBbXCJwcmV2aW91c19yZXNwb25zZV9pZFwiXSA6IFtdKSxcbiAgICAuLi4oZmVhdHVyZXMuc3RvcmFnZSA/IFtcInN0b3JlXCJdIDogW10pLFxuICAgIC4uLihmZWF0dXJlcy5iYWNrZ3JvdW5kID8gW1wiYmFja2dyb3VuZFwiXSA6IFtdKSxcbiAgXTtcbiAgaWYgKHVuc3VwcG9ydGVkLmxlbmd0aCA+IDApIHRocm93IG5ldyBVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3IodW5zdXBwb3J0ZWQpO1xufVxuXG5mdW5jdGlvbiBjYW5Vc2VBaUdhdGV3YXlDb2RleCh0YXJnZXQ6IE1vZGVsVGFyZ2V0LCBmZWF0dXJlczogUmVxdWVzdGVkRmVhdHVyZXMpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBCb29sZWFuKHRhcmdldC5jYXBhYmlsaXRpZXMuYWlHYXRld2F5Q29kZXggJiYgdGFyZ2V0Lm1vZGVsU2VydmljZU5hbWUpICYmXG4gICAgc3VwcG9ydHNEaXJlY3RSZXNwb25zZXModGFyZ2V0LCBmZWF0dXJlcylcbiAgKTtcbn1cblxuLyoqIFNlcnZpbmctZW5kcG9pbnQgaWRzIHN0YXkgb24gRGF0YWJyaWNrcyBSZXNwb25zZXM7IGFsaWFzZXMgYW5kIG1vZGVsLXNlcnZpY2Ugc2x1Z3MgdXNlIENvZGV4LiAqL1xuZnVuY3Rpb24gcmVxdWVzdGVkU2VydmluZ0VuZHBvaW50KHJlcXVlc3RlZE1vZGVsOiBzdHJpbmcsIHRhcmdldDogTW9kZWxUYXJnZXQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcXVlc3RlZE1vZGVsLnRyaW0oKS5yZXBsYWNlKC9eKD86ZGJ4fGRhdGFicmlja3MpXFwvL2ksIFwiXCIpID09PSB0YXJnZXQuaWQ7XG59XG4iXX0=
@@ -13,5 +13,7 @@ export interface DatabricksTransportRequest {
13
13
  }
14
14
  /** Execute a direct route with SDK-owned authentication and an unbuffered response body. */
15
15
  export declare function fetchDatabricks(request: DatabricksTransportRequest): Promise<Response>;
16
+ /** Remove client compatibility fields rejected by direct Databricks protocols. */
17
+ export declare function directDatabricksRequestBody(route: Pick<GatewayRoute, "upstreamProtocol" | "upstreamModel">, body: Readonly<Record<string, unknown>>): Record<string, unknown>;
16
18
  /** Copy only response headers that belong to the public model protocol. */
17
19
  export declare function gatewayResponseHeaders(upstream: Headers): Headers;
@@ -6,6 +6,7 @@
6
6
  import { getExecutionContext } from "@databricks/appkit";
7
7
  import { workspaceClient } from "@dbx-tools/databricks";
8
8
  import { log } from "@dbx-tools/shared-core";
9
+ import { openaiChat } from "@dbx-tools/shared-model";
9
10
  import { upstreamUrl } from "@dbx-tools/shared-model-gateway";
10
11
  const logger = log.logger("appkit/model-gateway/transport");
11
12
  const ERROR_PREVIEW_BYTES = 8 * 1024;
@@ -47,7 +48,7 @@ export async function fetchDatabricks(request) {
47
48
  await client.config.authenticate(headers);
48
49
  const url = upstreamUrl(host, request.route);
49
50
  const startedAt = Date.now();
50
- const body = JSON.stringify({ ...request.body, model: request.route.upstreamModel });
51
+ const body = JSON.stringify(directDatabricksRequestBody(request.route, request.body));
51
52
  logger.debug("sending upstream request", {
52
53
  model: request.route.upstreamModel,
53
54
  path: new URL(url).pathname,
@@ -104,6 +105,17 @@ export async function fetchDatabricks(request) {
104
105
  throw error;
105
106
  }
106
107
  }
108
+ /** Remove client compatibility fields rejected by direct Databricks protocols. */
109
+ export function directDatabricksRequestBody(route, body) {
110
+ const sanitized = { ...body, model: route.upstreamModel };
111
+ if (route.upstreamProtocol === "databricks-chat") {
112
+ openaiChat.stripUnsupportedChatFields(sanitized);
113
+ }
114
+ else {
115
+ delete sanitized.parallel_tool_calls;
116
+ }
117
+ return sanitized;
118
+ }
107
119
  /** Copy only response headers that belong to the public model protocol. */
108
120
  export function gatewayResponseHeaders(upstream) {
109
121
  const headers = new Headers();
@@ -146,4 +158,4 @@ async function logUpstreamFailureBody(response, details) {
146
158
  await reader.cancel().catch(() => undefined);
147
159
  }
148
160
  }
149
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFxQixNQUFNLGlDQUFpQyxDQUFDO0FBRWpGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztBQUM1RCxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFFckMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN0QyxpQkFBaUI7SUFDakIsZUFBZTtJQUNmLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsUUFBUTtJQUNSLE1BQU07SUFDTixxQkFBcUI7SUFDckIsbUJBQW1CO0lBQ25CLFdBQVc7Q0FDWixDQUFDLENBQUM7QUFFSCxNQUFNLHdCQUF3QixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3ZDLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLFlBQVk7SUFDWixJQUFJO0lBQ0osU0FBUztJQUNULG1CQUFtQjtJQUNuQixTQUFTO0NBQ1YsQ0FBQyxDQUFDO0FBVUgsNEZBQTRGO0FBQzVGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLE9BQW1DO0lBQ3ZFLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixFQUFFLENBQUMsTUFBTSxDQUFDO0lBQzVDLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDeEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3RDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3ZGLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUMsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUNyRixNQUFNLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFO1FBQ3ZDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWE7UUFDbEMsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVE7UUFDM0IsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUk7UUFDcEMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0I7S0FDakQsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDO1FBQ0gsSUFBSSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQzlCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTztZQUNQLElBQUk7WUFDSixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsSUFDRSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUc7WUFDdkIsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxvQ0FBb0MsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUNwRSxDQUFDO1lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsRUFBRTtnQkFDcEQsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYTtnQkFDbEMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0I7YUFDakQsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDaEMsT0FBTyxDQUFDLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDMUIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsT0FBTztnQkFDUCxJQUFJO2dCQUNKLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTthQUN2QixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUc7WUFDZCxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVM7WUFDakMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYTtZQUNsQyxTQUFTLEVBQ1AsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUM7WUFDekYsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3ZCLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO1NBQ2pELENBQUM7UUFDRixJQUFJLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNqRCxLQUFLLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFO1lBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUztZQUNqQyxLQUFLO1lBQ0wsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYTtZQUNsQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQjtTQUNqRCxDQUFDLENBQUM7UUFDSCxNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxRQUFpQjtJQUN0RCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzlCLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDL0IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRixDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxLQUFLLFVBQVUsc0JBQXNCLENBQ25DLFFBQWtCLEVBQ2xCLE9BQWdDO0lBRWhDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDMUMsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPO0lBQ3BCLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDbEMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLElBQUksQ0FBQztRQUNILE9BQU8sS0FBSyxHQUFHLG1CQUFtQixFQUFFLENBQUM7WUFDbkMsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEMsSUFBSSxLQUFLLENBQUMsSUFBSTtnQkFBRSxNQUFNO1lBQ3RCLE1BQU0sU0FBUyxHQUFHLG1CQUFtQixHQUFHLEtBQUssQ0FBQztZQUM5QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDakQsS0FBSyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDMUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkQsSUFBSSxLQUFLLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVTtnQkFBRSxNQUFNO1FBQ3ZELENBQUM7UUFDRCxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDakMsR0FBRyxPQUFPO1lBQ1YsT0FBTztZQUNQLFNBQVMsRUFBRSxLQUFLLElBQUksbUJBQW1CO1NBQ3hDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUUsQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0MsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dGhlbnRpY2F0ZWQgc3RyZWFtaW5nIHRyYW5zcG9ydCBmb3IgZGlyZWN0IERhdGFicmlja3MgZ2F0ZXdheSByb3V0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyB3b3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRieC10b29scy9kYXRhYnJpY2tzXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgdXBzdHJlYW1VcmwsIHR5cGUgR2F0ZXdheVJvdXRlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdC9tb2RlbC1nYXRld2F5L3RyYW5zcG9ydFwiKTtcbmNvbnN0IEVSUk9SX1BSRVZJRVdfQllURVMgPSA4ICogMTAyNDtcblxuY29uc3QgQkxPQ0tFRF9SRVFVRVNUX0hFQURFUlMgPSBuZXcgU2V0KFtcbiAgXCJhY2NlcHQtZW5jb2RpbmdcIixcbiAgXCJhdXRob3JpemF0aW9uXCIsXG4gIFwiY29ubmVjdGlvblwiLFxuICBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gIFwiY29va2llXCIsXG4gIFwiaG9zdFwiLFxuICBcInByb3h5LWF1dGhvcml6YXRpb25cIixcbiAgXCJ0cmFuc2Zlci1lbmNvZGluZ1wiLFxuICBcIngtYXBpLWtleVwiLFxuXSk7XG5cbmNvbnN0IEJMT0NLRURfUkVTUE9OU0VfSEVBREVSUyA9IG5ldyBTZXQoW1xuICBcImNvbm5lY3Rpb25cIixcbiAgXCJjb250ZW50LWVuY29kaW5nXCIsXG4gIFwiY29udGVudC1sZW5ndGhcIixcbiAgXCJrZWVwLWFsaXZlXCIsXG4gIFwicHJveHktYXV0aGVudGljYXRlXCIsXG4gIFwicHJveHktYXV0aG9yaXphdGlvblwiLFxuICBcInNldC1jb29raWVcIixcbiAgXCJ0ZVwiLFxuICBcInRyYWlsZXJcIixcbiAgXCJ0cmFuc2Zlci1lbmNvZGluZ1wiLFxuICBcInVwZ3JhZGVcIixcbl0pO1xuXG4vKiogSW5wdXRzIGZvciBvbmUgZGlyZWN0IERhdGFicmlja3MgcHJvdG9jb2wgcmVxdWVzdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1RyYW5zcG9ydFJlcXVlc3Qge1xuICByZWFkb25seSByb3V0ZTogR2F0ZXdheVJvdXRlO1xuICByZWFkb25seSBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IHNpZ25hbDogQWJvcnRTaWduYWw7XG59XG5cbi8qKiBFeGVjdXRlIGEgZGlyZWN0IHJvdXRlIHdpdGggU0RLLW93bmVkIGF1dGhlbnRpY2F0aW9uIGFuZCBhbiB1bmJ1ZmZlcmVkIHJlc3BvbnNlIGJvZHkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhYnJpY2tzKHJlcXVlc3Q6IERhdGFicmlja3NUcmFuc3BvcnRSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoeyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9KTtcbiAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBuYW1lKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIUJMT0NLRURfUkVRVUVTVF9IRUFERVJTLmhhcyhub3JtYWxpemVkKSAmJiAhbm9ybWFsaXplZC5zdGFydHNXaXRoKFwieC1mb3J3YXJkZWQtXCIpKSB7XG4gICAgICBoZWFkZXJzLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgYXdhaXQgY2xpZW50LmNvbmZpZy5hdXRoZW50aWNhdGUoaGVhZGVycyk7XG4gIGNvbnN0IHVybCA9IHVwc3RyZWFtVXJsKGhvc3QsIHJlcXVlc3Qucm91dGUpO1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoeyAuLi5yZXF1ZXN0LmJvZHksIG1vZGVsOiByZXF1ZXN0LnJvdXRlLnVwc3RyZWFtTW9kZWwgfSk7XG4gIGxvZ2dlci5kZWJ1ZyhcInNlbmRpbmcgdXBzdHJlYW0gcmVxdWVzdFwiLCB7XG4gICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICBwYXRoOiBuZXcgVVJMKHVybCkucGF0aG5hbWUsXG4gICAgc3RyZWFtOiByZXF1ZXN0LmJvZHkuc3RyZWFtID09PSB0cnVlLFxuICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgfSk7XG4gIHRyeSB7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHksXG4gICAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsLFxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxICYmXG4gICAgICAoYXdhaXQgd29ya3NwYWNlQ2xpZW50LnJlZnJlc2hXb3Jrc3BhY2VDbGllbnRBdXRoZW50aWNhdGlvbihjbGllbnQpKVxuICAgICkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicmV0cnlpbmcgcmVqZWN0ZWQgdXBzdHJlYW0gY3JlZGVudGlhbFwiLCB7XG4gICAgICAgIG1vZGVsOiByZXF1ZXN0LnJvdXRlLnVwc3RyZWFtTW9kZWwsXG4gICAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCk7XG4gICAgICBoZWFkZXJzLmRlbGV0ZShcImF1dGhvcml6YXRpb25cIik7XG4gICAgICBoZWFkZXJzLmRlbGV0ZShcIngtZGF0YWJyaWNrcy13b3Jrc3BhY2UtaWRcIik7XG4gICAgICBhd2FpdCBjbGllbnQuY29uZmlnLmF1dGhlbnRpY2F0ZShoZWFkZXJzKTtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHksXG4gICAgICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWwsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgZGV0YWlscyA9IHtcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgIG1vZGVsOiByZXF1ZXN0LnJvdXRlLnVwc3RyZWFtTW9kZWwsXG4gICAgICByZXF1ZXN0SWQ6XG4gICAgICAgIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwieC1yZXF1ZXN0LWlkXCIpID8/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwieC1kYXRhYnJpY2tzLXJlcXVlc3QtaWRcIiksXG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgICB9O1xuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicmVjZWl2ZWQgdXBzdHJlYW0gcmVzcG9uc2VcIiwgZGV0YWlscyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci53YXJuKFwidXBzdHJlYW0gcmVzcG9uc2UgZmFpbGVkXCIsIGRldGFpbHMpO1xuICAgICAgdm9pZCBsb2dVcHN0cmVhbUZhaWx1cmVCb2R5KHJlc3BvbnNlLmNsb25lKCksIGRldGFpbHMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKFwidXBzdHJlYW0gZmV0Y2ggZmFpbGVkXCIsIHtcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgIGVycm9yLFxuICAgICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgICB9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKiogQ29weSBvbmx5IHJlc3BvbnNlIGhlYWRlcnMgdGhhdCBiZWxvbmcgdG8gdGhlIHB1YmxpYyBtb2RlbCBwcm90b2NvbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnYXRld2F5UmVzcG9uc2VIZWFkZXJzKHVwc3RyZWFtOiBIZWFkZXJzKTogSGVhZGVycyB7XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICB1cHN0cmVhbS5mb3JFYWNoKCh2YWx1ZSwgbmFtZSkgPT4ge1xuICAgIGlmICghQkxPQ0tFRF9SRVNQT05TRV9IRUFERVJTLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSBoZWFkZXJzLnNldChuYW1lLCB2YWx1ZSk7XG4gIH0pO1xuICByZXR1cm4gaGVhZGVycztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9nVXBzdHJlYW1GYWlsdXJlQm9keShcbiAgcmVzcG9uc2U6IFJlc3BvbnNlLFxuICBkZXRhaWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5Py5nZXRSZWFkZXIoKTtcbiAgaWYgKCFyZWFkZXIpIHJldHVybjtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICBsZXQgcHJldmlldyA9IFwiXCI7XG4gIGxldCBieXRlcyA9IDA7XG4gIHRyeSB7XG4gICAgd2hpbGUgKGJ5dGVzIDwgRVJST1JfUFJFVklFV19CWVRFUykge1xuICAgICAgY29uc3QgY2h1bmsgPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgaWYgKGNodW5rLmRvbmUpIGJyZWFrO1xuICAgICAgY29uc3QgcmVtYWluaW5nID0gRVJST1JfUFJFVklFV19CWVRFUyAtIGJ5dGVzO1xuICAgICAgY29uc3QgdmFsdWUgPSBjaHVuay52YWx1ZS5zdWJhcnJheSgwLCByZW1haW5pbmcpO1xuICAgICAgYnl0ZXMgKz0gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgICAgIHByZXZpZXcgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pO1xuICAgICAgaWYgKHZhbHVlLmJ5dGVMZW5ndGggPCBjaHVuay52YWx1ZS5ieXRlTGVuZ3RoKSBicmVhaztcbiAgICB9XG4gICAgcHJldmlldyArPSBkZWNvZGVyLmRlY29kZSgpO1xuICAgIGxvZ2dlci53YXJuKFwidXBzdHJlYW0gZXJyb3IgYm9keVwiLCB7XG4gICAgICAuLi5kZXRhaWxzLFxuICAgICAgcHJldmlldyxcbiAgICAgIHRydW5jYXRlZDogYnl0ZXMgPj0gRVJST1JfUFJFVklFV19CWVRFUyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjb3VsZCBub3QgcmVhZCB1cHN0cmVhbSBlcnJvciBib2R5XCIsIHsgLi4uZGV0YWlscywgZXJyb3IgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIH1cbn1cbiJdfQ==
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBcUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7QUFDNUQsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBRXJDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDdEMsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLFFBQVE7SUFDUixNQUFNO0lBQ04scUJBQXFCO0lBQ3JCLG1CQUFtQjtJQUNuQixXQUFXO0NBQ1osQ0FBQyxDQUFDO0FBRUgsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN2QyxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1osb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixZQUFZO0lBQ1osSUFBSTtJQUNKLFNBQVM7SUFDVCxtQkFBbUI7SUFDbkIsU0FBUztDQUNWLENBQUMsQ0FBQztBQVVILDRGQUE0RjtBQUM1RixNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxPQUFtQztJQUN2RSxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUM1QyxNQUFNLElBQUksR0FBRyxD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QUFDO1lBQ2pELEtBQUssSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQzFCLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELElBQUksS0FBSyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVU7Z0JBQUUsTUFBTTtRQUN2RCxDQUFDO1FBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQ2pDLEdBQUcsT0FBTztZQUNWLE9BQU87WUFDUCxTQUFTLEVBQUUsS0FBSyxJQUFJLG1CQUFtQjtTQUN4QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBdXRoZW50aWNhdGVkIHN0cmVhbWluZyB0cmFuc3BvcnQgZm9yIGRpcmVjdCBEYXRhYnJpY2tzIGdhdGV3YXkgcm91dGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgd29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IG9wZW5haUNoYXQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB7IHVwc3RyZWFtVXJsLCB0eXBlIEdhdGV3YXlSb3V0ZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheS90cmFuc3BvcnRcIik7XG5jb25zdCBFUlJPUl9QUkVWSUVXX0JZVEVTID0gOCAqIDEwMjQ7XG5cbmNvbnN0IEJMT0NLRURfUkVRVUVTVF9IRUFERVJTID0gbmV3IFNldChbXG4gIFwiYWNjZXB0LWVuY29kaW5nXCIsXG4gIFwiYXV0aG9yaXphdGlvblwiLFxuICBcImNvbm5lY3Rpb25cIixcbiAgXCJjb250ZW50LWxlbmd0aFwiLFxuICBcImNvb2tpZVwiLFxuICBcImhvc3RcIixcbiAgXCJwcm94eS1hdXRob3JpemF0aW9uXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbiAgXCJ4LWFwaS1rZXlcIixcbl0pO1xuXG5jb25zdCBCTE9DS0VEX1JFU1BPTlNFX0hFQURFUlMgPSBuZXcgU2V0KFtcbiAgXCJjb25uZWN0aW9uXCIsXG4gIFwiY29udGVudC1lbmNvZGluZ1wiLFxuICBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gIFwia2VlcC1hbGl2ZVwiLFxuICBcInByb3h5LWF1dGhlbnRpY2F0ZVwiLFxuICBcInByb3h5LWF1dGhvcml6YXRpb25cIixcbiAgXCJzZXQtY29va2llXCIsXG4gIFwidGVcIixcbiAgXCJ0cmFpbGVyXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbiAgXCJ1cGdyYWRlXCIsXG5dKTtcblxuLyoqIElucHV0cyBmb3Igb25lIGRpcmVjdCBEYXRhYnJpY2tzIHByb3RvY29sIHJlcXVlc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NUcmFuc3BvcnRSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgcm91dGU6IEdhdGV3YXlSb3V0ZTtcbiAgcmVhZG9ubHkgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSBzaWduYWw6IEFib3J0U2lnbmFsO1xufVxuXG4vKiogRXhlY3V0ZSBhIGRpcmVjdCByb3V0ZSB3aXRoIFNESy1vd25lZCBhdXRoZW50aWNhdGlvbiBhbmQgYW4gdW5idWZmZXJlZCByZXNwb25zZSBib2R5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YWJyaWNrcyhyZXF1ZXN0OiBEYXRhYnJpY2tzVHJhbnNwb3J0UmVxdWVzdCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgY2xpZW50ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudDtcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSk7XG4gIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwgbmFtZSkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFCTE9DS0VEX1JFUVVFU1RfSEVBREVSUy5oYXMobm9ybWFsaXplZCkgJiYgIW5vcm1hbGl6ZWQuc3RhcnRzV2l0aChcIngtZm9yd2FyZGVkLVwiKSkge1xuICAgICAgaGVhZGVycy5zZXQobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIGF3YWl0IGNsaWVudC5jb25maWcuYXV0aGVudGljYXRlKGhlYWRlcnMpO1xuICBjb25zdCB1cmwgPSB1cHN0cmVhbVVybChob3N0LCByZXF1ZXN0LnJvdXRlKTtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KGRpcmVjdERhdGFicmlja3NSZXF1ZXN0Qm9keShyZXF1ZXN0LnJvdXRlLCByZXF1ZXN0LmJvZHkpKTtcbiAgbG9nZ2VyLmRlYnVnKFwic2VuZGluZyB1cHN0cmVhbSByZXF1ZXN0XCIsIHtcbiAgICBtb2RlbDogcmVxdWVzdC5yb3V0ZS51cHN0cmVhbU1vZGVsLFxuICAgIHBhdGg6IG5ldyBVUkwodXJsKS5wYXRobmFtZSxcbiAgICBzdHJlYW06IHJlcXVlc3QuYm9keS5zdHJlYW0gPT09IHRydWUsXG4gICAgdXBzdHJlYW1Qcm90b2NvbDogcmVxdWVzdC5yb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICB9KTtcbiAgdHJ5IHtcbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzLFxuICAgICAgYm9keSxcbiAgICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWwsXG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgJiZcbiAgICAgIChhd2FpdCB3b3Jrc3BhY2VDbGllbnQucmVmcmVzaFdvcmtzcGFjZUNsaWVudEF1dGhlbnRpY2F0aW9uKGNsaWVudCkpXG4gICAgKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZXRyeWluZyByZWplY3RlZCB1cHN0cmVhbSBjcmVkZW50aWFsXCIsIHtcbiAgICAgICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICAgICAgdXBzdHJlYW1Qcm90b2NvbDogcmVxdWVzdC5yb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKTtcbiAgICAgIGhlYWRlcnMuZGVsZXRlKFwiYXV0aG9yaXphdGlvblwiKTtcbiAgICAgIGhlYWRlcnMuZGVsZXRlKFwieC1kYXRhYnJpY2tzLXdvcmtzcGFjZS1pZFwiKTtcbiAgICAgIGF3YWl0IGNsaWVudC5jb25maWcuYXV0aGVudGljYXRlKGhlYWRlcnMpO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgYm9keSxcbiAgICAgICAgc2lnbmFsOiByZXF1ZXN0LnNpZ25hbCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBkZXRhaWxzID0ge1xuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICAgIHJlcXVlc3RJZDpcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJ4LXJlcXVlc3QtaWRcIikgPz8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJ4LWRhdGFicmlja3MtcmVxdWVzdC1pZFwiKSxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgdXBzdHJlYW1Qcm90b2NvbDogcmVxdWVzdC5yb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgIH07XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZWNlaXZlZCB1cHN0cmVhbSByZXNwb25zZVwiLCBkZXRhaWxzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLndhcm4oXCJ1cHN0cmVhbSByZXNwb25zZSBmYWlsZWRcIiwgZGV0YWlscyk7XG4gICAgICB2b2lkIGxvZ1Vwc3RyZWFtRmFpbHVyZUJvZHkocmVzcG9uc2UuY2xvbmUoKSwgZGV0YWlscyk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoXCJ1cHN0cmVhbSBmZXRjaCBmYWlsZWRcIiwge1xuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgICAgZXJyb3IsXG4gICAgICBtb2RlbDogcmVxdWVzdC5yb3V0ZS51cHN0cmVhbU1vZGVsLFxuICAgICAgdXBzdHJlYW1Qcm90b2NvbDogcmVxdWVzdC5yb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgIH0pO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKiBSZW1vdmUgY2xpZW50IGNvbXBhdGliaWxpdHkgZmllbGRzIHJlamVjdGVkIGJ5IGRpcmVjdCBEYXRhYnJpY2tzIHByb3RvY29scy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3REYXRhYnJpY2tzUmVxdWVzdEJvZHkoXG4gIHJvdXRlOiBQaWNrPEdhdGV3YXlSb3V0ZSwgXCJ1cHN0cmVhbVByb3RvY29sXCIgfCBcInVwc3RyZWFtTW9kZWxcIj4sXG4gIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3Qgc2FuaXRpemVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uYm9keSwgbW9kZWw6IHJvdXRlLnVwc3RyZWFtTW9kZWwgfTtcbiAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiZGF0YWJyaWNrcy1jaGF0XCIpIHtcbiAgICBvcGVuYWlDaGF0LnN0cmlwVW5zdXBwb3J0ZWRDaGF0RmllbGRzKHNhbml0aXplZCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIHNhbml0aXplZC5wYXJhbGxlbF90b29sX2NhbGxzO1xuICB9XG4gIHJldHVybiBzYW5pdGl6ZWQ7XG59XG5cbi8qKiBDb3B5IG9ubHkgcmVzcG9uc2UgaGVhZGVycyB0aGF0IGJlbG9uZyB0byB0aGUgcHVibGljIG1vZGVsIHByb3RvY29sLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGV3YXlSZXNwb25zZUhlYWRlcnModXBzdHJlYW06IEhlYWRlcnMpOiBIZWFkZXJzIHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gIHVwc3RyZWFtLmZvckVhY2goKHZhbHVlLCBuYW1lKSA9PiB7XG4gICAgaWYgKCFCTE9DS0VEX1JFU1BPTlNFX0hFQURFUlMuaGFzKG5hbWUudG9Mb3dlckNhc2UoKSkpIGhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2dVcHN0cmVhbUZhaWx1cmVCb2R5KFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4gIGRldGFpbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcigpO1xuICBpZiAoIXJlYWRlcikgcmV0dXJuO1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGxldCBwcmV2aWV3ID0gXCJcIjtcbiAgbGV0IGJ5dGVzID0gMDtcbiAgdHJ5IHtcbiAgICB3aGlsZSAoYnl0ZXMgPCBFUlJPUl9QUkVWSUVXX0JZVEVTKSB7XG4gICAgICBjb25zdCBjaHVuayA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICBpZiAoY2h1bmsuZG9uZSkgYnJlYWs7XG4gICAgICBjb25zdCByZW1haW5pbmcgPSBFUlJPUl9QUkVWSUVXX0JZVEVTIC0gYnl0ZXM7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNodW5rLnZhbHVlLnN1YmFycmF5KDAsIHJlbWFpbmluZyk7XG4gICAgICBieXRlcyArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgcHJldmlldyArPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSk7XG4gICAgICBpZiAodmFsdWUuYnl0ZUxlbmd0aCA8IGNodW5rLnZhbHVlLmJ5dGVMZW5ndGgpIGJyZWFrO1xuICAgIH1cbiAgICBwcmV2aWV3ICs9IGRlY29kZXIuZGVjb2RlKCk7XG4gICAgbG9nZ2VyLndhcm4oXCJ1cHN0cmVhbSBlcnJvciBib2R5XCIsIHtcbiAgICAgIC4uLmRldGFpbHMsXG4gICAgICBwcmV2aWV3LFxuICAgICAgdHJ1bmNhdGVkOiBieXRlcyA+PSBFUlJPUl9QUkVWSUVXX0JZVEVTLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNvdWxkIG5vdCByZWFkIHVwc3RyZWFtIGVycm9yIGJvZHlcIiwgeyAuLi5kZXRhaWxzLCBlcnJvciB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -31,11 +31,11 @@
31
31
  "@ai-sdk/open-responses": "^2.0.58",
32
32
  "@ai-sdk/openai-compatible": "^3.0.62",
33
33
  "@databricks/appkit": "0.81.0",
34
- "@dbx-tools/databricks": "^0.9.58",
35
- "@dbx-tools/model": "^0.9.58",
36
- "@dbx-tools/shared-core": "^0.9.58",
37
- "@dbx-tools/shared-model": "^0.9.58",
38
- "@dbx-tools/shared-model-gateway": "^0.9.58",
34
+ "@dbx-tools/databricks": "^0.9.61",
35
+ "@dbx-tools/model": "^0.9.61",
36
+ "@dbx-tools/shared-core": "^0.9.61",
37
+ "@dbx-tools/shared-model": "^0.9.61",
38
+ "@dbx-tools/shared-model-gateway": "^0.9.61",
39
39
  "ai": "^7.0.0",
40
40
  "zod": "4.3.6"
41
41
  },
@@ -89,7 +89,7 @@
89
89
  "./package.json": "./package.json"
90
90
  }
91
91
  },
92
- "version": "0.9.58",
92
+ "version": "0.9.61",
93
93
  "types": "./lib/index.d.ts",
94
94
  "dbxToolsConfig": {
95
95
  "tags": [
package/src/gateway.ts CHANGED
@@ -59,11 +59,10 @@ export class ModelGateway {
59
59
  async models(originator?: string, search?: string): Promise<ModelListResponse> {
60
60
  const codex = isCodexOriginator(originator);
61
61
  logger.debug("listing models", { codex, search });
62
- const targets = search?.trim()
63
- ? await this.registry.search(search.trim())
64
- : await this.registry.list();
62
+ const query = search?.trim();
63
+ const targets = query ? await this.registry.search(query) : await this.registry.list();
65
64
  logger.debug("listed models", { codex, count: targets.length });
66
- return listModelsPayload(targets, codex);
65
+ return listModelsPayload(targets, codex, query !== undefined && query.length > 0);
67
66
  }
68
67
 
69
68
  /** Resolve and execute one inference request. */
package/src/models.ts CHANGED
@@ -32,24 +32,31 @@ const REASONING_DESCRIPTIONS: Readonly<Record<string, string>> = {
32
32
  export function listModelsPayload(
33
33
  targets: readonly ModelTarget[],
34
34
  includeCodex: true,
35
+ preserveOrder?: boolean,
35
36
  ): CodexModelListResponse;
36
37
  export function listModelsPayload(
37
38
  targets: readonly ModelTarget[],
38
39
  includeCodex: false,
40
+ preserveOrder?: boolean,
39
41
  ): OpenAIModelListResponse;
40
42
  export function listModelsPayload(
41
43
  targets: readonly ModelTarget[],
42
44
  includeCodex: boolean,
45
+ preserveOrder?: boolean,
43
46
  ): ModelListResponse;
44
47
  export function listModelsPayload(
45
48
  targets: readonly ModelTarget[],
46
49
  includeCodex: boolean,
50
+ preserveOrder = false,
47
51
  ): ModelListResponse {
48
52
  const available = targets
49
53
  .filter((target) => target.endpoint?.status?.deprecated !== true)
50
- .filter((target) => !includeCodex || hasChatClass(target))
51
- .slice()
52
- .sort((left, right) => compareCatalogueTargets(left, right, (target) => target.displayName));
54
+ .filter((target) => !includeCodex || hasChatClass(target));
55
+ if (!preserveOrder) {
56
+ available.sort((left, right) =>
57
+ compareCatalogueTargets(left, right, (target) => target.displayName),
58
+ );
59
+ }
53
60
  if (includeCodex) {
54
61
  return {
55
62
  models: available.map((target, index) => codexModel(target, index + 1)),
@@ -84,14 +91,19 @@ function openAiModel(target: ModelTarget): OpenAIModel {
84
91
  };
85
92
  }
86
93
 
87
- function codexModel(target: ModelTarget, priority: number): CodexModel {
94
+ /** Codex `/v1/models` slug for a resolved gateway target. */
95
+ export function codexModelSlug(target: ModelTarget): string {
88
96
  const model =
89
97
  target.capabilities.aiGatewayCodex && target.modelServiceName
90
98
  ? target.modelServiceName
91
99
  : target.id;
100
+ return `databricks/${model}`;
101
+ }
102
+
103
+ function codexModel(target: ModelTarget, priority: number): CodexModel {
92
104
  const efforts = target.reasoningEfforts;
93
105
  return {
94
- slug: `databricks/${model}`,
106
+ slug: codexModelSlug(target),
95
107
  display_name: target.displayName,
96
108
  description: target.endpoint?.description ?? "Databricks model service",
97
109
  base_instructions: CODEX_BASE_INSTRUCTIONS,
@@ -4,6 +4,7 @@
4
4
  * @module
5
5
  */
6
6
 
7
+ import { object } from "@dbx-tools/shared-core";
7
8
  import type { ClientProtocol } from "@dbx-tools/shared-model-gateway";
8
9
  import { dynamicTool, jsonSchema, type ModelMessage, type ToolSet } from "ai";
9
10
 
@@ -248,16 +249,12 @@ function messageRole(value: unknown): "system" | "user" | "assistant" | undefine
248
249
 
249
250
  function arrayRecords(value: unknown): Record<string, unknown>[] {
250
251
  return Array.isArray(value)
251
- ? value.filter((item): item is Record<string, unknown> => isRecord(item))
252
+ ? value.filter((item): item is Record<string, unknown> => object.isRecord(item))
252
253
  : [];
253
254
  }
254
255
 
255
256
  function record(value: unknown): Record<string, unknown> {
256
- return isRecord(value) ? value : {};
257
- }
258
-
259
- function isRecord(value: unknown): value is Record<string, unknown> {
260
- return value !== null && typeof value === "object" && !Array.isArray(value);
257
+ return object.isRecord(value) ? value : {};
261
258
  }
262
259
 
263
260
  function stringValue(value: unknown): string | undefined {