@dbx-tools/appkit-mastra 0.9.95 → 0.9.105
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 +238 -285
- package/index.ts +4 -5
- package/lib/index.d.ts +4 -5
- package/lib/index.js +4 -5
- package/lib/src/agents.d.ts +5 -3
- package/lib/src/agents.js +70 -19
- package/lib/src/chat.d.ts +3 -1
- package/lib/src/chat.js +98 -12
- package/lib/src/config.d.ts +7 -1
- package/lib/src/config.js +6 -2
- package/lib/src/model.d.ts +3 -6
- package/lib/src/model.js +11 -94
- package/lib/src/monty-sandbox.d.ts +3 -7
- package/lib/src/monty-sandbox.js +17 -28
- package/lib/src/openapi-tool.js +3 -12
- package/lib/src/plugin.js +3 -1
- package/lib/src/server.js +1 -1
- package/lib/src/skill-paths.d.ts +1 -1
- package/lib/src/skill-paths.js +2 -2
- package/lib/src/workspaces.d.ts +53 -92
- package/lib/src/workspaces.js +319 -192
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +16 -22
- package/src/agents.ts +69 -18
- package/src/chat.ts +103 -11
- package/src/config.ts +13 -2
- package/src/model.ts +10 -108
- package/src/monty-sandbox.ts +23 -33
- package/src/openapi-tool.ts +2 -11
- package/src/plugin.ts +2 -0
- package/src/server.ts +22 -20
- package/src/skill-paths.ts +1 -1
- package/src/workspaces.ts +485 -266
- package/lib/src/serving-sanitize.d.ts +0 -6
- package/lib/src/serving-sanitize.js +0 -7
- package/src/serving-sanitize.ts +0 -19
package/lib/src/server.js
CHANGED
|
@@ -421,4 +421,4 @@ export function attachStaleResumeRecovery(app) {
|
|
|
421
421
|
res.end();
|
|
422
422
|
});
|
|
423
423
|
}
|
|
424
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3BCLGNBQWMsR0FDZixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxZQUFZLElBQUksbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHM0MsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2Ysb0JBQW9CLEdBR3JCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixvQkFBb0IsR0FDckIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUU7Ozs7O0dBS0c7QUFDSCxNQUFNLE1B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QUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBYyxFQUFFLEdBQW9CLEVBQUUsR0FBcUIsRUFBRSxJQUEwQixFQUFFLEVBQUU7UUFDbEcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ1osT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFO1lBQ3pDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLEtBQUssRUFBRSxVQUFVLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztTQUN0QyxDQUFDLENBQUM7UUFDSCxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVixPQUFPO1FBQ1QsQ0FBQztRQUNELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztRQUNsRSxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMzQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RCxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3RCxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDOUIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFeHByZXNzLWxheWVyIHBsdW1iaW5nIGZvciB0aGUgTWFzdHJhIHBsdWdpbjogYSBgTWFzdHJhU2VydmVyYCB0aGF0XG4gKiBzdGFtcHMgdGhlIHBlci1yZXF1ZXN0IGBSZXF1ZXN0Q29udGV4dGAgYW5kIGEgc2NvcGVkIG5hdGl2ZSBBUEkgZ2F0ZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2V0RXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGhhc2gsIGh0dHAsIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscywgdG9rZW4gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgZmVlZGJhY2ssIHRocmVhZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IGlzU3RhbGVNYXN0cmFSZXN1bWVFcnJvciB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmEvcmVzdW1lXCI7XG5pbXBvcnQge1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgUmVxdWVzdENvbnRleHQsXG59IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBNYXN0cmFTZXJ2ZXIgYXMgRXhwcmVzc01hc3RyYVNlcnZlciB9IGZyb20gXCJAbWFzdHJhL2V4cHJlc3NcIjtcbmltcG9ydCB7IHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQge1xuICBhdHRyaWJ1dGVkVXNlcklkLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9VU0VSX0tFWSxcbiAgTUFTVFJBX1VTRVJfTkFNRV9LRVksXG4gIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLFxuICB0eXBlIFVzZXIsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgcmVxdWVzdFVzZXJFbWFpbCwgcmVxdWVzdFVzZXJJZCB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlRmVlZGJhY2tFbmFibGVkIH0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5pbXBvcnQge1xuICBleHRyYWN0TW9kZWxPdmVycmlkZSxcbiAgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSxcbiAgTUFTVFJBX1JFU09MVkVEX01PREVMX0tFWSxcbiAgcmVzb2x2ZVNlcnZpbmdDb25maWcsXG59IGZyb20gXCIuL3NlcnZpbmcudHNcIjtcbmltcG9ydCB7IHJlY29yZEFjdGl2ZVRyYWNlQXV0aCwgcmVjb3JkQWN0aXZlVHJhY2VVc2VyIH0gZnJvbSBcIi4vdGVsZW1ldHJ5LnRzXCI7XG4vKipcbiAqIE9wZW5UZWxlbWV0cnkncyBzZW50aW5lbCBmb3IgXCJubyB2YWxpZCB0cmFjZVwiIC0gMzIgemVybyBoZXggY2hhcnMuXG4gKiBgdHJhY2UuZ2V0QWN0aXZlU3BhbigpYCByZXR1cm5zIGEgbm9uLXJlY29yZGluZyBzcGFuIHdpdGggdGhpcyBpZFxuICogd2hlbiBubyBTREsgaXMgcmVnaXN0ZXJlZCwgd2hpY2ggbXVzdCBuZXZlciBiZSBzdXJmYWNlZCBhcyBhIHRyYWNlIHRvXG4gKiBhdHRhY2ggZmVlZGJhY2sgdG8uXG4gKi9cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvc2VydmVyXCIpO1xuY29uc3QgSU5WQUxJRF9UUkFDRV9JRCA9IFwiMFwiLnJlcGVhdCgzMik7XG5jb25zdCBUUlVTVEVEX1JFUVVFU1RfQ09OVEVYVF9LRVlTID0gW1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgTUFTVFJBX1VTRVJfS0VZLFxuICBNQVNUUkFfVVNFUl9OQU1FX0tFWSxcbiAgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLFxuICBNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZLFxuXSBhcyBjb25zdDtcblxuLyoqIFJlbW92ZSBicm93c2VyLXN1cHBsaWVkIHZhbHVlcyBmb3IgZmllbGRzIG93bmVkIGJ5IHRydXN0ZWQgc2VydmVyIG1pZGRsZXdhcmUuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIFRSVVNURURfUkVRVUVTVF9DT05URVhUX0tFWVMpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5kZWxldGVSYXcoa2V5KTtcbiAgfVxufVxuXG4vKipcbiAqIFdobyBhIHR1cm4gaXMgQVRUUklCVVRFRCB0bywgaW5kZXBlbmRlbnQgb2Ygd2hpY2ggRGF0YWJyaWNrcyBjcmVkZW50aWFsIHJ1bnNcbiAqIGl0cyBjYWxscy4gU3VwcGxpZWQgYnkgdGhlIEhUVFAgbWlkZGxld2FyZSBmcm9tIHRoZSBmb3J3YXJkZWQgdXNlciBoZWFkZXJzIHNvXG4gKiB0aGF0IGluIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSAtIHdoZXJlIGV2ZXJ5IHJlcXVlc3Qgc2hhcmVzIHRoZSBhcHAgU1Anc1xuICogY2xpZW50IC0gdGhlIG1lbW9yeSB0aHJlYWQsIHBlci11c2VyIGNhY2hlIG5hbWVzcGFjZSwgYW5kIHRyYWNlIG1ldGFkYXRhXG4gKiBzdGlsbCBrZXkgb2ZmIHRoZSByZWFsIGNhbGxlci4gSWdub3JlZCBpbiBhbiBPQk8gKHVzZXIpIGNvbnRleHQsIHdob3NlIG93blxuICogdXNlciBpZCAvIGVtYWlsIGFyZSBhdXRob3JpdGF0aXZlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZWRJZGVudGl0eSB7XG4gIC8qKiBGb3J3YXJkZWQgYHgtZm9yd2FyZGVkLXVzZXJgIGlkLCB1c2VkIHdoZW4gdGhlIGNsaWVudCBpcyB0aGUgc2VydmljZSBwcmluY2lwYWwuICovXG4gIHVzZXJJZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIEZvcndhcmRlZCBgeC1mb3J3YXJkZWQtZW1haWxgLCB1c2VkIGZvciB0cmFjZSBtZXRhZGF0YSB1bmRlciB0aGUgc2VydmljZSBwcmluY2lwYWwuICovXG4gIGVtYWlsPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFN0YW1wIHRoZSBBcHBLaXQgdXNlciAocGx1cyB0aGUgcmVzb3VyY2UgaWQgYW5kIHRyYWNlIG1ldGFkYXRhKSBvbnRvXG4gKiBgcmVxdWVzdENvbnRleHRgLlxuICpcbiAqIFNwbGl0IG91dCBvZiB7QGxpbmsgTWFzdHJhU2VydmVyfSBiZWNhdXNlIHRoZSBIVFRQIG1pZGRsZXdhcmUgaXMgbm90IHRoZSBvbmx5XG4gKiBjYWxsZXIgdGhhdCBuZWVkcyBpdDogYW4gb3V0LW9mLWJhbmQgdHVybiAoYSBUZWFtcyBhY3Rpdml0eSBhcnJpdmluZyBvblxuICogYW5vdGhlciBwbHVnaW4ncyByb3V0ZSwgYSBzY2hlZHVsZWQgam9iKSBkcml2ZXMgYGFnZW50LmdlbmVyYXRlYCBkaXJlY3RseSwgYW5kXG4gKiB3aXRob3V0IHRoaXMgc3RhbXAgZXZlcnkgdXNlci1zY29wZWQgdG9vbCAtIGBhc2tfZ2VuaWVgIGFib3ZlIGFsbCAtIGZhaWxzIHdpdGhcbiAqIFwiaW52b2tlIHRoZSB0b29sIGZyb20gYW4gYWdlbnQgdHVybiBzZXJ2ZWQgYnkgdGhlIG1hc3RyYSBwbHVnaW5cIi4gVGhvc2VcbiAqIGNhbGxlcnMgYnVpbGQgYSBjb250ZXh0IHdpdGgge0BsaW5rIGNyZWF0ZVJlcXVlc3RDb250ZXh0fSBpbnN0ZWFkIG9mIGFcbiAqIHJlcXVlc3QuXG4gKlxuICogVGhlIERhdGFicmlja3MgY3JlZGVudGlhbCBhbHdheXMgY29tZXMgZnJvbSB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dDtcbiAqIGBhdHRyaWJ1dGVkYCBvbmx5IGNoYW5nZXMgV0hPIHRoZSB0dXJuIGlzIGF0dHJpYnV0ZWQgdG8gd2hlbiB0aGF0IGNvbnRleHQgaXNcbiAqIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCAoc2VlIHtAbGluayBBdHRyaWJ1dGVkSWRlbnRpdHl9KS5cbiAqXG4gKiBJZGVtcG90ZW50OiByZXR1cm5zIGltbWVkaWF0ZWx5IHdoZW4gdGhlIHVzZXIgYW5kIHJlc291cmNlIGlkIGFyZSBhbHJlYWR5XG4gKiBwcmVzZW50LCBzbyB0aGUgbWlkZGxld2FyZSBjYW4gY2FsbCBpdCBvdmVyIGEgY29udGV4dCBhbm90aGVyIGxheWVyIHN0YW1wZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICBhdHRyaWJ1dGVkOiBBdHRyaWJ1dGVkSWRlbnRpdHkgPSB7fSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoW01BU1RSQV9VU0VSX0tFWSwgTUFTVFJBX1JFU09VUkNFX0lEX0tFWV0uZXZlcnkoKGtleSkgPT4gcmVxdWVzdENvbnRleHQuZ2V0KGtleSkpKSByZXR1cm47XG4gIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGNvbnN0IGlzVXNlckNvbnRleHQgPSBcImlzVXNlckNvbnRleHRcIiBpbiBleGVjdXRpb25Db250ZXh0O1xuICAvLyBUaGUgRGF0YWJyaWNrcyBDUkVERU5USUFMIGlzIGFsd2F5cyB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dCdzIGNsaWVudFxuICAvLyAoT0JPIGluIGEgdXNlciBjb250ZXh0LCB0aGUgc2VydmljZSBwcmluY2lwYWwgb3RoZXJ3aXNlKS4gV0hPIHRoZSB0dXJuIGlzXG4gIC8vIGF0dHJpYnV0ZWQgdG8gY2FuIGRpZmZlcjogaW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIGV2ZXJ5IHJlcXVlc3Qgc2hhcmVzXG4gIC8vIHRoZSBTUCBjbGllbnQsIGJ1dCB0aGUgZm9yd2FyZGVkIHVzZXIgaWQgbXVzdCBzdGlsbCBrZXkgdGhlIG1lbW9yeSB0aHJlYWRcbiAgLy8gYW5kIHRoZSBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2Ugc28gdHdvIGNhbGxlcnMgZG9uJ3Qgc2hhcmUgYSBjb252ZXJzYXRpb24uXG4gIGNvbnN0IHVzZXI6IFVzZXIgPSB7XG4gICAgaWQ6IGF0dHJpYnV0ZWRVc2VySWQoZXhlY3V0aW9uQ29udGV4dCwgYXR0cmlidXRlZC51c2VySWQpLFxuICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gIH07XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9LRVksIHVzZXIpO1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgdXNlci5pZCk7XG4gIC8vIEFwcEtpdCdzIGBVc2VyQ29udGV4dGAgc3VyZmFjZXMgZGlzcGxheSBuYW1lIC8gZW1haWwgb25seSBvblxuICAvLyBPQk8gcmVxdWVzdHMuIFNlcnZpY2UtY29udGV4dCBjYWxscyAoYmFja2dyb3VuZCB0YXNrcywgc2VydmVyXG4gIC8vIHN0YXJ0LXVwKSBsZWF2ZSB0aGVzZSB1bmRlZmluZWQgYW5kIHdlIHNraXAgdGhlIHN0YW1wIHNvXG4gIC8vIGRvd25zdHJlYW0gdHJhY2UgbWV0YWRhdGEgc3RheXMgYWJzZW50IHJhdGhlciB0aGFuIGVtcHR5LiBJblxuICAvLyBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgdGhlIGZvcndhcmRlZCBlbWFpbCBzdGlsbCBpZGVudGlmaWVzIHRoZSBjYWxsZXIsXG4gIC8vIHNvIGl0IGlzIHVzZWQgZm9yIHRyYWNlIG1ldGFkYXRhIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQgaXMgdGhlIFNQLlxuICBsZXQgdXNlck5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IGVtYWlsOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBhdHRyaWJ1dGVkLmVtYWlsO1xuICBpZiAoaXNVc2VyQ29udGV4dCkge1xuICAgIHVzZXJOYW1lID0gZXhlY3V0aW9uQ29udGV4dC51c2VyTmFtZTtcbiAgICBlbWFpbCA9IGV4ZWN1dGlvbkNvbnRleHQudXNlckVtYWlsID8/IGVtYWlsO1xuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LmN1cnJlbnRVc2VyLm1lKCk7XG4gICAgdXNlck5hbWUgPSBjdXJyZW50VXNlcj8udXNlck5hbWU7XG4gICAgZW1haWwgPSBjdXJyZW50VXNlcj8uZW1haWxzPy5maWx0ZXIoKGVtYWlsKSA9PiBlbWFpbC5wcmltYXJ5KS5maW5kKChlbWFpbCkgPT4gZW1haWwudmFsdWUpXG4gICAgICA/LnZhbHVlIGFzIHN0cmluZztcbiAgfVxuICBpZiAodXNlck5hbWUpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVksIHVzZXJOYW1lKTtcbiAgfVxuICBpZiAoZW1haWwpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBlbWFpbCk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgYFJlcXVlc3RDb250ZXh0YCBhIE5PTi1IVFRQIGFnZW50IHR1cm4gbmVlZHMuXG4gKlxuICogRXZlcnl0aGluZyBNYXN0cmEncyB0b29scyByZWFkIG9mZiB0aGUgY29udGV4dCBpcyBzdGFtcGVkIHRoZSBzYW1lIHdheSB0aGVcbiAqIHJlcXVlc3QgbWlkZGxld2FyZSBzdGFtcHMgaXQgLSB0aGUgQXBwS2l0IHVzZXIgKHNvIGBhc2tfZ2VuaWVgIGFuZCB0aGUgbW9kZWxcbiAqIHJlc29sdmVyIGNhbiBtaW50IHVzZXItc2NvcGVkIHRva2VucyksIHRoZSBtZW1vcnkgdGhyZWFkIC8gcmVzb3VyY2UgcGFpciwgYW5kXG4gKiBhIHJlcXVlc3QgaWQgc28gdGhlIHR1cm4ncyBzcGFucyBqb2luIHVwIGluIHRyYWNlcy4gVGhlIHJlc3VsdCBpcyBwYXNzZWQgYXNcbiAqIGByZXF1ZXN0Q29udGV4dGAgdG8gYGFnZW50LmdlbmVyYXRlYCAvIGBhZ2VudC5zdHJlYW1gLlxuICpcbiAqIFRoaXMgaXMgd2hhdCBtYWtlcyBhIGNhcmQgdHVybiBhbnN3ZXIgd2l0aCB0aGUgU0FNRSBkYXRhIGEgY2hhdCB0dXJuIGRvZXM6IHRoZVxuICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gZW5kcG9pbnRzIGlzIHByZXNlbnRhdGlvbiwgbm90IGNhcGFiaWxpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0Q29udGV4dChcbiAgb3B0aW9uczogeyB0aHJlYWRJZD86IHN0cmluZzsgcmVzb3VyY2VJZD86IHN0cmluZzsgcmVxdWVzdElkPzogc3RyaW5nIH0gPSB7fSxcbik6IFByb21pc2U8UmVxdWVzdENvbnRleHQ+IHtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBuZXcgUmVxdWVzdENvbnRleHQoKTtcbiAgYXdhaXQgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIocmVxdWVzdENvbnRleHQpO1xuICBpZiAob3B0aW9ucy50aHJlYWRJZCkgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9USFJFQURfSURfS0VZLCBvcHRpb25zLnRocmVhZElkKTtcbiAgLy8gU3RhbXBlZCBBRlRFUiB0aGUgdXNlciBzbyBhbiBleHBsaWNpdCByZXNvdXJjZSBpZCAoYSBjaGFubmVsIG1lbWJlciwgc2F5KVxuICAvLyB3aW5zIG92ZXIgdGhlIGFtYmllbnQgaWRlbnRpdHkgYHN0YW1wUmVxdWVzdENvbnRleHRVc2VyYCBkZWZhdWx0ZWQgdG8uXG4gIGlmIChvcHRpb25zLnJlc291cmNlSWQpIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCBvcHRpb25zLnJlc291cmNlSWQpO1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZLCBvcHRpb25zLnJlcXVlc3RJZCA/PyBoYXNoLmlkKCkpO1xuICByZXR1cm4gcmVxdWVzdENvbnRleHQ7XG59XG5cbi8qKlxuICogYEBtYXN0cmEvZXhwcmVzc2Agc3ViY2xhc3MgdGhhdCBzdGFtcHMgYFJlcXVlc3RDb250ZXh0YCB3aXRoIHRoZVxuICogQXBwS2l0IHVzZXIsIHJlc291cmNlIGlkLCBhbmQgYSB0aHJlYWQgaWQgYmFja2VkIGJ5IGFuIEhUVFAtb25seVxuICogc2Vzc2lvbiBjb29raWUgKGBhcHBraXRfPHBsdWdpbi1uYW1lPl9zZXNzaW9uX2lkYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXN0cmFTZXJ2ZXIgZXh0ZW5kcyBFeHByZXNzTWFzdHJhU2VydmVyIHtcbiAgcHJpdmF0ZSBsb2c6IGxvZy5Mb2dnZXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN0YW1wIHRoZSBNTGZsb3cgdHJhY2UtaWQgaGVhZGVyIG9uIHJlc3BvbnNlcy4gU2hhcmVzIHRoZVxuICAgKiBwbHVnaW4ncyBmZWVkYmFjayBnYXRlIHZpYSB7QGxpbmsgcmVzb2x2ZUZlZWRiYWNrRW5hYmxlZH0uXG4gICAqL1xuICBwcml2YXRlIGZlZWRiYWNrRW5hYmxlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICAgIC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgRXhwcmVzc01hc3RyYVNlcnZlcj5cbiAgKSB7XG4gICAgc3VwZXIoLi4uYXJncyk7XG4gICAgdGhpcy5sb2cgPSBsb2cubG9nZ2VyKGNvbmZpZyk7XG4gICAgdGhpcy5mZWVkYmFja0VuYWJsZWQgPSByZXNvbHZlRmVlZGJhY2tFbmFibGVkKGNvbmZpZy5mZWVkYmFjayk7XG4gIH1cblxuICBvdmVycmlkZSByZWdpc3RlckF1dGhNaWRkbGV3YXJlKCk6IHZvaWQge1xuICAgIHN1cGVyLnJlZ2lzdGVyQXV0aE1pZGRsZXdhcmUoKTtcbiAgICB0aGlzLmFwcC51c2UoYXN5bmMgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IHJlcy5sb2NhbHMucmVxdWVzdENvbnRleHQhIGFzIFJlcXVlc3RDb250ZXh0O1xuICAgICAgY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQpO1xuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFVzZXIocmVxLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VGhyZWFkSWQocmVxLCByZXMsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRNb2RlbE92ZXJyaWRlKHJlcSwgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFJlcXVlc3RJZChyZXEsIHJlcywgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3BlcyhyZXEsIHJlcXVlc3RDb250ZXh0KTtcblxuICAgICAgdGhpcy5jb25maWd1cmVNbGZsb3dUcmFjZUlkKHJlcyk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcImF1dGg6bWlkZGxld2FyZVwiLCB7XG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgIHJlcXVlc3RJZDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSksXG4gICAgICAgIHRocmVhZElkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVkpLFxuICAgICAgICByZXNvdXJjZUlkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSksXG4gICAgICAgIHVzZXJOYW1lOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVkpLFxuICAgICAgICB1c2VyRW1haWw6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9FTUFJTF9LRVkpLFxuICAgICAgICBtb2RlbE92ZXJyaWRlOiByZXF1ZXN0Q29udGV4dC5nZXQoXG4gICAgICAgICAgLy8gaW1wb3J0ZWQgYmVsb3c7IGxvZ2dlZCBzbyBhIG1pc3JvdXRlZCByZXF1ZXN0IHNob3dzXG4gICAgICAgICAgLy8gdXAgYWxvbmdzaWRlIGl0cyBtb2RlbCBzZWxlY3Rpb24gaW4gYExPR19MRVZFTD1kZWJ1Z2AuXG4gICAgICAgICAgXCJtYXN0cmFfX21vZGVsX292ZXJyaWRlXCIsXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VXNlcihyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgLy8gUGFzcyB0aGUgZm9yd2FyZGVkIGNhbGxlciBpZGVudGl0eSBzbyBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgc3RpbGwga2V5c1xuICAgIC8vIG1lbW9yeSAvIGNhY2hlIC8gdHJhY2VzIHBlciB1c2VyIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQgaXMgdGhlIGFwcCBTUC5cbiAgICAvLyBJbiBhbiBPQk8gY29udGV4dCB0aGVzZSBhcmUgaWdub3JlZCBpbiBmYXZvciBvZiB0aGUgY29udGV4dCdzIG93biB1c2VyLlxuICAgIGF3YWl0IHN0YW1wUmVxdWVzdENvbnRleHRVc2VyKHJlcXVlc3RDb250ZXh0LCB7XG4gICAgICB1c2VySWQ6IHJlcXVlc3RVc2VySWQocmVxKSxcbiAgICAgIGVtYWlsOiByZXF1ZXN0VXNlckVtYWlsKHJlcSksXG4gICAgfSk7XG4gICAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHJlY29yZEFjdGl2ZVRyYWNlQXV0aChcImlzVXNlckNvbnRleHRcIiBpbiB1c2VyLmV4ZWN1dGlvbkNvbnRleHQgPyBcIm9ib1wiIDogXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTtcbiAgICB9XG4gICAgY29uc3QgdHJhY2VVc2VyID0gW1xuICAgICAgcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0VNQUlMX0tFWSksXG4gICAgICByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVkpLFxuICAgICAgcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkpLFxuICAgIF0uZmluZCgodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKTtcbiAgICByZWNvcmRBY3RpdmVUcmFjZVVzZXIodHJhY2VVc2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFtcCBhIHBlci1yZXF1ZXN0IGlkIGFuZCBlY2hvIGl0IG9uIHRoZSByZXNwb25zZSBzbyBhbiB1cHN0cmVhbVxuICAgKiBwcm94eSAvIGN1cmwgY2xpZW50IC8gYnJvd3Nlci1zaWRlIGxvZyBsaW5lIGNhbiBwYWlyIGl0cyB2aWV3IG9mXG4gICAqIHRoZSByZXF1ZXN0IHdpdGggdGhlIG1hdGNoaW5nIHRyYWNlIHNwYW4uIFJldXNlcyBgWC1SZXF1ZXN0LUlkYFxuICAgKiB3aGVuIHRoZSB1cHN0cmVhbSBhbHJlYWR5IHN1cHBsaWVzIG9uZSBzbyBtdWx0aS1ob3AgdHJhY2VzIHN0YXlcbiAgICogam9pbmVkOyBvdGhlcndpc2UgbWludHMgYSBVVUlEdjQuXG4gICAqXG4gICAqIFRoZSBpZCBpcyBzdXJmYWNlZCBhcyBgbWFzdHJhX19yZXF1ZXN0SWRgIHNwYW4gbWV0YWRhdGEgdmlhXG4gICAqIHtAbGluayBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZU30gYW5kIGFzIHRoZSBgWC1SZXF1ZXN0LUlkYFxuICAgKiByZXNwb25zZSBoZWFkZXIgc28gZGV2IHRvb2xzIGNhbiBjb3B5IGl0IGZyb20gZWl0aGVyIHNpZGUuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFJlcXVlc3RJZChcbiAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICApIHtcbiAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSkpIHJldHVybjtcbiAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IHJlcS5oZWFkZXJzW1wieC1yZXF1ZXN0LWlkXCJdO1xuICAgIGNvbnN0IHVwc3RyZWFtID0gQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSkgPyBoZWFkZXJWYWx1ZVswXSA6IGhlYWRlclZhbHVlO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHVwc3RyZWFtPy50cmltKCkgfHwgaGFzaC5pZCgpO1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVRVUVTVF9JRF9LRVksIHJlcXVlc3RJZCk7XG4gICAgcmVzLnNldEhlYWRlcihcIlgtUmVxdWVzdC1JZFwiLCByZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YW1wIE9BdXRoIHNjb3BlcyBmcm9tIHRoZSBmb3J3YXJkZWQgYWNjZXNzIHRva2VuIG9uXG4gICAqIHtAbGluayBNQVNUUkFfU0NPUEVTX0tFWX0gZm9yIHdvcmtzcGFjZSBtb3VudCBnYXRpbmcuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3BlcyhyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgY29uc3Qgc2NvcGVzID0gW1xuICAgICAgLi4ub2JqZWN0XG4gICAgICAgIC5zZXF1ZW5jZSh0b2tlbi5nZXRBY2Nlc3NUb2tlblNjb3BlcyhyZXEpLCB0b2tlbi5nZXRBY2Nlc3NUb2tlblNjb3BlcyhyZXEsIFwiYXV0aG9yaXphdGlvblwiKSlcbiAgICAgICAgLmRpc3RpbmN0KCksXG4gICAgXTtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1NDT1BFU19LRVksIHNjb3Blcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgdGhlIHR1cm4ncyBNTGZsb3cgdHJhY2UgaWQgb24gdGhlIHJlc3BvbnNlIHNvIHRoZSBjaGF0IGNsaWVudFxuICAgKiBjYW4gYXR0YWNoIHRodW1icyAvIGNvbW1lbnQgZmVlZGJhY2sgdG8gaXQgbGF0ZXIuIE1MZmxvdyBkZXJpdmVzXG4gICAqIGl0cyB0cmFjZSBpZCBmcm9tIHRoZSBPcGVuVGVsZW1ldHJ5IHRyYWNlIGlkIChgdHItPGhleD5gKSwgYW5kIGV2ZXJ5XG4gICAqIE1hc3RyYSBzcGFuIGZvciB0aGlzIHJlcXVlc3QgaW5oZXJpdHMgdGhlIGFtYmllbnQgT1RlbCBjb250ZXh0IChzZWVcbiAgICogYG9ic2VydmFiaWxpdHkudHNgKSwgc28gdGhlIGFjdGl2ZSBzcGFuJ3MgdHJhY2UgaWQgaGVyZSBpcyB0aGUgaWRcbiAgICogTUxmbG93IHdpbGwgcmVjb3JkIGZvciB0aGUgdHVybi5cbiAgICpcbiAgICogTm8tb3AgdW5sZXNzIGZlZWRiYWNrIGlzIGVuYWJsZWQsIGFuZCB3aGVuIG5vIGxpdmUgT1RlbCBzcGFuIGlzXG4gICAqIGFjdGl2ZSAoZS5nLiB0aGUgT1RMUCBTREsgaXNuJ3QgcmVnaXN0ZXJlZCk6IGluIHRoYXQgY2FzZSB0aGUgaGVhZGVyXG4gICAqIGlzIHNpbXBseSBhYnNlbnQgYW5kIHRoZSBjbGllbnQgaGlkZXMgZmVlZGJhY2sgZm9yIHRoYXQgbWVzc2FnZSxcbiAgICogZGVncmFkaW5nIGdyYWNlZnVsbHkgcmF0aGVyIHRoYW4gZW1pdHRpbmcgYSBib2d1cyB0cmFjZSBpZC5cbiAgICovXG4gIGNvbmZpZ3VyZU1sZmxvd1RyYWNlSWQocmVzOiBleHByZXNzLlJlc3BvbnNlKSB7XG4gICAgaWYgKCF0aGlzLmZlZWRiYWNrRW5hYmxlZCB8fCByZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgICBpZiAocmVzLmdldEhlYWRlcihmZWVkYmFjay5NTEZMT1dfVFJBQ0VfSURfSEVBREVSKSkgcmV0dXJuO1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCk/LnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBpZiAoIXRyYWNlSWQgfHwgdHJhY2VJZCA9PT0gSU5WQUxJRF9UUkFDRV9JRCkgcmV0dXJuO1xuICAgIHJlcy5zZXRIZWFkZXIoZmVlZGJhY2suTUxGTE9XX1RSQUNFX0lEX0hFQURFUiwgYHRyLSR7dHJhY2VJZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSB0aHJlYWQgaWQgdGhpcyByZXF1ZXN0IHRhcmdldHMgYW5kIHBpbiBpdCBvblxuICAgKiBgUmVxdWVzdENvbnRleHRgIChjb25zdW1lZCBieSB0aGUgYWdlbnQgc3RyZWFtIGZvciBwZXJzaXN0ZW5jZSBhbmRcbiAgICogYnkgbmF0aXZlIG1lbW9yeSByb3V0ZXMpLiBSZXNvbHV0aW9uIG9yZGVyOlxuICAgKlxuICAgKiAgIDEuIEEgY2xpZW50LXN1cHBsaWVkIHRocmVhZCBpZCAodGhlIHRocmVhZC1zZWxlY3Rpb24gaGVhZGVyIC9cbiAgICogICAgICBgP3RocmVhZElkPWAgcXVlcnkpLiBUaGlzIGlzIGhvdyB0aGUgY2hhdCBVSSByZWZlcmVuY2VzIGFcbiAgICogICAgICBzcGVjaWZpYyBjb252ZXJzYXRpb24gYW1vbmcgdGhlIG1hbnkgYSB1c2VyIG93bnMgLSBpdCBwaWNrcyBhXG4gICAqICAgICAgdGhyZWFkIGlkIGZyb20gdGhlIGAvdGhyZWFkc2AgbGlzdGluZyAob3IgbWludHMgb25lIGZvciBhIG5ld1xuICAgKiAgICAgIGNvbnZlcnNhdGlvbikgYW5kIHN0YW1wcyBpdCBoZXJlLiBUaGUgaWQgaXMgc2NvcGVkIHRvIHRoZVxuICAgKiAgICAgIGNhbGxlcidzIHJlc291cmNlIGJ5IHRoZSByZWNhbGwgLyBsaXN0IHJvdXRlcywgc28gYSBjbGllbnRcbiAgICogICAgICBjYW4gb25seSBldmVyIHJlYWQgb3Igd3JpdGUgaXRzIG93biB0aHJlYWRzLlxuICAgKiAgIDIuIFRoZSBwZXItc2Vzc2lvbiBjb29raWUgKGBhcHBraXRfPHBsdWdpbi1uYW1lPl9zZXNzaW9uX2lkYCksXG4gICAqICAgICAgbWludGVkIG9uIGZpcnN0IGNvbnRhY3QuIFRoaXMgaXMgdGhlIGRlZmF1bHQgc2luZ2xlLXRocmVhZFxuICAgKiAgICAgIGZhbGxiYWNrIGZvciBjbGllbnRzIHRoYXQgZG9uJ3QgbWFuYWdlIHRocmVhZHMgZXhwbGljaXRseSwgc29cbiAgICogICAgICBleGlzdGluZyBlbWJlZHMga2VlcCBvbmUgc3RhYmxlIGNvbnZlcnNhdGlvbiBwZXIgc2Vzc2lvbiB3aXRoXG4gICAqICAgICAgbm8gY2xpZW50IGNoYW5nZXMuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFRocmVhZElkKFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gICkge1xuICAgIGlmIChyZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVkpKSByZXR1cm47XG4gICAgY29uc3QgcmVxdWVzdGVkID0gdGhpcy5yZWFkUmVxdWVzdGVkVGhyZWFkSWQocmVxKTtcbiAgICBpZiAocmVxdWVzdGVkKSB7XG4gICAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVksIHJlcXVlc3RlZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvb2tpZXMgPSBodHRwLnBhcnNlQ29va2llcyhyZXEuaGVhZGVycy5jb29raWUpO1xuICAgIGNvbnN0IGNvb2tpZU5hbWUgPSBzdHJpbmdVdGlscy50b0lkZW50aWZpZXJXaXRoT3B0aW9ucyhcbiAgICAgIHsgZGVsaW1pdGVyOiBcIl9cIiwgZGlzdGluY3Q6IHRydWUgfSxcbiAgICAgIFwiYXBwa2l0XCIsXG4gICAgICB0aGlzLmNvbmZpZy5uYW1lISxcbiAgICAgIFwic2Vzc2lvbklkXCIsXG4gICAgKTtcbiAgICBsZXQgc2Vzc2lvbklkID0gY29va2llc1tjb29raWVOYW1lXTtcbiAgICBpZiAoIXNlc3Npb25JZCkge1xuICAgICAgc2Vzc2lvbklkID0gaGFzaC5pZCgpO1xuICAgICAgcmVzLmNvb2tpZShjb29raWVOYW1lLCBzZXNzaW9uSWQsIHtcbiAgICAgICAgaHR0cE9ubHk6IHRydWUsXG4gICAgICAgIHNhbWVTaXRlOiBcImxheFwiLFxuICAgICAgICBzZWN1cmU6IHJlcS5zZWN1cmUsXG4gICAgICAgIHBhdGg6IFwiL1wiLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBjbGllbnQtc2VsZWN0ZWQgdGhyZWFkIGlkIGZyb20gdGhlIHJlcXVlc3QsIHByZWZlcnJpbmdcbiAgICogdGhlIHRocmVhZC1zZWxlY3Rpb24gaGVhZGVyIG92ZXIgdGhlIGA/dGhyZWFkSWQ9YCBxdWVyeS4gUmV0dXJuc1xuICAgKiBgbnVsbGAgd2hlbiBuZWl0aGVyIGNhcnJpZXMgYSBub24tZW1wdHkgdmFsdWUgc28gdGhlIGNhbGxlciBmYWxsc1xuICAgKiBiYWNrIHRvIHRoZSBzZXNzaW9uIGNvb2tpZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZFJlcXVlc3RlZFRocmVhZElkKHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgaGVhZGVyVmFsdWUgPSByZXEuaGVhZGVyc1t0aHJlYWQuVEhSRUFEX0lEX0hFQURFUl07XG4gICAgY29uc3QgcXVlcnlWYWx1ZSA9IHJlcS5xdWVyeVt0aHJlYWQuVEhSRUFEX0lEX1FVRVJZXTtcbiAgICByZXR1cm4gKFxuICAgICAgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChBcnJheS5pc0FycmF5KGhlYWRlclZhbHVlKSA/IGhlYWRlclZhbHVlWzBdIDogaGVhZGVyVmFsdWUpID8/XG4gICAgICBzdHJpbmdVdGlscy50cmltVG9OdWxsKEFycmF5LmlzQXJyYXkocXVlcnlWYWx1ZSkgPyBxdWVyeVZhbHVlWzBdIDogcXVlcnlWYWx1ZSlcbiAgICApO1xuICB9XG5cbiAgY29uZmlndXJlUmVxdWVzdENvbnRleHRNb2RlbE92ZXJyaWRlKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpIHtcbiAgICAvLyBQZXItcmVxdWVzdCBtb2RlbCBvdmVycmlkZTogb25seSBob25vcmVkIHdoZW4gdGhlIHBsdWdpblxuICAgIC8vIG9wdHMgaW4gKGRlZmF1bHQpLiBTb3VyY2VzLCBpbiBwcmlvcml0eSBvcmRlciwgYXJlXG4gICAgLy8gYFgtTWFzdHJhLU1vZGVsYCBoZWFkZXIsIGA/bW9kZWw9YCBxdWVyeSwgYW5kIGBtb2RlbGAgL1xuICAgIC8vIGBtb2RlbElkYCBib2R5IGZpZWxkOyBzZWUgYHNlcnZpbmcudHNgLlxuICAgIGNvbnN0IHNlcnZpbmcgPSByZXNvbHZlU2VydmluZ0NvbmZpZyh0aGlzLmNvbmZpZyk7XG4gICAgaWYgKHNlcnZpbmcuYWxsb3dPdmVycmlkZSkge1xuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBleHRyYWN0TW9kZWxPdmVycmlkZSh7XG4gICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPixcbiAgICAgICAgcXVlcnk6IHJlcS5xdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgYm9keTogcmVxLmJvZHksXG4gICAgICB9KTtcbiAgICAgIGlmIChvdmVycmlkZSkgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksIG92ZXJyaWRlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIElucHV0cyBmb3Ige0BsaW5rIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFBcGlHYXRlT3B0aW9ucyB7XG4gIC8qKiBgY29uZmlnLmFwaUFjY2Vzc2A7IGBcImZ1bGxcImAgc2hvcnQtY2lyY3VpdHMgdG8gYWxsb3cgZXZlcnl0aGluZy4gKi9cbiAgYWNjZXNzOiBcInNjb3BlZFwiIHwgXCJmdWxsXCI7XG4gIC8qKiBXaGV0aGVyIHRoZSBNQ1AgdHJhbnNwb3J0IGlzIG1vdW50ZWQgKHNvIGAvbWNwLypgIGlzIGxlZ2l0aW1hdGUpLiAqL1xuICBtY3BFbmFibGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1vdW50LXJlbGF0aXZlIGFnZW50IGluZmVyZW5jZSBwYXRocyAoYC9hZ2VudHMvOmlkLzx2ZXJiPi4uLmApLiBNYXRjaGVkXG4gKiBieSBwcmVmaXggb24gdGhlIHZlcmIgc28gZnV0dXJlIHZhcmlhbnRzIChgc3RyZWFtVk5leHRgLCBgc3RyZWFtL3ZuZXh0YCxcbiAqIGBnZW5lcmF0ZVZOZXh0YCkgc3RheSBjb3ZlcmVkIHdpdGhvdXQgYSBjb2RlIGNoYW5nZS5cbiAqXG4gKiBDb3ZlcnMgdGhlIHBsYWluIGluZmVyZW5jZSB2ZXJicyAoYHN0cmVhbWAgLyBgZ2VuZXJhdGVgIC8gYG5ldHdvcmtgKSBwbHVzXG4gKiB0aGUgaHVtYW4taW4tdGhlLWxvb3AgcmVzdW1lIHZlcmJzIGEgcGF1c2VkIGByZXF1aXJlQXBwcm92YWxgIHRvb2wgbmVlZHNcbiAqIHRvIGNvbnRpbnVlOiBgYXBwcm92ZS10b29sLWNhbGxgIC8gYGRlY2xpbmUtdG9vbC1jYWxsYCAoc3RyZWFtaW5nLCBhbmQgdmlhXG4gKiBwcmVmaXggdGhlaXIgYC1nZW5lcmF0ZWAgbm9uLXN0cmVhbWluZyB2YXJpYW50cyksIHRoZSBgLW5ldHdvcmstYCB2YXJpYW50cyxcbiAqIGFuZCBgcmVzdW1lLXN0cmVhbWAgKGNvdmVycyBgcmVzdW1lLXN0cmVhbS11bnRpbC1pZGxlYCkuIFdpdGhvdXQgdGhlc2UgYW5cbiAqIGFwcHJvdmFsLWdhdGVkIHRvb2wgKGUuZy4gYHNlbmRfZW1haWxgKSBjYW4gYmUgcmVxdWVzdGVkIGJ1dCBuZXZlciBhcHByb3ZlZFxuICogZnJvbSB0aGUgYnJvd3NlciAtIHRoZSByZXN1bWUgYFBPU1RgIDQwM3MgdW5kZXIgc2NvcGVkIG1vZGUuIFRvZ2V0aGVyIHdpdGhcbiAqIHRoZSByZXNvdXJjZS1zY29wZWQgbWVtb3J5IG11dGF0aW9ucyBiZWxvdywgdGhlc2UgYXJlIHRoZSBvbmx5IHN0b2NrIE1hc3RyYVxuICogd3JpdGVzIHRoZSBicm93c2VyIGNsaWVudCBjYW4gbWFrZS5cbiAqL1xuY29uc3QgQUdFTlRfSU5GRVJFTkNFID1cbiAgL15cXC9hZ2VudHNcXC9bXi9dK1xcLyhzdHJlYW18Z2VuZXJhdGV8bmV0d29ya3xyZXN1bWUtc3RyZWFtfGFwcHJvdmUtdG9vbC1jYWxsfGRlY2xpbmUtdG9vbC1jYWxsfGFwcHJvdmUtbmV0d29yay10b29sLWNhbGx8ZGVjbGluZS1uZXR3b3JrLXRvb2wtY2FsbCkvaTtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSAoYC9hZ2VudHNgLCBgL2FnZW50cy86aWRgKS4gKi9cbmNvbnN0IEFHRU5UX01FVEFEQVRBID0gL15cXC9hZ2VudHMoXFwvW14vXSspPyQvO1xuLyoqIFBlcnNpc3RlZCBhcHByb3ZhbCBkaXNjb3ZlcnkgZm9yIG9uZSBhZ2VudC4gKi9cbmNvbnN0IEFHRU5UX1NVU1BFTkRFRF9SVU5TID0gL15cXC9hZ2VudHNcXC9bXi9dK1xcL3N1c3BlbmRlZC1ydW5zJC9pO1xuLyoqIE9mZmljaWFsIEFJIFNESyBVSSBzdHJlYW0gcm91dGUsIGluY2x1ZGluZyBgcmVzdW1lRGF0YWAgY29udGludWF0aW9ucy4gKi9cbmNvbnN0IEFHRU5UX0NIQVQgPSAvXlxcL2NoYXRcXC9bXi9dKyQvaTtcbi8qKiBOYXRpdmUgcmVzb3VyY2Utc2NvcGVkIG1lbW9yeSByZWFkcyB1c2VkIGJ5IGhpc3RvcnkgYW5kIHRoZSB0aHJlYWQgbGlzdC4gKi9cbmNvbnN0IE1FTU9SWV9SRUFEID0gL15cXC9tZW1vcnlcXC90aHJlYWRzKD86XFwvW14vXSsoPzpcXC9tZXNzYWdlcyk/KT8kL2k7XG4vKiogTmF0aXZlIHRocmVhZCByZW5hbWUvZGVsZXRlIHJvdXRlcy4gKi9cbmNvbnN0IE1FTU9SWV9USFJFQURfTVVUQVRJT04gPSAvXlxcL21lbW9yeVxcL3RocmVhZHNcXC9bXi9dKyQvaTtcblxuLyoqXG4gKiBXaGV0aGVyIGEgcmVxdWVzdCB0byB0aGUgc3RvY2sgYEBtYXN0cmEvZXhwcmVzc2Agc3ViLWFwcCBzaG91bGQgYmVcbiAqIGRpc3BhdGNoZWQsIGdpdmVuIHRoZSBjb25maWd1cmVkIHtAbGluayBNYXN0cmFBcGlHYXRlT3B0aW9ucy5hY2Nlc3N9LlxuICpcbiAqIGBwYXRoYCBpcyBtb3VudC1yZWxhdGl2ZSAod2hhdCB0aGUgcGx1Z2luJ3MgY2F0Y2gtYWxsIHNlZXMsIGUuZy5cbiAqIGAvY2hhdC94YCwgYC9tZW1vcnkvdGhyZWFkc2AsIGAvbWNwLy4uLmApLiBJbiBgXCJzY29wZWRcImBcbiAqIG1vZGUgdGhlIGFsbG93bGlzdCBpcyBkZWxpYmVyYXRlbHkgdGlnaHQgLSB0aGUgY2hhdCBjbGllbnQgb25seSBldmVyXG4gKiBuZWVkcyBhZ2VudCBpbmZlcmVuY2UsIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgcmVzb3VyY2Utc2NvcGVkIG1lbW9yeSxcbiAqIHRoaXMgcGx1Z2luJ3Mgb3duIGAvcm91dGUvKmAgcm91dGVzLCBhbmQgKHdoZW4gZW5hYmxlZCkgTUNQLiBUaGUgcmVtYWluaW5nXG4gKiBhZG1pbiwgbXV0YXRpbmcsIGFuZCBidWxrLWV4cG9ydCBzdXJmYWNlIHN0YXlzIGRlbmllZCBieSBkZWZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZChcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHBhdGg6IHN0cmluZyxcbiAgb3B0czogTWFzdHJhQXBpR2F0ZU9wdGlvbnMsXG4pOiBib29sZWFuIHtcbiAgaWYgKG9wdHMuYWNjZXNzID09PSBcImZ1bGxcIikgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHAgPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IGAvJHtwYXRofWA7XG4gIC8vIFRoZSBwbHVnaW4ncyBgL3JvdXRlLypgIGFkZGl0aW9ucyB2YWxpZGF0ZSB0aGVpciBvd24gaW5wdXRzIGFuZCB0cnVzdGVkXG4gIC8vIEFwcEtpdCByZXF1ZXN0IGNvbnRleHQgYmVmb3JlIHJlYWNoaW5nIHByb2R1Y3QgYmVoYXZpb3IuXG4gIGlmIChwID09PSBcIi9yb3V0ZVwiIHx8IHAuc3RhcnRzV2l0aChcIi9yb3V0ZS9cIikpIHJldHVybiB0cnVlO1xuICBpZiAob3B0cy5tY3BFbmFibGVkICYmIChwID09PSBcIi9tY3BcIiB8fCBwLnN0YXJ0c1dpdGgoXCIvbWNwL1wiKSkpIHJldHVybiB0cnVlO1xuICBjb25zdCBtID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gIGlmIChtID09PSBcIlBPU1RcIiAmJiBBR0VOVF9DSEFULnRlc3QocCkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJQT1NUXCIgJiYgQUdFTlRfSU5GRVJFTkNFLnRlc3QocCkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJHRVRcIiAmJiAoQUdFTlRfTUVUQURBVEEudGVzdChwKSB8fCBBR0VOVF9TVVNQRU5ERURfUlVOUy50ZXN0KHApKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIkdFVFwiICYmIE1FTU9SWV9SRUFELnRlc3QocCkpIHJldHVybiB0cnVlO1xuICBpZiAoKG0gPT09IFwiUEFUQ0hcIiB8fCBtID09PSBcIkRFTEVURVwiKSAmJiBNRU1PUllfVEhSRUFEX01VVEFUSU9OLnRlc3QocCkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJQT1NUXCIgJiYgcCA9PT0gXCIvbWVtb3J5L21lc3NhZ2VzL2RlbGV0ZVwiKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEtlZXAgTWFzdHJhIGN1c3RvbSBBUEkgcm91dGVzIG1vdW50LXJlbGF0aXZlIHdoZW4gdGhlIEV4cHJlc3Mgc3ViYXBwIGlzXG4gKiBob3N0ZWQgdW5kZXIgQXBwS2l0J3MgYC9hcGkvPHBsdWdpbj5gIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hSb3V0ZVBhdGNoTWlkZGxld2FyZShhcHA6IGV4cHJlc3MuRXhwcmVzcyk6IHZvaWQge1xuICBhcHAudXNlKChyZXEsIF9yZXMsIG5leHQpID0+IHtcbiAgICBjb25zdCBpc0N1c3RvbVJvdXRlID1cbiAgICAgIHJlcS5wYXRoID09PSBcIi9jaGF0XCIgfHxcbiAgICAgIHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvY2hhdC9cIikgfHxcbiAgICAgIHJlcS5wYXRoID09PSBcIi9yb3V0ZVwiIHx8XG4gICAgICByZXEucGF0aC5zdGFydHNXaXRoKFwiL3JvdXRlL1wiKTtcbiAgICBpZiAoIWlzQ3VzdG9tUm91dGUpIHJldHVybiBuZXh0KCk7XG4gICAgcmVxLm9yaWdpbmFsVXJsID0gcmVxLnBhdGg7XG4gICAgbmV4dCgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBGaW5pc2ggYSBjaGF0IHJlcXVlc3Qgd2hlbiBNYXN0cmEgdGhyb3dzIGJlY2F1c2UgdGhlIHdvcmtmbG93IGlzIG5vXG4gKiBsb25nZXIgc3VzcGVuZGVkLiBEdXBsaWNhdGUgYXBwcm92ZS9yZXN1bWUgYW5kIGxhdGUgYGNvbnN1bWVTdHJlYW1gXG4gKiBib3RoIGhpdCB0aGF0IHBhdGg7IHRoZSBjbGllbnQgYWxyZWFkeSBoYXMgKG9yIHdpbGwgcmVsb2FkKSB0aGVcbiAqIGNvbXBsZXRlZCB0dXJuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoU3RhbGVSZXN1bWVSZWNvdmVyeShhcHA6IGV4cHJlc3MuRXhwcmVzcyk6IHZvaWQge1xuICBhcHAudXNlKChlcnJvcjogdW5rbm93biwgcmVxOiBleHByZXNzLlJlcXVlc3QsIHJlczogZXhwcmVzcy5SZXNwb25zZSwgbmV4dDogZXhwcmVzcy5OZXh0RnVuY3Rpb24pID0+IHtcbiAgICBpZiAoIWlzU3RhbGVNYXN0cmFSZXN1bWVFcnJvcihlcnJvcikpIHtcbiAgICAgIG5leHQoZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsb2dnZXIud2FybihcImlnbm9yZWQgc3RhbGUgbWFzdHJhIHJlc3VtZVwiLCB7XG4gICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnJvciksXG4gICAgfSk7XG4gICAgaWYgKHJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgcmVzLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXMuc3RhdHVzKDIwMCk7XG4gICAgcmVzLnNldEhlYWRlcihcImNvbnRlbnQtdHlwZVwiLCBcInRleHQvZXZlbnQtc3RyZWFtOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgIHJlcy5zZXRIZWFkZXIoXCJjYWNoZS1jb250cm9sXCIsIFwibm8tY2FjaGVcIik7XG4gICAgcmVzLndyaXRlKGBkYXRhOiAke0pTT04uc3RyaW5naWZ5KHsgdHlwZTogXCJzdGFydFwiIH0pfVxcblxcbmApO1xuICAgIHJlcy53cml0ZShgZGF0YTogJHtKU09OLnN0cmluZ2lmeSh7IHR5cGU6IFwiZmluaXNoXCIgfSl9XFxuXFxuYCk7XG4gICAgcmVzLndyaXRlKFwiZGF0YTogW0RPTkVdXFxuXFxuXCIpO1xuICAgIHJlcy5lbmQoKTtcbiAgfSk7XG59XG4iXX0=
|
|
424
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3BCLGNBQWMsR0FDZixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxZQUFZLElBQUksbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHM0MsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2Ysb0JBQW9CLEdBR3JCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixvQkFBb0IsR0FDckIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUU7Ozs7O0dBS0c7QUFDSCxNQUFNLE1B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QUFHLENBQUMsR0FBRyxDQUNMLENBQUMsS0FBYyxFQUFFLEdBQW9CLEVBQUUsR0FBcUIsRUFBRSxJQUEwQixFQUFFLEVBQUU7UUFDMUYsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ1osT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFO1lBQ3pDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLEtBQUssRUFBRSxVQUFVLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztTQUN0QyxDQUFDLENBQUM7UUFDSCxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVixPQUFPO1FBQ1QsQ0FBQztRQUNELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztRQUNsRSxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMzQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RCxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3RCxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDOUIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osQ0FBQyxDQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFeHByZXNzLWxheWVyIHBsdW1iaW5nIGZvciB0aGUgTWFzdHJhIHBsdWdpbjogYSBgTWFzdHJhU2VydmVyYCB0aGF0XG4gKiBzdGFtcHMgdGhlIHBlci1yZXF1ZXN0IGBSZXF1ZXN0Q29udGV4dGAgYW5kIGEgc2NvcGVkIG5hdGl2ZSBBUEkgZ2F0ZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2V0RXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGhhc2gsIGh0dHAsIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscywgdG9rZW4gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgZmVlZGJhY2ssIHRocmVhZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IGlzU3RhbGVNYXN0cmFSZXN1bWVFcnJvciB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmEvcmVzdW1lXCI7XG5pbXBvcnQge1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgUmVxdWVzdENvbnRleHQsXG59IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBNYXN0cmFTZXJ2ZXIgYXMgRXhwcmVzc01hc3RyYVNlcnZlciB9IGZyb20gXCJAbWFzdHJhL2V4cHJlc3NcIjtcbmltcG9ydCB7IHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQge1xuICBhdHRyaWJ1dGVkVXNlcklkLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9VU0VSX0tFWSxcbiAgTUFTVFJBX1VTRVJfTkFNRV9LRVksXG4gIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLFxuICB0eXBlIFVzZXIsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgcmVxdWVzdFVzZXJFbWFpbCwgcmVxdWVzdFVzZXJJZCB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlRmVlZGJhY2tFbmFibGVkIH0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5pbXBvcnQge1xuICBleHRyYWN0TW9kZWxPdmVycmlkZSxcbiAgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSxcbiAgTUFTVFJBX1JFU09MVkVEX01PREVMX0tFWSxcbiAgcmVzb2x2ZVNlcnZpbmdDb25maWcsXG59IGZyb20gXCIuL3NlcnZpbmcudHNcIjtcbmltcG9ydCB7IHJlY29yZEFjdGl2ZVRyYWNlQXV0aCwgcmVjb3JkQWN0aXZlVHJhY2VVc2VyIH0gZnJvbSBcIi4vdGVsZW1ldHJ5LnRzXCI7XG4vKipcbiAqIE9wZW5UZWxlbWV0cnkncyBzZW50aW5lbCBmb3IgXCJubyB2YWxpZCB0cmFjZVwiIC0gMzIgemVybyBoZXggY2hhcnMuXG4gKiBgdHJhY2UuZ2V0QWN0aXZlU3BhbigpYCByZXR1cm5zIGEgbm9uLXJlY29yZGluZyBzcGFuIHdpdGggdGhpcyBpZFxuICogd2hlbiBubyBTREsgaXMgcmVnaXN0ZXJlZCwgd2hpY2ggbXVzdCBuZXZlciBiZSBzdXJmYWNlZCBhcyBhIHRyYWNlIHRvXG4gKiBhdHRhY2ggZmVlZGJhY2sgdG8uXG4gKi9cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvc2VydmVyXCIpO1xuY29uc3QgSU5WQUxJRF9UUkFDRV9JRCA9IFwiMFwiLnJlcGVhdCgzMik7XG5jb25zdCBUUlVTVEVEX1JFUVVFU1RfQ09OVEVYVF9LRVlTID0gW1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgTUFTVFJBX1VTRVJfS0VZLFxuICBNQVNUUkFfVVNFUl9OQU1FX0tFWSxcbiAgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLFxuICBNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZLFxuXSBhcyBjb25zdDtcblxuLyoqIFJlbW92ZSBicm93c2VyLXN1cHBsaWVkIHZhbHVlcyBmb3IgZmllbGRzIG93bmVkIGJ5IHRydXN0ZWQgc2VydmVyIG1pZGRsZXdhcmUuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIFRSVVNURURfUkVRVUVTVF9DT05URVhUX0tFWVMpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5kZWxldGVSYXcoa2V5KTtcbiAgfVxufVxuXG4vKipcbiAqIFdobyBhIHR1cm4gaXMgQVRUUklCVVRFRCB0bywgaW5kZXBlbmRlbnQgb2Ygd2hpY2ggRGF0YWJyaWNrcyBjcmVkZW50aWFsIHJ1bnNcbiAqIGl0cyBjYWxscy4gU3VwcGxpZWQgYnkgdGhlIEhUVFAgbWlkZGxld2FyZSBmcm9tIHRoZSBmb3J3YXJkZWQgdXNlciBoZWFkZXJzIHNvXG4gKiB0aGF0IGluIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSAtIHdoZXJlIGV2ZXJ5IHJlcXVlc3Qgc2hhcmVzIHRoZSBhcHAgU1Anc1xuICogY2xpZW50IC0gdGhlIG1lbW9yeSB0aHJlYWQsIHBlci11c2VyIGNhY2hlIG5hbWVzcGFjZSwgYW5kIHRyYWNlIG1ldGFkYXRhXG4gKiBzdGlsbCBrZXkgb2ZmIHRoZSByZWFsIGNhbGxlci4gSWdub3JlZCBpbiBhbiBPQk8gKHVzZXIpIGNvbnRleHQsIHdob3NlIG93blxuICogdXNlciBpZCAvIGVtYWlsIGFyZSBhdXRob3JpdGF0aXZlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZWRJZGVudGl0eSB7XG4gIC8qKiBGb3J3YXJkZWQgYHgtZm9yd2FyZGVkLXVzZXJgIGlkLCB1c2VkIHdoZW4gdGhlIGNsaWVudCBpcyB0aGUgc2VydmljZSBwcmluY2lwYWwuICovXG4gIHVzZXJJZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIEZvcndhcmRlZCBgeC1mb3J3YXJkZWQtZW1haWxgLCB1c2VkIGZvciB0cmFjZSBtZXRhZGF0YSB1bmRlciB0aGUgc2VydmljZSBwcmluY2lwYWwuICovXG4gIGVtYWlsPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFN0YW1wIHRoZSBBcHBLaXQgdXNlciAocGx1cyB0aGUgcmVzb3VyY2UgaWQgYW5kIHRyYWNlIG1ldGFkYXRhKSBvbnRvXG4gKiBgcmVxdWVzdENvbnRleHRgLlxuICpcbiAqIFNwbGl0IG91dCBvZiB7QGxpbmsgTWFzdHJhU2VydmVyfSBiZWNhdXNlIHRoZSBIVFRQIG1pZGRsZXdhcmUgaXMgbm90IHRoZSBvbmx5XG4gKiBjYWxsZXIgdGhhdCBuZWVkcyBpdDogYW4gb3V0LW9mLWJhbmQgdHVybiAoYSBUZWFtcyBhY3Rpdml0eSBhcnJpdmluZyBvblxuICogYW5vdGhlciBwbHVnaW4ncyByb3V0ZSwgYSBzY2hlZHVsZWQgam9iKSBkcml2ZXMgYGFnZW50LmdlbmVyYXRlYCBkaXJlY3RseSwgYW5kXG4gKiB3aXRob3V0IHRoaXMgc3RhbXAgZXZlcnkgdXNlci1zY29wZWQgdG9vbCAtIGBhc2tfZ2VuaWVgIGFib3ZlIGFsbCAtIGZhaWxzIHdpdGhcbiAqIFwiaW52b2tlIHRoZSB0b29sIGZyb20gYW4gYWdlbnQgdHVybiBzZXJ2ZWQgYnkgdGhlIG1hc3RyYSBwbHVnaW5cIi4gVGhvc2VcbiAqIGNhbGxlcnMgYnVpbGQgYSBjb250ZXh0IHdpdGgge0BsaW5rIGNyZWF0ZVJlcXVlc3RDb250ZXh0fSBpbnN0ZWFkIG9mIGFcbiAqIHJlcXVlc3QuXG4gKlxuICogVGhlIERhdGFicmlja3MgY3JlZGVudGlhbCBhbHdheXMgY29tZXMgZnJvbSB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dDtcbiAqIGBhdHRyaWJ1dGVkYCBvbmx5IGNoYW5nZXMgV0hPIHRoZSB0dXJuIGlzIGF0dHJpYnV0ZWQgdG8gd2hlbiB0aGF0IGNvbnRleHQgaXNcbiAqIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCAoc2VlIHtAbGluayBBdHRyaWJ1dGVkSWRlbnRpdHl9KS5cbiAqXG4gKiBJZGVtcG90ZW50OiByZXR1cm5zIGltbWVkaWF0ZWx5IHdoZW4gdGhlIHVzZXIgYW5kIHJlc291cmNlIGlkIGFyZSBhbHJlYWR5XG4gKiBwcmVzZW50LCBzbyB0aGUgbWlkZGxld2FyZSBjYW4gY2FsbCBpdCBvdmVyIGEgY29udGV4dCBhbm90aGVyIGxheWVyIHN0YW1wZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICBhdHRyaWJ1dGVkOiBBdHRyaWJ1dGVkSWRlbnRpdHkgPSB7fSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoW01BU1RSQV9VU0VSX0tFWSwgTUFTVFJBX1JFU09VUkNFX0lEX0tFWV0uZXZlcnkoKGtleSkgPT4gcmVxdWVzdENvbnRleHQuZ2V0KGtleSkpKSByZXR1cm47XG4gIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGNvbnN0IGlzVXNlckNvbnRleHQgPSBcImlzVXNlckNvbnRleHRcIiBpbiBleGVjdXRpb25Db250ZXh0O1xuICAvLyBUaGUgRGF0YWJyaWNrcyBDUkVERU5USUFMIGlzIGFsd2F5cyB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dCdzIGNsaWVudFxuICAvLyAoT0JPIGluIGEgdXNlciBjb250ZXh0LCB0aGUgc2VydmljZSBwcmluY2lwYWwgb3RoZXJ3aXNlKS4gV0hPIHRoZSB0dXJuIGlzXG4gIC8vIGF0dHJpYnV0ZWQgdG8gY2FuIGRpZmZlcjogaW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIGV2ZXJ5IHJlcXVlc3Qgc2hhcmVzXG4gIC8vIHRoZSBTUCBjbGllbnQsIGJ1dCB0aGUgZm9yd2FyZGVkIHVzZXIgaWQgbXVzdCBzdGlsbCBrZXkgdGhlIG1lbW9yeSB0aHJlYWRcbiAgLy8gYW5kIHRoZSBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2Ugc28gdHdvIGNhbGxlcnMgZG9uJ3Qgc2hhcmUgYSBjb252ZXJzYXRpb24uXG4gIGNvbnN0IHVzZXI6IFVzZXIgPSB7XG4gICAgaWQ6IGF0dHJpYnV0ZWRVc2VySWQoZXhlY3V0aW9uQ29udGV4dCwgYXR0cmlidXRlZC51c2VySWQpLFxuICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gIH07XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9LRVksIHVzZXIpO1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgdXNlci5pZCk7XG4gIC8vIEFwcEtpdCdzIGBVc2VyQ29udGV4dGAgc3VyZmFjZXMgZGlzcGxheSBuYW1lIC8gZW1haWwgb25seSBvblxuICAvLyBPQk8gcmVxdWVzdHMuIFNlcnZpY2UtY29udGV4dCBjYWxscyAoYmFja2dyb3VuZCB0YXNrcywgc2VydmVyXG4gIC8vIHN0YXJ0LXVwKSBsZWF2ZSB0aGVzZSB1bmRlZmluZWQgYW5kIHdlIHNraXAgdGhlIHN0YW1wIHNvXG4gIC8vIGRvd25zdHJlYW0gdHJhY2UgbWV0YWRhdGEgc3RheXMgYWJzZW50IHJhdGhlciB0aGFuIGVtcHR5LiBJblxuICAvLyBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgdGhlIGZvcndhcmRlZCBlbWFpbCBzdGlsbCBpZGVudGlmaWVzIHRoZSBjYWxsZXIsXG4gIC8vIHNvIGl0IGlzIHVzZWQgZm9yIHRyYWNlIG1ldGFkYXRhIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQgaXMgdGhlIFNQLlxuICBsZXQgdXNlck5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IGVtYWlsOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBhdHRyaWJ1dGVkLmVtYWlsO1xuICBpZiAoaXNVc2VyQ29udGV4dCkge1xuICAgIHVzZXJOYW1lID0gZXhlY3V0aW9uQ29udGV4dC51c2VyTmFtZTtcbiAgICBlbWFpbCA9IGV4ZWN1dGlvbkNvbnRleHQudXNlckVtYWlsID8/IGVtYWlsO1xuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LmN1cnJlbnRVc2VyLm1lKCk7XG4gICAgdXNlck5hbWUgPSBjdXJyZW50VXNlcj8udXNlck5hbWU7XG4gICAgZW1haWwgPSBjdXJyZW50VXNlcj8uZW1haWxzPy5maWx0ZXIoKGVtYWlsKSA9PiBlbWFpbC5wcmltYXJ5KS5maW5kKChlbWFpbCkgPT4gZW1haWwudmFsdWUpXG4gICAgICA/LnZhbHVlIGFzIHN0cmluZztcbiAgfVxuICBpZiAodXNlck5hbWUpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVksIHVzZXJOYW1lKTtcbiAgfVxuICBpZiAoZW1haWwpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBlbWFpbCk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgYFJlcXVlc3RDb250ZXh0YCBhIE5PTi1IVFRQIGFnZW50IHR1cm4gbmVlZHMuXG4gKlxuICogRXZlcnl0aGluZyBNYXN0cmEncyB0b29scyByZWFkIG9mZiB0aGUgY29udGV4dCBpcyBzdGFtcGVkIHRoZSBzYW1lIHdheSB0aGVcbiAqIHJlcXVlc3QgbWlkZGxld2FyZSBzdGFtcHMgaXQgLSB0aGUgQXBwS2l0IHVzZXIgKHNvIGBhc2tfZ2VuaWVgIGFuZCB0aGUgbW9kZWxcbiAqIHJlc29sdmVyIGNhbiBtaW50IHVzZXItc2NvcGVkIHRva2VucyksIHRoZSBtZW1vcnkgdGhyZWFkIC8gcmVzb3VyY2UgcGFpciwgYW5kXG4gKiBhIHJlcXVlc3QgaWQgc28gdGhlIHR1cm4ncyBzcGFucyBqb2luIHVwIGluIHRyYWNlcy4gVGhlIHJlc3VsdCBpcyBwYXNzZWQgYXNcbiAqIGByZXF1ZXN0Q29udGV4dGAgdG8gYGFnZW50LmdlbmVyYXRlYCAvIGBhZ2VudC5zdHJlYW1gLlxuICpcbiAqIFRoaXMgaXMgd2hhdCBtYWtlcyBhIGNhcmQgdHVybiBhbnN3ZXIgd2l0aCB0aGUgU0FNRSBkYXRhIGEgY2hhdCB0dXJuIGRvZXM6IHRoZVxuICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gZW5kcG9pbnRzIGlzIHByZXNlbnRhdGlvbiwgbm90IGNhcGFiaWxpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0Q29udGV4dChcbiAgb3B0aW9uczogeyB0aHJlYWRJZD86IHN0cmluZzsgcmVzb3VyY2VJZD86IHN0cmluZzsgcmVxdWVzdElkPzogc3RyaW5nIH0gPSB7fSxcbik6IFByb21pc2U8UmVxdWVzdENvbnRleHQ+IHtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBuZXcgUmVxdWVzdENvbnRleHQoKTtcbiAgYXdhaXQgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIocmVxdWVzdENvbnRleHQpO1xuICBpZiAob3B0aW9ucy50aHJlYWRJZCkgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9USFJFQURfSURfS0VZLCBvcHRpb25zLnRocmVhZElkKTtcbiAgLy8gU3RhbXBlZCBBRlRFUiB0aGUgdXNlciBzbyBhbiBleHBsaWNpdCByZXNvdXJjZSBpZCAoYSBjaGFubmVsIG1lbWJlciwgc2F5KVxuICAvLyB3aW5zIG92ZXIgdGhlIGFtYmllbnQgaWRlbnRpdHkgYHN0YW1wUmVxdWVzdENvbnRleHRVc2VyYCBkZWZhdWx0ZWQgdG8uXG4gIGlmIChvcHRpb25zLnJlc291cmNlSWQpIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCBvcHRpb25zLnJlc291cmNlSWQpO1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZLCBvcHRpb25zLnJlcXVlc3RJZCA/PyBoYXNoLmlkKCkpO1xuICByZXR1cm4gcmVxdWVzdENvbnRleHQ7XG59XG5cbi8qKlxuICogYEBtYXN0cmEvZXhwcmVzc2Agc3ViY2xhc3MgdGhhdCBzdGFtcHMgYFJlcXVlc3RDb250ZXh0YCB3aXRoIHRoZVxuICogQXBwS2l0IHVzZXIsIHJlc291cmNlIGlkLCBhbmQgYSB0aHJlYWQgaWQgYmFja2VkIGJ5IGFuIEhUVFAtb25seVxuICogc2Vzc2lvbiBjb29raWUgKGBhcHBraXRfPHBsdWdpbi1uYW1lPl9zZXNzaW9uX2lkYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXN0cmFTZXJ2ZXIgZXh0ZW5kcyBFeHByZXNzTWFzdHJhU2VydmVyIHtcbiAgcHJpdmF0ZSBsb2c6IGxvZy5Mb2dnZXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN0YW1wIHRoZSBNTGZsb3cgdHJhY2UtaWQgaGVhZGVyIG9uIHJlc3BvbnNlcy4gU2hhcmVzIHRoZVxuICAgKiBwbHVnaW4ncyBmZWVkYmFjayBnYXRlIHZpYSB7QGxpbmsgcmVzb2x2ZUZlZWRiYWNrRW5hYmxlZH0uXG4gICAqL1xuICBwcml2YXRlIGZlZWRiYWNrRW5hYmxlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICAgIC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgRXhwcmVzc01hc3RyYVNlcnZlcj5cbiAgKSB7XG4gICAgc3VwZXIoLi4uYXJncyk7XG4gICAgdGhpcy5sb2cgPSBsb2cubG9nZ2VyKGNvbmZpZyk7XG4gICAgdGhpcy5mZWVkYmFja0VuYWJsZWQgPSByZXNvbHZlRmVlZGJhY2tFbmFibGVkKGNvbmZpZy5mZWVkYmFjayk7XG4gIH1cblxuICBvdmVycmlkZSByZWdpc3RlckF1dGhNaWRkbGV3YXJlKCk6IHZvaWQge1xuICAgIHN1cGVyLnJlZ2lzdGVyQXV0aE1pZGRsZXdhcmUoKTtcbiAgICB0aGlzLmFwcC51c2UoYXN5bmMgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IHJlcy5sb2NhbHMucmVxdWVzdENvbnRleHQhIGFzIFJlcXVlc3RDb250ZXh0O1xuICAgICAgY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQpO1xuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFVzZXIocmVxLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VGhyZWFkSWQocmVxLCByZXMsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRNb2RlbE92ZXJyaWRlKHJlcSwgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFJlcXVlc3RJZChyZXEsIHJlcywgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3BlcyhyZXEsIHJlcXVlc3RDb250ZXh0KTtcblxuICAgICAgdGhpcy5jb25maWd1cmVNbGZsb3dUcmFjZUlkKHJlcyk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcImF1dGg6bWlkZGxld2FyZVwiLCB7XG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgIHJlcXVlc3RJZDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSksXG4gICAgICAgIHRocmVhZElkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVkpLFxuICAgICAgICByZXNvdXJjZUlkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSksXG4gICAgICAgIHVzZXJOYW1lOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVkpLFxuICAgICAgICB1c2VyRW1haWw6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9FTUFJTF9LRVkpLFxuICAgICAgICBtb2RlbE92ZXJyaWRlOiByZXF1ZXN0Q29udGV4dC5nZXQoXG4gICAgICAgICAgLy8gaW1wb3J0ZWQgYmVsb3c7IGxvZ2dlZCBzbyBhIG1pc3JvdXRlZCByZXF1ZXN0IHNob3dzXG4gICAgICAgICAgLy8gdXAgYWxvbmdzaWRlIGl0cyBtb2RlbCBzZWxlY3Rpb24gaW4gYExPR19MRVZFTD1kZWJ1Z2AuXG4gICAgICAgICAgXCJtYXN0cmFfX21vZGVsX292ZXJyaWRlXCIsXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VXNlcihyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgLy8gUGFzcyB0aGUgZm9yd2FyZGVkIGNhbGxlciBpZGVudGl0eSBzbyBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgc3RpbGwga2V5c1xuICAgIC8vIG1lbW9yeSAvIGNhY2hlIC8gdHJhY2VzIHBlciB1c2VyIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQgaXMgdGhlIGFwcCBTUC5cbiAgICAvLyBJbiBhbiBPQk8gY29udGV4dCB0aGVzZSBhcmUgaWdub3JlZCBpbiBmYXZvciBvZiB0aGUgY29udGV4dCdzIG93biB1c2VyLlxuICAgIGF3YWl0IHN0YW1wUmVxdWVzdENvbnRleHRVc2VyKHJlcXVlc3RDb250ZXh0LCB7XG4gICAgICB1c2VySWQ6IHJlcXVlc3RVc2VySWQocmVxKSxcbiAgICAgIGVtYWlsOiByZXF1ZXN0VXNlckVtYWlsKHJlcSksXG4gICAgfSk7XG4gICAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHJlY29yZEFjdGl2ZVRyYWNlQXV0aChcImlzVXNlckNvbnRleHRcIiBpbiB1c2VyLmV4ZWN1dGlvbkNvbnRleHQgPyBcIm9ib1wiIDogXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTtcbiAgICB9XG4gICAgY29uc3QgdHJhY2VVc2VyID0gW1xuICAgICAgcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0VNQUlMX0tFWSksXG4gICAgICByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVkpLFxuICAgICAgcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkpLFxuICAgIF0uZmluZCgodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKTtcbiAgICByZWNvcmRBY3RpdmVUcmFjZVVzZXIodHJhY2VVc2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFtcCBhIHBlci1yZXF1ZXN0IGlkIGFuZCBlY2hvIGl0IG9uIHRoZSByZXNwb25zZSBzbyBhbiB1cHN0cmVhbVxuICAgKiBwcm94eSAvIGN1cmwgY2xpZW50IC8gYnJvd3Nlci1zaWRlIGxvZyBsaW5lIGNhbiBwYWlyIGl0cyB2aWV3IG9mXG4gICAqIHRoZSByZXF1ZXN0IHdpdGggdGhlIG1hdGNoaW5nIHRyYWNlIHNwYW4uIFJldXNlcyBgWC1SZXF1ZXN0LUlkYFxuICAgKiB3aGVuIHRoZSB1cHN0cmVhbSBhbHJlYWR5IHN1cHBsaWVzIG9uZSBzbyBtdWx0aS1ob3AgdHJhY2VzIHN0YXlcbiAgICogam9pbmVkOyBvdGhlcndpc2UgbWludHMgYSBVVUlEdjQuXG4gICAqXG4gICAqIFRoZSBpZCBpcyBzdXJmYWNlZCBhcyBgbWFzdHJhX19yZXF1ZXN0SWRgIHNwYW4gbWV0YWRhdGEgdmlhXG4gICAqIHtAbGluayBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZU30gYW5kIGFzIHRoZSBgWC1SZXF1ZXN0LUlkYFxuICAgKiByZXNwb25zZSBoZWFkZXIgc28gZGV2IHRvb2xzIGNhbiBjb3B5IGl0IGZyb20gZWl0aGVyIHNpZGUuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFJlcXVlc3RJZChcbiAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICApIHtcbiAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSkpIHJldHVybjtcbiAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IHJlcS5oZWFkZXJzW1wieC1yZXF1ZXN0LWlkXCJdO1xuICAgIGNvbnN0IHVwc3RyZWFtID0gQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSkgPyBoZWFkZXJWYWx1ZVswXSA6IGhlYWRlclZhbHVlO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHVwc3RyZWFtPy50cmltKCkgfHwgaGFzaC5pZCgpO1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVRVUVTVF9JRF9LRVksIHJlcXVlc3RJZCk7XG4gICAgcmVzLnNldEhlYWRlcihcIlgtUmVxdWVzdC1JZFwiLCByZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YW1wIE9BdXRoIHNjb3BlcyBmcm9tIHRoZSBmb3J3YXJkZWQgYWNjZXNzIHRva2VuIG9uXG4gICAqIHtAbGluayBNQVNUUkFfU0NPUEVTX0tFWX0gZm9yIHdvcmtzcGFjZSBtb3VudCBnYXRpbmcuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3BlcyhyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgY29uc3Qgc2NvcGVzID0gW1xuICAgICAgLi4ub2JqZWN0XG4gICAgICAgIC5zZXF1ZW5jZSh0b2tlbi5nZXRBY2Nlc3NUb2tlblNjb3BlcyhyZXEpLCB0b2tlbi5nZXRBY2Nlc3NUb2tlblNjb3BlcyhyZXEsIFwiYXV0aG9yaXphdGlvblwiKSlcbiAgICAgICAgLmRpc3RpbmN0KCksXG4gICAgXTtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1NDT1BFU19LRVksIHNjb3Blcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgdGhlIHR1cm4ncyBNTGZsb3cgdHJhY2UgaWQgb24gdGhlIHJlc3BvbnNlIHNvIHRoZSBjaGF0IGNsaWVudFxuICAgKiBjYW4gYXR0YWNoIHRodW1icyAvIGNvbW1lbnQgZmVlZGJhY2sgdG8gaXQgbGF0ZXIuIE1MZmxvdyBkZXJpdmVzXG4gICAqIGl0cyB0cmFjZSBpZCBmcm9tIHRoZSBPcGVuVGVsZW1ldHJ5IHRyYWNlIGlkIChgdHItPGhleD5gKSwgYW5kIGV2ZXJ5XG4gICAqIE1hc3RyYSBzcGFuIGZvciB0aGlzIHJlcXVlc3QgaW5oZXJpdHMgdGhlIGFtYmllbnQgT1RlbCBjb250ZXh0IChzZWVcbiAgICogYG9ic2VydmFiaWxpdHkudHNgKSwgc28gdGhlIGFjdGl2ZSBzcGFuJ3MgdHJhY2UgaWQgaGVyZSBpcyB0aGUgaWRcbiAgICogTUxmbG93IHdpbGwgcmVjb3JkIGZvciB0aGUgdHVybi5cbiAgICpcbiAgICogTm8tb3AgdW5sZXNzIGZlZWRiYWNrIGlzIGVuYWJsZWQsIGFuZCB3aGVuIG5vIGxpdmUgT1RlbCBzcGFuIGlzXG4gICAqIGFjdGl2ZSAoZS5nLiB0aGUgT1RMUCBTREsgaXNuJ3QgcmVnaXN0ZXJlZCk6IGluIHRoYXQgY2FzZSB0aGUgaGVhZGVyXG4gICAqIGlzIHNpbXBseSBhYnNlbnQgYW5kIHRoZSBjbGllbnQgaGlkZXMgZmVlZGJhY2sgZm9yIHRoYXQgbWVzc2FnZSxcbiAgICogZGVncmFkaW5nIGdyYWNlZnVsbHkgcmF0aGVyIHRoYW4gZW1pdHRpbmcgYSBib2d1cyB0cmFjZSBpZC5cbiAgICovXG4gIGNvbmZpZ3VyZU1sZmxvd1RyYWNlSWQocmVzOiBleHByZXNzLlJlc3BvbnNlKSB7XG4gICAgaWYgKCF0aGlzLmZlZWRiYWNrRW5hYmxlZCB8fCByZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgICBpZiAocmVzLmdldEhlYWRlcihmZWVkYmFjay5NTEZMT1dfVFJBQ0VfSURfSEVBREVSKSkgcmV0dXJuO1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCk/LnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBpZiAoIXRyYWNlSWQgfHwgdHJhY2VJZCA9PT0gSU5WQUxJRF9UUkFDRV9JRCkgcmV0dXJuO1xuICAgIHJlcy5zZXRIZWFkZXIoZmVlZGJhY2suTUxGTE9XX1RSQUNFX0lEX0hFQURFUiwgYHRyLSR7dHJhY2VJZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSB0aHJlYWQgaWQgdGhpcyByZXF1ZXN0IHRhcmdldHMgYW5kIHBpbiBpdCBvblxuICAgKiBgUmVxdWVzdENvbnRleHRgIChjb25zdW1lZCBieSB0aGUgYWdlbnQgc3RyZWFtIGZvciBwZXJzaXN0ZW5jZSBhbmRcbiAgICogYnkgbmF0aXZlIG1lbW9yeSByb3V0ZXMpLiBSZXNvbHV0aW9uIG9yZGVyOlxuICAgKlxuICAgKiAgIDEuIEEgY2xpZW50LXN1cHBsaWVkIHRocmVhZCBpZCAodGhlIHRocmVhZC1zZWxlY3Rpb24gaGVhZGVyIC9cbiAgICogICAgICBgP3RocmVhZElkPWAgcXVlcnkpLiBUaGlzIGlzIGhvdyB0aGUgY2hhdCBVSSByZWZlcmVuY2VzIGFcbiAgICogICAgICBzcGVjaWZpYyBjb252ZXJzYXRpb24gYW1vbmcgdGhlIG1hbnkgYSB1c2VyIG93bnMgLSBpdCBwaWNrcyBhXG4gICAqICAgICAgdGhyZWFkIGlkIGZyb20gdGhlIGAvdGhyZWFkc2AgbGlzdGluZyAob3IgbWludHMgb25lIGZvciBhIG5ld1xuICAgKiAgICAgIGNvbnZlcnNhdGlvbikgYW5kIHN0YW1wcyBpdCBoZXJlLiBUaGUgaWQgaXMgc2NvcGVkIHRvIHRoZVxuICAgKiAgICAgIGNhbGxlcidzIHJlc291cmNlIGJ5IHRoZSByZWNhbGwgLyBsaXN0IHJvdXRlcywgc28gYSBjbGllbnRcbiAgICogICAgICBjYW4gb25seSBldmVyIHJlYWQgb3Igd3JpdGUgaXRzIG93biB0aHJlYWRzLlxuICAgKiAgIDIuIFRoZSBwZXItc2Vzc2lvbiBjb29raWUgKGBhcHBraXRfPHBsdWdpbi1uYW1lPl9zZXNzaW9uX2lkYCksXG4gICAqICAgICAgbWludGVkIG9uIGZpcnN0IGNvbnRhY3QuIFRoaXMgaXMgdGhlIGRlZmF1bHQgc2luZ2xlLXRocmVhZFxuICAgKiAgICAgIGZhbGxiYWNrIGZvciBjbGllbnRzIHRoYXQgZG9uJ3QgbWFuYWdlIHRocmVhZHMgZXhwbGljaXRseSwgc29cbiAgICogICAgICBleGlzdGluZyBlbWJlZHMga2VlcCBvbmUgc3RhYmxlIGNvbnZlcnNhdGlvbiBwZXIgc2Vzc2lvbiB3aXRoXG4gICAqICAgICAgbm8gY2xpZW50IGNoYW5nZXMuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFRocmVhZElkKFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gICkge1xuICAgIGlmIChyZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVkpKSByZXR1cm47XG4gICAgY29uc3QgcmVxdWVzdGVkID0gdGhpcy5yZWFkUmVxdWVzdGVkVGhyZWFkSWQocmVxKTtcbiAgICBpZiAocmVxdWVzdGVkKSB7XG4gICAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVksIHJlcXVlc3RlZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvb2tpZXMgPSBodHRwLnBhcnNlQ29va2llcyhyZXEuaGVhZGVycy5jb29raWUpO1xuICAgIGNvbnN0IGNvb2tpZU5hbWUgPSBzdHJpbmdVdGlscy50b0lkZW50aWZpZXJXaXRoT3B0aW9ucyhcbiAgICAgIHsgZGVsaW1pdGVyOiBcIl9cIiwgZGlzdGluY3Q6IHRydWUgfSxcbiAgICAgIFwiYXBwa2l0XCIsXG4gICAgICB0aGlzLmNvbmZpZy5uYW1lISxcbiAgICAgIFwic2Vzc2lvbklkXCIsXG4gICAgKTtcbiAgICBsZXQgc2Vzc2lvbklkID0gY29va2llc1tjb29raWVOYW1lXTtcbiAgICBpZiAoIXNlc3Npb25JZCkge1xuICAgICAgc2Vzc2lvbklkID0gaGFzaC5pZCgpO1xuICAgICAgcmVzLmNvb2tpZShjb29raWVOYW1lLCBzZXNzaW9uSWQsIHtcbiAgICAgICAgaHR0cE9ubHk6IHRydWUsXG4gICAgICAgIHNhbWVTaXRlOiBcImxheFwiLFxuICAgICAgICBzZWN1cmU6IHJlcS5zZWN1cmUsXG4gICAgICAgIHBhdGg6IFwiL1wiLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBjbGllbnQtc2VsZWN0ZWQgdGhyZWFkIGlkIGZyb20gdGhlIHJlcXVlc3QsIHByZWZlcnJpbmdcbiAgICogdGhlIHRocmVhZC1zZWxlY3Rpb24gaGVhZGVyIG92ZXIgdGhlIGA/dGhyZWFkSWQ9YCBxdWVyeS4gUmV0dXJuc1xuICAgKiBgbnVsbGAgd2hlbiBuZWl0aGVyIGNhcnJpZXMgYSBub24tZW1wdHkgdmFsdWUgc28gdGhlIGNhbGxlciBmYWxsc1xuICAgKiBiYWNrIHRvIHRoZSBzZXNzaW9uIGNvb2tpZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZFJlcXVlc3RlZFRocmVhZElkKHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgaGVhZGVyVmFsdWUgPSByZXEuaGVhZGVyc1t0aHJlYWQuVEhSRUFEX0lEX0hFQURFUl07XG4gICAgY29uc3QgcXVlcnlWYWx1ZSA9IHJlcS5xdWVyeVt0aHJlYWQuVEhSRUFEX0lEX1FVRVJZXTtcbiAgICByZXR1cm4gKFxuICAgICAgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChBcnJheS5pc0FycmF5KGhlYWRlclZhbHVlKSA/IGhlYWRlclZhbHVlWzBdIDogaGVhZGVyVmFsdWUpID8/XG4gICAgICBzdHJpbmdVdGlscy50cmltVG9OdWxsKEFycmF5LmlzQXJyYXkocXVlcnlWYWx1ZSkgPyBxdWVyeVZhbHVlWzBdIDogcXVlcnlWYWx1ZSlcbiAgICApO1xuICB9XG5cbiAgY29uZmlndXJlUmVxdWVzdENvbnRleHRNb2RlbE92ZXJyaWRlKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpIHtcbiAgICAvLyBQZXItcmVxdWVzdCBtb2RlbCBvdmVycmlkZTogb25seSBob25vcmVkIHdoZW4gdGhlIHBsdWdpblxuICAgIC8vIG9wdHMgaW4gKGRlZmF1bHQpLiBTb3VyY2VzLCBpbiBwcmlvcml0eSBvcmRlciwgYXJlXG4gICAgLy8gYFgtTWFzdHJhLU1vZGVsYCBoZWFkZXIsIGA/bW9kZWw9YCBxdWVyeSwgYW5kIGBtb2RlbGAgL1xuICAgIC8vIGBtb2RlbElkYCBib2R5IGZpZWxkOyBzZWUgYHNlcnZpbmcudHNgLlxuICAgIGNvbnN0IHNlcnZpbmcgPSByZXNvbHZlU2VydmluZ0NvbmZpZyh0aGlzLmNvbmZpZyk7XG4gICAgaWYgKHNlcnZpbmcuYWxsb3dPdmVycmlkZSkge1xuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBleHRyYWN0TW9kZWxPdmVycmlkZSh7XG4gICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPixcbiAgICAgICAgcXVlcnk6IHJlcS5xdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgYm9keTogcmVxLmJvZHksXG4gICAgICB9KTtcbiAgICAgIGlmIChvdmVycmlkZSkgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksIG92ZXJyaWRlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIElucHV0cyBmb3Ige0BsaW5rIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFBcGlHYXRlT3B0aW9ucyB7XG4gIC8qKiBgY29uZmlnLmFwaUFjY2Vzc2A7IGBcImZ1bGxcImAgc2hvcnQtY2lyY3VpdHMgdG8gYWxsb3cgZXZlcnl0aGluZy4gKi9cbiAgYWNjZXNzOiBcInNjb3BlZFwiIHwgXCJmdWxsXCI7XG4gIC8qKiBXaGV0aGVyIHRoZSBNQ1AgdHJhbnNwb3J0IGlzIG1vdW50ZWQgKHNvIGAvbWNwLypgIGlzIGxlZ2l0aW1hdGUpLiAqL1xuICBtY3BFbmFibGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1vdW50LXJlbGF0aXZlIGFnZW50IGluZmVyZW5jZSBwYXRocyAoYC9hZ2VudHMvOmlkLzx2ZXJiPi4uLmApLiBNYXRjaGVkXG4gKiBieSBwcmVmaXggb24gdGhlIHZlcmIgc28gZnV0dXJlIHZhcmlhbnRzIChgc3RyZWFtVk5leHRgLCBgc3RyZWFtL3ZuZXh0YCxcbiAqIGBnZW5lcmF0ZVZOZXh0YCkgc3RheSBjb3ZlcmVkIHdpdGhvdXQgYSBjb2RlIGNoYW5nZS5cbiAqXG4gKiBDb3ZlcnMgdGhlIHBsYWluIGluZmVyZW5jZSB2ZXJicyAoYHN0cmVhbWAgLyBgZ2VuZXJhdGVgIC8gYG5ldHdvcmtgKSBwbHVzXG4gKiB0aGUgaHVtYW4taW4tdGhlLWxvb3AgcmVzdW1lIHZlcmJzIGEgcGF1c2VkIGByZXF1aXJlQXBwcm92YWxgIHRvb2wgbmVlZHNcbiAqIHRvIGNvbnRpbnVlOiBgYXBwcm92ZS10b29sLWNhbGxgIC8gYGRlY2xpbmUtdG9vbC1jYWxsYCAoc3RyZWFtaW5nLCBhbmQgdmlhXG4gKiBwcmVmaXggdGhlaXIgYC1nZW5lcmF0ZWAgbm9uLXN0cmVhbWluZyB2YXJpYW50cyksIHRoZSBgLW5ldHdvcmstYCB2YXJpYW50cyxcbiAqIGFuZCBgcmVzdW1lLXN0cmVhbWAgKGNvdmVycyBgcmVzdW1lLXN0cmVhbS11bnRpbC1pZGxlYCkuIFdpdGhvdXQgdGhlc2UgYW5cbiAqIGFwcHJvdmFsLWdhdGVkIHRvb2wgKGUuZy4gYHNlbmRfZW1haWxgKSBjYW4gYmUgcmVxdWVzdGVkIGJ1dCBuZXZlciBhcHByb3ZlZFxuICogZnJvbSB0aGUgYnJvd3NlciAtIHRoZSByZXN1bWUgYFBPU1RgIDQwM3MgdW5kZXIgc2NvcGVkIG1vZGUuIFRvZ2V0aGVyIHdpdGhcbiAqIHRoZSByZXNvdXJjZS1zY29wZWQgbWVtb3J5IG11dGF0aW9ucyBiZWxvdywgdGhlc2UgYXJlIHRoZSBvbmx5IHN0b2NrIE1hc3RyYVxuICogd3JpdGVzIHRoZSBicm93c2VyIGNsaWVudCBjYW4gbWFrZS5cbiAqL1xuY29uc3QgQUdFTlRfSU5GRVJFTkNFID1cbiAgL15cXC9hZ2VudHNcXC9bXi9dK1xcLyhzdHJlYW18Z2VuZXJhdGV8bmV0d29ya3xyZXN1bWUtc3RyZWFtfGFwcHJvdmUtdG9vbC1jYWxsfGRlY2xpbmUtdG9vbC1jYWxsfGFwcHJvdmUtbmV0d29yay10b29sLWNhbGx8ZGVjbGluZS1uZXR3b3JrLXRvb2wtY2FsbCkvaTtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSAoYC9hZ2VudHNgLCBgL2FnZW50cy86aWRgKS4gKi9cbmNvbnN0IEFHRU5UX01FVEFEQVRBID0gL15cXC9hZ2VudHMoXFwvW14vXSspPyQvO1xuLyoqIFBlcnNpc3RlZCBhcHByb3ZhbCBkaXNjb3ZlcnkgZm9yIG9uZSBhZ2VudC4gKi9cbmNvbnN0IEFHRU5UX1NVU1BFTkRFRF9SVU5TID0gL15cXC9hZ2VudHNcXC9bXi9dK1xcL3N1c3BlbmRlZC1ydW5zJC9pO1xuLyoqIE9mZmljaWFsIEFJIFNESyBVSSBzdHJlYW0gcm91dGUsIGluY2x1ZGluZyBgcmVzdW1lRGF0YWAgY29udGludWF0aW9ucy4gKi9cbmNvbnN0IEFHRU5UX0NIQVQgPSAvXlxcL2NoYXRcXC9bXi9dKyQvaTtcbi8qKiBOYXRpdmUgcmVzb3VyY2Utc2NvcGVkIG1lbW9yeSByZWFkcyB1c2VkIGJ5IGhpc3RvcnkgYW5kIHRoZSB0aHJlYWQgbGlzdC4gKi9cbmNvbnN0IE1FTU9SWV9SRUFEID0gL15cXC9tZW1vcnlcXC90aHJlYWRzKD86XFwvW14vXSsoPzpcXC9tZXNzYWdlcyk/KT8kL2k7XG4vKiogTmF0aXZlIHRocmVhZCByZW5hbWUvZGVsZXRlIHJvdXRlcy4gKi9cbmNvbnN0IE1FTU9SWV9USFJFQURfTVVUQVRJT04gPSAvXlxcL21lbW9yeVxcL3RocmVhZHNcXC9bXi9dKyQvaTtcblxuLyoqXG4gKiBXaGV0aGVyIGEgcmVxdWVzdCB0byB0aGUgc3RvY2sgYEBtYXN0cmEvZXhwcmVzc2Agc3ViLWFwcCBzaG91bGQgYmVcbiAqIGRpc3BhdGNoZWQsIGdpdmVuIHRoZSBjb25maWd1cmVkIHtAbGluayBNYXN0cmFBcGlHYXRlT3B0aW9ucy5hY2Nlc3N9LlxuICpcbiAqIGBwYXRoYCBpcyBtb3VudC1yZWxhdGl2ZSAod2hhdCB0aGUgcGx1Z2luJ3MgY2F0Y2gtYWxsIHNlZXMsIGUuZy5cbiAqIGAvY2hhdC94YCwgYC9tZW1vcnkvdGhyZWFkc2AsIGAvbWNwLy4uLmApLiBJbiBgXCJzY29wZWRcImBcbiAqIG1vZGUgdGhlIGFsbG93bGlzdCBpcyBkZWxpYmVyYXRlbHkgdGlnaHQgLSB0aGUgY2hhdCBjbGllbnQgb25seSBldmVyXG4gKiBuZWVkcyBhZ2VudCBpbmZlcmVuY2UsIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgcmVzb3VyY2Utc2NvcGVkIG1lbW9yeSxcbiAqIHRoaXMgcGx1Z2luJ3Mgb3duIGAvcm91dGUvKmAgcm91dGVzLCBhbmQgKHdoZW4gZW5hYmxlZCkgTUNQLiBUaGUgcmVtYWluaW5nXG4gKiBhZG1pbiwgbXV0YXRpbmcsIGFuZCBidWxrLWV4cG9ydCBzdXJmYWNlIHN0YXlzIGRlbmllZCBieSBkZWZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZChcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHBhdGg6IHN0cmluZyxcbiAgb3B0czogTWFzdHJhQXBpR2F0ZU9wdGlvbnMsXG4pOiBib29sZWFuIHtcbiAgaWYgKG9wdHMuYWNjZXNzID09PSBcImZ1bGxcIikgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHAgPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IGAvJHtwYXRofWA7XG4gIC8vIFRoZSBwbHVnaW4ncyBgL3JvdXRlLypgIGFkZGl0aW9ucyB2YWxpZGF0ZSB0aGVpciBvd24gaW5wdXRzIGFuZCB0cnVzdGVkXG4gIC8vIEFwcEtpdCByZXF1ZXN0IGNvbnRleHQgYmVmb3JlIHJlYWNoaW5nIHByb2R1Y3QgYmVoYXZpb3IuXG4gIGlmIChwID09PSBcIi9yb3V0ZVwiIHx8IHAuc3RhcnRzV2l0aChcIi9yb3V0ZS9cIikpIHJldHVybiB0cnVlO1xuICBpZiAob3B0cy5tY3BFbmFibGVkICYmIChwID09PSBcIi9tY3BcIiB8fCBwLnN0YXJ0c1dpdGgoXCIvbWNwL1wiKSkpIHJldHVybiB0cnVlO1xuICBjb25zdCBtID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gIGlmIChtID09PSBcIlBPU1RcIiAmJiBBR0VOVF9DSEFULnRlc3QocCkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJQT1NUXCIgJiYgQUdFTlRfSU5GRVJFTkNFLnRlc3QocCkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJHRVRcIiAmJiAoQUdFTlRfTUVUQURBVEEudGVzdChwKSB8fCBBR0VOVF9TVVNQRU5ERURfUlVOUy50ZXN0KHApKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIkdFVFwiICYmIE1FTU9SWV9SRUFELnRlc3QocCkpIHJldHVybiB0cnVlO1xuICBpZiAoKG0gPT09IFwiUEFUQ0hcIiB8fCBtID09PSBcIkRFTEVURVwiKSAmJiBNRU1PUllfVEhSRUFEX01VVEFUSU9OLnRlc3QocCkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJQT1NUXCIgJiYgcCA9PT0gXCIvbWVtb3J5L21lc3NhZ2VzL2RlbGV0ZVwiKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEtlZXAgTWFzdHJhIGN1c3RvbSBBUEkgcm91dGVzIG1vdW50LXJlbGF0aXZlIHdoZW4gdGhlIEV4cHJlc3Mgc3ViYXBwIGlzXG4gKiBob3N0ZWQgdW5kZXIgQXBwS2l0J3MgYC9hcGkvPHBsdWdpbj5gIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hSb3V0ZVBhdGNoTWlkZGxld2FyZShhcHA6IGV4cHJlc3MuRXhwcmVzcyk6IHZvaWQge1xuICBhcHAudXNlKChyZXEsIF9yZXMsIG5leHQpID0+IHtcbiAgICBjb25zdCBpc0N1c3RvbVJvdXRlID1cbiAgICAgIHJlcS5wYXRoID09PSBcIi9jaGF0XCIgfHxcbiAgICAgIHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvY2hhdC9cIikgfHxcbiAgICAgIHJlcS5wYXRoID09PSBcIi9yb3V0ZVwiIHx8XG4gICAgICByZXEucGF0aC5zdGFydHNXaXRoKFwiL3JvdXRlL1wiKTtcbiAgICBpZiAoIWlzQ3VzdG9tUm91dGUpIHJldHVybiBuZXh0KCk7XG4gICAgcmVxLm9yaWdpbmFsVXJsID0gcmVxLnBhdGg7XG4gICAgbmV4dCgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBGaW5pc2ggYSBjaGF0IHJlcXVlc3Qgd2hlbiBNYXN0cmEgdGhyb3dzIGJlY2F1c2UgdGhlIHdvcmtmbG93IGlzIG5vXG4gKiBsb25nZXIgc3VzcGVuZGVkLiBEdXBsaWNhdGUgYXBwcm92ZS9yZXN1bWUgYW5kIGxhdGUgYGNvbnN1bWVTdHJlYW1gXG4gKiBib3RoIGhpdCB0aGF0IHBhdGg7IHRoZSBjbGllbnQgYWxyZWFkeSBoYXMgKG9yIHdpbGwgcmVsb2FkKSB0aGVcbiAqIGNvbXBsZXRlZCB0dXJuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoU3RhbGVSZXN1bWVSZWNvdmVyeShhcHA6IGV4cHJlc3MuRXhwcmVzcyk6IHZvaWQge1xuICBhcHAudXNlKFxuICAgIChlcnJvcjogdW5rbm93biwgcmVxOiBleHByZXNzLlJlcXVlc3QsIHJlczogZXhwcmVzcy5SZXNwb25zZSwgbmV4dDogZXhwcmVzcy5OZXh0RnVuY3Rpb24pID0+IHtcbiAgICAgIGlmICghaXNTdGFsZU1hc3RyYVJlc3VtZUVycm9yKGVycm9yKSkge1xuICAgICAgICBuZXh0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLndhcm4oXCJpZ25vcmVkIHN0YWxlIG1hc3RyYSByZXN1bWVcIiwge1xuICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgICByZXMuZW5kKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlcy5zdGF0dXMoMjAwKTtcbiAgICAgIHJlcy5zZXRIZWFkZXIoXCJjb250ZW50LXR5cGVcIiwgXCJ0ZXh0L2V2ZW50LXN0cmVhbTsgY2hhcnNldD11dGYtOFwiKTtcbiAgICAgIHJlcy5zZXRIZWFkZXIoXCJjYWNoZS1jb250cm9sXCIsIFwibm8tY2FjaGVcIik7XG4gICAgICByZXMud3JpdGUoYGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoeyB0eXBlOiBcInN0YXJ0XCIgfSl9XFxuXFxuYCk7XG4gICAgICByZXMud3JpdGUoYGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoeyB0eXBlOiBcImZpbmlzaFwiIH0pfVxcblxcbmApO1xuICAgICAgcmVzLndyaXRlKFwiZGF0YTogW0RPTkVdXFxuXFxuXCIpO1xuICAgICAgcmVzLmVuZCgpO1xuICAgIH0sXG4gICk7XG59XG4iXX0=
|
package/lib/src/skill-paths.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Where Databricks Assistant `SKILL.md` trees live.
|
|
3
3
|
*
|
|
4
4
|
* Two modules need these paths and must agree on them: `workspaces.ts` MOUNTS
|
|
5
|
-
* them per request (see `
|
|
5
|
+
* them per request (see `DEFAULT_DATABRICKS_WORKSPACE_PATHS`), and `remote-skills.ts`
|
|
6
6
|
* WRITES provisioned skills into them at startup. They live here rather than being
|
|
7
7
|
* spelled out in both, where a change to one would silently provision skills into a
|
|
8
8
|
* tree the other never scanned.
|
package/lib/src/skill-paths.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Where Databricks Assistant `SKILL.md` trees live.
|
|
3
3
|
*
|
|
4
4
|
* Two modules need these paths and must agree on them: `workspaces.ts` MOUNTS
|
|
5
|
-
* them per request (see `
|
|
5
|
+
* them per request (see `DEFAULT_DATABRICKS_WORKSPACE_PATHS`), and `remote-skills.ts`
|
|
6
6
|
* WRITES provisioned skills into them at startup. They live here rather than being
|
|
7
7
|
* spelled out in both, where a change to one would silently provision skills into a
|
|
8
8
|
* tree the other never scanned.
|
|
@@ -21,4 +21,4 @@ export function personalWorkspacePath(userEmail) {
|
|
|
21
21
|
export function personalSkillsPath(userEmail) {
|
|
22
22
|
return `${personalWorkspacePath(userEmail)}/.assistant/skills`;
|
|
23
23
|
}
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tpbGwtcGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2tpbGwtcGF0aHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyx1QkFBdUIsQ0FBQztBQUVuRSx1RUFBdUU7QUFDdkUsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsR0FBRywyQkFBMkIsU0FBUyxDQUFDO0FBRWhGLHdDQUF3QztBQUN4QyxNQUFNLFVBQVUscUJBQXFCLENBQUMsU0FBaUI7SUFDckQsT0FBTyxvQkFBb0IsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7QUFDaEQsQ0FBQztBQUVELDhDQUE4QztBQUM5QyxNQUFNLFVBQVUsa0JBQWtCLENBQUMsU0FBaUI7SUFDbEQsT0FBTyxHQUFHLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQztBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXaGVyZSBEYXRhYnJpY2tzIEFzc2lzdGFudCBgU0tJTEwubWRgIHRyZWVzIGxpdmUuXG4gKlxuICogVHdvIG1vZHVsZXMgbmVlZCB0aGVzZSBwYXRocyBhbmQgbXVzdCBhZ3JlZSBvbiB0aGVtOiBgd29ya3NwYWNlcy50c2AgTU9VTlRTXG4gKiB0aGVtIHBlciByZXF1ZXN0IChzZWUgYERFRkFVTFRfREFUQUJSSUNLU19XT1JLU1BBQ0VfUEFUSFNgKSwgYW5kIGByZW1vdGUtc2tpbGxzLnRzYFxuICogV1JJVEVTIHByb3Zpc2lvbmVkIHNraWxscyBpbnRvIHRoZW0gYXQgc3RhcnR1cC4gVGhleSBsaXZlIGhlcmUgcmF0aGVyIHRoYW4gYmVpbmdcbiAqIHNwZWxsZWQgb3V0IGluIGJvdGgsIHdoZXJlIGEgY2hhbmdlIHRvIG9uZSB3b3VsZCBzaWxlbnRseSBwcm92aXNpb24gc2tpbGxzIGludG8gYVxuICogdHJlZSB0aGUgb3RoZXIgbmV2ZXIgc2Nhbm5lZC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuLyoqIE9yZ2FuaXphdGlvbiBBc3Npc3RhbnQgcm9vdCwgbW91bnRlZCBhdCBpdHMgYWN0dWFsIHdvcmtzcGFjZSBwYXRoLiAqL1xuZXhwb3J0IGNvbnN0IE9SR0FOSVpBVElPTl9BU1NJU1RBTlRfUEFUSCA9IFwiL1dvcmtzcGFjZS8uYXNzaXN0YW50XCI7XG5cbi8qKiBPcmdhbml6YXRpb24gc2tpbGxzIHRyZWUsIHJlYWRhYmxlIGJ5IGV2ZXJ5b25lIGluIHRoZSB3b3Jrc3BhY2UuICovXG5leHBvcnQgY29uc3QgT1JHQU5JWkFUSU9OX1NLSUxMU19QQVRIID0gYCR7T1JHQU5JWkFUSU9OX0FTU0lTVEFOVF9QQVRIfS9za2lsbHNgO1xuXG4vKiogV29ya3NwYWNlIGhvbWUgcm9vdCBmb3Igb25lIHVzZXIuICovXG5leHBvcnQgZnVuY3Rpb24gcGVyc29uYWxXb3Jrc3BhY2VQYXRoKHVzZXJFbWFpbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAvV29ya3NwYWNlL1VzZXJzLyR7dXNlckVtYWlsLnRyaW0oKX1gO1xufVxuXG4vKiogUGVyc29uYWwgc2tpbGxzIHRyZWUgb3duZWQgYnkgb25lIHVzZXIuICovXG5leHBvcnQgZnVuY3Rpb24gcGVyc29uYWxTa2lsbHNQYXRoKHVzZXJFbWFpbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3BlcnNvbmFsV29ya3NwYWNlUGF0aCh1c2VyRW1haWwpfS8uYXNzaXN0YW50L3NraWxsc2A7XG59XG4iXX0=
|
package/lib/src/workspaces.d.ts
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Mastra workspace factory for Databricks Apps.
|
|
3
3
|
*
|
|
4
|
-
* Builds
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* readable / writable policy: a Databricks path mounted through the OBO client
|
|
9
|
-
* on {@link MASTRA_USER_KEY}, or any {@link WorkspaceFilesystem} a consuming
|
|
10
|
-
* library already owns. {@link DEFAULT_SKILL_FOLDERS} supplies the Assistant
|
|
11
|
-
* trees, and `skillFolders` merges over it - same name overrides, `false`
|
|
12
|
-
* disables, a new name adds. Optional mount resolvers contribute further
|
|
13
|
-
* filesystems and skill scan roots on top.
|
|
4
|
+
* Builds native Mastra workspace configuration from Databricks paths. Paths
|
|
5
|
+
* mount at the same path by default, `~` resolves to the current user's
|
|
6
|
+
* Databricks workspace home, and `/tmp[/subpath]` resolves to stable
|
|
7
|
+
* user-scoped storage under the host's ephemeral temp directory.
|
|
14
8
|
*
|
|
15
9
|
* Databricks mounts use `@dbx-tools/databricks` {@link DatabricksFileSystem}
|
|
16
10
|
* wrapped by {@link filesystems}; inaccessible roots are skipped independently.
|
|
@@ -18,30 +12,21 @@
|
|
|
18
12
|
* @module
|
|
19
13
|
*/
|
|
20
14
|
import { pluginRegistry } from "@dbx-tools/appkit";
|
|
15
|
+
import { type PathMatchInput } from "@dbx-tools/path";
|
|
16
|
+
import { type CacheableFileSystemOperation } from "@dbx-tools/shared-fs";
|
|
21
17
|
import type { RequestContext } from "@mastra/core/request-context";
|
|
22
|
-
import { Workspace, type SkillsResolver, type
|
|
18
|
+
import { Workspace, type SkillsResolver, type WorkspaceConfig, type WorkspaceFilesystem, type WorkspaceSandbox, type WorkspaceSandboxResolver } from "@mastra/core/workspace";
|
|
23
19
|
import { type DatabricksWorkspaceSandboxOptions } from "./sandbox.ts";
|
|
24
20
|
/** Per-request context for mount and skill-folder resolvers. */
|
|
25
|
-
export interface
|
|
21
|
+
export interface DatabricksWorkspaceContext {
|
|
26
22
|
requestContext?: RequestContext;
|
|
27
23
|
}
|
|
28
24
|
/**
|
|
29
|
-
*
|
|
30
|
-
* A resolver returning `undefined` skips the folder for that request.
|
|
25
|
+
* One Databricks path mounted into a Mastra workspace.
|
|
31
26
|
*/
|
|
32
|
-
export
|
|
33
|
-
/**
|
|
34
|
-
|
|
35
|
-
*
|
|
36
|
-
* Give {@link path} for a Databricks workspace tree (mounted through the
|
|
37
|
-
* request's OBO client), or {@link filesystem} for a mount the consumer builds
|
|
38
|
-
* itself. {@link filesystem} wins when both are set.
|
|
39
|
-
*/
|
|
40
|
-
export interface SkillFolderOptions {
|
|
41
|
-
/** Absolute Databricks workspace root mounted at its actual path. */
|
|
42
|
-
path?: SkillFolderValue<string>;
|
|
43
|
-
/** Ready-made mount, for locations the OBO client cannot reach. */
|
|
44
|
-
filesystem?: SkillFolderValue<WorkspaceFilesystem>;
|
|
27
|
+
export interface DatabricksWorkspacePathOptions {
|
|
28
|
+
/** Absolute Databricks path or `~` shortcut for the current user's workspace home. */
|
|
29
|
+
path: string;
|
|
45
30
|
/** Human-friendly mount name shown in filesystem listings. */
|
|
46
31
|
displayName?: string;
|
|
47
32
|
/** Mount description shown in filesystem listings and workspace instructions. */
|
|
@@ -70,51 +55,44 @@ export interface SkillFolderOptions {
|
|
|
70
55
|
/** Mount point in the composite namespace. Databricks paths default to their actual root. */
|
|
71
56
|
mount?: string;
|
|
72
57
|
}
|
|
73
|
-
/**
|
|
74
|
-
export
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
58
|
+
/** String shorthand or full options for one Databricks workspace path. */
|
|
59
|
+
export type DatabricksWorkspacePath = string | DatabricksWorkspacePathOptions;
|
|
60
|
+
/** Fixed or request-dependent Databricks path entry. */
|
|
61
|
+
export type DatabricksWorkspacePathValue = DatabricksWorkspacePath | false | ((context: DatabricksWorkspaceContext) => DatabricksWorkspacePath | false | undefined | Promise<DatabricksWorkspacePath | false | undefined>);
|
|
62
|
+
/** Operations and path globs cached by the Databricks filesystem shortcut. */
|
|
63
|
+
export interface DatabricksWorkspaceCacheFilter {
|
|
64
|
+
/** Cached filesystem operations. Omit for `exists`, `readFile`, `readdir`, and `stat`. */
|
|
65
|
+
operations?: CacheableFileSystemOperation | readonly CacheableFileSystemOperation[];
|
|
66
|
+
/** Absolute or root-relative globs and predicates. `~` expands per request. */
|
|
67
|
+
paths?: PathMatchInput | readonly PathMatchInput[];
|
|
78
68
|
}
|
|
79
|
-
/**
|
|
80
|
-
export type
|
|
81
|
-
/** Names carried by {@link DEFAULT_SKILL_FOLDERS}. */
|
|
82
|
-
export type DefaultSkillFolderName = "organization-skills" | "personal-skills";
|
|
69
|
+
/** Fixed or request-dependent filesystem cache selection. */
|
|
70
|
+
export type DatabricksWorkspaceCache = boolean | DatabricksWorkspaceCacheFilter | readonly DatabricksWorkspaceCacheFilter[] | ((context: DatabricksWorkspaceContext) => boolean | DatabricksWorkspaceCacheFilter | readonly DatabricksWorkspaceCacheFilter[] | undefined | Promise<boolean | DatabricksWorkspaceCacheFilter | readonly DatabricksWorkspaceCacheFilter[] | undefined>);
|
|
83
71
|
/**
|
|
84
|
-
* Sandbox selection for {@link
|
|
72
|
+
* Sandbox selection for {@link databricksWorkspace}. Monty is the default;
|
|
85
73
|
* `false` disables command execution, and a Mastra provider or resolver is an
|
|
86
74
|
* explicit replacement.
|
|
87
75
|
*/
|
|
88
76
|
export type WorkspaceSandboxSelection = false | "databricks" | "monty" | DatabricksWorkspaceSandboxOptions | WorkspaceSandbox | WorkspaceSandboxResolver;
|
|
89
|
-
/**
|
|
90
|
-
export interface
|
|
91
|
-
/** Workspace id; derived from `name` or `"workspace"` when omitted. */
|
|
92
|
-
id?: string;
|
|
93
|
-
/** Display name; derived from `id` when omitted. */
|
|
94
|
-
name?: string;
|
|
77
|
+
/** Native Mastra workspace options plus Databricks path shortcuts. */
|
|
78
|
+
export interface DatabricksWorkspaceOptions extends Omit<WorkspaceConfig, "filesystem" | "mounts" | "sandbox" | "skills"> {
|
|
95
79
|
/**
|
|
96
|
-
* Start from {@link
|
|
97
|
-
* starts from an empty map, leaving only the {@link skillFolders} given here.
|
|
80
|
+
* Start from {@link DEFAULT_DATABRICKS_WORKSPACE_PATHS}. Defaults to `true`.
|
|
98
81
|
*/
|
|
99
|
-
|
|
82
|
+
assistantPaths?: boolean;
|
|
100
83
|
/**
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* a folder.
|
|
84
|
+
* Databricks paths appended after the defaults. A string is shorthand for
|
|
85
|
+
* `{ path }`; a resolver may return either form per request.
|
|
104
86
|
*/
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
mounts?:
|
|
87
|
+
paths?: readonly DatabricksWorkspacePathValue[];
|
|
88
|
+
/** Native Mastra filesystems composed beside the Databricks paths. */
|
|
89
|
+
mounts?: Record<string, WorkspaceFilesystem>;
|
|
108
90
|
/** Replace the auto-built dynamic skills resolver. */
|
|
109
91
|
skills?: SkillsResolver;
|
|
110
|
-
/**
|
|
111
|
-
|
|
112
|
-
/** Additional native Mastra workspace tool configuration and overrides. */
|
|
113
|
-
tools?: WorkspaceToolsConfig;
|
|
92
|
+
/** Filesystem cache filters. Ignored when the AppKit files-cache plugin is absent. */
|
|
93
|
+
cache?: DatabricksWorkspaceCache;
|
|
114
94
|
/** AppKit plugin context used to discover optional sibling capabilities. */
|
|
115
95
|
pluginContext?: pluginRegistry.PluginContextLike;
|
|
116
|
-
/** Enable BM25 keyword search over indexed workspace content. */
|
|
117
|
-
bm25?: boolean;
|
|
118
96
|
/**
|
|
119
97
|
* Command sandbox. Defaults to Monty. Pass `"databricks"` or an options
|
|
120
98
|
* object for Databricks Sandbox, `false` to disable command execution, or an
|
|
@@ -131,54 +109,37 @@ export interface CreateWorkspaceOptions {
|
|
|
131
109
|
extraSkillPaths?: string[];
|
|
132
110
|
}
|
|
133
111
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
* - `organization-skills` - `/Workspace/.assistant` with `skills`; write
|
|
137
|
-
* attempts require approval and remain subject to Databricks permissions.
|
|
138
|
-
* - `personal-skills` - the requesting user's `/Workspace/Users/<email>` root
|
|
139
|
-
* with `.assistant/skills`, writable and skipped without an email.
|
|
112
|
+
* Default Databricks paths for shared and current-user Agent Skills.
|
|
140
113
|
*/
|
|
141
|
-
export declare const
|
|
114
|
+
export declare const DEFAULT_DATABRICKS_WORKSPACE_PATHS: readonly DatabricksWorkspacePathOptions[];
|
|
142
115
|
/**
|
|
143
116
|
* Create a Mastra {@link Workspace} with per-request Databricks mounts.
|
|
144
117
|
*
|
|
145
|
-
* @example Default
|
|
118
|
+
* @example Default Databricks paths
|
|
146
119
|
* ```ts
|
|
147
|
-
*
|
|
120
|
+
* databricksWorkspace()
|
|
148
121
|
* ```
|
|
149
122
|
*
|
|
150
|
-
* @example
|
|
123
|
+
* @example Use only explicit paths
|
|
151
124
|
* ```ts
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
* path: "/Workspace/Shared/.assistant",
|
|
156
|
-
* skills: ["skills"],
|
|
157
|
-
* },
|
|
158
|
-
* "personal-skills": false,
|
|
159
|
-
* runbooks: { path: "/Workspace/Shared/runbooks/skills", writable: true },
|
|
160
|
-
* volume: { filesystem: myVolumeFilesystem },
|
|
161
|
-
* },
|
|
125
|
+
* databricksWorkspace({
|
|
126
|
+
* assistantPaths: false,
|
|
127
|
+
* paths: ["~/project", "/tmp/project", "/Volumes/main/default/data"],
|
|
162
128
|
* })
|
|
163
129
|
* ```
|
|
164
130
|
*
|
|
165
|
-
* @example
|
|
131
|
+
* @example Build a standard Mastra workspace yourself
|
|
166
132
|
* ```ts
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
* mounts: { "/data": myFilesystem },
|
|
171
|
-
* skillPaths: [],
|
|
172
|
-
* }),
|
|
173
|
-
* ],
|
|
133
|
+
* new Workspace({
|
|
134
|
+
* ...databricksWorkspaceConfig({ paths: ["~/project"] }),
|
|
135
|
+
* sandbox: mySandbox,
|
|
174
136
|
* })
|
|
175
137
|
* ```
|
|
176
138
|
*/
|
|
177
|
-
export declare function
|
|
139
|
+
export declare function databricksWorkspaceConfig(options?: DatabricksWorkspaceOptions): WorkspaceConfig;
|
|
140
|
+
/** Create a native Mastra {@link Workspace} from {@link databricksWorkspaceConfig}. */
|
|
141
|
+
export declare function databricksWorkspace(options?: DatabricksWorkspaceOptions): Workspace;
|
|
178
142
|
/**
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
* `assistantSkills: false` drops the defaults, and a `false` value removes one
|
|
182
|
-
* entry by name.
|
|
143
|
+
* Resolve default and caller-provided Databricks paths in priority order.
|
|
183
144
|
*/
|
|
184
|
-
export declare function
|
|
145
|
+
export declare function resolveDatabricksWorkspacePaths(options?: Pick<DatabricksWorkspaceOptions, "assistantPaths" | "paths">): DatabricksWorkspacePathValue[];
|