@dbx-tools/appkit-lakebox 0.9.157 → 0.9.159

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/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-lakebox";
6
- export const PACKAGE_VERSION = "0.9.157";
6
+ export const PACKAGE_VERSION = "0.9.159";
7
7
  export * as config from "./src/config.ts";
8
8
  export * as desktop from "./src/desktop.ts";
9
9
  export * as metrics from "./src/metrics.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-lakebox";
2
- export declare const PACKAGE_VERSION = "0.9.157";
2
+ export declare const PACKAGE_VERSION = "0.9.159";
3
3
  export * as config from "./src/config.ts";
4
4
  export * as desktop from "./src/desktop.ts";
5
5
  export * as metrics from "./src/metrics.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-lakebox";
5
- export const PACKAGE_VERSION = "0.9.157";
5
+ export const PACKAGE_VERSION = "0.9.159";
6
6
  export * as config from "./src/config.js";
7
7
  export * as desktop from "./src/desktop.js";
8
8
  export * as metrics from "./src/metrics.js";
@@ -23,4 +23,4 @@ export { LakeboxControllerDefinitionSchema, LakeboxControllerServiceSchema, buil
23
23
  export { LAKEBOX_SKILLS_MOUNT, lakeboxSkillMounts } from "./src/skills.js";
24
24
  export { LAKEBOX_AGENT_USER, LAKEBOX_AGENT_HOME, LAKEBOX_STATE_ROOT, LAKEBOX_USERS_ROOT, LAKEBOX_RUNTIME_ROOT, LAKEBOX_RUN_ROOT, LAKEBOX_UID_MIN, LAKEBOX_UID_COUNT, LAKEBOX_PORT_MIN, LAKEBOX_PORT_COUNT, normalizeLakeboxIdentity, lakeboxUser, lakeboxPersistentHome, lakeboxServicePort, isLakeboxUserHash } from "./src/user.js";
25
25
  export { LakeboxWorkspaceSandbox, lakeboxWorkspaceSandbox } from "./src/workspace.js";
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywyQkFBMkIsQ0FBQztBQUM5RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhGLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXBFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSw4QkFBOEIsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFak4sT0FBTyxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdFUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1sYWtlYm94XCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTU3XCI7XG5leHBvcnQgKiBhcyBjb25maWcgZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0ICogYXMgZGVza3RvcCBmcm9tIFwiLi9zcmMvZGVza3RvcC50c1wiO1xuZXhwb3J0ICogYXMgbWV0cmljcyBmcm9tIFwiLi9zcmMvbWV0cmljcy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHJvdXRlcyBmcm9tIFwiLi9zcmMvcm91dGVzLnRzXCI7XG5leHBvcnQgKiBhcyBydW50aW1lIGZyb20gXCIuL3NyYy9ydW50aW1lLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aWNlcyBmcm9tIFwiLi9zcmMvc2VydmljZXMudHNcIjtcbmV4cG9ydCAqIGFzIHNraWxscyBmcm9tIFwiLi9zcmMvc2tpbGxzLnRzXCI7XG5leHBvcnQgKiBhcyB1c2VyIGZyb20gXCIuL3NyYy91c2VyLnRzXCI7XG5leHBvcnQgKiBhcyB3b3Jrc3BhY2UgZnJvbSBcIi4vc3JjL3dvcmtzcGFjZS50c1wiO1xuZXhwb3J0IHsgTGFrZWJveFBsdWdpbkNvbmZpZ1NjaGVtYSwgcmVzb2x2ZUxha2Vib3hQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZUxha2Vib3hQbHVnaW5Db25maWcsIFJlc29sdmVkTGFrZWJveFBsdWdpbkNvbmZpZywgTGFrZWJveFBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB7IGRlc2t0b3BIdG1sSGVhZCwgZGVza3RvcE9wZW5VcmwsIGRlc2t0b3BFbnZpcm9ubWVudCB9IGZyb20gXCIuL3NyYy9kZXNrdG9wLnRzXCI7XG5leHBvcnQgeyBMYWtlYm94TWV0cmljcywgcGFyc2VMYWtlYm94Q291bnRlcnMsIHRvU25hcHNob3QgfSBmcm9tIFwiLi9zcmMvbWV0cmljcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYm94Q291bnRlcnMsIExha2Vib3hNZXRyaWNzRXZlbnRzIH0gZnJvbSBcIi4vc3JjL21ldHJpY3MudHNcIjtcbmV4cG9ydCB7IEFwcEtpdExha2Vib3hQbHVnaW4sIGxha2Vib3ggfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgeyBMYWtlYm94Um91dGVSZWdpc3RyeSB9IGZyb20gXCIuL3NyYy9yb3V0ZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJveFJvdXRlUmVzb2x1dGlvbiwgTGFrZWJveFJvdXRlUmVzb2x2ZXIgfSBmcm9tIFwiLi9zcmMvcm91dGVzLnRzXCI7XG5leHBvcnQgeyBMYWtlYm94UnVudGltZSwgaXNMYWtlYm94TWlzc2luZyB9IGZyb20gXCIuL3NyYy9ydW50aW1lLnRzXCI7XG5leHBvcnQgdHlwZSB7IExha2Vib3hJZGVudGl0eVJlc29sdmVyLCBMYWtlYm94TGVnYWN5UG9vbCB9IGZyb20gXCIuL3NyYy9ydW50aW1lLnRzXCI7XG5leHBvcnQgeyBMYWtlYm94Q29udHJvbGxlckRlZmluaXRpb25TY2hlbWEsIExha2Vib3hDb250cm9sbGVyU2VydmljZVNjaGVtYSwgYnVpbHRJbkRlZmluaXRpb24sIGltYWdlRGVmaW5pdGlvbiwgc2VydmljZVJvdXRlLCB0b0xha2Vib3hTZXJ2aWNlLCB3aXRoU2VydmljZU9yaWdpbiwgaWRsZUJ1aWx0SW5TZXJ2aWNlIH0gZnJvbSBcIi4vc3JjL3NlcnZpY2VzLnRzXCI7XG5leHBvcnQgdHlwZSB7IExha2Vib3hDb250cm9sbGVyRGVmaW5pdGlvbiwgTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlLCBMYWtlYm94U2VydmljZVJvdXRlIH0gZnJvbSBcIi4vc3JjL3NlcnZpY2VzLnRzXCI7XG5leHBvcnQgeyBMQUtFQk9YX1NLSUxMU19NT1VOVCwgbGFrZWJveFNraWxsTW91bnRzIH0gZnJvbSBcIi4vc3JjL3NraWxscy50c1wiO1xuZXhwb3J0IHsgTEFLRUJPWF9BR0VOVF9VU0VSLCBMQUtFQk9YX0FHRU5UX0hPTUUsIExBS0VCT1hfU1RBVEVfUk9PVCwgTEFLRUJPWF9VU0VSU19ST09ULCBMQUtFQk9YX1JVTlRJTUVfUk9PVCwgTEFLRUJPWF9SVU5fUk9PVCwgTEFLRUJPWF9VSURfTUlOLCBMQUtFQk9YX1VJRF9DT1VOVCwgTEFLRUJPWF9QT1JUX01JTiwgTEFLRUJPWF9QT1JUX0NPVU5ULCBub3JtYWxpemVMYWtlYm94SWRlbnRpdHksIGxha2Vib3hVc2VyLCBsYWtlYm94UGVyc2lzdGVudEhvbWUsIGxha2Vib3hTZXJ2aWNlUG9ydCwgaXNMYWtlYm94VXNlckhhc2ggfSBmcm9tIFwiLi9zcmMvdXNlci50c1wiO1xuZXhwb3J0IHsgTGFrZWJveFdvcmtzcGFjZVNhbmRib3gsIGxha2Vib3hXb3Jrc3BhY2VTYW5kYm94IH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYm94V29ya3NwYWNlU2FuZGJveE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvd29ya3NwYWNlLnRzXCI7XG4iXX0=
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywyQkFBMkIsQ0FBQztBQUM5RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhGLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXBFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSw4QkFBOEIsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFak4sT0FBTyxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdFUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1sYWtlYm94XCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTU5XCI7XG5leHBvcnQgKiBhcyBjb25maWcgZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0ICogYXMgZGVza3RvcCBmcm9tIFwiLi9zcmMvZGVza3RvcC50c1wiO1xuZXhwb3J0ICogYXMgbWV0cmljcyBmcm9tIFwiLi9zcmMvbWV0cmljcy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHJvdXRlcyBmcm9tIFwiLi9zcmMvcm91dGVzLnRzXCI7XG5leHBvcnQgKiBhcyBydW50aW1lIGZyb20gXCIuL3NyYy9ydW50aW1lLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aWNlcyBmcm9tIFwiLi9zcmMvc2VydmljZXMudHNcIjtcbmV4cG9ydCAqIGFzIHNraWxscyBmcm9tIFwiLi9zcmMvc2tpbGxzLnRzXCI7XG5leHBvcnQgKiBhcyB1c2VyIGZyb20gXCIuL3NyYy91c2VyLnRzXCI7XG5leHBvcnQgKiBhcyB3b3Jrc3BhY2UgZnJvbSBcIi4vc3JjL3dvcmtzcGFjZS50c1wiO1xuZXhwb3J0IHsgTGFrZWJveFBsdWdpbkNvbmZpZ1NjaGVtYSwgcmVzb2x2ZUxha2Vib3hQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZUxha2Vib3hQbHVnaW5Db25maWcsIFJlc29sdmVkTGFrZWJveFBsdWdpbkNvbmZpZywgTGFrZWJveFBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB7IGRlc2t0b3BIdG1sSGVhZCwgZGVza3RvcE9wZW5VcmwsIGRlc2t0b3BFbnZpcm9ubWVudCB9IGZyb20gXCIuL3NyYy9kZXNrdG9wLnRzXCI7XG5leHBvcnQgeyBMYWtlYm94TWV0cmljcywgcGFyc2VMYWtlYm94Q291bnRlcnMsIHRvU25hcHNob3QgfSBmcm9tIFwiLi9zcmMvbWV0cmljcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYm94Q291bnRlcnMsIExha2Vib3hNZXRyaWNzRXZlbnRzIH0gZnJvbSBcIi4vc3JjL21ldHJpY3MudHNcIjtcbmV4cG9ydCB7IEFwcEtpdExha2Vib3hQbHVnaW4sIGxha2Vib3ggfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgeyBMYWtlYm94Um91dGVSZWdpc3RyeSB9IGZyb20gXCIuL3NyYy9yb3V0ZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJveFJvdXRlUmVzb2x1dGlvbiwgTGFrZWJveFJvdXRlUmVzb2x2ZXIgfSBmcm9tIFwiLi9zcmMvcm91dGVzLnRzXCI7XG5leHBvcnQgeyBMYWtlYm94UnVudGltZSwgaXNMYWtlYm94TWlzc2luZyB9IGZyb20gXCIuL3NyYy9ydW50aW1lLnRzXCI7XG5leHBvcnQgdHlwZSB7IExha2Vib3hJZGVudGl0eVJlc29sdmVyLCBMYWtlYm94TGVnYWN5UG9vbCB9IGZyb20gXCIuL3NyYy9ydW50aW1lLnRzXCI7XG5leHBvcnQgeyBMYWtlYm94Q29udHJvbGxlckRlZmluaXRpb25TY2hlbWEsIExha2Vib3hDb250cm9sbGVyU2VydmljZVNjaGVtYSwgYnVpbHRJbkRlZmluaXRpb24sIGltYWdlRGVmaW5pdGlvbiwgc2VydmljZVJvdXRlLCB0b0xha2Vib3hTZXJ2aWNlLCB3aXRoU2VydmljZU9yaWdpbiwgaWRsZUJ1aWx0SW5TZXJ2aWNlIH0gZnJvbSBcIi4vc3JjL3NlcnZpY2VzLnRzXCI7XG5leHBvcnQgdHlwZSB7IExha2Vib3hDb250cm9sbGVyRGVmaW5pdGlvbiwgTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlLCBMYWtlYm94U2VydmljZVJvdXRlIH0gZnJvbSBcIi4vc3JjL3NlcnZpY2VzLnRzXCI7XG5leHBvcnQgeyBMQUtFQk9YX1NLSUxMU19NT1VOVCwgbGFrZWJveFNraWxsTW91bnRzIH0gZnJvbSBcIi4vc3JjL3NraWxscy50c1wiO1xuZXhwb3J0IHsgTEFLRUJPWF9BR0VOVF9VU0VSLCBMQUtFQk9YX0FHRU5UX0hPTUUsIExBS0VCT1hfU1RBVEVfUk9PVCwgTEFLRUJPWF9VU0VSU19ST09ULCBMQUtFQk9YX1JVTlRJTUVfUk9PVCwgTEFLRUJPWF9SVU5fUk9PVCwgTEFLRUJPWF9VSURfTUlOLCBMQUtFQk9YX1VJRF9DT1VOVCwgTEFLRUJPWF9QT1JUX01JTiwgTEFLRUJPWF9QT1JUX0NPVU5ULCBub3JtYWxpemVMYWtlYm94SWRlbnRpdHksIGxha2Vib3hVc2VyLCBsYWtlYm94UGVyc2lzdGVudEhvbWUsIGxha2Vib3hTZXJ2aWNlUG9ydCwgaXNMYWtlYm94VXNlckhhc2ggfSBmcm9tIFwiLi9zcmMvdXNlci50c1wiO1xuZXhwb3J0IHsgTGFrZWJveFdvcmtzcGFjZVNhbmRib3gsIGxha2Vib3hXb3Jrc3BhY2VTYW5kYm94IH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYm94V29ya3NwYWNlU2FuZGJveE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvd29ya3NwYWNlLnRzXCI7XG4iXX0=
@@ -117,6 +117,8 @@ export declare class LakeboxRuntime {
117
117
  private ready;
118
118
  private converge;
119
119
  private connect;
120
+ private waitForSshRetry;
121
+ private connectOnce;
120
122
  /** Runs the fixed privileged bootstrap and returns the restored user hashes. */
121
123
  private bootstrap;
122
124
  private admin;
@@ -2,7 +2,7 @@ import { createHash } from "node:crypto";
2
2
  import { onParentTerminationSignal } from "@dbx-tools/core";
3
3
  import { SshKeyStore, ensureLakeboxRunning, ensureLakeboxStopped, lakeboxIdleTimeoutSeconds, normalizeLakeboxStatus, SshCommand, SshSession, } from "@dbx-tools/lakebox";
4
4
  import { isLakeboxUnavailable, LakeboxApiError, LakeboxClient, } from "@dbx-tools/lakebox";
5
- import { log, toError } from "@dbx-tools/shared-core";
5
+ import { errorNodes, log, sleep, toError } from "@dbx-tools/shared-core";
6
6
  import { LAKEBOX_BUILT_IN_SERVICES, lakeboxBuiltInServiceNameSchema, lakeboxCommandRequestSchema, lakeboxServiceLogsRequestSchema, } from "@dbx-tools/shared-lakebox";
7
7
  import { readPackageResource } from "./_package.js";
8
8
  import { stoppedSnapshotServices } from "./_service-snapshots.js";
@@ -19,12 +19,28 @@ const HELPERS = {
19
19
  const CONTROLLER = `${LAKEBOX_RUNTIME_ROOT}/bin/lakebox-service`;
20
20
  const ENTRY_TTL_MS = 5_000;
21
21
  const SETUP_TIMEOUT_MS = 600_000;
22
+ const SSH_READY_TIMEOUT_MS = 300_000;
23
+ const SSH_READY_RETRY_INITIAL_MS = 1_000;
24
+ const SSH_READY_RETRY_MAX_MS = 10_000;
25
+ const TRANSIENT_SSH_CODES = new Set([
26
+ "ECONNREFUSED",
27
+ "ECONNRESET",
28
+ "EHOSTUNREACH",
29
+ "ENETUNREACH",
30
+ "ETIMEDOUT",
31
+ ]);
22
32
  const METRICS_LEASE_MS = 60_000;
23
33
  const IDLE_CHECK_MS = 30_000;
24
34
  const SSH_KEY_OWNER = "app-service-principal";
25
35
  const LEGACY_NAME = /^dbx-(?!lakebox-)[a-z]+-[a-z]+-[0-9a-f]{8}(?:_uid_[A-Za-z0-9_-]+_exp_[0-9]+)?$/;
26
36
  const LEGACY_SCHEMA_PREFIX = "dbx_tools_databricks_sandbox";
27
37
  const logger = log.logger("appkit-lakebox:runtime");
38
+ /** Whether the platform is running but its SSH gateway is still becoming reachable. */
39
+ function _isTransientSshStartupError(error) {
40
+ return [...errorNodes(error)].some((node) => typeof node === "object" &&
41
+ "code" in node &&
42
+ TRANSIENT_SSH_CODES.has(String(node.code)));
43
+ }
28
44
  /**
29
45
  * Owns the single lazily created Lakebox of one application.
30
46
  *
@@ -437,6 +453,30 @@ export class LakeboxRuntime {
437
453
  }
438
454
  }
439
455
  async connect(entry, signal) {
456
+ const startedAt = Date.now();
457
+ let attempt = 0;
458
+ while (true) {
459
+ try {
460
+ return await this.connectOnce(entry, signal);
461
+ }
462
+ catch (error) {
463
+ attempt += 1;
464
+ if (!_isTransientSshStartupError(error) || Date.now() - startedAt >= SSH_READY_TIMEOUT_MS) {
465
+ throw error;
466
+ }
467
+ const delayMs = Math.min(SSH_READY_RETRY_INITIAL_MS * 2 ** (attempt - 1), SSH_READY_RETRY_MAX_MS);
468
+ logger.info("Lakebox SSH gateway is not ready; retrying", {
469
+ attempt,
470
+ delayMs,
471
+ });
472
+ await this.waitForSshRetry(delayMs, signal);
473
+ }
474
+ }
475
+ }
476
+ waitForSshRetry(delayMs, signal) {
477
+ return sleep(delayMs, signal);
478
+ }
479
+ async connectOnce(entry, signal) {
440
480
  const api = this.client();
441
481
  const scope = await api.workspaceScope();
442
482
  const key = await this.keys.ensureRegistered(api, SSH_KEY_OWNER, signal);
@@ -755,4 +795,4 @@ function shellQuote(value) {
755
795
  export function isLakeboxMissing(error) {
756
796
  return error instanceof LakeboxApiError && error.status === 404;
757
797
  }
758
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFekMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUNMLFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3BCLHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLFVBQVUsR0FDWCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLGFBQWEsR0FHZCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUNMLHlCQUF5QixFQUN6QiwrQkFBK0IsRUFDL0IsMkJBQTJCLEVBQzNCLCtCQUErQixHQVdoQyxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVwRCxPQUFPLEVBQTJCLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFM0YsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQStCLE1BQU0sYUFBYSxDQUFDO0FBQ2hGLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZiw4QkFBOEIsRUFDOUIsWUFBWSxFQUNaLGdCQUFnQixHQUdqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTlELE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFD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QyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQztBQUMvQyxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFjO0lBQzdDLE9BQU8sS0FBSyxZQUFZLGVBQWUsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ0h0dHBIZWFkZXJzIH0gZnJvbSBcIm5vZGU6aHR0cFwiO1xuaW1wb3J0IHsgb25QYXJlbnRUZXJtaW5hdGlvblNpZ25hbCB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7XG4gIFNzaEtleVN0b3JlLFxuICBlbnN1cmVMYWtlYm94UnVubmluZyxcbiAgZW5zdXJlTGFrZWJveFN0b3BwZWQsXG4gIGxha2Vib3hJZGxlVGltZW91dFNlY29uZHMsXG4gIG5vcm1hbGl6ZUxha2Vib3hTdGF0dXMsXG4gIFNzaENvbW1hbmQsXG4gIFNzaFNlc3Npb24sXG59IGZyb20gXCJAZGJ4LXRvb2xzL2xha2Vib3hcIjtcbmltcG9ydCB7XG4gIGlzTGFrZWJveFVuYXZhaWxhYmxlLFxuICBMYWtlYm94QXBpRXJyb3IsXG4gIExha2Vib3hDbGllbnQsXG4gIHR5cGUgTGFrZWJveEF1dGgsXG4gIHR5cGUgTGFrZWJveEVudHJ5LFxufSBmcm9tIFwiQGRieC10b29scy9sYWtlYm94XCI7XG5pbXBvcnQgeyBsb2csIHRvRXJyb3IgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgTEFLRUJPWF9CVUlMVF9JTl9TRVJWSUNFUyxcbiAgbGFrZWJveEJ1aWx0SW5TZXJ2aWNlTmFtZVNjaGVtYSxcbiAgbGFrZWJveENvbW1hbmRSZXF1ZXN0U2NoZW1hLFxuICBsYWtlYm94U2VydmljZUxvZ3NSZXF1ZXN0U2NoZW1hLFxuICB0eXBlIENyZWF0ZUxha2Vib3hTZXJ2aWNlUmVxdWVzdCxcbiAgdHlwZSBMYWtlYm94QnVpbHRJblNlcnZpY2VOYW1lLFxuICB0eXBlIExha2Vib3hDb21tYW5kUmVxdWVzdCxcbiAgdHlwZSBMYWtlYm94TWV0cmljc1Jlc3BvbnNlLFxuICB0eXBlIExha2Vib3hNZXRyaWNzU25hcHNob3QsXG4gIHR5cGUgTGFrZWJveFNlcnZpY2UsXG4gIHR5cGUgTGFrZWJveFNlcnZpY2VMb2dzUmVxdWVzdCxcbiAgdHlwZSBMYWtlYm94U3RhdHVzLFxuICB0eXBlIExha2Vib3hTdW1tYXJ5LFxuICB0eXBlIExha2Vib3hVc2VyLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbGFrZWJveFwiO1xuaW1wb3J0IHsgcmVhZFBhY2thZ2VSZXNvdXJjZSB9IGZyb20gXCIuL19wYWNrYWdlLnRzXCI7XG5pbXBvcnQgeyBMYWtlYm94UmVzb3VyY2VSZWdpc3RyeSB9IGZyb20gXCIuL19yZXNvdXJjZS1yZWdpc3RyeS50c1wiO1xuaW1wb3J0IHsgTGFrZWJveFNlcnZpY2VTbmFwc2hvdHMsIHN0b3BwZWRTbmFwc2hvdFNlcnZpY2VzIH0gZnJvbSBcIi4vX3NlcnZpY2Utc25hcHNob3RzLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkTGFrZWJveFBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgTGFrZWJveE1ldHJpY3MgfSBmcm9tIFwiLi9tZXRyaWNzLnRzXCI7XG5pbXBvcnQgeyBMYWtlYm94Um91dGVSZWdpc3RyeSwgdHlwZSBMYWtlYm94Um91dGVSZXNvbHV0aW9uIH0gZnJvbSBcIi4vcm91dGVzLnRzXCI7XG5pbXBvcnQge1xuICBidWlsdEluRGVmaW5pdGlvbixcbiAgaWRsZUJ1aWx0SW5TZXJ2aWNlLFxuICBpbWFnZURlZmluaXRpb24sXG4gIExha2Vib3hDb250cm9sbGVyU2VydmljZVNjaGVtYSxcbiAgc2VydmljZVJvdXRlLFxuICB0b0xha2Vib3hTZXJ2aWNlLFxuICB0eXBlIExha2Vib3hDb250cm9sbGVyRGVmaW5pdGlvbixcbiAgdHlwZSBMYWtlYm94Q29udHJvbGxlclNlcnZpY2UsXG59IGZyb20gXCIuL3NlcnZpY2VzLnRzXCI7XG5pbXBvcnQgeyBMQUtFQk9YX1JVTlRJTUVfUk9PVCwgbGFrZWJveFVzZXIgfSBmcm9tIFwiLi91c2VyLnRzXCI7XG5cbmNvbnN0IEFETUlOX1NDUklQVCA9IHJlYWRQYWNrYWdlUmVzb3VyY2UoXCJzY3JpcHRzXCIsIFwibGFrZWJveC1hZG1pbi5zaFwiKTtcbmNvbnN0IEhFTFBFUlMgPSB7XG4gIFwibGFrZWJveC1zZXJ2aWNlXCI6IHJlYWRQYWNrYWdlUmVzb3VyY2UoXCJzY3JpcHRzXCIsIFwibGFrZWJveC1zZXJ2aWNlLnB5XCIpLFxuICBcImRlc2t0b3Atc2Vzc2lvblwiOiByZWFkUGFja2FnZVJlc291cmNlKFwic2NyaXB0c1wiLCBcImRlc2t0b3Atc2Vzc2lvbi5zaFwiKSxcbiAgXCJkZXNrdG9wLXByZXJlcXVpc2l0ZXNcIjogcmVhZFBhY2thZ2VSZXNvdXJjZShcInNjcmlwdHNcIiwgXCJkZXNrdG9wLXByZXJlcXVpc2l0ZXMuc2hcIiksXG59IGFzIGNvbnN0O1xuY29uc3QgQ09OVFJPTExFUiA9IGAke0xBS0VCT1hfUlVOVElNRV9ST09UfS9iaW4vbGFrZWJveC1zZXJ2aWNlYDtcbmNvbnN0IEVOVFJZX1RUTF9NUyA9IDVfMDAwO1xuY29uc3QgU0VUVVBfVElNRU9VVF9NUyA9IDYwMF8wMDA7XG5jb25zdCBNRVRSSUNTX0xFQVNFX01TID0gNjBfMDAwO1xuY29uc3QgSURMRV9DSEVDS19NUyA9IDMwXzAwMDtcbmNvbnN0IFNTSF9LRVlfT1dORVIgPSBcImFwcC1zZXJ2aWNlLXByaW5jaXBhbFwiO1xuY29uc3QgTEVHQUNZX05BTUUgPVxuICAvXmRieC0oPyFsYWtlYm94LSlbYS16XSstW2Etel0rLVswLTlhLWZdezh9KD86X3VpZF9bQS1aYS16MC05Xy1dK19leHBfWzAtOV0rKT8kLztcbmNvbnN0IExFR0FDWV9TQ0hFTUFfUFJFRklYID0gXCJkYnhfdG9vbHNfZGF0YWJyaWNrc19zYW5kYm94XCI7XG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0LWxha2Vib3g6cnVudGltZVwiKTtcblxuLyoqIFJlc29sdmVzIHRoZSBhdXRoZW50aWNhdGVkIGlkZW50aXR5IGZvciByYXcgcmVxdWVzdCBoZWFkZXJzLiAqL1xuZXhwb3J0IHR5cGUgTGFrZWJveElkZW50aXR5UmVzb2x2ZXIgPSAoaGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4vKiogTWluaW1hbCBMYWtlYmFzZSBwb29sIHVzZWQgdG8gZHJvcCBsZWdhY3kgb3duZXJzaGlwIHNjaGVtYXMuICovXG5leHBvcnQgaW50ZXJmYWNlIExha2Vib3hMZWdhY3lQb29sIHtcbiAgcXVlcnkoc3FsOiBzdHJpbmcsIHZhbHVlcz86IHVua25vd25bXSk6IFByb21pc2U8eyByb3dzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfT47XG59XG5cbmludGVyZmFjZSBCb290IHtcbiAga2V5OiBzdHJpbmc7XG4gIGVudHJ5OiBMYWtlYm94RW50cnk7XG4gIHNlc3Npb246IFNzaFNlc3Npb247XG4gIHVzZXJzOiBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PjtcbiAgc2VydmljZXM6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIExha2Vib3hDb250cm9sbGVyU2VydmljZT4+O1xuICBzdGFydGluZzogTWFwPHN0cmluZywgUHJvbWlzZTxMYWtlYm94U2VydmljZT4+O1xuICBkZXNrdG9wPzogUHJvbWlzZTx2b2lkPjtcbn1cblxuaW50ZXJmYWNlIFNlcnZpY2VMaXN0aW5nIHtcbiAgc2VydmljZXM6IExha2Vib3hTZXJ2aWNlW107XG4gIHN0YWxlOiBib29sZWFuO1xuICBvYnNlcnZlZEF0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE93bnMgdGhlIHNpbmdsZSBsYXppbHkgY3JlYXRlZCBMYWtlYm94IG9mIG9uZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBFdmVyeSBEYXRhYnJpY2tzIExha2Vib3ggUkVTVCBjYWxsIHVzZXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbCBzdXBwbGllZFxuICogdGhyb3VnaCB7QGxpbmsgaW5pdGlhbGl6ZX07IHJlcXVlc3QgaWRlbnRpdHkgb25seSBzZWxlY3RzIHRoZSBpbnRlcm5hbCBMaW51eFxuICogYWNjb3VudC4gRWFjaCBhdXRoZW50aWNhdGVkIGlkZW50aXR5IG1hcHMgdGhyb3VnaCBvbmUgRk5WLTFhIGhhc2ggdG8gYSBsb2NrZWRcbiAqIGFjY291bnQsIHBlcnNpc3RlbnQgaG9tZSwgcm91dGUgc2VnbWVudCwgYW5kIHNlcnZpY2UgcG9ydHMuIExpZmVjeWNsZSBhbmRcbiAqIHBlci1ib290IGJvb3RzdHJhcCBhcmUgc2VyaWFsaXplZCBpbi1wcm9jZXNzOyB0aGUgcGVyc2lzdGVudCByZXNvdXJjZVxuICogcmVnaXN0cnkgc2VyaWFsaXplcyBmaXJzdCBjcmVhdGlvbiBhY3Jvc3MgcmVwbGljYXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYWtlYm94UnVudGltZSB7XG4gIHJlYWRvbmx5IHJvdXRlczogTGFrZWJveFJvdXRlUmVnaXN0cnk7XG4gIHJlYWRvbmx5IG1ldHJpY3M6IExha2Vib3hNZXRyaWNzO1xuICBwcml2YXRlIHJlYWRvbmx5IGtleXM6IFNzaEtleVN0b3JlO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3BQYXJlbnRUZXJtaW5hdGlvblNpZ25hbDogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBzaHV0ZG93bkNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIHByaXZhdGUgYXBpPzogTGFrZWJveENsaWVudDtcbiAgcHJpdmF0ZSBpZGVudGl0eTogTGFrZWJveElkZW50aXR5UmVzb2x2ZXIgPSAoKSA9PiB1bmRlZmluZWQ7XG4gIC8qKiBJbi1tZW1vcnkgaWRlbnRpdGllcyBvZiByb3V0ZWQgdXNlcnM7IG5ldmVyIHBlcnNpc3RlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZWRJZGVudGl0aWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBjYWNoZWQ/OiB7IGVudHJ5PzogTGFrZWJveEVudHJ5OyBhdDogbnVtYmVyIH07XG4gIHByaXZhdGUgYm9vdD86IEJvb3Q7XG4gIC8qKiBMYXN0IGJvb3QgdGhhdCBjb21wbGV0ZWQgcnVudGltZSBib290c3RyYXAgYW5kIHByb2R1Y2VkIGEgbWV0cmljcyBzYW1wbGUuICovXG4gIHByaXZhdGUgcmVhZHlCb290S2V5Pzogc3RyaW5nO1xuICBwcml2YXRlIGNvbnZlcmdpbmc/OiBQcm9taXNlPEJvb3Q+O1xuICBwcml2YXRlIHdha2luZz86IFByb21pc2U8dW5rbm93bj47XG4gIHByaXZhdGUgbWV0cmljc0xlYXNlPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgaWRsZVRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xuICBwcml2YXRlIGxhc3RBY3Rpdml0eSA9IERhdGUubm93KCk7XG4gIHByaXZhdGUgYWN0aXZlQ29tbWFuZHMgPSAwO1xuICAvKiogTGFzdCBzZXJ2aWNlIHN0YXRlcyBwZXIgdXNlciBoYXNoLCBrZXB0IGFmdGVyIGFuIGlkbGUgc2Vzc2lvbiByZWxlYXNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGxhc3RTZXJ2aWNlcyA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBMYWtlYm94Q29udHJvbGxlclNlcnZpY2U+PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxhc3RTZXJ2aWNlc09ic2VydmVkQXQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIHJlc291cmNlUmVnaXN0cnk/OiBMYWtlYm94UmVzb3VyY2VSZWdpc3RyeTtcbiAgcHJpdmF0ZSBzZXJ2aWNlU25hcHNob3RzPzogTGFrZWJveFNlcnZpY2VTbmFwc2hvdHM7XG4gIHByaXZhdGUgY2xvc2luZz86IFByb21pc2U8dm9pZD47XG5cbiAgLyoqIENyZWF0ZXMgYSBydW50aW1lIGZyb20gcmVzb2x2ZWQgcGx1Z2luIGNvbmZpZ3VyYXRpb24uICovXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZzogUmVzb2x2ZWRMYWtlYm94UGx1Z2luQ29uZmlnKSB7XG4gICAgdGhpcy5rZXlzID0gbmV3IFNzaEtleVN0b3JlKGNvbmZpZy5rZXlEaXJlY3RvcnkpO1xuICAgIHRoaXMucm91dGVzID0gbmV3IExha2Vib3hSb3V0ZVJlZ2lzdHJ5KGNvbmZpZy5yb3V0ZVByZWZpeCwge1xuICAgICAgdXNlcjogKGhlYWRlcnMpID0+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLmlkZW50aXR5KGhlYWRlcnMpO1xuICAgICAgICBpZiAoIWlkZW50aXR5KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICAgICAgdGhpcy5yb3V0ZWRJZGVudGl0aWVzLnNldCh1c2VyLmhhc2gsIGlkZW50aXR5KTtcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogKHVzZXIsIHNlcnZpY2UpID0+IHRoaXMucmVzb2x2ZVJvdXRlKHVzZXIsIHNlcnZpY2UpLFxuICAgICAgdW5hdmFpbGFibGU6ICh1c2VyLCBzZXJ2aWNlKSA9PiB0aGlzLm1hcmtVbmF2YWlsYWJsZSh1c2VyLCBzZXJ2aWNlKSxcbiAgICB9KTtcbiAgICB0aGlzLm1ldHJpY3MgPSBuZXcgTGFrZWJveE1ldHJpY3MoXG4gICAgICAoc2lnbmFsKSA9PiB0aGlzLnJlYWRNZXRyaWNzKHNpZ25hbCksXG4gICAgICBjb25maWcubWV0cmljc0ludGVydmFsU2Vjb25kcyAqIDFfMDAwLFxuICAgICk7XG4gICAgdGhpcy5zdG9wUGFyZW50VGVybWluYXRpb25TaWduYWwgPSBvblBhcmVudFRlcm1pbmF0aW9uU2lnbmFsKCgpID0+IHRoaXMucm91dGVzLmJlZ2luU2h1dGRvd24oKSk7XG4gIH1cblxuICAvKipcbiAgICogU3VwcGxpZXMgYXBwIHNlcnZpY2UtcHJpbmNpcGFsIGNyZWRlbnRpYWxzIGFuZCB0aGUgcmVxdWVzdCBpZGVudGl0eVxuICAgKiByZXNvbHZlciB1c2VkIGJ5IHJvdXRlcy5cbiAgICovXG4gIGluaXRpYWxpemUoXG4gICAgYXV0aDogTGFrZWJveEF1dGgsXG4gICAgaWRlbnRpdHk/OiBMYWtlYm94SWRlbnRpdHlSZXNvbHZlcixcbiAgICBzZXJ2aWNlU25hcHNob3RzPzogTGFrZWJveFNlcnZpY2VTbmFwc2hvdHMsXG4gICAgcmVzb3VyY2VSZWdpc3RyeT86IExha2Vib3hSZXNvdXJjZVJlZ2lzdHJ5LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmFwaSA9IG5ldyBMYWtlYm94Q2xpZW50KGF1dGgpO1xuICAgIGlmIChpZGVudGl0eSkgdGhpcy5pZGVudGl0eSA9IGlkZW50aXR5O1xuICAgIGlmIChzZXJ2aWNlU25hcHNob3RzKSB0aGlzLnNlcnZpY2VTbmFwc2hvdHMgPSBzZXJ2aWNlU25hcHNob3RzO1xuICAgIGlmIChyZXNvdXJjZVJlZ2lzdHJ5KSB0aGlzLnJlc291cmNlUmVnaXN0cnkgPSByZXNvdXJjZVJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqIERlcml2ZXMgdGhlIExha2Vib3ggYWNjb3VudCBmb3Igb25lIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkuICovXG4gIHVzZXIoaWRlbnRpdHk6IHN0cmluZyk6IExha2Vib3hVc2VyIHtcbiAgICByZXR1cm4gbGFrZWJveFVzZXIoaWRlbnRpdHksIHRoaXMuY29uZmlnLnJvdXRlUHJlZml4KTtcbiAgfVxuXG4gIC8qKiBTdW1tYXJpemVzIHRoZSBhcHAgTGFrZWJveCBmb3Igb25lIHVzZXIgd2l0aG91dCBjcmVhdGluZyBpdC4gKi9cbiAgYXN5bmMgc3VtbWFyeShpZGVudGl0eTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TGFrZWJveFN1bW1hcnk+IHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICBjb25zdCBiYXNlID0geyBhdXRvOiB0aGlzLmNvbmZpZy5hdXRvLCBuYW1lOiBcIkxha2Vib3hcIiwgdXNlciB9O1xuICAgIGxldCBlbnRyeTogTGFrZWJveEVudHJ5IHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBlbnRyeSA9IGF3YWl0IHRoaXMuZW50cnkoc2lnbmFsLCB0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzTGFrZWJveFVuYXZhaWxhYmxlKGVycm9yKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgc3VwcG9ydGVkOiBmYWxzZSxcbiAgICAgICAgICBzdGF0dXM6IFwibWlzc2luZ1wiLFxuICAgICAgICAgIHNlcnZpY2VzOiBbXSxcbiAgICAgICAgICBzZXJ2aWNlc1N0YWxlOiBmYWxzZSxcbiAgICAgICAgICBjYW5TdGFydDogZmFsc2UsXG4gICAgICAgICAgY2FuU3RvcDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgY29uc3QgcGxhdGZvcm1TdGF0dXM6IExha2Vib3hTdGF0dXMgPSBlbnRyeSA/IG5vcm1hbGl6ZUxha2Vib3hTdGF0dXMoZW50cnkuc3RhdHVzKSA6IFwibWlzc2luZ1wiO1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMucHJvZHVjdFN0YXR1cyhlbnRyeSwgcGxhdGZvcm1TdGF0dXMpO1xuICAgIGlmIChlbnRyeSAmJiBwbGF0Zm9ybVN0YXR1cyA9PT0gXCJydW5uaW5nXCIgJiYgc3RhdHVzID09PSBcInN0YXJ0aW5nXCIpIHtcbiAgICAgIHRoaXMud2FrZSgoKSA9PiB0aGlzLnJlYWR5KCkpO1xuICAgIH1cbiAgICBjb25zdCBsaXN0aW5nID0gYXdhaXQgdGhpcy5zZXJ2aWNlTGlzdGluZyhpZGVudGl0eSwgdXNlciwgZW50cnksIHN0YXR1cywgc2lnbmFsKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uYmFzZSxcbiAgICAgIHN1cHBvcnRlZDogdHJ1ZSxcbiAgICAgIHN0YXR1cyxcbiAgICAgIC4uLihlbnRyeSA/IHsgaWQ6IGVudHJ5LnNhbmRib3hJZCB9IDoge30pLFxuICAgICAgLi4uKGxha2Vib3hJZGxlVGltZW91dFNlY29uZHMoZW50cnk/LmlkbGVUaW1lb3V0KSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyBpZGxlVGltZW91dFNlY29uZHM6IGxha2Vib3hJZGxlVGltZW91dFNlY29uZHMoZW50cnk/LmlkbGVUaW1lb3V0KSB9XG4gICAgICAgIDoge30pLFxuICAgICAgc2VydmljZXM6IGxpc3Rpbmcuc2VydmljZXMsXG4gICAgICBzZXJ2aWNlc1N0YWxlOiBsaXN0aW5nLnN0YWxlLFxuICAgICAgLi4uKGxpc3Rpbmcub2JzZXJ2ZWRBdCA/IHsgc2VydmljZXNPYnNlcnZlZEF0OiBsaXN0aW5nLm9ic2VydmVkQXQgfSA6IHt9KSxcbiAgICAgIGNhblN0YXJ0OiBzdGF0dXMgIT09IFwicnVubmluZ1wiICYmIHN0YXR1cyAhPT0gXCJzdGFydGluZ1wiLFxuICAgICAgY2FuU3RvcDogc3RhdHVzID09PSBcInJ1bm5pbmdcIiB8fCBzdGF0dXMgPT09IFwic3RhcnRpbmdcIixcbiAgICB9O1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIExha2Vib3ggd2hlbiBuZWVkZWQsIHN0YXJ0cyBpdCwgYW5kIHJlc3RvcmVzIHNhdmVkIHNlcnZpY2VzLiAqL1xuICBhc3luYyBzdGFydChzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucmVhZHkoc2lnbmFsLCB0cnVlKTtcbiAgfVxuXG4gIC8qKiBTdG9wcyB0aGUgc2hhcmVkIExha2Vib3ggZm9yIGV2ZXJ5IHVzZXIuIEZpbGVzIGFuZCBzYXZlZCBzZXJ2aWNlcyBwZXJzaXN0LiAqL1xuICBhc3luYyBzdG9wKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmVudHJ5KHNpZ25hbCwgdHJ1ZSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuZGlzY2FyZEJvb3QoKTtcbiAgICBhd2FpdCBlbnN1cmVMYWtlYm94U3RvcHBlZCh0aGlzLmNsaWVudCgpLCBlbnRyeSwgc2lnbmFsKTtcbiAgICB0aGlzLmNhY2hlZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBQZXJtYW5lbnRseSBkZWxldGVzIHRoZSBtYW5hZ2VkIExha2Vib3ggYW5kIGV2ZXJ5IHVzZXIncyBmaWxlcy4gKi9cbiAgYXN5bmMgZGVsZXRlKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmVudHJ5KHNpZ25hbCwgdHJ1ZSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIGZhbHNlO1xuICAgIGF3YWl0IHRoaXMuZGlzY2FyZEJvb3QoKTtcbiAgICBhd2FpdCB0aGlzLmNsaWVudCgpLmRlbGV0ZShlbnRyeS5zYW5kYm94SWQsIHNpZ25hbCk7XG4gICAgYXdhaXQgdGhpcy5yZXNvdXJjZXMoKS5jbGVhcih0aGlzLmNsaWVudCgpKTtcbiAgICB0aGlzLnJlYWR5Qm9vdEtleSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNhY2hlZCA9IHsgYXQ6IERhdGUubm93KCkgfTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG9uZSBjb21tYW5kIGFzIHRoZSB1c2VyJ3MgYWNjb3VudCwgY3JlYXRpbmcgb3Igc3RhcnRpbmcgdGhlIExha2Vib3hcbiAgICogd2hlbiBgYXV0b2AgaXMgZW5hYmxlZC5cbiAgICovXG4gIGV4ZWN1dGUoaWRlbnRpdHk6IHN0cmluZywgaW5wdXQ6IExha2Vib3hDb21tYW5kUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBTc2hDb21tYW5kIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbGFrZWJveENvbW1hbmRSZXF1ZXN0U2NoZW1hLnBhcnNlKGlucHV0KTtcbiAgICBjb25zdCB0aW1lb3V0TXMgPSByZXF1ZXN0LnRpbWVvdXRNcyA/PyB0aGlzLmNvbmZpZy5jb21tYW5kVGltZW91dE1zO1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXIoaWRlbnRpdHkpO1xuICAgIHJldHVybiBuZXcgU3NoQ29tbWFuZChcbiAgICAgIHJlcXVlc3QuY29tbWFuZCxcbiAgICAgIHJlcXVlc3QuYXJncyxcbiAgICAgIHsgdGltZW91dE1zLCBzaWduYWwgfSxcbiAgICAgIGFzeW5jIChleGVjdXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgYm9vdCA9IGF3YWl0IHRoaXMucmVhZHlVc2VyKHVzZXIsIGlkZW50aXR5LCBleGVjdXRpb24uc2lnbmFsKTtcbiAgICAgICAgdGhpcy5hY3RpdmVDb21tYW5kcyArPSAxO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRpb24uZm9sbG93KFxuICAgICAgICAgICAgYm9vdC5zZXNzaW9uLmV4ZWN1dGUocmVxdWVzdC5jb21tYW5kLCByZXF1ZXN0LmFyZ3MsIHtcbiAgICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICAgICAgLi4uKHJlcXVlc3QuY3dkID8geyBjd2Q6IHJlcXVlc3QuY3dkIH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLihyZXF1ZXN0LmVudiA/IHsgZW52OiByZXF1ZXN0LmVudiB9IDoge30pLFxuICAgICAgICAgICAgICB0aW1lb3V0TXMsXG4gICAgICAgICAgICAgIHNpZ25hbDogZXhlY3V0aW9uLnNpZ25hbCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVDb21tYW5kcyAtPSAxO1xuICAgICAgICAgIHRoaXMudG91Y2goKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqIExpc3RzIHRoZSB1c2VyJ3Mgc2VydmljZXMsIGluY2x1ZGluZyBpZGxlIGJ1aWx0LWlucy4gTmV2ZXIgY3JlYXRlcyB0aGUgTGFrZWJveC4gKi9cbiAgYXN5bmMgbGlzdFNlcnZpY2VzKGlkZW50aXR5OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxMYWtlYm94U2VydmljZVtdPiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlcihpZGVudGl0eSk7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmVudHJ5KHNpZ25hbCk7XG4gICAgY29uc3Qgc3RhdHVzOiBMYWtlYm94U3RhdHVzID0gZW50cnkgPyBub3JtYWxpemVMYWtlYm94U3RhdHVzKGVudHJ5LnN0YXR1cykgOiBcIm1pc3NpbmdcIjtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc2VydmljZUxpc3RpbmcoaWRlbnRpdHksIHVzZXIsIGVudHJ5LCBzdGF0dXMsIHNpZ25hbCkpLnNlcnZpY2VzO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgb3IgcmVwbGFjZXMgb25lIGltYWdlIHNlcnZpY2UgYW5kIHdhaXRzIHVudGlsIGl0IGlzIHJlYWR5IG9yIGZhaWxlZC4gKi9cbiAgYXN5bmMgY3JlYXRlU2VydmljZShcbiAgICBpZGVudGl0eTogc3RyaW5nLFxuICAgIGlucHV0OiBDcmVhdGVMYWtlYm94U2VydmljZVJlcXVlc3QsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TGFrZWJveFNlcnZpY2U+IHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICBjb25zdCBkZWZpbml0aW9uID0gaW1hZ2VEZWZpbml0aW9uKGlucHV0LCB1c2VyKTtcbiAgICBjb25zdCBib290ID0gYXdhaXQgdGhpcy5yZWFkeVVzZXIodXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgYXdhaXQgdGhpcy5jb250cm9sbGVyKGJvb3QsIHVzZXIsIFwicHV0XCIsIFtlbmNvZGUoZGVmaW5pdGlvbildLCBzaWduYWwpO1xuICAgIHJldHVybiB0aGlzLnJ1blNlcnZpY2UoYm9vdCwgdXNlciwgZGVmaW5pdGlvbiwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBTdGFydHMgYSBzYXZlZCBzZXJ2aWNlIG9yIGEgYnVpbHQtaW4gYW5kIHdhaXRzIHVudGlsIGl0IGlzIHJlYWR5IG9yIGZhaWxlZC4gKi9cbiAgYXN5bmMgc3RhcnRTZXJ2aWNlKFxuICAgIGlkZW50aXR5OiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPExha2Vib3hTZXJ2aWNlPiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlcihpZGVudGl0eSk7XG4gICAgY29uc3QgYm9vdCA9IGF3YWl0IHRoaXMucmVhZHlVc2VyKHVzZXIsIGlkZW50aXR5LCBzaWduYWwpO1xuICAgIGNvbnN0IGJ1aWx0SW4gPSBsYWtlYm94QnVpbHRJblNlcnZpY2VOYW1lU2NoZW1hLnNhZmVQYXJzZShuYW1lKTtcbiAgICBpZiAoYnVpbHRJbi5zdWNjZXNzKSB7XG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gYnVpbHRJbkRlZmluaXRpb24oYnVpbHRJbi5kYXRhLCB1c2VyKTtcbiAgICAgIGF3YWl0IHRoaXMuY29udHJvbGxlcihib290LCB1c2VyLCBcInB1dFwiLCBbZW5jb2RlKGRlZmluaXRpb24pXSwgc2lnbmFsKTtcbiAgICAgIHJldHVybiB0aGlzLnJ1blNlcnZpY2UoYm9vdCwgdXNlciwgZGVmaW5pdGlvbiwgc2lnbmFsKTtcbiAgICB9XG4gICAgY29uc3Qgc2F2ZWQgPSAoYXdhaXQgdGhpcy5yZWZyZXNoU2VydmljZXMoYm9vdCwgdXNlciwgaWRlbnRpdHksIHNpZ25hbCkpLmdldChuYW1lKTtcbiAgICBpZiAoIXNhdmVkKSB0aHJvdyBuZXcgRXJyb3IoYExha2Vib3ggc2VydmljZSAke25hbWV9IGRvZXMgbm90IGV4aXN0YCk7XG4gICAgcmV0dXJuIHRoaXMucnVuU2VydmljZShib290LCB1c2VyLCBzYXZlZC5kZWZpbml0aW9uLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIFN0b3BzIG9uZSBydW5uaW5nIHNlcnZpY2Ugd2l0aG91dCByZW1vdmluZyBpdHMgZGVmaW5pdGlvbi4gKi9cbiAgYXN5bmMgc3RvcFNlcnZpY2UoaWRlbnRpdHk6IHN0cmluZywgbmFtZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TGFrZWJveFNlcnZpY2U+IHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICBjb25zdCBib290ID0gYXdhaXQgdGhpcy5yZWFkeVVzZXIodXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgY29uc3Qgc3RvcHBlZCA9IExha2Vib3hDb250cm9sbGVyU2VydmljZVNjaGVtYS5wYXJzZShcbiAgICAgIGF3YWl0IHRoaXMuY29udHJvbGxlcihib290LCB1c2VyLCBcInN0b3BcIiwgW25hbWVdLCBzaWduYWwpLFxuICAgICk7XG4gICAgdGhpcy5jYWNoZVNlcnZpY2UoYm9vdCwgdXNlciwgc3RvcHBlZCk7XG4gICAgcmV0dXJuIHRvTGFrZWJveFNlcnZpY2Uoc3RvcHBlZCwgdXNlciwgdGhpcy5jb25maWcucm91dGVQcmVmaXgpO1xuICB9XG5cbiAgLyoqIFN0b3BzIGFuZCBkZWxldGVzIG9uZSBzYXZlZCBzZXJ2aWNlLiBNb3VudGVkIGhvbWUgZGlyZWN0b3JpZXMgYXJlIHByZXNlcnZlZC4gKi9cbiAgYXN5bmMgcmVtb3ZlU2VydmljZShpZGVudGl0eTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlcihpZGVudGl0eSk7XG4gICAgY29uc3QgYm9vdCA9IGF3YWl0IHRoaXMucmVhZHlVc2VyKHVzZXIsIGlkZW50aXR5LCBzaWduYWwpO1xuICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCB0aGlzLmNvbnRyb2xsZXIoYm9vdCwgdXNlciwgXCJyZW1vdmVcIiwgW25hbWVdLCBzaWduYWwpKSBhcyB7XG4gICAgICByZW1vdmVkPzogYm9vbGVhbjtcbiAgICB9O1xuICAgIGlmIChyZXN1bHQucmVtb3ZlZCA9PT0gdHJ1ZSkgYXdhaXQgdGhpcy5yZWZyZXNoU2VydmljZXMoYm9vdCwgdXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgcmV0dXJuIHJlc3VsdC5yZW1vdmVkID09PSB0cnVlO1xuICB9XG5cbiAgLyoqIFJlYWRzIGEgYm91bmRlZCB0YWlsIG9mIG9uZSBzZXJ2aWNlIGxvZy4gKi9cbiAgYXN5bmMgc2VydmljZUxvZ3MoXG4gICAgaWRlbnRpdHk6IHN0cmluZyxcbiAgICBpbnB1dDogTGFrZWJveFNlcnZpY2VMb2dzUmVxdWVzdCxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx7IGxvZzogc3RyaW5nIH0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbGFrZWJveFNlcnZpY2VMb2dzUmVxdWVzdFNjaGVtYS5wYXJzZShpbnB1dCk7XG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlcihpZGVudGl0eSk7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmVudHJ5KHNpZ25hbCk7XG4gICAgaWYgKCFlbnRyeSB8fCBub3JtYWxpemVMYWtlYm94U3RhdHVzKGVudHJ5LnN0YXR1cykgIT09IFwicnVubmluZ1wiKSByZXR1cm4geyBsb2c6IFwiXCIgfTtcbiAgICBjb25zdCBib290ID0gYXdhaXQgdGhpcy5yZWFkeVVzZXIodXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IHRoaXMuY29udHJvbGxlcihcbiAgICAgIGJvb3QsXG4gICAgICB1c2VyLFxuICAgICAgXCJsb2dzXCIsXG4gICAgICBbcmVxdWVzdC5uYW1lLCBTdHJpbmcocmVxdWVzdC5tYXhMaW5lcyksIFN0cmluZyhyZXF1ZXN0Lm1heENoYXJzKV0sXG4gICAgICBzaWduYWwsXG4gICAgKSkgYXMgeyBsb2c/OiBzdHJpbmcgfTtcbiAgICByZXR1cm4geyBsb2c6IHJlc3VsdC5sb2cgPz8gXCJcIiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcmVjZW50IG1ldHJpY3MgYW5kIGtlZXBzIHNhbXBsaW5nIGZvciBvbmUgbGVhc2UgaW50ZXJ2YWwuIFNhbXBsaW5nXG4gICAqIHJ1bnMgb25seSB3aGlsZSB0aGUgTGFrZWJveCBydW5zIGFuZCBhIGNhbGxlciBpcyB3YXRjaGluZywgc28gbWV0cmljcyBuZXZlclxuICAgKiBrZWVwIGFuIG90aGVyd2lzZSBpZGxlIExha2Vib3ggYXdha2UuXG4gICAqL1xuICBhc3luYyBtZXRyaWNzUmVzcG9uc2Uoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExha2Vib3hNZXRyaWNzUmVzcG9uc2U+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuZW50cnkoc2lnbmFsKTtcbiAgICBjb25zdCBwbGF0Zm9ybVN0YXR1czogTGFrZWJveFN0YXR1cyA9IGVudHJ5ID8gbm9ybWFsaXplTGFrZWJveFN0YXR1cyhlbnRyeS5zdGF0dXMpIDogXCJtaXNzaW5nXCI7XG4gICAgaWYgKHBsYXRmb3JtU3RhdHVzICE9PSBcInJ1bm5pbmdcIikge1xuICAgICAgdGhpcy5tZXRyaWNzLnN0b3AoKTtcbiAgICAgIHJldHVybiB7IHN0YXR1czogcGxhdGZvcm1TdGF0dXMsIHNlcmllczogW10gfTtcbiAgICB9XG4gICAgaWYgKCFlbnRyeSB8fCAhdGhpcy5ib290IHx8IHRoaXMuYm9vdC5rZXkgIT09IHRoaXMuYm9vdEtleShlbnRyeSkpIHtcbiAgICAgIHRoaXMubWV0cmljcy5zdG9wKCk7XG4gICAgICB0aGlzLndha2UoKCkgPT4gdGhpcy5yZWFkeSgpKTtcbiAgICAgIHJldHVybiB7IHN0YXR1czogXCJzdGFydGluZ1wiLCBzZXJpZXM6IFtdIH07XG4gICAgfVxuICAgIHRoaXMubGVhc2VNZXRyaWNzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogdGhpcy5wcm9kdWN0U3RhdHVzKGVudHJ5LCBwbGF0Zm9ybVN0YXR1cyksXG4gICAgICBzZXJpZXM6IFsuLi50aGlzLm1ldHJpY3Muc2VyaWVzKCldLFxuICAgIH07XG4gIH1cblxuICAvKiogU3Vic2NyaWJlcyB0byBtZXRyaWNzIHNuYXBzaG90cyB3aGlsZSB0aGUgTGFrZWJveCBydW5zLiAqL1xuICBzdWJzY3JpYmVNZXRyaWNzKGxpc3RlbmVyOiAoc25hcHNob3Q6IExha2Vib3hNZXRyaWNzU25hcHNob3QpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLm1ldHJpY3Mub24oXCJzbmFwc2hvdFwiLCBsaXN0ZW5lcik7XG4gICAgaWYgKHRoaXMuYm9vdD8ua2V5ID09PSB0aGlzLnJlYWR5Qm9vdEtleSkgdGhpcy5tZXRyaWNzLnN0YXJ0KCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMubWV0cmljcy5vZmYoXCJzbmFwc2hvdFwiLCBsaXN0ZW5lcik7XG4gICAgICB0aGlzLmxlYXNlTWV0cmljcygpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBsZWdhY3kgcGVyLXVzZXIgTGFrZWJveGVzIGFuZCBkcm9wcyBsZWdhY3kgb3duZXJzaGlwIHNjaGVtYXMuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIG1pZ3JhdGlvbjogdGhlIGVhcmxpZXIgb25lLW1hY2hpbmUtcGVyLXVzZXIgbW9kZWwgaXMgcmVtb3ZlZC5cbiAgICogVGhlIG1hbmFnZWQgYXBwIExha2Vib3ggYW5kIExha2Vib3hlcyB3aXRoIG90aGVyIG5hbWVzIGFyZSBuZXZlciB0b3VjaGVkLlxuICAgKi9cbiAgYXN5bmMgY2xlYW51cExlZ2FjeShwb29sPzogTGFrZWJveExlZ2FjeVBvb2wsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmNsaWVudCgpLmxpc3Qoc2lnbmFsKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBlbnRyaWVzXG4gICAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm5hbWUgJiYgTEVHQUNZX05BTUUudGVzdChlbnRyeS5uYW1lKSlcbiAgICAgICAgICAubWFwKGFzeW5jIChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQoKS5kZWxldGUoZW50cnkuc2FuZGJveElkLCBzaWduYWwpO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJkZWxldGVkIGxlZ2FjeSBwZXItdXNlciBMYWtlYm94XCIsIHtcbiAgICAgICAgICAgICAgaWQ6IGVudHJ5LnNhbmRib3hJZCxcbiAgICAgICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0xha2Vib3hVbmF2YWlsYWJsZShlcnJvcikpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJsZWdhY3kgTGFrZWJveCBjbGVhbnVwIGZhaWxlZFwiLCB7IGVycm9yOiB0b0Vycm9yKGVycm9yKSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFwb29sKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNjaGVtYXMgPSBhd2FpdCBwb29sLnF1ZXJ5KFxuICAgICAgICBcIlNFTEVDVCBuc3BuYW1lIEZST00gcGdfbmFtZXNwYWNlIFdIRVJFIG5zcG5hbWUgPSAkMSBPUiBzdGFydHNfd2l0aChuc3BuYW1lLCAkMilcIixcbiAgICAgICAgW0xFR0FDWV9TQ0hFTUFfUFJFRklYLCBgJHtMRUdBQ1lfU0NIRU1BX1BSRUZJWH1fYF0sXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCByb3cgb2Ygc2NoZW1hcy5yb3dzKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IFN0cmluZyhyb3cubnNwbmFtZSk7XG4gICAgICAgIGF3YWl0IHBvb2wucXVlcnkoYERST1AgU0NIRU1BIElGIEVYSVNUUyBcIiR7c2NoZW1hLnJlcGxhY2VBbGwoJ1wiJywgJ1wiXCInKX1cIiBDQVNDQURFYCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiZHJvcHBlZCBsZWdhY3kgTGFrZWJveCBvd25lcnNoaXAgc2NoZW1hXCIsIHsgc2NoZW1hIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybihcImxlZ2FjeSBvd25lcnNoaXAgc2NoZW1hIGNsZWFudXAgZmFpbGVkXCIsIHsgZXJyb3I6IHRvRXJyb3IoZXJyb3IpIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYW5jZWxzIGluLWZsaWdodCB3b3JrIGJlZm9yZSB0ZWFyZG93bi4gKi9cbiAgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaHV0ZG93bkNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHRoaXMuc2h1dGRvd25Db250cm9sbGVyLmFib3J0KCk7XG4gIH1cblxuICAvKiogQ2xvc2VzIHJvdXRlcywgbWV0cmljcywgYW5kIHRoZSBTU0ggc2Vzc2lvbiB3aXRob3V0IGNoYW5naW5nIHRoZSBMYWtlYm94LiAqL1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICAgIHRoaXMucm91dGVzLmJlZ2luU2h1dGRvd24oKTtcbiAgICB0aGlzLmNsb3NpbmcgPz89IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGhpcy5tZXRyaWNzTGVhc2UpIGNsZWFyVGltZW91dCh0aGlzLm1ldHJpY3NMZWFzZSk7XG4gICAgICAgIHRoaXMubWV0cmljcy5zdG9wKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucm91dGVzLmNsb3NlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYm9vdD8uc2Vzc2lvbi5jbG9zZSgpO1xuICAgICAgICB0aGlzLmJvb3QgPSB1bmRlZmluZWQ7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnN0b3BQYXJlbnRUZXJtaW5hdGlvblNpZ25hbCgpO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgcmV0dXJuIHRoaXMuY2xvc2luZztcbiAgfVxuXG4gIHByaXZhdGUgY2xpZW50KCk6IExha2Vib3hDbGllbnQge1xuICAgIGlmICghdGhpcy5hcGkpIHRocm93IG5ldyBFcnJvcihcIlRoZSBMYWtlYm94IHJ1bnRpbWUgaGFzIG5vIGFwcCBzZXJ2aWNlLXByaW5jaXBhbCBjcmVkZW50aWFsc1wiKTtcbiAgICByZXR1cm4gdGhpcy5hcGk7XG4gIH1cblxuICBwcml2YXRlIHJlc291cmNlcygpOiBMYWtlYm94UmVzb3VyY2VSZWdpc3RyeSB7XG4gICAgaWYgKCF0aGlzLnJlc291cmNlUmVnaXN0cnkpIHRocm93IG5ldyBFcnJvcihcIlRoZSBMYWtlYm94IHJ1bnRpbWUgaGFzIG5vIHJlc291cmNlIHJlZ2lzdHJ5XCIpO1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlUmVnaXN0cnk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgbWFuYWdlZCBMYWtlYm94IGVudHJ5LCBjYWNoZWQgYnJpZWZseSB0byBrZWVwIHJvdXRlcyBjaGVhcC4gKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnRyeShzaWduYWw/OiBBYm9ydFNpZ25hbCwgZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8TGFrZWJveEVudHJ5IHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCFmcmVzaCAmJiB0aGlzLmNhY2hlZCAmJiBEYXRlLm5vdygpIC0gdGhpcy5jYWNoZWQuYXQgPCBFTlRSWV9UVExfTVMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlZC5lbnRyeTtcbiAgICB9XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLnJlc291cmNlcygpLnJlYWQodGhpcy5jbGllbnQoKSwgc2lnbmFsKTtcbiAgICB0aGlzLmNhY2hlZCA9IHsgLi4uKGVudHJ5ID8geyBlbnRyeSB9IDoge30pLCBhdDogRGF0ZS5ub3coKSB9O1xuICAgIGlmICghZW50cnkgfHwgbm9ybWFsaXplTGFrZWJveFN0YXR1cyhlbnRyeS5zdGF0dXMpICE9PSBcInJ1bm5pbmdcIikge1xuICAgICAgdGhpcy5yZWFkeUJvb3RLZXkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmJvb3QgJiYgKCFlbnRyeSB8fCB0aGlzLmJvb3RLZXkoZW50cnkpICE9PSB0aGlzLmJvb3Qua2V5KSkgYXdhaXQgdGhpcy5kaXNjYXJkQm9vdCgpO1xuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIHByaXZhdGUgYm9vdEtleShlbnRyeTogTGFrZWJveEVudHJ5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7ZW50cnkuc2FuZGJveElkfVxcMCR7ZW50cnkubGFzdFN0YXJ0VGltZSA/PyBcIlwifWA7XG4gIH1cblxuICBwcml2YXRlIHByb2R1Y3RTdGF0dXMoZW50cnk6IExha2Vib3hFbnRyeSB8IHVuZGVmaW5lZCwgc3RhdHVzOiBMYWtlYm94U3RhdHVzKTogTGFrZWJveFN0YXR1cyB7XG4gICAgcmV0dXJuIGVudHJ5ICYmIHN0YXR1cyA9PT0gXCJydW5uaW5nXCIgJiYgdGhpcy5yZWFkeUJvb3RLZXkgIT09IHRoaXMuYm9vdEtleShlbnRyeSlcbiAgICAgID8gXCJzdGFydGluZ1wiXG4gICAgICA6IHN0YXR1cztcbiAgfVxuXG4gIC8qKiBTZXJpYWxpemVzIGNyZWF0ZSwgc3RhcnQsIGNvbm5lY3QsIGFuZCBib290c3RyYXAgZm9yIHRoZSBjdXJyZW50IGJvb3QuICovXG4gIHByaXZhdGUgcmVhZHkoc2lnbmFsPzogQWJvcnRTaWduYWwsIGV4cGxpY2l0ID0gZmFsc2UpOiBQcm9taXNlPEJvb3Q+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5ib290O1xuICAgIGlmIChjdXJyZW50ICYmIHRoaXMuY2FjaGVkPy5lbnRyeSAmJiB0aGlzLmJvb3RLZXkodGhpcy5jYWNoZWQuZW50cnkpID09PSBjdXJyZW50LmtleSkge1xuICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmNhY2hlZC5hdCA8IEVOVFJZX1RUTF9NUykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50KTtcbiAgICB9XG4gICAgdGhpcy5jb252ZXJnaW5nID8/PSB0aGlzLmNvbnZlcmdlKHNpZ25hbCwgZXhwbGljaXQpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgdGhpcy5jb252ZXJnaW5nID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmNvbnZlcmdpbmc7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbnZlcmdlKHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsIGV4cGxpY2l0OiBib29sZWFuKTogUHJvbWlzZTxCb290PiB7XG4gICAgY29uc3Qgb3BlcmF0aW9uU2lnbmFsID0gc2lnbmFsXG4gICAgICA/IEFib3J0U2lnbmFsLmFueShbc2lnbmFsLCB0aGlzLnNodXRkb3duQ29udHJvbGxlci5zaWduYWxdKVxuICAgICAgOiB0aGlzLnNodXRkb3duQ29udHJvbGxlci5zaWduYWw7XG4gICAgbGV0IGVudHJ5ID0gYXdhaXQgdGhpcy5lbnRyeShvcGVyYXRpb25TaWduYWwsIHRydWUpO1xuICAgIGlmICghZW50cnkgfHwgbm9ybWFsaXplTGFrZWJveFN0YXR1cyhlbnRyeS5zdGF0dXMpICE9PSBcInJ1bm5pbmdcIikge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5hdXRvICYmICFleHBsaWNpdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYExha2Vib3ggaXMgJHtlbnRyeSA/IGVudHJ5LnN0YXR1cyA6IFwibm90IGNyZWF0ZWRcIn07IHN0YXJ0IGl0IGV4cGxpY2l0bHkgYmVjYXVzZSBhdXRvIGlzIGZhbHNlYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZW50cnkgPz89IGF3YWl0IHRoaXMucmVzb3VyY2VzKCkuZ2V0T3JDcmVhdGUodGhpcy5jbGllbnQoKSwgb3BlcmF0aW9uU2lnbmFsKTtcbiAgICBpZiAobGFrZWJveElkbGVUaW1lb3V0U2Vjb25kcyhlbnRyeS5pZGxlVGltZW91dCkgIT09IHRoaXMuY29uZmlnLmlkbGVUaW1lb3V0U2Vjb25kcykge1xuICAgICAgZW50cnkgPSBhd2FpdCB0aGlzLmNsaWVudCgpLnNldElkbGVUaW1lb3V0KFxuICAgICAgICBlbnRyeS5zYW5kYm94SWQsXG4gICAgICAgIHRoaXMuY29uZmlnLmlkbGVUaW1lb3V0U2Vjb25kcyxcbiAgICAgICAgb3BlcmF0aW9uU2lnbmFsLFxuICAgICAgKTtcbiAgICB9XG4gICAgZW50cnkgPSBhd2FpdCBlbnN1cmVMYWtlYm94UnVubmluZyh0aGlzLmNsaWVudCgpLCBlbnRyeSwgb3BlcmF0aW9uU2lnbmFsKTtcbiAgICB0aGlzLmNhY2hlZCA9IHsgZW50cnksIGF0OiBEYXRlLm5vdygpIH07XG4gICAgY29uc3Qga2V5ID0gdGhpcy5ib290S2V5KGVudHJ5KTtcbiAgICBpZiAodGhpcy5ib290Py5rZXkgPT09IGtleSkgcmV0dXJuIHRoaXMuYm9vdDtcbiAgICBhd2FpdCB0aGlzLmRpc2NhcmRCb290KCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuY29ubmVjdChlbnRyeSwgb3BlcmF0aW9uU2lnbmFsKTtcbiAgICBjb25zdCBib290OiBCb290ID0ge1xuICAgICAga2V5LFxuICAgICAgZW50cnksXG4gICAgICBzZXNzaW9uLFxuICAgICAgdXNlcnM6IG5ldyBNYXAoKSxcbiAgICAgIHNlcnZpY2VzOiBuZXcgTWFwKCksXG4gICAgICBzdGFydGluZzogbmV3IE1hcCgpLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3RvcmVkID0gYXdhaXQgdGhpcy5ib290c3RyYXAoc2Vzc2lvbiwgb3BlcmF0aW9uU2lnbmFsKTtcbiAgICAgIHRoaXMubWV0cmljcy5zdG9wKCk7XG4gICAgICB0aGlzLm1ldHJpY3Muc2VlZCgoYXdhaXQgdGhpcy5hZG1pbihzZXNzaW9uLCBbXCJtZXRyaWNzXCJdLCBvcGVyYXRpb25TaWduYWwpKS5zdGRvdXQpO1xuICAgICAgdGhpcy5ib290ID0gYm9vdDtcbiAgICAgIHRoaXMucmVhZHlCb290S2V5ID0ga2V5O1xuICAgICAgdGhpcy53YXRjaElkbGUoKTtcbiAgICAgIGlmICh0aGlzLm1ldHJpY3MubGlzdGVuZXJDb3VudChcInNuYXBzaG90XCIpID4gMCkgdGhpcy5tZXRyaWNzLnN0YXJ0KCk7XG4gICAgICBmb3IgKGNvbnN0IGhhc2ggb2YgcmVzdG9yZWQpIHZvaWQgdGhpcy5yZXN0b3JlVXNlcihib290LCBoYXNoKTtcbiAgICAgIHJldHVybiBib290O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBzZXNzaW9uLmNsb3NlKCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3QoZW50cnk6IExha2Vib3hFbnRyeSwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8U3NoU2Vzc2lvbj4ge1xuICAgIGNvbnN0IGFwaSA9IHRoaXMuY2xpZW50KCk7XG4gICAgY29uc3Qgc2NvcGUgPSBhd2FpdCBhcGkud29ya3NwYWNlU2NvcGUoKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmtleXMuZW5zdXJlUmVnaXN0ZXJlZChhcGksIFNTSF9LRVlfT1dORVIsIHNpZ25hbCk7XG4gICAgY29uc3QgZ2F0ZXdheUhvc3QgPSBlbnRyeS5nYXRld2F5SG9zdCA/PyBrZXkuZ2F0ZXdheUhvc3Q7XG4gICAgaWYgKCFnYXRld2F5SG9zdCkgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyBMYWtlYm94IGRpZCBub3QgcmV0dXJuIGFuIFNTSCBnYXRld2F5IGhvc3RcIik7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuY29uZmlnLmdhdGV3YXlQb3J0O1xuICAgIGNvbnN0IGtub3duSG9zdCA9IGF3YWl0IHRoaXMua2V5cy5rbm93bkhvc3Qoc2NvcGUsIFNTSF9LRVlfT1dORVIsIGdhdGV3YXlIb3N0LCBwb3J0KTtcbiAgICBjb25zdCBzZXNzaW9uID0gbmV3IFNzaFNlc3Npb24oe1xuICAgICAgaG9zdDogZ2F0ZXdheUhvc3QsXG4gICAgICBwb3J0LFxuICAgICAgdXNlcm5hbWU6IGVudHJ5LnNhbmRib3hJZCxcbiAgICAgIHByaXZhdGVLZXk6IGtleS5wcml2YXRlS2V5LFxuICAgICAgcHJpdmF0ZUtleVBhdGg6IGtleS5wcml2YXRlS2V5UGF0aCxcbiAgICAgIGtub3duSG9zdHNQYXRoOiB0aGlzLmtleXMua25vd25Ib3N0c1BhdGgoc2NvcGUsIFNTSF9LRVlfT1dORVIsIGdhdGV3YXlIb3N0LCBwb3J0KSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0TXM6IHRoaXMuY29uZmlnLmNvbm5lY3RUaW1lb3V0TXMsXG4gICAgICBzc2hUcmFuc3BvcnQ6IHRoaXMuY29uZmlnLnNzaFRyYW5zcG9ydCxcbiAgICAgIHNzaDJQYXRjaDogdGhpcy5jb25maWcuc3NoMlBhdGNoLFxuICAgICAgLi4uKGtub3duSG9zdCA/IHsga25vd25Ib3N0IH0gOiB7fSksXG4gICAgICByZW1lbWJlckhvc3Q6IChmaW5nZXJwcmludCwgaG9zdEtleSkgPT5cbiAgICAgICAgdGhpcy5rZXlzLnJlbWVtYmVySG9zdChzY29wZSwgU1NIX0tFWV9PV05FUiwgZ2F0ZXdheUhvc3QsIHBvcnQsIGZpbmdlcnByaW50LCBob3N0S2V5KSxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2Vzc2lvbi5jb25uZWN0KCk7XG4gICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgc2Vzc2lvbi5jbG9zZSgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJ1bnMgdGhlIGZpeGVkIHByaXZpbGVnZWQgYm9vdHN0cmFwIGFuZCByZXR1cm5zIHRoZSByZXN0b3JlZCB1c2VyIGhhc2hlcy4gKi9cbiAgcHJpdmF0ZSBhc3luYyBib290c3RyYXAoc2Vzc2lvbjogU3NoU2Vzc2lvbiwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBoZWxwZXJzID0gT2JqZWN0LmVudHJpZXMoSEVMUEVSUykubWFwKFxuICAgICAgKFtuYW1lLCBjb250ZW50XSkgPT4gYCR7bmFtZX09JHtCdWZmZXIuZnJvbShjb250ZW50KS50b1N0cmluZyhcImJhc2U2NFwiKX1gLFxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZG1pbihzZXNzaW9uLCBbXCJib290c3RyYXBcIiwgLi4uaGVscGVyc10sIHNpZ25hbCk7XG4gICAgcmV0dXJuIHJlc3VsdC5zdGRvdXRcbiAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5zdGFydHNXaXRoKFwiX19MQUtFQk9YX1VTRVJfXz1cIikpXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKFwiX19MQUtFQk9YX1VTRVJfXz1cIi5sZW5ndGgpLnRyaW0oKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkbWluKFxuICAgIHNlc3Npb246IFNzaFNlc3Npb24sXG4gICAgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8eyBzdGRvdXQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgZW5jb2RlZCA9IEJ1ZmZlci5mcm9tKEFETUlOX1NDUklQVCkudG9TdHJpbmcoXCJiYXNlNjRcIik7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2Vzc2lvbi5leGVjdXRlUHJpdmlsZWdlZChcbiAgICAgIFwic2hcIixcbiAgICAgIFtcIi1jXCIsIGBwcmludGYgJXMgJyR7ZW5jb2RlZH0nIHwgYmFzZTY0IC1kIHwgc2ggLXMgLS0gJHthcmdzLm1hcChzaGVsbFF1b3RlKS5qb2luKFwiIFwiKX1gXSxcbiAgICAgIHsgdGltZW91dE1zOiBTRVRVUF9USU1FT1VUX01TLCAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSB9LFxuICAgICkucmVzdWx0O1xuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYExha2Vib3ggJHthcmdzWzBdfSBmYWlsZWQ6ICR7cmVzdWx0LnN0ZGVyci50cmltKCkgfHwgcmVzdWx0LnN0ZG91dC50cmltKCkgfHwgYGV4aXQgJHtyZXN1bHQuZXhpdENvZGV9YH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBNYXJrcyBhY3Rpdml0eSwgcmVhZGllcyB0aGUgY3VycmVudCBib290LCBhbmQgY29udmVyZ2VzIHRoZSB1c2VyJ3MgYWNjb3VudC4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZWFkeVVzZXIoXG4gICAgdXNlcjogTGFrZWJveFVzZXIsXG4gICAgaWRlbnRpdHk6IHN0cmluZyxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxCb290PiB7XG4gICAgdGhpcy50b3VjaCgpO1xuICAgIGNvbnN0IGJvb3QgPSBhd2FpdCB0aGlzLnJlYWR5KHNpZ25hbCk7XG4gICAgYXdhaXQgdGhpcy5jb252ZXJnZVVzZXIoYm9vdCwgdXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgcmV0dXJuIGJvb3Q7XG4gIH1cblxuICAvKiogQ3JlYXRlcyBvciB2ZXJpZmllcyB0aGUgdXNlcidzIGFjY291bnQgb25jZSBwZXIgYm9vdC4gKi9cbiAgcHJpdmF0ZSBjb252ZXJnZVVzZXIoXG4gICAgYm9vdDogQm9vdCxcbiAgICB1c2VyOiBMYWtlYm94VXNlcixcbiAgICBpZGVudGl0eTogc3RyaW5nLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgY29udmVyZ2VkID0gYm9vdC51c2Vycy5nZXQodXNlci5oYXNoKTtcbiAgICBpZiAoIWNvbnZlcmdlZCkge1xuICAgICAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoaWRlbnRpdHkudHJpbSgpLnRvTG93ZXJDYXNlKCkpLmRpZ2VzdChcImhleFwiKTtcbiAgICAgIGNvbnZlcmdlZCA9IHRoaXMuYWRtaW4oXG4gICAgICAgIGJvb3Quc2Vzc2lvbixcbiAgICAgICAgW1wiZW5zdXJlLXVzZXJcIiwgdXNlci5oYXNoLCBTdHJpbmcodXNlci51aWQpLCBkaWdlc3RdLFxuICAgICAgICBzaWduYWwsXG4gICAgICApLnRoZW4oKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIGJvb3QudXNlcnMuc2V0KHVzZXIuaGFzaCwgY29udmVyZ2VkKTtcbiAgICAgIGNvbnZlcmdlZC5jYXRjaCgoKSA9PiBib290LnVzZXJzLmRlbGV0ZSh1c2VyLmhhc2gpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnZlcmdlZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzdG9yZVVzZXIoYm9vdDogQm9vdCwgaGFzaDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXNlciA9IHsgbmFtZTogYGxha2Vib3gtJHtoYXNofWAsIGhvbWU6IGAvaG9tZS9sYWtlYm94LSR7aGFzaH1gIH07XG4gICAgYm9vdC51c2Vycy5zZXQoaGFzaCwgUHJvbWlzZS5yZXNvbHZlKCkpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBib290LnNlc3Npb24uZXhlY3V0ZShcInB5dGhvbjNcIiwgW0NPTlRST0xMRVIsIFwic3RhcnQtYWxsXCJdLCB7XG4gICAgICAgIHVzZXIsXG4gICAgICAgIHRpbWVvdXRNczogU0VUVVBfVElNRU9VVF9NUyxcbiAgICAgICAgc2lnbmFsOiB0aGlzLnNodXRkb3duQ29udHJvbGxlci5zaWduYWwsXG4gICAgICB9KS5yZXN1bHQ7XG4gICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LnN0ZGVyci50cmltKCkgfHwgYGV4aXQgJHtyZXN1bHQuZXhpdENvZGV9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgbG9nZ2VyLndhcm4oXCJMYWtlYm94IHNlcnZpY2UgcmVzdG9yZSBmYWlsZWRcIiwge1xuICAgICAgICB1c2VyOiBoYXNoLFxuICAgICAgICBlcnJvcjogdG9FcnJvcihlcnJvciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbnRyb2xsZXIoXG4gICAgYm9vdDogQm9vdCxcbiAgICB1c2VyOiBMYWtlYm94VXNlcixcbiAgICBjb21tYW5kOiBzdHJpbmcsXG4gICAgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJvb3Quc2Vzc2lvbi5leGVjdXRlKFwicHl0aG9uM1wiLCBbQ09OVFJPTExFUiwgY29tbWFuZCwgLi4uYXJnc10sIHtcbiAgICAgIHVzZXIsXG4gICAgICB0aW1lb3V0TXM6IFNFVFVQX1RJTUVPVVRfTVMsXG4gICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICB9KS5yZXN1bHQ7XG4gICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTGFrZWJveCBzZXJ2aWNlICR7Y29tbWFuZH0gZmFpbGVkOiAke3Jlc3VsdC5zdGRlcnIudHJpbSgpIHx8IGBleGl0ICR7cmVzdWx0LmV4aXRDb2RlfWB9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpIGFzIHVua25vd247XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blNlcnZpY2UoXG4gICAgYm9vdDogQm9vdCxcbiAgICB1c2VyOiBMYWtlYm94VXNlcixcbiAgICBkZWZpbml0aW9uOiBMYWtlYm94Q29udHJvbGxlckRlZmluaXRpb24sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TGFrZWJveFNlcnZpY2U+IHtcbiAgICBjb25zdCBrZXkgPSBgJHt1c2VyLmhhc2h9XFwwJHtkZWZpbml0aW9uLm5hbWV9YDtcbiAgICBjb25zdCBwZW5kaW5nID0gYm9vdC5zdGFydGluZy5nZXQoa2V5KTtcbiAgICBpZiAocGVuZGluZykgcmV0dXJuIHBlbmRpbmc7XG4gICAgY29uc3Qgb3BlcmF0aW9uID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChkZWZpbml0aW9uLmtpbmQgPT09IFwiZGVza3RvcFwiKSB7XG4gICAgICAgIGJvb3QuZGVza3RvcCA/Pz0gdGhpcy5hZG1pbihib290LnNlc3Npb24sIFtcImRlc2t0b3AtcHJlcmVxdWlzaXRlc1wiXSwgc2lnbmFsKS50aGVuKFxuICAgICAgICAgICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICAgICAgYm9vdC5kZXNrdG9wLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBib290LmRlc2t0b3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBib290LmRlc2t0b3A7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkbWluKFxuICAgICAgICBib290LnNlc3Npb24sXG4gICAgICAgIFtcImFsbG93LXBvcnRcIiwgU3RyaW5nKHVzZXIudWlkKSwgU3RyaW5nKGRlZmluaXRpb24ucG9ydCldLFxuICAgICAgICBzaWduYWwsXG4gICAgICApO1xuICAgICAgY29uc3Qgc3RhcnRlZCA9IExha2Vib3hDb250cm9sbGVyU2VydmljZVNjaGVtYS5wYXJzZShcbiAgICAgICAgYXdhaXQgdGhpcy5jb250cm9sbGVyKGJvb3QsIHVzZXIsIFwic3RhcnRcIiwgW2RlZmluaXRpb24ubmFtZV0sIHNpZ25hbCksXG4gICAgICApO1xuICAgICAgdGhpcy5jYWNoZVNlcnZpY2UoYm9vdCwgdXNlciwgc3RhcnRlZCk7XG4gICAgICByZXR1cm4gdG9MYWtlYm94U2VydmljZShzdGFydGVkLCB1c2VyLCB0aGlzLmNvbmZpZy5yb3V0ZVByZWZpeCk7XG4gICAgfSkoKS5maW5hbGx5KCgpID0+IGJvb3Quc3RhcnRpbmcuZGVsZXRlKGtleSkpO1xuICAgIGJvb3Quc3RhcnRpbmcuc2V0KGtleSwgb3BlcmF0aW9uKTtcbiAgICByZXR1cm4gb3BlcmF0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoU2VydmljZXMoXG4gICAgYm9vdDogQm9vdCxcbiAgICB1c2VyOiBMYWtlYm94VXNlcixcbiAgICBpZGVudGl0eTogc3RyaW5nLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPE1hcDxzdHJpbmcsIExha2Vib3hDb250cm9sbGVyU2VydmljZT4+IHtcbiAgICBhd2FpdCB0aGlzLmNvbnZlcmdlVXNlcihib290LCB1c2VyLCBpZGVudGl0eSwgc2lnbmFsKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCB0aGlzLmNvbnRyb2xsZXIoYm9vdCwgdXNlciwgXCJsaXN0XCIsIFtdLCBzaWduYWwpKSBhcyB7XG4gICAgICBzZXJ2aWNlcz86IHVua25vd25bXTtcbiAgICB9O1xuICAgIGNvbnN0IHNlcnZpY2VzID0gbmV3IE1hcChcbiAgICAgIChyZXNwb25zZS5zZXJ2aWNlcyA/PyBbXSkubWFwKChzZXJ2aWNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IExha2Vib3hDb250cm9sbGVyU2VydmljZVNjaGVtYS5wYXJzZShzZXJ2aWNlKTtcbiAgICAgICAgcmV0dXJuIFtwYXJzZWQubmFtZSwgcGFyc2VkXSBhcyBjb25zdDtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgYm9vdC5zZXJ2aWNlcy5zZXQodXNlci5oYXNoLCBzZXJ2aWNlcyk7XG4gICAgdGhpcy5sYXN0U2VydmljZXMuc2V0KHVzZXIuaGFzaCwgc2VydmljZXMpO1xuICAgIGNvbnN0IG9ic2VydmVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgdGhpcy5sYXN0U2VydmljZXNPYnNlcnZlZEF0LnNldCh1c2VyLmhhc2gsIG9ic2VydmVkQXQpO1xuICAgIGF3YWl0IHRoaXMucGVyc2lzdFNlcnZpY2VTbmFwc2hvdChib290LmVudHJ5LCB1c2VyLCBzZXJ2aWNlcywgb2JzZXJ2ZWRBdCk7XG4gICAgcmV0dXJuIHNlcnZpY2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWNoZVNlcnZpY2UoYm9vdDogQm9vdCwgdXNlcjogTGFrZWJveFVzZXIsIHNlcnZpY2U6IExha2Vib3hDb250cm9sbGVyU2VydmljZSk6IHZvaWQge1xuICAgIGNvbnN0IHNlcnZpY2VzID0gYm9vdC5zZXJ2aWNlcy5nZXQodXNlci5oYXNoKSA/PyBuZXcgTWFwPHN0cmluZywgTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlPigpO1xuICAgIHNlcnZpY2VzLnNldChzZXJ2aWNlLm5hbWUsIHNlcnZpY2UpO1xuICAgIGJvb3Quc2VydmljZXMuc2V0KHVzZXIuaGFzaCwgc2VydmljZXMpO1xuICAgIHRoaXMubGFzdFNlcnZpY2VzLnNldCh1c2VyLmhhc2gsIHNlcnZpY2VzKTtcbiAgICBjb25zdCBvYnNlcnZlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIHRoaXMubGFzdFNlcnZpY2VzT2JzZXJ2ZWRBdC5zZXQodXNlci5oYXNoLCBvYnNlcnZlZEF0KTtcbiAgICB2b2lkIHRoaXMucGVyc2lzdFNlcnZpY2VTbmFwc2hvdChib290LmVudHJ5LCB1c2VyLCBzZXJ2aWNlcywgb2JzZXJ2ZWRBdCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlcnZpY2VMaXN0aW5nKFxuICAgIGlkZW50aXR5OiBzdHJpbmcsXG4gICAgdXNlcjogTGFrZWJveFVzZXIsXG4gICAgZW50cnk6IExha2Vib3hFbnRyeSB8IHVuZGVmaW5lZCxcbiAgICBzdGF0dXM6IExha2Vib3hTdGF0dXMsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8U2VydmljZUxpc3Rpbmc+IHtcbiAgICBpZiAoIWVudHJ5IHx8IHN0YXR1cyA9PT0gXCJtaXNzaW5nXCIpIHtcbiAgICAgIHJldHVybiB7IHNlcnZpY2VzOiB0aGlzLmlkbGVTZXJ2aWNlcyh1c2VyKSwgc3RhbGU6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IFwicnVubmluZ1wiICYmIHRoaXMuYm9vdD8ua2V5ID09PSB0aGlzLmJvb3RLZXkoZW50cnkpKSB7XG4gICAgICBjb25zdCBzZXJ2aWNlcyA9IGF3YWl0IHRoaXMucmVmcmVzaFNlcnZpY2VzKHRoaXMuYm9vdCwgdXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgICByZXR1cm4geyBzZXJ2aWNlczogdGhpcy53aXRoQnVpbHRJbnModXNlciwgc2VydmljZXMpLCBzdGFsZTogZmFsc2UgfTtcbiAgICB9XG4gICAgY29uc3QgbWVtb3J5ID0gdGhpcy5sYXN0U2VydmljZXMuZ2V0KHVzZXIuaGFzaCk7XG4gICAgaWYgKG1lbW9yeSkge1xuICAgICAgY29uc3Qgb2JzZXJ2ZWRBdCA9IHRoaXMubGFzdFNlcnZpY2VzT2JzZXJ2ZWRBdC5nZXQodXNlci5oYXNoKTtcbiAgICAgIGNvbnN0IHNlcnZpY2VzID1cbiAgICAgICAgc3RhdHVzID09PSBcInJ1bm5pbmdcIlxuICAgICAgICAgID8gbWVtb3J5XG4gICAgICAgICAgOiBzdG9wcGVkU25hcHNob3RTZXJ2aWNlcyh7XG4gICAgICAgICAgICAgIG9ic2VydmVkQXQ6IG9ic2VydmVkQXQgPz8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICBkZWZpbml0aW9uczogWy4uLm1lbW9yeS52YWx1ZXMoKV0ubWFwKChzZXJ2aWNlKSA9PiBzZXJ2aWNlLmRlZmluaXRpb24pLFxuICAgICAgICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXJ2aWNlczogdGhpcy53aXRoQnVpbHRJbnModXNlciwgc2VydmljZXMpLFxuICAgICAgICBzdGFsZTogdHJ1ZSxcbiAgICAgICAgLi4uKG9ic2VydmVkQXQgPyB7IG9ic2VydmVkQXQgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdGhpcy5zZXJ2aWNlU25hcHNob3RzPy5yZWFkKGVudHJ5LnNhbmRib3hJZCwgdXNlci5oYXNoKTtcbiAgICByZXR1cm4gc25hcHNob3RcbiAgICAgID8ge1xuICAgICAgICAgIHNlcnZpY2VzOiB0aGlzLndpdGhCdWlsdElucyh1c2VyLCBzdG9wcGVkU25hcHNob3RTZXJ2aWNlcyhzbmFwc2hvdCkpLFxuICAgICAgICAgIHN0YWxlOiB0cnVlLFxuICAgICAgICAgIG9ic2VydmVkQXQ6IHNuYXBzaG90Lm9ic2VydmVkQXQsXG4gICAgICAgIH1cbiAgICAgIDogeyBzZXJ2aWNlczogdGhpcy5pZGxlU2VydmljZXModXNlciksIHN0YWxlOiB0cnVlIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBlcnNpc3RTZXJ2aWNlU25hcHNob3QoXG4gICAgZW50cnk6IExha2Vib3hFbnRyeSxcbiAgICB1c2VyOiBMYWtlYm94VXNlcixcbiAgICBzZXJ2aWNlczogUmVhZG9ubHlNYXA8c3RyaW5nLCBMYWtlYm94Q29udHJvbGxlclNlcnZpY2U+LFxuICAgIG9ic2VydmVkQXQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlU25hcHNob3RzPy53cml0ZShlbnRyeS5zYW5kYm94SWQsIHVzZXIuaGFzaCwge1xuICAgICAgb2JzZXJ2ZWRBdCxcbiAgICAgIGRlZmluaXRpb25zOiBbLi4uc2VydmljZXMudmFsdWVzKCldLm1hcCgoc2VydmljZSkgPT4gc2VydmljZS5kZWZpbml0aW9uKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgd2l0aEJ1aWx0SW5zKFxuICAgIHVzZXI6IExha2Vib3hVc2VyLFxuICAgIHNlcnZpY2VzOiBSZWFkb25seU1hcDxzdHJpbmcsIExha2Vib3hDb250cm9sbGVyU2VydmljZT4sXG4gICk6IExha2Vib3hTZXJ2aWNlW10ge1xuICAgIGNvbnN0IGJ1aWx0SW5zID0gTEFLRUJPWF9CVUlMVF9JTl9TRVJWSUNFUy5tYXAoKHsgbmFtZSB9KSA9PiB7XG4gICAgICBjb25zdCBzYXZlZCA9IHNlcnZpY2VzLmdldChuYW1lKTtcbiAgICAgIHJldHVybiBzYXZlZFxuICAgICAgICA/IHRvTGFrZWJveFNlcnZpY2Uoc2F2ZWQsIHVzZXIsIHRoaXMuY29uZmlnLnJvdXRlUHJlZml4KVxuICAgICAgICA6IGlkbGVCdWlsdEluU2VydmljZShuYW1lLCB1c2VyLCB0aGlzLmNvbmZpZy5yb3V0ZVByZWZpeCk7XG4gICAgfSk7XG4gICAgY29uc3QgY3VzdG9tID0gWy4uLnNlcnZpY2VzLnZhbHVlcygpXVxuICAgICAgLmZpbHRlcigoc2VydmljZSkgPT4gIUxBS0VCT1hfQlVJTFRfSU5fU0VSVklDRVMuc29tZSgoeyBuYW1lIH0pID0+IG5hbWUgPT09IHNlcnZpY2UubmFtZSkpXG4gICAgICAubWFwKChzZXJ2aWNlKSA9PiB0b0xha2Vib3hTZXJ2aWNlKHNlcnZpY2UsIHVzZXIsIHRoaXMuY29uZmlnLnJvdXRlUHJlZml4KSk7XG4gICAgcmV0dXJuIFsuLi5idWlsdElucywgLi4uY3VzdG9tXTtcbiAgfVxuXG4gIHByaXZhdGUgaWRsZVNlcnZpY2VzKHVzZXI6IExha2Vib3hVc2VyKTogTGFrZWJveFNlcnZpY2VbXSB7XG4gICAgcmV0dXJuIExBS0VCT1hfQlVJTFRfSU5fU0VSVklDRVMubWFwKCh7IG5hbWUgfSkgPT5cbiAgICAgIGlkbGVCdWlsdEluU2VydmljZShuYW1lIGFzIExha2Vib3hCdWlsdEluU2VydmljZU5hbWUsIHVzZXIsIHRoaXMuY29uZmlnLnJvdXRlUHJlZml4KSxcbiAgICApO1xuICB9XG5cbiAgLyoqIFJlc29sdmVzIG9uZSByb3V0ZWQgcmVxdWVzdCwgd2FraW5nIHRoZSBMYWtlYm94IG9yIHNlcnZpY2UgaW4gdGhlIGJhY2tncm91bmQuICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVJvdXRlKHVzZXI6IExha2Vib3hVc2VyLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPExha2Vib3hSb3V0ZVJlc29sdXRpb24+IHtcbiAgICB0aGlzLnRvdWNoKCk7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmVudHJ5KCk7XG4gICAgY29uc3QgcnVubmluZyA9IGVudHJ5ICYmIG5vcm1hbGl6ZUxha2Vib3hTdGF0dXMoZW50cnkuc3RhdHVzKSA9PT0gXCJydW5uaW5nXCI7XG4gICAgY29uc3QgYm9vdCA9IHRoaXMuYm9vdDtcbiAgICBpZiAoIXJ1bm5pbmcgfHwgIWJvb3QgfHwgYm9vdC5rZXkgIT09IHRoaXMuYm9vdEtleShlbnRyeSkpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcuYXV0bykgcmV0dXJuIHsga2luZDogXCJtaXNzaW5nXCIgfTtcbiAgICAgIHRoaXMud2FrZSgoKSA9PiB0aGlzLnJlYWR5KCkpO1xuICAgICAgcmV0dXJuIHsga2luZDogXCJsb2FkaW5nXCIgfTtcbiAgICB9XG4gICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLnJvdXRlZElkZW50aXRpZXMuZ2V0KHVzZXIuaGFzaCk7XG4gICAgaWYgKCFpZGVudGl0eSkgcmV0dXJuIHsga2luZDogXCJtaXNzaW5nXCIgfTtcbiAgICBsZXQgc2VydmljZSA9IGJvb3Quc2VydmljZXMuZ2V0KHVzZXIuaGFzaCk/LmdldChuYW1lKTtcbiAgICBpZiAoIXNlcnZpY2UpIHNlcnZpY2UgPSAoYXdhaXQgdGhpcy5yZWZyZXNoU2VydmljZXMoYm9vdCwgdXNlciwgaWRlbnRpdHkpKS5nZXQobmFtZSk7XG4gICAgY29uc3QgYnVpbHRJbiA9IGxha2Vib3hCdWlsdEluU2VydmljZU5hbWVTY2hlbWEuc2FmZVBhcnNlKG5hbWUpO1xuICAgIGlmICghc2VydmljZSAmJiAhYnVpbHRJbi5zdWNjZXNzKSByZXR1cm4geyBraW5kOiBcIm1pc3NpbmdcIiB9O1xuICAgIGlmIChzZXJ2aWNlPy5zdGF0ZSA9PT0gXCJyZWFkeVwiKSB7XG4gICAgICByZXR1cm4geyBraW5kOiBcInJlYWR5XCIsIHNlc3Npb246IGJvb3Quc2Vzc2lvbiwgcm91dGU6IHNlcnZpY2VSb3V0ZShzZXJ2aWNlLmRlZmluaXRpb24pIH07XG4gICAgfVxuICAgIGlmIChzZXJ2aWNlPy5zdGF0ZSA9PT0gXCJlcnJvclwiICYmICFib290LnN0YXJ0aW5nLmhhcyhgJHt1c2VyLmhhc2h9XFwwJHtuYW1lfWApKSB7XG4gICAgICByZXR1cm4geyBraW5kOiBcImZhaWxlZFwiLCBtZXNzYWdlOiBzZXJ2aWNlLmVycm9yID8/IFwidGhlIHNlcnZpY2UgZmFpbGVkIHRvIHN0YXJ0XCIgfTtcbiAgICB9XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IHNlcnZpY2U/LmRlZmluaXRpb24gPz8gYnVpbHRJbkRlZmluaXRpb24oYnVpbHRJbi5kYXRhISwgdXNlcik7XG4gICAgdGhpcy53YWtlKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghc2VydmljZSkgYXdhaXQgdGhpcy5jb250cm9sbGVyKGJvb3QsIHVzZXIsIFwicHV0XCIsIFtlbmNvZGUoZGVmaW5pdGlvbildKTtcbiAgICAgIGF3YWl0IHRoaXMucnVuU2VydmljZShib290LCB1c2VyLCBkZWZpbml0aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyBraW5kOiBcImxvYWRpbmdcIiB9O1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrVW5hdmFpbGFibGUodXNlcjogTGFrZWJveFVzZXIsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYm9vdD8uc2VydmljZXMuZ2V0KHVzZXIuaGFzaCk/LmRlbGV0ZShuYW1lKTtcbiAgICB0aGlzLmNhY2hlZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgd2FrZShhY3Rpb246ICgpID0+IFByb21pc2U8dW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy53YWtpbmcpIHJldHVybjtcbiAgICB0aGlzLndha2luZyA9IGFjdGlvbigpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dnZXIud2FybihcIkxha2Vib3ggd2FrZSBmYWlsZWRcIiwgeyBlcnJvcjogdG9FcnJvcihlcnJvcikgfSkpXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIHRoaXMud2FraW5nID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRNZXRyaWNzKHNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGJvb3QgPSB0aGlzLmJvb3Q7XG4gICAgaWYgKCFib290KSB0aHJvdyBuZXcgRXJyb3IoXCJMYWtlYm94IGlzIG5vdCBydW5uaW5nXCIpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGF3YWl0IHRoaXMuYWRtaW4oYm9vdC5zZXNzaW9uLCBbXCJtZXRyaWNzXCJdLCBzaWduYWwpKS5zdGRvdXQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuY2FjaGVkID0gdW5kZWZpbmVkO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsZWFzZU1ldHJpY3MoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmJvb3QpIHJldHVybjtcbiAgICB0aGlzLm1ldHJpY3Muc3RhcnQoKTtcbiAgICBpZiAodGhpcy5tZXRyaWNzTGVhc2UpIGNsZWFyVGltZW91dCh0aGlzLm1ldHJpY3NMZWFzZSk7XG4gICAgdGhpcy5tZXRyaWNzTGVhc2UgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm1ldHJpY3MubGlzdGVuZXJDb3VudChcInNuYXBzaG90XCIpID09PSAwKSB0aGlzLm1ldHJpY3Muc3RvcCgpO1xuICAgIH0sIE1FVFJJQ1NfTEVBU0VfTVMpO1xuICAgIHRoaXMubWV0cmljc0xlYXNlLnVucmVmPy4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgU1NIIHNlc3Npb24gYWZ0ZXIgdGhlIGlkbGUgdGltZW91dCB3aXRob3V0IGNvbW1hbmRzLCBzZXJ2aWNlXG4gICAqIG9wZXJhdGlvbnMsIHJvdXRlZCB0cmFmZmljLCBvcGVuIHN0cmVhbXMsIG9yIG1ldHJpY3Mgd2F0Y2hlcnMuIEFuIG9wZW5cbiAgICogc2Vzc2lvbiBjb3VudHMgYXMgYWN0aXZpdHkgZm9yIHRoZSBwbGF0Zm9ybSB3YXRjaGRvZywgc28gcmVsZWFzaW5nIGl0IGxldHNcbiAgICogdGhlIHBsYXRmb3JtIHN0b3AgdGhlIExha2Vib3ggYWZ0ZXIgaXRzIG93biBpZGxlIHRpbWVvdXQuIFRoZSBuZXh0IHJlcXVlc3RcbiAgICogcmVjb25uZWN0cy5cbiAgICovXG4gIHByaXZhdGUgd2F0Y2hJZGxlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlkbGVUaW1lcikgY2xlYXJJbnRlcnZhbCh0aGlzLmlkbGVUaW1lcik7XG4gICAgdGhpcy5pZGxlVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBpZGxlTXMgPSBEYXRlLm5vdygpIC0gdGhpcy5sYXN0QWN0aXZpdHk7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLmJvb3QgfHxcbiAgICAgICAgdGhpcy5jb252ZXJnaW5nIHx8XG4gICAgICAgIGlkbGVNcyA8IHRoaXMuY29uZmlnLmlkbGVUaW1lb3V0U2Vjb25kcyAqIDFfMDAwIHx8XG4gICAgICAgIHRoaXMuYWN0aXZlQ29tbWFuZHMgPiAwIHx8XG4gICAgICAgIHRoaXMuYm9vdC5zdGFydGluZy5zaXplID4gMCB8fFxuICAgICAgICB0aGlzLnJvdXRlcy5hY3RpdmVDb25uZWN0aW9ucygpID4gMCB8fFxuICAgICAgICB0aGlzLm1ldHJpY3MubGlzdGVuZXJDb3VudChcInNuYXBzaG90XCIpID4gMFxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLnJvdXRlcy5hY3RpdmVDb25uZWN0aW9ucygpID4gMCB8fCB0aGlzLmFjdGl2ZUNvbW1hbmRzID4gMCkgdGhpcy50b3VjaCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2dnZXIuaW5mbyhcInJlbGVhc2luZyBpZGxlIExha2Vib3ggc2Vzc2lvblwiLCB7IGlkbGVTZWNvbmRzOiBNYXRoLnJvdW5kKGlkbGVNcyAvIDFfMDAwKSB9KTtcbiAgICAgIHZvaWQgdGhpcy5kaXNjYXJkQm9vdCgpO1xuICAgIH0sIElETEVfQ0hFQ0tfTVMpO1xuICAgIHRoaXMuaWRsZVRpbWVyLnVucmVmPy4oKTtcbiAgfVxuXG4gIHByaXZhdGUgdG91Y2goKTogdm9pZCB7XG4gICAgdGhpcy5sYXN0QWN0aXZpdHkgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXNjYXJkQm9vdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pZGxlVGltZXIpIGNsZWFySW50ZXJ2YWwodGhpcy5pZGxlVGltZXIpO1xuICAgIHRoaXMuaWRsZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGJvb3QgPSB0aGlzLmJvb3Q7XG4gICAgdGhpcy5ib290ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubWV0cmljcy5zdG9wKCk7XG4gICAgYXdhaXQgdGhpcy5yb3V0ZXMuY2xvc2VCcmlkZ2VzKCk7XG4gICAgYXdhaXQgYm9vdD8uc2Vzc2lvbi5jbG9zZSgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5jb2RlKGRlZmluaXRpb246IExha2Vib3hDb250cm9sbGVyRGVmaW5pdGlvbik6IHN0cmluZyB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShkZWZpbml0aW9uKSkudG9TdHJpbmcoXCJiYXNlNjRcIik7XG59XG5cbmZ1bmN0aW9uIHNoZWxsUXVvdGUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJyR7dmFsdWUucmVwbGFjZUFsbChcIidcIiwgXCInXFxcXCcnXCIpfSdgO1xufVxuXG4vKiogUmV0dXJucyB3aGV0aGVyIGFuIGVycm9yIG1lYW5zIHRoZSBtYW5hZ2VkIExha2Vib3ggbm8gbG9uZ2VyIGV4aXN0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xha2Vib3hNaXNzaW5nKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIExha2Vib3hBcGlFcnJvciAmJiBlcnJvci5zdGF0dXMgPT09IDQwNDtcbn1cbiJdfQ==
798
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFekMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUNMLFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3BCLHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLFVBQVUsR0FDWCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLGFBQWEsR0FHZCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RSxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLCtCQUErQixFQUMvQiwyQkFBMkIsRUFDM0IsK0JBQStCLEdBV2hDLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBELE9BQU8sRUFBMkIsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxvQkFBb0IsRUFBK0IsTUFBTSxhQUFhLENBQUM7QUFDaEYsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLDhCQUE4QixFQUM5QixZQUFZLEVBQ1osZ0JBQWdCLEdBR2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFOUQsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsU0FBUyxF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RUFBRSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7Q0FDRjtBQUVELFNBQVMsTUFBTSxDQUFDLFVBQXVDO0lBQ3JELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxLQUFhO0lBQy9CLE9BQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDO0FBQy9DLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQWM7SUFDN0MsT0FBTyxLQUFLLFlBQVksZUFBZSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDO0FBQ2xFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgdHlwZSB7IEluY29taW5nSHR0cEhlYWRlcnMgfSBmcm9tIFwibm9kZTpodHRwXCI7XG5pbXBvcnQgeyBvblBhcmVudFRlcm1pbmF0aW9uU2lnbmFsIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgU3NoS2V5U3RvcmUsXG4gIGVuc3VyZUxha2Vib3hSdW5uaW5nLFxuICBlbnN1cmVMYWtlYm94U3RvcHBlZCxcbiAgbGFrZWJveElkbGVUaW1lb3V0U2Vjb25kcyxcbiAgbm9ybWFsaXplTGFrZWJveFN0YXR1cyxcbiAgU3NoQ29tbWFuZCxcbiAgU3NoU2Vzc2lvbixcbn0gZnJvbSBcIkBkYngtdG9vbHMvbGFrZWJveFwiO1xuaW1wb3J0IHtcbiAgaXNMYWtlYm94VW5hdmFpbGFibGUsXG4gIExha2Vib3hBcGlFcnJvcixcbiAgTGFrZWJveENsaWVudCxcbiAgdHlwZSBMYWtlYm94QXV0aCxcbiAgdHlwZSBMYWtlYm94RW50cnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL2xha2Vib3hcIjtcbmltcG9ydCB7IGVycm9yTm9kZXMsIGxvZywgc2xlZXAsIHRvRXJyb3IgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgTEFLRUJPWF9CVUlMVF9JTl9TRVJWSUNFUyxcbiAgbGFrZWJveEJ1aWx0SW5TZXJ2aWNlTmFtZVNjaGVtYSxcbiAgbGFrZWJveENvbW1hbmRSZXF1ZXN0U2NoZW1hLFxuICBsYWtlYm94U2VydmljZUxvZ3NSZXF1ZXN0U2NoZW1hLFxuICB0eXBlIENyZWF0ZUxha2Vib3hTZXJ2aWNlUmVxdWVzdCxcbiAgdHlwZSBMYWtlYm94QnVpbHRJblNlcnZpY2VOYW1lLFxuICB0eXBlIExha2Vib3hDb21tYW5kUmVxdWVzdCxcbiAgdHlwZSBMYWtlYm94TWV0cmljc1Jlc3BvbnNlLFxuICB0eXBlIExha2Vib3hNZXRyaWNzU25hcHNob3QsXG4gIHR5cGUgTGFrZWJveFNlcnZpY2UsXG4gIHR5cGUgTGFrZWJveFNlcnZpY2VMb2dzUmVxdWVzdCxcbiAgdHlwZSBMYWtlYm94U3RhdHVzLFxuICB0eXBlIExha2Vib3hTdW1tYXJ5LFxuICB0eXBlIExha2Vib3hVc2VyLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbGFrZWJveFwiO1xuaW1wb3J0IHsgcmVhZFBhY2thZ2VSZXNvdXJjZSB9IGZyb20gXCIuL19wYWNrYWdlLnRzXCI7XG5pbXBvcnQgeyBMYWtlYm94UmVzb3VyY2VSZWdpc3RyeSB9IGZyb20gXCIuL19yZXNvdXJjZS1yZWdpc3RyeS50c1wiO1xuaW1wb3J0IHsgTGFrZWJveFNlcnZpY2VTbmFwc2hvdHMsIHN0b3BwZWRTbmFwc2hvdFNlcnZpY2VzIH0gZnJvbSBcIi4vX3NlcnZpY2Utc25hcHNob3RzLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkTGFrZWJveFBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgTGFrZWJveE1ldHJpY3MgfSBmcm9tIFwiLi9tZXRyaWNzLnRzXCI7XG5pbXBvcnQgeyBMYWtlYm94Um91dGVSZWdpc3RyeSwgdHlwZSBMYWtlYm94Um91dGVSZXNvbHV0aW9uIH0gZnJvbSBcIi4vcm91dGVzLnRzXCI7XG5pbXBvcnQge1xuICBidWlsdEluRGVmaW5pdGlvbixcbiAgaWRsZUJ1aWx0SW5TZXJ2aWNlLFxuICBpbWFnZURlZmluaXRpb24sXG4gIExha2Vib3hDb250cm9sbGVyU2VydmljZVNjaGVtYSxcbiAgc2VydmljZVJvdXRlLFxuICB0b0xha2Vib3hTZXJ2aWNlLFxuICB0eXBlIExha2Vib3hDb250cm9sbGVyRGVmaW5pdGlvbixcbiAgdHlwZSBMYWtlYm94Q29udHJvbGxlclNlcnZpY2UsXG59IGZyb20gXCIuL3NlcnZpY2VzLnRzXCI7XG5pbXBvcnQgeyBMQUtFQk9YX1JVTlRJTUVfUk9PVCwgbGFrZWJveFVzZXIgfSBmcm9tIFwiLi91c2VyLnRzXCI7XG5cbmNvbnN0IEFETUlOX1NDUklQVCA9IHJlYWRQYWNrYWdlUmVzb3VyY2UoXCJzY3JpcHRzXCIsIFwibGFrZWJveC1hZG1pbi5zaFwiKTtcbmNvbnN0IEhFTFBFUlMgPSB7XG4gIFwibGFrZWJveC1zZXJ2aWNlXCI6IHJlYWRQYWNrYWdlUmVzb3VyY2UoXCJzY3JpcHRzXCIsIFwibGFrZWJveC1zZXJ2aWNlLnB5XCIpLFxuICBcImRlc2t0b3Atc2Vzc2lvblwiOiByZWFkUGFja2FnZVJlc291cmNlKFwic2NyaXB0c1wiLCBcImRlc2t0b3Atc2Vzc2lvbi5zaFwiKSxcbiAgXCJkZXNrdG9wLXByZXJlcXVpc2l0ZXNcIjogcmVhZFBhY2thZ2VSZXNvdXJjZShcInNjcmlwdHNcIiwgXCJkZXNrdG9wLXByZXJlcXVpc2l0ZXMuc2hcIiksXG59IGFzIGNvbnN0O1xuY29uc3QgQ09OVFJPTExFUiA9IGAke0xBS0VCT1hfUlVOVElNRV9ST09UfS9iaW4vbGFrZWJveC1zZXJ2aWNlYDtcbmNvbnN0IEVOVFJZX1RUTF9NUyA9IDVfMDAwO1xuY29uc3QgU0VUVVBfVElNRU9VVF9NUyA9IDYwMF8wMDA7XG5jb25zdCBTU0hfUkVBRFlfVElNRU9VVF9NUyA9IDMwMF8wMDA7XG5jb25zdCBTU0hfUkVBRFlfUkVUUllfSU5JVElBTF9NUyA9IDFfMDAwO1xuY29uc3QgU1NIX1JFQURZX1JFVFJZX01BWF9NUyA9IDEwXzAwMDtcbmNvbnN0IFRSQU5TSUVOVF9TU0hfQ09ERVMgPSBuZXcgU2V0KFtcbiAgXCJFQ09OTlJFRlVTRURcIixcbiAgXCJFQ09OTlJFU0VUXCIsXG4gIFwiRUhPU1RVTlJFQUNIXCIsXG4gIFwiRU5FVFVOUkVBQ0hcIixcbiAgXCJFVElNRURPVVRcIixcbl0pO1xuY29uc3QgTUVUUklDU19MRUFTRV9NUyA9IDYwXzAwMDtcbmNvbnN0IElETEVfQ0hFQ0tfTVMgPSAzMF8wMDA7XG5jb25zdCBTU0hfS0VZX09XTkVSID0gXCJhcHAtc2VydmljZS1wcmluY2lwYWxcIjtcbmNvbnN0IExFR0FDWV9OQU1FID1cbiAgL15kYngtKD8hbGFrZWJveC0pW2Etel0rLVthLXpdKy1bMC05YS1mXXs4fSg/Ol91aWRfW0EtWmEtejAtOV8tXStfZXhwX1swLTldKyk/JC87XG5jb25zdCBMRUdBQ1lfU0NIRU1BX1BSRUZJWCA9IFwiZGJ4X3Rvb2xzX2RhdGFicmlja3Nfc2FuZGJveFwiO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdC1sYWtlYm94OnJ1bnRpbWVcIik7XG5cbi8qKiBXaGV0aGVyIHRoZSBwbGF0Zm9ybSBpcyBydW5uaW5nIGJ1dCBpdHMgU1NIIGdhdGV3YXkgaXMgc3RpbGwgYmVjb21pbmcgcmVhY2hhYmxlLiAqL1xuZnVuY3Rpb24gX2lzVHJhbnNpZW50U3NoU3RhcnR1cEVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBbLi4uZXJyb3JOb2RlcyhlcnJvcildLnNvbWUoXG4gICAgKG5vZGUpID0+XG4gICAgICB0eXBlb2Ygbm9kZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgXCJjb2RlXCIgaW4gbm9kZSAmJlxuICAgICAgVFJBTlNJRU5UX1NTSF9DT0RFUy5oYXMoU3RyaW5nKChub2RlIGFzIHsgY29kZT86IHVua25vd24gfSkuY29kZSkpLFxuICApO1xufVxuXG4vKiogUmVzb2x2ZXMgdGhlIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkgZm9yIHJhdyByZXF1ZXN0IGhlYWRlcnMuICovXG5leHBvcnQgdHlwZSBMYWtlYm94SWRlbnRpdHlSZXNvbHZlciA9IChoZWFkZXJzOiBJbmNvbWluZ0h0dHBIZWFkZXJzKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbi8qKiBNaW5pbWFsIExha2ViYXNlIHBvb2wgdXNlZCB0byBkcm9wIGxlZ2FjeSBvd25lcnNoaXAgc2NoZW1hcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJveExlZ2FjeVBvb2wge1xuICBxdWVyeShzcWw6IHN0cmluZywgdmFsdWVzPzogdW5rbm93bltdKTogUHJvbWlzZTx7IHJvd3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB9Pjtcbn1cblxuaW50ZXJmYWNlIEJvb3Qge1xuICBrZXk6IHN0cmluZztcbiAgZW50cnk6IExha2Vib3hFbnRyeTtcbiAgc2Vzc2lvbjogU3NoU2Vzc2lvbjtcbiAgdXNlcnM6IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+O1xuICBzZXJ2aWNlczogTWFwPHN0cmluZywgTWFwPHN0cmluZywgTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlPj47XG4gIHN0YXJ0aW5nOiBNYXA8c3RyaW5nLCBQcm9taXNlPExha2Vib3hTZXJ2aWNlPj47XG4gIGRlc2t0b3A/OiBQcm9taXNlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgU2VydmljZUxpc3Rpbmcge1xuICBzZXJ2aWNlczogTGFrZWJveFNlcnZpY2VbXTtcbiAgc3RhbGU6IGJvb2xlYW47XG4gIG9ic2VydmVkQXQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3ducyB0aGUgc2luZ2xlIGxhemlseSBjcmVhdGVkIExha2Vib3ggb2Ygb25lIGFwcGxpY2F0aW9uLlxuICpcbiAqIEV2ZXJ5IERhdGFicmlja3MgTGFrZWJveCBSRVNUIGNhbGwgdXNlcyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsIHN1cHBsaWVkXG4gKiB0aHJvdWdoIHtAbGluayBpbml0aWFsaXplfTsgcmVxdWVzdCBpZGVudGl0eSBvbmx5IHNlbGVjdHMgdGhlIGludGVybmFsIExpbnV4XG4gKiBhY2NvdW50LiBFYWNoIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkgbWFwcyB0aHJvdWdoIG9uZSBGTlYtMWEgaGFzaCB0byBhIGxvY2tlZFxuICogYWNjb3VudCwgcGVyc2lzdGVudCBob21lLCByb3V0ZSBzZWdtZW50LCBhbmQgc2VydmljZSBwb3J0cy4gTGlmZWN5Y2xlIGFuZFxuICogcGVyLWJvb3QgYm9vdHN0cmFwIGFyZSBzZXJpYWxpemVkIGluLXByb2Nlc3M7IHRoZSBwZXJzaXN0ZW50IHJlc291cmNlXG4gKiByZWdpc3RyeSBzZXJpYWxpemVzIGZpcnN0IGNyZWF0aW9uIGFjcm9zcyByZXBsaWNhcy5cbiAqL1xuZXhwb3J0IGNsYXNzIExha2Vib3hSdW50aW1lIHtcbiAgcmVhZG9ubHkgcm91dGVzOiBMYWtlYm94Um91dGVSZWdpc3RyeTtcbiAgcmVhZG9ubHkgbWV0cmljczogTGFrZWJveE1ldHJpY3M7XG4gIHByaXZhdGUgcmVhZG9ubHkga2V5czogU3NoS2V5U3RvcmU7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcFBhcmVudFRlcm1pbmF0aW9uU2lnbmFsOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IHNodXRkb3duQ29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgcHJpdmF0ZSBhcGk/OiBMYWtlYm94Q2xpZW50O1xuICBwcml2YXRlIGlkZW50aXR5OiBMYWtlYm94SWRlbnRpdHlSZXNvbHZlciA9ICgpID0+IHVuZGVmaW5lZDtcbiAgLyoqIEluLW1lbW9yeSBpZGVudGl0aWVzIG9mIHJvdXRlZCB1c2VyczsgbmV2ZXIgcGVyc2lzdGVkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlZElkZW50aXRpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIGNhY2hlZD86IHsgZW50cnk/OiBMYWtlYm94RW50cnk7IGF0OiBudW1iZXIgfTtcbiAgcHJpdmF0ZSBib290PzogQm9vdDtcbiAgLyoqIExhc3QgYm9vdCB0aGF0IGNvbXBsZXRlZCBydW50aW1lIGJvb3RzdHJhcCBhbmQgcHJvZHVjZWQgYSBtZXRyaWNzIHNhbXBsZS4gKi9cbiAgcHJpdmF0ZSByZWFkeUJvb3RLZXk/OiBzdHJpbmc7XG4gIHByaXZhdGUgY29udmVyZ2luZz86IFByb21pc2U8Qm9vdD47XG4gIHByaXZhdGUgd2FraW5nPzogUHJvbWlzZTx1bmtub3duPjtcbiAgcHJpdmF0ZSBtZXRyaWNzTGVhc2U/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBpZGxlVGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD47XG4gIHByaXZhdGUgbGFzdEFjdGl2aXR5ID0gRGF0ZS5ub3coKTtcbiAgcHJpdmF0ZSBhY3RpdmVDb21tYW5kcyA9IDA7XG4gIC8qKiBMYXN0IHNlcnZpY2Ugc3RhdGVzIHBlciB1c2VyIGhhc2gsIGtlcHQgYWZ0ZXIgYW4gaWRsZSBzZXNzaW9uIHJlbGVhc2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbGFzdFNlcnZpY2VzID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIExha2Vib3hDb250cm9sbGVyU2VydmljZT4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGFzdFNlcnZpY2VzT2JzZXJ2ZWRBdCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVzb3VyY2VSZWdpc3RyeT86IExha2Vib3hSZXNvdXJjZVJlZ2lzdHJ5O1xuICBwcml2YXRlIHNlcnZpY2VTbmFwc2hvdHM/OiBMYWtlYm94U2VydmljZVNuYXBzaG90cztcbiAgcHJpdmF0ZSBjbG9zaW5nPzogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogQ3JlYXRlcyBhIHJ1bnRpbWUgZnJvbSByZXNvbHZlZCBwbHVnaW4gY29uZmlndXJhdGlvbi4gKi9cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgY29uZmlnOiBSZXNvbHZlZExha2Vib3hQbHVnaW5Db25maWcpIHtcbiAgICB0aGlzLmtleXMgPSBuZXcgU3NoS2V5U3RvcmUoY29uZmlnLmtleURpcmVjdG9yeSk7XG4gICAgdGhpcy5yb3V0ZXMgPSBuZXcgTGFrZWJveFJvdXRlUmVnaXN0cnkoY29uZmlnLnJvdXRlUHJlZml4LCB7XG4gICAgICB1c2VyOiAoaGVhZGVycykgPT4ge1xuICAgICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMuaWRlbnRpdHkoaGVhZGVycyk7XG4gICAgICAgIGlmICghaWRlbnRpdHkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXIoaWRlbnRpdHkpO1xuICAgICAgICB0aGlzLnJvdXRlZElkZW50aXRpZXMuc2V0KHVzZXIuaGFzaCwgaWRlbnRpdHkpO1xuICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgIH0sXG4gICAgICByZXNvbHZlOiAodXNlciwgc2VydmljZSkgPT4gdGhpcy5yZXNvbHZlUm91dGUodXNlciwgc2VydmljZSksXG4gICAgICB1bmF2YWlsYWJsZTogKHVzZXIsIHNlcnZpY2UpID0+IHRoaXMubWFya1VuYXZhaWxhYmxlKHVzZXIsIHNlcnZpY2UpLFxuICAgIH0pO1xuICAgIHRoaXMubWV0cmljcyA9IG5ldyBMYWtlYm94TWV0cmljcyhcbiAgICAgIChzaWduYWwpID0+IHRoaXMucmVhZE1ldHJpY3Moc2lnbmFsKSxcbiAgICAgIGNvbmZpZy5tZXRyaWNzSW50ZXJ2YWxTZWNvbmRzICogMV8wMDAsXG4gICAgKTtcbiAgICB0aGlzLnN0b3BQYXJlbnRUZXJtaW5hdGlvblNpZ25hbCA9IG9uUGFyZW50VGVybWluYXRpb25TaWduYWwoKCkgPT4gdGhpcy5yb3V0ZXMuYmVnaW5TaHV0ZG93bigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdXBwbGllcyBhcHAgc2VydmljZS1wcmluY2lwYWwgY3JlZGVudGlhbHMgYW5kIHRoZSByZXF1ZXN0IGlkZW50aXR5XG4gICAqIHJlc29sdmVyIHVzZWQgYnkgcm91dGVzLlxuICAgKi9cbiAgaW5pdGlhbGl6ZShcbiAgICBhdXRoOiBMYWtlYm94QXV0aCxcbiAgICBpZGVudGl0eT86IExha2Vib3hJZGVudGl0eVJlc29sdmVyLFxuICAgIHNlcnZpY2VTbmFwc2hvdHM/OiBMYWtlYm94U2VydmljZVNuYXBzaG90cyxcbiAgICByZXNvdXJjZVJlZ2lzdHJ5PzogTGFrZWJveFJlc291cmNlUmVnaXN0cnksXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYXBpID0gbmV3IExha2Vib3hDbGllbnQoYXV0aCk7XG4gICAgaWYgKGlkZW50aXR5KSB0aGlzLmlkZW50aXR5ID0gaWRlbnRpdHk7XG4gICAgaWYgKHNlcnZpY2VTbmFwc2hvdHMpIHRoaXMuc2VydmljZVNuYXBzaG90cyA9IHNlcnZpY2VTbmFwc2hvdHM7XG4gICAgaWYgKHJlc291cmNlUmVnaXN0cnkpIHRoaXMucmVzb3VyY2VSZWdpc3RyeSA9IHJlc291cmNlUmVnaXN0cnk7XG4gIH1cblxuICAvKiogRGVyaXZlcyB0aGUgTGFrZWJveCBhY2NvdW50IGZvciBvbmUgYXV0aGVudGljYXRlZCBpZGVudGl0eS4gKi9cbiAgdXNlcihpZGVudGl0eTogc3RyaW5nKTogTGFrZWJveFVzZXIge1xuICAgIHJldHVybiBsYWtlYm94VXNlcihpZGVudGl0eSwgdGhpcy5jb25maWcucm91dGVQcmVmaXgpO1xuICB9XG5cbiAgLyoqIFN1bW1hcml6ZXMgdGhlIGFwcCBMYWtlYm94IGZvciBvbmUgdXNlciB3aXRob3V0IGNyZWF0aW5nIGl0LiAqL1xuICBhc3luYyBzdW1tYXJ5KGlkZW50aXR5OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxMYWtlYm94U3VtbWFyeT4ge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXIoaWRlbnRpdHkpO1xuICAgIGNvbnN0IGJhc2UgPSB7IGF1dG86IHRoaXMuY29uZmlnLmF1dG8sIG5hbWU6IFwiTGFrZWJveFwiLCB1c2VyIH07XG4gICAgbGV0IGVudHJ5OiBMYWtlYm94RW50cnkgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGVudHJ5ID0gYXdhaXQgdGhpcy5lbnRyeShzaWduYWwsIHRydWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNMYWtlYm94VW5hdmFpbGFibGUoZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBzdXBwb3J0ZWQ6IGZhbHNlLFxuICAgICAgICAgIHN0YXR1czogXCJtaXNzaW5nXCIsXG4gICAgICAgICAgc2VydmljZXM6IFtdLFxuICAgICAgICAgIHNlcnZpY2VzU3RhbGU6IGZhbHNlLFxuICAgICAgICAgIGNhblN0YXJ0OiBmYWxzZSxcbiAgICAgICAgICBjYW5TdG9wOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBjb25zdCBwbGF0Zm9ybVN0YXR1czogTGFrZWJveFN0YXR1cyA9IGVudHJ5ID8gbm9ybWFsaXplTGFrZWJveFN0YXR1cyhlbnRyeS5zdGF0dXMpIDogXCJtaXNzaW5nXCI7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5wcm9kdWN0U3RhdHVzKGVudHJ5LCBwbGF0Zm9ybVN0YXR1cyk7XG4gICAgaWYgKGVudHJ5ICYmIHBsYXRmb3JtU3RhdHVzID09PSBcInJ1bm5pbmdcIiAmJiBzdGF0dXMgPT09IFwic3RhcnRpbmdcIikge1xuICAgICAgdGhpcy53YWtlKCgpID0+IHRoaXMucmVhZHkoKSk7XG4gICAgfVxuICAgIGNvbnN0IGxpc3RpbmcgPSBhd2FpdCB0aGlzLnNlcnZpY2VMaXN0aW5nKGlkZW50aXR5LCB1c2VyLCBlbnRyeSwgc3RhdHVzLCBzaWduYWwpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5iYXNlLFxuICAgICAgc3VwcG9ydGVkOiB0cnVlLFxuICAgICAgc3RhdHVzLFxuICAgICAgLi4uKGVudHJ5ID8geyBpZDogZW50cnkuc2FuZGJveElkIH0gOiB7fSksXG4gICAgICAuLi4obGFrZWJveElkbGVUaW1lb3V0U2Vjb25kcyhlbnRyeT8uaWRsZVRpbWVvdXQpICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IGlkbGVUaW1lb3V0U2Vjb25kczogbGFrZWJveElkbGVUaW1lb3V0U2Vjb25kcyhlbnRyeT8uaWRsZVRpbWVvdXQpIH1cbiAgICAgICAgOiB7fSksXG4gICAgICBzZXJ2aWNlczogbGlzdGluZy5zZXJ2aWNlcyxcbiAgICAgIHNlcnZpY2VzU3RhbGU6IGxpc3Rpbmcuc3RhbGUsXG4gICAgICAuLi4obGlzdGluZy5vYnNlcnZlZEF0ID8geyBzZXJ2aWNlc09ic2VydmVkQXQ6IGxpc3Rpbmcub2JzZXJ2ZWRBdCB9IDoge30pLFxuICAgICAgY2FuU3RhcnQ6IHN0YXR1cyAhPT0gXCJydW5uaW5nXCIgJiYgc3RhdHVzICE9PSBcInN0YXJ0aW5nXCIsXG4gICAgICBjYW5TdG9wOiBzdGF0dXMgPT09IFwicnVubmluZ1wiIHx8IHN0YXR1cyA9PT0gXCJzdGFydGluZ1wiLFxuICAgIH07XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgTGFrZWJveCB3aGVuIG5lZWRlZCwgc3RhcnRzIGl0LCBhbmQgcmVzdG9yZXMgc2F2ZWQgc2VydmljZXMuICovXG4gIGFzeW5jIHN0YXJ0KHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWFkeShzaWduYWwsIHRydWUpO1xuICB9XG5cbiAgLyoqIFN0b3BzIHRoZSBzaGFyZWQgTGFrZWJveCBmb3IgZXZlcnkgdXNlci4gRmlsZXMgYW5kIHNhdmVkIHNlcnZpY2VzIHBlcnNpc3QuICovXG4gIGFzeW5jIHN0b3Aoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuZW50cnkoc2lnbmFsLCB0cnVlKTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5kaXNjYXJkQm9vdCgpO1xuICAgIGF3YWl0IGVuc3VyZUxha2Vib3hTdG9wcGVkKHRoaXMuY2xpZW50KCksIGVudHJ5LCBzaWduYWwpO1xuICAgIHRoaXMuY2FjaGVkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFBlcm1hbmVudGx5IGRlbGV0ZXMgdGhlIG1hbmFnZWQgTGFrZWJveCBhbmQgZXZlcnkgdXNlcidzIGZpbGVzLiAqL1xuICBhc3luYyBkZWxldGUoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuZW50cnkoc2lnbmFsLCB0cnVlKTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgdGhpcy5kaXNjYXJkQm9vdCgpO1xuICAgIGF3YWl0IHRoaXMuY2xpZW50KCkuZGVsZXRlKGVudHJ5LnNhbmRib3hJZCwgc2lnbmFsKTtcbiAgICBhd2FpdCB0aGlzLnJlc291cmNlcygpLmNsZWFyKHRoaXMuY2xpZW50KCkpO1xuICAgIHRoaXMucmVhZHlCb290S2V5ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2FjaGVkID0geyBhdDogRGF0ZS5ub3coKSB9O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgb25lIGNvbW1hbmQgYXMgdGhlIHVzZXIncyBhY2NvdW50LCBjcmVhdGluZyBvciBzdGFydGluZyB0aGUgTGFrZWJveFxuICAgKiB3aGVuIGBhdXRvYCBpcyBlbmFibGVkLlxuICAgKi9cbiAgZXhlY3V0ZShpZGVudGl0eTogc3RyaW5nLCBpbnB1dDogTGFrZWJveENvbW1hbmRSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFNzaENvbW1hbmQge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBsYWtlYm94Q29tbWFuZFJlcXVlc3RTY2hlbWEucGFyc2UoaW5wdXQpO1xuICAgIGNvbnN0IHRpbWVvdXRNcyA9IHJlcXVlc3QudGltZW91dE1zID8/IHRoaXMuY29uZmlnLmNvbW1hbmRUaW1lb3V0TXM7XG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlcihpZGVudGl0eSk7XG4gICAgcmV0dXJuIG5ldyBTc2hDb21tYW5kKFxuICAgICAgcmVxdWVzdC5jb21tYW5kLFxuICAgICAgcmVxdWVzdC5hcmdzLFxuICAgICAgeyB0aW1lb3V0TXMsIHNpZ25hbCB9LFxuICAgICAgYXN5bmMgKGV4ZWN1dGlvbikgPT4ge1xuICAgICAgICBjb25zdCBib290ID0gYXdhaXQgdGhpcy5yZWFkeVVzZXIodXNlciwgaWRlbnRpdHksIGV4ZWN1dGlvbi5zaWduYWwpO1xuICAgICAgICB0aGlzLmFjdGl2ZUNvbW1hbmRzICs9IDE7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGlvbi5mb2xsb3coXG4gICAgICAgICAgICBib290LnNlc3Npb24uZXhlY3V0ZShyZXF1ZXN0LmNvbW1hbmQsIHJlcXVlc3QuYXJncywge1xuICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgICAuLi4ocmVxdWVzdC5jd2QgPyB7IGN3ZDogcmVxdWVzdC5jd2QgfSA6IHt9KSxcbiAgICAgICAgICAgICAgLi4uKHJlcXVlc3QuZW52ID8geyBlbnY6IHJlcXVlc3QuZW52IH0gOiB7fSksXG4gICAgICAgICAgICAgIHRpbWVvdXRNcyxcbiAgICAgICAgICAgICAgc2lnbmFsOiBleGVjdXRpb24uc2lnbmFsLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNvbW1hbmRzIC09IDE7XG4gICAgICAgICAgdGhpcy50b3VjaCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKiogTGlzdHMgdGhlIHVzZXIncyBzZXJ2aWNlcywgaW5jbHVkaW5nIGlkbGUgYnVpbHQtaW5zLiBOZXZlciBjcmVhdGVzIHRoZSBMYWtlYm94LiAqL1xuICBhc3luYyBsaXN0U2VydmljZXMoaWRlbnRpdHk6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExha2Vib3hTZXJ2aWNlW10+IHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuZW50cnkoc2lnbmFsKTtcbiAgICBjb25zdCBzdGF0dXM6IExha2Vib3hTdGF0dXMgPSBlbnRyeSA/IG5vcm1hbGl6ZUxha2Vib3hTdGF0dXMoZW50cnkuc3RhdHVzKSA6IFwibWlzc2luZ1wiO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zZXJ2aWNlTGlzdGluZyhpZGVudGl0eSwgdXNlciwgZW50cnksIHN0YXR1cywgc2lnbmFsKSkuc2VydmljZXM7XG4gIH1cblxuICAvKiogQ3JlYXRlcyBvciByZXBsYWNlcyBvbmUgaW1hZ2Ugc2VydmljZSBhbmQgd2FpdHMgdW50aWwgaXQgaXMgcmVhZHkgb3IgZmFpbGVkLiAqL1xuICBhc3luYyBjcmVhdGVTZXJ2aWNlKFxuICAgIGlkZW50aXR5OiBzdHJpbmcsXG4gICAgaW5wdXQ6IENyZWF0ZUxha2Vib3hTZXJ2aWNlUmVxdWVzdCxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxMYWtlYm94U2VydmljZT4ge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXIoaWRlbnRpdHkpO1xuICAgIGNvbnN0IGRlZmluaXRpb24gPSBpbWFnZURlZmluaXRpb24oaW5wdXQsIHVzZXIpO1xuICAgIGNvbnN0IGJvb3QgPSBhd2FpdCB0aGlzLnJlYWR5VXNlcih1c2VyLCBpZGVudGl0eSwgc2lnbmFsKTtcbiAgICBhd2FpdCB0aGlzLmNvbnRyb2xsZXIoYm9vdCwgdXNlciwgXCJwdXRcIiwgW2VuY29kZShkZWZpbml0aW9uKV0sIHNpZ25hbCk7XG4gICAgcmV0dXJuIHRoaXMucnVuU2VydmljZShib290LCB1c2VyLCBkZWZpbml0aW9uLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIFN0YXJ0cyBhIHNhdmVkIHNlcnZpY2Ugb3IgYSBidWlsdC1pbiBhbmQgd2FpdHMgdW50aWwgaXQgaXMgcmVhZHkgb3IgZmFpbGVkLiAqL1xuICBhc3luYyBzdGFydFNlcnZpY2UoXG4gICAgaWRlbnRpdHk6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TGFrZWJveFNlcnZpY2U+IHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICBjb25zdCBib290ID0gYXdhaXQgdGhpcy5yZWFkeVVzZXIodXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgY29uc3QgYnVpbHRJbiA9IGxha2Vib3hCdWlsdEluU2VydmljZU5hbWVTY2hlbWEuc2FmZVBhcnNlKG5hbWUpO1xuICAgIGlmIChidWlsdEluLnN1Y2Nlc3MpIHtcbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBidWlsdEluRGVmaW5pdGlvbihidWlsdEluLmRhdGEsIHVzZXIpO1xuICAgICAgYXdhaXQgdGhpcy5jb250cm9sbGVyKGJvb3QsIHVzZXIsIFwicHV0XCIsIFtlbmNvZGUoZGVmaW5pdGlvbildLCBzaWduYWwpO1xuICAgICAgcmV0dXJuIHRoaXMucnVuU2VydmljZShib290LCB1c2VyLCBkZWZpbml0aW9uLCBzaWduYWwpO1xuICAgIH1cbiAgICBjb25zdCBzYXZlZCA9IChhd2FpdCB0aGlzLnJlZnJlc2hTZXJ2aWNlcyhib290LCB1c2VyLCBpZGVudGl0eSwgc2lnbmFsKSkuZ2V0KG5hbWUpO1xuICAgIGlmICghc2F2ZWQpIHRocm93IG5ldyBFcnJvcihgTGFrZWJveCBzZXJ2aWNlICR7bmFtZX0gZG9lcyBub3QgZXhpc3RgKTtcbiAgICByZXR1cm4gdGhpcy5ydW5TZXJ2aWNlKGJvb3QsIHVzZXIsIHNhdmVkLmRlZmluaXRpb24sIHNpZ25hbCk7XG4gIH1cblxuICAvKiogU3RvcHMgb25lIHJ1bm5pbmcgc2VydmljZSB3aXRob3V0IHJlbW92aW5nIGl0cyBkZWZpbml0aW9uLiAqL1xuICBhc3luYyBzdG9wU2VydmljZShpZGVudGl0eTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxMYWtlYm94U2VydmljZT4ge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXIoaWRlbnRpdHkpO1xuICAgIGNvbnN0IGJvb3QgPSBhd2FpdCB0aGlzLnJlYWR5VXNlcih1c2VyLCBpZGVudGl0eSwgc2lnbmFsKTtcbiAgICBjb25zdCBzdG9wcGVkID0gTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlU2NoZW1hLnBhcnNlKFxuICAgICAgYXdhaXQgdGhpcy5jb250cm9sbGVyKGJvb3QsIHVzZXIsIFwic3RvcFwiLCBbbmFtZV0sIHNpZ25hbCksXG4gICAgKTtcbiAgICB0aGlzLmNhY2hlU2VydmljZShib290LCB1c2VyLCBzdG9wcGVkKTtcbiAgICByZXR1cm4gdG9MYWtlYm94U2VydmljZShzdG9wcGVkLCB1c2VyLCB0aGlzLmNvbmZpZy5yb3V0ZVByZWZpeCk7XG4gIH1cblxuICAvKiogU3RvcHMgYW5kIGRlbGV0ZXMgb25lIHNhdmVkIHNlcnZpY2UuIE1vdW50ZWQgaG9tZSBkaXJlY3RvcmllcyBhcmUgcHJlc2VydmVkLiAqL1xuICBhc3luYyByZW1vdmVTZXJ2aWNlKGlkZW50aXR5OiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICBjb25zdCBib290ID0gYXdhaXQgdGhpcy5yZWFkeVVzZXIodXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IHRoaXMuY29udHJvbGxlcihib290LCB1c2VyLCBcInJlbW92ZVwiLCBbbmFtZV0sIHNpZ25hbCkpIGFzIHtcbiAgICAgIHJlbW92ZWQ/OiBib29sZWFuO1xuICAgIH07XG4gICAgaWYgKHJlc3VsdC5yZW1vdmVkID09PSB0cnVlKSBhd2FpdCB0aGlzLnJlZnJlc2hTZXJ2aWNlcyhib290LCB1c2VyLCBpZGVudGl0eSwgc2lnbmFsKTtcbiAgICByZXR1cm4gcmVzdWx0LnJlbW92ZWQgPT09IHRydWU7XG4gIH1cblxuICAvKiogUmVhZHMgYSBib3VuZGVkIHRhaWwgb2Ygb25lIHNlcnZpY2UgbG9nLiAqL1xuICBhc3luYyBzZXJ2aWNlTG9ncyhcbiAgICBpZGVudGl0eTogc3RyaW5nLFxuICAgIGlucHV0OiBMYWtlYm94U2VydmljZUxvZ3NSZXF1ZXN0LFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHsgbG9nOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBsYWtlYm94U2VydmljZUxvZ3NSZXF1ZXN0U2NoZW1hLnBhcnNlKGlucHV0KTtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuZW50cnkoc2lnbmFsKTtcbiAgICBpZiAoIWVudHJ5IHx8IG5vcm1hbGl6ZUxha2Vib3hTdGF0dXMoZW50cnkuc3RhdHVzKSAhPT0gXCJydW5uaW5nXCIpIHJldHVybiB7IGxvZzogXCJcIiB9O1xuICAgIGNvbnN0IGJvb3QgPSBhd2FpdCB0aGlzLnJlYWR5VXNlcih1c2VyLCBpZGVudGl0eSwgc2lnbmFsKTtcbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgdGhpcy5jb250cm9sbGVyKFxuICAgICAgYm9vdCxcbiAgICAgIHVzZXIsXG4gICAgICBcImxvZ3NcIixcbiAgICAgIFtyZXF1ZXN0Lm5hbWUsIFN0cmluZyhyZXF1ZXN0Lm1heExpbmVzKSwgU3RyaW5nKHJlcXVlc3QubWF4Q2hhcnMpXSxcbiAgICAgIHNpZ25hbCxcbiAgICApKSBhcyB7IGxvZz86IHN0cmluZyB9O1xuICAgIHJldHVybiB7IGxvZzogcmVzdWx0LmxvZyA/PyBcIlwiIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyByZWNlbnQgbWV0cmljcyBhbmQga2VlcHMgc2FtcGxpbmcgZm9yIG9uZSBsZWFzZSBpbnRlcnZhbC4gU2FtcGxpbmdcbiAgICogcnVucyBvbmx5IHdoaWxlIHRoZSBMYWtlYm94IHJ1bnMgYW5kIGEgY2FsbGVyIGlzIHdhdGNoaW5nLCBzbyBtZXRyaWNzIG5ldmVyXG4gICAqIGtlZXAgYW4gb3RoZXJ3aXNlIGlkbGUgTGFrZWJveCBhd2FrZS5cbiAgICovXG4gIGFzeW5jIG1ldHJpY3NSZXNwb25zZShzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TGFrZWJveE1ldHJpY3NSZXNwb25zZT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgdGhpcy5lbnRyeShzaWduYWwpO1xuICAgIGNvbnN0IHBsYXRmb3JtU3RhdHVzOiBMYWtlYm94U3RhdHVzID0gZW50cnkgPyBub3JtYWxpemVMYWtlYm94U3RhdHVzKGVudHJ5LnN0YXR1cykgOiBcIm1pc3NpbmdcIjtcbiAgICBpZiAocGxhdGZvcm1TdGF0dXMgIT09IFwicnVubmluZ1wiKSB7XG4gICAgICB0aGlzLm1ldHJpY3Muc3RvcCgpO1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBwbGF0Zm9ybVN0YXR1cywgc2VyaWVzOiBbXSB9O1xuICAgIH1cbiAgICBpZiAoIWVudHJ5IHx8ICF0aGlzLmJvb3QgfHwgdGhpcy5ib290LmtleSAhPT0gdGhpcy5ib290S2V5KGVudHJ5KSkge1xuICAgICAgdGhpcy5tZXRyaWNzLnN0b3AoKTtcbiAgICAgIHRoaXMud2FrZSgoKSA9PiB0aGlzLnJlYWR5KCkpO1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcInN0YXJ0aW5nXCIsIHNlcmllczogW10gfTtcbiAgICB9XG4gICAgdGhpcy5sZWFzZU1ldHJpY3MoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiB0aGlzLnByb2R1Y3RTdGF0dXMoZW50cnksIHBsYXRmb3JtU3RhdHVzKSxcbiAgICAgIHNlcmllczogWy4uLnRoaXMubWV0cmljcy5zZXJpZXMoKV0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBTdWJzY3JpYmVzIHRvIG1ldHJpY3Mgc25hcHNob3RzIHdoaWxlIHRoZSBMYWtlYm94IHJ1bnMuICovXG4gIHN1YnNjcmliZU1ldHJpY3MobGlzdGVuZXI6IChzbmFwc2hvdDogTGFrZWJveE1ldHJpY3NTbmFwc2hvdCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubWV0cmljcy5vbihcInNuYXBzaG90XCIsIGxpc3RlbmVyKTtcbiAgICBpZiAodGhpcy5ib290Py5rZXkgPT09IHRoaXMucmVhZHlCb290S2V5KSB0aGlzLm1ldHJpY3Muc3RhcnQoKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5tZXRyaWNzLm9mZihcInNuYXBzaG90XCIsIGxpc3RlbmVyKTtcbiAgICAgIHRoaXMubGVhc2VNZXRyaWNzKCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGxlZ2FjeSBwZXItdXNlciBMYWtlYm94ZXMgYW5kIGRyb3BzIGxlZ2FjeSBvd25lcnNoaXAgc2NoZW1hcy5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gbWlncmF0aW9uOiB0aGUgZWFybGllciBvbmUtbWFjaGluZS1wZXItdXNlciBtb2RlbCBpcyByZW1vdmVkLlxuICAgKiBUaGUgbWFuYWdlZCBhcHAgTGFrZWJveCBhbmQgTGFrZWJveGVzIHdpdGggb3RoZXIgbmFtZXMgYXJlIG5ldmVyIHRvdWNoZWQuXG4gICAqL1xuICBhc3luYyBjbGVhbnVwTGVnYWN5KHBvb2w/OiBMYWtlYm94TGVnYWN5UG9vbCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuY2xpZW50KCkubGlzdChzaWduYWwpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGVudHJpZXNcbiAgICAgICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkubmFtZSAmJiBMRUdBQ1lfTkFNRS50ZXN0KGVudHJ5Lm5hbWUpKVxuICAgICAgICAgIC5tYXAoYXN5bmMgKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudCgpLmRlbGV0ZShlbnRyeS5zYW5kYm94SWQsIHNpZ25hbCk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcImRlbGV0ZWQgbGVnYWN5IHBlci11c2VyIExha2Vib3hcIiwge1xuICAgICAgICAgICAgICBpZDogZW50cnkuc2FuZGJveElkLFxuICAgICAgICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzTGFrZWJveFVuYXZhaWxhYmxlKGVycm9yKSkge1xuICAgICAgICBsb2dnZXIud2FybihcImxlZ2FjeSBMYWtlYm94IGNsZWFudXAgZmFpbGVkXCIsIHsgZXJyb3I6IHRvRXJyb3IoZXJyb3IpIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXBvb2wpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2NoZW1hcyA9IGF3YWl0IHBvb2wucXVlcnkoXG4gICAgICAgIFwiU0VMRUNUIG5zcG5hbWUgRlJPTSBwZ19uYW1lc3BhY2UgV0hFUkUgbnNwbmFtZSA9ICQxIE9SIHN0YXJ0c193aXRoKG5zcG5hbWUsICQyKVwiLFxuICAgICAgICBbTEVHQUNZX1NDSEVNQV9QUkVGSVgsIGAke0xFR0FDWV9TQ0hFTUFfUFJFRklYfV9gXSxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBzY2hlbWFzLnJvd3MpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gU3RyaW5nKHJvdy5uc3BuYW1lKTtcbiAgICAgICAgYXdhaXQgcG9vbC5xdWVyeShgRFJPUCBTQ0hFTUEgSUYgRVhJU1RTIFwiJHtzY2hlbWEucmVwbGFjZUFsbCgnXCInLCAnXCJcIicpfVwiIENBU0NBREVgKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJkcm9wcGVkIGxlZ2FjeSBMYWtlYm94IG93bmVyc2hpcCBzY2hlbWFcIiwgeyBzY2hlbWEgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwibGVnYWN5IG93bmVyc2hpcCBzY2hlbWEgY2xlYW51cCBmYWlsZWRcIiwgeyBlcnJvcjogdG9FcnJvcihlcnJvcikgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhbmNlbHMgaW4tZmxpZ2h0IHdvcmsgYmVmb3JlIHRlYXJkb3duLiAqL1xuICBhYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNodXRkb3duQ29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgdGhpcy5zaHV0ZG93bkNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxuXG4gIC8qKiBDbG9zZXMgcm91dGVzLCBtZXRyaWNzLCBhbmQgdGhlIFNTSCBzZXNzaW9uIHdpdGhvdXQgY2hhbmdpbmcgdGhlIExha2Vib3guICovXG4gIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk7XG4gICAgdGhpcy5yb3V0ZXMuYmVnaW5TaHV0ZG93bigpO1xuICAgIHRoaXMuY2xvc2luZyA/Pz0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLm1ldHJpY3NMZWFzZSkgY2xlYXJUaW1lb3V0KHRoaXMubWV0cmljc0xlYXNlKTtcbiAgICAgICAgdGhpcy5tZXRyaWNzLnN0b3AoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yb3V0ZXMuY2xvc2UoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5ib290Py5zZXNzaW9uLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuYm9vdCA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuc3RvcFBhcmVudFRlcm1pbmF0aW9uU2lnbmFsKCk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICByZXR1cm4gdGhpcy5jbG9zaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGllbnQoKTogTGFrZWJveENsaWVudCB7XG4gICAgaWYgKCF0aGlzLmFwaSkgdGhyb3cgbmV3IEVycm9yKFwiVGhlIExha2Vib3ggcnVudGltZSBoYXMgbm8gYXBwIHNlcnZpY2UtcHJpbmNpcGFsIGNyZWRlbnRpYWxzXCIpO1xuICAgIHJldHVybiB0aGlzLmFwaTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb3VyY2VzKCk6IExha2Vib3hSZXNvdXJjZVJlZ2lzdHJ5IHtcbiAgICBpZiAoIXRoaXMucmVzb3VyY2VSZWdpc3RyeSkgdGhyb3cgbmV3IEVycm9yKFwiVGhlIExha2Vib3ggcnVudGltZSBoYXMgbm8gcmVzb3VyY2UgcmVnaXN0cnlcIik7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBtYW5hZ2VkIExha2Vib3ggZW50cnksIGNhY2hlZCBicmllZmx5IHRvIGtlZXAgcm91dGVzIGNoZWFwLiAqL1xuICBwcml2YXRlIGFzeW5jIGVudHJ5KHNpZ25hbD86IEFib3J0U2lnbmFsLCBmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxMYWtlYm94RW50cnkgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIWZyZXNoICYmIHRoaXMuY2FjaGVkICYmIERhdGUubm93KCkgLSB0aGlzLmNhY2hlZC5hdCA8IEVOVFJZX1RUTF9NUykge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkLmVudHJ5O1xuICAgIH1cbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMucmVzb3VyY2VzKCkucmVhZCh0aGlzLmNsaWVudCgpLCBzaWduYWwpO1xuICAgIHRoaXMuY2FjaGVkID0geyAuLi4oZW50cnkgPyB7IGVudHJ5IH0gOiB7fSksIGF0OiBEYXRlLm5vdygpIH07XG4gICAgaWYgKCFlbnRyeSB8fCBub3JtYWxpemVMYWtlYm94U3RhdHVzKGVudHJ5LnN0YXR1cykgIT09IFwicnVubmluZ1wiKSB7XG4gICAgICB0aGlzLnJlYWR5Qm9vdEtleSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuYm9vdCAmJiAoIWVudHJ5IHx8IHRoaXMuYm9vdEtleShlbnRyeSkgIT09IHRoaXMuYm9vdC5rZXkpKSBhd2FpdCB0aGlzLmRpc2NhcmRCb290KCk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgcHJpdmF0ZSBib290S2V5KGVudHJ5OiBMYWtlYm94RW50cnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtlbnRyeS5zYW5kYm94SWR9XFwwJHtlbnRyeS5sYXN0U3RhcnRUaW1lID8/IFwiXCJ9YDtcbiAgfVxuXG4gIHByaXZhdGUgcHJvZHVjdFN0YXR1cyhlbnRyeTogTGFrZWJveEVudHJ5IHwgdW5kZWZpbmVkLCBzdGF0dXM6IExha2Vib3hTdGF0dXMpOiBMYWtlYm94U3RhdHVzIHtcbiAgICByZXR1cm4gZW50cnkgJiYgc3RhdHVzID09PSBcInJ1bm5pbmdcIiAmJiB0aGlzLnJlYWR5Qm9vdEtleSAhPT0gdGhpcy5ib290S2V5KGVudHJ5KVxuICAgICAgPyBcInN0YXJ0aW5nXCJcbiAgICAgIDogc3RhdHVzO1xuICB9XG5cbiAgLyoqIFNlcmlhbGl6ZXMgY3JlYXRlLCBzdGFydCwgY29ubmVjdCwgYW5kIGJvb3RzdHJhcCBmb3IgdGhlIGN1cnJlbnQgYm9vdC4gKi9cbiAgcHJpdmF0ZSByZWFkeShzaWduYWw/OiBBYm9ydFNpZ25hbCwgZXhwbGljaXQgPSBmYWxzZSk6IFByb21pc2U8Qm9vdD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmJvb3Q7XG4gICAgaWYgKGN1cnJlbnQgJiYgdGhpcy5jYWNoZWQ/LmVudHJ5ICYmIHRoaXMuYm9vdEtleSh0aGlzLmNhY2hlZC5lbnRyeSkgPT09IGN1cnJlbnQua2V5KSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMuY2FjaGVkLmF0IDwgRU5UUllfVFRMX01TKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnQpO1xuICAgIH1cbiAgICB0aGlzLmNvbnZlcmdpbmcgPz89IHRoaXMuY29udmVyZ2Uoc2lnbmFsLCBleHBsaWNpdCkuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLmNvbnZlcmdpbmcgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuY29udmVyZ2luZztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29udmVyZ2Uoc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCwgZXhwbGljaXQ6IGJvb2xlYW4pOiBQcm9taXNlPEJvb3Q+IHtcbiAgICBjb25zdCBvcGVyYXRpb25TaWduYWwgPSBzaWduYWxcbiAgICAgID8gQWJvcnRTaWduYWwuYW55KFtzaWduYWwsIHRoaXMuc2h1dGRvd25Db250cm9sbGVyLnNpZ25hbF0pXG4gICAgICA6IHRoaXMuc2h1dGRvd25Db250cm9sbGVyLnNpZ25hbDtcbiAgICBsZXQgZW50cnkgPSBhd2FpdCB0aGlzLmVudHJ5KG9wZXJhdGlvblNpZ25hbCwgdHJ1ZSk7XG4gICAgaWYgKCFlbnRyeSB8fCBub3JtYWxpemVMYWtlYm94U3RhdHVzKGVudHJ5LnN0YXR1cykgIT09IFwicnVubmluZ1wiKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlnLmF1dG8gJiYgIWV4cGxpY2l0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTGFrZWJveCBpcyAke2VudHJ5ID8gZW50cnkuc3RhdHVzIDogXCJub3QgY3JlYXRlZFwifTsgc3RhcnQgaXQgZXhwbGljaXRseSBiZWNhdXNlIGF1dG8gaXMgZmFsc2VgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBlbnRyeSA/Pz0gYXdhaXQgdGhpcy5yZXNvdXJjZXMoKS5nZXRPckNyZWF0ZSh0aGlzLmNsaWVudCgpLCBvcGVyYXRpb25TaWduYWwpO1xuICAgIGlmIChsYWtlYm94SWRsZVRpbWVvdXRTZWNvbmRzKGVudHJ5LmlkbGVUaW1lb3V0KSAhPT0gdGhpcy5jb25maWcuaWRsZVRpbWVvdXRTZWNvbmRzKSB7XG4gICAgICBlbnRyeSA9IGF3YWl0IHRoaXMuY2xpZW50KCkuc2V0SWRsZVRpbWVvdXQoXG4gICAgICAgIGVudHJ5LnNhbmRib3hJZCxcbiAgICAgICAgdGhpcy5jb25maWcuaWRsZVRpbWVvdXRTZWNvbmRzLFxuICAgICAgICBvcGVyYXRpb25TaWduYWwsXG4gICAgICApO1xuICAgIH1cbiAgICBlbnRyeSA9IGF3YWl0IGVuc3VyZUxha2Vib3hSdW5uaW5nKHRoaXMuY2xpZW50KCksIGVudHJ5LCBvcGVyYXRpb25TaWduYWwpO1xuICAgIHRoaXMuY2FjaGVkID0geyBlbnRyeSwgYXQ6IERhdGUubm93KCkgfTtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmJvb3RLZXkoZW50cnkpO1xuICAgIGlmICh0aGlzLmJvb3Q/LmtleSA9PT0ga2V5KSByZXR1cm4gdGhpcy5ib290O1xuICAgIGF3YWl0IHRoaXMuZGlzY2FyZEJvb3QoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGhpcy5jb25uZWN0KGVudHJ5LCBvcGVyYXRpb25TaWduYWwpO1xuICAgIGNvbnN0IGJvb3Q6IEJvb3QgPSB7XG4gICAgICBrZXksXG4gICAgICBlbnRyeSxcbiAgICAgIHNlc3Npb24sXG4gICAgICB1c2VyczogbmV3IE1hcCgpLFxuICAgICAgc2VydmljZXM6IG5ldyBNYXAoKSxcbiAgICAgIHN0YXJ0aW5nOiBuZXcgTWFwKCksXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdG9yZWQgPSBhd2FpdCB0aGlzLmJvb3RzdHJhcChzZXNzaW9uLCBvcGVyYXRpb25TaWduYWwpO1xuICAgICAgdGhpcy5tZXRyaWNzLnN0b3AoKTtcbiAgICAgIHRoaXMubWV0cmljcy5zZWVkKChhd2FpdCB0aGlzLmFkbWluKHNlc3Npb24sIFtcIm1ldHJpY3NcIl0sIG9wZXJhdGlvblNpZ25hbCkpLnN0ZG91dCk7XG4gICAgICB0aGlzLmJvb3QgPSBib290O1xuICAgICAgdGhpcy5yZWFkeUJvb3RLZXkgPSBrZXk7XG4gICAgICB0aGlzLndhdGNoSWRsZSgpO1xuICAgICAgaWYgKHRoaXMubWV0cmljcy5saXN0ZW5lckNvdW50KFwic25hcHNob3RcIikgPiAwKSB0aGlzLm1ldHJpY3Muc3RhcnQoKTtcbiAgICAgIGZvciAoY29uc3QgaGFzaCBvZiByZXN0b3JlZCkgdm9pZCB0aGlzLnJlc3RvcmVVc2VyKGJvb3QsIGhhc2gpO1xuICAgICAgcmV0dXJuIGJvb3Q7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHNlc3Npb24uY2xvc2UoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdChlbnRyeTogTGFrZWJveEVudHJ5LCBzaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTxTc2hTZXNzaW9uPiB7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3RPbmNlKGVudHJ5LCBzaWduYWwpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgYXR0ZW1wdCArPSAxO1xuICAgICAgICBpZiAoIV9pc1RyYW5zaWVudFNzaFN0YXJ0dXBFcnJvcihlcnJvcikgfHwgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCA+PSBTU0hfUkVBRFlfVElNRU9VVF9NUykge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlbGF5TXMgPSBNYXRoLm1pbihcbiAgICAgICAgICBTU0hfUkVBRFlfUkVUUllfSU5JVElBTF9NUyAqIDIgKiogKGF0dGVtcHQgLSAxKSxcbiAgICAgICAgICBTU0hfUkVBRFlfUkVUUllfTUFYX01TLFxuICAgICAgICApO1xuICAgICAgICBsb2dnZXIuaW5mbyhcIkxha2Vib3ggU1NIIGdhdGV3YXkgaXMgbm90IHJlYWR5OyByZXRyeWluZ1wiLCB7XG4gICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICBkZWxheU1zLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yU3NoUmV0cnkoZGVsYXlNcywgc2lnbmFsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHdhaXRGb3JTc2hSZXRyeShkZWxheU1zOiBudW1iZXIsIHNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gc2xlZXAoZGVsYXlNcywgc2lnbmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdE9uY2UoZW50cnk6IExha2Vib3hFbnRyeSwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8U3NoU2Vzc2lvbj4ge1xuICAgIGNvbnN0IGFwaSA9IHRoaXMuY2xpZW50KCk7XG4gICAgY29uc3Qgc2NvcGUgPSBhd2FpdCBhcGkud29ya3NwYWNlU2NvcGUoKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmtleXMuZW5zdXJlUmVnaXN0ZXJlZChhcGksIFNTSF9LRVlfT1dORVIsIHNpZ25hbCk7XG4gICAgY29uc3QgZ2F0ZXdheUhvc3QgPSBlbnRyeS5nYXRld2F5SG9zdCA/PyBrZXkuZ2F0ZXdheUhvc3Q7XG4gICAgaWYgKCFnYXRld2F5SG9zdCkgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyBMYWtlYm94IGRpZCBub3QgcmV0dXJuIGFuIFNTSCBnYXRld2F5IGhvc3RcIik7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuY29uZmlnLmdhdGV3YXlQb3J0O1xuICAgIGNvbnN0IGtub3duSG9zdCA9IGF3YWl0IHRoaXMua2V5cy5rbm93bkhvc3Qoc2NvcGUsIFNTSF9LRVlfT1dORVIsIGdhdGV3YXlIb3N0LCBwb3J0KTtcbiAgICBjb25zdCBzZXNzaW9uID0gbmV3IFNzaFNlc3Npb24oe1xuICAgICAgaG9zdDogZ2F0ZXdheUhvc3QsXG4gICAgICBwb3J0LFxuICAgICAgdXNlcm5hbWU6IGVudHJ5LnNhbmRib3hJZCxcbiAgICAgIHByaXZhdGVLZXk6IGtleS5wcml2YXRlS2V5LFxuICAgICAgcHJpdmF0ZUtleVBhdGg6IGtleS5wcml2YXRlS2V5UGF0aCxcbiAgICAgIGtub3duSG9zdHNQYXRoOiB0aGlzLmtleXMua25vd25Ib3N0c1BhdGgoc2NvcGUsIFNTSF9LRVlfT1dORVIsIGdhdGV3YXlIb3N0LCBwb3J0KSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0TXM6IHRoaXMuY29uZmlnLmNvbm5lY3RUaW1lb3V0TXMsXG4gICAgICBzc2hUcmFuc3BvcnQ6IHRoaXMuY29uZmlnLnNzaFRyYW5zcG9ydCxcbiAgICAgIHNzaDJQYXRjaDogdGhpcy5jb25maWcuc3NoMlBhdGNoLFxuICAgICAgLi4uKGtub3duSG9zdCA/IHsga25vd25Ib3N0IH0gOiB7fSksXG4gICAgICByZW1lbWJlckhvc3Q6IChmaW5nZXJwcmludCwgaG9zdEtleSkgPT5cbiAgICAgICAgdGhpcy5rZXlzLnJlbWVtYmVySG9zdChzY29wZSwgU1NIX0tFWV9PV05FUiwgZ2F0ZXdheUhvc3QsIHBvcnQsIGZpbmdlcnByaW50LCBob3N0S2V5KSxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2Vzc2lvbi5jb25uZWN0KCk7XG4gICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgc2Vzc2lvbi5jbG9zZSgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJ1bnMgdGhlIGZpeGVkIHByaXZpbGVnZWQgYm9vdHN0cmFwIGFuZCByZXR1cm5zIHRoZSByZXN0b3JlZCB1c2VyIGhhc2hlcy4gKi9cbiAgcHJpdmF0ZSBhc3luYyBib290c3RyYXAoc2Vzc2lvbjogU3NoU2Vzc2lvbiwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBoZWxwZXJzID0gT2JqZWN0LmVudHJpZXMoSEVMUEVSUykubWFwKFxuICAgICAgKFtuYW1lLCBjb250ZW50XSkgPT4gYCR7bmFtZX09JHtCdWZmZXIuZnJvbShjb250ZW50KS50b1N0cmluZyhcImJhc2U2NFwiKX1gLFxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZG1pbihzZXNzaW9uLCBbXCJib290c3RyYXBcIiwgLi4uaGVscGVyc10sIHNpZ25hbCk7XG4gICAgcmV0dXJuIHJlc3VsdC5zdGRvdXRcbiAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5zdGFydHNXaXRoKFwiX19MQUtFQk9YX1VTRVJfXz1cIikpXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKFwiX19MQUtFQk9YX1VTRVJfXz1cIi5sZW5ndGgpLnRyaW0oKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkbWluKFxuICAgIHNlc3Npb246IFNzaFNlc3Npb24sXG4gICAgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8eyBzdGRvdXQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgZW5jb2RlZCA9IEJ1ZmZlci5mcm9tKEFETUlOX1NDUklQVCkudG9TdHJpbmcoXCJiYXNlNjRcIik7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2Vzc2lvbi5leGVjdXRlUHJpdmlsZWdlZChcbiAgICAgIFwic2hcIixcbiAgICAgIFtcIi1jXCIsIGBwcmludGYgJXMgJyR7ZW5jb2RlZH0nIHwgYmFzZTY0IC1kIHwgc2ggLXMgLS0gJHthcmdzLm1hcChzaGVsbFF1b3RlKS5qb2luKFwiIFwiKX1gXSxcbiAgICAgIHsgdGltZW91dE1zOiBTRVRVUF9USU1FT1VUX01TLCAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSB9LFxuICAgICkucmVzdWx0O1xuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYExha2Vib3ggJHthcmdzWzBdfSBmYWlsZWQ6ICR7cmVzdWx0LnN0ZGVyci50cmltKCkgfHwgcmVzdWx0LnN0ZG91dC50cmltKCkgfHwgYGV4aXQgJHtyZXN1bHQuZXhpdENvZGV9YH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBNYXJrcyBhY3Rpdml0eSwgcmVhZGllcyB0aGUgY3VycmVudCBib290LCBhbmQgY29udmVyZ2VzIHRoZSB1c2VyJ3MgYWNjb3VudC4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZWFkeVVzZXIoXG4gICAgdXNlcjogTGFrZWJveFVzZXIsXG4gICAgaWRlbnRpdHk6IHN0cmluZyxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxCb290PiB7XG4gICAgdGhpcy50b3VjaCgpO1xuICAgIGNvbnN0IGJvb3QgPSBhd2FpdCB0aGlzLnJlYWR5KHNpZ25hbCk7XG4gICAgYXdhaXQgdGhpcy5jb252ZXJnZVVzZXIoYm9vdCwgdXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgcmV0dXJuIGJvb3Q7XG4gIH1cblxuICAvKiogQ3JlYXRlcyBvciB2ZXJpZmllcyB0aGUgdXNlcidzIGFjY291bnQgb25jZSBwZXIgYm9vdC4gKi9cbiAgcHJpdmF0ZSBjb252ZXJnZVVzZXIoXG4gICAgYm9vdDogQm9vdCxcbiAgICB1c2VyOiBMYWtlYm94VXNlcixcbiAgICBpZGVudGl0eTogc3RyaW5nLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgY29udmVyZ2VkID0gYm9vdC51c2Vycy5nZXQodXNlci5oYXNoKTtcbiAgICBpZiAoIWNvbnZlcmdlZCkge1xuICAgICAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoaWRlbnRpdHkudHJpbSgpLnRvTG93ZXJDYXNlKCkpLmRpZ2VzdChcImhleFwiKTtcbiAgICAgIGNvbnZlcmdlZCA9IHRoaXMuYWRtaW4oXG4gICAgICAgIGJvb3Quc2Vzc2lvbixcbiAgICAgICAgW1wiZW5zdXJlLXVzZXJcIiwgdXNlci5oYXNoLCBTdHJpbmcodXNlci51aWQpLCBkaWdlc3RdLFxuICAgICAgICBzaWduYWwsXG4gICAgICApLnRoZW4oKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIGJvb3QudXNlcnMuc2V0KHVzZXIuaGFzaCwgY29udmVyZ2VkKTtcbiAgICAgIGNvbnZlcmdlZC5jYXRjaCgoKSA9PiBib290LnVzZXJzLmRlbGV0ZSh1c2VyLmhhc2gpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnZlcmdlZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzdG9yZVVzZXIoYm9vdDogQm9vdCwgaGFzaDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXNlciA9IHsgbmFtZTogYGxha2Vib3gtJHtoYXNofWAsIGhvbWU6IGAvaG9tZS9sYWtlYm94LSR7aGFzaH1gIH07XG4gICAgYm9vdC51c2Vycy5zZXQoaGFzaCwgUHJvbWlzZS5yZXNvbHZlKCkpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBib290LnNlc3Npb24uZXhlY3V0ZShcInB5dGhvbjNcIiwgW0NPTlRST0xMRVIsIFwic3RhcnQtYWxsXCJdLCB7XG4gICAgICAgIHVzZXIsXG4gICAgICAgIHRpbWVvdXRNczogU0VUVVBfVElNRU9VVF9NUyxcbiAgICAgICAgc2lnbmFsOiB0aGlzLnNodXRkb3duQ29udHJvbGxlci5zaWduYWwsXG4gICAgICB9KS5yZXN1bHQ7XG4gICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LnN0ZGVyci50cmltKCkgfHwgYGV4aXQgJHtyZXN1bHQuZXhpdENvZGV9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgbG9nZ2VyLndhcm4oXCJMYWtlYm94IHNlcnZpY2UgcmVzdG9yZSBmYWlsZWRcIiwge1xuICAgICAgICB1c2VyOiBoYXNoLFxuICAgICAgICBlcnJvcjogdG9FcnJvcihlcnJvciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbnRyb2xsZXIoXG4gICAgYm9vdDogQm9vdCxcbiAgICB1c2VyOiBMYWtlYm94VXNlcixcbiAgICBjb21tYW5kOiBzdHJpbmcsXG4gICAgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJvb3Quc2Vzc2lvbi5leGVjdXRlKFwicHl0aG9uM1wiLCBbQ09OVFJPTExFUiwgY29tbWFuZCwgLi4uYXJnc10sIHtcbiAgICAgIHVzZXIsXG4gICAgICB0aW1lb3V0TXM6IFNFVFVQX1RJTUVPVVRfTVMsXG4gICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICB9KS5yZXN1bHQ7XG4gICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTGFrZWJveCBzZXJ2aWNlICR7Y29tbWFuZH0gZmFpbGVkOiAke3Jlc3VsdC5zdGRlcnIudHJpbSgpIHx8IGBleGl0ICR7cmVzdWx0LmV4aXRDb2RlfWB9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpIGFzIHVua25vd247XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blNlcnZpY2UoXG4gICAgYm9vdDogQm9vdCxcbiAgICB1c2VyOiBMYWtlYm94VXNlcixcbiAgICBkZWZpbml0aW9uOiBMYWtlYm94Q29udHJvbGxlckRlZmluaXRpb24sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TGFrZWJveFNlcnZpY2U+IHtcbiAgICBjb25zdCBrZXkgPSBgJHt1c2VyLmhhc2h9XFwwJHtkZWZpbml0aW9uLm5hbWV9YDtcbiAgICBjb25zdCBwZW5kaW5nID0gYm9vdC5zdGFydGluZy5nZXQoa2V5KTtcbiAgICBpZiAocGVuZGluZykgcmV0dXJuIHBlbmRpbmc7XG4gICAgY29uc3Qgb3BlcmF0aW9uID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChkZWZpbml0aW9uLmtpbmQgPT09IFwiZGVza3RvcFwiKSB7XG4gICAgICAgIGJvb3QuZGVza3RvcCA/Pz0gdGhpcy5hZG1pbihib290LnNlc3Npb24sIFtcImRlc2t0b3AtcHJlcmVxdWlzaXRlc1wiXSwgc2lnbmFsKS50aGVuKFxuICAgICAgICAgICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICAgICAgYm9vdC5kZXNrdG9wLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBib290LmRlc2t0b3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBib290LmRlc2t0b3A7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkbWluKFxuICAgICAgICBib290LnNlc3Npb24sXG4gICAgICAgIFtcImFsbG93LXBvcnRcIiwgU3RyaW5nKHVzZXIudWlkKSwgU3RyaW5nKGRlZmluaXRpb24ucG9ydCldLFxuICAgICAgICBzaWduYWwsXG4gICAgICApO1xuICAgICAgY29uc3Qgc3RhcnRlZCA9IExha2Vib3hDb250cm9sbGVyU2VydmljZVNjaGVtYS5wYXJzZShcbiAgICAgICAgYXdhaXQgdGhpcy5jb250cm9sbGVyKGJvb3QsIHVzZXIsIFwic3RhcnRcIiwgW2RlZmluaXRpb24ubmFtZV0sIHNpZ25hbCksXG4gICAgICApO1xuICAgICAgdGhpcy5jYWNoZVNlcnZpY2UoYm9vdCwgdXNlciwgc3RhcnRlZCk7XG4gICAgICByZXR1cm4gdG9MYWtlYm94U2VydmljZShzdGFydGVkLCB1c2VyLCB0aGlzLmNvbmZpZy5yb3V0ZVByZWZpeCk7XG4gICAgfSkoKS5maW5hbGx5KCgpID0+IGJvb3Quc3RhcnRpbmcuZGVsZXRlKGtleSkpO1xuICAgIGJvb3Quc3RhcnRpbmcuc2V0KGtleSwgb3BlcmF0aW9uKTtcbiAgICByZXR1cm4gb3BlcmF0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoU2VydmljZXMoXG4gICAgYm9vdDogQm9vdCxcbiAgICB1c2VyOiBMYWtlYm94VXNlcixcbiAgICBpZGVudGl0eTogc3RyaW5nLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPE1hcDxzdHJpbmcsIExha2Vib3hDb250cm9sbGVyU2VydmljZT4+IHtcbiAgICBhd2FpdCB0aGlzLmNvbnZlcmdlVXNlcihib290LCB1c2VyLCBpZGVudGl0eSwgc2lnbmFsKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCB0aGlzLmNvbnRyb2xsZXIoYm9vdCwgdXNlciwgXCJsaXN0XCIsIFtdLCBzaWduYWwpKSBhcyB7XG4gICAgICBzZXJ2aWNlcz86IHVua25vd25bXTtcbiAgICB9O1xuICAgIGNvbnN0IHNlcnZpY2VzID0gbmV3IE1hcChcbiAgICAgIChyZXNwb25zZS5zZXJ2aWNlcyA/PyBbXSkubWFwKChzZXJ2aWNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IExha2Vib3hDb250cm9sbGVyU2VydmljZVNjaGVtYS5wYXJzZShzZXJ2aWNlKTtcbiAgICAgICAgcmV0dXJuIFtwYXJzZWQubmFtZSwgcGFyc2VkXSBhcyBjb25zdDtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgYm9vdC5zZXJ2aWNlcy5zZXQodXNlci5oYXNoLCBzZXJ2aWNlcyk7XG4gICAgdGhpcy5sYXN0U2VydmljZXMuc2V0KHVzZXIuaGFzaCwgc2VydmljZXMpO1xuICAgIGNvbnN0IG9ic2VydmVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgdGhpcy5sYXN0U2VydmljZXNPYnNlcnZlZEF0LnNldCh1c2VyLmhhc2gsIG9ic2VydmVkQXQpO1xuICAgIGF3YWl0IHRoaXMucGVyc2lzdFNlcnZpY2VTbmFwc2hvdChib290LmVudHJ5LCB1c2VyLCBzZXJ2aWNlcywgb2JzZXJ2ZWRBdCk7XG4gICAgcmV0dXJuIHNlcnZpY2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWNoZVNlcnZpY2UoYm9vdDogQm9vdCwgdXNlcjogTGFrZWJveFVzZXIsIHNlcnZpY2U6IExha2Vib3hDb250cm9sbGVyU2VydmljZSk6IHZvaWQge1xuICAgIGNvbnN0IHNlcnZpY2VzID0gYm9vdC5zZXJ2aWNlcy5nZXQodXNlci5oYXNoKSA/PyBuZXcgTWFwPHN0cmluZywgTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlPigpO1xuICAgIHNlcnZpY2VzLnNldChzZXJ2aWNlLm5hbWUsIHNlcnZpY2UpO1xuICAgIGJvb3Quc2VydmljZXMuc2V0KHVzZXIuaGFzaCwgc2VydmljZXMpO1xuICAgIHRoaXMubGFzdFNlcnZpY2VzLnNldCh1c2VyLmhhc2gsIHNlcnZpY2VzKTtcbiAgICBjb25zdCBvYnNlcnZlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIHRoaXMubGFzdFNlcnZpY2VzT2JzZXJ2ZWRBdC5zZXQodXNlci5oYXNoLCBvYnNlcnZlZEF0KTtcbiAgICB2b2lkIHRoaXMucGVyc2lzdFNlcnZpY2VTbmFwc2hvdChib290LmVudHJ5LCB1c2VyLCBzZXJ2aWNlcywgb2JzZXJ2ZWRBdCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlcnZpY2VMaXN0aW5nKFxuICAgIGlkZW50aXR5OiBzdHJpbmcsXG4gICAgdXNlcjogTGFrZWJveFVzZXIsXG4gICAgZW50cnk6IExha2Vib3hFbnRyeSB8IHVuZGVmaW5lZCxcbiAgICBzdGF0dXM6IExha2Vib3hTdGF0dXMsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8U2VydmljZUxpc3Rpbmc+IHtcbiAgICBpZiAoIWVudHJ5IHx8IHN0YXR1cyA9PT0gXCJtaXNzaW5nXCIpIHtcbiAgICAgIHJldHVybiB7IHNlcnZpY2VzOiB0aGlzLmlkbGVTZXJ2aWNlcyh1c2VyKSwgc3RhbGU6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IFwicnVubmluZ1wiICYmIHRoaXMuYm9vdD8ua2V5ID09PSB0aGlzLmJvb3RLZXkoZW50cnkpKSB7XG4gICAgICBjb25zdCBzZXJ2aWNlcyA9IGF3YWl0IHRoaXMucmVmcmVzaFNlcnZpY2VzKHRoaXMuYm9vdCwgdXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgICByZXR1cm4geyBzZXJ2aWNlczogdGhpcy53aXRoQnVpbHRJbnModXNlciwgc2VydmljZXMpLCBzdGFsZTogZmFsc2UgfTtcbiAgICB9XG4gICAgY29uc3QgbWVtb3J5ID0gdGhpcy5sYXN0U2VydmljZXMuZ2V0KHVzZXIuaGFzaCk7XG4gICAgaWYgKG1lbW9yeSkge1xuICAgICAgY29uc3Qgb2JzZXJ2ZWRBdCA9IHRoaXMubGFzdFNlcnZpY2VzT2JzZXJ2ZWRBdC5nZXQodXNlci5oYXNoKTtcbiAgICAgIGNvbnN0IHNlcnZpY2VzID1cbiAgICAgICAgc3RhdHVzID09PSBcInJ1bm5pbmdcIlxuICAgICAgICAgID8gbWVtb3J5XG4gICAgICAgICAgOiBzdG9wcGVkU25hcHNob3RTZXJ2aWNlcyh7XG4gICAgICAgICAgICAgIG9ic2VydmVkQXQ6IG9ic2VydmVkQXQgPz8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICBkZWZpbml0aW9uczogWy4uLm1lbW9yeS52YWx1ZXMoKV0ubWFwKChzZXJ2aWNlKSA9PiBzZXJ2aWNlLmRlZmluaXRpb24pLFxuICAgICAgICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXJ2aWNlczogdGhpcy53aXRoQnVpbHRJbnModXNlciwgc2VydmljZXMpLFxuICAgICAgICBzdGFsZTogdHJ1ZSxcbiAgICAgICAgLi4uKG9ic2VydmVkQXQgPyB7IG9ic2VydmVkQXQgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdGhpcy5zZXJ2aWNlU25hcHNob3RzPy5yZWFkKGVudHJ5LnNhbmRib3hJZCwgdXNlci5oYXNoKTtcbiAgICByZXR1cm4gc25hcHNob3RcbiAgICAgID8ge1xuICAgICAgICAgIHNlcnZpY2VzOiB0aGlzLndpdGhCdWlsdElucyh1c2VyLCBzdG9wcGVkU25hcHNob3RTZXJ2aWNlcyhzbmFwc2hvdCkpLFxuICAgICAgICAgIHN0YWxlOiB0cnVlLFxuICAgICAgICAgIG9ic2VydmVkQXQ6IHNuYXBzaG90Lm9ic2VydmVkQXQsXG4gICAgICAgIH1cbiAgICAgIDogeyBzZXJ2aWNlczogdGhpcy5pZGxlU2VydmljZXModXNlciksIHN0YWxlOiB0cnVlIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBlcnNpc3RTZXJ2aWNlU25hcHNob3QoXG4gICAgZW50cnk6IExha2Vib3hFbnRyeSxcbiAgICB1c2VyOiBMYWtlYm94VXNlcixcbiAgICBzZXJ2aWNlczogUmVhZG9ubHlNYXA8c3RyaW5nLCBMYWtlYm94Q29udHJvbGxlclNlcnZpY2U+LFxuICAgIG9ic2VydmVkQXQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlU25hcHNob3RzPy53cml0ZShlbnRyeS5zYW5kYm94SWQsIHVzZXIuaGFzaCwge1xuICAgICAgb2JzZXJ2ZWRBdCxcbiAgICAgIGRlZmluaXRpb25zOiBbLi4uc2VydmljZXMudmFsdWVzKCldLm1hcCgoc2VydmljZSkgPT4gc2VydmljZS5kZWZpbml0aW9uKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgd2l0aEJ1aWx0SW5zKFxuICAgIHVzZXI6IExha2Vib3hVc2VyLFxuICAgIHNlcnZpY2VzOiBSZWFkb25seU1hcDxzdHJpbmcsIExha2Vib3hDb250cm9sbGVyU2VydmljZT4sXG4gICk6IExha2Vib3hTZXJ2aWNlW10ge1xuICAgIGNvbnN0IGJ1aWx0SW5zID0gTEFLRUJPWF9CVUlMVF9JTl9TRVJWSUNFUy5tYXAoKHsgbmFtZSB9KSA9PiB7XG4gICAgICBjb25zdCBzYXZlZCA9IHNlcnZpY2VzLmdldChuYW1lKTtcbiAgICAgIHJldHVybiBzYXZlZFxuICAgICAgICA/IHRvTGFrZWJveFNlcnZpY2Uoc2F2ZWQsIHVzZXIsIHRoaXMuY29uZmlnLnJvdXRlUHJlZml4KVxuICAgICAgICA6IGlkbGVCdWlsdEluU2VydmljZShuYW1lLCB1c2VyLCB0aGlzLmNvbmZpZy5yb3V0ZVByZWZpeCk7XG4gICAgfSk7XG4gICAgY29uc3QgY3VzdG9tID0gWy4uLnNlcnZpY2VzLnZhbHVlcygpXVxuICAgICAgLmZpbHRlcigoc2VydmljZSkgPT4gIUxBS0VCT1hfQlVJTFRfSU5fU0VSVklDRVMuc29tZSgoeyBuYW1lIH0pID0+IG5hbWUgPT09IHNlcnZpY2UubmFtZSkpXG4gICAgICAubWFwKChzZXJ2aWNlKSA9PiB0b0xha2Vib3hTZXJ2aWNlKHNlcnZpY2UsIHVzZXIsIHRoaXMuY29uZmlnLnJvdXRlUHJlZml4KSk7XG4gICAgcmV0dXJuIFsuLi5idWlsdElucywgLi4uY3VzdG9tXTtcbiAgfVxuXG4gIHByaXZhdGUgaWRsZVNlcnZpY2VzKHVzZXI6IExha2Vib3hVc2VyKTogTGFrZWJveFNlcnZpY2VbXSB7XG4gICAgcmV0dXJuIExBS0VCT1hfQlVJTFRfSU5fU0VSVklDRVMubWFwKCh7IG5hbWUgfSkgPT5cbiAgICAgIGlkbGVCdWlsdEluU2VydmljZShuYW1lIGFzIExha2Vib3hCdWlsdEluU2VydmljZU5hbWUsIHVzZXIsIHRoaXMuY29uZmlnLnJvdXRlUHJlZml4KSxcbiAgICApO1xuICB9XG5cbiAgLyoqIFJlc29sdmVzIG9uZSByb3V0ZWQgcmVxdWVzdCwgd2FraW5nIHRoZSBMYWtlYm94IG9yIHNlcnZpY2UgaW4gdGhlIGJhY2tncm91bmQuICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVJvdXRlKHVzZXI6IExha2Vib3hVc2VyLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPExha2Vib3hSb3V0ZVJlc29sdXRpb24+IHtcbiAgICB0aGlzLnRvdWNoKCk7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmVudHJ5KCk7XG4gICAgY29uc3QgcnVubmluZyA9IGVudHJ5ICYmIG5vcm1hbGl6ZUxha2Vib3hTdGF0dXMoZW50cnkuc3RhdHVzKSA9PT0gXCJydW5uaW5nXCI7XG4gICAgY29uc3QgYm9vdCA9IHRoaXMuYm9vdDtcbiAgICBpZiAoIXJ1bm5pbmcgfHwgIWJvb3QgfHwgYm9vdC5rZXkgIT09IHRoaXMuYm9vdEtleShlbnRyeSkpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcuYXV0bykgcmV0dXJuIHsga2luZDogXCJtaXNzaW5nXCIgfTtcbiAgICAgIHRoaXMud2FrZSgoKSA9PiB0aGlzLnJlYWR5KCkpO1xuICAgICAgcmV0dXJuIHsga2luZDogXCJsb2FkaW5nXCIgfTtcbiAgICB9XG4gICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLnJvdXRlZElkZW50aXRpZXMuZ2V0KHVzZXIuaGFzaCk7XG4gICAgaWYgKCFpZGVudGl0eSkgcmV0dXJuIHsga2luZDogXCJtaXNzaW5nXCIgfTtcbiAgICBsZXQgc2VydmljZSA9IGJvb3Quc2VydmljZXMuZ2V0KHVzZXIuaGFzaCk/LmdldChuYW1lKTtcbiAgICBpZiAoIXNlcnZpY2UpIHNlcnZpY2UgPSAoYXdhaXQgdGhpcy5yZWZyZXNoU2VydmljZXMoYm9vdCwgdXNlciwgaWRlbnRpdHkpKS5nZXQobmFtZSk7XG4gICAgY29uc3QgYnVpbHRJbiA9IGxha2Vib3hCdWlsdEluU2VydmljZU5hbWVTY2hlbWEuc2FmZVBhcnNlKG5hbWUpO1xuICAgIGlmICghc2VydmljZSAmJiAhYnVpbHRJbi5zdWNjZXNzKSByZXR1cm4geyBraW5kOiBcIm1pc3NpbmdcIiB9O1xuICAgIGlmIChzZXJ2aWNlPy5zdGF0ZSA9PT0gXCJyZWFkeVwiKSB7XG4gICAgICByZXR1cm4geyBraW5kOiBcInJlYWR5XCIsIHNlc3Npb246IGJvb3Quc2Vzc2lvbiwgcm91dGU6IHNlcnZpY2VSb3V0ZShzZXJ2aWNlLmRlZmluaXRpb24pIH07XG4gICAgfVxuICAgIGlmIChzZXJ2aWNlPy5zdGF0ZSA9PT0gXCJlcnJvclwiICYmICFib290LnN0YXJ0aW5nLmhhcyhgJHt1c2VyLmhhc2h9XFwwJHtuYW1lfWApKSB7XG4gICAgICByZXR1cm4geyBraW5kOiBcImZhaWxlZFwiLCBtZXNzYWdlOiBzZXJ2aWNlLmVycm9yID8/IFwidGhlIHNlcnZpY2UgZmFpbGVkIHRvIHN0YXJ0XCIgfTtcbiAgICB9XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IHNlcnZpY2U/LmRlZmluaXRpb24gPz8gYnVpbHRJbkRlZmluaXRpb24oYnVpbHRJbi5kYXRhISwgdXNlcik7XG4gICAgdGhpcy53YWtlKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghc2VydmljZSkgYXdhaXQgdGhpcy5jb250cm9sbGVyKGJvb3QsIHVzZXIsIFwicHV0XCIsIFtlbmNvZGUoZGVmaW5pdGlvbildKTtcbiAgICAgIGF3YWl0IHRoaXMucnVuU2VydmljZShib290LCB1c2VyLCBkZWZpbml0aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyBraW5kOiBcImxvYWRpbmdcIiB9O1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrVW5hdmFpbGFibGUodXNlcjogTGFrZWJveFVzZXIsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYm9vdD8uc2VydmljZXMuZ2V0KHVzZXIuaGFzaCk/LmRlbGV0ZShuYW1lKTtcbiAgICB0aGlzLmNhY2hlZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgd2FrZShhY3Rpb246ICgpID0+IFByb21pc2U8dW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy53YWtpbmcpIHJldHVybjtcbiAgICB0aGlzLndha2luZyA9IGFjdGlvbigpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dnZXIud2FybihcIkxha2Vib3ggd2FrZSBmYWlsZWRcIiwgeyBlcnJvcjogdG9FcnJvcihlcnJvcikgfSkpXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIHRoaXMud2FraW5nID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRNZXRyaWNzKHNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGJvb3QgPSB0aGlzLmJvb3Q7XG4gICAgaWYgKCFib290KSB0aHJvdyBuZXcgRXJyb3IoXCJMYWtlYm94IGlzIG5vdCBydW5uaW5nXCIpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGF3YWl0IHRoaXMuYWRtaW4oYm9vdC5zZXNzaW9uLCBbXCJtZXRyaWNzXCJdLCBzaWduYWwpKS5zdGRvdXQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuY2FjaGVkID0gdW5kZWZpbmVkO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsZWFzZU1ldHJpY3MoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmJvb3QpIHJldHVybjtcbiAgICB0aGlzLm1ldHJpY3Muc3RhcnQoKTtcbiAgICBpZiAodGhpcy5tZXRyaWNzTGVhc2UpIGNsZWFyVGltZW91dCh0aGlzLm1ldHJpY3NMZWFzZSk7XG4gICAgdGhpcy5tZXRyaWNzTGVhc2UgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm1ldHJpY3MubGlzdGVuZXJDb3VudChcInNuYXBzaG90XCIpID09PSAwKSB0aGlzLm1ldHJpY3Muc3RvcCgpO1xuICAgIH0sIE1FVFJJQ1NfTEVBU0VfTVMpO1xuICAgIHRoaXMubWV0cmljc0xlYXNlLnVucmVmPy4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgU1NIIHNlc3Npb24gYWZ0ZXIgdGhlIGlkbGUgdGltZW91dCB3aXRob3V0IGNvbW1hbmRzLCBzZXJ2aWNlXG4gICAqIG9wZXJhdGlvbnMsIHJvdXRlZCB0cmFmZmljLCBvcGVuIHN0cmVhbXMsIG9yIG1ldHJpY3Mgd2F0Y2hlcnMuIEFuIG9wZW5cbiAgICogc2Vzc2lvbiBjb3VudHMgYXMgYWN0aXZpdHkgZm9yIHRoZSBwbGF0Zm9ybSB3YXRjaGRvZywgc28gcmVsZWFzaW5nIGl0IGxldHNcbiAgICogdGhlIHBsYXRmb3JtIHN0b3AgdGhlIExha2Vib3ggYWZ0ZXIgaXRzIG93biBpZGxlIHRpbWVvdXQuIFRoZSBuZXh0IHJlcXVlc3RcbiAgICogcmVjb25uZWN0cy5cbiAgICovXG4gIHByaXZhdGUgd2F0Y2hJZGxlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlkbGVUaW1lcikgY2xlYXJJbnRlcnZhbCh0aGlzLmlkbGVUaW1lcik7XG4gICAgdGhpcy5pZGxlVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBpZGxlTXMgPSBEYXRlLm5vdygpIC0gdGhpcy5sYXN0QWN0aXZpdHk7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLmJvb3QgfHxcbiAgICAgICAgdGhpcy5jb252ZXJnaW5nIHx8XG4gICAgICAgIGlkbGVNcyA8IHRoaXMuY29uZmlnLmlkbGVUaW1lb3V0U2Vjb25kcyAqIDFfMDAwIHx8XG4gICAgICAgIHRoaXMuYWN0aXZlQ29tbWFuZHMgPiAwIHx8XG4gICAgICAgIHRoaXMuYm9vdC5zdGFydGluZy5zaXplID4gMCB8fFxuICAgICAgICB0aGlzLnJvdXRlcy5hY3RpdmVDb25uZWN0aW9ucygpID4gMCB8fFxuICAgICAgICB0aGlzLm1ldHJpY3MubGlzdGVuZXJDb3VudChcInNuYXBzaG90XCIpID4gMFxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLnJvdXRlcy5hY3RpdmVDb25uZWN0aW9ucygpID4gMCB8fCB0aGlzLmFjdGl2ZUNvbW1hbmRzID4gMCkgdGhpcy50b3VjaCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2dnZXIuaW5mbyhcInJlbGVhc2luZyBpZGxlIExha2Vib3ggc2Vzc2lvblwiLCB7IGlkbGVTZWNvbmRzOiBNYXRoLnJvdW5kKGlkbGVNcyAvIDFfMDAwKSB9KTtcbiAgICAgIHZvaWQgdGhpcy5kaXNjYXJkQm9vdCgpO1xuICAgIH0sIElETEVfQ0hFQ0tfTVMpO1xuICAgIHRoaXMuaWRsZVRpbWVyLnVucmVmPy4oKTtcbiAgfVxuXG4gIHByaXZhdGUgdG91Y2goKTogdm9pZCB7XG4gICAgdGhpcy5sYXN0QWN0aXZpdHkgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXNjYXJkQm9vdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pZGxlVGltZXIpIGNsZWFySW50ZXJ2YWwodGhpcy5pZGxlVGltZXIpO1xuICAgIHRoaXMuaWRsZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGJvb3QgPSB0aGlzLmJvb3Q7XG4gICAgdGhpcy5ib290ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubWV0cmljcy5zdG9wKCk7XG4gICAgYXdhaXQgdGhpcy5yb3V0ZXMuY2xvc2VCcmlkZ2VzKCk7XG4gICAgYXdhaXQgYm9vdD8uc2Vzc2lvbi5jbG9zZSgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5jb2RlKGRlZmluaXRpb246IExha2Vib3hDb250cm9sbGVyRGVmaW5pdGlvbik6IHN0cmluZyB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShkZWZpbml0aW9uKSkudG9TdHJpbmcoXCJiYXNlNjRcIik7XG59XG5cbmZ1bmN0aW9uIHNoZWxsUXVvdGUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJyR7dmFsdWUucmVwbGFjZUFsbChcIidcIiwgXCInXFxcXCcnXCIpfSdgO1xufVxuXG4vKiogUmV0dXJucyB3aGV0aGVyIGFuIGVycm9yIG1lYW5zIHRoZSBtYW5hZ2VkIExha2Vib3ggbm8gbG9uZ2VyIGV4aXN0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xha2Vib3hNaXNzaW5nKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIExha2Vib3hBcGlFcnJvciAmJiBlcnJvci5zdGF0dXMgPT09IDQwNDtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -19,7 +19,7 @@
19
19
  "projen": "projen"
20
20
  },
21
21
  "devDependencies": {
22
- "@dbx-tools/auth": "^0.9.157",
22
+ "@dbx-tools/auth": "^0.9.159",
23
23
  "@types/express": "^5.0.5",
24
24
  "@types/json-schema": "^7",
25
25
  "@types/node": "^24.6.0",
@@ -29,14 +29,14 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "@databricks/appkit": "0.81.0",
32
- "@dbx-tools/appkit": "^0.9.157",
33
- "@dbx-tools/appkit-mastra": "^0.9.157",
34
- "@dbx-tools/core": "^0.9.157",
35
- "@dbx-tools/lakebox": "^0.9.157",
36
- "@dbx-tools/postgres": "^0.9.157",
37
- "@dbx-tools/shared-core": "^0.9.157",
38
- "@dbx-tools/shared-lakebox": "^0.9.157",
39
- "@dbx-tools/ui": "^0.9.157",
32
+ "@dbx-tools/appkit": "^0.9.159",
33
+ "@dbx-tools/appkit-mastra": "^0.9.159",
34
+ "@dbx-tools/core": "^0.9.159",
35
+ "@dbx-tools/lakebox": "^0.9.159",
36
+ "@dbx-tools/postgres": "^0.9.159",
37
+ "@dbx-tools/shared-core": "^0.9.159",
38
+ "@dbx-tools/shared-lakebox": "^0.9.159",
39
+ "@dbx-tools/ui": "^0.9.159",
40
40
  "@mastra/core": "1.71.0",
41
41
  "http-proxy-3": "^1.23.1",
42
42
  "zod": "4.3.6"
@@ -55,7 +55,7 @@
55
55
  "./package.json": "./package.json"
56
56
  }
57
57
  },
58
- "version": "0.9.157",
58
+ "version": "0.9.159",
59
59
  "types": "./lib/index.d.ts",
60
60
  "dbxToolsConfig": {
61
61
  "tags": [
package/src/runtime.ts CHANGED
@@ -17,7 +17,7 @@ import {
17
17
  type LakeboxAuth,
18
18
  type LakeboxEntry,
19
19
  } from "@dbx-tools/lakebox";
20
- import { log, toError } from "@dbx-tools/shared-core";
20
+ import { errorNodes, log, sleep, toError } from "@dbx-tools/shared-core";
21
21
  import {
22
22
  LAKEBOX_BUILT_IN_SERVICES,
23
23
  lakeboxBuiltInServiceNameSchema,
@@ -61,6 +61,16 @@ const HELPERS = {
61
61
  const CONTROLLER = `${LAKEBOX_RUNTIME_ROOT}/bin/lakebox-service`;
62
62
  const ENTRY_TTL_MS = 5_000;
63
63
  const SETUP_TIMEOUT_MS = 600_000;
64
+ const SSH_READY_TIMEOUT_MS = 300_000;
65
+ const SSH_READY_RETRY_INITIAL_MS = 1_000;
66
+ const SSH_READY_RETRY_MAX_MS = 10_000;
67
+ const TRANSIENT_SSH_CODES = new Set([
68
+ "ECONNREFUSED",
69
+ "ECONNRESET",
70
+ "EHOSTUNREACH",
71
+ "ENETUNREACH",
72
+ "ETIMEDOUT",
73
+ ]);
64
74
  const METRICS_LEASE_MS = 60_000;
65
75
  const IDLE_CHECK_MS = 30_000;
66
76
  const SSH_KEY_OWNER = "app-service-principal";
@@ -69,6 +79,16 @@ const LEGACY_NAME =
69
79
  const LEGACY_SCHEMA_PREFIX = "dbx_tools_databricks_sandbox";
70
80
  const logger = log.logger("appkit-lakebox:runtime");
71
81
 
82
+ /** Whether the platform is running but its SSH gateway is still becoming reachable. */
83
+ function _isTransientSshStartupError(error: unknown): boolean {
84
+ return [...errorNodes(error)].some(
85
+ (node) =>
86
+ typeof node === "object" &&
87
+ "code" in node &&
88
+ TRANSIENT_SSH_CODES.has(String((node as { code?: unknown }).code)),
89
+ );
90
+ }
91
+
72
92
  /** Resolves the authenticated identity for raw request headers. */
73
93
  export type LakeboxIdentityResolver = (headers: IncomingHttpHeaders) => string | undefined;
74
94
 
@@ -552,6 +572,34 @@ export class LakeboxRuntime {
552
572
  }
553
573
 
554
574
  private async connect(entry: LakeboxEntry, signal: AbortSignal): Promise<SshSession> {
575
+ const startedAt = Date.now();
576
+ let attempt = 0;
577
+ while (true) {
578
+ try {
579
+ return await this.connectOnce(entry, signal);
580
+ } catch (error) {
581
+ attempt += 1;
582
+ if (!_isTransientSshStartupError(error) || Date.now() - startedAt >= SSH_READY_TIMEOUT_MS) {
583
+ throw error;
584
+ }
585
+ const delayMs = Math.min(
586
+ SSH_READY_RETRY_INITIAL_MS * 2 ** (attempt - 1),
587
+ SSH_READY_RETRY_MAX_MS,
588
+ );
589
+ logger.info("Lakebox SSH gateway is not ready; retrying", {
590
+ attempt,
591
+ delayMs,
592
+ });
593
+ await this.waitForSshRetry(delayMs, signal);
594
+ }
595
+ }
596
+ }
597
+
598
+ private waitForSshRetry(delayMs: number, signal: AbortSignal): Promise<void> {
599
+ return sleep(delayMs, signal);
600
+ }
601
+
602
+ private async connectOnce(entry: LakeboxEntry, signal: AbortSignal): Promise<SshSession> {
555
603
  const api = this.client();
556
604
  const scope = await api.workspaceScope();
557
605
  const key = await this.keys.ensureRegistered(api, SSH_KEY_OWNER, signal);