@dbx-tools/model 0.9.118 → 0.9.120

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.
@@ -10,6 +10,7 @@
10
10
  */
11
11
  import { createAuthClient, } from "@dbx-tools/auth/client";
12
12
  import { listProfiles as listAuthProfiles } from "@dbx-tools/auth/profile";
13
+ import * as errorUtils from "@dbx-tools/shared-core/error-utils";
13
14
  import * as log from "@dbx-tools/shared-core/log";
14
15
  import * as object from "@dbx-tools/shared-core/object";
15
16
  import { ModelClass, } from "@dbx-tools/shared-model/contracts";
@@ -164,7 +165,7 @@ class DefaultModelClient {
164
165
  catch (error) {
165
166
  logger.warn("embedding dimension probe failed", {
166
167
  model: endpoint.name,
167
- error,
168
+ error: errorUtils.toError(error),
168
169
  });
169
170
  return endpoint;
170
171
  }
@@ -240,4 +241,4 @@ function cloneEndpoint(endpoint) {
240
241
  ...(endpoint.status ? { status: { ...endpoint.status } } : {}),
241
242
  };
242
243
  }
243
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFDSCxPQUFPLEVBQ0wsZ0JBQWdCLEdBR2pCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFlBQVksSUFBSSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTNFLE9BQU8sS0FBSyxHQUFHLE1BQU0sNEJBQTRCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSwrQkFBK0IsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsVUFBVSxHQU9YLE1BQU0sbUNBQW1DLENBQUM7QUFFM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRTFDLHdEQUF3RDtBQUN4RCxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQXNFL0QsTUFBTSx3QkFBd0I7SUFFakI7SUFDUTtJQUZuQixZQUNXLElBQWdCLEVBQ1IsT0FBZ0M7UUFEeEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNSLFlBQU8sR0FBUCxPQUFPLENBQXlCO0lBQ2hELENBQUM7SUFFSixJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsSUFBSSxD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QUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFGLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUMvRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXV0aGVudGljYXRpb24tYXdhcmUgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIGNsaWVudC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBwb3J0YWJsZSBlbnRyeSBwb2ludCB1c2VkIGJ5IGdlbmVyYXRlZCBQeXRob24gYmluZGluZ3MuIEl0IGtlZXBzXG4gKiBhdXRoZW50aWNhdGlvbiwgZW5kcG9pbnQgZGlzY292ZXJ5LCBjYWNoaW5nLCBub3JtYWxpemF0aW9uLCByYW5raW5nLCByb3V0ZVxuICogc2VsZWN0aW9uLCByb3V0ZSBjb25zdHJ1Y3Rpb24sIGFuZCBwdWJsaXNoZWQgbWV0YWRhdGEgaW4gTm9kZSB3aGlsZSBleHBvc2luZ1xuICogb25lIHNtYWxsIGNsaWVudC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7XG4gIGNyZWF0ZUF1dGhDbGllbnQsXG4gIHR5cGUgQXV0aENsaWVudCxcbiAgdHlwZSBEYXRhYnJpY2tzQXV0aERlcGVuZGVuY2llcyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXV0aC9jbGllbnRcIjtcbmltcG9ydCB7IGxpc3RQcm9maWxlcyBhcyBsaXN0QXV0aFByb2ZpbGVzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXV0aC9wcm9maWxlXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFicmlja3NQcm9maWxlU3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1hdXRoXCI7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvbG9nXCI7XG5pbXBvcnQgKiBhcyBvYmplY3QgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvb2JqZWN0XCI7XG5pbXBvcnQge1xuICBNb2RlbENsYXNzLFxuICB0eXBlIE1vZGVsTWV0YWRhdGEsXG4gIHR5cGUgTW9kZWxRdWVyeSxcbiAgdHlwZSBSYW5rZWRNb2RlbCxcbiAgdHlwZSBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uLFxuICB0eXBlIFJlc29sdmVNb2RlbElucHV0LFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC9jb250cmFjdHNcIjtcblxuaW1wb3J0IHsgbm9ybWFsaXplRW5kcG9pbnRzIH0gZnJvbSBcIi4vX3JhbmtpbmcudHNcIjtcbmltcG9ydCB7IGxvb2t1cE1vZGVscywgcmVzb2x2ZU1vZGVsIH0gZnJvbSBcIi4vX3NlbGVjdGlvbi50c1wiO1xuaW1wb3J0IHsgY2hhdENvbXBsZXRpb25zVXJsLCBpbnZvY2F0aW9uc1VybCwgcmVzcG9uc2VzVXBzdHJlYW1VcmwgfSBmcm9tIFwiLi9pbnZva2UudHNcIjtcbmltcG9ydCB7IGh5ZHJhdGVNb2RlbE1ldGFkYXRhLCBtb2RlbE1ldGFkYXRhRm9yIH0gZnJvbSBcIi4vbWV0YWRhdGEudHNcIjtcbmltcG9ydCB7IG1vZGVsU2VydmluZ0FwaSB9IGZyb20gXCIuL3BvbGljeS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibW9kZWwvY2xpZW50XCIpO1xuXG4vKiogRGVmYXVsdCBsaWZldGltZSBmb3Igb25lIGxpdmUgZW5kcG9pbnQgY2F0YWxvZ3VlLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTU9ERUxfQ0xJRU5UX0NBQ0hFX1RUTF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbi8qKiBBdXRoZW50aWNhdGlvbiBvcHRpb25zIGV4cG9zZWQgYnkgdGhlIHBvcnRhYmxlIG1vZGVsIGNsaWVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxBdXRoT3B0aW9ucyB7XG4gIC8qKiBEYXRhYnJpY2tzIHByb2ZpbGUgbmFtZS4gKi9cbiAgcHJvZmlsZT86IHN0cmluZztcbn1cblxuLyoqIENvbnN0cnVjdGlvbiBvcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlTW9kZWxDbGllbnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbENsaWVudE9wdGlvbnMge1xuICAvKiogRGF0YWJyaWNrcyBhdXRoZW50aWNhdGlvbiBhbmQgcHJvZmlsZSBzZWxlY3Rpb24gb3B0aW9ucy4gKi9cbiAgYXV0aD86IE1vZGVsQXV0aE9wdGlvbnM7XG4gIC8qKiBJbi1tZW1vcnkgZW5kcG9pbnQgY2F0YWxvZ3VlIFRUTCBpbiBtaWxsaXNlY29uZHMuICovXG4gIGNhY2hlVHRsTXM/OiBudW1iZXI7XG4gIC8qKiBIeWRyYXRlIE5vZGUtb25seSBtZXRhZGF0YSBjYWNoZXMgYmVmb3JlIGNvbnN0cnVjdGluZyB0aGUgY2xpZW50LiAqL1xuICBoeWRyYXRlTWV0YWRhdGE/OiBib29sZWFuO1xufVxuXG4vKiogU2VjcmV0LWZyZWUgcnVudGltZSBpZGVudGl0eSBhbmQgY2FjaGUgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDbGllbnRTdGF0dXMge1xuICByZWFkb25seSBwcm9maWxlPzogc3RyaW5nO1xuICByZWFkb25seSBob3N0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByaW5jaXBhbDogc3RyaW5nO1xuICByZWFkb25seSB3b3Jrc3BhY2VJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgY2FjaGVUdGxNczogbnVtYmVyO1xufVxuXG4vKiogU2VydmluZyBwcm90b2NvbCBzZWxlY3RlZCBmb3Igb25lIHJlc29sdmVkIG1vZGVsLiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxQcm90b2NvbCA9IFwiY2hhdFwiIHwgXCJyZXNwb25zZXNcIiB8IFwiZW1iZWRkaW5nc1wiO1xuXG4vKiogTW9kZWwgc2VsZWN0aW9uIHBsdXMgcm91dGUgY29udHJvbHMuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUm91dGVJbnB1dCBleHRlbmRzIFJlc29sdmVNb2RlbElucHV0IHtcbiAgLyoqIEZvcmNlIGEgbGl2ZSBlbmRwb2ludCBjYXRhbG9ndWUgcmVmcmVzaCBiZWZvcmUgc2VsZWN0aW9uLiAqL1xuICByZWZyZXNoPzogYm9vbGVhbjtcbiAgLyoqIFJlcXVlc3RlZCB1cHN0cmVhbSBwcm90b2NvbC4gRGVmYXVsdHMgZnJvbSBlbmRwb2ludCB0YXNrIGFuZCBtb2RlbCBwb2xpY3kuICovXG4gIHByb3RvY29sPzogTW9kZWxQcm90b2NvbDtcbiAgLyoqIFdoZXRoZXIgYXV0aGVudGljYXRpb24gbWF5IHJ1biBhbiBpbnRlcmFjdGl2ZSBsb2dpbi4gKi9cbiAgbG9naW4/OiBib29sZWFuO1xufVxuXG4vKiogRnVsbHkgcmVzb2x2ZWQgRGF0YWJyaWNrcyByb3V0ZSBmb3IgYSBtb2RlbCByZXF1ZXN0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJvdXRlIHtcbiAgcmVhZG9ubHkgbW9kZWxJZDogc3RyaW5nO1xuICByZWFkb25seSBlbmRwb2ludD86IFNlcnZpbmdFbmRwb2ludFN1bW1hcnk7XG4gIHJlYWRvbmx5IHNvdXJjZTogUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbltcInNvdXJjZVwiXTtcbiAgcmVhZG9ubHkgcHJvdG9jb2w6IE1vZGVsUHJvdG9jb2w7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgYXBpQmFzZTogc3RyaW5nO1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbiAgcmVhZG9ubHkgaGVhZGVyczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gIHJlYWRvbmx5IG1ldGFkYXRhOiBNb2RlbE1ldGFkYXRhO1xufVxuXG4vKiogU3RhYmxlIG1vZGVsIGZhY2FkZSBzaGFyZWQgYnkgTm9kZSBhbmQgZ2VuZXJhdGVkIGxhbmd1YWdlIGJpbmRpbmdzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbENsaWVudCB7XG4gIGxpc3RNb2RlbHMocmVmcmVzaD86IGJvb2xlYW4pOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT47XG4gIHNlYXJjaE1vZGVscyhxdWVyeT86IE1vZGVsUXVlcnksIHJlZnJlc2g/OiBib29sZWFuKTogUHJvbWlzZTxSYW5rZWRNb2RlbFtdPjtcbiAgcm91dGUoaW5wdXQ/OiBNb2RlbFJvdXRlSW5wdXQpOiBQcm9taXNlPE1vZGVsUm91dGU+O1xuICBtZXRhZGF0YShtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsTWV0YWRhdGE7XG4gIHN0YXR1cygpOiBNb2RlbENsaWVudFN0YXR1cztcbn1cblxuaW50ZXJmYWNlIERhdGFicmlja3NNb2RlbENsaWVudCB7XG4gIHJlYWRvbmx5IGF1dGg6IEF1dGhDbGllbnQ7XG4gIGhvc3QoKTogc3RyaW5nO1xuICBwcmluY2lwYWwoKTogc3RyaW5nO1xuICB3b3Jrc3BhY2VJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHJlcXVlc3QocGF0aDogc3RyaW5nLCBpbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPHVua25vd24+O1xufVxuXG5jbGFzcyBBdXRoZW50aWNhdGVkTW9kZWxDbGllbnQgaW1wbGVtZW50cyBEYXRhYnJpY2tzTW9kZWxDbGllbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBhdXRoOiBBdXRoQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmV0Y2hlcjogdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2gsXG4gICkge31cblxuICBob3N0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC5ob3N0O1xuICB9XG5cbiAgcHJpbmNpcGFsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC5wcmluY2lwYWw7XG4gIH1cblxuICB3b3Jrc3BhY2VJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmF1dGgud29ya3NwYWNlSWQ7XG4gIH1cblxuICBhc3luYyByZXF1ZXN0KHBhdGg6IHN0cmluZywgaW5pdDogUmVxdWVzdEluaXQgPSB7fSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aCwgYCR7dGhpcy5ob3N0KCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpfS9gKS50b1N0cmluZygpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbml0LmhlYWRlcnMpO1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhd2FpdCB0aGlzLmF1dGguaGVhZGVycygpKSkge1xuICAgICAgaGVhZGVycy5zZXQobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaW5pdC5ib2R5ICE9PSB1bmRlZmluZWQgJiYgIWhlYWRlcnMuaGFzKFwiY29udGVudC10eXBlXCIpKSB7XG4gICAgICBoZWFkZXJzLnNldChcImNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgfVxuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hlcih1cmwsIHsgLi4uaW5pdCwgaGVhZGVycyB9KTtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhd2FpdCB0aGlzLmF1dGguaGVhZGVycyh7IHJlZnJlc2g6IHRydWUgfSkpKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaGVyKHVybCwgeyAuLi5pbml0LCBoZWFkZXJzIH0pO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERhdGFicmlja3MgTW9kZWwgU2VydmluZyBBUEkgJHtwYXRofSByZXR1cm5lZCBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHt0ZXh0fWAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dCA/IEpTT04ucGFyc2UodGV4dCkgOiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuaW50ZXJmYWNlIENhdGFsb2d1ZUVudHJ5IHtcbiAgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTxyZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+O1xuICBleHBpcmVzQXQ6IG51bWJlcjtcbn1cblxuY29uc3QgY2F0YWxvZ3VlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgQ2F0YWxvZ3VlRW50cnk+KCk7XG5cbmNsYXNzIERlZmF1bHRNb2RlbENsaWVudCBpbXBsZW1lbnRzIE1vZGVsQ2xpZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IERhdGFicmlja3NNb2RlbENsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlVHRsTXM6IG51bWJlcixcbiAgKSB7fVxuXG4gIGFzeW5jIGxpc3RNb2RlbHMocmVmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgICByZXR1cm4gY2xvbmVFbmRwb2ludHMoYXdhaXQgdGhpcy5jYXRhbG9ndWUocmVmcmVzaCkpO1xuICB9XG5cbiAgYXN5bmMgc2VhcmNoTW9kZWxzKHF1ZXJ5OiBNb2RlbFF1ZXJ5ID0ge30sIHJlZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8UmFua2VkTW9kZWxbXT4ge1xuICAgIHJldHVybiBsb29rdXBNb2RlbHMoYXdhaXQgdGhpcy5jYXRhbG9ndWUocmVmcmVzaCksIHF1ZXJ5KS5tYXAoKHsgZW5kcG9pbnQsIC4uLnJhbmtlZCB9KSA9PiAoe1xuICAgICAgLi4ucmFua2VkLFxuICAgICAgZW5kcG9pbnQ6IGNsb25lRW5kcG9pbnQoZW5kcG9pbnQpLFxuICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIHJvdXRlKGlucHV0OiBNb2RlbFJvdXRlSW5wdXQgPSB7fSk6IFByb21pc2U8TW9kZWxSb3V0ZT4ge1xuICAgIGNvbnN0IHsgcmVmcmVzaCA9IGZhbHNlLCBwcm90b2NvbDogcmVxdWVzdGVkUHJvdG9jb2wsIGxvZ2luLCAuLi5zZWxlY3Rpb24gfSA9IGlucHV0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZVNlbGVjdGlvbiA9XG4gICAgICByZXF1ZXN0ZWRQcm90b2NvbCA9PT0gXCJlbWJlZGRpbmdzXCIgJiYgc2VsZWN0aW9uLm1vZGVsQ2xhc3MgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgLi4uc2VsZWN0aW9uLCBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyB9XG4gICAgICAgIDogc2VsZWN0aW9uO1xuICAgIGNvbnN0IGNhdGFsb2d1ZSA9IGF3YWl0IHRoaXMuY2F0YWxvZ3VlKHJlZnJlc2gpO1xuICAgIGxldCByZXNvbHZlZCA9IHJlc29sdmVNb2RlbChjYXRhbG9ndWUsIGVmZmVjdGl2ZVNlbGVjdGlvbik7XG4gICAgaWYgKGlzVW5tYXRjaGVkRXhwbGljaXQoY2F0YWxvZ3VlLCBlZmZlY3RpdmVTZWxlY3Rpb24sIHJlc29sdmVkKSkge1xuICAgICAgcmVzb2x2ZWQgPSByZXNvbHZlTW9kZWwoYXdhaXQgdGhpcy5jYXRhbG9ndWUodHJ1ZSksIGVmZmVjdGl2ZVNlbGVjdGlvbik7XG4gICAgfVxuICAgIGNvbnN0IGVuZHBvaW50ID0gKGF3YWl0IHRoaXMuY2F0YWxvZ3VlKGZhbHNlKSkuZmluZChcbiAgICAgIChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09PSByZXNvbHZlZC5tb2RlbElkLFxuICAgICk7XG4gICAgY29uc3QgcHJvdG9jb2wgPSByZXF1ZXN0ZWRQcm90b2NvbCA/PyBpbmZlclByb3RvY29sKGVuZHBvaW50LCByZXNvbHZlZC5tb2RlbElkKTtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5jbGllbnQuaG9zdCgpO1xuICAgIGNvbnN0IHVybCA9IHJvdXRlVXJsKGhvc3QsIHJlc29sdmVkLm1vZGVsSWQsIHByb3RvY29sKTtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy5jbGllbnQuYXV0aC5oZWFkZXJzKHsgbG9naW4gfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGVsSWQ6IHJlc29sdmVkLm1vZGVsSWQsXG4gICAgICAuLi4oZW5kcG9pbnQgPyB7IGVuZHBvaW50OiBjbG9uZUVuZHBvaW50KGVuZHBvaW50KSB9IDoge30pLFxuICAgICAgc291cmNlOiByZXNvbHZlZC5zb3VyY2UsXG4gICAgICBwcm90b2NvbCxcbiAgICAgIGhvc3QsXG4gICAgICBhcGlCYXNlOiBuZXcgVVJMKFwic2VydmluZy1lbmRwb2ludHNcIiwgYCR7aG9zdC5yZXBsYWNlKC9cXC8kLywgXCJcIil9L2ApLnRvU3RyaW5nKCksXG4gICAgICB1cmwsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0YWRhdGE6IG1vZGVsTWV0YWRhdGFGb3IoZW5kcG9pbnQgPz8gcmVzb2x2ZWQubW9kZWxJZCksXG4gICAgfTtcbiAgfVxuXG4gIG1ldGFkYXRhKG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogTW9kZWxNZXRhZGF0YSB7XG4gICAgcmV0dXJuIG1vZGVsTWV0YWRhdGFGb3IobW9kZWwpO1xuICB9XG5cbiAgc3RhdHVzKCk6IE1vZGVsQ2xpZW50U3RhdHVzIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKHRoaXMuY2xpZW50LmF1dGgucHJvZmlsZSA/IHsgcHJvZmlsZTogdGhpcy5jbGllbnQuYXV0aC5wcm9maWxlIH0gOiB7fSksXG4gICAgICBob3N0OiB0aGlzLmNsaWVudC5ob3N0KCksXG4gICAgICBwcmluY2lwYWw6IHRoaXMuY2xpZW50LnByaW5jaXBhbCgpLFxuICAgICAgLi4uKHRoaXMuY2xpZW50LndvcmtzcGFjZUlkKCkgPyB7IHdvcmtzcGFjZUlkOiB0aGlzLmNsaWVudC53b3Jrc3BhY2VJZCgpIH0gOiB7fSksXG4gICAgICBjYWNoZVR0bE1zOiB0aGlzLmNhY2hlVHRsTXMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2F0YWxvZ3VlKHJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IGtleSA9IGNhdGFsb2d1ZUtleSh0aGlzLmNsaWVudCk7XG4gICAgaWYgKHJlZnJlc2gpIGNhdGFsb2d1ZUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBjYXRhbG9ndWVDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY3VycmVudCAmJiBEYXRlLm5vdygpIDwgY3VycmVudC5leHBpcmVzQXQpIHJldHVybiBjdXJyZW50LnByb21pc2U7XG4gICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuZmV0Y2hDYXRhbG9ndWUoKTtcbiAgICBjb25zdCBlbnRyeTogQ2F0YWxvZ3VlRW50cnkgPSB7IHByb21pc2UsIGV4cGlyZXNBdDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIH07XG4gICAgY2F0YWxvZ3VlQ2FjaGUuc2V0KGtleSwgZW50cnkpO1xuICAgIHZvaWQgcHJvbWlzZS50aGVuKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBlbnRyeS5leHBpcmVzQXQgPSBEYXRlLm5vdygpICsgdGhpcy5jYWNoZVR0bE1zO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKGNhdGFsb2d1ZUNhY2hlLmdldChrZXkpID09PSBlbnRyeSkgY2F0YWxvZ3VlQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoQ2F0YWxvZ3VlKCk6IFByb21pc2U8cmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnJlcXVlc3QoXCIvYXBpLzIuMC9zZXJ2aW5nLWVuZHBvaW50c1wiKTtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZChyZXNwb25zZSkgfHwgIUFycmF5LmlzQXJyYXkocmVzcG9uc2UuZW5kcG9pbnRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyBzZXJ2aW5nLWVuZHBvaW50cyByZXNwb25zZSBpcyBtaXNzaW5nIGFuIGVuZHBvaW50cyBhcnJheVwiKTtcbiAgICB9XG4gICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgdGhpcy5tZWFzdXJlRW1iZWRkaW5nRGltZW5zaW9ucyhub3JtYWxpemVFbmRwb2ludHMocmVzcG9uc2UuZW5kcG9pbnRzKSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibGlzdGVkXCIsIHtcbiAgICAgIGNvdW50OiBlbmRwb2ludHMubGVuZ3RoLFxuICAgICAgaG9zdDogdGhpcy5jbGllbnQuaG9zdCgpLFxuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgIH0pO1xuICAgIHJldHVybiBlbmRwb2ludHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1lYXN1cmVFbWJlZGRpbmdEaW1lbnNpb25zKFxuICAgIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICApOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGVuZHBvaW50cy5tYXAoYXN5bmMgKGVuZHBvaW50KSA9PiB7XG4gICAgICAgIGlmIChlbmRwb2ludC5jbGFzcyAhPT0gTW9kZWxDbGFzcy5FbWJlZGRpbmcgfHwgZW5kcG9pbnQuZGltZW5zaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZW5kcG9pbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnJlcXVlc3QoXG4gICAgICAgICAgICBgL3NlcnZpbmctZW5kcG9pbnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGVuZHBvaW50Lm5hbWUpfS9pbnZvY2F0aW9uc2AsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaW5wdXQ6IFtcInBpbmdcIl0gfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZGltZW5zaW9uID0gZW1iZWRkaW5nRGltZW5zaW9uKHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm4gZGltZW5zaW9uID09PSB1bmRlZmluZWQgPyBlbmRwb2ludCA6IHsgLi4uZW5kcG9pbnQsIGRpbWVuc2lvbiB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFwiZW1iZWRkaW5nIGRpbWVuc2lvbiBwcm9iZSBmYWlsZWRcIiwge1xuICAgICAgICAgICAgbW9kZWw6IGVuZHBvaW50Lm5hbWUsXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gZW5kcG9pbnQ7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1iZWRkaW5nRGltZW5zaW9uKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQodmFsdWUpIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlLmRhdGEpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBmaXJzdCA9IHZhbHVlLmRhdGFbMF07XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKGZpcnN0KSB8fCAhQXJyYXkuaXNBcnJheShmaXJzdC5lbWJlZGRpbmcpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gZmlyc3QuZW1iZWRkaW5nLmxlbmd0aCA+IDAgPyBmaXJzdC5lbWJlZGRpbmcubGVuZ3RoIDogdW5kZWZpbmVkO1xufVxuXG4vKiogQ3JlYXRlIGFuIGF1dGhlbnRpY2F0aW9uLWF3YXJlIERhdGFicmlja3MgbW9kZWwgY2xpZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1vZGVsQ2xpZW50KG9wdGlvbnM6IE1vZGVsQ2xpZW50T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxNb2RlbENsaWVudD4ge1xuICBjb25zdCBjYWNoZVR0bE1zID0gdmFsaWRhdGVDYWNoZVR0bChvcHRpb25zLmNhY2hlVHRsTXMpO1xuICBpZiAob3B0aW9ucy5oeWRyYXRlTWV0YWRhdGEgPz8gdHJ1ZSkgYXdhaXQgaHlkcmF0ZU1vZGVsTWV0YWRhdGEoKTtcbiAgcmV0dXJuIG5ldyBEZWZhdWx0TW9kZWxDbGllbnQoXG4gICAgbmV3IEF1dGhlbnRpY2F0ZWRNb2RlbENsaWVudChhd2FpdCBjcmVhdGVBdXRoQ2xpZW50KG9wdGlvbnMuYXV0aCksIGdsb2JhbFRoaXMuZmV0Y2gpLFxuICAgIGNhY2hlVHRsTXMsXG4gICk7XG59XG5cbi8qKiBMaXN0IGNvbmZpZ3VyZWQgRGF0YWJyaWNrcyBwcm9maWxlcyBvdXRzaWRlIHRoZSBtb2RlbCBjbGllbnQgZmFjYWRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RQcm9maWxlcyhyZWZyZXNoID0gZmFsc2UpOiBEYXRhYnJpY2tzUHJvZmlsZVN1bW1hcnlbXSB7XG4gIHJldHVybiBsaXN0QXV0aFByb2ZpbGVzKHsgcmVmcmVzaCB9KTtcbn1cblxuLyoqIEBpbnRlcm5hbCBDb25zdHJ1Y3QgYSBtb2RlbCBjbGllbnQgYXJvdW5kIGEgdGVzdCBvciBob3N0LW93bmVkIERhdGFicmlja3MgY2xpZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsQ2xpZW50V2l0aERhdGFicmlja3NDbGllbnQoXG4gIGNsaWVudDogRGF0YWJyaWNrc01vZGVsQ2xpZW50LFxuICBjYWNoZVR0bE1zID0gREVGQVVMVF9NT0RFTF9DTElFTlRfQ0FDSEVfVFRMX01TLFxuKTogTW9kZWxDbGllbnQge1xuICByZXR1cm4gbmV3IERlZmF1bHRNb2RlbENsaWVudChjbGllbnQsIHZhbGlkYXRlQ2FjaGVUdGwoY2FjaGVUdGxNcykpO1xufVxuXG4vKiogQGludGVybmFsIENyZWF0ZSBhIG1vZGVsIGNsaWVudCB3aXRoIGluamVjdGFibGUgYXV0aCBob3N0IGNhcGFiaWxpdGllcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVNb2RlbENsaWVudFdpdGhEZXBlbmRlbmNpZXMoXG4gIG9wdGlvbnM6IE1vZGVsQ2xpZW50T3B0aW9ucyxcbiAgZGVwZW5kZW5jaWVzOiBEYXRhYnJpY2tzQXV0aERlcGVuZGVuY2llcyxcbik6IFByb21pc2U8TW9kZWxDbGllbnQ+IHtcbiAgaWYgKG9wdGlvbnMuaHlkcmF0ZU1ldGFkYXRhID8/IHRydWUpIGF3YWl0IGh5ZHJhdGVNb2RlbE1ldGFkYXRhKCk7XG4gIHJldHVybiBuZXcgRGVmYXVsdE1vZGVsQ2xpZW50KFxuICAgIG5ldyBBdXRoZW50aWNhdGVkTW9kZWxDbGllbnQoXG4gICAgICBhd2FpdCBjcmVhdGVBdXRoQ2xpZW50KG9wdGlvbnMuYXV0aCwgZGVwZW5kZW5jaWVzKSxcbiAgICAgIGRlcGVuZGVuY2llcy5mZXRjaCA/PyBnbG9iYWxUaGlzLmZldGNoLFxuICAgICksXG4gICAgdmFsaWRhdGVDYWNoZVR0bChvcHRpb25zLmNhY2hlVHRsTXMpLFxuICApO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNhY2hlVHRsKHZhbHVlID0gREVGQVVMVF9NT0RFTF9DTElFTlRfQ0FDSEVfVFRMX01TKTogbnVtYmVyIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNb2RlbCBjbGllbnQgY2FjaGVUdGxNcyBtdXN0IGJlIGEgcG9zaXRpdmUgZmluaXRlIG51bWJlclwiKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNhdGFsb2d1ZUtleShjbGllbnQ6IERhdGFicmlja3NNb2RlbENsaWVudCk6IHN0cmluZyB7XG4gIHJldHVybiBbY2xpZW50Lmhvc3QoKSwgY2xpZW50LndvcmtzcGFjZUlkKCkgPz8gXCJcIiwgY2xpZW50LnByaW5jaXBhbCgpXS5qb2luKFwiXFx1MDAwMFwiKTtcbn1cblxuZnVuY3Rpb24gaW5mZXJQcm90b2NvbChcbiAgZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfCB1bmRlZmluZWQsXG4gIG1vZGVsSWQ6IHN0cmluZyxcbik6IE1vZGVsUHJvdG9jb2wge1xuICBpZiAoZW5kcG9pbnQ/LnRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcIikgcmV0dXJuIFwiZW1iZWRkaW5nc1wiO1xuICByZXR1cm4gbW9kZWxTZXJ2aW5nQXBpKG1vZGVsSWQpO1xufVxuXG5mdW5jdGlvbiByb3V0ZVVybChob3N0OiBzdHJpbmcsIG1vZGVsSWQ6IHN0cmluZywgcHJvdG9jb2w6IE1vZGVsUHJvdG9jb2wpOiBzdHJpbmcge1xuICBpZiAocHJvdG9jb2wgPT09IFwicmVzcG9uc2VzXCIpIHJldHVybiByZXNwb25zZXNVcHN0cmVhbVVybChob3N0LCBtb2RlbElkKTtcbiAgaWYgKHByb3RvY29sID09PSBcImNoYXRcIiAmJiBtb2RlbFNlcnZpbmdBcGkobW9kZWxJZCkgPT09IFwicmVzcG9uc2VzXCIpIHtcbiAgICByZXR1cm4gY2hhdENvbXBsZXRpb25zVXJsKGhvc3QpO1xuICB9XG4gIHJldHVybiBpbnZvY2F0aW9uc1VybChob3N0LCBtb2RlbElkKTtcbn1cblxuZnVuY3Rpb24gaXNVbm1hdGNoZWRFeHBsaWNpdChcbiAgY2F0YWxvZ3VlOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIGlucHV0OiBSZXNvbHZlTW9kZWxJbnB1dCxcbiAgcmVzb2x2ZWQ6IFJlc29sdmVkTW9kZWxTZWxlY3Rpb24sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpbnB1dC5leHBsaWNpdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgaW5wdXQuZnV6enkgIT09IGZhbHNlICYmXG4gICAgcmVzb2x2ZWQubW9kZWxJZCA9PT0gaW5wdXQuZXhwbGljaXQgJiZcbiAgICAhY2F0YWxvZ3VlLnNvbWUoKGVuZHBvaW50KSA9PiBlbmRwb2ludC5uYW1lID09PSBpbnB1dC5leHBsaWNpdClcbiAgKTtcbn1cblxuZnVuY3Rpb24gY2xvbmVFbmRwb2ludHMoZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10pOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10ge1xuICByZXR1cm4gZW5kcG9pbnRzLm1hcChjbG9uZUVuZHBvaW50KTtcbn1cblxuZnVuY3Rpb24gY2xvbmVFbmRwb2ludChlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkge1xuICByZXR1cm4ge1xuICAgIC4uLmVuZHBvaW50LFxuICAgIC4uLihlbmRwb2ludC5wcm9maWxlID8geyBwcm9maWxlOiB7IC4uLmVuZHBvaW50LnByb2ZpbGUgfSB9IDoge30pLFxuICAgIC4uLihlbmRwb2ludC5zZXJ2aWNlTmFtZXMgPyB7IHNlcnZpY2VOYW1lczogeyAuLi5lbmRwb2ludC5zZXJ2aWNlTmFtZXMgfSB9IDoge30pLFxuICAgIC4uLihlbmRwb2ludC5yZWFzb25pbmdFZmZvcnRzID8geyByZWFzb25pbmdFZmZvcnRzOiBbLi4uZW5kcG9pbnQucmVhc29uaW5nRWZmb3J0c10gfSA6IHt9KSxcbiAgICAuLi4oZW5kcG9pbnQuc3RhdHVzID8geyBzdGF0dXM6IHsgLi4uZW5kcG9pbnQuc3RhdHVzIH0gfSA6IHt9KSxcbiAgfTtcbn1cbiJdfQ==
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFDSCxPQUFPLEVBQ0wsZ0JBQWdCLEdBR2pCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFlBQVksSUFBSSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTNFLE9BQU8sS0FBSyxVQUFVLE1BQU0sb0NBQW9DLENBQUM7QUFDakUsT0FBTyxLQUFLLEdBQUcsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRCxPQUFPLEtBQUssTUFBTSxNQUFNLCtCQUErQixDQUFDO0FBQ3hELE9BQU8sRUFDTCxVQUFVLEdBT1gsTUFBTSxtQ0FBbUMsQ0FBQztBQUUzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7QUFFMUMsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBc0UvRCxNQUFNLHdCQUF3QjtJQUVqQjtJQUNRO0lBRm5CLFlBQ1csSUFBZ0IsRUFDUixPQUFnQztRQUR4QyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ1IsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7SUFDaEQsQ0FB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QUFHLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUYsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQy9ELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBdXRoZW50aWNhdGlvbi1hd2FyZSBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgY2xpZW50LlxuICpcbiAqIFRoaXMgaXMgdGhlIHBvcnRhYmxlIGVudHJ5IHBvaW50IHVzZWQgYnkgZ2VuZXJhdGVkIFB5dGhvbiBiaW5kaW5ncy4gSXQga2VlcHNcbiAqIGF1dGhlbnRpY2F0aW9uLCBlbmRwb2ludCBkaXNjb3ZlcnksIGNhY2hpbmcsIG5vcm1hbGl6YXRpb24sIHJhbmtpbmcsIHJvdXRlXG4gKiBzZWxlY3Rpb24sIHJvdXRlIGNvbnN0cnVjdGlvbiwgYW5kIHB1Ymxpc2hlZCBtZXRhZGF0YSBpbiBOb2RlIHdoaWxlIGV4cG9zaW5nXG4gKiBvbmUgc21hbGwgY2xpZW50LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHtcbiAgY3JlYXRlQXV0aENsaWVudCxcbiAgdHlwZSBBdXRoQ2xpZW50LFxuICB0eXBlIERhdGFicmlja3NBdXRoRGVwZW5kZW5jaWVzLFxufSBmcm9tIFwiQGRieC10b29scy9hdXRoL2NsaWVudFwiO1xuaW1wb3J0IHsgbGlzdFByb2ZpbGVzIGFzIGxpc3RBdXRoUHJvZmlsZXMgfSBmcm9tIFwiQGRieC10b29scy9hdXRoL3Byb2ZpbGVcIjtcbmltcG9ydCB0eXBlIHsgRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWF1dGhcIjtcbmltcG9ydCAqIGFzIGVycm9yVXRpbHMgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvZXJyb3ItdXRpbHNcIjtcbmltcG9ydCAqIGFzIGxvZyBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9sb2dcIjtcbmltcG9ydCAqIGFzIG9iamVjdCBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9vYmplY3RcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MsXG4gIHR5cGUgTW9kZWxNZXRhZGF0YSxcbiAgdHlwZSBNb2RlbFF1ZXJ5LFxuICB0eXBlIFJhbmtlZE1vZGVsLFxuICB0eXBlIFJlc29sdmVkTW9kZWxTZWxlY3Rpb24sXG4gIHR5cGUgUmVzb2x2ZU1vZGVsSW5wdXQsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuXG5pbXBvcnQgeyBub3JtYWxpemVFbmRwb2ludHMgfSBmcm9tIFwiLi9fcmFua2luZy50c1wiO1xuaW1wb3J0IHsgbG9va3VwTW9kZWxzLCByZXNvbHZlTW9kZWwgfSBmcm9tIFwiLi9fc2VsZWN0aW9uLnRzXCI7XG5pbXBvcnQgeyBjaGF0Q29tcGxldGlvbnNVcmwsIGludm9jYXRpb25zVXJsLCByZXNwb25zZXNVcHN0cmVhbVVybCB9IGZyb20gXCIuL2ludm9rZS50c1wiO1xuaW1wb3J0IHsgaHlkcmF0ZU1vZGVsTWV0YWRhdGEsIG1vZGVsTWV0YWRhdGFGb3IgfSBmcm9tIFwiLi9tZXRhZGF0YS50c1wiO1xuaW1wb3J0IHsgbW9kZWxTZXJ2aW5nQXBpIH0gZnJvbSBcIi4vcG9saWN5LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtb2RlbC9jbGllbnRcIik7XG5cbi8qKiBEZWZhdWx0IGxpZmV0aW1lIGZvciBvbmUgbGl2ZSBlbmRwb2ludCBjYXRhbG9ndWUuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NT0RFTF9DTElFTlRfQ0FDSEVfVFRMX01TID0gNSAqIDYwICogMTAwMDtcblxuLyoqIEF1dGhlbnRpY2F0aW9uIG9wdGlvbnMgZXhwb3NlZCBieSB0aGUgcG9ydGFibGUgbW9kZWwgY2xpZW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEF1dGhPcHRpb25zIHtcbiAgLyoqIERhdGFicmlja3MgcHJvZmlsZSBuYW1lLiAqL1xuICBwcm9maWxlPzogc3RyaW5nO1xufVxuXG4vKiogQ29uc3RydWN0aW9uIG9wdGlvbnMgZm9yIHtAbGluayBjcmVhdGVNb2RlbENsaWVudH0uICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ2xpZW50T3B0aW9ucyB7XG4gIC8qKiBEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIGFuZCBwcm9maWxlIHNlbGVjdGlvbiBvcHRpb25zLiAqL1xuICBhdXRoPzogTW9kZWxBdXRoT3B0aW9ucztcbiAgLyoqIEluLW1lbW9yeSBlbmRwb2ludCBjYXRhbG9ndWUgVFRMIGluIG1pbGxpc2Vjb25kcy4gKi9cbiAgY2FjaGVUdGxNcz86IG51bWJlcjtcbiAgLyoqIEh5ZHJhdGUgTm9kZS1vbmx5IG1ldGFkYXRhIGNhY2hlcyBiZWZvcmUgY29uc3RydWN0aW5nIHRoZSBjbGllbnQuICovXG4gIGh5ZHJhdGVNZXRhZGF0YT86IGJvb2xlYW47XG59XG5cbi8qKiBTZWNyZXQtZnJlZSBydW50aW1lIGlkZW50aXR5IGFuZCBjYWNoZSBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbENsaWVudFN0YXR1cyB7XG4gIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJpbmNpcGFsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdvcmtzcGFjZUlkPzogc3RyaW5nO1xuICByZWFkb25seSBjYWNoZVR0bE1zOiBudW1iZXI7XG59XG5cbi8qKiBTZXJ2aW5nIHByb3RvY29sIHNlbGVjdGVkIGZvciBvbmUgcmVzb2x2ZWQgbW9kZWwuICovXG5leHBvcnQgdHlwZSBNb2RlbFByb3RvY29sID0gXCJjaGF0XCIgfCBcInJlc3BvbnNlc1wiIHwgXCJlbWJlZGRpbmdzXCI7XG5cbi8qKiBNb2RlbCBzZWxlY3Rpb24gcGx1cyByb3V0ZSBjb250cm9scy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxSb3V0ZUlucHV0IGV4dGVuZHMgUmVzb2x2ZU1vZGVsSW5wdXQge1xuICAvKiogRm9yY2UgYSBsaXZlIGVuZHBvaW50IGNhdGFsb2d1ZSByZWZyZXNoIGJlZm9yZSBzZWxlY3Rpb24uICovXG4gIHJlZnJlc2g/OiBib29sZWFuO1xuICAvKiogUmVxdWVzdGVkIHVwc3RyZWFtIHByb3RvY29sLiBEZWZhdWx0cyBmcm9tIGVuZHBvaW50IHRhc2sgYW5kIG1vZGVsIHBvbGljeS4gKi9cbiAgcHJvdG9jb2w/OiBNb2RlbFByb3RvY29sO1xuICAvKiogV2hldGhlciBhdXRoZW50aWNhdGlvbiBtYXkgcnVuIGFuIGludGVyYWN0aXZlIGxvZ2luLiAqL1xuICBsb2dpbj86IGJvb2xlYW47XG59XG5cbi8qKiBGdWxseSByZXNvbHZlZCBEYXRhYnJpY2tzIHJvdXRlIGZvciBhIG1vZGVsIHJlcXVlc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUm91dGUge1xuICByZWFkb25seSBtb2RlbElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVuZHBvaW50PzogU2VydmluZ0VuZHBvaW50U3VtbWFyeTtcbiAgcmVhZG9ubHkgc291cmNlOiBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uW1wic291cmNlXCJdO1xuICByZWFkb25seSBwcm90b2NvbDogTW9kZWxQcm90b2NvbDtcbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICByZWFkb25seSBhcGlCYXNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICByZWFkb25seSBoZWFkZXJzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcmVhZG9ubHkgbWV0YWRhdGE6IE1vZGVsTWV0YWRhdGE7XG59XG5cbi8qKiBTdGFibGUgbW9kZWwgZmFjYWRlIHNoYXJlZCBieSBOb2RlIGFuZCBnZW5lcmF0ZWQgbGFuZ3VhZ2UgYmluZGluZ3MuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ2xpZW50IHtcbiAgbGlzdE1vZGVscyhyZWZyZXNoPzogYm9vbGVhbik6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPjtcbiAgc2VhcmNoTW9kZWxzKHF1ZXJ5PzogTW9kZWxRdWVyeSwgcmVmcmVzaD86IGJvb2xlYW4pOiBQcm9taXNlPFJhbmtlZE1vZGVsW10+O1xuICByb3V0ZShpbnB1dD86IE1vZGVsUm91dGVJbnB1dCk6IFByb21pc2U8TW9kZWxSb3V0ZT47XG4gIG1ldGFkYXRhKG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogTW9kZWxNZXRhZGF0YTtcbiAgc3RhdHVzKCk6IE1vZGVsQ2xpZW50U3RhdHVzO1xufVxuXG5pbnRlcmZhY2UgRGF0YWJyaWNrc01vZGVsQ2xpZW50IHtcbiAgcmVhZG9ubHkgYXV0aDogQXV0aENsaWVudDtcbiAgaG9zdCgpOiBzdHJpbmc7XG4gIHByaW5jaXBhbCgpOiBzdHJpbmc7XG4gIHdvcmtzcGFjZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVxdWVzdChwYXRoOiBzdHJpbmcsIGluaXQ/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8dW5rbm93bj47XG59XG5cbmNsYXNzIEF1dGhlbnRpY2F0ZWRNb2RlbENsaWVudCBpbXBsZW1lbnRzIERhdGFicmlja3NNb2RlbENsaWVudCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGF1dGg6IEF1dGhDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmZXRjaGVyOiB0eXBlb2YgZ2xvYmFsVGhpcy5mZXRjaCxcbiAgKSB7fVxuXG4gIGhvc3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLmhvc3Q7XG4gIH1cblxuICBwcmluY2lwYWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLnByaW5jaXBhbDtcbiAgfVxuXG4gIHdvcmtzcGFjZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC53b3Jrc3BhY2VJZDtcbiAgfVxuXG4gIGFzeW5jIHJlcXVlc3QocGF0aDogc3RyaW5nLCBpbml0OiBSZXF1ZXN0SW5pdCA9IHt9KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoLCBgJHt0aGlzLmhvc3QoKS5yZXBsYWNlKC9cXC8kLywgXCJcIil9L2ApLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKGluaXQuaGVhZGVycyk7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF3YWl0IHRoaXMuYXV0aC5oZWFkZXJzKCkpKSB7XG4gICAgICBoZWFkZXJzLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpbml0LmJvZHkgIT09IHVuZGVmaW5lZCAmJiAhaGVhZGVycy5oYXMoXCJjb250ZW50LXR5cGVcIikpIHtcbiAgICAgIGhlYWRlcnMuc2V0KFwiY29udGVudC10eXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICB9XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaGVyKHVybCwgeyAuLi5pbml0LCBoZWFkZXJzIH0pO1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF3YWl0IHRoaXMuYXV0aC5oZWFkZXJzKHsgcmVmcmVzaDogdHJ1ZSB9KSkpIHtcbiAgICAgICAgaGVhZGVycy5zZXQobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoZXIodXJsLCB7IC4uLmluaXQsIGhlYWRlcnMgfSk7XG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIEFQSSAke3BhdGh9IHJldHVybmVkIEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3RleHR9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0ID8gSlNPTi5wYXJzZSh0ZXh0KSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2F0YWxvZ3VlRW50cnkge1xuICByZWFkb25seSBwcm9taXNlOiBQcm9taXNlPHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT47XG4gIGV4cGlyZXNBdDogbnVtYmVyO1xufVxuXG5jb25zdCBjYXRhbG9ndWVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBDYXRhbG9ndWVFbnRyeT4oKTtcblxuY2xhc3MgRGVmYXVsdE1vZGVsQ2xpZW50IGltcGxlbWVudHMgTW9kZWxDbGllbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogRGF0YWJyaWNrc01vZGVsQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FjaGVUdGxNczogbnVtYmVyLFxuICApIHt9XG5cbiAgYXN5bmMgbGlzdE1vZGVscyhyZWZyZXNoID0gZmFsc2UpOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICAgIHJldHVybiBjbG9uZUVuZHBvaW50cyhhd2FpdCB0aGlzLmNhdGFsb2d1ZShyZWZyZXNoKSk7XG4gIH1cblxuICBhc3luYyBzZWFyY2hNb2RlbHMocXVlcnk6IE1vZGVsUXVlcnkgPSB7fSwgcmVmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxSYW5rZWRNb2RlbFtdPiB7XG4gICAgcmV0dXJuIGxvb2t1cE1vZGVscyhhd2FpdCB0aGlzLmNhdGFsb2d1ZShyZWZyZXNoKSwgcXVlcnkpLm1hcCgoeyBlbmRwb2ludCwgLi4ucmFua2VkIH0pID0+ICh7XG4gICAgICAuLi5yYW5rZWQsXG4gICAgICBlbmRwb2ludDogY2xvbmVFbmRwb2ludChlbmRwb2ludCksXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgcm91dGUoaW5wdXQ6IE1vZGVsUm91dGVJbnB1dCA9IHt9KTogUHJvbWlzZTxNb2RlbFJvdXRlPiB7XG4gICAgY29uc3QgeyByZWZyZXNoID0gZmFsc2UsIHByb3RvY29sOiByZXF1ZXN0ZWRQcm90b2NvbCwgbG9naW4sIC4uLnNlbGVjdGlvbiB9ID0gaW5wdXQ7XG4gICAgY29uc3QgZWZmZWN0aXZlU2VsZWN0aW9uID1cbiAgICAgIHJlcXVlc3RlZFByb3RvY29sID09PSBcImVtYmVkZGluZ3NcIiAmJiBzZWxlY3Rpb24ubW9kZWxDbGFzcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8geyAuLi5zZWxlY3Rpb24sIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIH1cbiAgICAgICAgOiBzZWxlY3Rpb247XG4gICAgY29uc3QgY2F0YWxvZ3VlID0gYXdhaXQgdGhpcy5jYXRhbG9ndWUocmVmcmVzaCk7XG4gICAgbGV0IHJlc29sdmVkID0gcmVzb2x2ZU1vZGVsKGNhdGFsb2d1ZSwgZWZmZWN0aXZlU2VsZWN0aW9uKTtcbiAgICBpZiAoaXNVbm1hdGNoZWRFeHBsaWNpdChjYXRhbG9ndWUsIGVmZmVjdGl2ZVNlbGVjdGlvbiwgcmVzb2x2ZWQpKSB7XG4gICAgICByZXNvbHZlZCA9IHJlc29sdmVNb2RlbChhd2FpdCB0aGlzLmNhdGFsb2d1ZSh0cnVlKSwgZWZmZWN0aXZlU2VsZWN0aW9uKTtcbiAgICB9XG4gICAgY29uc3QgZW5kcG9pbnQgPSAoYXdhaXQgdGhpcy5jYXRhbG9ndWUoZmFsc2UpKS5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IHJlc29sdmVkLm1vZGVsSWQsXG4gICAgKTtcbiAgICBjb25zdCBwcm90b2NvbCA9IHJlcXVlc3RlZFByb3RvY29sID8/IGluZmVyUHJvdG9jb2woZW5kcG9pbnQsIHJlc29sdmVkLm1vZGVsSWQpO1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmNsaWVudC5ob3N0KCk7XG4gICAgY29uc3QgdXJsID0gcm91dGVVcmwoaG9zdCwgcmVzb2x2ZWQubW9kZWxJZCwgcHJvdG9jb2wpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLmNsaWVudC5hdXRoLmhlYWRlcnMoeyBsb2dpbiB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxJZDogcmVzb2x2ZWQubW9kZWxJZCxcbiAgICAgIC4uLihlbmRwb2ludCA/IHsgZW5kcG9pbnQ6IGNsb25lRW5kcG9pbnQoZW5kcG9pbnQpIH0gOiB7fSksXG4gICAgICBzb3VyY2U6IHJlc29sdmVkLnNvdXJjZSxcbiAgICAgIHByb3RvY29sLFxuICAgICAgaG9zdCxcbiAgICAgIGFwaUJhc2U6IG5ldyBVUkwoXCJzZXJ2aW5nLWVuZHBvaW50c1wiLCBgJHtob3N0LnJlcGxhY2UoL1xcLyQvLCBcIlwiKX0vYCkudG9TdHJpbmcoKSxcbiAgICAgIHVybCxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRhZGF0YTogbW9kZWxNZXRhZGF0YUZvcihlbmRwb2ludCA/PyByZXNvbHZlZC5tb2RlbElkKSxcbiAgICB9O1xuICB9XG5cbiAgbWV0YWRhdGEobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbE1ldGFkYXRhIHtcbiAgICByZXR1cm4gbW9kZWxNZXRhZGF0YUZvcihtb2RlbCk7XG4gIH1cblxuICBzdGF0dXMoKTogTW9kZWxDbGllbnRTdGF0dXMge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4odGhpcy5jbGllbnQuYXV0aC5wcm9maWxlID8geyBwcm9maWxlOiB0aGlzLmNsaWVudC5hdXRoLnByb2ZpbGUgfSA6IHt9KSxcbiAgICAgIGhvc3Q6IHRoaXMuY2xpZW50Lmhvc3QoKSxcbiAgICAgIHByaW5jaXBhbDogdGhpcy5jbGllbnQucHJpbmNpcGFsKCksXG4gICAgICAuLi4odGhpcy5jbGllbnQud29ya3NwYWNlSWQoKSA/IHsgd29ya3NwYWNlSWQ6IHRoaXMuY2xpZW50LndvcmtzcGFjZUlkKCkgfSA6IHt9KSxcbiAgICAgIGNhY2hlVHRsTXM6IHRoaXMuY2FjaGVUdGxNcyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYXRhbG9ndWUocmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8cmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gICAgY29uc3Qga2V5ID0gY2F0YWxvZ3VlS2V5KHRoaXMuY2xpZW50KTtcbiAgICBpZiAocmVmcmVzaCkgY2F0YWxvZ3VlQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgY29uc3QgY3VycmVudCA9IGNhdGFsb2d1ZUNhY2hlLmdldChrZXkpO1xuICAgIGlmIChjdXJyZW50ICYmIERhdGUubm93KCkgPCBjdXJyZW50LmV4cGlyZXNBdCkgcmV0dXJuIGN1cnJlbnQucHJvbWlzZTtcbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5mZXRjaENhdGFsb2d1ZSgpO1xuICAgIGNvbnN0IGVudHJ5OiBDYXRhbG9ndWVFbnRyeSA9IHsgcHJvbWlzZSwgZXhwaXJlc0F0OiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfTtcbiAgICBjYXRhbG9ndWVDYWNoZS5zZXQoa2V5LCBlbnRyeSk7XG4gICAgdm9pZCBwcm9taXNlLnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGVudHJ5LmV4cGlyZXNBdCA9IERhdGUubm93KCkgKyB0aGlzLmNhY2hlVHRsTXM7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAoY2F0YWxvZ3VlQ2FjaGUuZ2V0KGtleSkgPT09IGVudHJ5KSBjYXRhbG9ndWVDYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hDYXRhbG9ndWUoKTogUHJvbWlzZTxyZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucmVxdWVzdChcIi9hcGkvMi4wL3NlcnZpbmctZW5kcG9pbnRzXCIpO1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHJlc3BvbnNlKSB8fCAhQXJyYXkuaXNBcnJheShyZXNwb25zZS5lbmRwb2ludHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhYnJpY2tzIHNlcnZpbmctZW5kcG9pbnRzIHJlc3BvbnNlIGlzIG1pc3NpbmcgYW4gZW5kcG9pbnRzIGFycmF5XCIpO1xuICAgIH1cbiAgICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCB0aGlzLm1lYXN1cmVFbWJlZGRpbmdEaW1lbnNpb25zKG5vcm1hbGl6ZUVuZHBvaW50cyhyZXNwb25zZS5lbmRwb2ludHMpKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0ZWRcIiwge1xuICAgICAgY291bnQ6IGVuZHBvaW50cy5sZW5ndGgsXG4gICAgICBob3N0OiB0aGlzLmNsaWVudC5ob3N0KCksXG4gICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgfSk7XG4gICAgcmV0dXJuIGVuZHBvaW50cztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWVhc3VyZUVtYmVkZGluZ0RpbWVuc2lvbnMoXG4gICAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gICk6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgZW5kcG9pbnRzLm1hcChhc3luYyAoZW5kcG9pbnQpID0+IHtcbiAgICAgICAgaWYgKGVuZHBvaW50LmNsYXNzICE9PSBNb2RlbENsYXNzLkVtYmVkZGluZyB8fCBlbmRwb2ludC5kaW1lbnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBlbmRwb2ludDtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucmVxdWVzdChcbiAgICAgICAgICAgIGAvc2VydmluZy1lbmRwb2ludHMvJHtlbmNvZGVVUklDb21wb25lbnQoZW5kcG9pbnQubmFtZSl9L2ludm9jYXRpb25zYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpbnB1dDogW1wicGluZ1wiXSB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBkaW1lbnNpb24gPSBlbWJlZGRpbmdEaW1lbnNpb24ocmVzcG9uc2UpO1xuICAgICAgICAgIHJldHVybiBkaW1lbnNpb24gPT09IHVuZGVmaW5lZCA/IGVuZHBvaW50IDogeyAuLi5lbmRwb2ludCwgZGltZW5zaW9uIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oXCJlbWJlZGRpbmcgZGltZW5zaW9uIHByb2JlIGZhaWxlZFwiLCB7XG4gICAgICAgICAgICBtb2RlbDogZW5kcG9pbnQubmFtZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyb3IpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBlbmRwb2ludDtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWJlZGRpbmdEaW1lbnNpb24odmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkodmFsdWUuZGF0YSkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpcnN0ID0gdmFsdWUuZGF0YVswXTtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQoZmlyc3QpIHx8ICFBcnJheS5pc0FycmF5KGZpcnN0LmVtYmVkZGluZykpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBmaXJzdC5lbWJlZGRpbmcubGVuZ3RoID4gMCA/IGZpcnN0LmVtYmVkZGluZy5sZW5ndGggOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBDcmVhdGUgYW4gYXV0aGVudGljYXRpb24tYXdhcmUgRGF0YWJyaWNrcyBtb2RlbCBjbGllbnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTW9kZWxDbGllbnQob3B0aW9uczogTW9kZWxDbGllbnRPcHRpb25zID0ge30pOiBQcm9taXNlPE1vZGVsQ2xpZW50PiB7XG4gIGNvbnN0IGNhY2hlVHRsTXMgPSB2YWxpZGF0ZUNhY2hlVHRsKG9wdGlvbnMuY2FjaGVUdGxNcyk7XG4gIGlmIChvcHRpb25zLmh5ZHJhdGVNZXRhZGF0YSA/PyB0cnVlKSBhd2FpdCBoeWRyYXRlTW9kZWxNZXRhZGF0YSgpO1xuICByZXR1cm4gbmV3IERlZmF1bHRNb2RlbENsaWVudChcbiAgICBuZXcgQXV0aGVudGljYXRlZE1vZGVsQ2xpZW50KGF3YWl0IGNyZWF0ZUF1dGhDbGllbnQob3B0aW9ucy5hdXRoKSwgZ2xvYmFsVGhpcy5mZXRjaCksXG4gICAgY2FjaGVUdGxNcyxcbiAgKTtcbn1cblxuLyoqIExpc3QgY29uZmlndXJlZCBEYXRhYnJpY2tzIHByb2ZpbGVzIG91dHNpZGUgdGhlIG1vZGVsIGNsaWVudCBmYWNhZGUuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFByb2ZpbGVzKHJlZnJlc2ggPSBmYWxzZSk6IERhdGFicmlja3NQcm9maWxlU3VtbWFyeVtdIHtcbiAgcmV0dXJuIGxpc3RBdXRoUHJvZmlsZXMoeyByZWZyZXNoIH0pO1xufVxuXG4vKiogQGludGVybmFsIENvbnN0cnVjdCBhIG1vZGVsIGNsaWVudCBhcm91bmQgYSB0ZXN0IG9yIGhvc3Qtb3duZWQgRGF0YWJyaWNrcyBjbGllbnQuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxDbGllbnRXaXRoRGF0YWJyaWNrc0NsaWVudChcbiAgY2xpZW50OiBEYXRhYnJpY2tzTW9kZWxDbGllbnQsXG4gIGNhY2hlVHRsTXMgPSBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMsXG4pOiBNb2RlbENsaWVudCB7XG4gIHJldHVybiBuZXcgRGVmYXVsdE1vZGVsQ2xpZW50KGNsaWVudCwgdmFsaWRhdGVDYWNoZVR0bChjYWNoZVR0bE1zKSk7XG59XG5cbi8qKiBAaW50ZXJuYWwgQ3JlYXRlIGEgbW9kZWwgY2xpZW50IHdpdGggaW5qZWN0YWJsZSBhdXRoIGhvc3QgY2FwYWJpbGl0aWVzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1vZGVsQ2xpZW50V2l0aERlcGVuZGVuY2llcyhcbiAgb3B0aW9uczogTW9kZWxDbGllbnRPcHRpb25zLFxuICBkZXBlbmRlbmNpZXM6IERhdGFicmlja3NBdXRoRGVwZW5kZW5jaWVzLFxuKTogUHJvbWlzZTxNb2RlbENsaWVudD4ge1xuICBpZiAob3B0aW9ucy5oeWRyYXRlTWV0YWRhdGEgPz8gdHJ1ZSkgYXdhaXQgaHlkcmF0ZU1vZGVsTWV0YWRhdGEoKTtcbiAgcmV0dXJuIG5ldyBEZWZhdWx0TW9kZWxDbGllbnQoXG4gICAgbmV3IEF1dGhlbnRpY2F0ZWRNb2RlbENsaWVudChcbiAgICAgIGF3YWl0IGNyZWF0ZUF1dGhDbGllbnQob3B0aW9ucy5hdXRoLCBkZXBlbmRlbmNpZXMpLFxuICAgICAgZGVwZW5kZW5jaWVzLmZldGNoID8/IGdsb2JhbFRoaXMuZmV0Y2gsXG4gICAgKSxcbiAgICB2YWxpZGF0ZUNhY2hlVHRsKG9wdGlvbnMuY2FjaGVUdGxNcyksXG4gICk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2FjaGVUdGwodmFsdWUgPSBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMpOiBudW1iZXIge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgdmFsdWUgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk1vZGVsIGNsaWVudCBjYWNoZVR0bE1zIG11c3QgYmUgYSBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyXCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2F0YWxvZ3VlS2V5KGNsaWVudDogRGF0YWJyaWNrc01vZGVsQ2xpZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIFtjbGllbnQuaG9zdCgpLCBjbGllbnQud29ya3NwYWNlSWQoKSA/PyBcIlwiLCBjbGllbnQucHJpbmNpcGFsKCldLmpvaW4oXCJcXHUwMDAwXCIpO1xufVxuXG5mdW5jdGlvbiBpbmZlclByb3RvY29sKFxuICBlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSB8IHVuZGVmaW5lZCxcbiAgbW9kZWxJZDogc3RyaW5nLFxuKTogTW9kZWxQcm90b2NvbCB7XG4gIGlmIChlbmRwb2ludD8udGFzayA9PT0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiKSByZXR1cm4gXCJlbWJlZGRpbmdzXCI7XG4gIHJldHVybiBtb2RlbFNlcnZpbmdBcGkobW9kZWxJZCk7XG59XG5cbmZ1bmN0aW9uIHJvdXRlVXJsKGhvc3Q6IHN0cmluZywgbW9kZWxJZDogc3RyaW5nLCBwcm90b2NvbDogTW9kZWxQcm90b2NvbCk6IHN0cmluZyB7XG4gIGlmIChwcm90b2NvbCA9PT0gXCJyZXNwb25zZXNcIikgcmV0dXJuIHJlc3BvbnNlc1Vwc3RyZWFtVXJsKGhvc3QsIG1vZGVsSWQpO1xuICBpZiAocHJvdG9jb2wgPT09IFwiY2hhdFwiICYmIG1vZGVsU2VydmluZ0FwaShtb2RlbElkKSA9PT0gXCJyZXNwb25zZXNcIikge1xuICAgIHJldHVybiBjaGF0Q29tcGxldGlvbnNVcmwoaG9zdCk7XG4gIH1cbiAgcmV0dXJuIGludm9jYXRpb25zVXJsKGhvc3QsIG1vZGVsSWQpO1xufVxuXG5mdW5jdGlvbiBpc1VubWF0Y2hlZEV4cGxpY2l0KFxuICBjYXRhbG9ndWU6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgaW5wdXQ6IFJlc29sdmVNb2RlbElucHV0LFxuICByZXNvbHZlZDogUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbixcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlucHV0LmV4cGxpY2l0ICE9PSB1bmRlZmluZWQgJiZcbiAgICBpbnB1dC5mdXp6eSAhPT0gZmFsc2UgJiZcbiAgICByZXNvbHZlZC5tb2RlbElkID09PSBpbnB1dC5leHBsaWNpdCAmJlxuICAgICFjYXRhbG9ndWUuc29tZSgoZW5kcG9pbnQpID0+IGVuZHBvaW50Lm5hbWUgPT09IGlucHV0LmV4cGxpY2l0KVxuICApO1xufVxuXG5mdW5jdGlvbiBjbG9uZUVuZHBvaW50cyhlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSk6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSB7XG4gIHJldHVybiBlbmRwb2ludHMubWFwKGNsb25lRW5kcG9pbnQpO1xufVxuXG5mdW5jdGlvbiBjbG9uZUVuZHBvaW50KGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogU2VydmluZ0VuZHBvaW50U3VtbWFyeSB7XG4gIHJldHVybiB7XG4gICAgLi4uZW5kcG9pbnQsXG4gICAgLi4uKGVuZHBvaW50LnByb2ZpbGUgPyB7IHByb2ZpbGU6IHsgLi4uZW5kcG9pbnQucHJvZmlsZSB9IH0gOiB7fSksXG4gICAgLi4uKGVuZHBvaW50LnNlcnZpY2VOYW1lcyA/IHsgc2VydmljZU5hbWVzOiB7IC4uLmVuZHBvaW50LnNlcnZpY2VOYW1lcyB9IH0gOiB7fSksXG4gICAgLi4uKGVuZHBvaW50LnJlYXNvbmluZ0VmZm9ydHMgPyB7IHJlYXNvbmluZ0VmZm9ydHM6IFsuLi5lbmRwb2ludC5yZWFzb25pbmdFZmZvcnRzXSB9IDoge30pLFxuICAgIC4uLihlbmRwb2ludC5zdGF0dXMgPyB7IHN0YXR1czogeyAuLi5lbmRwb2ludC5zdGF0dXMgfSB9IDoge30pLFxuICB9O1xufVxuIl19
@@ -1 +1 @@
1
- {"root":["../src/_metadata-contract.ts","../src/_metadata-generator.ts","../src/_ranking.ts","../src/_retirement.ts","../src/_selection.ts","../src/bindings.ts","../src/classes.ts","../src/classify.ts","../src/fallback.ts","../src/invoke.ts","../src/metadata-cache.ts","../src/metadata.ts","../src/model-catalog.ts","../src/model-client.ts","../src/policy.ts","../src/reasoning-translation.ts","../src/resolve.ts","../scripts/generate-metadata.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/_cache.ts","../src/_metadata-contract.ts","../src/_metadata-generator.ts","../src/_ranking.ts","../src/_retirement.ts","../src/_selection.ts","../src/bindings.ts","../src/classes.ts","../src/classify.ts","../src/fallback.ts","../src/invoke.ts","../src/metadata-cache.ts","../src/metadata.ts","../src/model-catalog.ts","../src/model-client.ts","../src/policy.ts","../src/reasoning-translation.ts","../src/resolve.ts","../scripts/generate-metadata.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -20,20 +20,18 @@
20
20
  "projen": "projen"
21
21
  },
22
22
  "devDependencies": {
23
- "@types/cacache": "^20.0.1",
24
23
  "@types/node": "^24.6.0",
25
24
  "typescript": "^5.9.3"
26
25
  },
27
26
  "dependencies": {
28
27
  "@databricks/appkit": "0.81.0",
29
- "@dbx-tools/appkit": "^0.9.118",
30
- "@dbx-tools/auth": "^0.9.118",
31
- "@dbx-tools/shared-auth": "^0.9.118",
32
- "@dbx-tools/shared-core": "^0.9.118",
33
- "@dbx-tools/shared-model": "^0.9.118",
34
- "cacache": "^21.0.1",
28
+ "@dbx-tools/appkit": "^0.9.120",
29
+ "@dbx-tools/auth": "^0.9.120",
30
+ "@dbx-tools/cache": "^0.9.120",
31
+ "@dbx-tools/shared-auth": "^0.9.120",
32
+ "@dbx-tools/shared-core": "^0.9.120",
33
+ "@dbx-tools/shared-model": "^0.9.120",
35
34
  "cheerio": "^1.2.0",
36
- "env-paths": "^4.0.0",
37
35
  "fuse.js": "^7.4.2"
38
36
  },
39
37
  "main": "./lib/index.js",
@@ -102,7 +100,7 @@
102
100
  "./package.json": "./package.json"
103
101
  }
