velocious 1.0.593 → 1.0.595

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 (136) hide show
  1. package/README.md +3 -2
  2. package/build/configuration.js +109 -14
  3. package/build/database/drivers/base.js +30 -0
  4. package/build/database/migrator.js +90 -24
  5. package/build/database/operation.js +55 -4
  6. package/build/database/query/join-object.js +7 -4
  7. package/build/database/query/model-class-query.js +38 -7
  8. package/build/database/query/preloader/belongs-to.js +9 -6
  9. package/build/database/query/preloader/has-many.js +25 -14
  10. package/build/database/query/preloader/has-one.js +7 -4
  11. package/build/database/query/preloader/query-for-model.js +16 -1
  12. package/build/database/query/preloader.js +6 -4
  13. package/build/database/query/query-data.js +3 -3
  14. package/build/database/query/where-model-class-hash.js +8 -4
  15. package/build/database/query/with-count.js +4 -3
  16. package/build/database/record/index.js +148 -5
  17. package/build/database/record/instance-relationships/base.js +13 -0
  18. package/build/database/record/instance-relationships/belongs-to.js +1 -1
  19. package/build/database/record/instance-relationships/has-many.js +5 -2
  20. package/build/database/record/instance-relationships/has-one.js +1 -1
  21. package/build/database/record/relationships/base.js +17 -0
  22. package/build/database/use-database.js +81 -28
  23. package/build/src/configuration.d.ts +31 -4
  24. package/build/src/configuration.d.ts.map +1 -1
  25. package/build/src/configuration.js +88 -17
  26. package/build/src/database/drivers/base.d.ts +11 -0
  27. package/build/src/database/drivers/base.d.ts.map +1 -1
  28. package/build/src/database/drivers/base.js +28 -1
  29. package/build/src/database/migrator.d.ts +34 -0
  30. package/build/src/database/migrator.d.ts.map +1 -1
  31. package/build/src/database/migrator.js +83 -23
  32. package/build/src/database/operation.d.ts +15 -1
  33. package/build/src/database/operation.d.ts.map +1 -1
  34. package/build/src/database/operation.js +52 -5
  35. package/build/src/database/query/join-object.d.ts.map +1 -1
  36. package/build/src/database/query/join-object.js +7 -5
  37. package/build/src/database/query/model-class-query.d.ts +6 -0
  38. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  39. package/build/src/database/query/model-class-query.js +33 -8
  40. package/build/src/database/query/preloader/belongs-to.d.ts.map +1 -1
  41. package/build/src/database/query/preloader/belongs-to.js +9 -7
  42. package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
  43. package/build/src/database/query/preloader/has-many.js +23 -16
  44. package/build/src/database/query/preloader/has-one.d.ts.map +1 -1
  45. package/build/src/database/query/preloader/has-one.js +7 -5
  46. package/build/src/database/query/preloader/query-for-model.d.ts +8 -0
  47. package/build/src/database/query/preloader/query-for-model.d.ts.map +1 -1
  48. package/build/src/database/query/preloader/query-for-model.js +15 -2
  49. package/build/src/database/query/preloader.d.ts.map +1 -1
  50. package/build/src/database/query/preloader.js +6 -5
  51. package/build/src/database/query/query-data.js +4 -4
  52. package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
  53. package/build/src/database/query/where-model-class-hash.js +7 -5
  54. package/build/src/database/query/with-count.js +5 -4
  55. package/build/src/database/record/index.d.ts +95 -0
  56. package/build/src/database/record/index.d.ts.map +1 -1
  57. package/build/src/database/record/index.js +126 -6
  58. package/build/src/database/record/instance-relationships/base.d.ts +6 -0
  59. package/build/src/database/record/instance-relationships/base.d.ts.map +1 -1
  60. package/build/src/database/record/instance-relationships/base.js +12 -1
  61. package/build/src/database/record/instance-relationships/belongs-to.js +2 -2
  62. package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
  63. package/build/src/database/record/instance-relationships/has-many.js +6 -3
  64. package/build/src/database/record/instance-relationships/has-one.js +2 -2
  65. package/build/src/database/record/relationships/base.d.ts +11 -0
  66. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  67. package/build/src/database/record/relationships/base.js +15 -1
  68. package/build/src/database/use-database.d.ts +33 -5
  69. package/build/src/database/use-database.d.ts.map +1 -1
  70. package/build/src/database/use-database.js +81 -30
  71. package/build/src/sync/server-change-feed.d.ts +14 -2
  72. package/build/src/sync/server-change-feed.d.ts.map +1 -1
  73. package/build/src/sync/server-change-feed.js +50 -10
  74. package/build/src/sync/sync-scope-store.d.ts +13 -2
  75. package/build/src/sync/sync-scope-store.d.ts.map +1 -1
  76. package/build/src/sync/sync-scope-store.js +48 -7
  77. package/build/src/tenants/frontend-tenant-sqlite-lifecycle.d.ts +43 -1
  78. package/build/src/tenants/frontend-tenant-sqlite-lifecycle.d.ts.map +1 -1
  79. package/build/src/tenants/frontend-tenant-sqlite-lifecycle.js +141 -17
  80. package/build/src/tenants/tenant-handle.d.ts +36 -0
  81. package/build/src/tenants/tenant-handle.d.ts.map +1 -1
  82. package/build/src/tenants/tenant-handle.js +73 -3
  83. package/build/src/testing/browser-test-app.js +3 -1
  84. package/build/src/testing/browser-use-database-hook-scenarios.d.ts +16 -0
  85. package/build/src/testing/browser-use-database-hook-scenarios.d.ts.map +1 -0
  86. package/build/src/testing/browser-use-database-hook-scenarios.js +182 -0
  87. package/build/src/testing/test-runner.d.ts.map +1 -1
  88. package/build/src/testing/test-runner.js +9 -8
  89. package/build/src/utils/model-scope.d.ts +2 -2
  90. package/build/src/utils/model-scope.d.ts.map +1 -1
  91. package/build/src/utils/model-scope.js +5 -3
  92. package/build/src/utils/ransack.d.ts.map +1 -1
  93. package/build/src/utils/ransack.js +5 -3
  94. package/build/sync/server-change-feed.js +58 -8
  95. package/build/sync/sync-scope-store.js +55 -5
  96. package/build/tenants/frontend-tenant-sqlite-lifecycle.js +150 -15
  97. package/build/tenants/tenant-handle.js +90 -6
  98. package/build/testing/browser-test-app.js +2 -0
  99. package/build/testing/browser-use-database-hook-scenarios.js +204 -0
  100. package/build/testing/test-runner.js +8 -7
  101. package/build/tsconfig.tsbuildinfo +1 -1
  102. package/build/utils/model-scope.js +5 -2
  103. package/build/utils/ransack.js +5 -2
  104. package/package.json +2 -1
  105. package/scripts/browser-test-session.js +60 -0
  106. package/scripts/test-browser.js +7 -7
  107. package/src/configuration.js +109 -14
  108. package/src/database/drivers/base.js +30 -0
  109. package/src/database/migrator.js +90 -24
  110. package/src/database/operation.js +55 -4
  111. package/src/database/query/join-object.js +7 -4
  112. package/src/database/query/model-class-query.js +38 -7
  113. package/src/database/query/preloader/belongs-to.js +9 -6
  114. package/src/database/query/preloader/has-many.js +25 -14
  115. package/src/database/query/preloader/has-one.js +7 -4
  116. package/src/database/query/preloader/query-for-model.js +16 -1
  117. package/src/database/query/preloader.js +6 -4
  118. package/src/database/query/query-data.js +3 -3
  119. package/src/database/query/where-model-class-hash.js +8 -4
  120. package/src/database/query/with-count.js +4 -3
  121. package/src/database/record/index.js +148 -5
  122. package/src/database/record/instance-relationships/base.js +13 -0
  123. package/src/database/record/instance-relationships/belongs-to.js +1 -1
  124. package/src/database/record/instance-relationships/has-many.js +5 -2
  125. package/src/database/record/instance-relationships/has-one.js +1 -1
  126. package/src/database/record/relationships/base.js +17 -0
  127. package/src/database/use-database.js +81 -28
  128. package/src/sync/server-change-feed.js +58 -8
  129. package/src/sync/sync-scope-store.js +55 -5
  130. package/src/tenants/frontend-tenant-sqlite-lifecycle.js +150 -15
  131. package/src/tenants/tenant-handle.js +90 -6
  132. package/src/testing/browser-test-app.js +2 -0
  133. package/src/testing/browser-use-database-hook-scenarios.js +204 -0
  134. package/src/testing/test-runner.js +8 -7
  135. package/src/utils/model-scope.js +5 -2
  136. package/src/utils/ransack.js +5 -2
@@ -5,36 +5,87 @@ import Configuration from "../configuration.js";
5
5
  import Migrator from "./migrator.js";
6
6
  import restArgsError from "../utils/rest-args-error.js";
7
7
  /**
8
- * Runs load migrations.
9
- * @param {object} args - Options object.
10
- * @param {() => Promise<import("./migrator/types.js").RequireMigrationContextType>} args.migrationsRequireContextCallback - Migrations require context callback.
11
- * @returns {{loaded: boolean}} - Whether the database was loaded by this call.
8
+ * Initializes either the legacy ambient frontend database or one immutable
9
+ * tenant-bound physical database generation.
10
+ * @param {object} args - Initialization options.
11
+ * @param {import("../configuration.js").default} args.configuration - Current frontend configuration.
12
+ * @param {string} [args.databaseIdentifier] - Tenant-only logical database identifier.
13
+ * @param {() => Promise<import("./migrator/types.js").RequireMigrationContextType>} args.migrationsRequireContextCallback - Migrations loader.
14
+ * @param {string} [args.schemaGeneration] - Tenant schema generation.
15
+ * @param {import("../tenants/tenant-handle.js").default} [args.tenantHandle] - Immutable tenant handle.
16
+ * @returns {Promise<void>} - Resolves when the selected database is ready.
12
17
  */
