velocious 1.0.641 → 1.0.643

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.
Files changed (60) hide show
  1. package/README.md +25 -2
  2. package/build/authorization/base-resource.js +18 -5
  3. package/build/background-jobs/main.js +21 -6
  4. package/build/background-jobs/store.js +116 -7
  5. package/build/configuration-types.js +34 -2
  6. package/build/database/record/index.js +42 -11
  7. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +17 -3
  8. package/build/frontend-model-controller.js +10 -5
  9. package/build/frontend-model-resource/base-resource.js +95 -41
  10. package/build/frontend-models/base.js +1 -1
  11. package/build/src/authorization/base-resource.d.ts +19 -6
  12. package/build/src/authorization/base-resource.d.ts.map +1 -1
  13. package/build/src/authorization/base-resource.js +16 -6
  14. package/build/src/background-jobs/main.d.ts +3 -2
  15. package/build/src/background-jobs/main.d.ts.map +1 -1
  16. package/build/src/background-jobs/main.js +26 -7
  17. package/build/src/background-jobs/store.d.ts +16 -0
  18. package/build/src/background-jobs/store.d.ts.map +1 -1
  19. package/build/src/background-jobs/store.js +103 -7
  20. package/build/src/configuration-types.d.ts +72 -5
  21. package/build/src/configuration-types.d.ts.map +1 -1
  22. package/build/src/configuration-types.js +31 -3
  23. package/build/src/database/record/index.d.ts +44 -46
  24. package/build/src/database/record/index.d.ts.map +1 -1
  25. package/build/src/database/record/index.js +39 -12
  26. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  27. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +19 -4
  28. package/build/src/frontend-model-controller.d.ts +1 -1
  29. package/build/src/frontend-model-controller.d.ts.map +1 -1
  30. package/build/src/frontend-model-controller.js +9 -6
  31. package/build/src/frontend-model-resource/base-resource.d.ts +66 -32
  32. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  33. package/build/src/frontend-model-resource/base-resource.js +89 -42
  34. package/build/src/frontend-models/base.d.ts +1 -0
  35. package/build/src/frontend-models/base.d.ts.map +1 -1
  36. package/build/src/frontend-models/base.js +2 -2
  37. package/build/src/sync/sync-api-controller.d.ts.map +1 -1
  38. package/build/src/sync/sync-api-controller.js +6 -5
  39. package/build/src/sync/sync-envelope-replay-service.d.ts +1 -1
  40. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  41. package/build/src/sync/sync-envelope-replay-service.js +3 -2
  42. package/build/src/sync/sync-resource-base.d.ts +2 -0
  43. package/build/src/sync/sync-resource-base.d.ts.map +1 -1
  44. package/build/src/sync/sync-resource-base.js +3 -1
  45. package/build/sync/sync-api-controller.js +5 -5
  46. package/build/sync/sync-envelope-replay-service.js +2 -1
  47. package/build/sync/sync-resource-base.js +3 -0
  48. package/package.json +1 -1
  49. package/src/authorization/base-resource.js +18 -5
  50. package/src/background-jobs/main.js +21 -6
  51. package/src/background-jobs/store.js +116 -7
  52. package/src/configuration-types.js +34 -2
  53. package/src/database/record/index.js +42 -11
  54. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +17 -3
  55. package/src/frontend-model-controller.js +10 -5
  56. package/src/frontend-model-resource/base-resource.js +95 -41
  57. package/src/frontend-models/base.js +1 -1
  58. package/src/sync/sync-api-controller.js +5 -5
  59. package/src/sync/sync-envelope-replay-service.js +2 -1
  60. package/src/sync/sync-resource-base.js +3 -0
@@ -1 +1 @@
1
- {"version":3,"file":"sync-resource-base.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-resource-base.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-resource-base.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-resource-base.js"],"names":[],"mappings":"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"}
@@ -33,6 +33,8 @@ const QUICK_SEARCH_COLUMN = "quickSearch";
33
33
  * @augments {FrontendModelBaseResource<TModelClass>}
34
34
  */
