@dbx-tools/appkit-mastra 0.9.153 → 0.9.157
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/index.ts +32 -24
- package/lib/index.d.ts +32 -24
- package/lib/index.js +32 -23
- package/lib/src/agents.d.ts +5 -6
- package/lib/src/agents.js +12 -15
- package/lib/src/chart.js +33 -33
- package/lib/src/chat.js +10 -13
- package/lib/src/config.d.ts +12 -13
- package/lib/src/config.js +4 -4
- package/lib/src/evaluation.js +7 -9
- package/lib/src/feedback-mode.d.ts +1 -1
- package/lib/src/feedback-mode.js +1 -1
- package/lib/src/filesystems.js +6 -6
- package/lib/src/follow-up-suggestions.js +10 -10
- package/lib/src/genie-chat.js +27 -29
- package/lib/src/genie.d.ts +2 -2
- package/lib/src/genie.js +29 -29
- package/lib/src/identity.d.ts +3 -30
- package/lib/src/identity.js +2 -27
- package/lib/src/memory.d.ts +1 -1
- package/lib/src/memory.js +24 -6
- package/lib/src/mlflow.d.ts +4 -4
- package/lib/src/mlflow.js +15 -18
- package/lib/src/model.d.ts +3 -3
- package/lib/src/model.js +6 -6
- package/lib/src/monty-sandbox.js +8 -8
- package/lib/src/observability.d.ts +6 -5
- package/lib/src/observability.js +8 -6
- package/lib/src/plugin.d.ts +1 -1
- package/lib/src/plugin.js +49 -51
- package/lib/src/remote-skills.d.ts +3 -4
- package/lib/src/remote-skills.js +46 -46
- package/lib/src/rest.d.ts +2 -2
- package/lib/src/rest.js +3 -3
- package/lib/src/server.js +17 -20
- package/lib/src/serving.js +10 -11
- package/lib/src/statement.js +7 -7
- package/lib/src/storage-schema.js +4 -4
- package/lib/src/summarize.js +5 -5
- package/lib/src/telemetry.d.ts +0 -6
- package/lib/src/telemetry.js +34 -41
- package/lib/src/validation.js +3 -4
- package/lib/src/workspaces.d.ts +2 -2
- package/lib/src/workspaces.js +34 -36
- package/lib/src/writer.d.ts +2 -2
- package/lib/src/writer.js +3 -3
- package/package.json +17 -305
- package/src/agents.ts +27 -21
- package/src/chart.ts +43 -37
- package/src/chat.ts +10 -12
- package/src/config.ts +14 -15
- package/src/evaluation.ts +6 -8
- package/src/feedback-mode.ts +1 -1
- package/src/filesystems.ts +5 -5
- package/src/follow-up-suggestions.ts +9 -9
- package/src/genie-chat.ts +32 -31
- package/src/genie.ts +29 -29
- package/src/identity.ts +3 -38
- package/src/memory.ts +24 -6
- package/src/mlflow.ts +21 -21
- package/src/model.ts +7 -7
- package/src/monty-sandbox.ts +7 -7
- package/src/observability.ts +8 -6
- package/src/plugin.ts +78 -65
- package/src/remote-skills.ts +63 -55
- package/src/rest.ts +4 -4
- package/src/server.ts +32 -20
- package/src/serving.ts +14 -11
- package/src/statement.ts +10 -6
- package/src/storage-schema.ts +3 -3
- package/src/summarize.ts +4 -4
- package/src/telemetry.ts +49 -55
- package/src/validation.ts +2 -3
- package/src/workspaces.ts +52 -42
- package/src/writer.ts +3 -3
package/lib/src/identity.d.ts
CHANGED
|
@@ -50,38 +50,11 @@
|
|
|
50
50
|
*
|
|
51
51
|
* @module
|
|
52
52
|
*/
|
|
53
|
-
import {
|
|
54
|
-
/** Identity a chat turn's Databricks calls run as. See the module docs. */
|
|
55
|
-
export type MastraIdentityMode = identity.IdentityMode;
|
|
53
|
+
import { type IdentityMode } from "@dbx-tools/appkit";
|
|
56
54
|
/** Environment fallback for `config.genieIdentity`. */
|
|
57
55
|
export declare const IDENTITY_ENV = "MASTRA_GENIE_IDENTITY";
|
|
58
|
-
/** Every accepted {@link MastraIdentityMode}. */
|
|
59
|
-
export declare const IDENTITY_MODES: readonly identity.IdentityMode[];
|
|
60
|
-
/**
|
|
61
|
-
* Default mode. `"user"` keeps OBO the only identity unless an app opts in, so
|
|
62
|
-
* adopting this option can never silently widen an existing app's data access.
|
|
63
|
-
*/
|
|
64
|
-
export declare const DEFAULT_IDENTITY_MODE: identity.IdentityMode;
|
|
65
|
-
/** Header Databricks Apps forward the signed-in user's id on. */
|
|
66
|
-
export declare const USER_ID_HEADER = "x-forwarded-user";
|
|
67
|
-
/** Header Databricks Apps forward the signed-in user's email on. */
|
|
68
|
-
export declare const USER_EMAIL_HEADER = "x-forwarded-email";
|
|
69
56
|
/**
|
|
70
57
|
* Resolve the configured mode: explicit plugin config, then {@link IDENTITY_ENV},
|
|
71
|
-
* then
|
|
72
|
-
*/
|
|
73
|
-
export declare function resolveIdentityMode(configured: string | undefined): MastraIdentityMode;
|
|
74
|
-
/**
|
|
75
|
-
* The forwarded user id on `req`, or `undefined`. Used to attribute a turn to
|
|
76
|
-
* the real caller when the Databricks client is the app SP but memory / cache /
|
|
77
|
-
* traces must still key off the user.
|
|
78
|
-
*/
|
|
79
|
-
export declare const requestUserId: typeof identity.requestUserId;
|
|
80
|
-
/** The forwarded user email on `req`, or `undefined`. */
|
|
81
|
-
export declare const requestUserEmail: typeof identity.requestUserEmail;
|
|
82
|
-
/**
|
|
83
|
-
* Whether this request should run its Databricks calls as the app service
|
|
84
|
-
* principal rather than OBO - `"service-principal"` always, `"user"` never, and
|
|
85
|
-
* `"auto"` only when the request carries no OBO token for AppKit to use.
|
|
58
|
+
* then AppKit's default identity mode. An unrecognized value throws.
|
|
86
59
|
*/
|
|
87
|
-
export declare
|
|
60
|
+
export declare function resolveIdentityMode(configured: string | undefined): IdentityMode;
|
package/lib/src/identity.js
CHANGED
|
@@ -53,36 +53,11 @@
|
|
|
53
53
|
import { identity } from "@dbx-tools/appkit";
|
|
54
54
|
/** Environment fallback for `config.genieIdentity`. */
|
|
55
55
|
export const IDENTITY_ENV = "MASTRA_GENIE_IDENTITY";
|
|
56
|
-
/** Every accepted {@link MastraIdentityMode}. */
|
|
57
|
-
export const IDENTITY_MODES = identity.IDENTITY_MODES;
|
|
58
|
-
/**
|
|
59
|
-
* Default mode. `"user"` keeps OBO the only identity unless an app opts in, so
|
|
60
|
-
* adopting this option can never silently widen an existing app's data access.
|
|
61
|
-
*/
|
|
62
|
-
export const DEFAULT_IDENTITY_MODE = identity.DEFAULT_IDENTITY_MODE;
|
|
63
|
-
/** Header Databricks Apps forward the signed-in user's id on. */
|
|
64
|
-
export const USER_ID_HEADER = identity.USER_ID_HEADER;
|
|
65
|
-
/** Header Databricks Apps forward the signed-in user's email on. */
|
|
66
|
-
export const USER_EMAIL_HEADER = identity.USER_EMAIL_HEADER;
|
|
67
56
|
/**
|
|
68
57
|
* Resolve the configured mode: explicit plugin config, then {@link IDENTITY_ENV},
|
|
69
|
-
* then
|
|
58
|
+
* then AppKit's default identity mode. An unrecognized value throws.
|
|
70
59
|
*/
|
|
71
60
|
export function resolveIdentityMode(configured) {
|
|
72
61
|
return identity.resolveIdentityMode(configured, IDENTITY_ENV, "genieIdentity");
|
|
73
62
|
}
|
|
74
|
-
|
|
75
|
-
* The forwarded user id on `req`, or `undefined`. Used to attribute a turn to
|
|
76
|
-
* the real caller when the Databricks client is the app SP but memory / cache /
|
|
77
|
-
* traces must still key off the user.
|
|
78
|
-
*/
|
|
79
|
-
export const requestUserId = identity.requestUserId;
|
|
80
|
-
/** The forwarded user email on `req`, or `undefined`. */
|
|
81
|
-
export const requestUserEmail = identity.requestUserEmail;
|
|
82
|
-
/**
|
|
83
|
-
* Whether this request should run its Databricks calls as the app service
|
|
84
|
-
* principal rather than OBO - `"service-principal"` always, `"user"` never, and
|
|
85
|
-
* `"auto"` only when the request carries no OBO token for AppKit to use.
|
|
86
|
-
*/
|
|
87
|
-
export const useServicePrincipal = identity.useServicePrincipal;
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWRlbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1ERztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUs3Qyx1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLHVCQUF1QixDQUFDO0FBRXBELGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztBQUV0RDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUM7QUFFcEUsaUVBQWlFO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO0FBRXRELG9FQUFvRTtBQUNwRSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUM7QUFFNUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFVBQThCO0lBQ2hFLE9BQU8sUUFBUSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDakYsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztBQUVwRCx5REFBeUQ7QUFDekQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDO0FBRTFEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdoaWNoIERhdGFicmlja3MgaWRlbnRpdHkgYSBjaGF0IHR1cm4ncyB3b3Jrc3BhY2UgY2FsbHMgcnVuIGFzLlxuICpcbiAqIEV2ZXJ5IERhdGFicmlja3MgY2FsbCBhIHR1cm4gbWFrZXMgLSB0aGUgYC9zZXJ2aW5nLWVuZHBvaW50c2AgY2F0YWxvZ3VlIHRoZVxuICogbW9kZWwgcGlja2VyIHJlYWRzLCBHZW5pZSBzdWdnZXN0aW9ucywgYGFza19nZW5pZWAsIGFuZCB0aGUgU3RhdGVtZW50XG4gKiBFeGVjdXRpb24gZmV0Y2ggYmVoaW5kIGEgYFtkYXRhOjxpZD5dYCBlbWJlZCAtIGdvZXMgdGhyb3VnaCB0aGUgd29ya3NwYWNlXG4gKiBjbGllbnQgb24gdGhlIGFtYmllbnQgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiBUaGF0IGNvbnRleHQgaXMgdXNlci1zY29wZWRcbiAqIChPQk8pIHdoZW5ldmVyIHRoZSBwbHVnaW4gZW50ZXJzIGBhc1VzZXIocmVxKWAgYW5kIHRoZSBhcHAncyBzZXJ2aWNlIHByaW5jaXBhbFxuICogb3RoZXJ3aXNlLCBzbyBPTkUgZGVjaXNpb24gLSBkbyB3ZSBlbnRlciB0aGF0IHNjb3BlIGZvciB0aGlzIHJlcXVlc3QgLSBtb3Zlc1xuICogZXZlcnkgY2FsbCBzaXRlIHRvZ2V0aGVyLlxuICpcbiAqIFRoZSBkZWNpc2lvbiBpdHNlbGYgaXMgTk9UIE1hc3RyYS1zcGVjaWZpYyAoYXV0aGVudGljYXRlZCB3ZWJob29rcyBhbmQgdGhlXG4gKiB0dW5uZWwgZ2F0ZSBmYWNlIGl0IHRvbyksIHNvIGl0IGxpdmVzIGluIGBAZGJ4LXRvb2xzL2FwcGtpdGAncyBgaWRlbnRpdHlgXG4gKiBtb2R1bGUgLSB3aGljaCBhbHNvIGRvY3VtZW50cyB0aGUgbWVhc3VyZWQgQXBwS2l0IGJlaGF2aW9yIHRoYXQgbWFrZXNcbiAqIGBcImF1dG9cImAgbmVjZXNzYXJ5LiBUaGlzIG1vZHVsZSBpcyB0aGUgTWFzdHJhLWZhY2luZyBiaW5kaW5nOiB0aGUgcGx1Z2luJ3Mgb3duXG4gKiBjb25maWcgZmllbGQgYW5kIGVudiB2YXIsIHJlLWV4cG9ydGluZyB0aGUgc2hhcmVkIHZvY2FidWxhcnkgc28gYSBjb25zdW1lclxuICogaW1wb3J0aW5nIGBAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFgIG5lZWRzIG5vIHNlY29uZCBpbXBvcnQuXG4gKlxuICogV2h5IHRoZSBvcHRpb24gZXhpc3RzOiBPQk8gcmVxdWlyZXMgdGhlIGNhbGxlciB0byBiZSBhIG1lbWJlciBvZiB0aGVcbiAqIFdPUktTUEFDRSwgbm90IG1lcmVseSBvZiB0aGUgRGF0YWJyaWNrcyBhY2NvdW50LiBBbiBhcHAgc2hhcmVkIHdpdGggYW5cbiAqIGFjY291bnQtbGV2ZWwgZ3JvdXAgY2FuIHRoZXJlZm9yZSBiZSBvcGVuZWQgYnkgc29tZW9uZSB3aG9zZSBPQk8gdG9rZW4gaXNcbiAqIHBlcmZlY3RseSB2YWxpZCBidXQgd2hvc2UgZXZlcnkgd29ya3NwYWNlIGNhbGwgZmFpbHMgd2l0aCBgVW5hdXRob3JpemVkXG4gKiBhY2Nlc3MgdG8gT3JnOiA8d29ya3NwYWNlLWlkPmAsIGFuZCBncmFudGluZyB3b3Jrc3BhY2UgbWVtYmVyc2hpcCBpcyBub3RcbiAqIGFsd2F5cyBhdmFpbGFibGUgLSBhIHdvcmtzcGFjZSBjYXBzIG1lbWJlcnNoaXAgZmFyIGJlbG93IHRoZSBzaXplIG9mIGEgbGFyZ2VcbiAqIGFjY291bnQncyB1c2VyIGdyb3VwLiBUaGUgYXBwJ3Mgb3duIHNlcnZpY2UgcHJpbmNpcGFsIGFscmVhZHkgaG9sZHMgdGhlIEdlbmllXG4gKiAvIHdhcmVob3VzZSAvIHNlcnZpbmcgLyBVbml0eSBDYXRhbG9nIGdyYW50cyB0aGUgYXBwIHdhcyBkZXBsb3llZCB3aXRoLCBhbmRcbiAqIHdvcmtzIGZvciBldmVyeSBjYWxsZXIuXG4gKlxuICogVGhlIG1vZGVzLCBmcm9tIGBjb25maWcuZ2VuaWVJZGVudGl0eWAgKGVudjoge0BsaW5rIElERU5USVRZX0VOVn0pOlxuICpcbiAqICAgLSBgXCJ1c2VyXCJgIChkZWZhdWx0KTogYWx3YXlzIE9CTy4gQ2FsbHMgYXJlIGF0dHJpYnV0ZWQgcGVyIHVzZXIgYW5kIEdlbmllIC9cbiAqICAgICBVbml0eSBDYXRhbG9nIHJvdyBmaWx0ZXJzIGFwcGx5IHBlciB1c2VyLiBDb3JyZWN0IHdoZW5ldmVyIGV2ZXJ5IGNhbGxlciBpc1xuICogICAgIGEgd29ya3NwYWNlIG1lbWJlci4gVGhpcyBpcyB0aGUgaGlzdG9yaWNhbCBiZWhhdmlvciwgc28gdGhlIG9wdGlvbiBpc1xuICogICAgIHB1cmVseSBhZGRpdGl2ZSAtIGFuIGFwcCB0aGF0IG5ldmVyIHNldHMgaXQgaXMgdW5jaGFuZ2VkLlxuICogICAtIGBcInNlcnZpY2UtcHJpbmNpcGFsXCJgOiBhbHdheXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbC4gTmVlZHMgbm8gT0JPXG4gKiAgICAgc2NvcGVzIGFuZCB3b3JrcyBmb3IgYW55IGNhbGxlciB3aG8gY2FuIG9wZW4gdGhlIGFwcCwgYXQgdGhlIGNvc3Qgb2ZcbiAqICAgICBwZXItdXNlciBhdHRyaWJ1dGlvbiBpbiBHZW5pZSAvIFVuaXR5IENhdGFsb2cuXG4gKiAgIC0gYFwiYXV0b1wiYDogT0JPIHdoZW4gdGhlIHJlcXVlc3QgY2FycmllcyBhbiBPQk8gdG9rZW4sIHRoZSBzZXJ2aWNlIHByaW5jaXBhbFxuICogICAgIHdoZW4gaXQgZG9lcyBub3QuIFRoZSBtb2RlIGZvciBhbiBhcHAgdGhhdCBzZXJ2ZXMgQk9USCB0aGUgcGxhdGZvcm0gZnJvbnRcbiAqICAgICBkb29yIGFuZCBhIGRvb3Igd2l0aCBubyBPQk8gdG9rZW4gdG8gZm9yd2FyZCAoYSBgQGRieC10b29scy90dW5uZWxgXG4gKiAgICAgZ2F0ZSBvciBhbiBhdXRoZW50aWNhdGVkIHdlYmhvb2spLCBzaW5jZSBhIHNpbmdsZSBjb250YWluZXIgc2VydmVzIGJvdGhcbiAqICAgICBhdCBvbmNlLlxuICpcbiAqIFdoYXQgdGhlIHNlcnZpY2UtcHJpbmNpcGFsIHBhdGggZG9lcyBOT1QgY2hhbmdlIGlzIFdITyB0aGUgdHVybiBiZWxvbmdzIHRvLlxuICogVGhlIG1lbW9yeSB0aHJlYWQncyBgcmVzb3VyY2VJZGAsIHRoZSBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2UsIGFuZCB0aGUgdXNlclxuICogbWV0YWRhdGEgb24gdHJhY2VzIHN0aWxsIGNvbWUgZnJvbSB0aGUgZm9yd2FyZGVkIHJlcXVlc3QgaGVhZGVycywgc28gdHdvXG4gKiBhY2NvdW50IHVzZXJzIHNoYXJpbmcgdGhlIHNlcnZpY2UgcHJpbmNpcGFsJ3MgZGF0YSBhY2Nlc3Mgc3RpbGwgZ2V0IHNlcGFyYXRlXG4gKiBjb252ZXJzYXRpb25zIGFuZCBjYW5ub3QgcmVhZCBlYWNoIG90aGVyJ3MgdGhyZWFkcyBvciBjYWNoZWQgY2hhcnRzLiBPbmx5IHRoZVxuICogRGF0YWJyaWNrcyBjcmVkZW50aWFsIGlzIHNoYXJlZC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcblxuLyoqIElkZW50aXR5IGEgY2hhdCB0dXJuJ3MgRGF0YWJyaWNrcyBjYWxscyBydW4gYXMuIFNlZSB0aGUgbW9kdWxlIGRvY3MuICovXG5leHBvcnQgdHlwZSBNYXN0cmFJZGVudGl0eU1vZGUgPSBpZGVudGl0eS5JZGVudGl0eU1vZGU7XG5cbi8qKiBFbnZpcm9ubWVudCBmYWxsYmFjayBmb3IgYGNvbmZpZy5nZW5pZUlkZW50aXR5YC4gKi9cbmV4cG9ydCBjb25zdCBJREVOVElUWV9FTlYgPSBcIk1BU1RSQV9HRU5JRV9JREVOVElUWVwiO1xuXG4vKiogRXZlcnkgYWNjZXB0ZWQge0BsaW5rIE1hc3RyYUlkZW50aXR5TW9kZX0uICovXG5leHBvcnQgY29uc3QgSURFTlRJVFlfTU9ERVMgPSBpZGVudGl0eS5JREVOVElUWV9NT0RFUztcblxuLyoqXG4gKiBEZWZhdWx0IG1vZGUuIGBcInVzZXJcImAga2VlcHMgT0JPIHRoZSBvbmx5IGlkZW50aXR5IHVubGVzcyBhbiBhcHAgb3B0cyBpbiwgc29cbiAqIGFkb3B0aW5nIHRoaXMgb3B0aW9uIGNhbiBuZXZlciBzaWxlbnRseSB3aWRlbiBhbiBleGlzdGluZyBhcHAncyBkYXRhIGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSURFTlRJVFlfTU9ERSA9IGlkZW50aXR5LkRFRkFVTFRfSURFTlRJVFlfTU9ERTtcblxuLyoqIEhlYWRlciBEYXRhYnJpY2tzIEFwcHMgZm9yd2FyZCB0aGUgc2lnbmVkLWluIHVzZXIncyBpZCBvbi4gKi9cbmV4cG9ydCBjb25zdCBVU0VSX0lEX0hFQURFUiA9IGlkZW50aXR5LlVTRVJfSURfSEVBREVSO1xuXG4vKiogSGVhZGVyIERhdGFicmlja3MgQXBwcyBmb3J3YXJkIHRoZSBzaWduZWQtaW4gdXNlcidzIGVtYWlsIG9uLiAqL1xuZXhwb3J0IGNvbnN0IFVTRVJfRU1BSUxfSEVBREVSID0gaWRlbnRpdHkuVVNFUl9FTUFJTF9IRUFERVI7XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgY29uZmlndXJlZCBtb2RlOiBleHBsaWNpdCBwbHVnaW4gY29uZmlnLCB0aGVuIHtAbGluayBJREVOVElUWV9FTlZ9LFxuICogdGhlbiB7QGxpbmsgREVGQVVMVF9JREVOVElUWV9NT0RFfS4gQW4gdW5yZWNvZ25pemVkIHZhbHVlIHRocm93cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJZGVudGl0eU1vZGUoY29uZmlndXJlZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogTWFzdHJhSWRlbnRpdHlNb2RlIHtcbiAgcmV0dXJuIGlkZW50aXR5LnJlc29sdmVJZGVudGl0eU1vZGUoY29uZmlndXJlZCwgSURFTlRJVFlfRU5WLCBcImdlbmllSWRlbnRpdHlcIik7XG59XG5cbi8qKlxuICogVGhlIGZvcndhcmRlZCB1c2VyIGlkIG9uIGByZXFgLCBvciBgdW5kZWZpbmVkYC4gVXNlZCB0byBhdHRyaWJ1dGUgYSB0dXJuIHRvXG4gKiB0aGUgcmVhbCBjYWxsZXIgd2hlbiB0aGUgRGF0YWJyaWNrcyBjbGllbnQgaXMgdGhlIGFwcCBTUCBidXQgbWVtb3J5IC8gY2FjaGUgL1xuICogdHJhY2VzIG11c3Qgc3RpbGwga2V5IG9mZiB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlcXVlc3RVc2VySWQgPSBpZGVudGl0eS5yZXF1ZXN0VXNlcklkO1xuXG4vKiogVGhlIGZvcndhcmRlZCB1c2VyIGVtYWlsIG9uIGByZXFgLCBvciBgdW5kZWZpbmVkYC4gKi9cbmV4cG9ydCBjb25zdCByZXF1ZXN0VXNlckVtYWlsID0gaWRlbnRpdHkucmVxdWVzdFVzZXJFbWFpbDtcblxuLyoqXG4gKiBXaGV0aGVyIHRoaXMgcmVxdWVzdCBzaG91bGQgcnVuIGl0cyBEYXRhYnJpY2tzIGNhbGxzIGFzIHRoZSBhcHAgc2VydmljZVxuICogcHJpbmNpcGFsIHJhdGhlciB0aGFuIE9CTyAtIGBcInNlcnZpY2UtcHJpbmNpcGFsXCJgIGFsd2F5cywgYFwidXNlclwiYCBuZXZlciwgYW5kXG4gKiBgXCJhdXRvXCJgIG9ubHkgd2hlbiB0aGUgcmVxdWVzdCBjYXJyaWVzIG5vIE9CTyB0b2tlbiBmb3IgQXBwS2l0IHRvIHVzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVNlcnZpY2VQcmluY2lwYWwgPSBpZGVudGl0eS51c2VTZXJ2aWNlUHJpbmNpcGFsO1xuIl19
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWRlbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1ERztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQXFCLE1BQU0sbUJBQW1CLENBQUM7QUFFaEUsdURBQXVEO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyx1QkFBdUIsQ0FBQztBQUVwRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsVUFBOEI7SUFDaEUsT0FBTyxRQUFRLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztBQUNqRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXaGljaCBEYXRhYnJpY2tzIGlkZW50aXR5IGEgY2hhdCB0dXJuJ3Mgd29ya3NwYWNlIGNhbGxzIHJ1biBhcy5cbiAqXG4gKiBFdmVyeSBEYXRhYnJpY2tzIGNhbGwgYSB0dXJuIG1ha2VzIC0gdGhlIGAvc2VydmluZy1lbmRwb2ludHNgIGNhdGFsb2d1ZSB0aGVcbiAqIG1vZGVsIHBpY2tlciByZWFkcywgR2VuaWUgc3VnZ2VzdGlvbnMsIGBhc2tfZ2VuaWVgLCBhbmQgdGhlIFN0YXRlbWVudFxuICogRXhlY3V0aW9uIGZldGNoIGJlaGluZCBhIGBbZGF0YTo8aWQ+XWAgZW1iZWQgLSBnb2VzIHRocm91Z2ggdGhlIHdvcmtzcGFjZVxuICogY2xpZW50IG9uIHRoZSBhbWJpZW50IEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gVGhhdCBjb250ZXh0IGlzIHVzZXItc2NvcGVkXG4gKiAoT0JPKSB3aGVuZXZlciB0aGUgcGx1Z2luIGVudGVycyBgYXNVc2VyKHJlcSlgIGFuZCB0aGUgYXBwJ3Mgc2VydmljZSBwcmluY2lwYWxcbiAqIG90aGVyd2lzZSwgc28gT05FIGRlY2lzaW9uIC0gZG8gd2UgZW50ZXIgdGhhdCBzY29wZSBmb3IgdGhpcyByZXF1ZXN0IC0gbW92ZXNcbiAqIGV2ZXJ5IGNhbGwgc2l0ZSB0b2dldGhlci5cbiAqXG4gKiBUaGUgZGVjaXNpb24gaXRzZWxmIGlzIE5PVCBNYXN0cmEtc3BlY2lmaWMgKGF1dGhlbnRpY2F0ZWQgd2ViaG9va3MgYW5kIHRoZVxuICogdHVubmVsIGdhdGUgZmFjZSBpdCB0b28pLCBzbyBpdCBsaXZlcyBpbiBgQGRieC10b29scy9hcHBraXRgJ3MgYGlkZW50aXR5YFxuICogbW9kdWxlIC0gd2hpY2ggYWxzbyBkb2N1bWVudHMgdGhlIG1lYXN1cmVkIEFwcEtpdCBiZWhhdmlvciB0aGF0IG1ha2VzXG4gKiBgXCJhdXRvXCJgIG5lY2Vzc2FyeS4gVGhpcyBtb2R1bGUgaXMgdGhlIE1hc3RyYS1mYWNpbmcgYmluZGluZzogdGhlIHBsdWdpbidzIG93blxuICogY29uZmlnIGZpZWxkIGFuZCBlbnYgdmFyLCByZS1leHBvcnRpbmcgdGhlIHNoYXJlZCB2b2NhYnVsYXJ5IHNvIGEgY29uc3VtZXJcbiAqIGltcG9ydGluZyBgQGRieC10b29scy9hcHBraXQtbWFzdHJhYCBuZWVkcyBubyBzZWNvbmQgaW1wb3J0LlxuICpcbiAqIFdoeSB0aGUgb3B0aW9uIGV4aXN0czogT0JPIHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gYmUgYSBtZW1iZXIgb2YgdGhlXG4gKiBXT1JLU1BBQ0UsIG5vdCBtZXJlbHkgb2YgdGhlIERhdGFicmlja3MgYWNjb3VudC4gQW4gYXBwIHNoYXJlZCB3aXRoIGFuXG4gKiBhY2NvdW50LWxldmVsIGdyb3VwIGNhbiB0aGVyZWZvcmUgYmUgb3BlbmVkIGJ5IHNvbWVvbmUgd2hvc2UgT0JPIHRva2VuIGlzXG4gKiBwZXJmZWN0bHkgdmFsaWQgYnV0IHdob3NlIGV2ZXJ5IHdvcmtzcGFjZSBjYWxsIGZhaWxzIHdpdGggYFVuYXV0aG9yaXplZFxuICogYWNjZXNzIHRvIE9yZzogPHdvcmtzcGFjZS1pZD5gLCBhbmQgZ3JhbnRpbmcgd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgbm90XG4gKiBhbHdheXMgYXZhaWxhYmxlIC0gYSB3b3Jrc3BhY2UgY2FwcyBtZW1iZXJzaGlwIGZhciBiZWxvdyB0aGUgc2l6ZSBvZiBhIGxhcmdlXG4gKiBhY2NvdW50J3MgdXNlciBncm91cC4gVGhlIGFwcCdzIG93biBzZXJ2aWNlIHByaW5jaXBhbCBhbHJlYWR5IGhvbGRzIHRoZSBHZW5pZVxuICogLyB3YXJlaG91c2UgLyBzZXJ2aW5nIC8gVW5pdHkgQ2F0YWxvZyBncmFudHMgdGhlIGFwcCB3YXMgZGVwbG95ZWQgd2l0aCwgYW5kXG4gKiB3b3JrcyBmb3IgZXZlcnkgY2FsbGVyLlxuICpcbiAqIFRoZSBtb2RlcywgZnJvbSBgY29uZmlnLmdlbmllSWRlbnRpdHlgIChlbnY6IHtAbGluayBJREVOVElUWV9FTlZ9KTpcbiAqXG4gKiAgIC0gYFwidXNlclwiYCAoZGVmYXVsdCk6IGFsd2F5cyBPQk8uIENhbGxzIGFyZSBhdHRyaWJ1dGVkIHBlciB1c2VyIGFuZCBHZW5pZSAvXG4gKiAgICAgVW5pdHkgQ2F0YWxvZyByb3cgZmlsdGVycyBhcHBseSBwZXIgdXNlci4gQ29ycmVjdCB3aGVuZXZlciBldmVyeSBjYWxsZXIgaXNcbiAqICAgICBhIHdvcmtzcGFjZSBtZW1iZXIuIFRoaXMgaXMgdGhlIGhpc3RvcmljYWwgYmVoYXZpb3IsIHNvIHRoZSBvcHRpb24gaXNcbiAqICAgICBwdXJlbHkgYWRkaXRpdmUgLSBhbiBhcHAgdGhhdCBuZXZlciBzZXRzIGl0IGlzIHVuY2hhbmdlZC5cbiAqICAgLSBgXCJzZXJ2aWNlLXByaW5jaXBhbFwiYDogYWx3YXlzIHRoZSBhcHAgc2VydmljZSBwcmluY2lwYWwuIE5lZWRzIG5vIE9CT1xuICogICAgIHNjb3BlcyBhbmQgd29ya3MgZm9yIGFueSBjYWxsZXIgd2hvIGNhbiBvcGVuIHRoZSBhcHAsIGF0IHRoZSBjb3N0IG9mXG4gKiAgICAgcGVyLXVzZXIgYXR0cmlidXRpb24gaW4gR2VuaWUgLyBVbml0eSBDYXRhbG9nLlxuICogICAtIGBcImF1dG9cImA6IE9CTyB3aGVuIHRoZSByZXF1ZXN0IGNhcnJpZXMgYW4gT0JPIHRva2VuLCB0aGUgc2VydmljZSBwcmluY2lwYWxcbiAqICAgICB3aGVuIGl0IGRvZXMgbm90LiBUaGUgbW9kZSBmb3IgYW4gYXBwIHRoYXQgc2VydmVzIEJPVEggdGhlIHBsYXRmb3JtIGZyb250XG4gKiAgICAgZG9vciBhbmQgYSBkb29yIHdpdGggbm8gT0JPIHRva2VuIHRvIGZvcndhcmQgKGEgYEBkYngtdG9vbHMvdHVubmVsYFxuICogICAgIGdhdGUgb3IgYW4gYXV0aGVudGljYXRlZCB3ZWJob29rKSwgc2luY2UgYSBzaW5nbGUgY29udGFpbmVyIHNlcnZlcyBib3RoXG4gKiAgICAgYXQgb25jZS5cbiAqXG4gKiBXaGF0IHRoZSBzZXJ2aWNlLXByaW5jaXBhbCBwYXRoIGRvZXMgTk9UIGNoYW5nZSBpcyBXSE8gdGhlIHR1cm4gYmVsb25ncyB0by5cbiAqIFRoZSBtZW1vcnkgdGhyZWFkJ3MgYHJlc291cmNlSWRgLCB0aGUgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlLCBhbmQgdGhlIHVzZXJcbiAqIG1ldGFkYXRhIG9uIHRyYWNlcyBzdGlsbCBjb21lIGZyb20gdGhlIGZvcndhcmRlZCByZXF1ZXN0IGhlYWRlcnMsIHNvIHR3b1xuICogYWNjb3VudCB1c2VycyBzaGFyaW5nIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCdzIGRhdGEgYWNjZXNzIHN0aWxsIGdldCBzZXBhcmF0ZVxuICogY29udmVyc2F0aW9ucyBhbmQgY2Fubm90IHJlYWQgZWFjaCBvdGhlcidzIHRocmVhZHMgb3IgY2FjaGVkIGNoYXJ0cy4gT25seSB0aGVcbiAqIERhdGFicmlja3MgY3JlZGVudGlhbCBpcyBzaGFyZWQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGlkZW50aXR5LCB0eXBlIElkZW50aXR5TW9kZSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuXG4vKiogRW52aXJvbm1lbnQgZmFsbGJhY2sgZm9yIGBjb25maWcuZ2VuaWVJZGVudGl0eWAuICovXG5leHBvcnQgY29uc3QgSURFTlRJVFlfRU5WID0gXCJNQVNUUkFfR0VOSUVfSURFTlRJVFlcIjtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBjb25maWd1cmVkIG1vZGU6IGV4cGxpY2l0IHBsdWdpbiBjb25maWcsIHRoZW4ge0BsaW5rIElERU5USVRZX0VOVn0sXG4gKiB0aGVuIEFwcEtpdCdzIGRlZmF1bHQgaWRlbnRpdHkgbW9kZS4gQW4gdW5yZWNvZ25pemVkIHZhbHVlIHRocm93cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJZGVudGl0eU1vZGUoY29uZmlndXJlZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogSWRlbnRpdHlNb2RlIHtcbiAgcmV0dXJuIGlkZW50aXR5LnJlc29sdmVJZGVudGl0eU1vZGUoY29uZmlndXJlZCwgSURFTlRJVFlfRU5WLCBcImdlbmllSWRlbnRpdHlcIik7XG59XG4iXX0=
|
package/lib/src/memory.d.ts
CHANGED
|
@@ -35,7 +35,7 @@ import type { AgentMemoryOption } from "@mastra/core/agent";
|
|
|
35
35
|
import { type RequestContext } from "@mastra/core/request-context";
|
|
36
36
|
import { Memory } from "@mastra/memory";
|
|
37
37
|
import { PostgresStore } from "@mastra/pg";
|
|
38
|
-
import
|
|
38
|
+
import { Pool } from "pg";
|
|
39
39
|
import type { AnyMastraAgentDefinition } from "./agents.ts";
|
|
40
40
|
import type { MastraPluginConfig } from "./config.ts";
|
|
41
41
|
/** Resolve the trusted Mastra memory scope stamped by AppKit middleware. */
|
package/lib/src/memory.js
CHANGED
|
@@ -31,12 +31,13 @@
|
|
|
31
31
|
*
|
|
32
32
|
* @module
|
|
33
33
|
*/
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
34
|
+
import { handleOwnershipMigrationError } from "@dbx-tools/appkit";
|
|
35
|
+
import { log, id } from "@dbx-tools/shared-core";
|
|
36
36
|
import { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY, } from "@mastra/core/request-context";
|
|
37
37
|
import { fastembed } from "@mastra/fastembed";
|
|
38
38
|
import { Memory } from "@mastra/memory";
|
|
39
39
|
import { PgVector, PostgresStore } from "@mastra/pg";
|
|
40
|
+
import { Pool } from "pg";
|
|
40
41
|
import { agentStorageSchemaName } from "./storage-schema.js";
|
|
41
42
|
import { summaryModel, TITLE_INSTRUCTIONS } from "./summarize.js";
|
|
42
43
|
const logger = log.logger("mastra/memory");
|
|
@@ -86,7 +87,7 @@ export function withSoftStorageInit(store) {
|
|
|
86
87
|
await originalInit();
|
|
87
88
|
}
|
|
88
89
|
catch (err) {
|
|
89
|
-
if (!
|
|
90
|
+
if (!handleOwnershipMigrationError(err, {
|
|
90
91
|
scope: "mastra-storage",
|
|
91
92
|
logger,
|
|
92
93
|
event: "mastra storage migration failed",
|
|
@@ -130,6 +131,23 @@ export function needsLakebase(config) {
|
|
|
130
131
|
export function createMemoryBuilder(config, servicePrincipalPool) {
|
|
131
132
|
return new MemoryBuilder(config, servicePrincipalPool);
|
|
132
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* Create the plugin-owned Lakebase pool used by durable workflow storage.
|
|
136
|
+
*
|
|
137
|
+
* @internal
|
|
138
|
+
*
|
|
139
|
+
* AppKit shuts plugin hooks down concurrently, so borrowing the native
|
|
140
|
+
* Lakebase plugin's pool lets its shutdown race Mastra's final snapshot writes.
|
|
141
|
+
* A caller-provided pool is not closed by PostgresStore; idle connections do
|
|
142
|
+
* not keep the process alive and remain available to runs Mastra is still
|
|
143
|
+
* draining after its bounded shutdown window.
|
|
144
|
+
*/
|
|
145
|
+
export function createMastraLakebasePool(config) {
|
|
146
|
+
return new Pool({
|
|
147
|
+
...config,
|
|
148
|
+
allowExitOnIdle: true,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
133
151
|
/**
|
|
134
152
|
* Builds one `Memory` per agent against a shared service-principal
|
|
135
153
|
* Lakebase pool. Per-instance state keeps the shared `PgVector` alive
|
|
@@ -280,7 +298,7 @@ export class MemoryBuilder {
|
|
|
280
298
|
*/
|
|
281
299
|
function buildSharedPgVector(pool) {
|
|
282
300
|
const vector = new PgVector({
|
|
283
|
-
id: `pg${
|
|
301
|
+
id: `pg${id()}`,
|
|
284
302
|
// Keep the recall index out of `public`: on a Lakebase database the app
|
|
285
303
|
// service principal has no CREATE on `public` (PG15+ locks it down), so a
|
|
286
304
|
// default-schema PgVector fails on CREATE INDEX with "permission denied for
|
|
@@ -302,7 +320,7 @@ function buildSharedPgVector(pool) {
|
|
|
302
320
|
}
|
|
303
321
|
/** Per-agent dedicated `PgVector` (rare; opt-in via object override). */
|
|
304
322
|
function buildPgVector(setting) {
|
|
305
|
-
return new PgVector(withId(setting, `pg-vector__${
|
|
323
|
+
return new PgVector(withId(setting, `pg-vector__${id()}`));
|
|
306
324
|
}
|
|
307
325
|
/** True when this setting requires the shared Lakebase pool. */
|
|
308
326
|
function settingNeedsSharedPool(setting) {
|
|
@@ -324,4 +342,4 @@ function collectAgentDefinitions(config) {
|
|
|
324
342
|
function withId(value, fallback) {
|
|
325
343
|
return value.id ? value : { ...value, id: fallback };
|
|
326
344
|
}
|
|
327
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFbkQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixvQkFBb0IsR0FFckIsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBS3JELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRTNDLDRFQUE0RTtBQUM1RSxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLGNBQXVEO0lBRXZELE1BQU0sUUFBUSxHQUFHLGNBQWMsRUFBRSxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUMzRCxNQUFNLFVBQVUsR0FBRyxjQUFjLEVBQUUsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDL0QsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3JGLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUs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QUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzdCLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDdkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3pDLElBQUksY0FBYyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxNQUFrQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsZ0VBQWdFO0FBQ2hFLFNBQVMsTUFBTSxDQUE0QixLQUFRLEVBQUUsUUFBZ0I7SUFDbkUsT0FBTyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExha2ViYXNlLWJhY2tlZCBNYXN0cmEgbWVtb3J5IHdpcmluZy5cbiAqXG4gKiBQcm92aWRlcyBhIHtAbGluayBNZW1vcnlCdWlsZGVyfSB0aGF0IG1pbnRzIG9uZSBgTWVtb3J5YCBwZXIgYWdlbnRcbiAqIHdpdGggdHdvIGluZGVwZW5kZW50IGtub2JzOlxuICpcbiAqIC0gKipTdG9yYWdlKiogKHRocmVhZHMgLyBtZXNzYWdlcyB2aWEgYFBvc3RncmVzU3RvcmVgKTogZGVmYXVsdHMgdG9cbiAqICAgKipwZXItYWdlbnQqKiBuYW1lc3BhY2luZyB2aWEge0BsaW5rIGFnZW50U3RvcmFnZVNjaGVtYU5hbWV9IHNvXG4gKiAgIGNvbnZlcnNhdGlvbiBoaXN0b3J5IHN0YXlzIGlzb2xhdGVkIGJldHdlZW4gYWdlbnRzIGluIHRoZSBzYW1lXG4gKiAgIGRhdGFiYXNlLiBgUG9zdGdyZXNTdG9yZWAgYXV0by1jcmVhdGVzIHRoZSBzY2hlbWEgd2l0aFxuICogICBgQ1JFQVRFIFNDSEVNQSBJRiBOT1QgRVhJU1RTYCBvbiBpbml0LiBBIGZhaWxlZCBtaWdyYXRpb24gKGNvbW1vbiBvblxuICogICBMYWtlYmFzZSB3aGVuIHRoZSBjb25uZWN0aW5nIHJvbGUgaXMgbm90IHRoZSB0YWJsZSBvd25lcikgaXMgbG9nZ2VkXG4gKiAgIGFuZCBza2lwcGVkIHZpYSB7QGxpbmsgd2l0aFNvZnRTdG9yYWdlSW5pdH0gc28gZXhpc3RpbmcgdGFibGVzIGtlZXBcbiAqICAgc2VydmluZyBpbnN0ZWFkIG9mIHJldHJ5aW5nIERETCBvbiBldmVyeSByZXF1ZXN0LlxuICogLSAqKk1lbW9yeSoqIChzZW1hbnRpYyByZWNhbGwgdmlhIGBQZ1ZlY3RvcmApOiBkZWZhdWx0cyB0byBhIHNpbmdsZVxuICogICAqKnNoYXJlZCoqIGluc3RhbmNlIGFjcm9zcyBldmVyeSBhZ2VudC4gQ3Jvc3MtYWdlbnQgcmVjYWxsIG9uIG9uZVxuICogICBpbmRleCBpcyBhbG1vc3QgYWx3YXlzIHdoYXQgdXNlcnMgd2FudDsgb3B0IGludG8gcGVyLWFnZW50IHJlY2FsbFxuICogICBieSBwYXNzaW5nIGEge0BsaW5rIE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlfSBvbiB0aGUgYWdlbnQuXG4gKlxuICogQWRkaXRpb25hbGx5LCB7QGxpbmsgTWVtb3J5QnVpbGRlci5pbnN0YW5jZVN0b3JhZ2V9IHJldHVybnMgYVxuICogKipNYXN0cmEtaW5zdGFuY2UtbGV2ZWwqKiBgUG9zdGdyZXNTdG9yZWAgKHNjaGVtYSBgbWFzdHJhX2luc3RhbmNlYClcbiAqIHVzZWQgZm9yIHdvcmtmbG93IHNuYXBzaG90cyAtIHRoZSBwZXJzaXN0ZW5jZSBsYXllclxuICogYGFnZW50LnJlc3VtZVN0cmVhbSgpYCByZWFkcyBmcm9tIHdoZW4gd2FraW5nIGEgc3VzcGVuZGVkXG4gKiBgcmVxdWlyZUFwcHJvdmFsYCB0b29sIGNhbGwuIFBlci1hZ2VudCBzdG9yZXMgYXJlIG5vdCBlbm91Z2ggZm9yXG4gKiB0aGlzOiB3b3JrZmxvdyBydW5zIGFyZSBzY29wZWQgdG8gdGhlIE1hc3RyYSBpbnN0YW5jZSwgbm90IGFuXG4gKiBpbmRpdmlkdWFsIGFnZW50J3MgYE1lbW9yeWAuXG4gKlxuICogUGx1Z2luLWxldmVsIGBjb25maWcuc3RvcmFnZWAgLyBgY29uZmlnLm1lbW9yeWAgYWN0IGFzIHRoZSBiYXNlbGluZVxuICogKGF1dG8tZGVmYXVsdGVkIHRvIGB0cnVlYCBpbiBgcGx1Z2luLnRzYCB3aGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpblxuICogaXMgcmVnaXN0ZXJlZCk7IHBlci1hZ2VudCBzZXR0aW5ncyBjYXNjYWRlIG9uIHRvcCBvZiB0aGF0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBtaWdyYXRpb24gYXMgYXBwa2l0TWlncmF0aW9uIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBoYXNoLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudE1lbW9yeU9wdGlvbiB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB7XG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICB0eXBlIFJlcXVlc3RDb250ZXh0LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgZmFzdGVtYmVkIH0gZnJvbSBcIkBtYXN0cmEvZmFzdGVtYmVkXCI7XG5pbXBvcnQgeyBNZW1vcnkgfSBmcm9tIFwiQG1hc3RyYS9tZW1vcnlcIjtcbmltcG9ydCB7IFBnVmVjdG9yLCBQb3N0Z3Jlc1N0b3JlIH0gZnJvbSBcIkBtYXN0cmEvcGdcIjtcbmltcG9ydCB0eXBlIHsgUG9vbCB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgdHlwZSB7IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbiwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUgfSBmcm9tIFwiLi9hZ2VudHMudHNcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lIH0gZnJvbSBcIi4vc3RvcmFnZS1zY2hlbWEudHNcIjtcbmltcG9ydCB7IHN1bW1hcnlNb2RlbCwgVElUTEVfSU5TVFJVQ1RJT05TIH0gZnJvbSBcIi4vc3VtbWFyaXplLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvbWVtb3J5XCIpO1xuXG4vKiogUmVzb2x2ZSB0aGUgdHJ1c3RlZCBNYXN0cmEgbWVtb3J5IHNjb3BlIHN0YW1wZWQgYnkgQXBwS2l0IG1pZGRsZXdhcmUuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdE1lbW9yeVNjb3BlKFxuICByZXF1ZXN0Q29udGV4dDogUGljazxSZXF1ZXN0Q29udGV4dCwgXCJnZXRcIj4gfCB1bmRlZmluZWQsXG4pOiBBZ2VudE1lbW9yeU9wdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRocmVhZElkID0gcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSk7XG4gIGNvbnN0IHJlc291cmNlSWQgPSByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkpO1xuICBpZiAodHlwZW9mIHRocmVhZElkICE9PSBcInN0cmluZ1wiIHx8IHR5cGVvZiByZXNvdXJjZUlkICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4geyB0aHJlYWQ6IHRocmVhZElkLCByZXNvdXJjZTogcmVzb3VyY2VJZCB9O1xufVxuXG4vKiogT3ZlcmxheSB0cnVzdGVkIHJlcXVlc3QgbWVtb3J5IGlkZW50aWZpZXJzIG9udG8gTWFzdHJhIGV4ZWN1dGlvbiBvcHRpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZXF1ZXN0TWVtb3J5U2NvcGU8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9wdGlvbnM6IFQsXG4gIHJlcXVlc3RDb250ZXh0OiBQaWNrPFJlcXVlc3RDb250ZXh0LCBcImdldFwiPiB8IHVuZGVmaW5lZCxcbik6IFQgJiB7IG1lbW9yeT86IEFnZW50TWVtb3J5T3B0aW9uIH0ge1xuICBjb25zdCBzY29wZSA9IHJlcXVlc3RNZW1vcnlTY29wZShyZXF1ZXN0Q29udGV4dCk7XG4gIGlmICghc2NvcGUpIHJldHVybiBvcHRpb25zO1xuICBjb25zdCBtZW1vcnkgPSAob3B0aW9ucyBhcyB7IG1lbW9yeT86IEFnZW50TWVtb3J5T3B0aW9uIH0pLm1lbW9yeTtcbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1lbW9yeToge1xuICAgICAgLi4ubWVtb3J5LFxuICAgICAgLi4uc2NvcGUsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTb2Z0ZW4ge0BsaW5rIFBvc3RncmVzU3RvcmUuaW5pdH0gc28gYSBmYWlsZWQgbWlncmF0aW9uIChlLmcuIExha2ViYXNlXG4gKiBgbXVzdCBiZSBvd25lciBvZiB0YWJsZSDigKZgIG9uIGBBTFRFUmApIGlzIGxvZ2dlZCBvbmNlIGluc3RlYWQgb2YgcmV0aHJvd25cbiAqIG9uIGV2ZXJ5IHN0b3JhZ2UgY2FsbC5cbiAqXG4gKiBNYXN0cmEncyBgYXVnbWVudFdpdGhJbml0YCByZXRyaWVzIGluaXQgZm9yZXZlciB3aGVuIGl0IHRocm93cywgc28gdGhlXG4gKiBvbmx5IHdheSB0byBrZWVwIHNlcnZpbmcgYWdhaW5zdCBhbiBhbHJlYWR5LXVzYWJsZSBzY2hlbWEgaXMgdG8gdHJlYXRcbiAqIG1pZ3JhdGlvbiBmYWlsdXJlIGFzIHN1Y2Nlc3MgYW5kIG1hcmsgdGhlIHN0b3JlIGluaXRpYWxpemVkLlxuICpcbiAqIENvbmN1cnJlbnQgZmlyc3QgY2FsbGVycyBzaGFyZSBvbmUgc29mdCBhdHRlbXB0LiBOb24tb3duZXJzaGlwIGZhaWx1cmVzIHN0YXlcbiAqIGZhdGFsIHNvIG1pc3Npbmcgc2NoZW1hcy90YWJsZXMgYXJlIHJldHJpZWQgb3Igc3VyZmFjZWQgaW5zdGVhZCBvZiBoaWRkZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU29mdFN0b3JhZ2VJbml0KHN0b3JlOiBQb3N0Z3Jlc1N0b3JlKTogUG9zdGdyZXNTdG9yZSB7XG4gIGNvbnN0IHNvZnQgPSBzdG9yZSBhcyB1bmtub3duIGFzIHtcbiAgICBpbml0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIGlkOiBzdHJpbmc7XG4gICAgc2NoZW1hPzogc3RyaW5nO1xuICAgIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIH07XG4gIGNvbnN0IG9yaWdpbmFsSW5pdCA9IHNvZnQuaW5pdC5iaW5kKHNvZnQpO1xuICBsZXQgc29mdEluaXRQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gIHNvZnQuaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoc29mdC5pc0luaXRpYWxpemVkKSByZXR1cm47XG4gICAgc29mdEluaXRQcm9taXNlID8/PSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgb3JpZ2luYWxJbml0KCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFhcHBraXRNaWdyYXRpb24uaGFuZGxlT3duZXJzaGlwTWlncmF0aW9uRXJyb3IoZXJyLCB7XG4gICAgICAgICAgICBzY29wZTogXCJtYXN0cmEtc3RvcmFnZVwiLFxuICAgICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgICAgZXZlbnQ6IFwibWFzdHJhIHN0b3JhZ2UgbWlncmF0aW9uIGZhaWxlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogeyBzdG9yZUlkOiBzb2Z0LmlkLCBzY2hlbWE6IHNvZnQuc2NoZW1hIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc29mdEluaXRQcm9taXNlO1xuICAgICAgc29mdC5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNvZnRJbml0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH07XG4gIHJldHVybiBzdG9yZTtcbn1cblxuLyoqIEVmZmVjdGl2ZSBwZXIta25vYiBzZXR0aW5nIGFmdGVyIHRoZSBwbHVnaW4vYWdlbnQgY2FzY2FkZS4gKi9cbnR5cGUgU3RvcmFnZVNldHRpbmcgPSBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25bXCJzdG9yYWdlXCJdO1xudHlwZSBNZW1vcnlTZXR0aW5nID0gQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1wibWVtb3J5XCJdO1xuXG4vKipcbiAqIFRydWUgd2hlbiBhbnkgcGx1Z2luLWxldmVsIG9yIHBlci1hZ2VudCBzZXR0aW5nIGNvdWxkIG5lZWQgdGhlXG4gKiBMYWtlYmFzZSBwb29sLiBVc2VkIGJ5IGBwbHVnaW4udHNgIHRvIGdhdGUgY3JlYXRpb24gb2YgdGhlXG4gKiBzZXJ2aWNlLXByaW5jaXBhbCBwb29sIGFuZCB0aGUge0BsaW5rIE1lbW9yeUJ1aWxkZXJ9IHRoYXQgY29uc3VtZXNcbiAqIGl0OyB3aGVuIGZhbHNlIG5laXRoZXIgaXMgYnVpbHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZWVkc0xha2ViYXNlKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmIChzZXR0aW5nTmVlZHNTaGFyZWRQb29sKGNvbmZpZy5zdG9yYWdlKSkgcmV0dXJuIHRydWU7XG4gIGlmIChzZXR0aW5nTmVlZHNTaGFyZWRQb29sKGNvbmZpZy5tZW1vcnkpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgZGVmcyA9IGNvbGxlY3RBZ2VudERlZmluaXRpb25zKGNvbmZpZyk7XG4gIHJldHVybiBkZWZzLnNvbWUoKGQpID0+IHNldHRpbmdOZWVkc1NoYXJlZFBvb2woZC5zdG9yYWdlKSB8fCBzZXR0aW5nTmVlZHNTaGFyZWRQb29sKGQubWVtb3J5KSk7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgcGVyLWFnZW50IHtAbGluayBNZW1vcnl9IGZhY3RvcnkgYm91bmQgdG8gdGhlIG9wdGlvbmFsXG4gKiBzZXJ2aWNlLXByaW5jaXBhbCBMYWtlYmFzZSBwb29sLlxuICogQ2FjaGVzIHRoZSBzaGFyZWQgYFBnVmVjdG9yYCBzaW5nbGV0b24gKGJ1aWx0IG9uIGZpcnN0IG5lZWQpIHNvIGVhY2hcbiAqIGFnZW50IGJ1aWxkIGlzIE8oMSkgYWZ0ZXIgdGhlIGZpcnN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWVtb3J5QnVpbGRlcihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHNlcnZpY2VQcmluY2lwYWxQb29sPzogUG9vbCxcbik6IE1lbW9yeUJ1aWxkZXIge1xuICByZXR1cm4gbmV3IE1lbW9yeUJ1aWxkZXIoY29uZmlnLCBzZXJ2aWNlUHJpbmNpcGFsUG9vbCk7XG59XG5cbi8qKlxuICogQnVpbGRzIG9uZSBgTWVtb3J5YCBwZXIgYWdlbnQgYWdhaW5zdCBhIHNoYXJlZCBzZXJ2aWNlLXByaW5jaXBhbFxuICogTGFrZWJhc2UgcG9vbC4gUGVyLWluc3RhbmNlIHN0YXRlIGtlZXBzIHRoZSBzaGFyZWQgYFBnVmVjdG9yYCBhbGl2ZVxuICogYWNyb3NzIGNhbGxzIHNvIHJlZ2lzdGVyaW5nIE4gYWdlbnRzIHN0YXlzIGNoZWFwLlxuICovXG5leHBvcnQgY2xhc3MgTWVtb3J5QnVpbGRlciB7XG4gIHByaXZhdGUgc2hhcmVkVmVjdG9yOiBQZ1ZlY3RvciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZVByaW5jaXBhbFBvb2w/OiBQb29sLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBNYXN0cmEtaW5zdGFuY2UtbGV2ZWwgc3RvcmFnZSB1c2VkIGZvciB3b3JrZmxvd1xuICAgKiBzbmFwc2hvdHMuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiBwbHVnaW4tbGV2ZWwgYHN0b3JhZ2VgIGlzXG4gICAqIGRpc2FibGVkLCBpbiB3aGljaCBjYXNlIGBhZ2VudC5yZXN1bWVTdHJlYW0oKWAgKGFuZCB0aGVyZWZvcmVcbiAgICogdGhlIGByZXF1aXJlQXBwcm92YWxgIGZsb3cpIHdpbGwgbm90IGJlIGF2YWlsYWJsZS5cbiAgICpcbiAgICogVGhlIHN0b3JlIGxpdmVzIGluIGEgZGVkaWNhdGVkIGBtYXN0cmFfaW5zdGFuY2VgIHNjaGVtYSBzbyBpdFxuICAgKiBuZXZlciBjb2xsaWRlcyB3aXRoIHBlci1hZ2VudCB7QGxpbmsgYWdlbnRTdG9yYWdlU2NoZW1hTmFtZX0gbmFtZXNwYWNlcy5cbiAgICogV29ya2Zsb3cgc25hcHNob3RzIGFyZSBub3QgcGVyLWFnZW50IHN0YXRlOyB0aGV5IGJlbG9uZyB0byB0aGVcbiAgICogYE1hc3RyYWAgaW5zdGFuY2UgdGhhdCBvd25zIHRoZSB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAqL1xuICBpbnN0YW5jZVN0b3JhZ2UoKTogUG9zdGdyZXNTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2V0dGluZyA9IHRoaXMuY29uZmlnLnN0b3JhZ2U7XG4gICAgaWYgKCFzZXR0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2Ygc2V0dGluZyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHdpdGhTb2Z0U3RvcmFnZUluaXQoXG4gICAgICAgIG5ldyBQb3N0Z3Jlc1N0b3JlKFxuICAgICAgICAgIHdpdGhJZChzZXR0aW5nLCBcIm1hc3RyYS1zdG9yZV9faW5zdGFuY2VcIikgYXMgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFxuICAgICAgICAgICAgdHlwZW9mIFBvc3RncmVzU3RvcmVcbiAgICAgICAgICA+WzBdLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB3aXRoU29mdFN0b3JhZ2VJbml0KFxuICAgICAgbmV3IFBvc3RncmVzU3RvcmUoe1xuICAgICAgICBpZDogXCJtYXN0cmEtc3RvcmVfX2luc3RhbmNlXCIsXG4gICAgICAgIHNjaGVtYU5hbWU6IFwibWFzdHJhX2luc3RhbmNlXCIsXG4gICAgICAgIHBvb2w6IHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgYE1lbW9yeWAgZm9yIGBhZ2VudElkYCBhZnRlciB0aGUgcGx1Z2luL2FnZW50IGNhc2NhZGUuXG4gICAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgYWdlbnQgaGFzIG5laXRoZXIgc3RvcmFnZSBub3IgYVxuICAgKiB2ZWN0b3Igc3RvcmUgZW5hYmxlZCAtIE1hc3RyYSBhY2NlcHRzIGEgbWlzc2luZyBgbWVtb3J5YCBmaWVsZFxuICAgKiBhbmQgdHJlYXRzIHRoZSBhZ2VudCBhcyBzdGF0ZWxlc3MuXG4gICAqL1xuICBmb3JBZ2VudChhZ2VudElkOiBzdHJpbmcsIGRlZjogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uKTogTWVtb3J5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzdG9yYWdlU2V0dGluZyA9IGRlZi5zdG9yYWdlID8/IHRoaXMuY29uZmlnLnN0b3JhZ2U7XG4gICAgY29uc3QgbWVtb3J5U2V0dGluZyA9IGRlZi5tZW1vcnkgPz8gdGhpcy5jb25maWcubWVtb3J5O1xuXG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYnVpbGRTdG9yYWdlKGFnZW50SWQsIHN0b3JhZ2VTZXR0aW5nKTtcbiAgICBjb25zdCB2ZWN0b3IgPSB0aGlzLmJ1aWxkVmVjdG9yKG1lbW9yeVNldHRpbmcpO1xuICAgIGlmICghc3RvcmFnZSAmJiAhdmVjdG9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJhZ2VudDpzdGF0ZWxlc3NcIiwgeyBhZ2VudElkIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoXCJhZ2VudDpjb25maWd1cmVkXCIsIHtcbiAgICAgIGFnZW50SWQsXG4gICAgICBzdG9yYWdlOiBzdG9yYWdlICE9PSB1bmRlZmluZWQsXG4gICAgICB2ZWN0b3I6IHZlY3RvciAhPT0gdW5kZWZpbmVkLFxuICAgICAgdmVjdG9yTW9kZTpcbiAgICAgICAgdmVjdG9yID09PSB1bmRlZmluZWQgPyBcIm9mZlwiIDogdHlwZW9mIG1lbW9yeVNldHRpbmcgPT09IFwib2JqZWN0XCIgPyBcImRlZGljYXRlZFwiIDogXCJzaGFyZWRcIixcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgTWVtb3J5KHtcbiAgICAgIC4uLihzdG9yYWdlID8geyBzdG9yYWdlIH0gOiB7fSksXG4gICAgICAuLi4odmVjdG9yID8geyB2ZWN0b3IsIGVtYmVkZGVyOiBmYXN0ZW1iZWQgfSA6IHt9KSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgbGFzdE1lc3NhZ2VzOiAxMCxcbiAgICAgICAgLi4uKHZlY3RvclxuICAgICAgICAgID8geyBzZW1hbnRpY1JlY2FsbDogeyB0b3BLOiAzLCBtZXNzYWdlUmFuZ2U6IDIsIHNjb3BlOiBcInJlc291cmNlXCIgYXMgY29uc3QgfSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC8vIEF1dG8tbmFtZSBlYWNoIHRocmVhZCBmcm9tIGl0cyBvcGVuaW5nIHR1cm4gc28gdGhlXG4gICAgICAgIC8vIGNvbnZlcnNhdGlvbiBsaXN0IHRoZSBVSSByZW5kZXJzIHNob3dzIG1lYW5pbmdmdWwgdGl0bGVzXG4gICAgICAgIC8vIGluc3RlYWQgb2YgcmF3IGlkcy4gVGl0bGluZyBydW5zIG9uIHRoZSBzbWFsbCAvIGZhc3QgY2hhdFxuICAgICAgICAvLyB0aWVyIChzZWUgYHN1bW1hcml6ZS50c2ApIHJhdGhlciB0aGFuIHRoZSBhZ2VudCdzIHByaW1hcnlcbiAgICAgICAgLy8gbW9kZWwsIHNvIG5hbWluZyBhIHRocmVhZCBuZXZlciBzcGVuZHMgdGhlIGhlYXZ5d2VpZ2h0IG1vZGVsLlxuICAgICAgICAvLyBPbmx5IG1lYW5pbmdmdWwgd2hlbiBzdG9yYWdlIGlzIG9uOyBoYXJtbGVzcyBvdGhlcndpc2UuXG4gICAgICAgIC4uLihzdG9yYWdlXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGdlbmVyYXRlVGl0bGU6IHtcbiAgICAgICAgICAgICAgICBtb2RlbDogc3VtbWFyeU1vZGVsKHRoaXMuY29uZmlnKSxcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnM6IFRJVExFX0lOU1RSVUNUSU9OUyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3RvcmFnZShhZ2VudElkOiBzdHJpbmcsIHNldHRpbmc6IFN0b3JhZ2VTZXR0aW5nKTogUG9zdGdyZXNTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFzZXR0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2Ygc2V0dGluZyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmICghdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB3aXRoU29mdFN0b3JhZ2VJbml0KFxuICAgICAgICBuZXcgUG9zdGdyZXNTdG9yZSh7XG4gICAgICAgICAgaWQ6IGBtYXN0cmEtc3RvcmVfXyR7YWdlbnRJZH1gLFxuICAgICAgICAgIHNjaGVtYU5hbWU6IGFnZW50U3RvcmFnZVNjaGVtYU5hbWUoYWdlbnRJZCksXG4gICAgICAgICAgcG9vbDogdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBDYXN0OiBgd2l0aElkYCBndWFyYW50ZWVzIGBpZGAgaXMgc2V0LCBidXQgdGhlIGRpc3RyaWJ1dGl2ZVxuICAgIC8vIE9taXQgKyBgaWQ/OiBzdHJpbmdgIHNoYXBlIGRvZXNuJ3Qgc3RydWN0dXJhbGx5IG5hcnJvdyB0byB0aGVcbiAgICAvLyBkaXNjcmltaW5hdGVkIHVuaW9uIG1lbWJlcnMuIFJ1bnRpbWUgc2hhcGUgaXMgaWRlbnRpY2FsLlxuICAgIHJldHVybiB3aXRoU29mdFN0b3JhZ2VJbml0KFxuICAgICAgbmV3IFBvc3RncmVzU3RvcmUoXG4gICAgICAgIHdpdGhJZChzZXR0aW5nLCBgbWFzdHJhLXN0b3JlX18ke2FnZW50SWR9YCkgYXMgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFxuICAgICAgICAgIHR5cGVvZiBQb3N0Z3Jlc1N0b3JlXG4gICAgICAgID5bMF0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgYWdlbnQncyB2ZWN0b3Igc3RvcmUuIENhc2NhZGU6XG4gICAqXG4gICAqIC0gZmFsc3k6IG5vIHZlY3Rvci5cbiAgICogLSBgYm9vbGVhbmAgLyBgdW5kZWZpbmVkLWluaGVyaXRpbmctdHJ1ZWA6IHJldHVybiB0aGUgc2hhcmVkXG4gICAqICAgc2luZ2xldG9uIChidWlsdCBsYXppbHkgb24gZmlyc3QgY2FsbCkuIEFsbCBhZ2VudHMgdGhhdFxuICAgKiAgIGRlZmF1bHQtZW5hYmxlIG1lbW9yeSB3cml0ZSBpbnRvIGFuZCByZWNhbGwgZnJvbSBvbmUgaW5kZXguXG4gICAqIC0gb2JqZWN0OiBidWlsZCBhIGRlZGljYXRlZCBgUGdWZWN0b3JgIGZvciB0aGlzIGFnZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFZlY3RvcihzZXR0aW5nOiBNZW1vcnlTZXR0aW5nKTogUGdWZWN0b3IgfCB1bmRlZmluZWQge1xuICAgIGlmICghc2V0dGluZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHNldHRpbmcgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gdGhpcy5nZXRTaGFyZWRWZWN0b3IoKTtcbiAgICByZXR1cm4gYnVpbGRQZ1ZlY3RvcihzZXR0aW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2hhcmVkVmVjdG9yKCk6IFBnVmVjdG9yIHtcbiAgICBpZiAoIXRoaXMuc2hhcmVkVmVjdG9yKSB7XG4gICAgICBpZiAoIXRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTGFrZWJhc2UgaXMgcmVxdWlyZWQgZm9yIFBnVmVjdG9yIG1lbW9yeVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2hhcmVkVmVjdG9yID0gYnVpbGRTaGFyZWRQZ1ZlY3Rvcih0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkVmVjdG9yO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHNoYXJlZCBgUGdWZWN0b3JgIHRoYXQgYmFja3MgdGhlIGRlZmF1bHRcbiAqIGBkZWYubWVtb3J5ID09PSB0cnVlYCBjYXNlIGFjcm9zcyBldmVyeSBhZ2VudC5cbiAqXG4gKiBgUGdWZWN0b3JgJ3MgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGNvbm5lY3Rpb24tc3R5bGUgY29uZmlnc1xuICogKGBIb3N0Q29uZmlnYCAvIGBDb25uZWN0aW9uU3RyaW5nQ29uZmlnYCAvIGBDbGllbnRDb25maWdgKTsgdGhlcmUgaXNcbiAqIG5vIGB7IHBvb2wgfWAgc2hvcnRoYW5kIHRoZSB3YXkgYFBvc3RncmVzU3RvcmVgIGhhcyBvbmUuIFdvcnNlLCB0aGVcbiAqIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkga2lja3Mgb2ZmIGEgYGNhY2hlV2FybXVwUHJvbWlzZWAgSUlGRSB0aGF0XG4gKiBjYWxscyBgdGhpcy5wb29sLmNvbm5lY3QoKWAgYmVmb3JlIHJldHVybmluZywgc28gd2UgY2FuJ3QgY2xlYW5seVxuICogaGFuZCBpdCBhbiBpbmVydCBjb25maWcgYW5kIHBhdGNoIHRoZSBwb29sIGFmdGVyd2FyZHMuXG4gKlxuICogVGhlIHRyaWNrOiBwYXNzIGlsbGVnYWwtYnV0LXZhbGlkYXRpb24tcGFzc2luZyBwbGFjZWhvbGRlcnMgc28gdGhlXG4gKiB3YXJtdXAncyBgbmV0LmNvbm5lY3QoKWAgcmVqZWN0cyBzeW5jaHJvbm91c2x5IHdpdGggYFJhbmdlRXJyb3JgXG4gKiAoTm9kZSB2YWxpZGF0ZXMgYDAgPD0gcG9ydCA8IDY1NTM2YCkuIFRoZSBJSUZFJ3MgYGNhdGNoIHt9YCBzd2FsbG93c1xuICogaXQsIG5vIEROUyBsb29rdXAgb3IgVENQIGF0dGVtcHQgaGFwcGVucywgYW5kIHdlIHRoZW4gc3dhcFxuICogYHBnVmVjdG9yLnBvb2xgIHRvIHRoZSBsYWtlYmFzZSBwb29sLiBFdmVyeSBzdWJzZXF1ZW50IGBQZ1ZlY3RvcmBcbiAqIG1ldGhvZCByZWFkcyBgdGhpcy5wb29sYCBhdCBjYWxsIHRpbWUsIHNvIGFsbCByZWFsIEkvTyBnb2VzIHRocm91Z2hcbiAqIHRoZSBsYWtlYmFzZSBwb29sIGZyb20gdGhlbiBvbi4gVGhlIHBsYWNlaG9sZGVyIHBvb2wgaXMgYC5lbmQoKWAnZFxuICogc28gaXRzIHNvY2tldCBib29rLWtlZXBpbmcgaXMgcmVsZWFzZWQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2hhcmVkUGdWZWN0b3IocG9vbDogUG9vbCk6IFBnVmVjdG9yIHtcbiAgY29uc3QgdmVjdG9yID0gbmV3IFBnVmVjdG9yKHtcbiAgICBpZDogYHBnJHtoYXNoLmlkKCl9YCxcbiAgICAvLyBLZWVwIHRoZSByZWNhbGwgaW5kZXggb3V0IG9mIGBwdWJsaWNgOiBvbiBhIExha2ViYXNlIGRhdGFiYXNlIHRoZSBhcHBcbiAgICAvLyBzZXJ2aWNlIHByaW5jaXBhbCBoYXMgbm8gQ1JFQVRFIG9uIGBwdWJsaWNgIChQRzE1KyBsb2NrcyBpdCBkb3duKSwgc28gYVxuICAgIC8vIGRlZmF1bHQtc2NoZW1hIFBnVmVjdG9yIGZhaWxzIG9uIENSRUFURSBJTkRFWCB3aXRoIFwicGVybWlzc2lvbiBkZW5pZWQgZm9yXG4gICAgLy8gc2NoZW1hIHB1YmxpY1wiLiBQZ1ZlY3RvciBydW5zIENSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUUyBmb3IgYSBuYW1lZFxuICAgIC8vIHNjaGVtYSwgc28gdGhlIFNQIGNyZWF0ZXMgYW5kIG93bnMgYG1hc3RyYV9pbnN0YW5jZWAgKHRoZSBzYW1lXG4gICAgLy8gaW5zdGFuY2UtbGV2ZWwgc2NoZW1hIHRoZSB3b3JrZmxvdy1zbmFwc2hvdCBzdG9yZSB1c2VzKSBhbmQgdGhlIGluZGV4XG4gICAgLy8gbGFuZHMgdGhlcmUuIFRhYmxlIG5hbWVzIGRvbid0IGNvbGxpZGUgd2l0aCB0aGUgc3RvcmFnZSB0YWJsZXMuXG4gICAgc2NoZW1hTmFtZTogXCJtYXN0cmFfaW5zdGFuY2VcIixcbiAgICBob3N0OiBcIi0xXCIsXG4gICAgcG9ydDogLTEsXG4gICAgZGF0YWJhc2U6IFwiX1wiLFxuICAgIHVzZXI6IFwiX1wiLFxuICAgIHBhc3N3b3JkOiBcIl9cIixcbiAgfSk7XG4gIGNvbnN0IHBsYWNlaG9sZGVyID0gdmVjdG9yLnBvb2w7XG4gIHZlY3Rvci5wb29sID0gcG9vbDtcbiAgdm9pZCBwbGFjZWhvbGRlci5lbmQoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICByZXR1cm4gdmVjdG9yO1xufVxuXG4vKiogUGVyLWFnZW50IGRlZGljYXRlZCBgUGdWZWN0b3JgIChyYXJlOyBvcHQtaW4gdmlhIG9iamVjdCBvdmVycmlkZSkuICovXG5mdW5jdGlvbiBidWlsZFBnVmVjdG9yKHNldHRpbmc6IE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlKTogUGdWZWN0b3Ige1xuICByZXR1cm4gbmV3IFBnVmVjdG9yKFxuICAgIHdpdGhJZChzZXR0aW5nLCBgcGctdmVjdG9yX18ke2hhc2guaWQoKX1gKSBhcyBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIFBnVmVjdG9yPlswXSxcbiAgKTtcbn1cblxuLyoqIFRydWUgd2hlbiB0aGlzIHNldHRpbmcgcmVxdWlyZXMgdGhlIHNoYXJlZCBMYWtlYmFzZSBwb29sLiAqL1xuZnVuY3Rpb24gc2V0dGluZ05lZWRzU2hhcmVkUG9vbChzZXR0aW5nOiBTdG9yYWdlU2V0dGluZyB8IE1lbW9yeVNldHRpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNldHRpbmcgPT09IHRydWU7XG59XG5cbi8qKiBXYWxrIHRoZSB0aHJlZSBzaGFwZXMgb2YgYGNvbmZpZy5hZ2VudHNgIGludG8gYSBmbGF0IGxpc3QuICovXG5mdW5jdGlvbiBjb2xsZWN0QWdlbnREZWZpbml0aW9ucyhjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbltdIHtcbiAgY29uc3QgYWdlbnRzID0gY29uZmlnLmFnZW50cztcbiAgaWYgKCFhZ2VudHMpIHJldHVybiBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYWdlbnRzKSkgcmV0dXJuIGFnZW50cztcbiAgaWYgKFwiaW5zdHJ1Y3Rpb25zXCIgaW4gYWdlbnRzKSB7XG4gICAgcmV0dXJuIFthZ2VudHMgYXMgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uXTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhhZ2VudHMpO1xufVxuXG4vKiogRmlsbCBpbiBhIGRlZmF1bHQgYGlkYCB3aGVuIHRoZSBjYWxsZXIgZGlkbid0IHN1cHBseSBvbmUuICovXG5mdW5jdGlvbiB3aXRoSWQ8VCBleHRlbmRzIHsgaWQ/OiBzdHJpbmcgfT4odmFsdWU6IFQsIGZhbGxiYWNrOiBzdHJpbmcpOiBUIHtcbiAgcmV0dXJuIHZhbHVlLmlkID8gdmFsdWUgOiB7IC4uLnZhbHVlLCBpZDogZmFsbGJhY2sgfTtcbn1cbiJdfQ==
|
|
345
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFFSCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWpELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsb0JBQW9CLEdBRXJCLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFtQixNQUFNLElBQUksQ0FBQztBQUkzQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUUzQyw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxjQUF1RDtJQUV2RCxNQUFNLFFBQVEsR0FBRyxjQUFjLEVBQUUsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDM0QsTUFBTSxVQUFVLEdBQUcsY0FBYyxFQUFFLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQy9ELElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNyRixPQUFPLEVBQUUsTUFBTSxF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O0FBQ0osQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLHNCQUFzQixDQUFDLE9BQW1EO0lBQ2pGLE9BQU8sT0FBTyxLQUFLLElBQUksQ0FBQztBQUMxQixDQUFDO0FBRUQsaUVBQWlFO0FBQ2pFLFNBQVMsdUJBQXVCLENBQUMsTUFBMEI7SUFDekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM3QixJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3ZCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUN6QyxJQUFJLGNBQWMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsTUFBa0MsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLE1BQU0sQ0FBNEIsS0FBUSxFQUFFLFFBQWdCO0lBQ25FLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMYWtlYmFzZS1iYWNrZWQgTWFzdHJhIG1lbW9yeSB3aXJpbmcuXG4gKlxuICogUHJvdmlkZXMgYSB7QGxpbmsgTWVtb3J5QnVpbGRlcn0gdGhhdCBtaW50cyBvbmUgYE1lbW9yeWAgcGVyIGFnZW50XG4gKiB3aXRoIHR3byBpbmRlcGVuZGVudCBrbm9iczpcbiAqXG4gKiAtICoqU3RvcmFnZSoqICh0aHJlYWRzIC8gbWVzc2FnZXMgdmlhIGBQb3N0Z3Jlc1N0b3JlYCk6IGRlZmF1bHRzIHRvXG4gKiAgICoqcGVyLWFnZW50KiogbmFtZXNwYWNpbmcgdmlhIHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBzb1xuICogICBjb252ZXJzYXRpb24gaGlzdG9yeSBzdGF5cyBpc29sYXRlZCBiZXR3ZWVuIGFnZW50cyBpbiB0aGUgc2FtZVxuICogICBkYXRhYmFzZS4gYFBvc3RncmVzU3RvcmVgIGF1dG8tY3JlYXRlcyB0aGUgc2NoZW1hIHdpdGhcbiAqICAgYENSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUU2Agb24gaW5pdC4gQSBmYWlsZWQgbWlncmF0aW9uIChjb21tb24gb25cbiAqICAgTGFrZWJhc2Ugd2hlbiB0aGUgY29ubmVjdGluZyByb2xlIGlzIG5vdCB0aGUgdGFibGUgb3duZXIpIGlzIGxvZ2dlZFxuICogICBhbmQgc2tpcHBlZCB2aWEge0BsaW5rIHdpdGhTb2Z0U3RvcmFnZUluaXR9IHNvIGV4aXN0aW5nIHRhYmxlcyBrZWVwXG4gKiAgIHNlcnZpbmcgaW5zdGVhZCBvZiByZXRyeWluZyBEREwgb24gZXZlcnkgcmVxdWVzdC5cbiAqIC0gKipNZW1vcnkqKiAoc2VtYW50aWMgcmVjYWxsIHZpYSBgUGdWZWN0b3JgKTogZGVmYXVsdHMgdG8gYSBzaW5nbGVcbiAqICAgKipzaGFyZWQqKiBpbnN0YW5jZSBhY3Jvc3MgZXZlcnkgYWdlbnQuIENyb3NzLWFnZW50IHJlY2FsbCBvbiBvbmVcbiAqICAgaW5kZXggaXMgYWxtb3N0IGFsd2F5cyB3aGF0IHVzZXJzIHdhbnQ7IG9wdCBpbnRvIHBlci1hZ2VudCByZWNhbGxcbiAqICAgYnkgcGFzc2luZyBhIHtAbGluayBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZX0gb24gdGhlIGFnZW50LlxuICpcbiAqIEFkZGl0aW9uYWxseSwge0BsaW5rIE1lbW9yeUJ1aWxkZXIuaW5zdGFuY2VTdG9yYWdlfSByZXR1cm5zIGFcbiAqICoqTWFzdHJhLWluc3RhbmNlLWxldmVsKiogYFBvc3RncmVzU3RvcmVgIChzY2hlbWEgYG1hc3RyYV9pbnN0YW5jZWApXG4gKiB1c2VkIGZvciB3b3JrZmxvdyBzbmFwc2hvdHMgLSB0aGUgcGVyc2lzdGVuY2UgbGF5ZXJcbiAqIGBhZ2VudC5yZXN1bWVTdHJlYW0oKWAgcmVhZHMgZnJvbSB3aGVuIHdha2luZyBhIHN1c3BlbmRlZFxuICogYHJlcXVpcmVBcHByb3ZhbGAgdG9vbCBjYWxsLiBQZXItYWdlbnQgc3RvcmVzIGFyZSBub3QgZW5vdWdoIGZvclxuICogdGhpczogd29ya2Zsb3cgcnVucyBhcmUgc2NvcGVkIHRvIHRoZSBNYXN0cmEgaW5zdGFuY2UsIG5vdCBhblxuICogaW5kaXZpZHVhbCBhZ2VudCdzIGBNZW1vcnlgLlxuICpcbiAqIFBsdWdpbi1sZXZlbCBgY29uZmlnLnN0b3JhZ2VgIC8gYGNvbmZpZy5tZW1vcnlgIGFjdCBhcyB0aGUgYmFzZWxpbmVcbiAqIChhdXRvLWRlZmF1bHRlZCB0byBgdHJ1ZWAgaW4gYHBsdWdpbi50c2Agd2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW5cbiAqIGlzIHJlZ2lzdGVyZWQpOyBwZXItYWdlbnQgc2V0dGluZ3MgY2FzY2FkZSBvbiB0b3Agb2YgdGhhdC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaGFuZGxlT3duZXJzaGlwTWlncmF0aW9uRXJyb3IgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGxvZywgaWQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudE1lbW9yeU9wdGlvbiB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB7XG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICB0eXBlIFJlcXVlc3RDb250ZXh0LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgZmFzdGVtYmVkIH0gZnJvbSBcIkBtYXN0cmEvZmFzdGVtYmVkXCI7XG5pbXBvcnQgeyBNZW1vcnkgfSBmcm9tIFwiQG1hc3RyYS9tZW1vcnlcIjtcbmltcG9ydCB7IFBnVmVjdG9yLCBQb3N0Z3Jlc1N0b3JlIH0gZnJvbSBcIkBtYXN0cmEvcGdcIjtcbmltcG9ydCB7IFBvb2wsIHR5cGUgUG9vbENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgdHlwZSB7IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbiwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUgfSBmcm9tIFwiLi9hZ2VudHMudHNcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lIH0gZnJvbSBcIi4vc3RvcmFnZS1zY2hlbWEudHNcIjtcbmltcG9ydCB7IHN1bW1hcnlNb2RlbCwgVElUTEVfSU5TVFJVQ1RJT05TIH0gZnJvbSBcIi4vc3VtbWFyaXplLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvbWVtb3J5XCIpO1xuXG4vKiogUmVzb2x2ZSB0aGUgdHJ1c3RlZCBNYXN0cmEgbWVtb3J5IHNjb3BlIHN0YW1wZWQgYnkgQXBwS2l0IG1pZGRsZXdhcmUuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdE1lbW9yeVNjb3BlKFxuICByZXF1ZXN0Q29udGV4dDogUGljazxSZXF1ZXN0Q29udGV4dCwgXCJnZXRcIj4gfCB1bmRlZmluZWQsXG4pOiBBZ2VudE1lbW9yeU9wdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRocmVhZElkID0gcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSk7XG4gIGNvbnN0IHJlc291cmNlSWQgPSByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkpO1xuICBpZiAodHlwZW9mIHRocmVhZElkICE9PSBcInN0cmluZ1wiIHx8IHR5cGVvZiByZXNvdXJjZUlkICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4geyB0aHJlYWQ6IHRocmVhZElkLCByZXNvdXJjZTogcmVzb3VyY2VJZCB9O1xufVxuXG4vKiogT3ZlcmxheSB0cnVzdGVkIHJlcXVlc3QgbWVtb3J5IGlkZW50aWZpZXJzIG9udG8gTWFzdHJhIGV4ZWN1dGlvbiBvcHRpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZXF1ZXN0TWVtb3J5U2NvcGU8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9wdGlvbnM6IFQsXG4gIHJlcXVlc3RDb250ZXh0OiBQaWNrPFJlcXVlc3RDb250ZXh0LCBcImdldFwiPiB8IHVuZGVmaW5lZCxcbik6IFQgJiB7IG1lbW9yeT86IEFnZW50TWVtb3J5T3B0aW9uIH0ge1xuICBjb25zdCBzY29wZSA9IHJlcXVlc3RNZW1vcnlTY29wZShyZXF1ZXN0Q29udGV4dCk7XG4gIGlmICghc2NvcGUpIHJldHVybiBvcHRpb25zO1xuICBjb25zdCBtZW1vcnkgPSAob3B0aW9ucyBhcyB7IG1lbW9yeT86IEFnZW50TWVtb3J5T3B0aW9uIH0pLm1lbW9yeTtcbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1lbW9yeToge1xuICAgICAgLi4ubWVtb3J5LFxuICAgICAgLi4uc2NvcGUsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTb2Z0ZW4ge0BsaW5rIFBvc3RncmVzU3RvcmUuaW5pdH0gc28gYSBmYWlsZWQgbWlncmF0aW9uIChlLmcuIExha2ViYXNlXG4gKiBgbXVzdCBiZSBvd25lciBvZiB0YWJsZSDigKZgIG9uIGBBTFRFUmApIGlzIGxvZ2dlZCBvbmNlIGluc3RlYWQgb2YgcmV0aHJvd25cbiAqIG9uIGV2ZXJ5IHN0b3JhZ2UgY2FsbC5cbiAqXG4gKiBNYXN0cmEncyBgYXVnbWVudFdpdGhJbml0YCByZXRyaWVzIGluaXQgZm9yZXZlciB3aGVuIGl0IHRocm93cywgc28gdGhlXG4gKiBvbmx5IHdheSB0byBrZWVwIHNlcnZpbmcgYWdhaW5zdCBhbiBhbHJlYWR5LXVzYWJsZSBzY2hlbWEgaXMgdG8gdHJlYXRcbiAqIG1pZ3JhdGlvbiBmYWlsdXJlIGFzIHN1Y2Nlc3MgYW5kIG1hcmsgdGhlIHN0b3JlIGluaXRpYWxpemVkLlxuICpcbiAqIENvbmN1cnJlbnQgZmlyc3QgY2FsbGVycyBzaGFyZSBvbmUgc29mdCBhdHRlbXB0LiBOb24tb3duZXJzaGlwIGZhaWx1cmVzIHN0YXlcbiAqIGZhdGFsIHNvIG1pc3Npbmcgc2NoZW1hcy90YWJsZXMgYXJlIHJldHJpZWQgb3Igc3VyZmFjZWQgaW5zdGVhZCBvZiBoaWRkZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU29mdFN0b3JhZ2VJbml0KHN0b3JlOiBQb3N0Z3Jlc1N0b3JlKTogUG9zdGdyZXNTdG9yZSB7XG4gIGNvbnN0IHNvZnQgPSBzdG9yZSBhcyB1bmtub3duIGFzIHtcbiAgICBpbml0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIGlkOiBzdHJpbmc7XG4gICAgc2NoZW1hPzogc3RyaW5nO1xuICAgIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIH07XG4gIGNvbnN0IG9yaWdpbmFsSW5pdCA9IHNvZnQuaW5pdC5iaW5kKHNvZnQpO1xuICBsZXQgc29mdEluaXRQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gIHNvZnQuaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoc29mdC5pc0luaXRpYWxpemVkKSByZXR1cm47XG4gICAgc29mdEluaXRQcm9taXNlID8/PSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgb3JpZ2luYWxJbml0KCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFoYW5kbGVPd25lcnNoaXBNaWdyYXRpb25FcnJvcihlcnIsIHtcbiAgICAgICAgICAgIHNjb3BlOiBcIm1hc3RyYS1zdG9yYWdlXCIsXG4gICAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgICBldmVudDogXCJtYXN0cmEgc3RvcmFnZSBtaWdyYXRpb24gZmFpbGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiB7IHN0b3JlSWQ6IHNvZnQuaWQsIHNjaGVtYTogc29mdC5zY2hlbWEgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzb2Z0SW5pdFByb21pc2U7XG4gICAgICBzb2Z0LmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc29mdEluaXRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHN0b3JlO1xufVxuXG4vKiogRWZmZWN0aXZlIHBlci1rbm9iIHNldHRpbmcgYWZ0ZXIgdGhlIHBsdWdpbi9hZ2VudCBjYXNjYWRlLiAqL1xudHlwZSBTdG9yYWdlU2V0dGluZyA9IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbltcInN0b3JhZ2VcIl07XG50eXBlIE1lbW9yeVNldHRpbmcgPSBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25bXCJtZW1vcnlcIl07XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGFueSBwbHVnaW4tbGV2ZWwgb3IgcGVyLWFnZW50IHNldHRpbmcgY291bGQgbmVlZCB0aGVcbiAqIExha2ViYXNlIHBvb2wuIFVzZWQgYnkgYHBsdWdpbi50c2AgdG8gZ2F0ZSBjcmVhdGlvbiBvZiB0aGVcbiAqIHNlcnZpY2UtcHJpbmNpcGFsIHBvb2wgYW5kIHRoZSB7QGxpbmsgTWVtb3J5QnVpbGRlcn0gdGhhdCBjb25zdW1lc1xuICogaXQ7IHdoZW4gZmFsc2UgbmVpdGhlciBpcyBidWlsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5lZWRzTGFrZWJhc2UoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBib29sZWFuIHtcbiAgaWYgKHNldHRpbmdOZWVkc1NoYXJlZFBvb2woY29uZmlnLnN0b3JhZ2UpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHNldHRpbmdOZWVkc1NoYXJlZFBvb2woY29uZmlnLm1lbW9yeSkpIHJldHVybiB0cnVlO1xuICBjb25zdCBkZWZzID0gY29sbGVjdEFnZW50RGVmaW5pdGlvbnMoY29uZmlnKTtcbiAgcmV0dXJuIGRlZnMuc29tZSgoZCkgPT4gc2V0dGluZ05lZWRzU2hhcmVkUG9vbChkLnN0b3JhZ2UpIHx8IHNldHRpbmdOZWVkc1NoYXJlZFBvb2woZC5tZW1vcnkpKTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSBwZXItYWdlbnQge0BsaW5rIE1lbW9yeX0gZmFjdG9yeSBib3VuZCB0byB0aGUgb3B0aW9uYWxcbiAqIHNlcnZpY2UtcHJpbmNpcGFsIExha2ViYXNlIHBvb2wuXG4gKiBDYWNoZXMgdGhlIHNoYXJlZCBgUGdWZWN0b3JgIHNpbmdsZXRvbiAoYnVpbHQgb24gZmlyc3QgbmVlZCkgc28gZWFjaFxuICogYWdlbnQgYnVpbGQgaXMgTygxKSBhZnRlciB0aGUgZmlyc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZW1vcnlCdWlsZGVyKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgc2VydmljZVByaW5jaXBhbFBvb2w/OiBQb29sLFxuKTogTWVtb3J5QnVpbGRlciB7XG4gIHJldHVybiBuZXcgTWVtb3J5QnVpbGRlcihjb25maWcsIHNlcnZpY2VQcmluY2lwYWxQb29sKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgdGhlIHBsdWdpbi1vd25lZCBMYWtlYmFzZSBwb29sIHVzZWQgYnkgZHVyYWJsZSB3b3JrZmxvdyBzdG9yYWdlLlxuICpcbiAqIEBpbnRlcm5hbFxuICpcbiAqIEFwcEtpdCBzaHV0cyBwbHVnaW4gaG9va3MgZG93biBjb25jdXJyZW50bHksIHNvIGJvcnJvd2luZyB0aGUgbmF0aXZlXG4gKiBMYWtlYmFzZSBwbHVnaW4ncyBwb29sIGxldHMgaXRzIHNodXRkb3duIHJhY2UgTWFzdHJhJ3MgZmluYWwgc25hcHNob3Qgd3JpdGVzLlxuICogQSBjYWxsZXItcHJvdmlkZWQgcG9vbCBpcyBub3QgY2xvc2VkIGJ5IFBvc3RncmVzU3RvcmU7IGlkbGUgY29ubmVjdGlvbnMgZG9cbiAqIG5vdCBrZWVwIHRoZSBwcm9jZXNzIGFsaXZlIGFuZCByZW1haW4gYXZhaWxhYmxlIHRvIHJ1bnMgTWFzdHJhIGlzIHN0aWxsXG4gKiBkcmFpbmluZyBhZnRlciBpdHMgYm91bmRlZCBzaHV0ZG93biB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNYXN0cmFMYWtlYmFzZVBvb2woY29uZmlnOiBQb29sQ29uZmlnKTogUG9vbCB7XG4gIHJldHVybiBuZXcgUG9vbCh7XG4gICAgLi4uY29uZmlnLFxuICAgIGFsbG93RXhpdE9uSWRsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbi8qKlxuICogQnVpbGRzIG9uZSBgTWVtb3J5YCBwZXIgYWdlbnQgYWdhaW5zdCBhIHNoYXJlZCBzZXJ2aWNlLXByaW5jaXBhbFxuICogTGFrZWJhc2UgcG9vbC4gUGVyLWluc3RhbmNlIHN0YXRlIGtlZXBzIHRoZSBzaGFyZWQgYFBnVmVjdG9yYCBhbGl2ZVxuICogYWNyb3NzIGNhbGxzIHNvIHJlZ2lzdGVyaW5nIE4gYWdlbnRzIHN0YXlzIGNoZWFwLlxuICovXG5leHBvcnQgY2xhc3MgTWVtb3J5QnVpbGRlciB7XG4gIHByaXZhdGUgc2hhcmVkVmVjdG9yOiBQZ1ZlY3RvciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZVByaW5jaXBhbFBvb2w/OiBQb29sLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBNYXN0cmEtaW5zdGFuY2UtbGV2ZWwgc3RvcmFnZSB1c2VkIGZvciB3b3JrZmxvd1xuICAgKiBzbmFwc2hvdHMuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiBwbHVnaW4tbGV2ZWwgYHN0b3JhZ2VgIGlzXG4gICAqIGRpc2FibGVkLCBpbiB3aGljaCBjYXNlIGBhZ2VudC5yZXN1bWVTdHJlYW0oKWAgKGFuZCB0aGVyZWZvcmVcbiAgICogdGhlIGByZXF1aXJlQXBwcm92YWxgIGZsb3cpIHdpbGwgbm90IGJlIGF2YWlsYWJsZS5cbiAgICpcbiAgICogVGhlIHN0b3JlIGxpdmVzIGluIGEgZGVkaWNhdGVkIGBtYXN0cmFfaW5zdGFuY2VgIHNjaGVtYSBzbyBpdFxuICAgKiBuZXZlciBjb2xsaWRlcyB3aXRoIHBlci1hZ2VudCB7QGxpbmsgYWdlbnRTdG9yYWdlU2NoZW1hTmFtZX0gbmFtZXNwYWNlcy5cbiAgICogV29ya2Zsb3cgc25hcHNob3RzIGFyZSBub3QgcGVyLWFnZW50IHN0YXRlOyB0aGV5IGJlbG9uZyB0byB0aGVcbiAgICogYE1hc3RyYWAgaW5zdGFuY2UgdGhhdCBvd25zIHRoZSB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAqL1xuICBpbnN0YW5jZVN0b3JhZ2UoKTogUG9zdGdyZXNTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2V0dGluZyA9IHRoaXMuY29uZmlnLnN0b3JhZ2U7XG4gICAgaWYgKCFzZXR0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2Ygc2V0dGluZyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHdpdGhTb2Z0U3RvcmFnZUluaXQoXG4gICAgICAgIG5ldyBQb3N0Z3Jlc1N0b3JlKFxuICAgICAgICAgIHdpdGhJZChzZXR0aW5nLCBcIm1hc3RyYS1zdG9yZV9faW5zdGFuY2VcIikgYXMgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFxuICAgICAgICAgICAgdHlwZW9mIFBvc3RncmVzU3RvcmVcbiAgICAgICAgICA+WzBdLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB3aXRoU29mdFN0b3JhZ2VJbml0KFxuICAgICAgbmV3IFBvc3RncmVzU3RvcmUoe1xuICAgICAgICBpZDogXCJtYXN0cmEtc3RvcmVfX2luc3RhbmNlXCIsXG4gICAgICAgIHNjaGVtYU5hbWU6IFwibWFzdHJhX2luc3RhbmNlXCIsXG4gICAgICAgIHBvb2w6IHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgYE1lbW9yeWAgZm9yIGBhZ2VudElkYCBhZnRlciB0aGUgcGx1Z2luL2FnZW50IGNhc2NhZGUuXG4gICAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgYWdlbnQgaGFzIG5laXRoZXIgc3RvcmFnZSBub3IgYVxuICAgKiB2ZWN0b3Igc3RvcmUgZW5hYmxlZCAtIE1hc3RyYSBhY2NlcHRzIGEgbWlzc2luZyBgbWVtb3J5YCBmaWVsZFxuICAgKiBhbmQgdHJlYXRzIHRoZSBhZ2VudCBhcyBzdGF0ZWxlc3MuXG4gICAqL1xuICBmb3JBZ2VudChhZ2VudElkOiBzdHJpbmcsIGRlZjogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uKTogTWVtb3J5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzdG9yYWdlU2V0dGluZyA9IGRlZi5zdG9yYWdlID8/IHRoaXMuY29uZmlnLnN0b3JhZ2U7XG4gICAgY29uc3QgbWVtb3J5U2V0dGluZyA9IGRlZi5tZW1vcnkgPz8gdGhpcy5jb25maWcubWVtb3J5O1xuXG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYnVpbGRTdG9yYWdlKGFnZW50SWQsIHN0b3JhZ2VTZXR0aW5nKTtcbiAgICBjb25zdCB2ZWN0b3IgPSB0aGlzLmJ1aWxkVmVjdG9yKG1lbW9yeVNldHRpbmcpO1xuICAgIGlmICghc3RvcmFnZSAmJiAhdmVjdG9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJhZ2VudDpzdGF0ZWxlc3NcIiwgeyBhZ2VudElkIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoXCJhZ2VudDpjb25maWd1cmVkXCIsIHtcbiAgICAgIGFnZW50SWQsXG4gICAgICBzdG9yYWdlOiBzdG9yYWdlICE9PSB1bmRlZmluZWQsXG4gICAgICB2ZWN0b3I6IHZlY3RvciAhPT0gdW5kZWZpbmVkLFxuICAgICAgdmVjdG9yTW9kZTpcbiAgICAgICAgdmVjdG9yID09PSB1bmRlZmluZWQgPyBcIm9mZlwiIDogdHlwZW9mIG1lbW9yeVNldHRpbmcgPT09IFwib2JqZWN0XCIgPyBcImRlZGljYXRlZFwiIDogXCJzaGFyZWRcIixcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgTWVtb3J5KHtcbiAgICAgIC4uLihzdG9yYWdlID8geyBzdG9yYWdlIH0gOiB7fSksXG4gICAgICAuLi4odmVjdG9yID8geyB2ZWN0b3IsIGVtYmVkZGVyOiBmYXN0ZW1iZWQgfSA6IHt9KSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgbGFzdE1lc3NhZ2VzOiAxMCxcbiAgICAgICAgLi4uKHZlY3RvclxuICAgICAgICAgID8geyBzZW1hbnRpY1JlY2FsbDogeyB0b3BLOiAzLCBtZXNzYWdlUmFuZ2U6IDIsIHNjb3BlOiBcInJlc291cmNlXCIgYXMgY29uc3QgfSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC8vIEF1dG8tbmFtZSBlYWNoIHRocmVhZCBmcm9tIGl0cyBvcGVuaW5nIHR1cm4gc28gdGhlXG4gICAgICAgIC8vIGNvbnZlcnNhdGlvbiBsaXN0IHRoZSBVSSByZW5kZXJzIHNob3dzIG1lYW5pbmdmdWwgdGl0bGVzXG4gICAgICAgIC8vIGluc3RlYWQgb2YgcmF3IGlkcy4gVGl0bGluZyBydW5zIG9uIHRoZSBzbWFsbCAvIGZhc3QgY2hhdFxuICAgICAgICAvLyB0aWVyIChzZWUgYHN1bW1hcml6ZS50c2ApIHJhdGhlciB0aGFuIHRoZSBhZ2VudCdzIHByaW1hcnlcbiAgICAgICAgLy8gbW9kZWwsIHNvIG5hbWluZyBhIHRocmVhZCBuZXZlciBzcGVuZHMgdGhlIGhlYXZ5d2VpZ2h0IG1vZGVsLlxuICAgICAgICAvLyBPbmx5IG1lYW5pbmdmdWwgd2hlbiBzdG9yYWdlIGlzIG9uOyBoYXJtbGVzcyBvdGhlcndpc2UuXG4gICAgICAgIC4uLihzdG9yYWdlXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGdlbmVyYXRlVGl0bGU6IHtcbiAgICAgICAgICAgICAgICBtb2RlbDogc3VtbWFyeU1vZGVsKHRoaXMuY29uZmlnKSxcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnM6IFRJVExFX0lOU1RSVUNUSU9OUyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3RvcmFnZShhZ2VudElkOiBzdHJpbmcsIHNldHRpbmc6IFN0b3JhZ2VTZXR0aW5nKTogUG9zdGdyZXNTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFzZXR0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2Ygc2V0dGluZyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmICghdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB3aXRoU29mdFN0b3JhZ2VJbml0KFxuICAgICAgICBuZXcgUG9zdGdyZXNTdG9yZSh7XG4gICAgICAgICAgaWQ6IGBtYXN0cmEtc3RvcmVfXyR7YWdlbnRJZH1gLFxuICAgICAgICAgIHNjaGVtYU5hbWU6IGFnZW50U3RvcmFnZVNjaGVtYU5hbWUoYWdlbnRJZCksXG4gICAgICAgICAgcG9vbDogdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBDYXN0OiBgd2l0aElkYCBndWFyYW50ZWVzIGBpZGAgaXMgc2V0LCBidXQgdGhlIGRpc3RyaWJ1dGl2ZVxuICAgIC8vIE9taXQgKyBgaWQ/OiBzdHJpbmdgIHNoYXBlIGRvZXNuJ3Qgc3RydWN0dXJhbGx5IG5hcnJvdyB0byB0aGVcbiAgICAvLyBkaXNjcmltaW5hdGVkIHVuaW9uIG1lbWJlcnMuIFJ1bnRpbWUgc2hhcGUgaXMgaWRlbnRpY2FsLlxuICAgIHJldHVybiB3aXRoU29mdFN0b3JhZ2VJbml0KFxuICAgICAgbmV3IFBvc3RncmVzU3RvcmUoXG4gICAgICAgIHdpdGhJZChzZXR0aW5nLCBgbWFzdHJhLXN0b3JlX18ke2FnZW50SWR9YCkgYXMgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFxuICAgICAgICAgIHR5cGVvZiBQb3N0Z3Jlc1N0b3JlXG4gICAgICAgID5bMF0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgYWdlbnQncyB2ZWN0b3Igc3RvcmUuIENhc2NhZGU6XG4gICAqXG4gICAqIC0gZmFsc3k6IG5vIHZlY3Rvci5cbiAgICogLSBgYm9vbGVhbmAgLyBgdW5kZWZpbmVkLWluaGVyaXRpbmctdHJ1ZWA6IHJldHVybiB0aGUgc2hhcmVkXG4gICAqICAgc2luZ2xldG9uIChidWlsdCBsYXppbHkgb24gZmlyc3QgY2FsbCkuIEFsbCBhZ2VudHMgdGhhdFxuICAgKiAgIGRlZmF1bHQtZW5hYmxlIG1lbW9yeSB3cml0ZSBpbnRvIGFuZCByZWNhbGwgZnJvbSBvbmUgaW5kZXguXG4gICAqIC0gb2JqZWN0OiBidWlsZCBhIGRlZGljYXRlZCBgUGdWZWN0b3JgIGZvciB0aGlzIGFnZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFZlY3RvcihzZXR0aW5nOiBNZW1vcnlTZXR0aW5nKTogUGdWZWN0b3IgfCB1bmRlZmluZWQge1xuICAgIGlmICghc2V0dGluZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHNldHRpbmcgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gdGhpcy5nZXRTaGFyZWRWZWN0b3IoKTtcbiAgICByZXR1cm4gYnVpbGRQZ1ZlY3RvcihzZXR0aW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2hhcmVkVmVjdG9yKCk6IFBnVmVjdG9yIHtcbiAgICBpZiAoIXRoaXMuc2hhcmVkVmVjdG9yKSB7XG4gICAgICBpZiAoIXRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTGFrZWJhc2UgaXMgcmVxdWlyZWQgZm9yIFBnVmVjdG9yIG1lbW9yeVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2hhcmVkVmVjdG9yID0gYnVpbGRTaGFyZWRQZ1ZlY3Rvcih0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkVmVjdG9yO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHNoYXJlZCBgUGdWZWN0b3JgIHRoYXQgYmFja3MgdGhlIGRlZmF1bHRcbiAqIGBkZWYubWVtb3J5ID09PSB0cnVlYCBjYXNlIGFjcm9zcyBldmVyeSBhZ2VudC5cbiAqXG4gKiBgUGdWZWN0b3JgJ3MgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGNvbm5lY3Rpb24tc3R5bGUgY29uZmlnc1xuICogKGBIb3N0Q29uZmlnYCAvIGBDb25uZWN0aW9uU3RyaW5nQ29uZmlnYCAvIGBDbGllbnRDb25maWdgKTsgdGhlcmUgaXNcbiAqIG5vIGB7IHBvb2wgfWAgc2hvcnRoYW5kIHRoZSB3YXkgYFBvc3RncmVzU3RvcmVgIGhhcyBvbmUuIFdvcnNlLCB0aGVcbiAqIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkga2lja3Mgb2ZmIGEgYGNhY2hlV2FybXVwUHJvbWlzZWAgSUlGRSB0aGF0XG4gKiBjYWxscyBgdGhpcy5wb29sLmNvbm5lY3QoKWAgYmVmb3JlIHJldHVybmluZywgc28gd2UgY2FuJ3QgY2xlYW5seVxuICogaGFuZCBpdCBhbiBpbmVydCBjb25maWcgYW5kIHBhdGNoIHRoZSBwb29sIGFmdGVyd2FyZHMuXG4gKlxuICogVGhlIHRyaWNrOiBwYXNzIGlsbGVnYWwtYnV0LXZhbGlkYXRpb24tcGFzc2luZyBwbGFjZWhvbGRlcnMgc28gdGhlXG4gKiB3YXJtdXAncyBgbmV0LmNvbm5lY3QoKWAgcmVqZWN0cyBzeW5jaHJvbm91c2x5IHdpdGggYFJhbmdlRXJyb3JgXG4gKiAoTm9kZSB2YWxpZGF0ZXMgYDAgPD0gcG9ydCA8IDY1NTM2YCkuIFRoZSBJSUZFJ3MgYGNhdGNoIHt9YCBzd2FsbG93c1xuICogaXQsIG5vIEROUyBsb29rdXAgb3IgVENQIGF0dGVtcHQgaGFwcGVucywgYW5kIHdlIHRoZW4gc3dhcFxuICogYHBnVmVjdG9yLnBvb2xgIHRvIHRoZSBsYWtlYmFzZSBwb29sLiBFdmVyeSBzdWJzZXF1ZW50IGBQZ1ZlY3RvcmBcbiAqIG1ldGhvZCByZWFkcyBgdGhpcy5wb29sYCBhdCBjYWxsIHRpbWUsIHNvIGFsbCByZWFsIEkvTyBnb2VzIHRocm91Z2hcbiAqIHRoZSBsYWtlYmFzZSBwb29sIGZyb20gdGhlbiBvbi4gVGhlIHBsYWNlaG9sZGVyIHBvb2wgaXMgYC5lbmQoKWAnZFxuICogc28gaXRzIHNvY2tldCBib29rLWtlZXBpbmcgaXMgcmVsZWFzZWQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2hhcmVkUGdWZWN0b3IocG9vbDogUG9vbCk6IFBnVmVjdG9yIHtcbiAgY29uc3QgdmVjdG9yID0gbmV3IFBnVmVjdG9yKHtcbiAgICBpZDogYHBnJHtpZCgpfWAsXG4gICAgLy8gS2VlcCB0aGUgcmVjYWxsIGluZGV4IG91dCBvZiBgcHVibGljYDogb24gYSBMYWtlYmFzZSBkYXRhYmFzZSB0aGUgYXBwXG4gICAgLy8gc2VydmljZSBwcmluY2lwYWwgaGFzIG5vIENSRUFURSBvbiBgcHVibGljYCAoUEcxNSsgbG9ja3MgaXQgZG93biksIHNvIGFcbiAgICAvLyBkZWZhdWx0LXNjaGVtYSBQZ1ZlY3RvciBmYWlscyBvbiBDUkVBVEUgSU5ERVggd2l0aCBcInBlcm1pc3Npb24gZGVuaWVkIGZvclxuICAgIC8vIHNjaGVtYSBwdWJsaWNcIi4gUGdWZWN0b3IgcnVucyBDUkVBVEUgU0NIRU1BIElGIE5PVCBFWElTVFMgZm9yIGEgbmFtZWRcbiAgICAvLyBzY2hlbWEsIHNvIHRoZSBTUCBjcmVhdGVzIGFuZCBvd25zIGBtYXN0cmFfaW5zdGFuY2VgICh0aGUgc2FtZVxuICAgIC8vIGluc3RhbmNlLWxldmVsIHNjaGVtYSB0aGUgd29ya2Zsb3ctc25hcHNob3Qgc3RvcmUgdXNlcykgYW5kIHRoZSBpbmRleFxuICAgIC8vIGxhbmRzIHRoZXJlLiBUYWJsZSBuYW1lcyBkb24ndCBjb2xsaWRlIHdpdGggdGhlIHN0b3JhZ2UgdGFibGVzLlxuICAgIHNjaGVtYU5hbWU6IFwibWFzdHJhX2luc3RhbmNlXCIsXG4gICAgaG9zdDogXCItMVwiLFxuICAgIHBvcnQ6IC0xLFxuICAgIGRhdGFiYXNlOiBcIl9cIixcbiAgICB1c2VyOiBcIl9cIixcbiAgICBwYXNzd29yZDogXCJfXCIsXG4gIH0pO1xuICBjb25zdCBwbGFjZWhvbGRlciA9IHZlY3Rvci5wb29sO1xuICB2ZWN0b3IucG9vbCA9IHBvb2w7XG4gIHZvaWQgcGxhY2Vob2xkZXIuZW5kKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIHZlY3Rvcjtcbn1cblxuLyoqIFBlci1hZ2VudCBkZWRpY2F0ZWQgYFBnVmVjdG9yYCAocmFyZTsgb3B0LWluIHZpYSBvYmplY3Qgb3ZlcnJpZGUpLiAqL1xuZnVuY3Rpb24gYnVpbGRQZ1ZlY3RvcihzZXR0aW5nOiBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZSk6IFBnVmVjdG9yIHtcbiAgcmV0dXJuIG5ldyBQZ1ZlY3RvcihcbiAgICB3aXRoSWQoc2V0dGluZywgYHBnLXZlY3Rvcl9fJHtpZCgpfWApIGFzIENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgUGdWZWN0b3I+WzBdLFxuICApO1xufVxuXG4vKiogVHJ1ZSB3aGVuIHRoaXMgc2V0dGluZyByZXF1aXJlcyB0aGUgc2hhcmVkIExha2ViYXNlIHBvb2wuICovXG5mdW5jdGlvbiBzZXR0aW5nTmVlZHNTaGFyZWRQb29sKHNldHRpbmc6IFN0b3JhZ2VTZXR0aW5nIHwgTWVtb3J5U2V0dGluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2V0dGluZyA9PT0gdHJ1ZTtcbn1cblxuLyoqIFdhbGsgdGhlIHRocmVlIHNoYXBlcyBvZiBgY29uZmlnLmFnZW50c2AgaW50byBhIGZsYXQgbGlzdC4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RBZ2VudERlZmluaXRpb25zKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW10ge1xuICBjb25zdCBhZ2VudHMgPSBjb25maWcuYWdlbnRzO1xuICBpZiAoIWFnZW50cykgcmV0dXJuIFtdO1xuICBpZiAoQXJyYXkuaXNBcnJheShhZ2VudHMpKSByZXR1cm4gYWdlbnRzO1xuICBpZiAoXCJpbnN0cnVjdGlvbnNcIiBpbiBhZ2VudHMpIHtcbiAgICByZXR1cm4gW2FnZW50cyBhcyBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25dO1xuICB9XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGFnZW50cyk7XG59XG5cbi8qKiBGaWxsIGluIGEgZGVmYXVsdCBgaWRgIHdoZW4gdGhlIGNhbGxlciBkaWRuJ3Qgc3VwcGx5IG9uZS4gKi9cbmZ1bmN0aW9uIHdpdGhJZDxUIGV4dGVuZHMgeyBpZD86IHN0cmluZyB9Pih2YWx1ZTogVCwgZmFsbGJhY2s6IHN0cmluZyk6IFQge1xuICByZXR1cm4gdmFsdWUuaWQgPyB2YWx1ZSA6IHsgLi4udmFsdWUsIGlkOiBmYWxsYmFjayB9O1xufVxuIl19
|
package/lib/src/mlflow.d.ts
CHANGED
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
*
|
|
25
25
|
* @module
|
|
26
26
|
*/
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
27
|
+
import { type WorkspaceClientLike } from "@dbx-tools/appkit";
|
|
28
|
+
import { type MlflowFeedbackRequest } from "@dbx-tools/shared-mastra";
|
|
29
29
|
import type { Context } from "@opentelemetry/api";
|
|
30
30
|
import type { ReadableSpan, Span as SdkSpan, SpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
31
31
|
type MlflowModule = typeof import("@mlflow/core");
|
|
@@ -48,7 +48,7 @@ export declare class AgentTraceSpanProcessor implements SpanProcessor {
|
|
|
48
48
|
shutdown(): Promise<void>;
|
|
49
49
|
}
|
|
50
50
|
/** Workspace client carried on an AppKit execution context. */
|
|
51
|
-
type WorkspaceClient =
|
|
51
|
+
type WorkspaceClient = WorkspaceClientLike;
|
|
52
52
|
/**
|
|
53
53
|
* UC table prefix the assessments API needs, read from experiment tags.
|
|
54
54
|
*
|
|
@@ -134,7 +134,7 @@ export declare function mlflowEnabled(): boolean;
|
|
|
134
134
|
*/
|
|
135
135
|
export declare function mlflowExperimentManagerUrl(client: WorkspaceClient): Promise<string | undefined>;
|
|
136
136
|
/** Parameters for {@link logFeedback}. */
|
|
137
|
-
export type LogFeedbackParams =
|
|
137
|
+
export type LogFeedbackParams = MlflowFeedbackRequest & {
|
|
138
138
|
/** Identity the feedback is attributed to (user email / id). */
|
|
139
139
|
sourceId?: string;
|
|
140
140
|
};
|