13
- export default function loadMigrations({ migrationsRequireContextCallback, ...restArgs }) {
14
- const instance = React.useMemo(() => ({ running: false }), []);
15
- const { isServer } = useEnvSense();
16
- const [loaded, setLoaded] = React.useState(false);
17
- const loadDatabase = React.useCallback(async () => {
18
- instance.running = true;
19
- try {
20
- await Configuration.current().ensureConnections({ name: "React database migration loader" }, async () => {
21
- const migrator = new Migrator({ configuration: Configuration.current() });
22
- await migrator.prepare();
23
- await migrator.migrateFilesFromRequireContext(await migrationsRequireContextCallback());
24
- });
25
- await Configuration.current().initialize();
26
- setLoaded(true);
27
- }
28
- finally {
29
- instance.running = false;
30
- }
31
- }, []);
32
- React.useMemo(() => {
33
- if (!loaded && !isServer && !instance.running) {
34
- loadDatabase();
35
- }
36
- }, [loaded]);
18
+ export async function initializeFrontendDatabase({ configuration, databaseIdentifier, migrationsRequireContextCallback, schemaGeneration, tenantHandle }) {
19
+ if (tenantHandle) {
20
+ tenantHandle.assertConfiguration(configuration);
21
+ if (!databaseIdentifier)
22
+ throw new Error("Tenant frontend database initialization requires databaseIdentifier");
23
+ if (!schemaGeneration)
24
+ throw new Error("Tenant frontend database initialization requires schemaGeneration");
25
+ await tenantHandle.initialize({
26
+ databaseIdentifier,
27
+ migrations: await migrationsRequireContextCallback(),
28
+ schemaGeneration
29
+ });
30
+ await configuration.initialize();
31
+ return;
32
+ }
33
+ if (databaseIdentifier || schemaGeneration) {
34
+ throw new Error("Tenant frontend database initialization requires tenantHandle");
35
+ }
36
+ await configuration.ensureConnections({ name: "React database migration loader" }, async () => {
37
+ const migrator = new Migrator({ configuration });
38
+ await migrator.prepare();
39
+ await migrator.migrateFilesFromRequireContext(await migrationsRequireContextCallback());
40
+ });
41
+ await configuration.initialize();
42
+ }
43
+ /**
44
+ * React lifecycle hook for frontend database readiness. With `tenantHandle`,
45
+ * readiness follows that immutable physical tenant plus `schemaGeneration`;
46
+ * changing either cancels the stale render result without cancelling shared
47
+ * lifecycle work needed by another caller.
48
+ * @param {object} args - Hook options.
49
+ * @param {string} [args.databaseIdentifier] - Tenant-only logical database identifier.
50
+ * @param {() => Promise<import("./migrator/types.js").RequireMigrationContextType>} args.migrationsRequireContextCallback - Migrations loader.
51
+ * @param {string} [args.schemaGeneration] - Tenant schema generation.
52
+ * @param {import("../tenants/tenant-handle.js").default} [args.tenantHandle] - Immutable tenant handle.
53
+ * @returns {{error: Error | null, loaded: boolean}} - Selected database readiness.
54
+ */
55
+ export default function useDatabase({ databaseIdentifier, migrationsRequireContextCallback, schemaGeneration, tenantHandle, ...restArgs }) {
37
56
  restArgsError(restArgs);
38
- return { loaded };
57
+ const { isServer } = useEnvSense();
58
+ const migrationsRequireContextCallbackRef = React.useRef(migrationsRequireContextCallback);
59
+ migrationsRequireContextCallbackRef.current = migrationsRequireContextCallback;
60
+ const selection = React.useMemo(() => {
61
+ if (isServer)
62
+ return undefined;
63
+ return { configuration: Configuration.current(), databaseIdentifier, schemaGeneration, tenantHandle };
64
+ }, [isServer, databaseIdentifier, schemaGeneration, tenantHandle]);
65
+ const [state, setState] = React.useState({ error: /** @type {Error | null} */ (null), loaded: false, selection });
66
+ React.useEffect(() => {
67
+ if (!selection)
68
+ return undefined;
69
+ let current = true;
70
+ const migrationsLoader = migrationsRequireContextCallbackRef.current;
71
+ setState({ error: null, loaded: false, selection });
72
+ void initializeFrontendDatabase({
73
+ configuration: selection.configuration,
74
+ databaseIdentifier: selection.databaseIdentifier,
75
+ migrationsRequireContextCallback: migrationsLoader,
76
+ schemaGeneration: selection.schemaGeneration,
77
+ tenantHandle: selection.tenantHandle
78
+ }).then(() => {
79
+ if (current)
80
+ setState({ error: null, loaded: true, selection });
81
+ }, (error) => {
82
+ if (current)
83
+ setState({ error: error instanceof Error ? error : new Error(String(error)), loaded: false, selection });
84
+ });
85
+ return () => { current = false; };
86
+ }, [selection]);
87
+ if (state.selection !== selection)
88
+ return { error: null, loaded: false };
89
+ return { error: state.error, loaded: state.loaded };
39
90
  }
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWRhdGFiYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3VzZS1kYXRhYmFzZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBQ3pCLE9BQU8sV0FBVyxNQUFNLGtDQUFrQyxDQUFBO0FBRTFELE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sUUFBUSxNQUFNLGVBQWUsQ0FBQTtBQUNwQyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUV2RDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxPQUFPLFVBQVUsY0FBYyxDQUFDLEVBQUMsZ0NBQWdDLEVBQUUsR0FBRyxRQUFRLEVBQUM7SUFDcEYsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDNUQsTUFBTSxFQUFDLFFBQVEsRUFBQyxHQUFHLFdBQVcsRUFBRSxDQUFBO0lBQ2hDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVqRCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2hELFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1FBRXZCLElBQUksQ0FBQztZQUNILE1BQU0sYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUMsSUFBSSxFQUFFLGlDQUFpQyxFQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BHLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLEVBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsRUFBQyxDQUFDLENBQUE7Z0JBRXZFLE1BQU0sUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFBO2dCQUN4QixNQUFNLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQyxNQUFNLGdDQUFnQyxFQUFFLENBQUMsQ0FBQTtZQUN6RixDQUFDLENBQUMsQ0FBQTtZQUVGLE1BQU0sYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFBO1lBQzFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNqQixDQUFDO2dCQUFTLENBQUM7WUFDVCxRQUFRLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtRQUMxQixDQUFDO0lBQ0gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBRU4sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7UUFDakIsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QyxZQUFZLEVBQUUsQ0FBQTtRQUNoQixDQUFDO0lBQ0gsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUVaLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUV2QixPQUFPLEVBQUMsTUFBTSxFQUFDLENBQUE7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCB1c2VFbnZTZW5zZSBmcm9tIFwiZW52LXNlbnNlL2J1aWxkL3VzZS1lbnYtc2Vuc2UuanNcIlxuXG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tIFwiLi4vY29uZmlndXJhdGlvbi5qc1wiXG5pbXBvcnQgTWlncmF0b3IgZnJvbSBcIi4vbWlncmF0b3IuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbi8qKlxuICogUnVucyBsb2FkIG1pZ3JhdGlvbnMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPGltcG9ydChcIi4vbWlncmF0b3IvdHlwZXMuanNcIikuUmVxdWlyZU1pZ3JhdGlvbkNvbnRleHRUeXBlPn0gYXJncy5taWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFjayAtIE1pZ3JhdGlvbnMgcmVxdWlyZSBjb250ZXh0IGNhbGxiYWNrLlxuICogQHJldHVybnMge3tsb2FkZWQ6IGJvb2xlYW59fSAtIFdoZXRoZXIgdGhlIGRhdGFiYXNlIHdhcyBsb2FkZWQgYnkgdGhpcyBjYWxsLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2FkTWlncmF0aW9ucyh7bWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2ssIC4uLnJlc3RBcmdzfSkge1xuICBjb25zdCBpbnN0YW5jZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtydW5uaW5nOiBmYWxzZX0pLCBbXSlcbiAgY29uc3Qge2lzU2VydmVyfSA9IHVzZUVudlNlbnNlKClcbiAgY29uc3QgW2xvYWRlZCwgc2V0TG9hZGVkXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKVxuXG4gIGNvbnN0IGxvYWREYXRhYmFzZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpbnN0YW5jZS5ydW5uaW5nID0gdHJ1ZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IENvbmZpZ3VyYXRpb24uY3VycmVudCgpLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBcIlJlYWN0IGRhdGFiYXNlIG1pZ3JhdGlvbiBsb2FkZXJcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbWlncmF0b3IgPSBuZXcgTWlncmF0b3Ioe2NvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb24uY3VycmVudCgpfSlcblxuICAgICAgICBhd2FpdCBtaWdyYXRvci5wcmVwYXJlKClcbiAgICAgICAgYXdhaXQgbWlncmF0b3IubWlncmF0ZUZpbGVzRnJvbVJlcXVpcmVDb250ZXh0KGF3YWl0IG1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dENhbGxiYWNrKCkpXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCBDb25maWd1cmF0aW9uLmN1cnJlbnQoKS5pbml0aWFsaXplKClcbiAgICAgIHNldExvYWRlZCh0cnVlKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpbnN0YW5jZS5ydW5uaW5nID0gZmFsc2VcbiAgICB9XG4gIH0sIFtdKVxuXG4gIFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghbG9hZGVkICYmICFpc1NlcnZlciAmJiAhaW5zdGFuY2UucnVubmluZykge1xuICAgICAgbG9hZERhdGFiYXNlKClcbiAgICB9XG4gIH0sIFtsb2FkZWRdKVxuXG4gIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgcmV0dXJuIHtsb2FkZWR9XG59XG4iXX0=
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWRhdGFiYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3VzZS1kYXRhYmFzZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBQ3pCLE9BQU8sV0FBVyxNQUFNLGtDQUFrQyxDQUFBO0FBRTFELE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sUUFBUSxNQUFNLGVBQWUsQ0FBQTtBQUNwQyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUV2RDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSwwQkFBMEIsQ0FBQyxFQUFDLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxnQ0FBZ0MsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUM7SUFDcEosSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixZQUFZLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDL0MsSUFBSSxDQUFDLGtCQUFrQjtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQTtRQUMvRyxJQUFJLENBQUMsZ0JBQWdCO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtRUFBbUUsQ0FBQyxDQUFBO1FBRTNHLE1BQU0sWUFBWSxDQUFDLFVBQVUsQ0FBQztZQUM1QixrQkFBa0I7WUFDbEIsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLEVBQUU7WUFDcEQsZ0JBQWdCO1NBQ2pCLENBQUMsQ0FBQTtRQUNGLE1BQU0sYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ2hDLE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBSSxrQkFBa0IsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0RBQStELENBQUMsQ0FBQTtJQUNsRixDQUFDO0lBRUQsTUFBTSxhQUFhLENBQUMsaUJBQWlCLENB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LENBQUMsQ0FBQyxDQUFBO0lBQ2xDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7SUFFZixJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUMsQ0FBQTtJQUV0RSxPQUFPLEVBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUMsQ0FBQTtBQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHVzZUVudlNlbnNlIGZyb20gXCJlbnYtc2Vuc2UvYnVpbGQvdXNlLWVudi1zZW5zZS5qc1wiXG5cbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gXCIuLi9jb25maWd1cmF0aW9uLmpzXCJcbmltcG9ydCBNaWdyYXRvciBmcm9tIFwiLi9taWdyYXRvci5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuLyoqXG4gKiBJbml0aWFsaXplcyBlaXRoZXIgdGhlIGxlZ2FjeSBhbWJpZW50IGZyb250ZW5kIGRhdGFiYXNlIG9yIG9uZSBpbW11dGFibGVcbiAqIHRlbmFudC1ib3VuZCBwaHlzaWNhbCBkYXRhYmFzZSBnZW5lcmF0aW9uLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBJbml0aWFsaXphdGlvbiBvcHRpb25zLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIEN1cnJlbnQgZnJvbnRlbmQgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kYXRhYmFzZUlkZW50aWZpZXJdIC0gVGVuYW50LW9ubHkgbG9naWNhbCBkYXRhYmFzZSBpZGVudGlmaWVyLlxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPGltcG9ydChcIi4vbWlncmF0b3IvdHlwZXMuanNcIikuUmVxdWlyZU1pZ3JhdGlvbkNvbnRleHRUeXBlPn0gYXJncy5taWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFjayAtIE1pZ3JhdGlvbnMgbG9hZGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnNjaGVtYUdlbmVyYXRpb25dIC0gVGVuYW50IHNjaGVtYSBnZW5lcmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi90ZW5hbnRzL3RlbmFudC1oYW5kbGUuanNcIikuZGVmYXVsdH0gW2FyZ3MudGVuYW50SGFuZGxlXSAtIEltbXV0YWJsZSB0ZW5hbnQgaGFuZGxlLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgc2VsZWN0ZWQgZGF0YWJhc2UgaXMgcmVhZHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplRnJvbnRlbmREYXRhYmFzZSh7Y29uZmlndXJhdGlvbiwgZGF0YWJhc2VJZGVudGlmaWVyLCBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFjaywgc2NoZW1hR2VuZXJhdGlvbiwgdGVuYW50SGFuZGxlfSkge1xuICBpZiAodGVuYW50SGFuZGxlKSB7XG4gICAgdGVuYW50SGFuZGxlLmFzc2VydENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbilcbiAgICBpZiAoIWRhdGFiYXNlSWRlbnRpZmllcikgdGhyb3cgbmV3IEVycm9yKFwiVGVuYW50IGZyb250ZW5kIGRhdGFiYXNlIGluaXRpYWxpemF0aW9uIHJlcXVpcmVzIGRhdGFiYXNlSWRlbnRpZmllclwiKVxuICAgIGlmICghc2NoZW1hR2VuZXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiVGVuYW50IGZyb250ZW5kIGRhdGFiYXNlIGluaXRpYWxpemF0aW9uIHJlcXVpcmVzIHNjaGVtYUdlbmVyYXRpb25cIilcblxuICAgIGF3YWl0IHRlbmFudEhhbmRsZS5pbml0aWFsaXplKHtcbiAgICAgIGRhdGFiYXNlSWRlbnRpZmllcixcbiAgICAgIG1pZ3JhdGlvbnM6IGF3YWl0IG1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dENhbGxiYWNrKCksXG4gICAgICBzY2hlbWFHZW5lcmF0aW9uXG4gICAgfSlcbiAgICBhd2FpdCBjb25maWd1cmF0aW9uLmluaXRpYWxpemUoKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChkYXRhYmFzZUlkZW50aWZpZXIgfHwgc2NoZW1hR2VuZXJhdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRlbmFudCBmcm9udGVuZCBkYXRhYmFzZSBpbml0aWFsaXphdGlvbiByZXF1aXJlcyB0ZW5hbnRIYW5kbGVcIilcbiAgfVxuXG4gIGF3YWl0IGNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IFwiUmVhY3QgZGF0YWJhc2UgbWlncmF0aW9uIGxvYWRlclwifSwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1pZ3JhdG9yID0gbmV3IE1pZ3JhdG9yKHtjb25maWd1cmF0aW9ufSlcblxuICAgIGF3YWl0IG1pZ3JhdG9yLnByZXBhcmUoKVxuICAgIGF3YWl0IG1pZ3JhdG9yLm1pZ3JhdGVGaWxlc0Zyb21SZXF1aXJlQ29udGV4dChhd2FpdCBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFjaygpKVxuICB9KVxuXG4gIGF3YWl0IGNvbmZpZ3VyYXRpb24uaW5pdGlhbGl6ZSgpXG59XG5cbi8qKlxuICogUmVhY3QgbGlmZWN5Y2xlIGhvb2sgZm9yIGZyb250ZW5kIGRhdGFiYXNlIHJlYWRpbmVzcy4gV2l0aCBgdGVuYW50SGFuZGxlYCxcbiAqIHJlYWRpbmVzcyBmb2xsb3dzIHRoYXQgaW1tdXRhYmxlIHBoeXNpY2FsIHRlbmFudCBwbHVzIGBzY2hlbWFHZW5lcmF0aW9uYDtcbiAqIGNoYW5naW5nIGVpdGhlciBjYW5jZWxzIHRoZSBzdGFsZSByZW5kZXIgcmVzdWx0IHdpdGhvdXQgY2FuY2VsbGluZyBzaGFyZWRcbiAqIGxpZmVjeWNsZSB3b3JrIG5lZWRlZCBieSBhbm90aGVyIGNhbGxlci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gSG9vayBvcHRpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRhdGFiYXNlSWRlbnRpZmllcl0gLSBUZW5hbnQtb25seSBsb2dpY2FsIGRhdGFiYXNlIGlkZW50aWZpZXIuXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8aW1wb3J0KFwiLi9taWdyYXRvci90eXBlcy5qc1wiKS5SZXF1aXJlTWlncmF0aW9uQ29udGV4dFR5cGU+fSBhcmdzLm1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dENhbGxiYWNrIC0gTWlncmF0aW9ucyBsb2FkZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Muc2NoZW1hR2VuZXJhdGlvbl0gLSBUZW5hbnQgc2NoZW1hIGdlbmVyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3RlbmFudHMvdGVuYW50LWhhbmRsZS5qc1wiKS5kZWZhdWx0fSBbYXJncy50ZW5hbnRIYW5kbGVdIC0gSW1tdXRhYmxlIHRlbmFudCBoYW5kbGUuXG4gKiBAcmV0dXJucyB7e2Vycm9yOiBFcnJvciB8IG51bGwsIGxvYWRlZDogYm9vbGVhbn19IC0gU2VsZWN0ZWQgZGF0YWJhc2UgcmVhZGluZXNzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VEYXRhYmFzZSh7ZGF0YWJhc2VJZGVudGlmaWVyLCBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFjaywgc2NoZW1hR2VuZXJhdGlvbiwgdGVuYW50SGFuZGxlLCAuLi5yZXN0QXJnc30pIHtcbiAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICBjb25zdCB7aXNTZXJ2ZXJ9ID0gdXNlRW52U2Vuc2UoKVxuICBjb25zdCBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFja1JlZiA9IFJlYWN0LnVzZVJlZihtaWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFjaylcblxuICBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFja1JlZi5jdXJyZW50ID0gbWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2tcblxuICBjb25zdCBzZWxlY3Rpb24gPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoaXNTZXJ2ZXIpIHJldHVybiB1bmRlZmluZWRcblxuICAgIHJldHVybiB7Y29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbi5jdXJyZW50KCksIGRhdGFiYXNlSWRlbnRpZmllciwgc2NoZW1hR2VuZXJhdGlvbiwgdGVuYW50SGFuZGxlfVxuICB9LCBbaXNTZXJ2ZXIsIGRhdGFiYXNlSWRlbnRpZmllciwgc2NoZW1hR2VuZXJhdGlvbiwgdGVuYW50SGFuZGxlXSlcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSBSZWFjdC51c2VTdGF0ZSh7ZXJyb3I6IC8qKiBAdHlwZSB7RXJyb3IgfCBudWxsfSAqLyAobnVsbCksIGxvYWRlZDogZmFsc2UsIHNlbGVjdGlvbn0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXNlbGVjdGlvbikgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgbGV0IGN1cnJlbnQgPSB0cnVlXG4gICAgY29uc3QgbWlncmF0aW9uc0xvYWRlciA9IG1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dENhbGxiYWNrUmVmLmN1cnJlbnRcblxuICAgIHNldFN0YXRlKHtlcnJvcjogbnVsbCwgbG9hZGVkOiBmYWxzZSwgc2VsZWN0aW9ufSlcbiAgICB2b2lkIGluaXRpYWxpemVGcm9udGVuZERhdGFiYXNlKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHNlbGVjdGlvbi5jb25maWd1cmF0aW9uLFxuICAgICAgZGF0YWJhc2VJZGVudGlmaWVyOiBzZWxlY3Rpb24uZGF0YWJhc2VJZGVudGlmaWVyLFxuICAgICAgbWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2s6IG1pZ3JhdGlvbnNMb2FkZXIsXG4gICAgICBzY2hlbWFHZW5lcmF0aW9uOiBzZWxlY3Rpb24uc2NoZW1hR2VuZXJhdGlvbixcbiAgICAgIHRlbmFudEhhbmRsZTogc2VsZWN0aW9uLnRlbmFudEhhbmRsZVxuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKGN1cnJlbnQpIHNldFN0YXRlKHtlcnJvcjogbnVsbCwgbG9hZGVkOiB0cnVlLCBzZWxlY3Rpb259KVxuICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgaWYgKGN1cnJlbnQpIHNldFN0YXRlKHtlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpLCBsb2FkZWQ6IGZhbHNlLCBzZWxlY3Rpb259KVxuICAgIH0pXG5cbiAgICByZXR1cm4gKCkgPT4geyBjdXJyZW50ID0gZmFsc2UgfVxuICB9LCBbc2VsZWN0aW9uXSlcblxuICBpZiAoc3RhdGUuc2VsZWN0aW9uICE9PSBzZWxlY3Rpb24pIHJldHVybiB7ZXJyb3I6IG51bGwsIGxvYWRlZDogZmFsc2V9XG5cbiAgcmV0dXJuIHtlcnJvcjogc3RhdGUuZXJyb3IsIGxvYWRlZDogc3RhdGUubG9hZGVkfVxufVxuIl19
@@ -120,7 +120,13 @@ export default class ServerChangeFeedStore {
120
120
  _memoryChanges: ServerChangeFeedEntry[];
121
121
  _memorySequence: number;
122
122
  _isReady: boolean;
123
+ /** @type {Promise<void> | null} */
123
124
  _readyPromise: Promise<void> | null;
125
+ /** @type {WeakMap<import("../database/drivers/base.js").default, {completion: Promise<void>, promise: Promise<void>}>} */
126
+ _transactionReadyPromises: WeakMap<import("../database/drivers/base.js").default, {
127
+ completion: Promise<void>;
128
+ promise: Promise<void>;
129
+ }>;
124
130
  /**
125
131
  * Runs constructor.
126
132
  * @param {object} args - Options.
@@ -138,6 +144,12 @@ export default class ServerChangeFeedStore {
138
144
  * @returns {Promise<void>} - Resolves when ready.
139
145
  */
140
146
  ensureReady(): Promise<void>;
147
+ /**
148
+ * Coordinates durable and transaction-local readiness on one connection.
149
+ * @param {import("../database/drivers/base.js").default} db - Database connection.
150
+ * @returns {Promise<void>} Resolves when this caller can use the table.
151
+ */
152
+ _ensureReadyWithDb(db: import("../database/drivers/base.js").default): Promise<void>;
141
153
  /**
142
154
  * Appends a change and assigns the next server sequence.
143
155
  * @param {Omit<ServerChangeFeedEntry, "createdAt" | "id" | "serverSequence"> & {createdAt?: string, id?: string}} change - Change payload.
@@ -187,9 +199,9 @@ export default class ServerChangeFeedStore {
187
199
  /**
188
200
  * Ensures changes table exists.
189
201
  * @param {import("../database/drivers/base.js").default} db - Database connection.
190
- * @returns {Promise<void>} - Resolves when complete.
202
+ * @returns {Promise<boolean>} - Whether the table had to be created.
191
203
  */
192
- _ensureChangesTable(db: import("../database/drivers/base.js").default): Promise<void>;
204
+ _ensureChangesTable(db: import("../database/drivers/base.js").default): Promise<boolean>;
193
205
  /**
194
206
  * Resolves a persisted change by id.
195
207
  * @param {import("../database/drivers/base.js").default} db - Database connection.
@@ -1 +1 @@
1
- {"version":3,"file":"server-change-feed.d.ts","sourceRoot":"","sources":["../../../src/sync/server-change-feed.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server-change-feed.d.ts","sourceRoot":"","sources":["../../../src/sync/server-change-feed.js"],"names":[],"mappings":"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"}
@@ -69,7 +69,10 @@ export default class ServerChangeFeedStore {
69
69
  this._memoryChanges = [];
70
70
  this._memorySequence = 0;
71
71
  this._isReady = false;
72
+ /** @type {Promise<void> | null} */
72
73
  this._readyPromise = null;
74
+ /** @type {WeakMap<import("../database/drivers/base.js").default, {completion: Promise<void>, promise: Promise<void>}>} */
75
+ this._transactionReadyPromises = new WeakMap();
73
76
  }
74
77
  /**
75
78
  * Ensures the backing table exists.
@@ -82,15 +85,51 @@ export default class ServerChangeFeedStore {
82
85
  }
83
86
  if (await this._schemaReady())
84
87
  return;
85
- if (this._readyPromise)
86
- return await this._readyPromise;
87
- this._readyPromise = (async () => {
88
- this.configuration.setCurrent();
89
- await this._withDb(async (db) => {
90
- await this._ensureChangesTable(db);
88
+ this.configuration.setCurrent();
89
+ await this._withDb(async (db) => await this._ensureReadyWithDb(db));
90
+ }
91
+ /**
92
+ * Coordinates durable and transaction-local readiness on one connection.
93
+ * @param {import("../database/drivers/base.js").default} db - Database connection.
94
+ * @returns {Promise<void>} Resolves when this caller can use the table.
95
+ */
96
+ async _ensureReadyWithDb(db) {
97
+ if (this._isReady)
98
+ return;
99
+ const transactionCompletion = db.insideTransaction() ? db.transactionCompletion() : null;
100
+ const transactionReady = this._transactionReadyPromises.get(db);
101
+ if (transactionCompletion && transactionReady?.completion === transactionCompletion) {
102
+ await transactionReady.promise;
103
+ return;
104
+ }
105
+ if (this._readyPromise) {
106
+ const readyPromise = this._readyPromise;
107
+ await readyPromise;
108
+ if (this._readyPromise === readyPromise)
109
+ this._readyPromise = null;
110
+ if (this._isReady)
111
+ return;
112
+ await this.ensureReady();
113
+ return;
114
+ }
115
+ if (transactionCompletion) {
116
+ const tableReadyPromise = this._ensureChangesTable(db);
117
+ const transactionReadyPromise = tableReadyPromise.then(() => undefined);
118
+ const durableReadyPromise = tableReadyPromise.then(async (created) => {
119
+ if (!created) {
120
+ this._isReady = true;
121
+ return;
122
+ }
123
+ await transactionCompletion;
91
124
  });
125
+ this._transactionReadyPromises.set(db, { completion: transactionCompletion, promise: transactionReadyPromise });
126
+ this._readyPromise = durableReadyPromise;
127
+ await transactionReadyPromise;
128
+ return;
129
+ }
130
+ this._readyPromise = this._ensureChangesTable(db).then(() => {
92
131
  this._isReady = true;
93
- })();
132
+ });
94
133
  try {
95
134
  await this._readyPromise;
96
135
  }