35
35
  export default class SyncResourceBase extends FrontendModelBaseResource {
36
+ /** @type {typeof import("../database/record/index.js").default | undefined} */
37
+ static ModelClass = undefined;
36
38
  /**
37
39
  * Replay service class handling replay mutations for this resource,
38
40
  * declared instead of overriding {@link SyncResourceBase#replayServiceClass}.
@@ -257,4 +259,4 @@ export default class SyncResourceBase extends FrontendModelBaseResource {
257
259
  return ResourceClass.ReplayServiceClass ?? SharedResource?.ReplayServiceClass ?? SyncEnvelopeReplayService;
258
260
  }
259
261
  }
260
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1yZXNvdXJjZS1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1yZXNvdXJjZS1iYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFFNUMsT0FBTyx5QkFBeUIsTUFBTSw2Q0FBNkMsQ0FBQTtBQUNuRixPQUFPLHlCQUF5QixNQUFNLG1DQUFtQyxDQUFBO0FBQ3pFLE9BQU8sMEJBQTBCLE1BQU0scUNBQXFDLENBQUE7QUFDNUUsT0FBTyxFQUFDLG9DQUFvQyxFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDaEYsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFFbEQ7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUE7QUFFekM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLGdCQUFpQixTQUFRLHlCQUF5QjtJQUNyRTs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQTtJQUVyQzs7OztpQ0FJNkI7SUFDN0IsTUFBTSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQTtJQUVoQzs7Ozs7OztPQU9HO0lBQ0gsNkJBQTZCLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQztRQUN2RCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQztZQUFFLE9BQU07UUFFbEQsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsZ0JBQWdCLENBQUMsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDO1FBQzlCLE1BQU0s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QUFNLGFBQWEsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUMvRSxNQUFNLGNBQWMsR0FBRyw2Q0FBNkMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFBO1FBRWxILE9BQU8sYUFBYSxDQUFDLGtCQUFrQixJQUFJLGNBQWMsRUFBRSxrQkFBa0IsSUFBSSx5QkFBeUIsQ0FBQTtJQUM1RyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtmb3JjZWROb25CbGFua1N0cmluZ30gZnJvbSBcInR5cGFuaWNcIlxuXG5pbXBvcnQgRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiXG5pbXBvcnQgU3luY0VudmVsb3BlUmVwbGF5U2VydmljZSBmcm9tIFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCJcbmltcG9ydCBTeW5jTW9kZWxDaGFuZ2VGZWVkU2VydmljZSBmcm9tIFwiLi9zeW5jLW1vZGVsLWNoYW5nZS1mZWVkLXNlcnZpY2UuanNcIlxuaW1wb3J0IHtzeW5jVXBzdHJlYW1JbXBvcnRlckZvckNvbmZpZ3VyYXRpb259IGZyb20gXCIuL3N5bmMtdXBzdHJlYW0taW1wb3J0ZXIuanNcIlxuaW1wb3J0IFZlbG9jaW91c0Vycm9yIGZyb20gXCIuLi92ZWxvY2lvdXMtZXJyb3IuanNcIlxuXG4vKipcbiAqIE9wdGlvbmFsIGNsaWVudC1kZWNsYXJlZCBzeW5jIHNjb3BlIGNhcnJpZWQgb24gYSBjaGFuZ2VzIHJlcXVlc3QuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gY29uZGl0aW9ucyAtIFBsYWluIGF0dHJpYnV0ZSBjb25kaXRpb25zIGZyb20gdGhlIGNsaWVudCBxdWVyeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcmVzb3VyY2VUeXBlIC0gQ2xpZW50IHJlc291cmNlL21vZGVsIG5hbWUgdGhlIHNjb3BlIHdhcyBkZWNsYXJlZCBmb3IsIG9yIG51bGwgZm9yIHRoZSBhbGwtdHlwZXMgKHVzZXIpIHNjb3BlOiBvbmUgc2NvcGUgY292ZXJpbmcgZXZlcnkgcmVzb3VyY2UgdHlwZSB0aGlzIHJlc291cmNlIGF1dGhvcml6ZXMgZm9yIHRoZSBjYWxsZXIsIHNvIGEgc3luYyBhdXRob3JpemVzIG9uY2UgaG93ZXZlciBtYW55IHR5cGVzIGl0IHNlcnZlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW10gfCBudWxsfSByZXNvdXJjZVR5cGVzIC0gRm9yIHRoZSBhbGwtdHlwZXMgc2NvcGUsIHRoZSByZXNvdXJjZSB0eXBlcyB0aGUgY2xpZW50IGNhbiBhcHBseS4gQSBjaGVhcCBkZWxpdmVyeS90eXBlIGZpbHRlciBvbmx5IC0gaXQgbmFycm93cywgbmV2ZXIgd2lkZW5zLCB3aGF0IHRoZSBhcHAncyBhdXRob3JpemF0aW9uIGFscmVhZHkgYWxsb3dzLiBOdWxsIGZvciBhIHR5cGUtZGVjbGFyZWQgc2NvcGUuXG4gKi9cblxuLyoqXG4gKiBPbmUgcHVibGlzaGVkIHN5bmMgZW50cnkgYXMgZGVsaXZlcmVkIHRvIHRoZSBwZXItZGVsaXZlcnkgYWNjZXNzIHJlLWNoZWNrXG4gKiAoe0BsaW5rIFN5bmNSZXNvdXJjZUJhc2UjY2hhbmdlRGVsaXZlcmFibGV9KTogdGhlIGNvbXBsZXRlIGJyb2FkY2FzdCBzeW5jXG4gKiBlbnRyeSDigJQgaW5jbHVkaW5nIHRoZSBpbW11dGFibGUgc3luYy1yb3cgaWQsIGFjdG9yLXNwZWNpZmljIG1ldGFkYXRhLCBhbmRcbiAqIGFueSBvdGhlciBhcHAgZmllbGRzIHRoZSBwdWJsaXNoZXIgcHV0IG9uIGl0IOKAlCB3aXRoIGByZXNvdXJjZUlkYCBhbmRcbiAqIGByZXNvdXJjZVR5cGVgIG5vcm1hbGl6ZWQgdG8gc3RyaW5ncy4gQXBwcyBhdXRob3JpemluZyBieSBleGFjdC1yb3dcbiAqIGlkZW50aXR5IHJlYWQgdGhlIGV4dHJhIGZpZWxkczsgb3ZlcnJpZGVzIHRoYXQgb25seSByZWFkXG4gKiBgcmVzb3VyY2VJZGAvYHJlc291cmNlVHlwZWAga2VlcCB3b3JraW5nIHVuY2hhbmdlZC5cbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gJiB7cmVzb3VyY2VJZDogc3RyaW5nLCByZXNvdXJjZVR5cGU6IHN0cmluZ319IENoYW5nZURlbGl2ZXJhYmxlU3luY0VudHJ5XG4gKi9cbmNvbnN0IFFVSUNLX1NFQVJDSF9DT0xVTU4gPSBcInF1aWNrU2VhcmNoXCJcblxuLyoqXG4gKiBCYXNlIHJlc291cmNlIGZvciBWZWxvY2lvdXMgc3luYyBlbmRwb2ludHMuXG4gKlxuICogVmVsb2Npb3VzIG93bnMgdGhlIGNoYW5nZXMvcmVwbGF5IG9yY2hlc3RyYXRpb24gKHNjb3BlIHBhcnNpbmcsIGZlZWQgcGFnaW5nLFxuICogcmVwbGF5IGRlbGVnYXRpb24sIHJlc3BvbnNlIHNoYXBlKSB3aGlsZSBhcHBzIHN1YmNsYXNzIGFuZCBvbmx5IGRlY2xhcmVcbiAqIGF1dGhvcml6YXRpb24sIGZlZWQgc2NvcGluZywgYW5kIHRoZWlyIHJlcGxheSBzZXJ2aWNlLlxuICogQHRlbXBsYXRlIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IFtUTW9kZWxDbGFzcz10eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRdXG4gKiBAYXVnbWVudHMge0Zyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2U8VE1vZGVsQ2xhc3M+fVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeW5jUmVzb3VyY2VCYXNlIGV4dGVuZHMgRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZXBsYXkgc2VydmljZSBjbGFzcyBoYW5kbGluZyByZXBsYXkgbXV0YXRpb25zIGZvciB0aGlzIHJlc291cmNlLFxuICAgKiBkZWNsYXJlZCBpbnN0ZWFkIG9mIG92ZXJyaWRpbmcge0BsaW5rIFN5bmNSZXNvdXJjZUJhc2UjcmVwbGF5U2VydmljZUNsYXNzfS5cbiAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHN0YXRpYyBSZXBsYXlTZXJ2aWNlQ2xhc3MgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogRGVjbGFyYXRpdmUgcXVpY2stc2VhcmNoIHRleHQgY29sdW1ucy4gV2hlbiBkZWNsYXJlZCwgYW4gaW5kZXggc2VhcmNoIG9uXG4gICAqIHRoZSBwc2V1ZG8tY29sdW1uIGBxdWlja1NlYXJjaGAgZXhwYW5kcyB0byBhbiBPUiBvZiBMSUtFIGNvbmRpdGlvbnMgb3ZlclxuICAgKiB0aGVzZSByb290LXRhYmxlIGNvbHVtbnMgaW5zdGVhZCBvZiBoaXR0aW5nIHRoZSBjb250cm9sbGVyIGRlZmF1bHQuXG4gICAqIEB0eXBlIHtzdHJpbmdbXSB8IG51bGx9ICovXG4gIHN0YXRpYyBxdWlja1NlYXJjaENvbHVtbnMgPSBudWxsXG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgZnJvbnRlbmQtbW9kZWwgaW5kZXggc2VhcmNoZXMsIGV4cGFuZGluZyBkZWNsYXJlZCBxdWljayBzZWFyY2hlcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTZWFyY2ggYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbnRyb2xsZXJ9IGFyZ3MuY29udHJvbGxlciAtIENvbnRyb2xsZXIgaGFuZGxpbmcgdGhlIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQW55UXVlcnl9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZVNlYXJjaH0gYXJncy5zZWFyY2ggLSBTZWFyY2ggcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFwcGx5RnJvbnRlbmRNb2RlbEluZGV4U2VhcmNoKHtjb250cm9sbGVyLCBxdWVyeSwgc2VhcmNofSkge1xuICAgIGlmICh0aGlzLmFwcGx5UXVpY2tTZWFyY2goe3F1ZXJ5LCBzZWFyY2h9KSkgcmV0dXJuXG5cbiAgICBzdXBlci5hcHBseUZyb250ZW5kTW9kZWxJbmRleFNlYXJjaCh7Y29udHJvbGxlciwgcXVlcnksIHNlYXJjaH0pXG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kcyBhIGBxdWlja1NlYXJjaGAgcHNldWRvLWNvbHVtbiBzZWFyY2ggaW50byBhbiBPUiBvZiBMSUtFIGNvbmRpdGlvbnNcbiAgICogb3ZlciB0aGUgZGVjbGFyZWQge0BsaW5rIFN5bmNSZXNvdXJjZUJhc2UucXVpY2tTZWFyY2hDb2x1bW5zfS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTZWFyY2ggYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUFueVF1ZXJ5fSBhcmdzLnF1ZXJ5IC0gUXVlcnkgdG8gZmlsdGVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlU2VhcmNofSBhcmdzLnNlYXJjaCAtIFNlYXJjaCBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc2VhcmNoIHdhcyBoYW5kbGVkIGFzIGEgcXVpY2sgc2VhcmNoLlxuICAgKi9cbiAgYXBwbHlRdWlja1NlYXJjaCh7cXVlcnksIHNlYXJjaH0pIHtcbiAgICBjb25zdCBxdWlja1NlYXJjaENvbHVtbnMgPSAvKiogQHR5cGUge3R5cGVvZiBTeW5jUmVzb3VyY2VCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcikucXVpY2tTZWFyY2hDb2x1bW5zXG5cbiAgICBpZiAoIXF1aWNrU2VhcmNoQ29sdW1ucyB8fCBxdWlja1NlYXJjaENvbHVtbnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoc2VhcmNoLnBhdGgubGVuZ3RoID4gMCB8fCBzZWFyY2guY29sdW1uICE9PSBRVUlDS19TRUFSQ0hfQ09MVU1OKSByZXR1cm4gZmFsc2VcblxuICAgIGlmIChzZWFyY2gub3BlcmF0b3IgIT09IFwibGlrZVwiKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKFwiU3luYyBxdWljayBzZWFyY2ggbXVzdCB1c2UgdGhlIGxpa2Ugb3BlcmF0b3IuXCIsIHtjb2RlOiBcInN5bmMtaW52YWxpZC1xdWljay1zZWFyY2hcIn0pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzZWFyY2gudmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJTeW5jIHF1aWNrIHNlYXJjaCBtdXN0IGJlIGEgc3RyaW5nLlwiLCB7Y29kZTogXCJzeW5jLWludmFsaWQtcXVpY2stc2VhcmNoXCJ9KVxuICAgIH1cblxuICAgIGNvbnN0IHRyaW1tZWRWYWx1ZSA9IHNlYXJjaC52YWx1ZS50cmltKClcblxuICAgIGlmICghdHJpbW1lZFZhbHVlKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3QgdGFibGVTcWwgPSBxdWVyeS5kcml2ZXIucXVvdGVUYWJsZShxdWVyeS5nZXRUYWJsZVJlZmVyZW5jZUZvckpvaW4oKSlcbiAgICBjb25zdCBsaWtlVmFsdWUgPSBgJSR7dHJpbW1lZFZhbHVlfSVgXG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHF1aWNrU2VhcmNoQ29sdW1ucy5tYXAoKGNvbHVtbk5hbWUpID0+IChcbiAgICAgIGAke3RhYmxlU3FsfS4ke3F1ZXJ5LmRyaXZlci5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKX0gTElLRSAke3F1ZXJ5LmRyaXZlci5xdW90ZShsaWtlVmFsdWUpfWBcbiAgICApKVxuXG4gICAgcXVlcnkud2hlcmUoYCgke2NvbmRpdGlvbnMuam9pbihcIiBPUiBcIil9KWApXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gVGhlIGRlY2xhcmF0aXZlIGBzdGF0aWMgd3JpdGFibGVBdHRyaWJ1dGVzYCBwZXJtaXQgbGlzdCBsaXZlcyBvblxuICAvLyBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlIHNvIGV2ZXJ5IGZyb250ZW5kLW1vZGVsIHJlc291cmNlIGNhbiBkZWNsYXJlXG4gIC8vIG9uZTsgc3luYyByZXNvdXJjZXMgaW5oZXJpdCBpdCB1bmNoYW5nZWQuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdGFibGUgY2hhbmdlLWZlZWQgcGFnZSBhZnRlciBhcHAgYXV0aG9yaXphdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gQ2hhbmdlLWZlZWQgcGFnZSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjaGFuZ2VzKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMucGFyYW1zKClcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuY2hhbmdlc1Njb3BlKHBhcmFtcylcblxuICAgIGF3YWl0IHRoaXMuYXV0aG9yaXplQ2hhbmdlcyh7cGFyYW1zLCBzY29wZX0pXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGFuZ2VGZWVkU2VydmljZSh7cGFyYW1zLCBzY29wZX0pLmNoYW5nZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheXMgY2xpZW50IHN5bmMgZW52ZWxvcGVzIHRocm91Z2ggdGhlIGFwcCByZXBsYXkgc2VydmljZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gUmVwbGF5IHJlc3VsdCB3aXRoIHBlci1zeW5jIHN0YXRlcy5cbiAgICovXG4gIGFzeW5jIHJlcGxheSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJ1aWxkUmVwbGF5U2VydmljZSgpLnJlcGxheSh0aGlzLnBhcmFtcygpKVxuXG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZXJyb3JcIikgcmV0dXJuIHJlc3VsdFxuXG4gICAgcmV0dXJuIHtzdGF0dXM6IFwic3VjY2Vzc1wiLCBzeW5jczogcmVzdWx0LnN5bmNzfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgb3B0aW9uYWwgY2xpZW50LWRlY2xhcmVkIHNjb3BlIGZyb20gcmVxdWVzdCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBwYXJhbXMgLSBSZXF1ZXN0IHBhcmFtcy5cbiAgICogQHJldHVybnMge1NlcmlhbGl6ZWRDaGFuZ2VzU2NvcGUgfCBudWxsfSBQYXJzZWQgc2NvcGUsIG9yIG51bGwgd2hlbiB0aGUgY2xpZW50IHNlbnQgbm9uZS5cbiAgICovXG4gIGNoYW5nZXNTY29wZShwYXJhbXMpIHtcbiAgICBjb25zdCBzY29wZSA9IHBhcmFtcy5zY29wZVxuXG4gICAgaWYgKHNjb3BlID09PSB1bmRlZmluZWQgfHwgc2NvcGUgPT09IG51bGwpIHJldHVybiBudWxsXG5cbiAgICBpZiAodHlwZW9mIHNjb3BlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoc2NvcGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgY2hhbmdlcyBzY29wZSBtdXN0IGJlIGFuIG9iamVjdCwgZ290OiAke1N0cmluZyhzY29wZSl9YClcbiAgICB9XG5cbiAgICBjb25zdCBzY29wZVBhcmFtcyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAoc2NvcGUpXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gc2NvcGVQYXJhbXMucmVzb3VyY2VUeXBlID09PSBudWxsIHx8IHNjb3BlUGFyYW1zLnJlc291cmNlVHlwZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IG51bGxcbiAgICAgIDogZm9yY2VkTm9uQmxhbmtTdHJpbmcoc2NvcGVQYXJhbXMucmVzb3VyY2VUeXBlLCBcInJlc291cmNlVHlwZVwiKVxuICAgIGNvbnN0IHJlc291cmNlVHlwZXMgPSB0aGlzLmNoYW5nZXNTY29wZVJlc291cmNlVHlwZXMoc2NvcGVQYXJhbXMucmVzb3VyY2VUeXBlcylcbiAgICBjb25zdCBjb25kaXRpb25zID0gc2NvcGVQYXJhbXMuY29uZGl0aW9uc1xuXG4gICAgaWYgKCFjb25kaXRpb25zIHx8IHR5cGVvZiBjb25kaXRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoY29uZGl0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3luYyBjaGFuZ2VzIHNjb3BlLmNvbmRpdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdDogJHtTdHJpbmcoY29uZGl0aW9ucyl9YClcbiAgICB9XG5cbiAgICByZXR1cm4ge2NvbmRpdGlvbnM6IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAoY29uZGl0aW9ucyksIHJlc291cmNlVHlwZSwgcmVzb3VyY2VUeXBlc31cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIG9wdGlvbmFsIHJlc291cmNlLXR5cGUgbGlzdCBhbiBhbGwtdHlwZXMgc2NvcGUgZGVjbGFyZXMuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gUmF3IGBzY29wZS5yZXNvdXJjZVR5cGVzYCBwYXJhbS5cbiAgICogQHJldHVybnMge3N0cmluZ1tdIHwgbnVsbH0gRGVjbGFyZWQgcmVzb3VyY2UgdHlwZXMsIG9yIG51bGwgd2hlbiB0aGUgY2xpZW50IHNlbnQgbm9uZS5cbiAgICovXG4gIGNoYW5nZXNTY29wZVJlc291cmNlVHlwZXModmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHRocm93IG5ldyBFcnJvcihgU3luYyBjaGFuZ2VzIHNjb3BlLnJlc291cmNlVHlwZXMgbXVzdCBiZSBhbiBhcnJheSwgZ290OiAke1N0cmluZyh2YWx1ZSl9YClcblxuICAgIHJldHVybiB2YWx1ZS5tYXAoKHJlc291cmNlVHlwZSkgPT4gZm9yY2VkTm9uQmxhbmtTdHJpbmcocmVzb3VyY2VUeXBlLCBcInJlc291cmNlVHlwZXNcIikpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBjaGFuZ2UtZmVlZCBzZXJ2aWNlIHNlcnZpbmcgdGhpcyBjaGFuZ2VzIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBzY29wZTogU2VyaWFsaXplZENoYW5nZXNTY29wZSB8IG51bGx9fSBhcmdzIC0gUmVxdWVzdCBwYXJhbXMgYW5kIHBhcnNlZCBzY29wZS5cbiAgICogQHJldHVybnMge3tjaGFuZ2VzOiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59fSBDaGFuZ2UtZmVlZCBzZXJ2aWNlLlxuICAgKi9cbiAgY2hhbmdlRmVlZFNlcnZpY2Uoe3BhcmFtcywgc2NvcGV9KSB7XG4gICAgcmV0dXJuIG5ldyBTeW5jTW9kZWxDaGFuZ2VGZWVkU2VydmljZSh7XG4gICAgICBtb2RlbENsYXNzOiB0aGlzLnN5bmNNb2RlbENsYXNzKCksXG4gICAgICBwYXJhbXMsXG4gICAgICBzY29wZVF1ZXJ5OiAoe3F1ZXJ5fSkgPT4gdGhpcy5zY29wZUNoYW5nZXNRdWVyeSh7cGFyYW1zLCBxdWVyeSwgc2NvcGV9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBhcHAgcmVwbGF5IHNlcnZpY2UgaGFuZGxpbmcgdGhpcyByZXBsYXkgcmVxdWVzdC4gVGhlIHJlc291cmNlXG4gICAqIGFiaWxpdHksIGNvbnRleHQsIGNvbmZpZ3VyYXRpb24sIGFuZCBsb2NhbHMgYXJlIHBsdW1iZWQgaW4gdW5kZXIgdGhlXG4gICAqIGFwcC1kZWNsYXJlZCB7QGxpbmsgU3luY1Jlc291cmNlQmFzZSNyZXBsYXlTZXJ2aWNlQXJnc30gKGFwcCBhcmdzIHdpbikgc29cbiAgICogdGhlIGRlZmF1bHQgcmVzb3VyY2Utcm91dGVkIHJlcGxheSB3b3JrcyB3aXRob3V0IHdpcmluZy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5kZWZhdWx0fSBSZXBsYXkgc2VydmljZSBpbnN0YW5jZS5cbiAgICovXG4gIGJ1aWxkUmVwbGF5U2VydmljZSgpIHtcbiAgICBjb25zdCBSZXBsYXlTZXJ2aWNlQ2xhc3MgPSB0aGlzLnJlcGxheVNlcnZpY2VDbGFzcygpXG5cbiAgICByZXR1cm4gbmV3IFJlcGxheVNlcnZpY2VDbGFzcyh7XG4gICAgICBhYmlsaXR5OiB0aGlzLmFiaWxpdHksXG4gICAgICBhYmlsaXR5Q29udGV4dDogdGhpcy5nZXRDb250ZXh0KCksXG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbnRyb2xsZXIgPyB0aGlzLmNvbnRyb2xsZXJJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb24oKSA6IHVuZGVmaW5lZCxcbiAgICAgIGxvY2FsczogdGhpcy5nZXRMb2NhbHMoKSxcbiAgICAgIC4uLnRoaXMucmVwbGF5U2VydmljZUFyZ3MoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjb25zdHJ1Y3RvciBhcmdzIGZvciB0aGUgYXBwIHJlcGxheSBzZXJ2aWNlLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBSZXBsYXkgc2VydmljZSBjb25zdHJ1Y3RvciBhcmdzLlxuICAgKi9cbiAgcmVwbGF5U2VydmljZUFyZ3MoKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3luYyBtb2RlbCBjbGFzcyBiYWNraW5nIHRoZSBjaGFuZ2UgZmVlZC5cbiAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gU3luYyBtb2RlbCBjbGFzcy5cbiAgICovXG4gIHN5bmNNb2RlbENsYXNzKCkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBTeW5jUmVzb3VyY2VCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcikuTW9kZWxDbGFzc1xuXG4gICAgaWYgKCFtb2RlbENsYXNzKSB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBtdXN0IGRlZmluZSBzdGF0aWMgTW9kZWxDbGFzc2ApXG5cbiAgICByZXR1cm4gbW9kZWxDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNoYXJlZCB1cHN0cmVhbSBpbXBvcnRlciBmb3IgdGhpcyByZXNvdXJjZSdzIGNvbmZpZ3VyYXRpb24uIEFwcHNcbiAgICogdXNlIGl0IGluc2lkZSB7QGxpbmsgU3luY1Jlc291cmNlQmFzZSNhdXRob3JpemVDaGFuZ2VzfSAob3IgYSBsZWdhY3kgdHJpZ2dlclxuICAgKiBlbmRwb2ludCkgdG8gcnVuIHRoZSB1cHN0cmVhbSBpbXBvcnQgdGhhdCBrZWVwcyB0aGUgZmVlZCBzZWxmLXN1c3RhaW5pbmcsXG4gICAqIHdpdGggY29hbGVzY2luZyBhbmQgdGhyb3R0bGluZyBvd25lZCBieSB0aGUgZnJhbWV3b3JrLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLXVwc3RyZWFtLWltcG9ydGVyLmpzXCIpLmRlZmF1bHR9IFNoYXJlZCBpbXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN5bmNVcHN0cmVhbUltcG9ydGVyKCkge1xuICAgIHJldHVybiBzeW5jVXBzdHJlYW1JbXBvcnRlckZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKCkpXG4gIH1cblxuICAvKipcbiAgICogQXV0aG9yaXplcyB0aGUgY3VycmVudCBjb250ZXh0IGZvciByZWFkaW5nIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcy5cbiAgICogQHBhcmFtIHt7cGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIHNjb3BlOiBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbH19IF9hcmdzIC0gUmVxdWVzdCBwYXJhbXMgYW5kIHBhcnNlZCBzY29wZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gYWNjZXNzIGlzIGFsbG93ZWQ7IHRocm93cyBvdGhlcndpc2UuXG4gICAqL1xuICBhc3luYyBhdXRob3JpemVDaGFuZ2VzKF9hcmdzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY1Jlc291cmNlQmFzZSNhdXRob3JpemVDaGFuZ2VzIG11c3QgYmUgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGFwcCB2aXNpYmlsaXR5IHNjb3Bpbmcgb250byB0aGUgY2hhbmdlLWZlZWQgcXVlcnkuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBxdWVyeTogaW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdCwgc2NvcGU6IFNlcmlhbGl6ZWRDaGFuZ2VzU2NvcGUgfCBudWxsfX0gX2FyZ3MgLSBSZXF1ZXN0IHBhcmFtcywgZmVlZCBxdWVyeSwgYW5kIHBhcnNlZCBzY29wZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzY29wZUNoYW5nZXNRdWVyeShfYXJncykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNSZXNvdXJjZUJhc2Ujc2NvcGVDaGFuZ2VzUXVlcnkgbXVzdCBiZSBpbXBsZW1lbnRlZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBvbmUgcHVibGlzaGVkIGNoYW5nZSBpcyBkZWxpdmVyYWJsZSB0byBhIHVzZXItc2NvcGVcbiAgICogc3Vic2NyaXB0aW9uICh0aGUgZnJhbWV3b3JrIHN5bmMgY2hhbm5lbCdzIHBlci1kZWxpdmVyeSBhY2Nlc3MgcmUtY2hlY2spLlxuICAgKiBUaGUgZGVmYXVsdCByZXVzZXMgdGhlIGFwcCdzIGFiaWxpdHkgc2NvcGluZzogaXQgYXBwbGllc1xuICAgKiB7QGxpbmsgU3luY1Jlc291cmNlQmFzZSNzY29wZUNoYW5nZXNRdWVyeX0gdG8gdGhlIGNoYW5nZS1mZWVkIG1vZGVsIOKAlCB3aGljaFxuICAgKiBmb3IgYW4gZW1wdHktY29uZGl0aW9ucyB1c2VyIHNjb3BlIGZhbGxzIGJhY2sgdG8gYWJpbGl0eSBzY29waW5nIOKAlCBhbmRcbiAgICogY2hlY2tzIHdoZXRoZXIgdGhlIHB1Ymxpc2hlZCBjaGFuZ2UncyBmZWVkIHJvdyBpcyB2aXNpYmxlIHdpdGhpbiB0aGF0XG4gICAqIHNjb3BlLiBBcHBzIGdldCB0aGlzIGZvciBmcmVlIGZyb20gdGhlIHNjb3BpbmcgdGhleSBhbHJlYWR5IGRlY2xhcmVkO1xuICAgKiBvdmVycmlkZSBvbmx5IGZvciBjdXN0b20gcGVyLWRlbGl2ZXJ5IHJ1bGVzLlxuICAgKlxuICAgKiBUaGUgYHN5bmNgIGFyZ3VtZW50IGlzIHRoZSBjb21wbGV0ZSBicm9hZGNhc3Qgc3luYyBlbnRyeSDigJQgaW1tdXRhYmxlXG4gICAqIHN5bmMtcm93IGlkLCBhY3Rvci1zcGVjaWZpYyBtZXRhZGF0YSwgYW5kIGFueSBvdGhlciBwdWJsaXNoZXIgZmllbGRzIOKAlFxuICAgKiB3aXRoIGByZXNvdXJjZUlkYC9gcmVzb3VyY2VUeXBlYCBub3JtYWxpemVkIHRvIHN0cmluZ3MsIHNvIGFuIG92ZXJyaWRlXG4gICAqIGNhbiBhdXRob3JpemUgY29uY3VycmVudCB0YXJnZXRlZCBhbmQgc2hhcmVkIGJyb2FkY2FzdHMgZm9yIHRoZSBzYW1lXG4gICAqIHJlc291cmNlIGlkZW50aXR5IGluZGVwZW5kZW50bHkgYnkgdGhlaXIgZXhhY3Qtcm93IGlkZW50aXR5LiBUaGUgY2hhbm5lbFxuICAgKiBuZXZlciBtdXRhdGVzIHRoZSBwdWJsaXNoZWQgZW50cnk7IG5vcm1hbGl6YXRpb24gaGFwcGVucyBvbiBhIGNvcHkuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBzY29wZTogU2VyaWFsaXplZENoYW5nZXNTY29wZSB8IG51bGwsIHN5bmM6IENoYW5nZURlbGl2ZXJhYmxlU3luY0VudHJ5fX0gYXJncyAtIFJlcXVlc3QgcGFyYW1zLCBzdWJzY3JpcHRpb24gc2NvcGUsIGFuZCB0aGUgcHVibGlzaGVkIHN5bmMgZW50cnkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRoZSBjaGFuZ2UgbWF5IGJlIGRlbGl2ZXJlZCB0byB0aGlzIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGFzeW5jIGNoYW5nZURlbGl2ZXJhYmxlKHtwYXJhbXMsIHNjb3BlLCBzeW5jfSkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zeW5jTW9kZWxDbGFzcygpLndoZXJlKHt9KVxuXG4gICAgdGhpcy5zY29wZUNoYW5nZXNRdWVyeSh7cGFyYW1zLCBxdWVyeSwgc2NvcGV9KVxuICAgIHF1ZXJ5LndoZXJlKHtyZXNvdXJjZV9pZDogU3RyaW5nKHN5bmMucmVzb3VyY2VJZCksIHJlc291cmNlX3R5cGU6IFN0cmluZyhzeW5jLnJlc291cmNlVHlwZSl9KVxuXG4gICAgcmV0dXJuIEJvb2xlYW4oYXdhaXQgcXVlcnkuZmlyc3QoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcmVwbGF5IHNlcnZpY2UgY2xhc3MgaGFuZGxpbmcgcmVwbGF5IG11dGF0aW9uczogdGhlXG4gICAqIGRlY2xhcmF0aXZlIHtAbGluayBTeW5jUmVzb3VyY2VCYXNlLlJlcGxheVNlcnZpY2VDbGFzc30gc3RhdGljIChzaGFyZWRcbiAgICogcmVzb3VyY2VzIGluY2x1ZGVkKSB3aGVuIGRlY2xhcmVkLCBvdGhlcndpc2VcbiAgICoge0BsaW5rIFN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2V9LCB3aGljaCByZXNvdXJjZS1yb3V0ZXMgbXV0YXRpb25zIHRocm91Z2hcbiAgICogdGhlIHBsdW1iZWQgY29uZmlndXJhdGlvbiByZWdpc3RyeS4gQXBwcyBkZWNsYXJlIHRoZSBzdGF0aWMgaW5zdGVhZCBvZlxuICAgKiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5kZWZhdWx0fSBSZXBsYXkgc2VydmljZSBjbGFzcy5cbiAgICovXG4gIHJlcGxheVNlcnZpY2VDbGFzcygpIHtcbiAgICBjb25zdCBSZXNvdXJjZUNsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgU3luY1Jlc291cmNlQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgU2hhcmVkUmVzb3VyY2UgPSAvKiogQHR5cGUge3R5cGVvZiBTeW5jUmVzb3VyY2VCYXNlIHwgbnVsbH0gKi8gKFJlc291cmNlQ2xhc3Muc2hhcmVkUmVzb3VyY2VDbGFzcygpID8/IG51bGwpXG5cbiAgICByZXR1cm4gUmVzb3VyY2VDbGFzcy5SZXBsYXlTZXJ2aWNlQ2xhc3MgPz8gU2hhcmVkUmVzb3VyY2U/LlJlcGxheVNlcnZpY2VDbGFzcyA/PyBTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlXG4gIH1cbn1cbiJdfQ==
262
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1yZXNvdXJjZS1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1yZXNvdXJjZS1iYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFFNUMsT0FBTyx5QkFBeUIsTUFBTSw2Q0FBNkMsQ0FBQTtBQUNuRixPQUFPLHlCQUF5QixNQUFNLG1DQUFtQyxDQUFBO0FBQ3pFLE9BQU8sMEJBQTBCLE1BQU0scUNBQXFDLENBQUE7QUFDNUUsT0FBTyxFQUFDLG9DQUFvQyxFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDaEYsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFFbEQ7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUE7QUFFekM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLGdCQUFpQixTQUFRLHlCQUF5QjtJQUNyRSwrRUFBK0U7SUFDL0UsTUFBTSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUE7SUFFN0I7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUE7SUFFckM7Ozs7aUNBSTZCO0lBQzdCLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUE7SUFFaEM7Ozs7Ozs7T0FPRztJQUNILDZCQUE2QixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUM7UUFDdkQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUM7WUFBRSxPQUFNO1FBRWxELEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtJQUNsRSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNI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QTtJQUNyQyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxrQkFBa0I7UUFDaEIsTUFBTSxhQUFhLEdBQUcsc0NBQXNDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDL0UsTUFBTSxjQUFjLEdBQUcsNkNBQTZDLENBQUMsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQTtRQUVsSCxPQUFPLGFBQWEsQ0FBQyxrQkFBa0IsSUFBSSxjQUFjLEVBQUUsa0JBQWtCLElBQUkseUJBQXlCLENBQUE7SUFDNUcsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Zm9yY2VkTm9uQmxhbmtTdHJpbmd9IGZyb20gXCJ0eXBhbmljXCJcblxuaW1wb3J0IEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2UgZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIlxuaW1wb3J0IFN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2UgZnJvbSBcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiXG5pbXBvcnQgU3luY01vZGVsQ2hhbmdlRmVlZFNlcnZpY2UgZnJvbSBcIi4vc3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzXCJcbmltcG9ydCB7c3luY1Vwc3RyZWFtSW1wb3J0ZXJGb3JDb25maWd1cmF0aW9ufSBmcm9tIFwiLi9zeW5jLXVwc3RyZWFtLWltcG9ydGVyLmpzXCJcbmltcG9ydCBWZWxvY2lvdXNFcnJvciBmcm9tIFwiLi4vdmVsb2Npb3VzLWVycm9yLmpzXCJcblxuLyoqXG4gKiBPcHRpb25hbCBjbGllbnQtZGVjbGFyZWQgc3luYyBzY29wZSBjYXJyaWVkIG9uIGEgY2hhbmdlcyByZXF1ZXN0LlxuICogQHR5cGVkZWYge29iamVjdH0gU2VyaWFsaXplZENoYW5nZXNTY29wZVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGNvbmRpdGlvbnMgLSBQbGFpbiBhdHRyaWJ1dGUgY29uZGl0aW9ucyBmcm9tIHRoZSBjbGllbnQgcXVlcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHJlc291cmNlVHlwZSAtIENsaWVudCByZXNvdXJjZS9tb2RlbCBuYW1lIHRoZSBzY29wZSB3YXMgZGVjbGFyZWQgZm9yLCBvciBudWxsIGZvciB0aGUgYWxsLXR5cGVzICh1c2VyKSBzY29wZTogb25lIHNjb3BlIGNvdmVyaW5nIGV2ZXJ5IHJlc291cmNlIHR5cGUgdGhpcyByZXNvdXJjZSBhdXRob3JpemVzIGZvciB0aGUgY2FsbGVyLCBzbyBhIHN5bmMgYXV0aG9yaXplcyBvbmNlIGhvd2V2ZXIgbWFueSB0eXBlcyBpdCBzZXJ2ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdIHwgbnVsbH0gcmVzb3VyY2VUeXBlcyAtIEZvciB0aGUgYWxsLXR5cGVzIHNjb3BlLCB0aGUgcmVzb3VyY2UgdHlwZXMgdGhlIGNsaWVudCBjYW4gYXBwbHkuIEEgY2hlYXAgZGVsaXZlcnkvdHlwZSBmaWx0ZXIgb25seSAtIGl0IG5hcnJvd3MsIG5ldmVyIHdpZGVucywgd2hhdCB0aGUgYXBwJ3MgYXV0aG9yaXphdGlvbiBhbHJlYWR5IGFsbG93cy4gTnVsbCBmb3IgYSB0eXBlLWRlY2xhcmVkIHNjb3BlLlxuICovXG5cbi8qKlxuICogT25lIHB1Ymxpc2hlZCBzeW5jIGVudHJ5IGFzIGRlbGl2ZXJlZCB0byB0aGUgcGVyLWRlbGl2ZXJ5IGFjY2VzcyByZS1jaGVja1xuICogKHtAbGluayBTeW5jUmVzb3VyY2VCYXNlI2NoYW5nZURlbGl2ZXJhYmxlfSk6IHRoZSBjb21wbGV0ZSBicm9hZGNhc3Qgc3luY1xuICogZW50cnkg4oCUIGluY2x1ZGluZyB0aGUgaW1tdXRhYmxlIHN5bmMtcm93IGlkLCBhY3Rvci1zcGVjaWZpYyBtZXRhZGF0YSwgYW5kXG4gKiBhbnkgb3RoZXIgYXBwIGZpZWxkcyB0aGUgcHVibGlzaGVyIHB1dCBvbiBpdCDigJQgd2l0aCBgcmVzb3VyY2VJZGAgYW5kXG4gKiBgcmVzb3VyY2VUeXBlYCBub3JtYWxpemVkIHRvIHN0cmluZ3MuIEFwcHMgYXV0aG9yaXppbmcgYnkgZXhhY3Qtcm93XG4gKiBpZGVudGl0eSByZWFkIHRoZSBleHRyYSBmaWVsZHM7IG92ZXJyaWRlcyB0aGF0IG9ubHkgcmVhZFxuICogYHJlc291cmNlSWRgL2ByZXNvdXJjZVR5cGVgIGtlZXAgd29ya2luZyB1bmNoYW5nZWQuXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+ICYge3Jlc291cmNlSWQ6IHN0cmluZywgcmVzb3VyY2VUeXBlOiBzdHJpbmd9fSBDaGFuZ2VEZWxpdmVyYWJsZVN5bmNFbnRyeVxuICovXG5jb25zdCBRVUlDS19TRUFSQ0hfQ09MVU1OID0gXCJxdWlja1NlYXJjaFwiXG5cbi8qKlxuICogQmFzZSByZXNvdXJjZSBmb3IgVmVsb2Npb3VzIHN5bmMgZW5kcG9pbnRzLlxuICpcbiAqIFZlbG9jaW91cyBvd25zIHRoZSBjaGFuZ2VzL3JlcGxheSBvcmNoZXN0cmF0aW9uIChzY29wZSBwYXJzaW5nLCBmZWVkIHBhZ2luZyxcbiAqIHJlcGxheSBkZWxlZ2F0aW9uLCByZXNwb25zZSBzaGFwZSkgd2hpbGUgYXBwcyBzdWJjbGFzcyBhbmQgb25seSBkZWNsYXJlXG4gKiBhdXRob3JpemF0aW9uLCBmZWVkIHNjb3BpbmcsIGFuZCB0aGVpciByZXBsYXkgc2VydmljZS5cbiAqIEB0ZW1wbGF0ZSB7dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBbVE1vZGVsQ2xhc3M9dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0XVxuICogQGF1Z21lbnRzIHtGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlPFRNb2RlbENsYXNzPn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY1Jlc291cmNlQmFzZSBleHRlbmRzIEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2Uge1xuICAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gKi9cbiAgc3RhdGljIE1vZGVsQ2xhc3MgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogUmVwbGF5IHNlcnZpY2UgY2xhc3MgaGFuZGxpbmcgcmVwbGF5IG11dGF0aW9ucyBmb3IgdGhpcyByZXNvdXJjZSxcbiAgICogZGVjbGFyZWQgaW5zdGVhZCBvZiBvdmVycmlkaW5nIHtAbGluayBTeW5jUmVzb3VyY2VCYXNlI3JlcGxheVNlcnZpY2VDbGFzc30uXG4gICAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgUmVwbGF5U2VydmljZUNsYXNzID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIERlY2xhcmF0aXZlIHF1aWNrLXNlYXJjaCB0ZXh0IGNvbHVtbnMuIFdoZW4gZGVjbGFyZWQsIGFuIGluZGV4IHNlYXJjaCBvblxuICAgKiB0aGUgcHNldWRvLWNvbHVtbiBgcXVpY2tTZWFyY2hgIGV4cGFuZHMgdG8gYW4gT1Igb2YgTElLRSBjb25kaXRpb25zIG92ZXJcbiAgICogdGhlc2Ugcm9vdC10YWJsZSBjb2x1bW5zIGluc3RlYWQgb2YgaGl0dGluZyB0aGUgY29udHJvbGxlciBkZWZhdWx0LlxuICAgKiBAdHlwZSB7c3RyaW5nW10gfCBudWxsfSAqL1xuICBzdGF0aWMgcXVpY2tTZWFyY2hDb2x1bW5zID0gbnVsbFxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGZyb250ZW5kLW1vZGVsIGluZGV4IHNlYXJjaGVzLCBleHBhbmRpbmcgZGVjbGFyZWQgcXVpY2sgc2VhcmNoZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gU2VhcmNoIGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDb250cm9sbGVyfSBhcmdzLmNvbnRyb2xsZXIgLSBDb250cm9sbGVyIGhhbmRsaW5nIHRoZSBxdWVyeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUFueVF1ZXJ5fSBhcmdzLnF1ZXJ5IC0gUXVlcnkgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VTZWFyY2h9IGFyZ3Muc2VhcmNoIC0gU2VhcmNoIHBhcmFtcy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseUZyb250ZW5kTW9kZWxJbmRleFNlYXJjaCh7Y29udHJvbGxlciwgcXVlcnksIHNlYXJjaH0pIHtcbiAgICBpZiAodGhpcy5hcHBseVF1aWNrU2VhcmNoKHtxdWVyeSwgc2VhcmNofSkpIHJldHVyblxuXG4gICAgc3VwZXIuYXBwbHlGcm9udGVuZE1vZGVsSW5kZXhTZWFyY2goe2NvbnRyb2xsZXIsIHF1ZXJ5LCBzZWFyY2h9KVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGFuZHMgYSBgcXVpY2tTZWFyY2hgIHBzZXVkby1jb2x1bW4gc2VhcmNoIGludG8gYW4gT1Igb2YgTElLRSBjb25kaXRpb25zXG4gICAqIG92ZXIgdGhlIGRlY2xhcmVkIHtAbGluayBTeW5jUmVzb3VyY2VCYXNlLnF1aWNrU2VhcmNoQ29sdW1uc30uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gU2VhcmNoIGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VBbnlRdWVyeX0gYXJncy5xdWVyeSAtIFF1ZXJ5IHRvIGZpbHRlci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZVNlYXJjaH0gYXJncy5zZWFyY2ggLSBTZWFyY2ggcGF5bG9hZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHNlYXJjaCB3YXMgaGFuZGxlZCBhcyBhIHF1aWNrIHNlYXJjaC5cbiAgICovXG4gIGFwcGx5UXVpY2tTZWFyY2goe3F1ZXJ5LCBzZWFyY2h9KSB7XG4gICAgY29uc3QgcXVpY2tTZWFyY2hDb2x1bW5zID0gLyoqIEB0eXBlIHt0eXBlb2YgU3luY1Jlc291cmNlQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpLnF1aWNrU2VhcmNoQ29sdW1uc1xuXG4gICAgaWYgKCFxdWlja1NlYXJjaENvbHVtbnMgfHwgcXVpY2tTZWFyY2hDb2x1bW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHNlYXJjaC5wYXRoLmxlbmd0aCA+IDAgfHwgc2VhcmNoLmNvbHVtbiAhPT0gUVVJQ0tfU0VBUkNIX0NPTFVNTikgcmV0dXJuIGZhbHNlXG5cbiAgICBpZiAoc2VhcmNoLm9wZXJhdG9yICE9PSBcImxpa2VcIikge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlN5bmMgcXVpY2sgc2VhcmNoIG11c3QgdXNlIHRoZSBsaWtlIG9wZXJhdG9yLlwiLCB7Y29kZTogXCJzeW5jLWludmFsaWQtcXVpY2stc2VhcmNoXCJ9KVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc2VhcmNoLnZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKFwiU3luYyBxdWljayBzZWFyY2ggbXVzdCBiZSBhIHN0cmluZy5cIiwge2NvZGU6IFwic3luYy1pbnZhbGlkLXF1aWNrLXNlYXJjaFwifSlcbiAgICB9XG5cbiAgICBjb25zdCB0cmltbWVkVmFsdWUgPSBzZWFyY2gudmFsdWUudHJpbSgpXG5cbiAgICBpZiAoIXRyaW1tZWRWYWx1ZSkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IHRhYmxlU3FsID0gcXVlcnkuZHJpdmVyLnF1b3RlVGFibGUocXVlcnkuZ2V0VGFibGVSZWZlcmVuY2VGb3JKb2luKCkpXG4gICAgY29uc3QgbGlrZVZhbHVlID0gYCUke3RyaW1tZWRWYWx1ZX0lYFxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBxdWlja1NlYXJjaENvbHVtbnMubWFwKChjb2x1bW5OYW1lKSA9PiAoXG4gICAgICBgJHt0YWJsZVNxbH0uJHtxdWVyeS5kcml2ZXIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSl9IExJS0UgJHtxdWVyeS5kcml2ZXIucXVvdGUobGlrZVZhbHVlKX1gXG4gICAgKSlcblxuICAgIHF1ZXJ5LndoZXJlKGAoJHtjb25kaXRpb25zLmpvaW4oXCIgT1IgXCIpfSlgKVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIFRoZSBkZWNsYXJhdGl2ZSBgc3RhdGljIHdyaXRhYmxlQXR0cmlidXRlc2AgcGVybWl0IGxpc3QgbGl2ZXMgb25cbiAgLy8gRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSBzbyBldmVyeSBmcm9udGVuZC1tb2RlbCByZXNvdXJjZSBjYW4gZGVjbGFyZVxuICAvLyBvbmU7IHN5bmMgcmVzb3VyY2VzIGluaGVyaXQgaXQgdW5jaGFuZ2VkLlxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RhYmxlIGNoYW5nZS1mZWVkIHBhZ2UgYWZ0ZXIgYXBwIGF1dGhvcml6YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59IENoYW5nZS1mZWVkIHBhZ2UgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgY2hhbmdlcygpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLnBhcmFtcygpXG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmNoYW5nZXNTY29wZShwYXJhbXMpXG5cbiAgICBhd2FpdCB0aGlzLmF1dGhvcml6ZUNoYW5nZXMoe3BhcmFtcywgc2NvcGV9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbmdlRmVlZFNlcnZpY2Uoe3BhcmFtcywgc2NvcGV9KS5jaGFuZ2VzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYXlzIGNsaWVudCBzeW5jIGVudmVsb3BlcyB0aHJvdWdoIHRoZSBhcHAgcmVwbGF5IHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59IFJlcGxheSByZXN1bHQgd2l0aCBwZXItc3luYyBzdGF0ZXMuXG4gICAqL1xuICBhc3luYyByZXBsYXkoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5idWlsZFJlcGxheVNlcnZpY2UoKS5yZXBsYXkodGhpcy5wYXJhbXMoKSlcblxuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImVycm9yXCIpIHJldHVybiByZXN1bHRcblxuICAgIHJldHVybiB7c3RhdHVzOiBcInN1Y2Nlc3NcIiwgc3luY3M6IHJlc3VsdC5zeW5jc31cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIG9wdGlvbmFsIGNsaWVudC1kZWNsYXJlZCBzY29wZSBmcm9tIHJlcXVlc3QgcGFyYW1zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gcGFyYW1zIC0gUmVxdWVzdCBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtTZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbH0gUGFyc2VkIHNjb3BlLCBvciBudWxsIHdoZW4gdGhlIGNsaWVudCBzZW50IG5vbmUuXG4gICAqL1xuICBjaGFuZ2VzU2NvcGUocGFyYW1zKSB7XG4gICAgY29uc3Qgc2NvcGUgPSBwYXJhbXMuc2NvcGVcblxuICAgIGlmIChzY29wZSA9PT0gdW5kZWZpbmVkIHx8IHNjb3BlID09PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgaWYgKHR5cGVvZiBzY29wZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHNjb3BlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIGNoYW5nZXMgc2NvcGUgbXVzdCBiZSBhbiBvYmplY3QsIGdvdDogJHtTdHJpbmcoc2NvcGUpfWApXG4gICAgfVxuXG4gICAgY29uc3Qgc2NvcGVQYXJhbXMgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHNjb3BlKVxuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHNjb3BlUGFyYW1zLnJlc291cmNlVHlwZSA9PT0gbnVsbCB8fCBzY29wZVBhcmFtcy5yZXNvdXJjZVR5cGUgPT09IHVuZGVmaW5lZFxuICAgICAgPyBudWxsXG4gICAgICA6IGZvcmNlZE5vbkJsYW5rU3RyaW5nKHNjb3BlUGFyYW1zLnJlc291cmNlVHlwZSwgXCJyZXNvdXJjZVR5cGVcIilcbiAgICBjb25zdCByZXNvdXJjZVR5cGVzID0gdGhpcy5jaGFuZ2VzU2NvcGVSZXNvdXJjZVR5cGVzKHNjb3BlUGFyYW1zLnJlc291cmNlVHlwZXMpXG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHNjb3BlUGFyYW1zLmNvbmRpdGlvbnNcblxuICAgIGlmICghY29uZGl0aW9ucyB8fCB0eXBlb2YgY29uZGl0aW9ucyAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGNvbmRpdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgY2hhbmdlcyBzY29wZS5jb25kaXRpb25zIG11c3QgYmUgYW4gb2JqZWN0LCBnb3Q6ICR7U3RyaW5nKGNvbmRpdGlvbnMpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHtjb25kaXRpb25zOiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKGNvbmRpdGlvbnMpLCByZXNvdXJjZVR5cGUsIHJlc291cmNlVHlwZXN9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBvcHRpb25hbCByZXNvdXJjZS10eXBlIGxpc3QgYW4gYWxsLXR5cGVzIHNjb3BlIGRlY2xhcmVzLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFJhdyBgc2NvcGUucmVzb3VyY2VUeXBlc2AgcGFyYW0uXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXSB8IG51bGx9IERlY2xhcmVkIHJlc291cmNlIHR5cGVzLCBvciBudWxsIHdoZW4gdGhlIGNsaWVudCBzZW50IG5vbmUuXG4gICAqL1xuICBjaGFuZ2VzU2NvcGVSZXNvdXJjZVR5cGVzKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiBudWxsXG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgY2hhbmdlcyBzY29wZS5yZXNvdXJjZVR5cGVzIG11c3QgYmUgYW4gYXJyYXksIGdvdDogJHtTdHJpbmcodmFsdWUpfWApXG5cbiAgICByZXR1cm4gdmFsdWUubWFwKChyZXNvdXJjZVR5cGUpID0+IGZvcmNlZE5vbkJsYW5rU3RyaW5nKHJlc291cmNlVHlwZSwgXCJyZXNvdXJjZVR5cGVzXCIpKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgY2hhbmdlLWZlZWQgc2VydmljZSBzZXJ2aW5nIHRoaXMgY2hhbmdlcyByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3twYXJhbXM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Piwgc2NvcGU6IFNlcmlhbGl6ZWRDaGFuZ2VzU2NvcGUgfCBudWxsfX0gYXJncyAtIFJlcXVlc3QgcGFyYW1zIGFuZCBwYXJzZWQgc2NvcGUuXG4gICAqIEByZXR1cm5zIHt7Y2hhbmdlczogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fX0gQ2hhbmdlLWZlZWQgc2VydmljZS5cbiAgICovXG4gIGNoYW5nZUZlZWRTZXJ2aWNlKHtwYXJhbXMsIHNjb3BlfSkge1xuICAgIHJldHVybiBuZXcgU3luY01vZGVsQ2hhbmdlRmVlZFNlcnZpY2Uoe1xuICAgICAgbW9kZWxDbGFzczogdGhpcy5zeW5jTW9kZWxDbGFzcygpLFxuICAgICAgcGFyYW1zLFxuICAgICAgc2NvcGVRdWVyeTogKHtxdWVyeX0pID0+IHRoaXMuc2NvcGVDaGFuZ2VzUXVlcnkoe3BhcmFtcywgcXVlcnksIHNjb3BlfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgYXBwIHJlcGxheSBzZXJ2aWNlIGhhbmRsaW5nIHRoaXMgcmVwbGF5IHJlcXVlc3QuIFRoZSByZXNvdXJjZVxuICAgKiBhYmlsaXR5LCBjb250ZXh0LCBjb25maWd1cmF0aW9uLCBhbmQgbG9jYWxzIGFyZSBwbHVtYmVkIGluIHVuZGVyIHRoZVxuICAgKiBhcHAtZGVjbGFyZWQge0BsaW5rIFN5bmNSZXNvdXJjZUJhc2UjcmVwbGF5U2VydmljZUFyZ3N9IChhcHAgYXJncyB3aW4pIHNvXG4gICAqIHRoZSBkZWZhdWx0IHJlc291cmNlLXJvdXRlZCByZXBsYXkgd29ya3Mgd2l0aG91dCB3aXJpbmcuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuZGVmYXVsdH0gUmVwbGF5IHNlcnZpY2UgaW5zdGFuY2UuXG4gICAqL1xuICBidWlsZFJlcGxheVNlcnZpY2UoKSB7XG4gICAgY29uc3QgUmVwbGF5U2VydmljZUNsYXNzID0gdGhpcy5yZXBsYXlTZXJ2aWNlQ2xhc3MoKVxuXG4gICAgcmV0dXJuIG5ldyBSZXBsYXlTZXJ2aWNlQ2xhc3Moe1xuICAgICAgYWJpbGl0eTogdGhpcy5hYmlsaXR5LFxuICAgICAgYWJpbGl0eUNvbnRleHQ6IHRoaXMuZ2V0Q29udGV4dCgpLFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb250cm9sbGVyID8gdGhpcy5jb250cm9sbGVySW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9uKCkgOiB1bmRlZmluZWQsXG4gICAgICBsb2NhbHM6IHRoaXMuZ2V0TG9jYWxzKCksXG4gICAgICAuLi50aGlzLnJlcGxheVNlcnZpY2VBcmdzKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY29uc3RydWN0b3IgYXJncyBmb3IgdGhlIGFwcCByZXBsYXkgc2VydmljZS5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gUmVwbGF5IHNlcnZpY2UgY29uc3RydWN0b3IgYXJncy5cbiAgICovXG4gIHJlcGxheVNlcnZpY2VBcmdzKCkge1xuICAgIHJldHVybiB7fVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN5bmMgbW9kZWwgY2xhc3MgYmFja2luZyB0aGUgY2hhbmdlIGZlZWQuXG4gICAqIEByZXR1cm5zIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IFN5bmMgbW9kZWwgY2xhc3MuXG4gICAqL1xuICBzeW5jTW9kZWxDbGFzcygpIHtcbiAgICBjb25zdCBtb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgU3luY1Jlc291cmNlQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpLk1vZGVsQ2xhc3NcblxuICAgIGlmICghbW9kZWxDbGFzcykgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gbXVzdCBkZWZpbmUgc3RhdGljIE1vZGVsQ2xhc3NgKVxuXG4gICAgcmV0dXJuIG1vZGVsQ2xhc3NcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgdXBzdHJlYW0gaW1wb3J0ZXIgZm9yIHRoaXMgcmVzb3VyY2UncyBjb25maWd1cmF0aW9uLiBBcHBzXG4gICAqIHVzZSBpdCBpbnNpZGUge0BsaW5rIFN5bmNSZXNvdXJjZUJhc2UjYXV0aG9yaXplQ2hhbmdlc30gKG9yIGEgbGVnYWN5IHRyaWdnZXJcbiAgICogZW5kcG9pbnQpIHRvIHJ1biB0aGUgdXBzdHJlYW0gaW1wb3J0IHRoYXQga2VlcHMgdGhlIGZlZWQgc2VsZi1zdXN0YWluaW5nLFxuICAgKiB3aXRoIGNvYWxlc2NpbmcgYW5kIHRocm90dGxpbmcgb3duZWQgYnkgdGhlIGZyYW1ld29yay5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy11cHN0cmVhbS1pbXBvcnRlci5qc1wiKS5kZWZhdWx0fSBTaGFyZWQgaW1wb3J0ZXIgZm9yIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzeW5jVXBzdHJlYW1JbXBvcnRlcigpIHtcbiAgICByZXR1cm4gc3luY1Vwc3RyZWFtSW1wb3J0ZXJGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbigpKVxuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhvcml6ZXMgdGhlIGN1cnJlbnQgY29udGV4dCBmb3IgcmVhZGluZyB0aGUgcmVxdWVzdGVkIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBzY29wZTogU2VyaWFsaXplZENoYW5nZXNTY29wZSB8IG51bGx9fSBfYXJncyAtIFJlcXVlc3QgcGFyYW1zIGFuZCBwYXJzZWQgc2NvcGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyB3aGVuIGFjY2VzcyBpcyBhbGxvd2VkOyB0aHJvd3Mgb3RoZXJ3aXNlLlxuICAgKi9cbiAgYXN5bmMgYXV0aG9yaXplQ2hhbmdlcyhfYXJncykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNSZXNvdXJjZUJhc2UjYXV0aG9yaXplQ2hhbmdlcyBtdXN0IGJlIGltcGxlbWVudGVkXCIpXG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhcHAgdmlzaWJpbGl0eSBzY29waW5nIG9udG8gdGhlIGNoYW5nZS1mZWVkIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3twYXJhbXM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgcXVlcnk6IGltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQsIHNjb3BlOiBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbH19IF9hcmdzIC0gUmVxdWVzdCBwYXJhbXMsIGZlZWQgcXVlcnksIGFuZCBwYXJzZWQgc2NvcGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2NvcGVDaGFuZ2VzUXVlcnkoX2FyZ3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jUmVzb3VyY2VCYXNlI3Njb3BlQ2hhbmdlc1F1ZXJ5IG11c3QgYmUgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgb25lIHB1Ymxpc2hlZCBjaGFuZ2UgaXMgZGVsaXZlcmFibGUgdG8gYSB1c2VyLXNjb3BlXG4gICAqIHN1YnNjcmlwdGlvbiAodGhlIGZyYW1ld29yayBzeW5jIGNoYW5uZWwncyBwZXItZGVsaXZlcnkgYWNjZXNzIHJlLWNoZWNrKS5cbiAgICogVGhlIGRlZmF1bHQgcmV1c2VzIHRoZSBhcHAncyBhYmlsaXR5IHNjb3Bpbmc6IGl0IGFwcGxpZXNcbiAgICoge0BsaW5rIFN5bmNSZXNvdXJjZUJhc2Ujc2NvcGVDaGFuZ2VzUXVlcnl9IHRvIHRoZSBjaGFuZ2UtZmVlZCBtb2RlbCDigJQgd2hpY2hcbiAgICogZm9yIGFuIGVtcHR5LWNvbmRpdGlvbnMgdXNlciBzY29wZSBmYWxscyBiYWNrIHRvIGFiaWxpdHkgc2NvcGluZyDigJQgYW5kXG4gICAqIGNoZWNrcyB3aGV0aGVyIHRoZSBwdWJsaXNoZWQgY2hhbmdlJ3MgZmVlZCByb3cgaXMgdmlzaWJsZSB3aXRoaW4gdGhhdFxuICAgKiBzY29wZS4gQXBwcyBnZXQgdGhpcyBmb3IgZnJlZSBmcm9tIHRoZSBzY29waW5nIHRoZXkgYWxyZWFkeSBkZWNsYXJlZDtcbiAgICogb3ZlcnJpZGUgb25seSBmb3IgY3VzdG9tIHBlci1kZWxpdmVyeSBydWxlcy5cbiAgICpcbiAgICogVGhlIGBzeW5jYCBhcmd1bWVudCBpcyB0aGUgY29tcGxldGUgYnJvYWRjYXN0IHN5bmMgZW50cnkg4oCUIGltbXV0YWJsZVxuICAgKiBzeW5jLXJvdyBpZCwgYWN0b3Itc3BlY2lmaWMgbWV0YWRhdGEsIGFuZCBhbnkgb3RoZXIgcHVibGlzaGVyIGZpZWxkcyDigJRcbiAgICogd2l0aCBgcmVzb3VyY2VJZGAvYHJlc291cmNlVHlwZWAgbm9ybWFsaXplZCB0byBzdHJpbmdzLCBzbyBhbiBvdmVycmlkZVxuICAgKiBjYW4gYXV0aG9yaXplIGNvbmN1cnJlbnQgdGFyZ2V0ZWQgYW5kIHNoYXJlZCBicm9hZGNhc3RzIGZvciB0aGUgc2FtZVxuICAgKiByZXNvdXJjZSBpZGVudGl0eSBpbmRlcGVuZGVudGx5IGJ5IHRoZWlyIGV4YWN0LXJvdyBpZGVudGl0eS4gVGhlIGNoYW5uZWxcbiAgICogbmV2ZXIgbXV0YXRlcyB0aGUgcHVibGlzaGVkIGVudHJ5OyBub3JtYWxpemF0aW9uIGhhcHBlbnMgb24gYSBjb3B5LlxuICAgKiBAcGFyYW0ge3twYXJhbXM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Piwgc2NvcGU6IFNlcmlhbGl6ZWRDaGFuZ2VzU2NvcGUgfCBudWxsLCBzeW5jOiBDaGFuZ2VEZWxpdmVyYWJsZVN5bmNFbnRyeX19IGFyZ3MgLSBSZXF1ZXN0IHBhcmFtcywgc3Vic2NyaXB0aW9uIHNjb3BlLCBhbmQgdGhlIHB1Ymxpc2hlZCBzeW5jIGVudHJ5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0aGUgY2hhbmdlIG1heSBiZSBkZWxpdmVyZWQgdG8gdGhpcyBzdWJzY3JpcHRpb24uXG4gICAqL1xuICBhc3luYyBjaGFuZ2VEZWxpdmVyYWJsZSh7cGFyYW1zLCBzY29wZSwgc3luY30pIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc3luY01vZGVsQ2xhc3MoKS53aGVyZSh7fSlcblxuICAgIHRoaXMuc2NvcGVDaGFuZ2VzUXVlcnkoe3BhcmFtcywgcXVlcnksIHNjb3BlfSlcbiAgICBxdWVyeS53aGVyZSh7cmVzb3VyY2VfaWQ6IFN0cmluZyhzeW5jLnJlc291cmNlSWQpLCByZXNvdXJjZV90eXBlOiBTdHJpbmcoc3luYy5yZXNvdXJjZVR5cGUpfSlcblxuICAgIHJldHVybiBCb29sZWFuKGF3YWl0IHF1ZXJ5LmZpcnN0KCkpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHJlcGxheSBzZXJ2aWNlIGNsYXNzIGhhbmRsaW5nIHJlcGxheSBtdXRhdGlvbnM6IHRoZVxuICAgKiBkZWNsYXJhdGl2ZSB7QGxpbmsgU3luY1Jlc291cmNlQmFzZS5SZXBsYXlTZXJ2aWNlQ2xhc3N9IHN0YXRpYyAoc2hhcmVkXG4gICAqIHJlc291cmNlcyBpbmNsdWRlZCkgd2hlbiBkZWNsYXJlZCwgb3RoZXJ3aXNlXG4gICAqIHtAbGluayBTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlfSwgd2hpY2ggcmVzb3VyY2Utcm91dGVzIG11dGF0aW9ucyB0aHJvdWdoXG4gICAqIHRoZSBwbHVtYmVkIGNvbmZpZ3VyYXRpb24gcmVnaXN0cnkuIEFwcHMgZGVjbGFyZSB0aGUgc3RhdGljIGluc3RlYWQgb2ZcbiAgICogb3ZlcnJpZGluZyB0aGlzIG1ldGhvZC5cbiAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuZGVmYXVsdH0gUmVwbGF5IHNlcnZpY2UgY2xhc3MuXG4gICAqL1xuICByZXBsYXlTZXJ2aWNlQ2xhc3MoKSB7XG4gICAgY29uc3QgUmVzb3VyY2VDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIFN5bmNSZXNvdXJjZUJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IFNoYXJlZFJlc291cmNlID0gLyoqIEB0eXBlIHt0eXBlb2YgU3luY1Jlc291cmNlQmFzZSB8IG51bGx9ICovIChSZXNvdXJjZUNsYXNzLnNoYXJlZFJlc291cmNlQ2xhc3MoKSA/PyBudWxsKVxuXG4gICAgcmV0dXJuIFJlc291cmNlQ2xhc3MuUmVwbGF5U2VydmljZUNsYXNzID8/IFNoYXJlZFJlc291cmNlPy5SZXBsYXlTZXJ2aWNlQ2xhc3MgPz8gU3luY0VudmVsb3BlUmVwbGF5U2VydmljZVxuICB9XG59XG4iXX0=
@@ -1,7 +1,7 @@
1
1
  // @ts-check
2
2
 
3
3
  import Controller from "../controller.js"
4
- import FrontendModelBaseResource from "../frontend-model-resource/base-resource.js"
4
+ import FrontendModelBaseResource, {frontendModelResourceInternalConstructor} from "../frontend-model-resource/base-resource.js"
5
5
 
6
6
  /** Configurations whose sync.api routes have already been mounted. */
7
7
  const mountedConfigurations = new WeakSet()
@@ -41,9 +41,10 @@ export default class SyncApiController extends Controller {
41
41
  */
42
42
  syncResource(params) {
43
43
  const ResourceClass = this.syncResourceClass()
44
+ const ResourceConstructor = frontendModelResourceInternalConstructor(ResourceClass)
44
45
  const ability = this.currentAbility()
45
46
 
46
- return new ResourceClass({
47
+ return new ResourceConstructor({
47
48
  ability,
48
49
  controller: /** @type {import("../frontend-model-resource/base-resource.js").FrontendModelResourceController} */ (/** @type {unknown} */ (this)),
49
50
  context: {
@@ -137,7 +138,7 @@ export default class SyncApiController extends Controller {
137
138
  * @returns {import("../configuration-types.js").FrontendModelResourceClassType} Sync resource class.
138
139
  */
139
140
  missingSyncResourceClass() {
140
- return /** @type {typeof FrontendModelBaseResource} */ (/** @type {unknown} */ (this.raiseMissingSyncResourceClass()))
141
+ return /** @type {import("../configuration-types.js").FrontendModelResourceClassType} */ (/** @type {unknown} */ (this.raiseMissingSyncResourceClass()))
141
142
  }
142
143
 
143
144
  /** Raises a configuration error for subclasses that do not provide a resource. */
@@ -155,7 +156,7 @@ export default class SyncApiController extends Controller {
155
156
 
156
157
  if (!modelClass) throw new Error("Sync resource class must define static ModelClass")
157
158
 
158
- return modelClass
159
+ return /** @type {typeof import("../database/record/index.js").default} */ (/** @type {unknown} */ (modelClass))
159
160
  }
160
161
 
161
162
  /**
@@ -178,4 +179,3 @@ export default class SyncApiController extends Controller {
178
179
  })
179
180
  }
180
181
  }
181
-
@@ -1,6 +1,7 @@
1
1
  // @ts-check
2
2
 
3
3
  import {deliverDeclaredBroadcasts, upsertSyncRow} from "./sync-change-fanout.js"
4
+ import {frontendModelResourceInternalConstructor} from "../frontend-model-resource/base-resource.js"
4
5
  import {markServerApply} from "./sync-publish-suppression.js"
5
6
  import {resolveFrontendModelResourceClass} from "../frontend-models/resource-definition.js"
6
7
  import {resolveSyncConflict} from "./conflict-strategy.js"
@@ -567,7 +568,7 @@ export default class SyncEnvelopeReplayService {
567
568
  * @returns {Promise<import("../frontend-model-resource/base-resource.js").default>} Routed resource instance.
568
569
  */
569
570
  async buildReplayResource({actor, context, mutation, registration}) {
570
- const ResourceClass = registration.resourceClass
571
+ const ResourceClass = frontendModelResourceInternalConstructor(registration.resourceClass)
571
572
  const {ability, abilityContext} = await this.replayAbilityFor({actor, context})
572
573
 
573
574
  return new ResourceClass({
@@ -38,6 +38,9 @@ const QUICK_SEARCH_COLUMN = "quickSearch"
38
38
  * @augments {FrontendModelBaseResource<TModelClass>}
39
39
  */
40
40
  export default class SyncResourceBase extends FrontendModelBaseResource {
41
+ /** @type {typeof import("../database/record/index.js").default | undefined} */
42
+ static ModelClass = undefined
43
+
41
44
  /**
42
45
  * Replay service class handling replay mutations for this resource,
43
46
  * declared instead of overriding {@link SyncResourceBase#replayServiceClass}.
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.641",
6
+ "version": "1.0.643",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -1,10 +1,15 @@
1
1
  // @ts-check
2
2
 
3
+ /**
4
+ * Model class supported by authorization and shared frontend-model resources.
5
+ * @typedef {{new (): import("../database/record/index.js").default | import("../frontend-models/base.js").default, getModelName: () => string}} AuthorizationResourceModelClass
6
+ */
7
+
3
8
  /** Base class for authorization resources defining abilities for a model. */
4
9
  export default class AuthorizationBaseResource {
5
10
  /**
6
11
  * Model class.
7
- * @type {typeof import("../database/record/index.js").default | undefined} */
12
+ * @type {AuthorizationResourceModelClass | undefined} */
8
13
  static ModelClass = undefined
9
14
 
10
15
  /**
@@ -22,7 +27,9 @@ export default class AuthorizationBaseResource {
22
27
 
23
28
  /**
24
29
  * Runs model class.
25
- * @returns {typeof import("../database/record/index.js").default} - Model class handled by this resource.
30
+ * @template {AuthorizationResourceModelClass} TModelClass
31
+ * @this {{ModelClass: TModelClass | undefined, name: string}}
32
+ * @returns {TModelClass} - Model class handled by this resource.
26
33
  */
27
34
  static modelClass() {
28
35
  if (!this.ModelClass) {
@@ -41,7 +48,10 @@ export default class AuthorizationBaseResource {
41
48
  */
42
49
  can(actions, conditions) {
43
50
  this.assertResourceConditionsSignature({conditions, methodName: "can"})
44
- this.requiredAbility().can(actions, this.requiredModelClass(), /** @type {import("./ability.js").AbilityConditionsType<typeof import("../database/record/index.js").default> | undefined} */ (conditions))
51
+ // Authorization query rules are backend-only even when a shared resource is bound to a frontend model.
52
+ const modelClass = /** @type {typeof import("../database/record/index.js").default} */ (this.requiredModelClass())
53
+
54
+ this.requiredAbility().can(actions, modelClass, /** @type {import("./ability.js").AbilityConditionsType<typeof import("../database/record/index.js").default> | undefined} */ (conditions))
45
55
  }
46
56
 
47
57
  /**
@@ -53,7 +63,10 @@ export default class AuthorizationBaseResource {
53
63
  */
54
64
  cannot(actions, conditions) {
55
65
  this.assertResourceConditionsSignature({conditions, methodName: "cannot"})
56
- this.requiredAbility().cannot(actions, this.requiredModelClass(), /** @type {import("./ability.js").AbilityConditionsType<typeof import("../database/record/index.js").default> | undefined} */ (conditions))
66
+ // Authorization query rules are backend-only even when a shared resource is bound to a frontend model.
67
+ const modelClass = /** @type {typeof import("../database/record/index.js").default} */ (this.requiredModelClass())
68
+
69
+ this.requiredAbility().cannot(actions, modelClass, /** @type {import("./ability.js").AbilityConditionsType<typeof import("../database/record/index.js").default> | undefined} */ (conditions))
57
70
  }
58
71
 
59
72
  /**
@@ -70,7 +83,7 @@ export default class AuthorizationBaseResource {
70
83
 
71
84
  /**
72
85
  * Runs required model class.
73
- * @returns {typeof import("../database/record/index.js").default} - Model class handled by this resource.
86
+ * @returns {AuthorizationResourceModelClass} - Model class handled by this resource.
74
87
  */
75
88
  requiredModelClass() {
76
89
  const ResourceClass = /** @type {typeof AuthorizationBaseResource} */ (this.constructor)
@@ -325,7 +325,7 @@ export default class BackgroundJobsMain {
325
325
  }, this.workerLivenessSweepMs)
326
326
 
327
327
  if (this.lifecycleState === "active") {
328
- await this._startActiveOwnership()
328
+ await this._startActiveOwnership("active")
329
329
  } else if (this.lifecycleState === "retired") {
330
330
  this._startGenerationRecoveryOwnership()
331
331
  }
@@ -519,17 +519,27 @@ export default class BackgroundJobsMain {
519
519
 
520
520
  /**
521
521
  * Acquires scheduling and dispatch ownership for an active generation.
522
- * @returns {Promise<void>} - Resolves after active ownership is established.
522
+ * @param {"active" | "candidate"} expectedLifecycleState - State that still owns activation.
523
+ * @returns {Promise<boolean>} - Whether active ownership was established.
523
524
  */
524
- async _startActiveOwnership() {
525
+ async _startActiveOwnership(expectedLifecycleState) {
525
526
  await this.store.reconcileQueueConcurrency()
527
+ if (this.lifecycleState !== expectedLifecycleState) return false
526
528
  this._setupDispatchTriggers()
527
529
  this._setupStartupHandoffReclaim()
528
530
  this._startOrphanSweep()
529
531
  await this._startScheduler()
532
+ if (this.lifecycleState !== expectedLifecycleState) {
533
+ if (this.scheduler) await this.scheduler.stop()
534
+ this.scheduler = undefined
535
+ this._clearDispatchTimers()
536
+ this._disconnectBeaconHandlers()
537
+ return false
538
+ }
530
539
  this._activeOwnershipReady = true
531
540
  this._creditReadyWorkers()
532
541
  await this._drain()
542
+ return this.lifecycleState === expectedLifecycleState
533
543
  }
534
544
 
535
545
  /** Starts exact recovery duties without acquiring global dispatch ownership. */
@@ -603,7 +613,10 @@ export default class BackgroundJobsMain {
603
613
  */
604
614
  async _activate() {
605
615
  this.logger.info(() => ["Background jobs generation activation starting", {generationId: this.generationId}])
606
- await this._startActiveOwnership()
616
+ const ownershipStarted = await this._startActiveOwnership("candidate")
617
+ if (!ownershipStarted || this.lifecycleState !== "candidate") {
618
+ throw new Error("Background jobs generation retirement started before activation acquired ownership")
619
+ }
607
620
  this.lifecycleState = "active"
608
621
  this._creditReadyWorkers()
609
622
  this.logger.info(() => ["Background jobs generation activation acknowledged", {generationId: this.generationId}])
@@ -619,7 +632,8 @@ export default class BackgroundJobsMain {
619
632
  retire() {
620
633
  if (!this.generationId) throw new Error("Background jobs generation retirement requires generation mode")
621
634
  if (this.lifecycleState === "retiring" || this.lifecycleState === "retired") return Promise.resolve()
622
- if (this.lifecycleState !== "active") throw new Error(`Cannot retire background jobs generation from ${this.lifecycleState}`)
635
+ const activationInProgress = this.lifecycleState === "candidate" && Boolean(this._activationPromise)
636
+ if (this.lifecycleState !== "active" && !activationInProgress) throw new Error(`Cannot retire background jobs generation from ${this.lifecycleState}`)
623
637
 
624
638
  this.lifecycleState = "retiring"
625
639
  this._activeOwnershipReady = false
@@ -638,7 +652,8 @@ export default class BackgroundJobsMain {
638
652
  * @returns {Promise<void>} - Retirement fence completion.
639
653
  */
640
654
  async _retire() {
641
- await this.scheduler?.stop()
655
+ if (this._activationPromise) await Promise.allSettled([this._activationPromise])
656
+ if (this.scheduler) await this.scheduler.stop()
642
657
  this.scheduler = undefined
643
658
  if (this._drainPromise) await this._drainPromise
644
659
  if (this._stopped) return
@@ -66,12 +66,24 @@ const EXECUTION_MODE_BACKFILL_MIGRATION_VERSION = "20260607131010"
66
66
  // handoff-marker workaround), leaving `execution_mode` as the single source of
67
67
  // truth for a job's runtime.
68
68
  const DROP_FORKED_COLUMN_MIGRATION_VERSION = "20260719000000"
69
+ const JOBS_INDEX_REPAIR_MIGRATION_VERSION = "20260903120000"
69
70
  // Legacy marker prefix used by rows written before this migration: pooled jobs
70
71
  // used to persist as `execution_mode = "forked"` plus a `velocious-pooled:*`
71
72
  // handoff id. Retained only to detect and convert those rows in the migration.
72
73
  const LEGACY_POOLED_HANDOFF_ID_PREFIX = "velocious-pooled:"
73
74
  const LEGACY_POOLED_QUEUED_HANDOFF_ID = `${LEGACY_POOLED_HANDOFF_ID_PREFIX}queued`
74
75
  const JOBS_TABLE = "background_jobs"
76
+ const JOBS_INDEX_COLUMN_NAMES = [
77
+ "job_name",
78
+ "queue",
79
+ "status",
80
+ "scheduled_at_ms",
81
+ "created_at_ms",
82
+ "schedule_key",
83
+ "handed_off_at_ms",
84
+ "orphaned_at_ms",
85
+ "concurrency_key"
86
+ ]
75
87
  const IDEMPOTENCY_KEYS_TABLE = "background_job_idempotency_keys"
76
88
  const SCHEDULE_KEYS_TABLE = "background_job_schedule_keys"
77
89
  const CONCURRENCY_TABLE = "background_job_concurrency"
@@ -1838,6 +1850,50 @@ export default class BackgroundJobsStore extends BackgroundJobsAdapter {
1838
1850
  await this._ensureQueueColumn(db)
1839
1851
  await this._ensureScheduleKeyColumn(db)
1840
1852
  await this._ensureJobTimeoutColumn(db)
1853
+ await this._ensureJobsTableIndexesOnce(db)
1854
+ }
1855
+
1856
+ /**
1857
+ * Repairs secondary indexes that older add-column upgrades declared but did
1858
+ * not create on every SQL driver. The migration ledger keeps routine store
1859
+ * readiness from repeatedly introspecting the full index set.
1860
+ * @param {import("../database/drivers/base.js").default} db - Database connection.
1861
+ * @returns {Promise<void>} - Resolves when all expected indexes exist.
1862
+ */
1863
+ async _ensureJobsTableIndexesOnce(db) {
1864
+ const migrationVersion = JOBS_INDEX_REPAIR_MIGRATION_VERSION
1865
+ const migrationKey = this._migrationKey(migrationVersion)
1866
+
1867
+ if (await this._hasMigration(db, migrationVersion)) return
1868
+
1869
+ const acquired = await db.acquireAdvisoryLock(migrationKey)
1870
+
1871
+ if (!acquired) throw new Error("Failed to acquire background jobs index repair lock")
1872
+
1873
+ try {
1874
+ if (await this._hasMigration(db, migrationVersion)) return
1875
+
1876
+ db.clearSchemaCache()
1877
+ const table = await db.getTableByNameOrFail(JOBS_TABLE)
1878
+ const indexedColumnNames = new Set(
1879
+ (await table.getIndexes())
1880
+ .filter((index) => !index.isPrimaryKey() && index.getColumnNames().length === 1)
1881
+ .map((index) => index.getColumnNames()[0])
1882
+ )
1883
+
1884
+ for (const columnName of JOBS_INDEX_COLUMN_NAMES) {
1885
+ if (indexedColumnNames.has(columnName)) continue
1886
+
1887
+ for (const sql of await db.createIndexSQLs({columns: [columnName], ifNotExists: db.getType() === "sqlite", tableName: JOBS_TABLE})) {
1888
+ await db.query(sql)
1889
+ }
1890
+ }
1891
+
1892
+ db.clearSchemaCache()
1893
+ await this._recordMigration(db, migrationVersion)
1894
+ } finally {
1895
+ await db.releaseAdvisoryLock(migrationKey)
1896
+ }
1841
1897
  }
1842
1898
 
1843
1899
  /**
@@ -2711,13 +2767,61 @@ export default class BackgroundJobsStore extends BackgroundJobsAdapter {
2711
2767
  */
2712
2768
  async _reconcileConcurrency(db) {
2713
2769
  if (!(await db.tableExists(CONCURRENCY_TABLE))) return
2714
- const concurrencyTable = db.quoteTable(CONCURRENCY_TABLE)
2715
- const jobsTable = db.quoteTable(JOBS_TABLE)
2716
- await db.query(
2717
- `UPDATE ${concurrencyTable} SET ${db.quoteColumn("active_count")} = (` +
2718
- `SELECT COUNT(*) FROM ${jobsTable} WHERE ${jobsTable}.${db.quoteColumn("status")} = ${db.quote("handed_off")} AND ` +
2719
- `${jobsTable}.${db.quoteColumn("concurrency_key")} = ${concurrencyTable}.${db.quoteColumn("concurrency_key")})`
2770
+ const activeRows = await db
2771
+ .newQuery()
2772
+ .from(JOBS_TABLE)
2773
+ .select("concurrency_key")
2774
+ .where({status: "handed_off"})
2775
+ .where(`${db.quoteColumn("concurrency_key")} IS NOT NULL`)
2776
+ .group("concurrency_key")
2777
+ .results()
2778
+ const staleRows = await db
2779
+ .newQuery()
2780
+ .from(CONCURRENCY_TABLE)
2781
+ .select("concurrency_key")
2782
+ .where(`${db.quoteColumn("active_count")} != 0`)
2783
+ .results()
2784
+ const concurrencyKeys = new Set(
2785
+ [...activeRows, ...staleRows].map((row) =>
2786
+ String(/** @type {Record<string, ReturnType<typeof JSON.parse>>} */ (row).concurrency_key)
2787
+ )
2720
2788
  )
2789
+
2790
+ for (const concurrencyKey of [...concurrencyKeys].sort()) {
2791
+ await this._transactionResult(db, async () => {
2792
+ await this._reconcileConcurrencyKey(db, concurrencyKey)
2793
+ })
2794
+ }
2795
+ }
2796
+
2797
+ /**
2798
+ * Rebuilds one counter after locking it ahead of the job rows, matching the
2799
+ * lock order used by handoff and completion transitions.
2800
+ * @param {import("../database/drivers/base.js").default} db - Database connection.
2801
+ * @param {string} concurrencyKey - Counter key.
2802
+ * @returns {Promise<void>} - Resolves when reconciled.
2803
+ */
2804
+ async _reconcileConcurrencyKey(db, concurrencyKey) {
2805
+ await this._lockConcurrencyRow(db, concurrencyKey)
2806
+ const rows = await db
2807
+ .newQuery()
2808
+ .from(JOBS_TABLE)
2809
+ .select("COUNT(*) AS active_count")
2810
+ .where({concurrency_key: concurrencyKey, status: "handed_off"})
2811
+ .results()
2812
+ const activeCount = this._normalizeNumber(
2813
+ /** @type {Record<string, ReturnType<typeof JSON.parse>>} */ (rows[0] || {}).active_count
2814
+ )
2815
+
2816
+ if (activeCount === null || !Number.isSafeInteger(activeCount) || activeCount < 0) {
2817
+ throw new Error(`Invalid reconciled background job concurrency count for ${concurrencyKey}: ${activeCount}`)
2818
+ }
2819
+
2820
+ await db.update({
2821
+ tableName: CONCURRENCY_TABLE,
2822
+ data: {active_count: activeCount},
2823
+ conditions: {concurrency_key: concurrencyKey}
2824
+ })
2721
2825
  }
2722
2826
 
2723
2827
  /**
@@ -2768,7 +2872,12 @@ export default class BackgroundJobsStore extends BackgroundJobsAdapter {
2768
2872
  )
2769
2873
  }
2770
2874
 
2771
- const concurrencyRows = await db.newQuery().from(CONCURRENCY_TABLE).select("concurrency_key").results()
2875
+ const concurrencyRows = await db
2876
+ .newQuery()
2877
+ .from(CONCURRENCY_TABLE)
2878
+ .select("concurrency_key")
2879
+ .where(`${db.quoteColumn("concurrency_key")} LIKE ${db.quote(`${QUEUE_CONCURRENCY_KEY_PREFIX}%`)}`)
2880
+ .results()
2772
2881
 
2773
2882
  for (const row of concurrencyRows) {
2774
2883
  const concurrencyKey = String(/** @type {Record<string, ReturnType<typeof JSON.parse>>} */ (row).concurrency_key)
@@ -375,6 +375,22 @@
375
375
  * @property {Record<string, ReturnType<typeof JSON.parse>>} [instance] - Optional custom attachment driver instance.
376
376
  */
377
377
 
378
+ /**
379
+ * Client-safe synchronization policy declared with a model attachment.
380
+ * @typedef {object} AttachmentSyncConfiguration
381
+ * @property {"eager" | "on-demand"} fetch - Whether clients prefetch the attachment or wait until it is requested.
382
+ * @property {"optional" | "required"} offlineRequirement - Whether an offline-ready scope requires the attachment bytes.
383
+ * @property {"durable" | "evictable"} retention - Whether clients may evict the attachment under storage pressure.
384
+ */
385
+
386
+ /**
387
+ * Model attachment declaration retained by the record class.
388
+ * @typedef {object} RecordAttachmentConfiguration
389
+ * @property {string | AttachmentDriverConstructor | Record<string, ReturnType<typeof JSON.parse>>} [driver] - Attachment driver name, class, or instance.
390
+ * @property {AttachmentSyncConfiguration} [sync] - Client-safe synchronized asset policy.
391
+ * @property {"hasOne" | "hasMany"} type - Attachment cardinality.
392
+ */
393
+
378
394
  /**
379
395
  * @typedef {object} AttachmentsConfiguration
380
396
  * @property {string} [defaultDriver] - Default attachment storage driver name.
@@ -418,6 +434,7 @@
418
434
 
419
435
  /**
420
436
  * @typedef {object} FrontendModelAttachmentConfiguration
437
+ * @property {AttachmentSyncConfiguration} [sync] - Client-side synchronized asset policy.
421
438
  * @property {"hasOne" | "hasMany"} type - Attachment cardinality.
422
439
  */
423
440
 
@@ -574,11 +591,26 @@
574
591
  */
575
592
 
576
593
  /**
577
- * @typedef {Omit<typeof import("./frontend-model-resource/base-resource.js").default, never> & {new (args: import("./frontend-model-resource/base-resource.js").FrontendModelResourceAbilityArgs | import("./frontend-model-resource/base-resource.js").FrontendModelResourceControllerArgs): import("./frontend-model-resource/base-resource.js").default<typeof import("./database/record/index.js").default>}} FrontendModelResourceClassType
594
+ * Unbound resource class used by model-agnostic registries.
595
+ * @typedef {Omit<typeof import("./frontend-model-resource/base-resource.js").default, "modelClass"> & {modelClass: () => typeof import("./database/record/index.js").default, new (args: never): import("./frontend-model-resource/base-resource.js").default<typeof import("./database/record/index.js").default>}} UnboundFrontendModelResourceClassType
596
+ */
597
+
598
+ /**
599
+ * Resource class bound to a specific model class.
600
+ * @template {import("./frontend-model-resource/base-resource.js").FrontendModelResourceModelClass} TModelClass
601
+ * @template {typeof import("./database/record/index.js").default} TDatabaseModelClass
602
+ * @typedef {Omit<typeof import("./frontend-model-resource/base-resource.js").default, "ModelClass" | "modelClass"> & {ModelClass: TModelClass | undefined, modelClass: () => TModelClass, new (args: import("./frontend-model-resource/base-resource.js").FrontendModelResourceAbilityArgs<TModelClass> | import("./frontend-model-resource/base-resource.js").FrontendModelResourceControllerArgs<TDatabaseModelClass>): import("./frontend-model-resource/base-resource.js").default<TModelClass, TDatabaseModelClass>}} BoundFrontendModelResourceClassType
603
+ */
604
+
605
+ /**
606
+ * @template {import("./frontend-model-resource/base-resource.js").FrontendModelResourceModelClass} [TModelClass=never]
607
+ * @template {typeof import("./database/record/index.js").default} [TDatabaseModelClass=Extract<TModelClass, typeof import("./database/record/index.js").default>]
608
+ * @typedef {[TModelClass] extends [never] ? UnboundFrontendModelResourceClassType : BoundFrontendModelResourceClassType<TModelClass, TDatabaseModelClass>} FrontendModelResourceClassType
578
609
  */
579
610
 
580
611
  /**
581
- * @typedef {FrontendModelResourceClassType} FrontendModelResourceDefinition
612
+ * @template {import("./frontend-model-resource/base-resource.js").FrontendModelResourceModelClass} [TModelClass=never]
613
+ * @typedef {FrontendModelResourceClassType<TModelClass>} FrontendModelResourceDefinition
582
614
  */
583
615
 
584
616
  /**