velocious 1.0.642 → 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.
- package/README.md +16 -2
- package/build/authorization/base-resource.js +18 -5
- package/build/configuration-types.js +34 -2
- package/build/database/record/index.js +42 -11
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +17 -3
- package/build/frontend-model-controller.js +10 -5
- package/build/frontend-model-resource/base-resource.js +95 -41
- package/build/frontend-models/base.js +1 -1
- package/build/src/authorization/base-resource.d.ts +19 -6
- package/build/src/authorization/base-resource.d.ts.map +1 -1
- package/build/src/authorization/base-resource.js +16 -6
- package/build/src/configuration-types.d.ts +72 -5
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +31 -3
- package/build/src/database/record/index.d.ts +44 -46
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +39 -12
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +19 -4
- package/build/src/frontend-model-controller.d.ts +1 -1
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +9 -6
- package/build/src/frontend-model-resource/base-resource.d.ts +66 -32
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +89 -42
- package/build/src/frontend-models/base.d.ts +1 -0
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +2 -2
- package/build/src/sync/sync-api-controller.d.ts.map +1 -1
- package/build/src/sync/sync-api-controller.js +6 -5
- package/build/src/sync/sync-envelope-replay-service.d.ts +1 -1
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +3 -2
- package/build/src/sync/sync-resource-base.d.ts +2 -0
- package/build/src/sync/sync-resource-base.d.ts.map +1 -1
- package/build/src/sync/sync-resource-base.js +3 -1
- package/build/sync/sync-api-controller.js +5 -5
- package/build/sync/sync-envelope-replay-service.js +2 -1
- package/build/sync/sync-resource-base.js +3 -0
- package/package.json +1 -1
- package/src/authorization/base-resource.js +18 -5
- package/src/configuration-types.js +34 -2
- package/src/database/record/index.js +42 -11
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +17 -3
- package/src/frontend-model-controller.js +10 -5
- package/src/frontend-model-resource/base-resource.js +95 -41
- package/src/frontend-models/base.js +1 -1
- package/src/sync/sync-api-controller.js +5 -5
- package/src/sync/sync-envelope-replay-service.js +2 -1
- 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
|
|
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 {
|
|
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
|
@@ -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 {
|
|
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
|
-
* @
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
86
|
+
* @returns {AuthorizationResourceModelClass} - Model class handled by this resource.
|
|
74
87
|
*/
|
|
75
88
|
requiredModelClass() {
|
|
76
89
|
const ResourceClass = /** @type {typeof AuthorizationBaseResource} */ (this.constructor)
|
|
@@ -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
|
-
*
|
|
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
|
-
* @
|
|
612
|
+
* @template {import("./frontend-model-resource/base-resource.js").FrontendModelResourceModelClass} [TModelClass=never]
|
|
613
|
+
* @typedef {FrontendModelResourceClassType<TModelClass>} FrontendModelResourceDefinition
|
|
582
614
|
*/
|
|
583
615
|
|
|
584
616
|
/**
|
|
@@ -71,6 +71,8 @@ import UUID from "pure-uuid"
|
|
|
71
71
|
* AttachmentDriverConstructor type.
|
|
72
72
|
* @typedef {import("../../configuration-types.js").AttachmentDriverConstructor} AttachmentDriverConstructor
|
|
73
73
|
*/
|
|
74
|
+
/** @typedef {import("../../configuration-types.js").AttachmentSyncConfiguration} AttachmentSyncConfiguration */
|
|
75
|
+
/** @typedef {import("../../configuration-types.js").RecordAttachmentConfiguration} RecordAttachmentConfiguration */
|
|
74
76
|
|
|
75
77
|
/** Stored values that a declared `"boolean"` cast reads back as `true`. */
|
|
76
78
|
const declaredBooleanTruthyValues = new Set([1, true, "1"])
|
|
@@ -238,7 +240,7 @@ class VelociousDatabaseRecord {
|
|
|
238
240
|
static _lifecycleCallbacks = undefined
|
|
239
241
|
/** @type {Record<string, typeof import("./validators/base.js").default> | undefined} */
|
|
240
242
|
static _validatorTypes = undefined
|
|
241
|
-
/** @type {Record<string,
|
|
243
|
+
/** @type {Record<string, RecordAttachmentConfiguration> | undefined} */
|
|
242
244
|
static _attachmentsMap = undefined
|
|
243
245
|
/** @type {Record<string, import("./relationships/base.js").default> | undefined} */
|
|
244
246
|
static _relationships = undefined
|
|
@@ -494,13 +496,13 @@ class VelociousDatabaseRecord {
|
|
|
494
496
|
|
|
495
497
|
/**
|
|
496
498
|
* Runs get attachments map.
|
|
497
|
-
* @returns {Record<string,
|
|
499
|
+
* @returns {Record<string, RecordAttachmentConfiguration>} - Attachment definitions keyed by name.
|
|
498
500
|
*/
|
|
499
501
|
static getAttachmentsMap() {
|
|
500
502
|
if (!this._attachmentsMap) {
|
|
501
503
|
/**
|
|
502
504
|
* Narrows the runtime value to the documented type.
|
|
503
|
-
* @type {Record<string,
|
|
505
|
+
* @type {Record<string, RecordAttachmentConfiguration>} */
|
|
504
506
|
this._attachmentsMap = {}
|
|
505
507
|
}
|
|
506
508
|
|
|
@@ -1165,16 +1167,25 @@ class VelociousDatabaseRecord {
|
|
|
1165
1167
|
|
|
1166
1168
|
/**
|
|
1167
1169
|
* Runs get attachments.
|
|
1168
|
-
* @returns {Record<string,
|
|
1170
|
+
* @returns {Record<string, RecordAttachmentConfiguration>} - Attachment definitions.
|
|
1169
1171
|
*/
|
|
1170
1172
|
static getAttachments() {
|
|
1171
1173
|
return this.getAttachmentsMap()
|
|
1172
1174
|
}
|
|
1173
1175
|
|
|
1176
|
+
/**
|
|
1177
|
+
* Returns attachment definitions through the model contract shared with
|
|
1178
|
+
* frontend model classes.
|
|
1179
|
+
* @returns {Record<string, RecordAttachmentConfiguration>} - Attachment definitions.
|
|
1180
|
+
*/
|
|
1181
|
+
static attachmentDefinitions() {
|
|
1182
|
+
return this.getAttachmentsMap()
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1174
1185
|
/**
|
|
1175
1186
|
* Runs get attachment by name.
|
|
1176
1187
|
* @param {string} attachmentName - Attachment name.
|
|
1177
|
-
* @returns {
|
|
1188
|
+
* @returns {RecordAttachmentConfiguration} - Attachment definition.
|
|
1178
1189
|
*/
|
|
1179
1190
|
static getAttachmentByName(attachmentName) {
|
|
1180
1191
|
const definition = this.getAttachmentsMap()[attachmentName]
|
|
@@ -1443,14 +1454,34 @@ class VelociousDatabaseRecord {
|
|
|
1443
1454
|
* @param {string} attachmentName - Attachment name.
|
|
1444
1455
|
* @param {object} args - Attachment args.
|
|
1445
1456
|
* @param {string | AttachmentDriverConstructor | Record<string, ReturnType<typeof JSON.parse>>} [args.driver] - Attachment driver name, class, or instance.
|
|
1457
|
+
* @param {AttachmentSyncConfiguration} [args.sync] - Client-safe synchronized asset policy.
|
|
1446
1458
|
* @param {"hasOne" | "hasMany"} args.type - Attachment type.
|
|
1447
1459
|
* @returns {void} - No return value.
|
|
1448
1460
|
*/
|
|
1449
|
-
static _defineAttachment(attachmentName, {driver, type}) {
|
|
1461
|
+
static _defineAttachment(attachmentName, {driver, sync, type}) {
|
|
1450
1462
|
if (!attachmentName || typeof attachmentName !== "string") throw new Error(`Invalid attachment name: ${attachmentName}`)
|
|
1451
1463
|
if (attachmentName in this.getAttachmentsMap()) throw new Error(`Attachment ${attachmentName} already exists`)
|
|
1452
1464
|
|
|
1453
|
-
|
|
1465
|
+
if (sync) {
|
|
1466
|
+
const {fetch, offlineRequirement, retention, ...restSync} = sync
|
|
1467
|
+
|
|
1468
|
+
restArgsError(restSync)
|
|
1469
|
+
|
|
1470
|
+
if (fetch !== "eager" && fetch !== "on-demand") {
|
|
1471
|
+
throw new Error(`Attachment ${attachmentName} sync fetch must be eager or on-demand`)
|
|
1472
|
+
}
|
|
1473
|
+
if (offlineRequirement !== "optional" && offlineRequirement !== "required") {
|
|
1474
|
+
throw new Error(`Attachment ${attachmentName} offline requirement must be optional or required`)
|
|
1475
|
+
}
|
|
1476
|
+
if (retention !== "durable" && retention !== "evictable") {
|
|
1477
|
+
throw new Error(`Attachment ${attachmentName} sync retention must be durable or evictable`)
|
|
1478
|
+
}
|
|
1479
|
+
if (offlineRequirement === "required" && retention !== "durable") {
|
|
1480
|
+
throw new Error(`Attachment ${attachmentName} required offline assets must use durable retention`)
|
|
1481
|
+
}
|
|
1482
|
+
}
|
|
1483
|
+
|
|
1484
|
+
this.getAttachmentsMap()[attachmentName] = {driver, sync, type}
|
|
1454
1485
|
|
|
1455
1486
|
const prototype = /** @type {Record<string, ReturnType<typeof JSON.parse>>} */ (/** @type {ReturnType<typeof JSON.parse>} */ (this.prototype))
|
|
1456
1487
|
|
|
@@ -1467,21 +1498,21 @@ class VelociousDatabaseRecord {
|
|
|
1467
1498
|
/**
|
|
1468
1499
|
* Adds a single attachment helper to the model.
|
|
1469
1500
|
* @param {string} attachmentName - Attachment name.
|
|
1470
|
-
* @param {{driver?: string | AttachmentDriverConstructor | Record<string, ReturnType<typeof JSON.parse
|
|
1501
|
+
* @param {{driver?: string | AttachmentDriverConstructor | Record<string, ReturnType<typeof JSON.parse>>, sync?: AttachmentSyncConfiguration}} [args] - Attachment options.
|
|
1471
1502
|
* @returns {void} - No return value.
|
|
1472
1503
|
*/
|
|
1473
1504
|
static hasOneAttachment(attachmentName, args = {}) {
|
|
1474
|
-
this._defineAttachment(attachmentName, {driver: args.driver, type: "hasOne"})
|
|
1505
|
+
this._defineAttachment(attachmentName, {driver: args.driver, sync: args.sync, type: "hasOne"})
|
|
1475
1506
|
}
|
|
1476
1507
|
|
|
1477
1508
|
/**
|
|
1478
1509
|
* Adds a collection attachment helper to the model.
|
|
1479
1510
|
* @param {string} attachmentName - Attachment name.
|
|
1480
|
-
* @param {{driver?: string | AttachmentDriverConstructor | Record<string, ReturnType<typeof JSON.parse
|
|
1511
|
+
* @param {{driver?: string | AttachmentDriverConstructor | Record<string, ReturnType<typeof JSON.parse>>, sync?: AttachmentSyncConfiguration}} [args] - Attachment options.
|
|
1481
1512
|
* @returns {void} - No return value.
|
|
1482
1513
|
*/
|
|
1483
1514
|
static hasManyAttachments(attachmentName, args = {}) {
|
|
1484
|
-
this._defineAttachment(attachmentName, {driver: args.driver, type: "hasMany"})
|
|
1515
|
+
this._defineAttachment(attachmentName, {driver: args.driver, sync: args.sync, type: "hasMany"})
|
|
1485
1516
|
}
|
|
1486
1517
|
|
|
1487
1518
|
/**
|
|
@@ -5,6 +5,7 @@ import path from "node:path"
|
|
|
5
5
|
import * as inflection from "inflection"
|
|
6
6
|
import {frontendModelResourceIsBuiltIn, frontendModelResourcesWithBuiltInsForBackendProject} from "../../../../../frontend-models/built-in-resources.js"
|
|
7
7
|
import {frontendModelResourceClassFromDefinition, frontendModelResourceConfigurationFromDefinition} from "../../../../../frontend-models/resource-definition.js"
|
|
8
|
+
import {frontendModelResourceInternalConstructor} from "../../../../../frontend-model-resource/base-resource.js"
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Attribute metadata used for generated frontend-model JSDoc.
|
|
@@ -381,7 +382,18 @@ export default class DbGenerateFrontendModels extends BaseCommand {
|
|
|
381
382
|
? "hasMany"
|
|
382
383
|
: "hasOne"
|
|
383
384
|
|
|
384
|
-
|
|
385
|
+
if (attachmentConfig.sync) {
|
|
386
|
+
fileContent += ` ${attachmentName}: {\n`
|
|
387
|
+
fileContent += " sync: {\n"
|
|
388
|
+
fileContent += ` fetch: ${JSON.stringify(attachmentConfig.sync.fetch)},\n`
|
|
389
|
+
fileContent += ` offlineRequirement: ${JSON.stringify(attachmentConfig.sync.offlineRequirement)},\n`
|
|
390
|
+
fileContent += ` retention: ${JSON.stringify(attachmentConfig.sync.retention)},\n`
|
|
391
|
+
fileContent += " },\n"
|
|
392
|
+
fileContent += ` type: ${JSON.stringify(attachmentType)}\n`
|
|
393
|
+
fileContent += " },\n"
|
|
394
|
+
} else {
|
|
395
|
+
fileContent += ` ${attachmentName}: {type: ${JSON.stringify(attachmentType)}},\n`
|
|
396
|
+
}
|
|
385
397
|
}
|
|
386
398
|
fileContent += " },\n"
|
|
387
399
|
}
|
|
@@ -857,7 +869,8 @@ export default class DbGenerateFrontendModels extends BaseCommand {
|
|
|
857
869
|
try {
|
|
858
870
|
const modelClass = resourceClass.modelClass()
|
|
859
871
|
|
|
860
|
-
const
|
|
872
|
+
const ResourceClass = frontendModelResourceInternalConstructor(resourceClass)
|
|
873
|
+
const instance = new ResourceClass({
|
|
861
874
|
ability: undefined,
|
|
862
875
|
context: {},
|
|
863
876
|
locals: {},
|
|
@@ -894,7 +907,8 @@ export default class DbGenerateFrontendModels extends BaseCommand {
|
|
|
894
907
|
try {
|
|
895
908
|
const modelClass = resourceClass.modelClass()
|
|
896
909
|
|
|
897
|
-
const
|
|
910
|
+
const ResourceClass = frontendModelResourceInternalConstructor(resourceClass)
|
|
911
|
+
const instance = new ResourceClass({
|
|
898
912
|
ability: undefined,
|
|
899
913
|
context: {},
|
|
900
914
|
locals: {},
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import {randomUUID} from "node:crypto"
|
|
4
4
|
import * as inflection from "inflection"
|
|
5
5
|
import Controller from "./controller.js"
|
|
6
|
-
import FrontendModelBaseResource from "./frontend-model-resource/base-resource.js"
|
|
6
|
+
import FrontendModelBaseResource, {frontendModelResourceInternalConstructor} from "./frontend-model-resource/base-resource.js"
|
|
7
7
|
import Response from "./http-server/client/response.js"
|
|
8
8
|
import {frontendModelResourcesWithBuiltInsForBackendProject} from "./frontend-models/built-in-resources.js"
|
|
9
9
|
import {frontendModelResourceClassFromDefinition, frontendModelResourceConfigurationFromDefinition, frontendModelResourcePath, frontendModelResourcesForBackendProject, frontendModelSyncManifestForBackendProjects} from "./frontend-models/resource-definition.js"
|
|
@@ -70,7 +70,7 @@ import {RansackQueryError, normalizeRansackGroup, parseRansackSort} from "./util
|
|
|
70
70
|
* @typedef {object} FrontendModelIndexQueryOptions
|
|
71
71
|
* @property {boolean} [includePagination] - Whether frontend-model pagination params should be applied.
|
|
72
72
|
* @property {boolean} [includeSort] - Whether frontend-model sort params should be applied.
|
|
73
|
-
* @property {import("./frontend-model-resource/base-resource.js").default} [resource] - Resource providing query hooks.
|
|
73
|
+
* @property {Pick<import("./frontend-model-resource/base-resource.js").default<import("./frontend-model-resource/base-resource.js").FrontendModelResourceModelClass>, "applyFrontendModelIndexPagination" | "applyFrontendModelIndexSearch" | "applyFrontendModelIndexSort">} [resource] - Resource providing query hooks.
|
|
74
74
|
*/
|
|
75
75
|
/** @typedef {import("./database/query/model-class-query.js").default & Record<symbol, Set<string> | undefined>} FrontendModelQueryMetadata */
|
|
76
76
|
/**
|
|
@@ -1040,7 +1040,9 @@ export default class FrontendModelController extends Controller {
|
|
|
1040
1040
|
resourceConfiguration: frontendModelResource.resourceConfiguration
|
|
1041
1041
|
}
|
|
1042
1042
|
|
|
1043
|
-
|
|
1043
|
+
const ResourceClass = frontendModelResourceInternalConstructor(frontendModelResource.resourceClass)
|
|
1044
|
+
|
|
1045
|
+
return new ResourceClass(resourceArgs)
|
|
1044
1046
|
}
|
|
1045
1047
|
|
|
1046
1048
|
/**
|
|
@@ -2908,7 +2910,9 @@ export default class FrontendModelController extends Controller {
|
|
|
2908
2910
|
const resourceClass = resourceDefinition ? frontendModelResourceClassFromDefinition(resourceDefinition) : null
|
|
2909
2911
|
|
|
2910
2912
|
if (resourceClass) {
|
|
2911
|
-
|
|
2913
|
+
const ResourceClass = frontendModelResourceInternalConstructor(resourceClass)
|
|
2914
|
+
|
|
2915
|
+
resource = new ResourceClass({
|
|
2912
2916
|
ability: this.currentAbility(),
|
|
2913
2917
|
// Propagate the controller so a related/preloaded model's serialization
|
|
2914
2918
|
// resource can use request context (e.g. `requestBaseUrl()` for signed
|
|
@@ -3985,7 +3989,8 @@ export default class FrontendModelController extends Controller {
|
|
|
3985
3989
|
|
|
3986
3990
|
if (!frontendModelResource) throw frontendSyncReplaySafeError(`Sync replay model is not enabled: ${mutation.model}`)
|
|
3987
3991
|
|
|
3988
|
-
const
|
|
3992
|
+
const ResourceClass = frontendModelResourceInternalConstructor(frontendModelResource.resourceClass)
|
|
3993
|
+
const resource = new ResourceClass({
|
|
3989
3994
|
ability: this.currentAbility(),
|
|
3990
3995
|
controller: this,
|
|
3991
3996
|
context: {
|