@@ -233,11 +272,11 @@ export default class ServerChangeFeedStore {
233
272
  /**
234
273
  * Ensures changes table exists.
235
274
  * @param {import("../database/drivers/base.js").default} db - Database connection.
236
- * @returns {Promise<void>} - Resolves when complete.
275
+ * @returns {Promise<boolean>} - Whether the table had to be created.
237
276
  */
238
277
  async _ensureChangesTable(db) {
239
278
  if (await db.tableExists(TABLE_NAME))
240
- return;
279
+ return false;
241
280
  const table = new TableData(TABLE_NAME, { ifNotExists: true });
242
281
  table.integer("server_sequence", { autoIncrement: true, null: false, primaryKey: true });
243
282
  table.string("id", { index: true, null: false });
@@ -253,6 +292,7 @@ export default class ServerChangeFeedStore {
253
292
  table.text("response_json", { null: true });
254
293
  table.datetime("created_at", { index: true, null: false });
255
294
  await db.createTable(table);
295
+ return true;
256
296
  }
257
297
  /**
258
298
  * Resolves a persisted change by id.
@@ -450,4 +490,4 @@ function scopesEqual(changeScope, requestedScope) {
450
490
  return true;
451
491
  return stableJsonStringify(changeScope || null) === stableJsonStringify(requestedScope);
452
492
  }
453
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNoYW5nZS1mZWVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc2VydmVyLWNoYW5nZS1mZWVkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBQ2pDLE9BQU8sU0FBUyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3ZELE9BQU8sbUJBQW1CLE1BQU0sa0JBQWtCLENBQUE7QUFFbEQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0g7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUE7QUFDcEMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUE7QUFDN0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFBO0FBQzFCLE1BQU0sVUFBVSxHQUFHLDZCQUE2QixDQUFBO0FBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFNUI7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQ0FBcUMsQ0FBQyxhQUFhO0lBQ2pFLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFckMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsS0FBSyxHQUFHLElBQUkscUJBQXFCLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFBO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLHFCQUFxQjtJQUN4Qzs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLGtCQUFrQixHQUFHLFNBQVMsRUFBRSxhQUFhLEVBQUM7UUFDeEUsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsb0JBQW9C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QUssS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBRW5HLE9BQU8saUJBQWlCLENBQUE7QUFDMUIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxLQUFLO0lBQzVCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRTlELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMxQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxXQUFXLEVBQUUsY0FBYztJQUM5QyxJQUFJLGNBQWMsS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFFN0MsT0FBTyxtQkFBbUIsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssbUJBQW1CLENBQUMsY0FBYyxDQUFDLENBQUE7QUFDekYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IFRhYmxlRGF0YSBmcm9tIFwiLi4vZGF0YWJhc2UvdGFibGUtZGF0YS9pbmRleC5qc1wiXG5pbXBvcnQgc3RhYmxlSnNvblN0cmluZ2lmeSBmcm9tIFwiLi9zdGFibGUtanNvbi5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VydmVyQ2hhbmdlRmVlZEVudHJ5XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGFjdG9yRGV2aWNlSWQgLSBTaWduZWQgbXV0YXRpb24gYWN0b3IgZGV2aWNlIGlkIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhY3RvclVzZXJJZCAtIFNpZ25lZCBtdXRhdGlvbiBhY3RvciB1c2VyIGlkIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBudWxsfSBhdHRyaWJ1dGVzIC0gU2VyaWFsaXplZCBtdXRhdGlvbiBhdHRyaWJ1dGVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNyZWF0ZWRBdCAtIFNlcnZlciBjaGFuZ2UgY3JlYXRpb24gdGltZXN0YW1wLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gU2VydmVyIGNoYW5nZSBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gaWRlbXBvdGVuY3lLZXkgLSBNdXRhdGlvbiBpZGVtcG90ZW5jeSBrZXkgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZWwgLSBGcm9udGVuZCBtb2RlbCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9wZXJhdGlvbiAtIE11dGF0aW9uIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgbnVsbH0gcGF5bG9hZCAtIFNlcmlhbGl6ZWQgbXV0YXRpb24gcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcmVjb3JkSWQgLSBDaGFuZ2VkIHJlY29yZCBpZCB3aGVuIGtub3duLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBudWxsfSByZXNwb25zZSAtIENvbW1hbmQgcmVzcG9uc2UgcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgbnVsbH0gc2NvcGUgLSBPZmZsaW5lIGdyYW50IHNjb3BlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNlcnZlclNlcXVlbmNlIC0gTW9ub3RvbmljIHNlcnZlciBzZXF1ZW5jZS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZXJ2ZXJDaGFuZ2VGZWVkUm93XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGFjdG9yX2RldmljZV9pZCAtIEFjdG9yIGRldmljZSBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gYWN0b3JfdXNlcl9pZCAtIEFjdG9yIHVzZXIgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGF0dHJpYnV0ZXNfanNvbiAtIEF0dHJpYnV0ZXMgSlNPTi5cbiAqIEBwcm9wZXJ0eSB7RGF0ZSB8IHN0cmluZ30gY3JlYXRlZF9hdCAtIENyZWF0aW9uIHRpbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBFbnRyeSBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gaWRlbXBvdGVuY3lfa2V5IC0gTXV0YXRpb24gaWRlbXBvdGVuY3kga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsIC0gRnJvbnRlbmQgbW9kZWwgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcGVyYXRpb24gLSBNdXRhdGlvbiBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHBheWxvYWRfanNvbiAtIE11dGF0aW9uIHBheWxvYWQgSlNPTi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcmVjb3JkX2lkIC0gUmVjb3JkIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSByZXNwb25zZV9qc29uIC0gUmVzcG9uc2UgSlNPTi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gc2NvcGVfanNvbiAtIFNjb3BlIEpTT04uXG4gKiBAcHJvcGVydHkge251bWJlciB8IHN0cmluZ30gc2VydmVyX3NlcXVlbmNlIC0gU2VydmVyIHNlcXVlbmNlLlxuICovXG5jb25zdCBERUZBVUxUX1JFVEVOVElPTl9TSVpFID0gMTAwMDBcbmNvbnN0IERFRkFVTFRfUEFHRV9TSVpFID0gMTAwXG5jb25zdCBNQVhfUEFHRV9TSVpFID0gMTAwMFxuY29uc3QgVEFCTEVfTkFNRSA9IFwiZnJvbnRlbmRfbW9kZWxfc3luY19jaGFuZ2VzXCJcbmNvbnN0IHN0b3JlcyA9IG5ldyBXZWFrTWFwKClcblxuLyoqXG4gKiBTaGFyZWQgc2VydmVyIGNoYW5nZS1mZWVkIHN0b3JlIGZvciBhIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyB7U2VydmVyQ2hhbmdlRmVlZFN0b3JlfSAtIFN0b3JlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmVyQ2hhbmdlRmVlZFN0b3JlRm9yQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XG4gIGxldCBzdG9yZSA9IHN0b3Jlcy5nZXQoY29uZmlndXJhdGlvbilcblxuICBpZiAoIXN0b3JlKSB7XG4gICAgc3RvcmUgPSBuZXcgU2VydmVyQ2hhbmdlRmVlZFN0b3JlKHtjb25maWd1cmF0aW9ufSlcbiAgICBzdG9yZXMuc2V0KGNvbmZpZ3VyYXRpb24sIHN0b3JlKVxuICB9XG5cbiAgcmV0dXJuIHN0b3JlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlcnZlckNoYW5nZUZlZWRTdG9yZSB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGF0YWJhc2VJZGVudGlmaWVyXSAtIERhdGFiYXNlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5yZXRlbnRpb25TaXplXSAtIE51bWJlciBvZiBmZWVkIGVudHJpZXMgdG8gcmV0YWluLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGRhdGFiYXNlSWRlbnRpZmllciA9IFwiZGVmYXVsdFwiLCByZXRlbnRpb25TaXplfSkge1xuICAgIGNvbnN0IHN5bmNDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbi5nZXRTeW5jQ29uZmlndXJhdGlvbigpXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5kYXRhYmFzZUlkZW50aWZpZXIgPSBkYXRhYmFzZUlkZW50aWZpZXJcbiAgICB0aGlzLnJldGVudGlvblNpemUgPSByZXRlbnRpb25TaXplIHx8IHN5bmNDb25maWd1cmF0aW9uLmNoYW5nZUZlZWRSZXRlbnRpb25TaXplIHx8IERFRkFVTFRfUkVURU5USU9OX1NJWkVcbiAgICAvKiogQHR5cGUge1NlcnZlckNoYW5nZUZlZWRFbnRyeVtdfSAqL1xuICAgIHRoaXMuX21lbW9yeUNoYW5nZXMgPSBbXVxuICAgIHRoaXMuX21lbW9yeVNlcXVlbmNlID0gMFxuICAgIHRoaXMuX2lzUmVhZHkgPSBmYWxzZVxuICAgIHRoaXMuX3JlYWR5UHJvbWlzZSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoZSBiYWNraW5nIHRhYmxlIGV4aXN0cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiByZWFkeS5cbiAgICovXG4gIGFzeW5jIGVuc3VyZVJlYWR5KCkge1xuICAgIGlmICh0aGlzLl91c2VzTWVtb3J5U3RvcmFnZSgpKSB7XG4gICAgICB0aGlzLl9pc1JlYWR5ID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGF3YWl0IHRoaXMuX3NjaGVtYVJlYWR5KCkpIHJldHVyblxuICAgIGlmICh0aGlzLl9yZWFkeVByb21pc2UpIHJldHVybiBhd2FpdCB0aGlzLl9yZWFkeVByb21pc2VcblxuICAgIHRoaXMuX3JlYWR5UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uc2V0Q3VycmVudCgpXG4gICAgICBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2Vuc3VyZUNoYW5nZXNUYWJsZShkYilcbiAgICAgIH0pXG4gICAgICB0aGlzLl9pc1JlYWR5ID0gdHJ1ZVxuICAgIH0pKClcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZWFkeVByb21pc2VcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKCF0aGlzLl9pc1JlYWR5KSB0aGlzLl9yZWFkeVByb21pc2UgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjaGFuZ2UgYW5kIGFzc2lnbnMgdGhlIG5leHQgc2VydmVyIHNlcXVlbmNlLlxuICAgKiBAcGFyYW0ge09taXQ8U2VydmVyQ2hhbmdlRmVlZEVudHJ5LCBcImNyZWF0ZWRBdFwiIHwgXCJpZFwiIHwgXCJzZXJ2ZXJTZXF1ZW5jZVwiPiAmIHtjcmVhdGVkQXQ/OiBzdHJpbmcsIGlkPzogc3RyaW5nfX0gY2hhbmdlIC0gQ2hhbmdlIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZlckNoYW5nZUZlZWRFbnRyeT59IC0gUGVyc2lzdGVkIGNoYW5nZS5cbiAgICovXG4gIGFzeW5jIGFwcGVuZChjaGFuZ2UpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVJlYWR5KClcblxuICAgIGNvbnN0IGlkID0gY2hhbmdlLmlkIHx8IHJhbmRvbVVVSUQoKVxuICAgIGNvbnN0IGNyZWF0ZWRBdCA9IGNoYW5nZS5jcmVhdGVkQXQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG5cbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX2FwcGVuZE1lbW9yeSh7Li4uY2hhbmdlLCBjcmVhdGVkQXQsIGlkfSlcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiB7XG4gICAgICBhd2FpdCBkYi5pbnNlcnQoe1xuICAgICAgICB0YWJsZU5hbWU6IFRBQkxFX05BTUUsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBhY3Rvcl9kZXZpY2VfaWQ6IGNoYW5nZS5hY3RvckRldmljZUlkLFxuICAgICAgICAgIGFjdG9yX3VzZXJfaWQ6IGNoYW5nZS5hY3RvclVzZXJJZCxcbiAgICAgICAgICBhdHRyaWJ1dGVzX2pzb246IEpTT04uc3RyaW5naWZ5KGNoYW5nZS5hdHRyaWJ1dGVzIHx8IG51bGwpLFxuICAgICAgICAgIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKGNyZWF0ZWRBdCksXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgaWRlbXBvdGVuY3lfa2V5OiBjaGFuZ2UuaWRlbXBvdGVuY3lLZXksXG4gICAgICAgICAgbW9kZWw6IGNoYW5nZS5tb2RlbCxcbiAgICAgICAgICBvcGVyYXRpb246IGNoYW5nZS5vcGVyYXRpb24sXG4gICAgICAgICAgcGF5bG9hZF9qc29uOiBKU09OLnN0cmluZ2lmeShjaGFuZ2UucGF5bG9hZCB8fCBudWxsKSxcbiAgICAgICAgICByZWNvcmRfaWQ6IGNoYW5nZS5yZWNvcmRJZCA9PT0gbnVsbCB8fCBjaGFuZ2UucmVjb3JkSWQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBTdHJpbmcoY2hhbmdlLnJlY29yZElkKSxcbiAgICAgICAgICByZXNwb25zZV9qc29uOiBKU09OLnN0cmluZ2lmeShjaGFuZ2UucmVzcG9uc2UgfHwgbnVsbCksXG4gICAgICAgICAgc2NvcGVfanNvbjogc3RhYmxlSnNvblN0cmluZ2lmeShjaGFuZ2Uuc2NvcGUgfHwgbnVsbClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgY29uc3Qgcm93ID0gYXdhaXQgdGhpcy5fY2hhbmdlQnlJZChkYiwgaWQpXG4gICAgICBpZiAoIXJvdykgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIHBlcnNpc3Qgc2VydmVyIGNoYW5nZS1mZWVkIGVudHJ5XCIpXG5cbiAgICAgIGF3YWl0IHRoaXMuX3BydW5lUmV0YWluZWRDaGFuZ2VzKGRiLCByb3cuc2VydmVyU2VxdWVuY2UpXG5cbiAgICAgIHJldHVybiByb3dcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VycmVudCBsYXRlc3Qgc2VydmVyIHNlcXVlbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIExhdGVzdCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIGxhdGVzdFNlcXVlbmNlKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9tZW1vcnlTZXF1ZW5jZVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBkYlxuICAgICAgICAubmV3UXVlcnkoKVxuICAgICAgICAuZnJvbShUQUJMRV9OQU1FKVxuICAgICAgICAub3JkZXIoXCJzZXJ2ZXJfc2VxdWVuY2UgREVTQ1wiKVxuICAgICAgICAubGltaXQoMSlcbiAgICAgICAgLnJlc3VsdHMoKVxuICAgICAgY29uc3Qgcm93ID0gLyoqIEB0eXBlIHt7c2VydmVyX3NlcXVlbmNlPzogbnVtYmVyIHwgc3RyaW5nfSB8IHVuZGVmaW5lZH0gKi8gKHJvd3NbMF0pXG5cbiAgICAgIHJldHVybiByb3cgPyBOdW1iZXIocm93LnNlcnZlcl9zZXF1ZW5jZSkgOiAwXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG9sZGVzdCByZXRhaW5lZCBzZXJ2ZXIgc2VxdWVuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlciB8IG51bGw+fSAtIE9sZGVzdCByZXRhaW5lZCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIG9sZGVzdFNlcXVlbmNlKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9tZW1vcnlDaGFuZ2VzWzBdPy5zZXJ2ZXJTZXF1ZW5jZSB8fCBudWxsXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4gYXdhaXQgdGhpcy5fb2xkZXN0U2VxdWVuY2UoZGIpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3JkZXJlZCBjaGFuZ2VzIGFmdGVyIGEgY3Vyc29yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYWZ0ZXJTZXF1ZW5jZSAtIEV4Y2x1c2l2ZSBsb3dlciBib3VuZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmxpbWl0XSAtIE1heGltdW0gbnVtYmVyIG9mIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy51cFRvU2VxdWVuY2VdIC0gSW5jbHVzaXZlIHVwcGVyIGJvdW5kLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW2FyZ3Muc2NvcGVdIC0gQ2FsbGVyIHN5bmMgc2NvcGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtjaGFuZ2VzOiBTZXJ2ZXJDaGFuZ2VGZWVkRW50cnlbXSwgaGFzTW9yZTogYm9vbGVhbiwgbmV4dFNlcXVlbmNlOiBudW1iZXIsIG9sZGVzdFNlcXVlbmNlOiBudW1iZXIgfCBudWxsLCBzbmFwc2hvdFJlcXVpcmVkOiBib29sZWFuLCB1cFRvU2VxdWVuY2U6IG51bWJlcn0+fSAtIE9yZGVyZWQgcGFnZS5cbiAgICovXG4gIGFzeW5jIGNoYW5nZXNBZnRlcih7YWZ0ZXJTZXF1ZW5jZSwgbGltaXQgPSBERUZBVUxUX1BBR0VfU0laRSwgc2NvcGUsIHVwVG9TZXF1ZW5jZX0pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVJlYWR5KClcblxuICAgIGNvbnN0IHBhZ2VTaXplID0gbm9ybWFsaXplTGltaXQobGltaXQpXG5cbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX21lbW9yeUNoYW5nZXNBZnRlcih7YWZ0ZXJTZXF1ZW5jZSwgbGltaXQ6IHBhZ2VTaXplLCBzY29wZSwgdXBUb1NlcXVlbmNlfSlcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiB7XG4gICAgICBjb25zdCBsYXRlc3RTZXF1ZW5jZSA9IHR5cGVvZiB1cFRvU2VxdWVuY2UgPT09IFwibnVtYmVyXCIgPyB1cFRvU2VxdWVuY2UgOiBhd2FpdCB0aGlzLl9sYXRlc3RTZXF1ZW5jZShkYilcbiAgICAgIGNvbnN0IG9sZGVzdFNlcXVlbmNlID0gYXdhaXQgdGhpcy5fb2xkZXN0U2VxdWVuY2UoZGIpXG4gICAgICBjb25zdCBzbmFwc2hvdFJlcXVpcmVkID0gYWZ0ZXJTZXF1ZW5jZSA+IDAgJiYgb2xkZXN0U2VxdWVuY2UgIT09IG51bGwgJiYgb2xkZXN0U2VxdWVuY2UgPiBhZnRlclNlcXVlbmNlICsgMVxuXG4gICAgICBpZiAoc25hcHNob3RSZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNoYW5nZXM6IFtdLFxuICAgICAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgICAgIG5leHRTZXF1ZW5jZTogYWZ0ZXJTZXF1ZW5jZSxcbiAgICAgICAgICBvbGRlc3RTZXF1ZW5jZSxcbiAgICAgICAgICBzbmFwc2hvdFJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIHVwVG9TZXF1ZW5jZTogbGF0ZXN0U2VxdWVuY2VcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtTZXJ2ZXJDaGFuZ2VGZWVkUm93W119ICovIChhd2FpdCBkYlxuICAgICAgICAubmV3UXVlcnkoKVxuICAgICAgICAuZnJvbShUQUJMRV9OQU1FKVxuICAgICAgICAud2hlcmUoYHNlcnZlcl9zZXF1ZW5jZSA+ICR7ZGIucXVvdGUoYWZ0ZXJTZXF1ZW5jZSl9YClcbiAgICAgICAgLndoZXJlKGBzZXJ2ZXJfc2VxdWVuY2UgPD0gJHtkYi5xdW90ZShsYXRlc3RTZXF1ZW5jZSl9YClcbiAgICAgICAgLndoZXJlKHNjb3BlID09PSB1bmRlZmluZWQgPyBcIjEgPSAxXCIgOiB7c2NvcGVfanNvbjogc3RhYmxlSnNvblN0cmluZ2lmeShzY29wZSl9KVxuICAgICAgICAub3JkZXIoXCJzZXJ2ZXJfc2VxdWVuY2UgQVNDXCIpXG4gICAgICAgIC5saW1pdChwYWdlU2l6ZSArIDEpXG4gICAgICAgIC5yZXN1bHRzKCkpXG4gICAgICBjb25zdCBoYXNNb3JlID0gcm93cy5sZW5ndGggPiBwYWdlU2l6ZVxuICAgICAgY29uc3QgcGFnZVJvd3MgPSByb3dzLnNsaWNlKDAsIHBhZ2VTaXplKVxuICAgICAgY29uc3QgY2hhbmdlcyA9IHBhZ2VSb3dzLm1hcCgocm93KSA9PiB0aGlzLl9ub3JtYWxpemVDaGFuZ2VSb3cocm93KSlcbiAgICAgIGNvbnN0IGxhc3RDaGFuZ2UgPSBjaGFuZ2VzW2NoYW5nZXMubGVuZ3RoIC0gMV1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlcyxcbiAgICAgICAgaGFzTW9yZSxcbiAgICAgICAgbmV4dFNlcXVlbmNlOiBsYXN0Q2hhbmdlID8gbGFzdENoYW5nZS5zZXJ2ZXJTZXF1ZW5jZSA6IGFmdGVyU2VxdWVuY2UsXG4gICAgICAgIG9sZGVzdFNlcXVlbmNlLFxuICAgICAgICBzbmFwc2hvdFJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgdXBUb1NlcXVlbmNlOiBsYXRlc3RTZXF1ZW5jZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyBzY2hlbWEgaXMgc3RpbGwgcHJlc2VudC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciByZWFkeS5cbiAgICovXG4gIGFzeW5jIF9zY2hlbWFSZWFkeSgpIHtcbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX2lzUmVhZHlcbiAgICBpZiAoIXRoaXMuX2lzUmVhZHkpIHJldHVybiBmYWxzZVxuICAgIGlmIChhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiBhd2FpdCBkYi50YWJsZUV4aXN0cyhUQUJMRV9OQU1FKSkpIHJldHVybiB0cnVlXG5cbiAgICB0aGlzLl9pc1JlYWR5ID0gZmFsc2VcbiAgICB0aGlzLl9yZWFkeVByb21pc2UgPSBudWxsXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIGNoYW5nZXMgdGFibGUgZXhpc3RzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfZW5zdXJlQ2hhbmdlc1RhYmxlKGRiKSB7XG4gICAgaWYgKGF3YWl0IGRiLnRhYmxlRXhpc3RzKFRBQkxFX05BTUUpKSByZXR1cm5cblxuICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlRGF0YShUQUJMRV9OQU1FLCB7aWZOb3RFeGlzdHM6IHRydWV9KVxuXG4gICAgdGFibGUuaW50ZWdlcihcInNlcnZlcl9zZXF1ZW5jZVwiLCB7YXV0b0luY3JlbWVudDogdHJ1ZSwgbnVsbDogZmFsc2UsIHByaW1hcnlLZXk6IHRydWV9KVxuICAgIHRhYmxlLnN0cmluZyhcImlkXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogZmFsc2V9KVxuICAgIHRhYmxlLnN0cmluZyhcIm1vZGVsXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogZmFsc2V9KVxuICAgIHRhYmxlLnN0cmluZyhcIm9wZXJhdGlvblwiLCB7bnVsbDogZmFsc2V9KVxuICAgIHRhYmxlLnN0cmluZyhcInJlY29yZF9pZFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IHRydWV9KVxuICAgIHRhYmxlLnRleHQoXCJwYXlsb2FkX2pzb25cIiwge251bGw6IHRydWV9KVxuICAgIHRhYmxlLnRleHQoXCJhdHRyaWJ1dGVzX2pzb25cIiwge251bGw6IHRydWV9KVxuICAgIHRhYmxlLnN0cmluZyhcImlkZW1wb3RlbmN5X2tleVwiLCB7aW5kZXg6IHRydWUsIG51bGw6IHRydWV9KVxuICAgIHRhYmxlLnN0cmluZyhcImFjdG9yX3VzZXJfaWRcIiwge2luZGV4OiB0cnVlLCBudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJhY3Rvcl9kZXZpY2VfaWRcIiwge2luZGV4OiB0cnVlLCBudWxsOiB0cnVlfSlcbiAgICB0YWJsZS50ZXh0KFwic2NvcGVfanNvblwiLCB7bnVsbDogdHJ1ZX0pXG4gICAgdGFibGUudGV4dChcInJlc3BvbnNlX2pzb25cIiwge251bGw6IHRydWV9KVxuICAgIHRhYmxlLmRhdGV0aW1lKFwiY3JlYXRlZF9hdFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IGZhbHNlfSlcblxuICAgIGF3YWl0IGRiLmNyZWF0ZVRhYmxlKHRhYmxlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgcGVyc2lzdGVkIGNoYW5nZSBieSBpZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBFbnRyeSBpZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmVyQ2hhbmdlRmVlZEVudHJ5IHwgbnVsbD59IC0gRW50cnkgb3IgbnVsbC5cbiAgICovXG4gIGFzeW5jIF9jaGFuZ2VCeUlkKGRiLCBpZCkge1xuICAgIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge1NlcnZlckNoYW5nZUZlZWRSb3dbXX0gKi8gKGF3YWl0IGRiXG4gICAgICAubmV3UXVlcnkoKVxuICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgIC53aGVyZSh7aWR9KVxuICAgICAgLmxpbWl0KDEpXG4gICAgICAucmVzdWx0cygpKVxuXG4gICAgcmV0dXJuIHJvd3NbMF0gPyB0aGlzLl9ub3JtYWxpemVDaGFuZ2VSb3cocm93c1swXSkgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgY3VycmVudCBsYXRlc3Qgc2VxdWVuY2Ugd2l0aG91dCByZWFkaW5lc3MgY2hlY2tzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IC0gTGF0ZXN0IHNlcXVlbmNlLlxuICAgKi9cbiAgYXN5bmMgX2xhdGVzdFNlcXVlbmNlKGRiKSB7XG4gICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7QXJyYXk8e3NlcnZlcl9zZXF1ZW5jZT86IG51bWJlciB8IHN0cmluZ30+fSAqLyAoYXdhaXQgZGJcbiAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAuZnJvbShUQUJMRV9OQU1FKVxuICAgICAgLm9yZGVyKFwic2VydmVyX3NlcXVlbmNlIERFU0NcIilcbiAgICAgIC5saW1pdCgxKVxuICAgICAgLnJlc3VsdHMoKSlcblxuICAgIHJldHVybiByb3dzWzBdID8gTnVtYmVyKHJvd3NbMF0uc2VydmVyX3NlcXVlbmNlKSA6IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBjdXJyZW50IG9sZGVzdCBzZXF1ZW5jZSB3aXRob3V0IHJlYWRpbmVzcyBjaGVja3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyIHwgbnVsbD59IC0gT2xkZXN0IHNlcXVlbmNlLlxuICAgKi9cbiAgYXN5bmMgX29sZGVzdFNlcXVlbmNlKGRiKSB7XG4gICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7QXJyYXk8e3NlcnZlcl9zZXF1ZW5jZT86IG51bWJlciB8IHN0cmluZ30+fSAqLyAoYXdhaXQgZGJcbiAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAuZnJvbShUQUJMRV9OQU1FKVxuICAgICAgLm9yZGVyKFwic2VydmVyX3NlcXVlbmNlIEFTQ1wiKVxuICAgICAgLmxpbWl0KDEpXG4gICAgICAucmVzdWx0cygpKVxuXG4gICAgcmV0dXJuIHJvd3NbMF0gPyBOdW1iZXIocm93c1swXS5zZXJ2ZXJfc2VxdWVuY2UpIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFBydW5lcyBvbGQgcmV0YWluZWQgY2hhbmdlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbGF0ZXN0U2VxdWVuY2UgLSBMYXRlc3Qgc2VxdWVuY2UgYWZ0ZXIgYXBwZW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3BydW5lUmV0YWluZWRDaGFuZ2VzKGRiLCBsYXRlc3RTZXF1ZW5jZSkge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih0aGlzLnJldGVudGlvblNpemUpIHx8IHRoaXMucmV0ZW50aW9uU2l6ZSA8IDEpIHJldHVyblxuXG4gICAgY29uc3QgcHJ1bmVCZWZvcmVPckF0ID0gbGF0ZXN0U2VxdWVuY2UgLSB0aGlzLnJldGVudGlvblNpemVcbiAgICBpZiAocHJ1bmVCZWZvcmVPckF0IDwgMSkgcmV0dXJuXG5cbiAgICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtBcnJheTx7aWQ6IHN0cmluZ30+fSAqLyAoYXdhaXQgZGJcbiAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAuZnJvbShUQUJMRV9OQU1FKVxuICAgICAgLndoZXJlKGBzZXJ2ZXJfc2VxdWVuY2UgPD0gJHtkYi5xdW90ZShwcnVuZUJlZm9yZU9yQXQpfWApXG4gICAgICAucmVzdWx0cygpKVxuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgYXdhaXQgZGIuZGVsZXRlKHtjb25kaXRpb25zOiB7aWQ6IHJvdy5pZH0sIHRhYmxlTmFtZTogVEFCTEVfTkFNRX0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgYSBjaGFuZ2Ugcm93LlxuICAgKiBAcGFyYW0ge1NlcnZlckNoYW5nZUZlZWRSb3d9IHJvdyAtIFJhdyBkYXRhYmFzZSByb3cuXG4gICAqIEByZXR1cm5zIHtTZXJ2ZXJDaGFuZ2VGZWVkRW50cnl9IC0gTm9ybWFsaXplZCBjaGFuZ2UuXG4gICAqL1xuICBfbm9ybWFsaXplQ2hhbmdlUm93KHJvdykge1xuICAgIGNvbnN0IGNyZWF0ZWRBdFZhbHVlID0gcm93LmNyZWF0ZWRfYXRcblxuICAgIHJldHVybiB7XG4gICAgICBhY3RvckRldmljZUlkOiByb3cuYWN0b3JfZGV2aWNlX2lkIHx8IG51bGwsXG4gICAgICBhY3RvclVzZXJJZDogcm93LmFjdG9yX3VzZXJfaWQgfHwgbnVsbCxcbiAgICAgIGF0dHJpYnV0ZXM6IHBhcnNlSnNvbk9yTnVsbChyb3cuYXR0cmlidXRlc19qc29uKSxcbiAgICAgIGNyZWF0ZWRBdDogY3JlYXRlZEF0VmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gY3JlYXRlZEF0VmFsdWUudG9JU09TdHJpbmcoKSA6IG5ldyBEYXRlKGNyZWF0ZWRBdFZhbHVlKS50b0lTT1N0cmluZygpLFxuICAgICAgaWQ6IHJvdy5pZCxcbiAgICAgIGlkZW1wb3RlbmN5S2V5OiByb3cuaWRlbXBvdGVuY3lfa2V5IHx8IG51bGwsXG4gICAgICBtb2RlbDogcm93Lm1vZGVsLFxuICAgICAgb3BlcmF0aW9uOiByb3cub3BlcmF0aW9uLFxuICAgICAgcGF5bG9hZDogcGFyc2VKc29uT3JOdWxsKHJvdy5wYXlsb2FkX2pzb24pLFxuICAgICAgcmVjb3JkSWQ6IHJvdy5yZWNvcmRfaWQgfHwgbnVsbCxcbiAgICAgIHJlc3BvbnNlOiBwYXJzZUpzb25Pck51bGwocm93LnJlc3BvbnNlX2pzb24pLFxuICAgICAgc2NvcGU6IHBhcnNlSnNvbk9yTnVsbChyb3cuc2NvcGVfanNvbiksXG4gICAgICBzZXJ2ZXJTZXF1ZW5jZTogTnVtYmVyKHJvdy5zZXJ2ZXJfc2VxdWVuY2UpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBzdG9yZSBzaG91bGQgdXNlIHByb2Nlc3MtbG9jYWwgbWVtb3J5IGJlY2F1c2Ugbm8gZGF0YWJhc2UgaWRlbnRpZmllciBpcyBjb25maWd1cmVkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIG1lbW9yeSBzdG9yYWdlIGlzIGFjdGl2ZS5cbiAgICovXG4gIF91c2VzTWVtb3J5U3RvcmFnZSgpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICF0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJhc2VDb25maWd1cmF0aW9uKClbdGhpcy5kYXRhYmFzZUlkZW50aWZpZXJdXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgcHJvY2Vzcy1sb2NhbCBtZW1vcnkgZW50cnkgd2hlbiBubyBkYXRhYmFzZSBpcyBjb25maWd1cmVkLlxuICAgKiBAcGFyYW0ge09taXQ8U2VydmVyQ2hhbmdlRmVlZEVudHJ5LCBcInNlcnZlclNlcXVlbmNlXCI+fSBjaGFuZ2UgLSBDaGFuZ2UgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1NlcnZlckNoYW5nZUZlZWRFbnRyeX0gLSBBcHBlbmRlZCBlbnRyeS5cbiAgICovXG4gIF9hcHBlbmRNZW1vcnkoY2hhbmdlKSB7XG4gICAgY29uc3QgZW50cnkgPSAvKiogQHR5cGUge1NlcnZlckNoYW5nZUZlZWRFbnRyeX0gKi8gKHtcbiAgICAgIGFjdG9yRGV2aWNlSWQ6IGNoYW5nZS5hY3RvckRldmljZUlkLFxuICAgICAgYWN0b3JVc2VySWQ6IGNoYW5nZS5hY3RvclVzZXJJZCxcbiAgICAgIGF0dHJpYnV0ZXM6IGNoYW5nZS5hdHRyaWJ1dGVzIHx8IG51bGwsXG4gICAgICBjcmVhdGVkQXQ6IGNoYW5nZS5jcmVhdGVkQXQsXG4gICAgICBpZDogY2hhbmdlLmlkLFxuICAgICAgaWRlbXBvdGVuY3lLZXk6IGNoYW5nZS5pZGVtcG90ZW5jeUtleSxcbiAgICAgIG1vZGVsOiBjaGFuZ2UubW9kZWwsXG4gICAgICBvcGVyYXRpb246IGNoYW5nZS5vcGVyYXRpb24sXG4gICAgICBwYXlsb2FkOiBjaGFuZ2UucGF5bG9hZCB8fCBudWxsLFxuICAgICAgcmVjb3JkSWQ6IGNoYW5nZS5yZWNvcmRJZCA9PT0gbnVsbCB8fCBjaGFuZ2UucmVjb3JkSWQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBTdHJpbmcoY2hhbmdlLnJlY29yZElkKSxcbiAgICAgIHJlc3BvbnNlOiBjaGFuZ2UucmVzcG9uc2UgfHwgbnVsbCxcbiAgICAgIHNjb3BlOiBjaGFuZ2Uuc2NvcGUgfHwgbnVsbCxcbiAgICAgIHNlcnZlclNlcXVlbmNlOiArK3RoaXMuX21lbW9yeVNlcXVlbmNlXG4gICAgfSlcblxuICAgIHRoaXMuX21lbW9yeUNoYW5nZXMucHVzaChlbnRyeSlcbiAgICBpZiAodGhpcy5fbWVtb3J5Q2hhbmdlcy5sZW5ndGggPiB0aGlzLnJldGVudGlvblNpemUpIHRoaXMuX21lbW9yeUNoYW5nZXMuc3BsaWNlKDAsIHRoaXMuX21lbW9yeUNoYW5nZXMubGVuZ3RoIC0gdGhpcy5yZXRlbnRpb25TaXplKVxuXG4gICAgcmV0dXJuIGVudHJ5XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHByb2Nlc3MtbG9jYWwgbWVtb3J5IGNoYW5nZSBwYWdlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYWZ0ZXJTZXF1ZW5jZSAtIEV4Y2x1c2l2ZSBsb3dlciBib3VuZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MubGltaXQgLSBQYWdlIHNpemUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy51cFRvU2VxdWVuY2VdIC0gSW5jbHVzaXZlIHVwcGVyIGJvdW5kLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW2FyZ3Muc2NvcGVdIC0gQ2FsbGVyIHN5bmMgc2NvcGUuXG4gICAqIEByZXR1cm5zIHt7Y2hhbmdlczogU2VydmVyQ2hhbmdlRmVlZEVudHJ5W10sIGhhc01vcmU6IGJvb2xlYW4sIG5leHRTZXF1ZW5jZTogbnVtYmVyLCBvbGRlc3RTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCwgc25hcHNob3RSZXF1aXJlZDogYm9vbGVhbiwgdXBUb1NlcXVlbmNlOiBudW1iZXJ9fSAtIE9yZGVyZWQgcGFnZS5cbiAgICovXG4gIF9tZW1vcnlDaGFuZ2VzQWZ0ZXIoe2FmdGVyU2VxdWVuY2UsIGxpbWl0LCBzY29wZSwgdXBUb1NlcXVlbmNlfSkge1xuICAgIGNvbnN0IGxhdGVzdFNlcXVlbmNlID0gdHlwZW9mIHVwVG9TZXF1ZW5jZSA9PT0gXCJudW1iZXJcIiA/IHVwVG9TZXF1ZW5jZSA6IHRoaXMuX21lbW9yeVNlcXVlbmNlXG4gICAgY29uc3Qgb2xkZXN0U2VxdWVuY2UgPSB0aGlzLl9tZW1vcnlDaGFuZ2VzWzBdPy5zZXJ2ZXJTZXF1ZW5jZSB8fCBudWxsXG4gICAgY29uc3Qgc25hcHNob3RSZXF1aXJlZCA9IGFmdGVyU2VxdWVuY2UgPiAwICYmIG9sZGVzdFNlcXVlbmNlICE9PSBudWxsICYmIG9sZGVzdFNlcXVlbmNlID4gYWZ0ZXJTZXF1ZW5jZSArIDFcblxuICAgIGlmIChzbmFwc2hvdFJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4ge2NoYW5nZXM6IFtdLCBoYXNNb3JlOiBmYWxzZSwgbmV4dFNlcXVlbmNlOiBhZnRlclNlcXVlbmNlLCBvbGRlc3RTZXF1ZW5jZSwgc25hcHNob3RSZXF1aXJlZDogdHJ1ZSwgdXBUb1NlcXVlbmNlOiBsYXRlc3RTZXF1ZW5jZX1cbiAgICB9XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5fbWVtb3J5Q2hhbmdlcy5maWx0ZXIoKGNoYW5nZSkgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZS5zZXJ2ZXJTZXF1ZW5jZSA+IGFmdGVyU2VxdWVuY2UgJiYgY2hhbmdlLnNlcnZlclNlcXVlbmNlIDw9IGxhdGVzdFNlcXVlbmNlICYmIHNjb3Blc0VxdWFsKGNoYW5nZS5zY29wZSwgc2NvcGUpXG4gICAgfSlcbiAgICBjb25zdCBoYXNNb3JlID0gcm93cy5sZW5ndGggPiBsaW1pdFxuICAgIGNvbnN0IGNoYW5nZXMgPSByb3dzLnNsaWNlKDAsIGxpbWl0KVxuICAgIGNvbnN0IGxhc3RDaGFuZ2UgPSBjaGFuZ2VzW2NoYW5nZXMubGVuZ3RoIC0gMV1cblxuICAgIHJldHVybiB7Y2hhbmdlcywgaGFzTW9yZSwgbmV4dFNlcXVlbmNlOiBsYXN0Q2hhbmdlID8gbGFzdENoYW5nZS5zZXJ2ZXJTZXF1ZW5jZSA6IGFmdGVyU2VxdWVuY2UsIG9sZGVzdFNlcXVlbmNlLCBzbmFwc2hvdFJlcXVpcmVkOiBmYWxzZSwgdXBUb1NlcXVlbmNlOiBsYXRlc3RTZXF1ZW5jZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGggZGIuXG4gICAqIEBwYXJhbSB7KGRiOiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGNhbGxiYWNrIC0gQ2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyBfd2l0aERiKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7ZGF0YWJhc2VJZGVudGlmaWVyczogW3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyXSwgbmFtZTogXCJTZXJ2ZXIgY2hhbmdlLWZlZWQgc3RvcmVcIn0sIGFzeW5jIChkYnMpID0+IHtcbiAgICAgIGNvbnN0IGRiID0gZGJzW3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyXVxuXG4gICAgICBpZiAoIWRiKSB0aHJvdyBuZXcgRXJyb3IoYE5vIGRhdGFiYXNlIGNvbm5lY3Rpb24gYXZhaWxhYmxlIGZvciBpZGVudGlmaWVyOiAke3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyfWApXG5cbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjayhkYilcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBwYWdlIGxpbWl0LlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gbGltaXQgLSBSZXF1ZXN0ZWQgbGltaXQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIFBhZ2Ugc2l6ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTGltaXQobGltaXQpIHtcbiAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGxpbWl0KSAmJiBsaW1pdCA+IDApIHJldHVybiBNYXRoLm1pbihsaW1pdCwgTUFYX1BBR0VfU0laRSlcbiAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcZCskLy50ZXN0KGxpbWl0KSkgcmV0dXJuIE1hdGgubWluKE51bWJlcihsaW1pdCksIE1BWF9QQUdFX1NJWkUpXG5cbiAgcmV0dXJuIERFRkFVTFRfUEFHRV9TSVpFXG59XG5cbi8qKlxuICogUGFyc2VzIEpTT04taXNoIHZhbHVlcy5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gSlNPTiBzdHJpbmcuXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IC0gUGFyc2VkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBwYXJzZUpzb25Pck51bGwodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5sZW5ndGggPCAxKSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHN5bmMgc2NvcGVzIGJ5IHN0YWJsZSBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBudWxsfSBjaGFuZ2VTY29wZSAtIFBlcnNpc3RlZCBjaGFuZ2Ugc2NvcGUuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiB8IHVuZGVmaW5lZH0gcmVxdWVzdGVkU2NvcGUgLSBDYWxsZXIgc2NvcGUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjaGFuZ2UgaXMgdmlzaWJsZSBmb3IgdGhlIHJlcXVlc3RlZCBzY29wZS5cbiAqL1xuZnVuY3Rpb24gc2NvcGVzRXF1YWwoY2hhbmdlU2NvcGUsIHJlcXVlc3RlZFNjb3BlKSB7XG4gIGlmIChyZXF1ZXN0ZWRTY29wZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZVxuXG4gIHJldHVybiBzdGFibGVKc29uU3RyaW5naWZ5KGNoYW5nZVNjb3BlIHx8IG51bGwpID09PSBzdGFibGVKc29uU3RyaW5naWZ5KHJlcXVlc3RlZFNjb3BlKVxufVxuIl19
493
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNoYW5nZS1mZWVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc2VydmVyLWNoYW5nZS1mZWVkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBQ2pDLE9BQU8sU0FBUyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3ZELE9BQU8sbUJBQW1CLE1BQU0sa0JBQWtCLENBQUE7QUFFbEQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0g7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUE7QUFDcEMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUE7QUFDN0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFBO0FBQzFCLE1BQU0sVUFBVSxHQUFHLDZCQUE2QixDQUFBO0FBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFNUI7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQ0FBcUMsQ0FBQyxhQUFhO0lBQ2pFLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFckMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsS0FBSyxHQUFHLElBQUkscUJBQXFCLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFBO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLHFCQUFxQjtJQUN4Qzs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLGtCQUFrQixHQUFHLFNBQVMsRUFBRSxhQUFhLEVBQUM7UUFDeEUsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsb0JBQW9C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a1xuXG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IFRhYmxlRGF0YSBmcm9tIFwiLi4vZGF0YWJhc2UvdGFibGUtZGF0YS9pbmRleC5qc1wiXG5pbXBvcnQgc3RhYmxlSnNvblN0cmluZ2lmeSBmcm9tIFwiLi9zdGFibGUtanNvbi5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VydmVyQ2hhbmdlRmVlZEVudHJ5XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGFjdG9yRGV2aWNlSWQgLSBTaWduZWQgbXV0YXRpb24gYWN0b3IgZGV2aWNlIGlkIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhY3RvclVzZXJJZCAtIFNpZ25lZCBtdXRhdGlvbiBhY3RvciB1c2VyIGlkIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBudWxsfSBhdHRyaWJ1dGVzIC0gU2VyaWFsaXplZCBtdXRhdGlvbiBhdHRyaWJ1dGVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNyZWF0ZWRBdCAtIFNlcnZlciBjaGFuZ2UgY3JlYXRpb24gdGltZXN0YW1wLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gU2VydmVyIGNoYW5nZSBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gaWRlbXBvdGVuY3lLZXkgLSBNdXRhdGlvbiBpZGVtcG90ZW5jeSBrZXkgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZWwgLSBGcm9udGVuZCBtb2RlbCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9wZXJhdGlvbiAtIE11dGF0aW9uIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgbnVsbH0gcGF5bG9hZCAtIFNlcmlhbGl6ZWQgbXV0YXRpb24gcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcmVjb3JkSWQgLSBDaGFuZ2VkIHJlY29yZCBpZCB3aGVuIGtub3duLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBudWxsfSByZXNwb25zZSAtIENvbW1hbmQgcmVzcG9uc2UgcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgbnVsbH0gc2NvcGUgLSBPZmZsaW5lIGdyYW50IHNjb3BlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNlcnZlclNlcXVlbmNlIC0gTW9ub3RvbmljIHNlcnZlciBzZXF1ZW5jZS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZXJ2ZXJDaGFuZ2VGZWVkUm93XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGFjdG9yX2RldmljZV9pZCAtIEFjdG9yIGRldmljZSBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gYWN0b3JfdXNlcl9pZCAtIEFjdG9yIHVzZXIgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGF0dHJpYnV0ZXNfanNvbiAtIEF0dHJpYnV0ZXMgSlNPTi5cbiAqIEBwcm9wZXJ0eSB7RGF0ZSB8IHN0cmluZ30gY3JlYXRlZF9hdCAtIENyZWF0aW9uIHRpbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBFbnRyeSBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gaWRlbXBvdGVuY3lfa2V5IC0gTXV0YXRpb24gaWRlbXBvdGVuY3kga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsIC0gRnJvbnRlbmQgbW9kZWwgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcGVyYXRpb24gLSBNdXRhdGlvbiBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHBheWxvYWRfanNvbiAtIE11dGF0aW9uIHBheWxvYWQgSlNPTi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcmVjb3JkX2lkIC0gUmVjb3JkIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSByZXNwb25zZV9qc29uIC0gUmVzcG9uc2UgSlNPTi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gc2NvcGVfanNvbiAtIFNjb3BlIEpTT04uXG4gKiBAcHJvcGVydHkge251bWJlciB8IHN0cmluZ30gc2VydmVyX3NlcXVlbmNlIC0gU2VydmVyIHNlcXVlbmNlLlxuICovXG5jb25zdCBERUZBVUxUX1JFVEVOVElPTl9TSVpFID0gMTAwMDBcbmNvbnN0IERFRkFVTFRfUEFHRV9TSVpFID0gMTAwXG5jb25zdCBNQVhfUEFHRV9TSVpFID0gMTAwMFxuY29uc3QgVEFCTEVfTkFNRSA9IFwiZnJvbnRlbmRfbW9kZWxfc3luY19jaGFuZ2VzXCJcbmNvbnN0IHN0b3JlcyA9IG5ldyBXZWFrTWFwKClcblxuLyoqXG4gKiBTaGFyZWQgc2VydmVyIGNoYW5nZS1mZWVkIHN0b3JlIGZvciBhIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyB7U2VydmVyQ2hhbmdlRmVlZFN0b3JlfSAtIFN0b3JlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmVyQ2hhbmdlRmVlZFN0b3JlRm9yQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XG4gIGxldCBzdG9yZSA9IHN0b3Jlcy5nZXQoY29uZmlndXJhdGlvbilcblxuICBpZiAoIXN0b3JlKSB7XG4gICAgc3RvcmUgPSBuZXcgU2VydmVyQ2hhbmdlRmVlZFN0b3JlKHtjb25maWd1cmF0aW9ufSlcbiAgICBzdG9yZXMuc2V0KGNvbmZpZ3VyYXRpb24sIHN0b3JlKVxuICB9XG5cbiAgcmV0dXJuIHN0b3JlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlcnZlckNoYW5nZUZlZWRTdG9yZSB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGF0YWJhc2VJZGVudGlmaWVyXSAtIERhdGFiYXNlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5yZXRlbnRpb25TaXplXSAtIE51bWJlciBvZiBmZWVkIGVudHJpZXMgdG8gcmV0YWluLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGRhdGFiYXNlSWRlbnRpZmllciA9IFwiZGVmYXVsdFwiLCByZXRlbnRpb25TaXplfSkge1xuICAgIGNvbnN0IHN5bmNDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbi5nZXRTeW5jQ29uZmlndXJhdGlvbigpXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5kYXRhYmFzZUlkZW50aWZpZXIgPSBkYXRhYmFzZUlkZW50aWZpZXJcbiAgICB0aGlzLnJldGVudGlvblNpemUgPSByZXRlbnRpb25TaXplIHx8IHN5bmNDb25maWd1cmF0aW9uLmNoYW5nZUZlZWRSZXRlbnRpb25TaXplIHx8IERFRkFVTFRfUkVURU5USU9OX1NJWkVcbiAgICAvKiogQHR5cGUge1NlcnZlckNoYW5nZUZlZWRFbnRyeVtdfSAqL1xuICAgIHRoaXMuX21lbW9yeUNoYW5nZXMgPSBbXVxuICAgIHRoaXMuX21lbW9yeVNlcXVlbmNlID0gMFxuICAgIHRoaXMuX2lzUmVhZHkgPSBmYWxzZVxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7V2Vha01hcDxpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCwge2NvbXBsZXRpb246IFByb21pc2U8dm9pZD4sIHByb21pc2U6IFByb21pc2U8dm9pZD59Pn0gKi9cbiAgICB0aGlzLl90cmFuc2FjdGlvblJlYWR5UHJvbWlzZXMgPSBuZXcgV2Vha01hcCgpXG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgYmFja2luZyB0YWJsZSBleGlzdHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcmVhZHkuXG4gICAqL1xuICBhc3luYyBlbnN1cmVSZWFkeSgpIHtcbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkge1xuICAgICAgdGhpcy5faXNSZWFkeSA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChhd2FpdCB0aGlzLl9zY2hlbWFSZWFkeSgpKSByZXR1cm5cblxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5zZXRDdXJyZW50KClcbiAgICBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiBhd2FpdCB0aGlzLl9lbnN1cmVSZWFkeVdpdGhEYihkYikpXG4gIH1cblxuICAvKipcbiAgICogQ29vcmRpbmF0ZXMgZHVyYWJsZSBhbmQgdHJhbnNhY3Rpb24tbG9jYWwgcmVhZGluZXNzIG9uIG9uZSBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyB3aGVuIHRoaXMgY2FsbGVyIGNhbiB1c2UgdGhlIHRhYmxlLlxuICAgKi9cbiAgYXN5bmMgX2Vuc3VyZVJlYWR5V2l0aERiKGRiKSB7XG4gICAgaWYgKHRoaXMuX2lzUmVhZHkpIHJldHVyblxuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25Db21wbGV0aW9uID0gZGIuaW5zaWRlVHJhbnNhY3Rpb24oKSA/IGRiLnRyYW5zYWN0aW9uQ29tcGxldGlvbigpIDogbnVsbFxuICAgIGNvbnN0IHRyYW5zYWN0aW9uUmVhZHkgPSB0aGlzLl90cmFuc2FjdGlvblJlYWR5UHJvbWlzZXMuZ2V0KGRiKVxuXG4gICAgaWYgKHRyYW5zYWN0aW9uQ29tcGxldGlvbiAmJiB0cmFuc2FjdGlvblJlYWR5Py5jb21wbGV0aW9uID09PSB0cmFuc2FjdGlvbkNvbXBsZXRpb24pIHtcbiAgICAgIGF3YWl0IHRyYW5zYWN0aW9uUmVhZHkucHJvbWlzZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3JlYWR5UHJvbWlzZSkge1xuICAgICAgY29uc3QgcmVhZHlQcm9taXNlID0gdGhpcy5fcmVhZHlQcm9taXNlXG5cbiAgICAgIGF3YWl0IHJlYWR5UHJvbWlzZVxuICAgICAgaWYgKHRoaXMuX3JlYWR5UHJvbWlzZSA9PT0gcmVhZHlQcm9taXNlKSB0aGlzLl9yZWFkeVByb21pc2UgPSBudWxsXG4gICAgICBpZiAodGhpcy5faXNSZWFkeSkgcmV0dXJuXG5cbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRyYW5zYWN0aW9uQ29tcGxldGlvbikge1xuICAgICAgY29uc3QgdGFibGVSZWFkeVByb21pc2UgPSB0aGlzLl9lbnN1cmVDaGFuZ2VzVGFibGUoZGIpXG4gICAgICBjb25zdCB0cmFuc2FjdGlvblJlYWR5UHJvbWlzZSA9IHRhYmxlUmVhZHlQcm9taXNlLnRoZW4oKCkgPT4gdW5kZWZpbmVkKVxuXG4gICAgICBjb25zdCBkdXJhYmxlUmVhZHlQcm9taXNlID0gdGFibGVSZWFkeVByb21pc2UudGhlbihhc3luYyAoY3JlYXRlZCkgPT4ge1xuICAgICAgICBpZiAoIWNyZWF0ZWQpIHtcbiAgICAgICAgICB0aGlzLl9pc1JlYWR5ID0gdHJ1ZVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdHJhbnNhY3Rpb25Db21wbGV0aW9uXG4gICAgICB9KVxuXG4gICAgICB0aGlzLl90cmFuc2FjdGlvblJlYWR5UHJvbWlzZXMuc2V0KGRiLCB7Y29tcGxldGlvbjogdHJhbnNhY3Rpb25Db21wbGV0aW9uLCBwcm9taXNlOiB0cmFuc2FjdGlvblJlYWR5UHJvbWlzZX0pXG4gICAgICB0aGlzLl9yZWFkeVByb21pc2UgPSBkdXJhYmxlUmVhZHlQcm9taXNlXG4gICAgICBhd2FpdCB0cmFuc2FjdGlvblJlYWR5UHJvbWlzZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gdGhpcy5fZW5zdXJlQ2hhbmdlc1RhYmxlKGRiKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuX2lzUmVhZHkgPSB0cnVlXG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZWFkeVByb21pc2VcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKCF0aGlzLl9pc1JlYWR5KSB0aGlzLl9yZWFkeVByb21pc2UgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjaGFuZ2UgYW5kIGFzc2lnbnMgdGhlIG5leHQgc2VydmVyIHNlcXVlbmNlLlxuICAgKiBAcGFyYW0ge09taXQ8U2VydmVyQ2hhbmdlRmVlZEVudHJ5LCBcImNyZWF0ZWRBdFwiIHwgXCJpZFwiIHwgXCJzZXJ2ZXJTZXF1ZW5jZVwiPiAmIHtjcmVhdGVkQXQ/OiBzdHJpbmcsIGlkPzogc3RyaW5nfX0gY2hhbmdlIC0gQ2hhbmdlIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZlckNoYW5nZUZlZWRFbnRyeT59IC0gUGVyc2lzdGVkIGNoYW5nZS5cbiAgICovXG4gIGFzeW5jIGFwcGVuZChjaGFuZ2UpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVJlYWR5KClcblxuICAgIGNvbnN0IGlkID0gY2hhbmdlLmlkIHx8IHJhbmRvbVVVSUQoKVxuICAgIGNvbnN0IGNyZWF0ZWRBdCA9IGNoYW5nZS5jcmVhdGVkQXQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG5cbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX2FwcGVuZE1lbW9yeSh7Li4uY2hhbmdlLCBjcmVhdGVkQXQsIGlkfSlcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiB7XG4gICAgICBhd2FpdCBkYi5pbnNlcnQoe1xuICAgICAgICB0YWJsZU5hbWU6IFRBQkxFX05BTUUsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBhY3Rvcl9kZXZpY2VfaWQ6IGNoYW5nZS5hY3RvckRldmljZUlkLFxuICAgICAgICAgIGFjdG9yX3VzZXJfaWQ6IGNoYW5nZS5hY3RvclVzZXJJZCxcbiAgICAgICAgICBhdHRyaWJ1dGVzX2pzb246IEpTT04uc3RyaW5naWZ5KGNoYW5nZS5hdHRyaWJ1dGVzIHx8IG51bGwpLFxuICAgICAgICAgIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKGNyZWF0ZWRBdCksXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgaWRlbXBvdGVuY3lfa2V5OiBjaGFuZ2UuaWRlbXBvdGVuY3lLZXksXG4gICAgICAgICAgbW9kZWw6IGNoYW5nZS5tb2RlbCxcbiAgICAgICAgICBvcGVyYXRpb246IGNoYW5nZS5vcGVyYXRpb24sXG4gICAgICAgICAgcGF5bG9hZF9qc29uOiBKU09OLnN0cmluZ2lmeShjaGFuZ2UucGF5bG9hZCB8fCBudWxsKSxcbiAgICAgICAgICByZWNvcmRfaWQ6IGNoYW5nZS5yZWNvcmRJZCA9PT0gbnVsbCB8fCBjaGFuZ2UucmVjb3JkSWQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBTdHJpbmcoY2hhbmdlLnJlY29yZElkKSxcbiAgICAgICAgICByZXNwb25zZV9qc29uOiBKU09OLnN0cmluZ2lmeShjaGFuZ2UucmVzcG9uc2UgfHwgbnVsbCksXG4gICAgICAgICAgc2NvcGVfanNvbjogc3RhYmxlSnNvblN0cmluZ2lmeShjaGFuZ2Uuc2NvcGUgfHwgbnVsbClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgY29uc3Qgcm93ID0gYXdhaXQgdGhpcy5fY2hhbmdlQnlJZChkYiwgaWQpXG4gICAgICBpZiAoIXJvdykgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIHBlcnNpc3Qgc2VydmVyIGNoYW5nZS1mZWVkIGVudHJ5XCIpXG5cbiAgICAgIGF3YWl0IHRoaXMuX3BydW5lUmV0YWluZWRDaGFuZ2VzKGRiLCByb3cuc2VydmVyU2VxdWVuY2UpXG5cbiAgICAgIHJldHVybiByb3dcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VycmVudCBsYXRlc3Qgc2VydmVyIHNlcXVlbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIExhdGVzdCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIGxhdGVzdFNlcXVlbmNlKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9tZW1vcnlTZXF1ZW5jZVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBkYlxuICAgICAgICAubmV3UXVlcnkoKVxuICAgICAgICAuZnJvbShUQUJMRV9OQU1FKVxuICAgICAgICAub3JkZXIoXCJzZXJ2ZXJfc2VxdWVuY2UgREVTQ1wiKVxuICAgICAgICAubGltaXQoMSlcbiAgICAgICAgLnJlc3VsdHMoKVxuICAgICAgY29uc3Qgcm93ID0gLyoqIEB0eXBlIHt7c2VydmVyX3NlcXVlbmNlPzogbnVtYmVyIHwgc3RyaW5nfSB8IHVuZGVmaW5lZH0gKi8gKHJvd3NbMF0pXG5cbiAgICAgIHJldHVybiByb3cgPyBOdW1iZXIocm93LnNlcnZlcl9zZXF1ZW5jZSkgOiAwXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG9sZGVzdCByZXRhaW5lZCBzZXJ2ZXIgc2VxdWVuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlciB8IG51bGw+fSAtIE9sZGVzdCByZXRhaW5lZCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIG9sZGVzdFNlcXVlbmNlKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9tZW1vcnlDaGFuZ2VzWzBdPy5zZXJ2ZXJTZXF1ZW5jZSB8fCBudWxsXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4gYXdhaXQgdGhpcy5fb2xkZXN0U2VxdWVuY2UoZGIpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3JkZXJlZCBjaGFuZ2VzIGFmdGVyIGEgY3Vyc29yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYWZ0ZXJTZXF1ZW5jZSAtIEV4Y2x1c2l2ZSBsb3dlciBib3VuZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmxpbWl0XSAtIE1heGltdW0gbnVtYmVyIG9mIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy51cFRvU2VxdWVuY2VdIC0gSW5jbHVzaXZlIHVwcGVyIGJvdW5kLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW2FyZ3Muc2NvcGVdIC0gQ2FsbGVyIHN5bmMgc2NvcGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtjaGFuZ2VzOiBTZXJ2ZXJDaGFuZ2VGZWVkRW50cnlbXSwgaGFzTW9yZTogYm9vbGVhbiwgbmV4dFNlcXVlbmNlOiBudW1iZXIsIG9sZGVzdFNlcXVlbmNlOiBudW1iZXIgfCBudWxsLCBzbmFwc2hvdFJlcXVpcmVkOiBib29sZWFuLCB1cFRvU2VxdWVuY2U6IG51bWJlcn0+fSAtIE9yZGVyZWQgcGFnZS5cbiAgICovXG4gIGFzeW5jIGNoYW5nZXNBZnRlcih7YWZ0ZXJTZXF1ZW5jZSwgbGltaXQgPSBERUZBVUxUX1BBR0VfU0laRSwgc2NvcGUsIHVwVG9TZXF1ZW5jZX0pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVJlYWR5KClcblxuICAgIGNvbnN0IHBhZ2VTaXplID0gbm9ybWFsaXplTGltaXQobGltaXQpXG5cbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX21lbW9yeUNoYW5nZXNBZnRlcih7YWZ0ZXJTZXF1ZW5jZSwgbGltaXQ6IHBhZ2VTaXplLCBzY29wZSwgdXBUb1NlcXVlbmNlfSlcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiB7XG4gICAgICBjb25zdCBsYXRlc3RTZXF1ZW5jZSA9IHR5cGVvZiB1cFRvU2VxdWVuY2UgPT09IFwibnVtYmVyXCIgPyB1cFRvU2VxdWVuY2UgOiBhd2FpdCB0aGlzLl9sYXRlc3RTZXF1ZW5jZShkYilcbiAgICAgIGNvbnN0IG9sZGVzdFNlcXVlbmNlID0gYXdhaXQgdGhpcy5fb2xkZXN0U2VxdWVuY2UoZGIpXG4gICAgICBjb25zdCBzbmFwc2hvdFJlcXVpcmVkID0gYWZ0ZXJTZXF1ZW5jZSA+IDAgJiYgb2xkZXN0U2VxdWVuY2UgIT09IG51bGwgJiYgb2xkZXN0U2VxdWVuY2UgPiBhZnRlclNlcXVlbmNlICsgMVxuXG4gICAgICBpZiAoc25hcHNob3RSZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNoYW5nZXM6IFtdLFxuICAgICAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgICAgIG5leHRTZXF1ZW5jZTogYWZ0ZXJTZXF1ZW5jZSxcbiAgICAgICAgICBvbGRlc3RTZXF1ZW5jZSxcbiAgICAgICAgICBzbmFwc2hvdFJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIHVwVG9TZXF1ZW5jZTogbGF0ZXN0U2VxdWVuY2VcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtTZXJ2ZXJDaGFuZ2VGZWVkUm93W119ICovIChhd2FpdCBkYlxuICAgICAgICAubmV3UXVlcnkoKVxuICAgICAgICAuZnJvbShUQUJMRV9OQU1FKVxuICAgICAgICAud2hlcmUoYHNlcnZlcl9zZXF1ZW5jZSA+ICR7ZGIucXVvdGUoYWZ0ZXJTZXF1ZW5jZSl9YClcbiAgICAgICAgLndoZXJlKGBzZXJ2ZXJfc2VxdWVuY2UgPD0gJHtkYi5xdW90ZShsYXRlc3RTZXF1ZW5jZSl9YClcbiAgICAgICAgLndoZXJlKHNjb3BlID09PSB1bmRlZmluZWQgPyBcIjEgPSAxXCIgOiB7c2NvcGVfanNvbjogc3RhYmxlSnNvblN0cmluZ2lmeShzY29wZSl9KVxuICAgICAgICAub3JkZXIoXCJzZXJ2ZXJfc2VxdWVuY2UgQVNDXCIpXG4gICAgICAgIC5saW1pdChwYWdlU2l6ZSArIDEpXG4gICAgICAgIC5yZXN1bHRzKCkpXG4gICAgICBjb25zdCBoYXNNb3JlID0gcm93cy5sZW5ndGggPiBwYWdlU2l6ZVxuICAgICAgY29uc3QgcGFnZVJvd3MgPSByb3dzLnNsaWNlKDAsIHBhZ2VTaXplKVxuICAgICAgY29uc3QgY2hhbmdlcyA9IHBhZ2VSb3dzLm1hcCgocm93KSA9PiB0aGlzLl9ub3JtYWxpemVDaGFuZ2VSb3cocm93KSlcbiAgICAgIGNvbnN0IGxhc3RDaGFuZ2UgPSBjaGFuZ2VzW2NoYW5nZXMubGVuZ3RoIC0gMV1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlcyxcbiAgICAgICAgaGFzTW9yZSxcbiAgICAgICAgbmV4dFNlcXVlbmNlOiBsYXN0Q2hhbmdlID8gbGFzdENoYW5nZS5zZXJ2ZXJTZXF1ZW5jZSA6IGFmdGVyU2VxdWVuY2UsXG4gICAgICAgIG9sZGVzdFNlcXVlbmNlLFxuICAgICAgICBzbmFwc2hvdFJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgdXBUb1NlcXVlbmNlOiBsYXRlc3RTZXF1ZW5jZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyBzY2hlbWEgaXMgc3RpbGwgcHJlc2VudC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciByZWFkeS5cbiAgICovXG4gIGFzeW5jIF9zY2hlbWFSZWFkeSgpIHtcbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX2lzUmVhZHlcbiAgICBpZiAoIXRoaXMuX2lzUmVhZHkpIHJldHVybiBmYWxzZVxuICAgIGlmIChhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiBhd2FpdCBkYi50YWJsZUV4aXN0cyhUQUJMRV9OQU1FKSkpIHJldHVybiB0cnVlXG5cbiAgICB0aGlzLl9pc1JlYWR5ID0gZmFsc2VcbiAgICB0aGlzLl9yZWFkeVByb21pc2UgPSBudWxsXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIGNoYW5nZXMgdGFibGUgZXhpc3RzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIHRhYmxlIGhhZCB0byBiZSBjcmVhdGVkLlxuICAgKi9cbiAgYXN5bmMgX2Vuc3VyZUNoYW5nZXNUYWJsZShkYikge1xuICAgIGlmIChhd2FpdCBkYi50YWJsZUV4aXN0cyhUQUJMRV9OQU1FKSkgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZURhdGEoVEFCTEVfTkFNRSwge2lmTm90RXhpc3RzOiB0cnVlfSlcblxuICAgIHRhYmxlLmludGVnZXIoXCJzZXJ2ZXJfc2VxdWVuY2VcIiwge2F1dG9JbmNyZW1lbnQ6IHRydWUsIG51bGw6IGZhbHNlLCBwcmltYXJ5S2V5OiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJpZFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJtb2RlbFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJvcGVyYXRpb25cIiwge251bGw6IGZhbHNlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJyZWNvcmRfaWRcIiwge2luZGV4OiB0cnVlLCBudWxsOiB0cnVlfSlcbiAgICB0YWJsZS50ZXh0KFwicGF5bG9hZF9qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS50ZXh0KFwiYXR0cmlidXRlc19qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJpZGVtcG90ZW5jeV9rZXlcIiwge2luZGV4OiB0cnVlLCBudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJhY3Rvcl91c2VyX2lkXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogdHJ1ZX0pXG4gICAgdGFibGUuc3RyaW5nKFwiYWN0b3JfZGV2aWNlX2lkXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogdHJ1ZX0pXG4gICAgdGFibGUudGV4dChcInNjb3BlX2pzb25cIiwge251bGw6IHRydWV9KVxuICAgIHRhYmxlLnRleHQoXCJyZXNwb25zZV9qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5kYXRldGltZShcImNyZWF0ZWRfYXRcIiwge2luZGV4OiB0cnVlLCBudWxsOiBmYWxzZX0pXG5cbiAgICBhd2FpdCBkYi5jcmVhdGVUYWJsZSh0YWJsZSlcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBwZXJzaXN0ZWQgY2hhbmdlIGJ5IGlkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIEVudHJ5IGlkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2ZXJDaGFuZ2VGZWVkRW50cnkgfCBudWxsPn0gLSBFbnRyeSBvciBudWxsLlxuICAgKi9cbiAgYXN5bmMgX2NoYW5nZUJ5SWQoZGIsIGlkKSB7XG4gICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7U2VydmVyQ2hhbmdlRmVlZFJvd1tdfSAqLyAoYXdhaXQgZGJcbiAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAuZnJvbShUQUJMRV9OQU1FKVxuICAgICAgLndoZXJlKHtpZH0pXG4gICAgICAubGltaXQoMSlcbiAgICAgIC5yZXN1bHRzKCkpXG5cbiAgICByZXR1cm4gcm93c1swXSA/IHRoaXMuX25vcm1hbGl6ZUNoYW5nZVJvdyhyb3dzWzBdKSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBjdXJyZW50IGxhdGVzdCBzZXF1ZW5jZSB3aXRob3V0IHJlYWRpbmVzcyBjaGVja3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gLSBMYXRlc3Qgc2VxdWVuY2UuXG4gICAqL1xuICBhc3luYyBfbGF0ZXN0U2VxdWVuY2UoZGIpIHtcbiAgICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtBcnJheTx7c2VydmVyX3NlcXVlbmNlPzogbnVtYmVyIHwgc3RyaW5nfT59ICovIChhd2FpdCBkYlxuICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAub3JkZXIoXCJzZXJ2ZXJfc2VxdWVuY2UgREVTQ1wiKVxuICAgICAgLmxpbWl0KDEpXG4gICAgICAucmVzdWx0cygpKVxuXG4gICAgcmV0dXJuIHJvd3NbMF0gPyBOdW1iZXIocm93c1swXS5zZXJ2ZXJfc2VxdWVuY2UpIDogMFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGN1cnJlbnQgb2xkZXN0IHNlcXVlbmNlIHdpdGhvdXQgcmVhZGluZXNzIGNoZWNrcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXIgfCBudWxsPn0gLSBPbGRlc3Qgc2VxdWVuY2UuXG4gICAqL1xuICBhc3luYyBfb2xkZXN0U2VxdWVuY2UoZGIpIHtcbiAgICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtBcnJheTx7c2VydmVyX3NlcXVlbmNlPzogbnVtYmVyIHwgc3RyaW5nfT59ICovIChhd2FpdCBkYlxuICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAub3JkZXIoXCJzZXJ2ZXJfc2VxdWVuY2UgQVNDXCIpXG4gICAgICAubGltaXQoMSlcbiAgICAgIC5yZXN1bHRzKCkpXG5cbiAgICByZXR1cm4gcm93c1swXSA/IE51bWJlcihyb3dzWzBdLnNlcnZlcl9zZXF1ZW5jZSkgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUHJ1bmVzIG9sZCByZXRhaW5lZCBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsYXRlc3RTZXF1ZW5jZSAtIExhdGVzdCBzZXF1ZW5jZSBhZnRlciBhcHBlbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfcHJ1bmVSZXRhaW5lZENoYW5nZXMoZGIsIGxhdGVzdFNlcXVlbmNlKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHRoaXMucmV0ZW50aW9uU2l6ZSkgfHwgdGhpcy5yZXRlbnRpb25TaXplIDwgMSkgcmV0dXJuXG5cbiAgICBjb25zdCBwcnVuZUJlZm9yZU9yQXQgPSBsYXRlc3RTZXF1ZW5jZSAtIHRoaXMucmV0ZW50aW9uU2l6ZVxuICAgIGlmIChwcnVuZUJlZm9yZU9yQXQgPCAxKSByZXR1cm5cblxuICAgIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PHtpZDogc3RyaW5nfT59ICovIChhd2FpdCBkYlxuICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAud2hlcmUoYHNlcnZlcl9zZXF1ZW5jZSA8PSAke2RiLnF1b3RlKHBydW5lQmVmb3JlT3JBdCl9YClcbiAgICAgIC5yZXN1bHRzKCkpXG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBhd2FpdCBkYi5kZWxldGUoe2NvbmRpdGlvbnM6IHtpZDogcm93LmlkfSwgdGFibGVOYW1lOiBUQUJMRV9OQU1FfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBhIGNoYW5nZSByb3cuXG4gICAqIEBwYXJhbSB7U2VydmVyQ2hhbmdlRmVlZFJvd30gcm93IC0gUmF3IGRhdGFiYXNlIHJvdy5cbiAgICogQHJldHVybnMge1NlcnZlckNoYW5nZUZlZWRFbnRyeX0gLSBOb3JtYWxpemVkIGNoYW5nZS5cbiAgICovXG4gIF9ub3JtYWxpemVDaGFuZ2VSb3cocm93KSB7XG4gICAgY29uc3QgY3JlYXRlZEF0VmFsdWUgPSByb3cuY3JlYXRlZF9hdFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdG9yRGV2aWNlSWQ6IHJvdy5hY3Rvcl9kZXZpY2VfaWQgfHwgbnVsbCxcbiAgICAgIGFjdG9yVXNlcklkOiByb3cuYWN0b3JfdXNlcl9pZCB8fCBudWxsLFxuICAgICAgYXR0cmlidXRlczogcGFyc2VKc29uT3JOdWxsKHJvdy5hdHRyaWJ1dGVzX2pzb24pLFxuICAgICAgY3JlYXRlZEF0OiBjcmVhdGVkQXRWYWx1ZSBpbnN0YW5jZW9mIERhdGUgPyBjcmVhdGVkQXRWYWx1ZS50b0lTT1N0cmluZygpIDogbmV3IERhdGUoY3JlYXRlZEF0VmFsdWUpLnRvSVNPU3RyaW5nKCksXG4gICAgICBpZDogcm93LmlkLFxuICAgICAgaWRlbXBvdGVuY3lLZXk6IHJvdy5pZGVtcG90ZW5jeV9rZXkgfHwgbnVsbCxcbiAgICAgIG1vZGVsOiByb3cubW9kZWwsXG4gICAgICBvcGVyYXRpb246IHJvdy5vcGVyYXRpb24sXG4gICAgICBwYXlsb2FkOiBwYXJzZUpzb25Pck51bGwocm93LnBheWxvYWRfanNvbiksXG4gICAgICByZWNvcmRJZDogcm93LnJlY29yZF9pZCB8fCBudWxsLFxuICAgICAgcmVzcG9uc2U6IHBhcnNlSnNvbk9yTnVsbChyb3cucmVzcG9uc2VfanNvbiksXG4gICAgICBzY29wZTogcGFyc2VKc29uT3JOdWxsKHJvdy5zY29wZV9qc29uKSxcbiAgICAgIHNlcnZlclNlcXVlbmNlOiBOdW1iZXIocm93LnNlcnZlcl9zZXF1ZW5jZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHN0b3JlIHNob3VsZCB1c2UgcHJvY2Vzcy1sb2NhbCBtZW1vcnkgYmVjYXVzZSBubyBkYXRhYmFzZSBpZGVudGlmaWVyIGlzIGNvbmZpZ3VyZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgbWVtb3J5IHN0b3JhZ2UgaXMgYWN0aXZlLlxuICAgKi9cbiAgX3VzZXNNZW1vcnlTdG9yYWdlKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gIXRoaXMuY29uZmlndXJhdGlvbi5nZXREYXRhYmFzZUNvbmZpZ3VyYXRpb24oKVt0aGlzLmRhdGFiYXNlSWRlbnRpZmllcl1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBwcm9jZXNzLWxvY2FsIG1lbW9yeSBlbnRyeSB3aGVuIG5vIGRhdGFiYXNlIGlzIGNvbmZpZ3VyZWQuXG4gICAqIEBwYXJhbSB7T21pdDxTZXJ2ZXJDaGFuZ2VGZWVkRW50cnksIFwic2VydmVyU2VxdWVuY2VcIj59IGNoYW5nZSAtIENoYW5nZSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7U2VydmVyQ2hhbmdlRmVlZEVudHJ5fSAtIEFwcGVuZGVkIGVudHJ5LlxuICAgKi9cbiAgX2FwcGVuZE1lbW9yeShjaGFuZ2UpIHtcbiAgICBjb25zdCBlbnRyeSA9IC8qKiBAdHlwZSB7U2VydmVyQ2hhbmdlRmVlZEVudHJ5fSAqLyAoe1xuICAgICAgYWN0b3JEZXZpY2VJZDogY2hhbmdlLmFjdG9yRGV2aWNlSWQsXG4gICAgICBhY3RvclVzZXJJZDogY2hhbmdlLmFjdG9yVXNlcklkLFxuICAgICAgYXR0cmlidXRlczogY2hhbmdlLmF0dHJpYnV0ZXMgfHwgbnVsbCxcbiAgICAgIGNyZWF0ZWRBdDogY2hhbmdlLmNyZWF0ZWRBdCxcbiAgICAgIGlkOiBjaGFuZ2UuaWQsXG4gICAgICBpZGVtcG90ZW5jeUtleTogY2hhbmdlLmlkZW1wb3RlbmN5S2V5LFxuICAgICAgbW9kZWw6IGNoYW5nZS5tb2RlbCxcbiAgICAgIG9wZXJhdGlvbjogY2hhbmdlLm9wZXJhdGlvbixcbiAgICAgIHBheWxvYWQ6IGNoYW5nZS5wYXlsb2FkIHx8IG51bGwsXG4gICAgICByZWNvcmRJZDogY2hhbmdlLnJlY29yZElkID09PSBudWxsIHx8IGNoYW5nZS5yZWNvcmRJZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFN0cmluZyhjaGFuZ2UucmVjb3JkSWQpLFxuICAgICAgcmVzcG9uc2U6IGNoYW5nZS5yZXNwb25zZSB8fCBudWxsLFxuICAgICAgc2NvcGU6IGNoYW5nZS5zY29wZSB8fCBudWxsLFxuICAgICAgc2VydmVyU2VxdWVuY2U6ICsrdGhpcy5fbWVtb3J5U2VxdWVuY2VcbiAgICB9KVxuXG4gICAgdGhpcy5fbWVtb3J5Q2hhbmdlcy5wdXNoKGVudHJ5KVxuICAgIGlmICh0aGlzLl9tZW1vcnlDaGFuZ2VzLmxlbmd0aCA+IHRoaXMucmV0ZW50aW9uU2l6ZSkgdGhpcy5fbWVtb3J5Q2hhbmdlcy5zcGxpY2UoMCwgdGhpcy5fbWVtb3J5Q2hhbmdlcy5sZW5ndGggLSB0aGlzLnJldGVudGlvblNpemUpXG5cbiAgICByZXR1cm4gZW50cnlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcHJvY2Vzcy1sb2NhbCBtZW1vcnkgY2hhbmdlIHBhZ2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5hZnRlclNlcXVlbmNlIC0gRXhjbHVzaXZlIGxvd2VyIGJvdW5kLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5saW1pdCAtIFBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnVwVG9TZXF1ZW5jZV0gLSBJbmNsdXNpdmUgdXBwZXIgYm91bmQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbYXJncy5zY29wZV0gLSBDYWxsZXIgc3luYyBzY29wZS5cbiAgICogQHJldHVybnMge3tjaGFuZ2VzOiBTZXJ2ZXJDaGFuZ2VGZWVkRW50cnlbXSwgaGFzTW9yZTogYm9vbGVhbiwgbmV4dFNlcXVlbmNlOiBudW1iZXIsIG9sZGVzdFNlcXVlbmNlOiBudW1iZXIgfCBudWxsLCBzbmFwc2hvdFJlcXVpcmVkOiBib29sZWFuLCB1cFRvU2VxdWVuY2U6IG51bWJlcn19IC0gT3JkZXJlZCBwYWdlLlxuICAgKi9cbiAgX21lbW9yeUNoYW5nZXNBZnRlcih7YWZ0ZXJTZXF1ZW5jZSwgbGltaXQsIHNjb3BlLCB1cFRvU2VxdWVuY2V9KSB7XG4gICAgY29uc3QgbGF0ZXN0U2VxdWVuY2UgPSB0eXBlb2YgdXBUb1NlcXVlbmNlID09PSBcIm51bWJlclwiID8gdXBUb1NlcXVlbmNlIDogdGhpcy5fbWVtb3J5U2VxdWVuY2VcbiAgICBjb25zdCBvbGRlc3RTZXF1ZW5jZSA9IHRoaXMuX21lbW9yeUNoYW5nZXNbMF0/LnNlcnZlclNlcXVlbmNlIHx8IG51bGxcbiAgICBjb25zdCBzbmFwc2hvdFJlcXVpcmVkID0gYWZ0ZXJTZXF1ZW5jZSA+IDAgJiYgb2xkZXN0U2VxdWVuY2UgIT09IG51bGwgJiYgb2xkZXN0U2VxdWVuY2UgPiBhZnRlclNlcXVlbmNlICsgMVxuXG4gICAgaWYgKHNuYXBzaG90UmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiB7Y2hhbmdlczogW10sIGhhc01vcmU6IGZhbHNlLCBuZXh0U2VxdWVuY2U6IGFmdGVyU2VxdWVuY2UsIG9sZGVzdFNlcXVlbmNlLCBzbmFwc2hvdFJlcXVpcmVkOiB0cnVlLCB1cFRvU2VxdWVuY2U6IGxhdGVzdFNlcXVlbmNlfVxuICAgIH1cblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLl9tZW1vcnlDaGFuZ2VzLmZpbHRlcigoY2hhbmdlKSA9PiB7XG4gICAgICByZXR1cm4gY2hhbmdlLnNlcnZlclNlcXVlbmNlID4gYWZ0ZXJTZXF1ZW5jZSAmJiBjaGFuZ2Uuc2VydmVyU2VxdWVuY2UgPD0gbGF0ZXN0U2VxdWVuY2UgJiYgc2NvcGVzRXF1YWwoY2hhbmdlLnNjb3BlLCBzY29wZSlcbiAgICB9KVxuICAgIGNvbnN0IGhhc01vcmUgPSByb3dzLmxlbmd0aCA+IGxpbWl0XG4gICAgY29uc3QgY2hhbmdlcyA9IHJvd3Muc2xpY2UoMCwgbGltaXQpXG4gICAgY29uc3QgbGFzdENoYW5nZSA9IGNoYW5nZXNbY2hhbmdlcy5sZW5ndGggLSAxXVxuXG4gICAgcmV0dXJuIHtjaGFuZ2VzLCBoYXNNb3JlLCBuZXh0U2VxdWVuY2U6IGxhc3RDaGFuZ2UgPyBsYXN0Q2hhbmdlLnNlcnZlclNlcXVlbmNlIDogYWZ0ZXJTZXF1ZW5jZSwgb2xkZXN0U2VxdWVuY2UsIHNuYXBzaG90UmVxdWlyZWQ6IGZhbHNlLCB1cFRvU2VxdWVuY2U6IGxhdGVzdFNlcXVlbmNlfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd2l0aCBkYi5cbiAgICogQHBhcmFtIHsoZGI6IGltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0KSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIF93aXRoRGIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtkYXRhYmFzZUlkZW50aWZpZXJzOiBbdGhpcy5kYXRhYmFzZUlkZW50aWZpZXJdLCBuYW1lOiBcIlNlcnZlciBjaGFuZ2UtZmVlZCBzdG9yZVwifSwgYXN5bmMgKGRicykgPT4ge1xuICAgICAgY29uc3QgZGIgPSBkYnNbdGhpcy5kYXRhYmFzZUlkZW50aWZpZXJdXG5cbiAgICAgIGlmICghZGIpIHRocm93IG5ldyBFcnJvcihgTm8gZGF0YWJhc2UgY29ubmVjdGlvbiBhdmFpbGFibGUgZm9yIGlkZW50aWZpZXI6ICR7dGhpcy5kYXRhYmFzZUlkZW50aWZpZXJ9YClcblxuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKGRiKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHBhZ2UgbGltaXQuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBsaW1pdCAtIFJlcXVlc3RlZCBsaW1pdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gUGFnZSBzaXplLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVMaW1pdChsaW1pdCkge1xuICBpZiAodHlwZW9mIGxpbWl0ID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0ludGVnZXIobGltaXQpICYmIGxpbWl0ID4gMCkgcmV0dXJuIE1hdGgubWluKGxpbWl0LCBNQVhfUEFHRV9TSVpFKVxuICBpZiAodHlwZW9mIGxpbWl0ID09PSBcInN0cmluZ1wiICYmIC9eXFxkKyQvLnRlc3QobGltaXQpKSByZXR1cm4gTWF0aC5taW4oTnVtYmVyKGxpbWl0KSwgTUFYX1BBR0VfU0laRSlcblxuICByZXR1cm4gREVGQVVMVF9QQUdFX1NJWkVcbn1cblxuLyoqXG4gKiBQYXJzZXMgSlNPTi1pc2ggdmFsdWVzLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBKU09OIHN0cmluZy5cbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gLSBQYXJzZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSnNvbk9yTnVsbCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlLmxlbmd0aCA8IDEpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpXG59XG5cbi8qKlxuICogQ29tcGFyZXMgc3luYyBzY29wZXMgYnkgc3RhYmxlIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiB8IG51bGx9IGNoYW5nZVNjb3BlIC0gUGVyc2lzdGVkIGNoYW5nZSBzY29wZS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgdW5kZWZpbmVkfSByZXF1ZXN0ZWRTY29wZSAtIENhbGxlciBzY29wZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNoYW5nZSBpcyB2aXNpYmxlIGZvciB0aGUgcmVxdWVzdGVkIHNjb3BlLlxuICovXG5mdW5jdGlvbiBzY29wZXNFcXVhbChjaGFuZ2VTY29wZSwgcmVxdWVzdGVkU2NvcGUpIHtcbiAgaWYgKHJlcXVlc3RlZFNjb3BlID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIHN0YWJsZUpzb25TdHJpbmdpZnkoY2hhbmdlU2NvcGUgfHwgbnVsbCkgPT09IHN0YWJsZUpzb25TdHJpbmdpZnkocmVxdWVzdGVkU2NvcGUpXG59XG4iXX0=
@@ -39,6 +39,11 @@ export default class SyncScopeStore {
39
39
  _isReady: boolean;
40
40
  /** @type {Promise<void> | null} */
41
41
  _readyPromise: Promise<void> | null;
42
+ /** @type {WeakMap<import("../database/drivers/base.js").default, {completion: Promise<void>, promise: Promise<void>}>} */
43
+ _transactionReadyPromises: WeakMap<import("../database/drivers/base.js").default, {
44
+ completion: Promise<void>;
45
+ promise: Promise<void>;
46
+ }>;
42
47
  /**
43
48
  * Creates a sync scope store.
44
49
  * @param {object} args - Options.
@@ -54,6 +59,12 @@ export default class SyncScopeStore {
54
59
  * @returns {Promise<void>} Resolves when ready.
55
60
  */
56
61
  ensureReady(): Promise<void>;
62
+ /**
63
+ * Coordinates durable and transaction-local readiness on one connection.
64
+ * @param {import("../database/drivers/base.js").default} db - Database connection.
65
+ * @returns {Promise<void>} Resolves when this caller can use the table.
66
+ */
67
+ _ensureReadyWithDb(db: import("../database/drivers/base.js").default): Promise<void>;
57
68
  /**
58
69
  * Finds or creates the scope row for a serialized scope, reactivating removed scopes.
59
70
  * @param {import("./sync-client-types.js").SerializedSyncScope} scope - Serialized sync scope.
@@ -99,9 +110,9 @@ export default class SyncScopeStore {
99
110
  /**
100
111
  * Ensures the scopes table exists.
101
112
  * @param {import("../database/drivers/base.js").default} db - Database connection.
102
- * @returns {Promise<void>}
113
+ * @returns {Promise<boolean>} Whether the table had to be created.
103
114
  */
104
- _ensureScopesTable(db: import("../database/drivers/base.js").default): Promise<void>;
115
+ _ensureScopesTable(db: import("../database/drivers/base.js").default): Promise<boolean>;
105
116
  /**
106
117
  * Resolves a scope row by its digest.
107
118
  * @param {import("../database/drivers/base.js").default} db - Database connection.
@@ -1 +1 @@
1
- {"version":3,"file":"sync-scope-store.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-scope-store.js"],"names":[],"mappings":"AASG,YAAkB,YAAY,GAC9B;;;;IAA0D,UAAU,EAAzD,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CACxD;;;;IAA0B,aAAa,EAA5B,MAAM,GAAG,IAAI,CACxB;;;;IAAmB,EAAE,EAAV,MAAM,CACjB;;;;IAA0B,YAAY,EAA3B,MAAM,GAAG,IAAI,CACxB;;;;IAAmB,WAAW,EAAnB,MAAM,CACjB;;;;IAAmB,KAAK,EAAb,MAAM,CACnB;CAAA,CAAA;AAcD;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,cAAc;IAQ1B,aAAa;IACb,kBAAkB;IACvB,wCAAwC;IACnC,aAAa,EADP,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;IAE/B,QAAQ;IACb,mCAAmC;IAC9B,aAAa,EADP,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAZjC;;;;;OAKG;IACH,YAAY,EAAC,aAAa,EAAE,kBAA8B,EAAC,EAHxD;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO,CAC7C;QAAsB,kBAAkB,AAAxC,CACF,EADU,MAAM,CAChB;KAC0D,EAQ1D;IAED;;;OAGG;IACG,WAAW,IAFJ,OAAO,CAAC,IAAI,CAAC,CAsBzB;IAED;;;;OAIG;IACG,iBAAiB,CAAC,KAAK,EAHlB,OAAO,wBAAwB,EAAE,mBAGf,GAFhB,OAAO,CAAC,YAAY,CAAC,CAgEjC;IAED;;;OAGG;IACG,YAAY,IAFL,OAAO,CAAC,YAAY,EAAE,CAAC,CAmBnC;IAED;;;;OAIG;IACG,UAAU,CAAC,QAAQ,EAHd,YAGc,GAFZ,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAclC;IAED;;;;;OAKG;IACG,UAAU,CAAC,QAAQ,EAJd,YAIc,EAAE,MAAM,EAHtB,OAAO,4BAA4B,EAAE,UAGf,GAFpB,OAAO,CAAC,IAAI,CAAC,CAyBzB;IAED;;;;OAIG;IACG,UAAU,CAAC,KAAK,EAHX,OAAO,wBAAwB,EAAE,mBAGtB,GAFT,OAAO,CAAC,IAAI,CAAC,CAkBzB;IAED;;;OAGG;IACH,kBAAkB,IAFL,OAAO,CAQnB;IAED;;;;;OAKG;IACG,OAAO,CAJA,MAAM,EAIL,QAAQ,EAHX,CAAC,EAAE,EAAE,OAAO,6BAA6B,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAG1D,GAFT,OAAO,CAAC,MAAM,CAAC,CAU3B;IAED;;;;OAIG;IACG,kBAAkB,CAAC,EAAE,EAHhB,OAAO,6BAA6B,EAAE,OAGtB,GAFd,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;;;OAKG;IACG,iBAAiB,CAAC,EAAE,EAJf,OAAO,6BAA6B,EAAE,OAIvB,EAAE,MAAM,EAHvB,MAGuB,GAFrB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAWxC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,GAAG,EAHX,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAGjC,GAFT,YAAY,CAWxB;CACF"}
1
+ {"version":3,"file":"sync-scope-store.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-scope-store.js"],"names":[],"mappings":"AASG,YAAkB,YAAY,GAC9B;;;;IAA0D,UAAU,EAAzD,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CACxD;;;;IAA0B,aAAa,EAA5B,MAAM,GAAG,IAAI,CACxB;;;;IAAmB,EAAE,EAAV,MAAM,CACjB;;;;IAA0B,YAAY,EAA3B,MAAM,GAAG,IAAI,CACxB;;;;IAAmB,WAAW,EAAnB,MAAM,CACjB;;;;IAAmB,KAAK,EAAb,MAAM,CACnB;CAAA,CAAA;AAcD;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,cAAc;IAQ1B,aAAa;IACb,kBAAkB;IACvB,wCAAwC;IACnC,aAAa,EADP,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;IAE/B,QAAQ;IACb,mCAAmC;IAC9B,aAAa,EADP,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAE/B,0HAA0H;IACrH,yBAAyB,EADnB,OAAO,CAAC,OAAO,6BAA6B,EAAE,OAAO,EAAE;QAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;KAAC,CAAC;IAdxH;;;;;OAKG;IACH,YAAY,EAAC,aAAa,EAAE,kBAA8B,EAAC,EAHxD;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO,CAC7C;QAAsB,kBAAkB,AAAxC,CACF,EADU,MAAM,CAChB;KAC0D,EAU1D;IAED;;;OAGG;IACG,WAAW,IAFJ,OAAO,CAAC,IAAI,CAAC,CAWzB;IAED;;;;OAIG;IACG,kBAAkB,CAAC,EAAE,EAHhB,OAAO,6BAA6B,EAAE,OAGtB,GAFd,OAAO,CAAC,IAAI,CAAC,CAoDzB;IAED;;;;OAIG;IACG,iBAAiB,CAAC,KAAK,EAHlB,OAAO,wBAAwB,EAAE,mBAGf,GAFhB,OAAO,CAAC,YAAY,CAAC,CAgEjC;IAED;;;OAGG;IACG,YAAY,IAFL,OAAO,CAAC,YAAY,EAAE,CAAC,CAmBnC;IAED;;;;OAIG;IACG,UAAU,CAAC,QAAQ,EAHd,YAGc,GAFZ,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAclC;IAED;;;;;OAKG;IACG,UAAU,CAAC,QAAQ,EAJd,YAIc,EAAE,MAAM,EAHtB,OAAO,4BAA4B,EAAE,UAGf,GAFpB,OAAO,CAAC,IAAI,CAAC,CAyBzB;IAED;;;;OAIG;IACG,UAAU,CAAC,KAAK,EAHX,OAAO,wBAAwB,EAAE,mBAGtB,GAFT,OAAO,CAAC,IAAI,CAAC,CAkBzB;IAED;;;OAGG;IACH,kBAAkB,IAFL,OAAO,CAQnB;IAED;;;;;OAKG;IACG,OAAO,CAJA,MAAM,EAIL,QAAQ,EAHX,CAAC,EAAE,EAAE,OAAO,6BAA6B,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAG1D,GAFT,OAAO,CAAC,MAAM,CAAC,CAU3B;IAED;;;;OAIG;IACG,kBAAkB,CAAC,EAAE,EAHhB,OAAO,6BAA6B,EAAE,OAGtB,GAFd,OAAO,CAAC,OAAO,CAAC,CAmB5B;IAED;;;;;OAKG;IACG,iBAAiB,CAAC,EAAE,EAJf,OAAO,6BAA6B,EAAE,OAIvB,EAAE,MAAM,EAHvB,MAGuB,GAFrB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAWxC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,GAAG,EAHX,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAGjC,GAFT,YAAY,CAWxB;CACF"}