104
102
  },
105
- "version": "0.9.118",
103
+ "version": "0.9.120",
106
104
  "types": "./lib/index.d.ts",
107
105
  "dbxToolsConfig": {
108
106
  "tags": [
package/src/_cache.ts ADDED
@@ -0,0 +1,13 @@
1
+ import { projectCache } from "@dbx-tools/cache/cache";
2
+
3
+ /** Memory-first cache for endpoint catalogues, isolated for full invalidation. */
4
+ export const modelCatalogueCache = projectCache("model-catalog", {
5
+ maxEntries: 256,
6
+ useClone: false,
7
+ });
8
+
9
+ /** One memory-first project cache shared by every model metadata key. */
10
+ export const modelMetadataCache = projectCache("model-metadata", {
11
+ maxEntries: 256,
12
+ useClone: false,
13
+ });
@@ -1,72 +1,30 @@
1
1
  /**
2
- * Agnostic daily metadata cache on {@link https://www.npmjs.com/package/cacache | cacache}.
3
- *
4
- * Uses cacache's built-in memory memoization (`memoize: true` on put; gets read
5
- * the in-memory layer by default) with content-addressed disk under
6
- * `env-paths("dbx-tools").cache/model-gateway/<version>/`. Disk persistence is
7
- * disabled inside a Databricks App ({@link environmentUtils.isDatabricksAppEnv});
8
- * those processes keep a process-local Map only.
9
- *
10
- * Each cache owns a key, hard-coded fallback, optional network loader, and a
11
- * merger that combines fresh / previous / fallback values. Freshness is the
12
- * envelope `refreshedAt` window (default one day), not cacache's short LRU TTL.
2
+ * Daily model metadata cache built on the shared memory-first cache package.
13
3
  *
14
4
  * @module
15
5
  */
16
6
 
17
- import { resolve } from "node:path";
18
-
19
- import * as environmentUtils from "@dbx-tools/shared-core/environment-utils";
7
+ import { createCache, getOrSet } from "@dbx-tools/cache/cache";
8
+ import * as errorUtils from "@dbx-tools/shared-core/error-utils";
20
9
  import * as log from "@dbx-tools/shared-core/log";
21
- import cacache from "cacache";
22
- import envPaths from "env-paths";
23
10
 
24
- import packageManifest from "../package.json" with { type: "json" };
11
+ import { modelMetadataCache } from "./_cache.ts";
25
12
  import { MODEL_METADATA_TTL_MS } from "./_metadata-contract.ts";
26
13
 
27
14
  const logger = log.logger("model/metadata-cache");
28
15
 
29
- interface PackageIdentity {
30
- readonly identifier: string;
31
- readonly version: string;
32
- }
33
-
34
- const PACKAGE_IDENTITY: PackageIdentity = {
35
- identifier: packageManifest.name,
36
- version: packageManifest.version,
37
- };
38
-
39
- /** Envelope stored as JSON bytes in cacache for every key. */
40
- export interface MetadataCacheRecord<T> {
41
- readonly refreshedAt: number;
42
- readonly value: T;
43
- }
44
-
45
16
  /** Factory inputs for one named metadata cache. */
46
17
  export interface MetadataCacheOptions<T> {
47
- /** Stable cacache key. */
18
+ /** Stable cache key. */
48
19
  readonly key: string;
49
20
  /** Hard-coded / committed baseline used when store and load both miss. */
50
21
  readonly fallback: T;
51
- /**
52
- * Refresh source. When omitted the cache only serves store + fallback and
53
- * {@link MetadataCache.update} mutations (for example error-learned values).
54
- */
22
+ /** Optional refresh source. */
55
23
  readonly load?: () => Promise<T>;
56
24
  /** Combine a fresh load, prior store value, and the hard-coded fallback. */
57
25
  readonly merge: (input: MetadataCacheMergeInput<T>) => T;
58
- /** Freshness window; defaults to {@link MODEL_METADATA_TTL_MS} (one day). */
26
+ /** Freshness window; defaults to one day. */
59
27
  readonly ttlMs?: number;
60
- /** Package version segment in the cache path. Defaults to this package. */
61
- readonly version?: string;
62
- /** Override the cacache root directory (tests). */
63
- readonly cacheDir?: string;
64
- /**
65
- * Force disk on/off. Defaults to off inside Databricks Apps, on otherwise.
66
- */
67
- readonly disk?: boolean;
68
- /** Clock override for tests. */
69
- readonly now?: () => number;
70
28
  }
71
29
 
72
30
  /** Arguments passed to a cache merger. */
@@ -76,15 +34,11 @@ export interface MetadataCacheMergeInput<T> {
76
34
  readonly fallback: T;
77
35
  }
78
36
 
79
- /** One versioned metadata cache (cacache memory + optional disk). */
37
+ /** One namespaced view over the shared metadata cache. */
80
38
  export interface MetadataCache<T> {
81
- /** Absolute cacache root for this package version (unused when disk is off). */
82
- readonly path: string;
83
- /** Whether cacache disk persistence is enabled for this instance. */
84
- readonly diskEnabled: boolean;
85
39
  /** Return a fresh-or-fallback value, refreshing when stale. */
86
40
  get(): Promise<T>;
87
- /** Read memory / disk without refreshing. */
41
+ /** Read process memory without refreshing. */
88
42
  peek(): Promise<T | undefined>;
89
43
  /** Mutate the cached value and persist it. */
90
44
  update(mutator: (current: T) => T): Promise<T>;
@@ -92,161 +46,65 @@ export interface MetadataCache<T> {
92
46
  refresh(): Promise<T>;
93
47
  }
94
48
 
95
- const inflight = new Map<string, Promise<unknown>>();
96
-
97
- /** Default cacache root for a package version under the dbx-tools cache dir. */
98
- export function defaultMetadataCacheDir(version: string): string {
99
- const cacheDirectory = envPaths("dbx-tools", { suffix: "" }).cache;
100
- return resolve(cacheDirectory, "model-gateway", version);
101
- }
102
-
103
- /** Whether metadata caches should persist to disk in this process. */
104
- export function metadataCacheDiskEnabled(environment: NodeJS.ProcessEnv = process.env): boolean {
105
- return !environmentUtils.isDatabricksAppEnv(environment);
106
- }
107
-
108
- /**
109
- * Create one daily cache backed by cacache memoization, with optional disk.
110
- */
111
- export function createMetadataCache<T>(options: MetadataCacheOptions<T>): MetadataCache<T> {
49
+ /** Create one namespaced view over the shared model metadata cache. */
50
+ export function createMetadataCache<T>(
51
+ options: MetadataCacheOptions<T>,
52
+ cache: ReturnType<typeof createCache> = modelMetadataCache,
53
+ ): MetadataCache<T> {
112
54
  const ttlMs = options.ttlMs ?? MODEL_METADATA_TTL_MS;
113
- const diskEnabled = options.disk ?? metadataCacheDiskEnabled();
114
- const now = options.now ?? Date.now;
115
- const pathPromise = resolveCacheDir(options);
116
- let path = options.cacheDir;
117
-
118
- const flightKey = (cachePath: string, suffix = ""): string =>
119
- `${cachePath}::${options.key}${suffix}`;
120
-
121
- /** Process-local store used when disk is off (Databricks Apps). */
122
- const memoryOnly = new Map<string, MetadataCacheRecord<T>>();
123
-
124
- const resolveValue = (input: MetadataCacheMergeInput<T>): T => options.merge(input);
125
-
126
- const isFresh = (record: MetadataCacheRecord<T> | undefined): boolean =>
127
- Boolean(record && now() - record.refreshedAt < ttlMs);
128
-
129
- const cachePath = async (): Promise<string> => {
130
- path ??= await pathPromise;
131
- return path;
132
- };
55
+ const valueKey = `model-metadata:value:${options.key}`;
56
+ const refreshKey = `model-metadata:refresh:${options.key}`;
133
57
 
134
- const readRecord = async (): Promise<MetadataCacheRecord<T> | undefined> => {
135
- if (!diskEnabled) return memoryOnly.get(options.key);
136
- const resolvedPath = await cachePath();
137
- try {
138
- // cacache reads its in-memory memo first unless memoize is false
139
- const entry = await cacache.get(resolvedPath, options.key);
140
- return decodeRecord<T>(entry.data);
141
- } catch (error) {
142
- if (isCacheMiss(error)) return undefined;
143
- logger.warn("metadata cache cacache read failed", {
144
- key: options.key,
145
- path: resolvedPath,
146
- error,
147
- });
148
- return undefined;
149
- }
150
- };
151
-
152
- const writeRecord = async (record: MetadataCacheRecord<T>): Promise<void> => {
153
- if (!diskEnabled) {
154
- memoryOnly.set(options.key, record);
155
- return;
156
- }
157
- const resolvedPath = await cachePath();
158
- try {
159
- await cacache.put(resolvedPath, options.key, `${JSON.stringify(record)}\n`, {
160
- memoize: true,
161
- metadata: { refreshedAt: record.refreshedAt },
162
- });
163
- } catch (error) {
164
- logger.warn("metadata cache cacache write failed", {
165
- key: options.key,
166
- path: resolvedPath,
167
- error,
168
- });
169
- }
170
- };
171
-
172
- const persist = async (value: T, refreshedAt = now()): Promise<T> => {
173
- await writeRecord({ refreshedAt, value });
58
+ const read = (): Promise<T | undefined> => cache.get<T>(valueKey);
59
+ const persist = async (value: T): Promise<T> => {
60
+ await cache.set(valueKey, value);
174
61
  return value;
175
62
  };
63
+ const resolveValue = (fresh: T | undefined, previous: T | undefined): T =>
64
+ options.merge({ fresh, previous, fallback: options.fallback });
176
65
 
177
66
  const refresh = async (force: boolean): Promise<T> => {
178
- const resolvedPath = await cachePath();
179
- return coalesce(flightKey(resolvedPath), async () => {
180
- const previous = await readRecord();
181
- if (!force && isFresh(previous)) {
182
- return resolveValue({
183
- fresh: undefined,
184
- previous: previous?.value,
185
- fallback: options.fallback,
186
- });
187
- }
188
-
189
- let fresh: T | undefined;
190
- if (options.load) {
191
- try {
192
- fresh = await options.load();
193
- } catch (error) {
194
- logger.warn("metadata cache refresh failed; keeping last known good", {
195
- key: options.key,
196
- error,
197
- path: resolvedPath,
198
- diskEnabled,
199
- });
67
+ if (force) await cache.delete(refreshKey);
68
+ let staleRefreshFailed = false;
69
+ await getOrSet(
70
+ cache,
71
+ refreshKey,
72
+ async () => {
73
+ const previous = await read();
74
+ let fresh: T | undefined;
75
+ if (options.load) {
76
+ try {
77
+ fresh = await options.load();
78
+ } catch (error) {
79
+ logger.warn("metadata cache refresh failed; using cached or committed value", {
80
+ key: options.key,
81
+ error: errorUtils.toError(error),
82
+ });
83
+ staleRefreshFailed = previous !== undefined;
84
+ }
200
85
  }
201
- }
202
-
203
- const value = resolveValue({
204
- fresh,
205
- previous: previous?.value,
206
- fallback: options.fallback,
207
- });
208
- if (fresh !== undefined || !previous) {
209
- await persist(value);
210
- }
211
- return value;
212
- });
86
+ const resolved = resolveValue(fresh, previous);
87
+ if (fresh !== undefined || previous === undefined) await persist(resolved);
88
+ return true;
89
+ },
90
+ { ttl: ttlMs, throwErrors: true },
91
+ );
92
+ if (staleRefreshFailed) await cache.delete(refreshKey);
93
+ return resolveValue(undefined, await read());
213
94
  };
214
95
 
215
96
  return {
216
- get path() {
217
- if (!path) {
218
- throw new Error("metadata cache path is not resolved until the first cache read");
219
- }
220
- return path;
221
- },
222
- diskEnabled,
223
97
  get: () => refresh(false),
224
- peek: async () => (await readRecord())?.value,
98
+ peek: read,
225
99
  refresh: () => refresh(true),
226
100
  update: async (mutator) => {
227
- const resolvedPath = await cachePath();
228
- return coalesce(flightKey(resolvedPath, ":update"), async () => {
229
- const previous = await readRecord();
230
- const baseline = resolveValue({
231
- fresh: undefined,
232
- previous: previous?.value,
233
- fallback: options.fallback,
234
- });
235
- return persist(mutator(baseline));
236
- });
101
+ const value = await persist(mutator(resolveValue(undefined, await read())));
102
+ await cache.set(refreshKey, true, { ttl: ttlMs });
103
+ return value;
237
104
  },
238
105
  };
239
106
  }
240
107
 
241
- async function resolveCacheDir(options: {
242
- readonly cacheDir?: string;
243
- readonly version?: string;
244
- }): Promise<string> {
245
- if (options.cacheDir) return options.cacheDir;
246
- const version = options.version ?? PACKAGE_IDENTITY.version;
247
- return defaultMetadataCacheDir(version);
248
- }
249
-
250
108
  /** Prefer a non-empty fresh array, else previous, else fallback. */
251
109
  export function mergePreferFreshList<T>(input: MetadataCacheMergeInput<readonly T[]>): T[] {
252
110
  if (input.fresh && input.fresh.length > 0) return [...input.fresh];
@@ -254,10 +112,7 @@ export function mergePreferFreshList<T>(input: MetadataCacheMergeInput<readonly
254
112
  return [...input.fallback];
255
113
  }
256
114
 
257
- /**
258
- * Shallow-merge record catalogues: fallback, then previous, then fresh keys.
259
- * Fresh values win per key.
260
- */
115
+ /** Shallow-merge record catalogues: fallback, then previous, then fresh keys. */
261
116
  export function mergePreferFreshRecord<T>(
262
117
  input: MetadataCacheMergeInput<Readonly<Record<string, T>>>,
263
118
  ): Record<string, T> {
@@ -267,51 +122,3 @@ export function mergePreferFreshRecord<T>(
267
122
  ...(input.fresh ?? {}),
268
123
  };
269
124
  }
270
-
271
- /** Test helper: wipe a cacache root and clear cacache memoization. */
272
- export async function resetMetadataCacheDir(cacheDir: string): Promise<void> {
273
- try {
274
- await cacache.rm.all(cacheDir);
275
- } catch {
276
- // empty / missing cache is fine
277
- }
278
- cacache.clearMemoized();
279
- for (const key of [...inflight.keys()]) {
280
- if (key.startsWith(`${cacheDir}::`)) inflight.delete(key);
281
- }
282
- }
283
-
284
- function coalesce<T>(key: string, work: () => Promise<T>): Promise<T> {
285
- const existing = inflight.get(key);
286
- if (existing) return existing as Promise<T>;
287
- const pending = work().finally(() => {
288
- if (inflight.get(key) === pending) inflight.delete(key);
289
- });
290
- inflight.set(key, pending);
291
- return pending;
292
- }
293
-
294
- function decodeRecord<T>(data: Buffer): MetadataCacheRecord<T> | undefined {
295
- try {
296
- const parsed = JSON.parse(data.toString("utf8")) as unknown;
297
- if (
298
- !parsed ||
299
- typeof parsed !== "object" ||
300
- typeof (parsed as MetadataCacheRecord<T>).refreshedAt !== "number"
301
- ) {
302
- return undefined;
303
- }
304
- return parsed as MetadataCacheRecord<T>;
305
- } catch {
306
- return undefined;
307
- }
308
- }
309
-
310
- function isCacheMiss(error: unknown): boolean {
311
- return Boolean(
312
- error &&
313
- typeof error === "object" &&
314
- "code" in error &&
315
- (error as { code?: string }).code === "ENOENT",
316
- );
317
- }
package/src/metadata.ts CHANGED
@@ -4,9 +4,10 @@
4
4
  * docs and error-learned reasoning ladders.
5
5
  *
6
6
  * Committed snapshots seed every process. {@link refreshModelMetadata} pulls
7
- * documentation through {@link createMetadataCache} (cacache memoize + disk) and
7
+ * documentation through the shared memory-first {@link createMetadataCache} and
8
8
  * rebuilds the in-memory index. Error-learned efforts use the same store via
9
- * {@link rememberReasoningLevels}. Disk writes are skipped in Databricks Apps.
9
+ * {@link rememberReasoningLevels}. Known-good values are written behind to the
10
+ * shared model project cache.
10
11
  *
11
12
  * @module
12
13
  */
@@ -251,7 +252,7 @@ export async function refreshModelMetadata(): Promise<MetadataIndex> {
251
252
  return refreshInflight;
252
253
  }
253
254
 
254
- /** Load cacache / memory entries without forcing a network refresh. */
255
+ /** Load shared cache entries without forcing a network refresh. */
255
256
  export async function hydrateModelMetadata(): Promise<MetadataIndex> {
256
257
  const [retiredNames, capabilities, rateLimits, reasoning, learnedReasoning] = await Promise.all([
257
258
  peekOrFallback(retiredCache, COMMITTED_RETIRED_MODELS),
@@ -276,11 +277,6 @@ async function peekOrFallback<T>(cache: MetadataCache<T>, fallback: T): Promise<
276
277
  return cache.get().catch(() => fallback);
277
278
  }
278
279
 
279
- /** Absolute cacache root used by the documentation / learned caches. */
280
- export function modelMetadataCachePath(): string {
281
- return retiredCache.path;
282
- }
283
-
284
280
  export { modelStatusFor, retiredModelNames } from "./_retirement.ts";
285
281
 
286
282
  /** Return the committed reasoning-effort catalogue. Cached per process. */
@@ -288,7 +284,7 @@ export function reasoningModelCatalogue(): ReasoningModelCatalogue {
288
284
  return metadataIndex().reasoning;
289
285
  }
290
286
 
291
- /** Return error-learned reasoning ladders persisted in the metadata cache. */
287
+ /** Return error-learned reasoning ladders from the shared model cache. */
292
288
  export function learnedReasoningCatalogue(): ReasoningModelCatalogue {
293
289
  return metadataIndex().learnedReasoning;
294
290
  }
@@ -324,7 +320,7 @@ export async function rememberReasoningLevels(
324
320
  *
325
321
  * Accepts the same nested Databricks envelopes as {@link parseReasoningLevels}.
326
322
  * Returns the levels that were stored (or the current lookup when parse yields
327
- * nothing). The raw error body is never written to disk.
323
+ * nothing). The raw error body is never cached.
328
324
  */
329
325
  export async function learnReasoningLevelsFromError(
330
326
  model: string,