velocious 1.0.643 → 1.0.645
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -10
- package/build/authorization/ability.js +36 -13
- package/build/background-jobs/adapter.js +9 -0
- package/build/background-jobs/main.js +35 -10
- package/build/background-jobs/store.js +217 -38
- package/build/background-jobs/types.js +15 -0
- package/build/configuration-types.js +1 -1
- package/build/configuration.js +45 -9
- package/build/database/drivers/base-column.js +8 -0
- package/build/database/drivers/mssql/sql/update.js +1 -3
- package/build/database/drivers/mysql/sql/update.js +1 -3
- package/build/database/drivers/pgsql/column.js +22 -0
- package/build/database/drivers/pgsql/sql/update.js +1 -3
- package/build/database/drivers/sqlite/sql/alter-table.js +11 -1
- package/build/database/drivers/sqlite/sql/update.js +1 -3
- package/build/database/query/index.js +2 -2
- package/build/database/query/model-class-query.js +26 -10
- package/build/database/query/preloader/has-many.js +4 -1
- package/build/database/query/query-data.js +2 -1
- package/build/database/query/update-base.js +14 -0
- package/build/database/query/with-count.js +3 -1
- package/build/database/record/acts-as-list.js +37 -13
- package/build/database/record/attachments/store.js +336 -26
- package/build/database/record/auditing.js +6 -3
- package/build/database/record/index.js +197 -42
- package/build/database/record/instance-relationships/belongs-to.js +2 -1
- package/build/database/record/validators/uniqueness.js +8 -5
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
- package/build/frontend-model-controller.js +136 -53
- package/build/frontend-model-resource/base-resource.js +87 -37
- package/build/frontend-model-resource/velocious-attachment-resource.js +98 -31
- package/build/frontend-models/base.js +307 -59
- package/build/frontend-models/preloader.js +6 -3
- package/build/frontend-models/query.js +15 -6
- package/build/frontend-models/resource-definition.js +21 -2
- package/build/frontend-models/use-destroyed-event.js +1 -1
- package/build/frontend-models/use-model-class-event.js +2 -2
- package/build/frontend-models/use-updated-event.js +1 -1
- package/build/frontend-models/websocket-channel.js +256 -93
- package/build/frontend-models/websocket-publishers.js +218 -18
- package/build/http-server/client/websocket-session.js +13 -1
- package/build/http-server/websocket-channel.js +15 -2
- package/build/src/authorization/ability.d.ts +9 -3
- package/build/src/authorization/ability.d.ts.map +1 -1
- package/build/src/authorization/ability.js +33 -14
- package/build/src/background-jobs/adapter.d.ts +6 -0
- package/build/src/background-jobs/adapter.d.ts.map +1 -1
- package/build/src/background-jobs/adapter.js +9 -1
- package/build/src/background-jobs/main.d.ts +6 -0
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +34 -11
- package/build/src/background-jobs/store.d.ts +66 -12
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +191 -35
- package/build/src/background-jobs/types.d.ts +55 -0
- package/build/src/background-jobs/types.d.ts.map +1 -1
- package/build/src/background-jobs/types.js +16 -1
- package/build/src/configuration-types.d.ts +3 -3
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +2 -2
- package/build/src/configuration.d.ts +18 -8
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +38 -7
- package/build/src/database/drivers/base-column.d.ts +5 -0
- package/build/src/database/drivers/base-column.d.ts.map +1 -1
- package/build/src/database/drivers/base-column.js +8 -1
- package/build/src/database/drivers/mssql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/update.js +2 -4
- package/build/src/database/drivers/mysql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/sql/update.js +2 -4
- package/build/src/database/drivers/pgsql/column.d.ts +5 -0
- package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/column.js +19 -1
- package/build/src/database/drivers/pgsql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/update.js +2 -4
- package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/alter-table.js +6 -2
- package/build/src/database/drivers/sqlite/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/update.js +2 -4
- package/build/src/database/query/index.d.ts +4 -4
- package/build/src/database/query/index.d.ts.map +1 -1
- package/build/src/database/query/index.js +3 -3
- package/build/src/database/query/model-class-query.d.ts +8 -2
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +25 -11
- package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
- package/build/src/database/query/preloader/has-many.js +4 -2
- package/build/src/database/query/query-data.d.ts.map +1 -1
- package/build/src/database/query/query-data.js +3 -2
- package/build/src/database/query/update-base.d.ts +7 -0
- package/build/src/database/query/update-base.d.ts.map +1 -1
- package/build/src/database/query/update-base.js +13 -1
- package/build/src/database/query/with-count.d.ts.map +1 -1
- package/build/src/database/query/with-count.js +3 -2
- package/build/src/database/record/acts-as-list.d.ts.map +1 -1
- package/build/src/database/record/acts-as-list.js +35 -14
- package/build/src/database/record/attachments/store.d.ts +67 -0
- package/build/src/database/record/attachments/store.d.ts.map +1 -1
- package/build/src/database/record/attachments/store.js +301 -25
- package/build/src/database/record/auditing.d.ts.map +1 -1
- package/build/src/database/record/auditing.js +7 -4
- package/build/src/database/record/index.d.ts +78 -26
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +171 -42
- package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/belongs-to.js +3 -2
- package/build/src/database/record/validators/uniqueness.d.ts.map +1 -1
- package/build/src/database/record/validators/uniqueness.js +8 -6
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +4 -4
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -12
- package/build/src/frontend-model-controller.d.ts +29 -8
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +122 -51
- package/build/src/frontend-model-resource/base-resource.d.ts +51 -24
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +83 -37
- package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts +45 -26
- package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/velocious-attachment-resource.js +89 -31
- package/build/src/frontend-models/base.d.ts +53 -20
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +275 -59
- package/build/src/frontend-models/preloader.d.ts.map +1 -1
- package/build/src/frontend-models/preloader.js +6 -4
- package/build/src/frontend-models/query.d.ts +2 -2
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +14 -7
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +20 -3
- package/build/src/frontend-models/use-destroyed-event.d.ts +1 -1
- package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-destroyed-event.js +2 -2
- package/build/src/frontend-models/use-model-class-event.d.ts +2 -2
- package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-model-class-event.js +3 -3
- package/build/src/frontend-models/use-updated-event.d.ts +1 -1
- package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-updated-event.js +2 -2
- package/build/src/frontend-models/websocket-channel.d.ts +60 -41
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +225 -85
- package/build/src/frontend-models/websocket-publishers.d.ts +9 -0
- package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-publishers.js +190 -19
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +11 -2
- package/build/src/http-server/websocket-channel.d.ts +20 -8
- package/build/src/http-server/websocket-channel.d.ts.map +1 -1
- package/build/src/http-server/websocket-channel.js +15 -3
- package/build/src/sync/assets/cache.d.ts +288 -0
- package/build/src/sync/assets/cache.d.ts.map +1 -0
- package/build/src/sync/assets/cache.js +883 -0
- package/build/src/sync/assets/types.d.ts +199 -0
- package/build/src/sync/assets/types.d.ts.map +1 -0
- package/build/src/sync/assets/types.js +56 -0
- package/build/src/sync/sync-api-client.d.ts.map +1 -1
- package/build/src/sync/sync-api-client.js +4 -3
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +3 -2
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +6 -5
- package/build/src/sync/sync-publisher.d.ts.map +1 -1
- package/build/src/sync/sync-publisher.js +4 -3
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +2 -2
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +3 -3
- package/build/src/testing/test-profiler.d.ts +4 -4
- package/build/src/testing/test-profiler.d.ts.map +1 -1
- package/build/src/testing/test-profiler.js +3 -3
- package/build/src/testing/test-runner.d.ts +279 -117
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +503 -933
- package/build/src/testing/test.d.ts +11 -72
- package/build/src/testing/test.d.ts.map +1 -1
- package/build/src/testing/test.js +131 -284
- package/build/src/testing/velocious-attempt-executor.d.ts +54 -0
- package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -0
- package/build/src/testing/velocious-attempt-executor.js +408 -0
- package/build/src/testing/velocious-runner-reporter.d.ts +67 -0
- package/build/src/testing/velocious-runner-reporter.d.ts.map +1 -0
- package/build/src/testing/velocious-runner-reporter.js +240 -0
- package/build/src/testing/velocious-suite-hook-executor.d.ts +19 -0
- package/build/src/testing/velocious-suite-hook-executor.d.ts.map +1 -0
- package/build/src/testing/velocious-suite-hook-executor.js +41 -0
- package/build/src/testing/velocious-test-arguments.d.ts +39 -0
- package/build/src/testing/velocious-test-arguments.d.ts.map +1 -0
- package/build/src/testing/velocious-test-arguments.js +55 -0
- package/build/src/utils/model-primary-key.d.ts +73 -0
- package/build/src/utils/model-primary-key.d.ts.map +1 -0
- package/build/src/utils/model-primary-key.js +144 -0
- package/build/src/utils/sha256-bytes-hex.d.ts +7 -0
- package/build/src/utils/sha256-bytes-hex.d.ts.map +1 -0
- package/build/src/utils/sha256-bytes-hex.js +117 -0
- package/build/src/utils/sha256-hex.d.ts +2 -4
- package/build/src/utils/sha256-hex.d.ts.map +1 -1
- package/build/src/utils/sha256-hex.js +6 -120
- package/build/sync/assets/cache.js +998 -0
- package/build/sync/assets/types.js +62 -0
- package/build/sync/sync-api-client.js +3 -2
- package/build/sync/sync-client.js +2 -1
- package/build/sync/sync-envelope-replay-service.js +5 -4
- package/build/sync/sync-publisher.js +3 -2
- package/build/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
- package/build/testing/test-profiler.js +2 -2
- package/build/testing/test-runner.js +496 -990
- package/build/testing/test.js +164 -306
- package/build/testing/velocious-attempt-executor.js +441 -0
- package/build/testing/velocious-runner-reporter.js +264 -0
- package/build/testing/velocious-suite-hook-executor.js +43 -0
- package/build/testing/velocious-test-arguments.js +64 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/utils/model-primary-key.js +171 -0
- package/build/utils/sha256-bytes-hex.js +132 -0
- package/build/utils/sha256-hex.js +7 -135
- package/package.json +5 -4
- package/src/authorization/ability.js +36 -13
- package/src/background-jobs/adapter.js +9 -0
- package/src/background-jobs/main.js +35 -10
- package/src/background-jobs/store.js +217 -38
- package/src/background-jobs/types.js +15 -0
- package/src/configuration-types.js +1 -1
- package/src/configuration.js +45 -9
- package/src/database/drivers/base-column.js +8 -0
- package/src/database/drivers/mssql/sql/update.js +1 -3
- package/src/database/drivers/mysql/sql/update.js +1 -3
- package/src/database/drivers/pgsql/column.js +22 -0
- package/src/database/drivers/pgsql/sql/update.js +1 -3
- package/src/database/drivers/sqlite/sql/alter-table.js +11 -1
- package/src/database/drivers/sqlite/sql/update.js +1 -3
- package/src/database/query/index.js +2 -2
- package/src/database/query/model-class-query.js +26 -10
- package/src/database/query/preloader/has-many.js +4 -1
- package/src/database/query/query-data.js +2 -1
- package/src/database/query/update-base.js +14 -0
- package/src/database/query/with-count.js +3 -1
- package/src/database/record/acts-as-list.js +37 -13
- package/src/database/record/attachments/store.js +336 -26
- package/src/database/record/auditing.js +6 -3
- package/src/database/record/index.js +197 -42
- package/src/database/record/instance-relationships/belongs-to.js +2 -1
- package/src/database/record/validators/uniqueness.js +8 -5
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
- package/src/frontend-model-controller.js +136 -53
- package/src/frontend-model-resource/base-resource.js +87 -37
- package/src/frontend-model-resource/velocious-attachment-resource.js +98 -31
- package/src/frontend-models/base.js +307 -59
- package/src/frontend-models/preloader.js +6 -3
- package/src/frontend-models/query.js +15 -6
- package/src/frontend-models/resource-definition.js +21 -2
- package/src/frontend-models/use-destroyed-event.js +1 -1
- package/src/frontend-models/use-model-class-event.js +2 -2
- package/src/frontend-models/use-updated-event.js +1 -1
- package/src/frontend-models/websocket-channel.js +256 -93
- package/src/frontend-models/websocket-publishers.js +218 -18
- package/src/http-server/client/websocket-session.js +13 -1
- package/src/http-server/websocket-channel.js +15 -2
- package/src/sync/assets/cache.js +998 -0
- package/src/sync/assets/types.js +62 -0
- package/src/sync/sync-api-client.js +3 -2
- package/src/sync/sync-client.js +2 -1
- package/src/sync/sync-envelope-replay-service.js +5 -4
- package/src/sync/sync-publisher.js +3 -2
- package/src/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
- package/src/testing/test-profiler.js +2 -2
- package/src/testing/test-runner.js +496 -990
- package/src/testing/test.js +164 -306
- package/src/testing/velocious-attempt-executor.js +441 -0
- package/src/testing/velocious-runner-reporter.js +264 -0
- package/src/testing/velocious-suite-hook-executor.js +43 -0
- package/src/testing/velocious-test-arguments.js +64 -0
- package/src/utils/model-primary-key.js +171 -0
- package/src/utils/sha256-bytes-hex.js +132 -0
- package/src/utils/sha256-hex.js +7 -135
- package/build/src/testing/testing-package-adapter.d.ts +0 -9
- package/build/src/testing/testing-package-adapter.d.ts.map +0 -1
- package/build/src/testing/testing-package-adapter.js +0 -69
- package/build/testing/testing-package-adapter.js +0 -76
- package/src/testing/testing-package-adapter.js +0 -76
|
@@ -1,10 +1,27 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
+
import { scalarModelPrimaryKey, scalarModelPrimaryKeyValue } from "../../utils/model-primary-key.js";
|
|
2
3
|
/** @file Registers gap-less positional list callbacks on a model class. */
|
|
3
4
|
/**
|
|
4
5
|
* Acts as list shifting.
|
|
5
6
|
* @type {symbol} - Guard flag set on the model instance during shift operations to prevent re-entrant lifecycle hooks.
|
|
6
7
|
*/
|
|
7
8
|
const ACTS_AS_LIST_SHIFTING = Symbol("actsAsListShifting");
|
|
9
|
+
/**
|
|
10
|
+
* Returns the scalar primary-key column required by acts-as-list SQL.
|
|
11
|
+
* @param {typeof import("./index.js").default} modelClass - List model class.
|
|
12
|
+
* @returns {string} - Scalar primary-key column.
|
|
13
|
+
*/
|
|
14
|
+
function actsAsListPrimaryKey(modelClass) {
|
|
15
|
+
return scalarModelPrimaryKey(modelClass.primaryKey(), `actsAsList for ${modelClass.name}`);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Returns the scalar record id required by acts-as-list SQL.
|
|
19
|
+
* @param {import("./index.js").default} record - List record.
|
|
20
|
+
* @returns {string | number} - Scalar record id.
|
|
21
|
+
*/
|
|
22
|
+
function actsAsListRecordId(record) {
|
|
23
|
+
return scalarModelPrimaryKeyValue(record.id(), `actsAsList for ${record.getModelClass().name}`);
|
|
24
|
+
}
|
|
8
25
|
/**
|
|
9
26
|
* Runs set shifting flag.
|
|
10
27
|
* @param {import("./index.js").default} record - Model instance.
|
|
@@ -100,7 +117,7 @@ export default function registerActsAsListCallbacks(modelClass, positionColumn,
|
|
|
100
117
|
await moveOutOfWay({ record, positionColumn, scope, scopeValue: oldScopeValue });
|
|
101
118
|
setShiftingFlag(record, false);
|
|
102
119
|
await shiftPositionsDown({ record, positionColumn, scope, scopeValue: oldScopeValue, fromPosition: oldPosition + 1 });
|
|
103
|
-
await shiftPositionsUp({ record, positionColumn, scope, scopeValue: newScopeValue, fromPosition: newPosition, excludeRecordId: record
|
|
120
|
+
await shiftPositionsUp({ record, positionColumn, scope, scopeValue: newScopeValue, fromPosition: newPosition, excludeRecordId: actsAsListRecordId(record) });
|
|
104
121
|
await placeMovedRecord({ record, positionColumn, scope, scopeValue: newScopeValue, position: newPosition });
|
|
105
122
|
return;
|
|
106
123
|
}
|
|
@@ -161,11 +178,13 @@ async function placeMovedRecord({ record, positionColumn, scope, scopeValue, pos
|
|
|
161
178
|
const preservedChanges = { ...record._changes };
|
|
162
179
|
const scopeColumnSql = connection.quoteColumn(scopeCol);
|
|
163
180
|
const positionColumnSql = connection.quoteColumn(posCol);
|
|
164
|
-
const
|
|
181
|
+
const primaryKey = actsAsListPrimaryKey(modelClass);
|
|
182
|
+
const primaryKeySql = connection.quoteColumn(primaryKey);
|
|
183
|
+
const recordId = actsAsListRecordId(record);
|
|
165
184
|
delete preservedChanges[scopeCol];
|
|
166
185
|
delete preservedChanges[posCol];
|
|
167
|
-
await connection.query(`UPDATE ${tableSql} SET ${scopeColumnSql} = ${connection.quote(scopeValue)}, ${positionColumnSql} = ${connection.quote(position)} WHERE ${primaryKeySql} = ${connection.quote(
|
|
168
|
-
await record._reloadWithId(
|
|
186
|
+
await connection.query(`UPDATE ${tableSql} SET ${scopeColumnSql} = ${connection.quote(scopeValue)}, ${positionColumnSql} = ${connection.quote(position)} WHERE ${primaryKeySql} = ${connection.quote(recordId)}`);
|
|
187
|
+
await record._reloadWithId(recordId);
|
|
169
188
|
record._changes = preservedChanges;
|
|
170
189
|
clearBelongsToChangeForScope(record);
|
|
171
190
|
}
|
|
@@ -207,19 +226,20 @@ async function shiftPositionsUp({ record, positionColumn, scope, fromPosition, t
|
|
|
207
226
|
const positionColumnName = modelClass.getColumnNameForAttributeName(positionColumn);
|
|
208
227
|
const positionColumnSql = connection.quoteColumn(positionColumnName);
|
|
209
228
|
const scopeColumnSql = connection.quoteColumn(scopeColumnName);
|
|
210
|
-
const
|
|
229
|
+
const primaryKey = actsAsListPrimaryKey(modelClass);
|
|
230
|
+
const primaryKeySql = connection.quoteColumn(primaryKey);
|
|
211
231
|
const tableSql = connection.quoteTable(tableName);
|
|
212
232
|
const quotedScope = connection.quote(resolvedScopeValue);
|
|
213
233
|
// Load rows in descending order so we bump the highest first
|
|
214
234
|
let query = record
|
|
215
235
|
.queryForModel(modelClass)
|
|
216
|
-
.select(
|
|
236
|
+
.select(primaryKey)
|
|
217
237
|
.select(positionColumn)
|
|
218
238
|
.where({ [scopeColumnName]: resolvedScopeValue })
|
|
219
239
|
.where(`${positionColumnSql} >= ${connection.quote(fromPosition)}`)
|
|
220
240
|
.where(`${positionColumnSql} > 0`)
|
|
221
241
|
.order(`${positionColumnSql} DESC`);
|
|
222
|
-
const recordIdToExclude = excludeRecordId || (record.isPersisted() ? record
|
|
242
|
+
const recordIdToExclude = excludeRecordId || (record.isPersisted() ? actsAsListRecordId(record) : null);
|
|
223
243
|
if (recordIdToExclude != null) {
|
|
224
244
|
query = query.where(`${primaryKeySql} != ${connection.quote(recordIdToExclude)}`);
|
|
225
245
|
}
|
|
@@ -262,18 +282,19 @@ async function shiftPositionsDown({ record, positionColumn, scope, fromPosition,
|
|
|
262
282
|
const positionColumnName = modelClass.getColumnNameForAttributeName(positionColumn);
|
|
263
283
|
const positionColumnSql = connection.quoteColumn(positionColumnName);
|
|
264
284
|
const scopeColumnSql = connection.quoteColumn(scopeColumnName);
|
|
265
|
-
const
|
|
285
|
+
const primaryKey = actsAsListPrimaryKey(modelClass);
|
|
286
|
+
const primaryKeySql = connection.quoteColumn(primaryKey);
|
|
266
287
|
const tableSql = connection.quoteTable(tableName);
|
|
267
288
|
const quotedScope = connection.quote(resolvedScopeValue);
|
|
268
289
|
// Load rows in ascending order so we shift the lowest gap first
|
|
269
290
|
let query = record
|
|
270
291
|
.queryForModel(modelClass)
|
|
271
|
-
.select(
|
|
292
|
+
.select(primaryKey)
|
|
272
293
|
.select(positionColumn)
|
|
273
294
|
.where({ [scopeColumnName]: resolvedScopeValue })
|
|
274
295
|
.where(`${positionColumnSql} >= ${connection.quote(fromPosition)}`)
|
|
275
296
|
.where(`${positionColumnSql} > 0`)
|
|
276
|
-
.where(`${primaryKeySql} != ${connection.quote(record
|
|
297
|
+
.where(`${primaryKeySql} != ${connection.quote(actsAsListRecordId(record))}`)
|
|
277
298
|
.order({ column: positionColumnName, direction: "ASC" });
|
|
278
299
|
if (toPosition != null) {
|
|
279
300
|
query = query.where(`${positionColumnSql} < ${connection.quote(toPosition)}`);
|
|
@@ -345,7 +366,7 @@ function resolveScopeValue(record, scope) {
|
|
|
345
366
|
const instanceRelationship = record.getRelationshipByName(relationshipName);
|
|
346
367
|
const loaded = instanceRelationship.loaded();
|
|
347
368
|
if (loaded && !Array.isArray(loaded) && typeof loaded.id === "function") {
|
|
348
|
-
return loaded.id();
|
|
369
|
+
return scalarModelPrimaryKeyValue(loaded.id(), `actsAsList scope relationship for ${modelClass.name}`);
|
|
349
370
|
}
|
|
350
371
|
}
|
|
351
372
|
return null;
|
|
@@ -370,13 +391,13 @@ async function moveOutOfWay({ record, positionColumn, scope, scopeValue }) {
|
|
|
370
391
|
const positionColumnSql = connection.quoteColumn(modelClass.getColumnNameForAttributeName(positionColumn));
|
|
371
392
|
const scopeColumnSql = connection.quoteColumn(modelClass.getColumnNameForAttributeName(scope));
|
|
372
393
|
const tableSql = connection.quoteTable(tableName);
|
|
373
|
-
const pkSql = connection.quoteColumn(modelClass
|
|
394
|
+
const pkSql = connection.quoteColumn(actsAsListPrimaryKey(modelClass));
|
|
374
395
|
setShiftingFlag(record, true);
|
|
375
396
|
try {
|
|
376
|
-
await connection.query(`UPDATE ${tableSql} SET ${positionColumnSql} = -${positionColumnSql} WHERE ${scopeColumnSql} = ${connection.quote(resolvedScopeValue)} AND ${pkSql} = ${connection.quote(record
|
|
397
|
+
await connection.query(`UPDATE ${tableSql} SET ${positionColumnSql} = -${positionColumnSql} WHERE ${scopeColumnSql} = ${connection.quote(resolvedScopeValue)} AND ${pkSql} = ${connection.quote(actsAsListRecordId(record))}`);
|
|
377
398
|
}
|
|
378
399
|
finally {
|
|
379
400
|
// Don't clear the flag here — the caller will do that after shifts
|
|
380
401
|
}
|
|
381
402
|
}
|
|
382
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0cy1hcy1saXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3JlY29yZC9hY3RzLWFzLWxpc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLDJFQUEyRTtBQUUzRTs7O0dBR0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0FBRTFEOzs7O0dBSUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxNQUFNLEVBQUUsS0FBSztJQUNwQyxtREFBbUQ7SUFDbkQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsS0FBSyxDQUFBO0FBQ3ZDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxVQUFVLENBQUMsTUFBTTtJQUN4QixtREFBbUQ7SUFDbkQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQTtBQUMvQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsT0FBTyxVQUFVLDJCQUEyQixDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsRUFBQyxLQUFLLEVBQUM7SUFDckYsVUFBVSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDdkMsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTTtRQUU5QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBRXJELElBQUksUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3JCLHNCQUFzQixDQUFDLEVBQUMsUUFBUSxFQUFFLGNBQWMsRUFBQyxDQUFDLENBQUE7WUFDbEQsTUFBTSxnQkFBZ0IsQ0FBQyxFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO1FBQ2pGLENBQUM7YUFBTSxDQUFDO1lBQ04s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Q29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqIEBmaWxlIFJlZ2lzdGVycyBnYXAtbGVzcyBwb3NpdGlvbmFsIGxpc3QgY2FsbGJhY2tzIG9uIGEgbW9kZWwgY2xhc3MuICovXG5cbi8qKlxuICogQWN0cyBhcyBsaXN0IHNoaWZ0aW5nLlxuICogQHR5cGUge3N5bWJvbH0gLSBHdWFyZCBmbGFnIHNldCBvbiB0aGUgbW9kZWwgaW5zdGFuY2UgZHVyaW5nIHNoaWZ0IG9wZXJhdGlvbnMgdG8gcHJldmVudCByZS1lbnRyYW50IGxpZmVjeWNsZSBob29rcy5cbiAqL1xuY29uc3QgQUNUU19BU19MSVNUX1NISUZUSU5HID0gU3ltYm9sKFwiYWN0c0FzTGlzdFNoaWZ0aW5nXCIpXG5cbi8qKlxuICogUnVucyBzZXQgc2hpZnRpbmcgZmxhZy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSByZWNvcmQgLSBNb2RlbCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBGbGFnIHZhbHVlLlxuICovXG5mdW5jdGlvbiBzZXRTaGlmdGluZ0ZsYWcocmVjb3JkLCB2YWx1ZSkge1xuICAvLyBAdHMtaWdub3JlIC0gU3ltYm9sIGluZGV4aW5nIG9uIFJlY29yZCBpbnN0YW5jZXNcbiAgcmVjb3JkW0FDVFNfQVNfTElTVF9TSElGVElOR10gPSB2YWx1ZVxufVxuXG4vKipcbiAqIFJ1bnMgaXMgc2hpZnRpbmcuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gcmVjb3JkIC0gTW9kZWwgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGxpc3QgcG9zaXRpb25zIGFyZSBjdXJyZW50bHkgc2hpZnRpbmcuXG4gKi9cbmZ1bmN0aW9uIGlzU2hpZnRpbmcocmVjb3JkKSB7XG4gIC8vIEB0cy1pZ25vcmUgLSBTeW1ib2wgaW5kZXhpbmcgb24gUmVjb3JkIGluc3RhbmNlc1xuICByZXR1cm4gQm9vbGVhbihyZWNvcmRbQUNUU19BU19MSVNUX1NISUZUSU5HXSlcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgZ2FwLWxlc3MgcG9zaXRpb25hbCBsaXN0IGNhbGxiYWNrcyBvbiBhIG1vZGVsIGNsYXNzIHRvIG1haW50YWluXG4gKiBhIGdhcC1sZXNzIHBvc2l0aW9uYWwgbGlzdC4gV2hlbiBhIHJlY29yZCBpcyBpbnNlcnRlZCwgdXBkYXRlZCwgb3JcbiAqIGRlc3Ryb3llZCwgdGhlIHN1cnJvdW5kaW5nIHBvc2l0aW9ucyBhcmUgc2hpZnRlZCBzbyB0aGUgbGlzdCBzdGF5cyBjb21wYWN0XG4gKiAoMSwyLDMsLi4uKSBhbmQgc2NvcGVkIHdpdGhpbiB0aGUgZ2l2ZW4gY29sdW1uLlxuICpcbiAqIENhbGxlcnMgbXVzdCBhbHNvIGVuc3VyZSBhIFVOSVFVRSBpbmRleCBvbiAoc2NvcGVDb2x1bW4sIHBvc2l0aW9uQ29sdW1uKVxuICogZXhpc3RzIGluIHRoZSBkYXRhYmFzZSBzY2hlbWEg4oCUIHVzZSBgTWlncmF0aW9uLmFkZEFjdHNBc0xpc3QoKWAgZm9yIHRoZVxuICogY29ycmVzcG9uZGluZyBzY2hlbWEgc2V0dXAuXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBUaGUgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gcG9zaXRpb25Db2x1bW4gLSBjYW1lbENhc2UgbmFtZSBvZiB0aGUgcG9zaXRpb24gYXR0cmlidXRlIChlLmcuIFwicm93TnVtYmVyXCIpLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuc2NvcGUgLSBjYW1lbENhc2UgbmFtZSBvZiB0aGUgc2NvcGUgYXR0cmlidXRlIChlLmcuIFwiYm9hcmRDb2x1bW5JZFwiKS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlckFjdHNBc0xpc3RDYWxsYmFja3MobW9kZWxDbGFzcywgcG9zaXRpb25Db2x1bW4sIHtzY29wZX0pIHtcbiAgbW9kZWxDbGFzcy5iZWZvcmVDcmVhdGUoYXN5bmMgKHJlY29yZCkgPT4ge1xuICAgIGlmIChpc1NoaWZ0aW5nKHJlY29yZCkpIHJldHVyblxuXG4gICAgY29uc3QgcG9zaXRpb24gPSByZWNvcmQucmVhZEF0dHJpYnV0ZShwb3NpdGlvbkNvbHVtbilcblxuICAgIGlmIChwb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgICBhc3NlcnRQb3NpdGl2ZVBvc2l0aW9uKHtwb3NpdGlvbiwgcG9zaXRpb25Db2x1bW59KVxuICAgICAgYXdhaXQgc2hpZnRQb3NpdGlvbnNVcCh7cmVjb3JkLCBwb3NpdGlvbkNvbHVtbiwgc2NvcGUsIGZyb21Qb3NpdGlvbjogcG9zaXRpb259KVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuZXh0UG9zaXRpb24gPSBhd2FpdCBoaWdoZXN0UG9zaXRpb25JblNjb3BlKHtyZWNvcmQsIHBvc2l0aW9uQ29sdW1uLCBzY29wZX0pXG5cbiAgICAgIHJlY29yZC5zZXRBdHRyaWJ1dGUocG9zaXRpb25Db2x1bW4sIG5leHRQb3NpdGlvbiArIDEpXG4gICAgfVxuICB9KVxuXG4gIG1vZGVsQ2xhc3MuYmVmb3JlVXBkYXRlKGFzeW5jIChyZWNvcmQpID0+IHtcbiAgICBpZiAoaXNTaGlmdGluZyhyZWNvcmQpKSByZXR1cm5cbiAgICBpZiAoIXJlY29yZC5pc1BlcnNpc3RlZCgpKSByZXR1cm5cblxuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIChyZWNvcmQuY29uc3RydWN0b3IpXG4gICAgY29uc3QgcG9zQ29sdW1uID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lRm9yQXR0cmlidXRlTmFtZShwb3NpdGlvbkNvbHVtbilcbiAgICBjb25zdCBzY29wZUNvbCA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZUZvckF0dHJpYnV0ZU5hbWUoc2NvcGUpXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gICAgY29uc3QgcmF3QXR0cmlidXRlcyA9IHJlY29yZC5fYXR0cmlidXRlcyB8fCB7fVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqL1xuICAgIGNvbnN0IGNoYW5nZXMgPSByZWNvcmQuX2NoYW5nZXMgfHwge31cbiAgICAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICAgIGNvbnN0IGFzc2lnbmVkQXR0cmlidXRlTmFtZXMgPSByZWNvcmQuX2Fzc2lnbmVkQXR0cmlidXRlTmFtZXMgfHwgbmV3IFNldCgpXG4gICAgY29uc3QgcG9zQ2hhbmdlZCA9IHBvc0NvbHVtbiBpbiBjaGFuZ2VzXG4gICAgY29uc3Qgc2NvcGVDaGFuZ2VkID0gc2NvcGVDb2wgaW4gY2hhbmdlc1xuICAgIGNvbnN0IHBvc0Fzc2lnbmVkID0gYXNzaWduZWRBdHRyaWJ1dGVOYW1lcy5oYXMocG9zaXRpb25Db2x1bW4pXG5cbiAgICBpZiAoIXBvc0NoYW5nZWQgJiYgIXNjb3BlQ2hhbmdlZCkgcmV0dXJuXG5cbiAgICBhc3NlcnRQb3NpdGl2ZVBvc2l0aW9uKHtcbiAgICAgIHBvc2l0aW9uOiByYXdBdHRyaWJ1dGVzW3Bvc0NvbHVtbl0sXG4gICAgICBwb3NpdGlvbkNvbHVtbixcbiAgICAgIHBlcnNpc3RlZDogdHJ1ZVxuICAgIH0pXG5cbiAgICBjb25zdCBvbGRQb3NpdGlvbiA9IHBvc0NoYW5nZWQgPyAvKiogQHR5cGUge251bWJlcn0gKi8gKHJhd0F0dHJpYnV0ZXNbcG9zQ29sdW1uXSkgOiAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlY29yZC5yZWFkQXR0cmlidXRlKHBvc2l0aW9uQ29sdW1uKSlcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IHBvc0NoYW5nZWQgPyAvKiogQHR5cGUge251bWJlcn0gKi8gKGNoYW5nZXNbcG9zQ29sdW1uXSkgOiAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlY29yZC5yZWFkQXR0cmlidXRlKHBvc2l0aW9uQ29sdW1uKSlcbiAgICBjb25zdCBvbGRTY29wZVZhbHVlID0gc2NvcGVDaGFuZ2VkID8gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyYXdBdHRyaWJ1dGVzW3Njb3BlQ29sXSkgOiAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlY29yZC5yZWFkQXR0cmlidXRlKHNjb3BlKSlcbiAgICBjb25zdCBuZXdTY29wZVZhbHVlID0gc2NvcGVDaGFuZ2VkID8gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChjaGFuZ2VzW3Njb3BlQ29sXSkgOiAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlY29yZC5yZWFkQXR0cmlidXRlKHNjb3BlKSlcblxuICAgIGFzc2VydFBvc2l0aXZlUG9zaXRpb24oe3Bvc2l0aW9uOiBuZXdQb3NpdGlvbiwgcG9zaXRpb25Db2x1bW59KVxuICAgIGlmIChvbGRQb3NpdGlvbiA9PSBudWxsKSByZXR1cm5cbiAgICBpZiAobmV3UG9zaXRpb24gPT09IG9sZFBvc2l0aW9uICYmIG5ld1Njb3BlVmFsdWUgPT09IG9sZFNjb3BlVmFsdWUpIHJldHVyblxuXG4gICAgaWYgKHNjb3BlQ2hhbmdlZCAmJiBvbGRTY29wZVZhbHVlICE9PSBuZXdTY29wZVZhbHVlKSB7XG4gICAgICAvLyBXaGVuIG9ubHkgdGhlIHNjb3BlIGNoYW5nZXMgd2l0aG91dCBhIG5ldyBwb3NpdGlvbiwgYXBwZW5kIHRvIHRoZSBlbmRcbiAgICAgIC8vIG9mIHRoZSBuZXcgc2NvcGUuIFRoZXJlIGlzIG5vIHRhcmdldC1zY29wZSByb3cgdG8gc2hpZnQgb3V0IG9mIHRoZSB3YXkuXG4gICAgICBpZiAoIXBvc0Fzc2lnbmVkKSB7XG4gICAgICAgIGF3YWl0IG1vdmVPdXRPZldheSh7cmVjb3JkLCBwb3NpdGlvbkNvbHVtbiwgc2NvcGUsIHNjb3BlVmFsdWU6IG9sZFNjb3BlVmFsdWV9KVxuICAgICAgICBzZXRTaGlmdGluZ0ZsYWcocmVjb3JkLCBmYWxzZSlcblxuICAgICAgICBjb25zdCBoaWdoZXN0TmV3ID0gYXdhaXQgaGlnaGVzdFBvc2l0aW9uSW5TY29wZSh7cmVjb3JkLCBwb3NpdGlvbkNvbHVtbiwgc2NvcGUsIHNjb3BlVmFsdWU6IG5ld1Njb3BlVmFsdWV9KVxuICAgICAgICBjb25zdCBuZXh0UG9zID0gaGlnaGVzdE5ldyArIDFcblxuICAgICAgICByZWNvcmQuc2V0QXR0cmlidXRlKHBvc2l0aW9uQ29sdW1uLCBuZXh0UG9zKVxuICAgICAgICBhd2FpdCBzaGlmdFBvc2l0aW9uc0Rvd24oe3JlY29yZCwgcG9zaXRpb25Db2x1bW4sIHNjb3BlLCBzY29wZVZhbHVlOiBvbGRTY29wZVZhbHVlLCBmcm9tUG9zaXRpb246IG9sZFBvc2l0aW9uICsgMX0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBhd2FpdCBtb3ZlT3V0T2ZXYXkoe3JlY29yZCwgcG9zaXRpb25Db2x1bW4sIHNjb3BlLCBzY29wZVZhbHVlOiBvbGRTY29wZVZhbHVlfSlcbiAgICAgIHNldFNoaWZ0aW5nRmxhZyhyZWNvcmQsIGZhbHNlKVxuICAgICAgYXdhaXQgc2hpZnRQb3NpdGlvbnNEb3duKHtyZWNvcmQsIHBvc2l0aW9uQ29sdW1uLCBzY29wZSwgc2NvcGVWYWx1ZTogb2xkU2NvcGVWYWx1ZSwgZnJvbVBvc2l0aW9uOiBvbGRQb3NpdGlvbiArIDF9KVxuICAgICAgYXdhaXQgc2hpZnRQb3NpdGlvbnNVcCh7cmVjb3JkLCBwb3NpdGlvbkNvbHVtbiwgc2NvcGUsIHNjb3BlVmFsdWU6IG5ld1Njb3BlVmFsdWUsIGZyb21Qb3NpdGlvbjogbmV3UG9zaXRpb24sIGV4Y2x1ZGVSZWNvcmRJZDogcmVjb3JkLmlkKCl9KVxuICAgICAgYXdhaXQgcGxhY2VNb3ZlZFJlY29yZCh7cmVjb3JkLCBwb3NpdGlvbkNvbHVtbiwgc2NvcGUsIHNjb3BlVmFsdWU6IG5ld1Njb3BlVmFsdWUsIHBvc2l0aW9uOiBuZXdQb3NpdGlvbn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCBtb3ZlT3V0T2ZXYXkoe3JlY29yZCwgcG9zaXRpb25Db2x1bW4sIHNjb3BlLCBzY29wZVZhbHVlOiBvbGRTY29wZVZhbHVlfSlcbiAgICBzZXRTaGlmdGluZ0ZsYWcocmVjb3JkLCBmYWxzZSlcblxuICAgIGlmIChuZXdQb3NpdGlvbiA8IG9sZFBvc2l0aW9uKSB7XG4gICAgICBhd2FpdCBzaGlmdFBvc2l0aW9uc1VwKHtyZWNvcmQsIHBvc2l0aW9uQ29sdW1uLCBzY29wZSwgZnJvbVBvc2l0aW9uOiBuZXdQb3NpdGlvbiwgdG9Qb3NpdGlvbjogb2xkUG9zaXRpb259KVxuICAgIH0gZWxzZSBpZiAobmV3UG9zaXRpb24gPiBvbGRQb3NpdGlvbikge1xuICAgICAgYXdhaXQgc2hpZnRQb3NpdGlvbnNEb3duKHtyZWNvcmQsIHBvc2l0aW9uQ29sdW1uLCBzY29wZSwgZnJvbVBvc2l0aW9uOiBvbGRQb3NpdGlvbiArIDEsIHRvUG9zaXRpb246IG5ld1Bvc2l0aW9uICsgMX0pXG4gICAgfVxuICB9KVxuXG4gIG1vZGVsQ2xhc3MuYmVmb3JlRGVzdHJveShhc3luYyAocmVjb3JkKSA9PiB7XG4gICAgY29uc3QgcG9zaXRpb24gPSByZWNvcmQucmVhZEF0dHJpYnV0ZShwb3NpdGlvbkNvbHVtbilcblxuICAgIGlmIChwb3NpdGlvbiA9PSBudWxsKSB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAocmVjb3JkLmNvbnN0cnVjdG9yKVxuICAgICAgY29uc3QgcG9zQ29sdW1uID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lRm9yQXR0cmlidXRlTmFtZShwb3NpdGlvbkNvbHVtbilcblxuICAgICAgaWYgKHBvc0NvbHVtbiBpbiByZWNvcmQuX2F0dHJpYnV0ZXMpIGFzc2VydFBvc2l0aXZlUG9zaXRpb24oe3Bvc2l0aW9uLCBwb3NpdGlvbkNvbHVtbiwgcGVyc2lzdGVkOiB0cnVlfSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBhc3NlcnRQb3NpdGl2ZVBvc2l0aW9uKHtwb3NpdGlvbiwgcG9zaXRpb25Db2x1bW4sIHBlcnNpc3RlZDogdHJ1ZX0pXG5cbiAgICBhd2FpdCBtb3ZlT3V0T2ZXYXkoe3JlY29yZCwgcG9zaXRpb25Db2x1bW4sIHNjb3BlfSlcbiAgICBzZXRTaGlmdGluZ0ZsYWcocmVjb3JkLCBmYWxzZSlcblxuICAgIGF3YWl0IHNoaWZ0UG9zaXRpb25zRG93bih7cmVjb3JkLCBwb3NpdGlvbkNvbHVtbiwgc2NvcGUsIGZyb21Qb3NpdGlvbjogcG9zaXRpb24gKyAxfSlcbiAgfSlcbn1cblxuLyoqXG4gKiBFbmZvcmNlcyB0aGUgcHVibGljIGdhcC1sZXNzIGxpc3QgcG9zaXRpb24gaW52YXJpYW50IGJlZm9yZSBhbnkgc2hpZnRpbmcuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5wb3NpdGlvbiAtIFBvc2l0aW9uIHRvIHZhbGlkYXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucG9zaXRpb25Db2x1bW4gLSBQb3NpdGlvbiBhdHRyaWJ1dGUgbmFtZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MucGVyc2lzdGVkXSAtIFdoZXRoZXIgdGhlIGludmFsaWQgdmFsdWUgY2FtZSBmcm9tIHBlcnNpc3RlZCBzdGF0ZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhc3NlcnRQb3NpdGl2ZVBvc2l0aW9uKHtwb3NpdGlvbiwgcG9zaXRpb25Db2x1bW4sIHBlcnNpc3RlZCA9IGZhbHNlfSkge1xuICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0ludGVnZXIocG9zaXRpb24pICYmIHBvc2l0aW9uID4gMCkgcmV0dXJuXG5cbiAgY29uc3Qgc291cmNlID0gcGVyc2lzdGVkID8gXCJQZXJzaXN0ZWRcIiA6IFwiUmVxdWVzdGVkXCJcblxuICB0aHJvdyBuZXcgRXJyb3IoYCR7c291cmNlfSBhY3RzQXNMaXN0ICR7cG9zaXRpb25Db2x1bW59IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyYClcbn1cblxuLyoqXG4gKiBQbGFjZXMgYSBtb3ZlZCByb3cgYWZ0ZXIgc3Vycm91bmRpbmcgcm93cyBoYXZlIHNoaWZ0ZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlY29yZCAtIE1vZGVsIGluc3RhbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucG9zaXRpb25Db2x1bW4gLSBQb3NpdGlvbiBhdHRyaWJ1dGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNjb3BlIC0gU2NvcGUgYXR0cmlidXRlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gYXJncy5zY29wZVZhbHVlIC0gRGVzdGluYXRpb24gc2NvcGUgdmFsdWUuXG4gKiBAcGFyYW0ge251bWJlcn0gYXJncy5wb3NpdGlvbiAtIERlc3RpbmF0aW9uIHBvc2l0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIGFmdGVyIHBsYWNlbWVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGxhY2VNb3ZlZFJlY29yZCh7cmVjb3JkLCBwb3NpdGlvbkNvbHVtbiwgc2NvcGUsIHNjb3BlVmFsdWUsIHBvc2l0aW9ufSkge1xuICBjb25zdCBtb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAocmVjb3JkLmNvbnN0cnVjdG9yKVxuICBjb25zdCBjb25uZWN0aW9uID0gcmVjb3JkLmNvbm5lY3Rpb24oKVxuICBjb25zdCB0YWJsZVNxbCA9IGNvbm5lY3Rpb24ucXVvdGVUYWJsZShtb2RlbENsYXNzLl9nZXRUYWJsZSgpLmdldE5hbWUoKSlcbiAgY29uc3Qgc2NvcGVDb2wgPSBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKHNjb3BlKVxuICBjb25zdCBwb3NDb2wgPSBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKHBvc2l0aW9uQ29sdW1uKVxuICBjb25zdCBwcmVzZXJ2ZWRDaGFuZ2VzID0gey4uLnJlY29yZC5fY2hhbmdlc31cbiAgY29uc3Qgc2NvcGVDb2x1bW5TcWwgPSBjb25uZWN0aW9uLnF1b3RlQ29sdW1uKHNjb3BlQ29sKVxuICBjb25zdCBwb3NpdGlvbkNvbHVtblNxbCA9IGNvbm5lY3Rpb24ucXVvdGVDb2x1bW4ocG9zQ29sKVxuICBjb25zdCBwcmltYXJ5S2V5U3FsID0gY29ubmVjdGlvbi5xdW90ZUNvbHVtbihtb2RlbENsYXNzLnByaW1hcnlLZXkoKSlcblxuICBkZWxldGUgcHJlc2VydmVkQ2hhbmdlc1tzY29wZUNvbF1cbiAgZGVsZXRlIHByZXNlcnZlZENoYW5nZXNbcG9zQ29sXVxuXG4gIGF3YWl0IGNvbm5lY3Rpb24ucXVlcnkoXG4gICAgYFVQREFURSAke3RhYmxlU3FsfSBTRVQgJHtzY29wZUNvbHVtblNxbH0gPSAke2Nvbm5lY3Rpb24ucXVvdGUoc2NvcGVWYWx1ZSl9LCAke3Bvc2l0aW9uQ29sdW1uU3FsfSA9ICR7Y29ubmVjdGlvbi5xdW90ZShwb3NpdGlvbil9IFdIRVJFICR7cHJpbWFyeUtleVNxbH0gPSAke2Nvbm5lY3Rpb24ucXVvdGUocmVjb3JkLmlkKCkpfWBcbiAgKVxuICBhd2FpdCByZWNvcmQuX3JlbG9hZFdpdGhJZChyZWNvcmQuaWQoKSlcbiAgcmVjb3JkLl9jaGFuZ2VzID0gcHJlc2VydmVkQ2hhbmdlc1xuICBjbGVhckJlbG9uZ3NUb0NoYW5nZUZvclNjb3BlKHJlY29yZClcbn1cblxuLyoqXG4gKiBDbGVhcnMgZGlydHkgYmVsb25ncy10byBzdGF0ZSBmb3IgdGhlIHNjb3BlIEZLIGFmdGVyIGRpcmVjdCBwbGFjZW1lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gcmVjb3JkIC0gTW9kZWwgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7dm9pZH0gTm90aGluZy5cbiAqL1xuZnVuY3Rpb24gY2xlYXJCZWxvbmdzVG9DaGFuZ2VGb3JTY29wZShyZWNvcmQpIHtcbiAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIGluIHJlY29yZC5faW5zdGFuY2VSZWxhdGlvbnNoaXBzIHx8IHt9KSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwID0gcmVjb3JkLl9pbnN0YW5jZVJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgIGlmIChyZWxhdGlvbnNoaXAuZ2V0VHlwZSgpICE9PSBcImJlbG9uZ3NUb1wiKSBjb250aW51ZVxuXG4gICAgcmVsYXRpb25zaGlwLnNldERpcnR5KGZhbHNlKVxuICB9XG59XG5cbi8qKlxuICogQnVtcHMgcG9zaXRpb25zIFVQIGJ5IDEgaW4gdGhlIHJhbmdlIFtmcm9tUG9zaXRpb24sIHRvUG9zaXRpb24pIHdpdGhpbiB0aGVcbiAqIHNhbWUgc2NvcGUuIFVwZGF0ZXMgaW4gZGVzY2VuZGluZyBvcmRlciB0byBhdm9pZCBpbnRlcm1lZGlhdGUgVU5JUVVFXG4gKiBjb25zdHJhaW50IHZpb2xhdGlvbnMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlY29yZCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB3aG9zZSBzY29wZSBpcyB0aGUgc291cmNlIG9mIHRydXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucG9zaXRpb25Db2x1bW4gLSBjYW1lbENhc2UgcG9zaXRpb24gYXR0cmlidXRlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zY29wZSAtIGNhbWVsQ2FzZSBzY29wZSBhdHRyaWJ1dGUgbmFtZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmZyb21Qb3NpdGlvbiAtIFN0YXJ0aW5nIHBvc2l0aW9uIChpbmNsdXNpdmUpLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnRvUG9zaXRpb25dIC0gRW5kaW5nIHBvc2l0aW9uIChleGNsdXNpdmUpLlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IFthcmdzLnNjb3BlVmFsdWVdIC0gRXhwbGljaXQgc2NvcGUgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gW2FyZ3MuZXhjbHVkZVJlY29yZElkXSAtIFJlY29yZCBpZCB0byBleGNsdWRlIGZyb20gc2hpZnRzLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNoaWZ0UG9zaXRpb25zVXAoe3JlY29yZCwgcG9zaXRpb25Db2x1bW4sIHNjb3BlLCBmcm9tUG9zaXRpb24sIHRvUG9zaXRpb24sIHNjb3BlVmFsdWUsIGV4Y2x1ZGVSZWNvcmRJZH0pIHtcbiAgY29uc3QgbW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gKi8gKHJlY29yZC5jb25zdHJ1Y3RvcilcbiAgY29uc3QgY29ubmVjdGlvbiA9IHJlY29yZC5jb25uZWN0aW9uKClcbiAgY29uc3QgdGFibGVOYW1lID0gbW9kZWxDbGFzcy5fZ2V0VGFibGUoKS5nZXROYW1lKClcbiAgY29uc3QgcmVzb2x2ZWRTY29wZVZhbHVlID0gc2NvcGVWYWx1ZSAhPSBudWxsID8gc2NvcGVWYWx1ZSA6IHJlc29sdmVTY29wZVZhbHVlKHJlY29yZCwgc2NvcGUpXG4gIGNvbnN0IHNjb3BlQ29sdW1uTmFtZSA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZUZvckF0dHJpYnV0ZU5hbWUoc2NvcGUpXG5cbiAgaWYgKHJlc29sdmVkU2NvcGVWYWx1ZSA9PSBudWxsKSByZXR1cm5cblxuICBjb25zdCBwb3NpdGlvbkNvbHVtbk5hbWUgPSBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKHBvc2l0aW9uQ29sdW1uKVxuICBjb25zdCBwb3NpdGlvbkNvbHVtblNxbCA9IGNvbm5lY3Rpb24ucXVvdGVDb2x1bW4ocG9zaXRpb25Db2x1bW5OYW1lKVxuICBjb25zdCBzY29wZUNvbHVtblNxbCA9IGNvbm5lY3Rpb24ucXVvdGVDb2x1bW4oc2NvcGVDb2x1bW5OYW1lKVxuICBjb25zdCBwcmltYXJ5S2V5U3FsID0gY29ubmVjdGlvbi5xdW90ZUNvbHVtbihtb2RlbENsYXNzLnByaW1hcnlLZXkoKSlcbiAgY29uc3QgdGFibGVTcWwgPSBjb25uZWN0aW9uLnF1b3RlVGFibGUodGFibGVOYW1lKVxuICBjb25zdCBxdW90ZWRTY29wZSA9IGNvbm5lY3Rpb24ucXVvdGUocmVzb2x2ZWRTY29wZVZhbHVlKVxuXG4gIC8vIExvYWQgcm93cyBpbiBkZXNjZW5kaW5nIG9yZGVyIHNvIHdlIGJ1bXAgdGhlIGhpZ2hlc3QgZmlyc3RcbiAgbGV0IHF1ZXJ5ID0gcmVjb3JkXG4gICAgLnF1ZXJ5Rm9yTW9kZWwobW9kZWxDbGFzcylcbiAgICAuc2VsZWN0KG1vZGVsQ2xhc3MucHJpbWFyeUtleSgpKVxuICAgIC5zZWxlY3QocG9zaXRpb25Db2x1bW4pXG4gICAgLndoZXJlKHtbc2NvcGVDb2x1bW5OYW1lXTogcmVzb2x2ZWRTY29wZVZhbHVlfSlcbiAgICAud2hlcmUoYCR7cG9zaXRpb25Db2x1bW5TcWx9ID49ICR7Y29ubmVjdGlvbi5xdW90ZShmcm9tUG9zaXRpb24pfWApXG4gICAgLndoZXJlKGAke3Bvc2l0aW9uQ29sdW1uU3FsfSA+IDBgKVxuICAgIC5vcmRlcihgJHtwb3NpdGlvbkNvbHVtblNxbH0gREVTQ2ApXG5cbiAgY29uc3QgcmVjb3JkSWRUb0V4Y2x1ZGUgPSBleGNsdWRlUmVjb3JkSWQgfHwgKHJlY29yZC5pc1BlcnNpc3RlZCgpID8gcmVjb3JkLmlkKCkgOiBudWxsKVxuXG4gIGlmIChyZWNvcmRJZFRvRXhjbHVkZSAhPSBudWxsKSB7XG4gICAgcXVlcnkgPSBxdWVyeS53aGVyZShgJHtwcmltYXJ5S2V5U3FsfSAhPSAke2Nvbm5lY3Rpb24ucXVvdGUocmVjb3JkSWRUb0V4Y2x1ZGUpfWApXG4gIH1cblxuICBpZiAodG9Qb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgcXVlcnkgPSBxdWVyeS53aGVyZShgJHtwb3NpdGlvbkNvbHVtblNxbH0gPCAke2Nvbm5lY3Rpb24ucXVvdGUodG9Qb3NpdGlvbil9YClcbiAgfVxuXG4gIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeS50b0FycmF5KClcblxuICBzZXRTaGlmdGluZ0ZsYWcocmVjb3JkLCB0cnVlKVxuXG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgY3VycmVudFBvcyA9IE51bWJlcihyb3cucmVhZEF0dHJpYnV0ZShwb3NpdGlvbkNvbHVtbikpXG5cbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24ucXVlcnkoXG4gICAgICAgIGBVUERBVEUgJHt0YWJsZVNxbH0gU0VUICR7cG9zaXRpb25Db2x1bW5TcWx9ID0gJHtwb3NpdGlvbkNvbHVtblNxbH0gKyAxIFdIRVJFICR7cHJpbWFyeUtleVNxbH0gPSAke2Nvbm5lY3Rpb24ucXVvdGUocm93LmlkKCkpfSBBTkQgJHtzY29wZUNvbHVtblNxbH0gPSAke3F1b3RlZFNjb3BlfSBBTkQgJHtwb3NpdGlvbkNvbHVtblNxbH0gPSAke2Nvbm5lY3Rpb24ucXVvdGUoY3VycmVudFBvcyl9YFxuICAgICAgKVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRTaGlmdGluZ0ZsYWcocmVjb3JkLCBmYWxzZSlcbiAgfVxufVxuXG4vKipcbiAqIEJ1bXBzIHBvc2l0aW9ucyBET1dOIGJ5IDEgaW4gdGhlIHJhbmdlIFtmcm9tUG9zaXRpb24sIHRvUG9zaXRpb24pIHdpdGhpblxuICogdGhlIHNhbWUgc2NvcGUuIFVwZGF0ZXMgaW4gYXNjZW5kaW5nIG9yZGVyIHRvIGF2b2lkIGludGVybWVkaWF0ZSBVTklRVUVcbiAqIGNvbnN0cmFpbnQgdmlvbGF0aW9ucy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVjb3JkIC0gVGhlIG1vZGVsIGluc3RhbmNlIHdob3NlIHNjb3BlIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGguXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wb3NpdGlvbkNvbHVtbiAtIGNhbWVsQ2FzZSBwb3NpdGlvbiBhdHRyaWJ1dGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNjb3BlIC0gY2FtZWxDYXNlIHNjb3BlIGF0dHJpYnV0ZSBuYW1lLlxuICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuZnJvbVBvc2l0aW9uIC0gU3RhcnRpbmcgcG9zaXRpb24gKGluY2x1c2l2ZSkuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MudG9Qb3NpdGlvbl0gLSBFbmRpbmcgcG9zaXRpb24gKGV4Y2x1c2l2ZSkuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gW2FyZ3Muc2NvcGVWYWx1ZV0gLSBFeHBsaWNpdCBzY29wZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBzaGlmdFBvc2l0aW9uc0Rvd24oe3JlY29yZCwgcG9zaXRpb25Db2x1bW4sIHNjb3BlLCBmcm9tUG9zaXRpb24sIHRvUG9zaXRpb24sIHNjb3BlVmFsdWV9KSB7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIChyZWNvcmQuY29uc3RydWN0b3IpXG4gIGNvbnN0IGNvbm5lY3Rpb24gPSByZWNvcmQuY29ubmVjdGlvbigpXG4gIGNvbnN0IHRhYmxlTmFtZSA9IG1vZGVsQ2xhc3MuX2dldFRhYmxlKCkuZ2V0TmFtZSgpXG4gIGNvbnN0IHJlc29sdmVkU2NvcGVWYWx1ZSA9IHNjb3BlVmFsdWUgIT0gbnVsbCA/IHNjb3BlVmFsdWUgOiByZXNvbHZlU2NvcGVWYWx1ZShyZWNvcmQsIHNjb3BlKVxuICBjb25zdCBzY29wZUNvbHVtbk5hbWUgPSBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKHNjb3BlKVxuXG4gIGlmIChyZXNvbHZlZFNjb3BlVmFsdWUgPT0gbnVsbCkgcmV0dXJuXG5cbiAgY29uc3QgcG9zaXRpb25Db2x1bW5OYW1lID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lRm9yQXR0cmlidXRlTmFtZShwb3NpdGlvbkNvbHVtbilcbiAgY29uc3QgcG9zaXRpb25Db2x1bW5TcWwgPSBjb25uZWN0aW9uLnF1b3RlQ29sdW1uKHBvc2l0aW9uQ29sdW1uTmFtZSlcbiAgY29uc3Qgc2NvcGVDb2x1bW5TcWwgPSBjb25uZWN0aW9uLnF1b3RlQ29sdW1uKHNjb3BlQ29sdW1uTmFtZSlcbiAgY29uc3QgcHJpbWFyeUtleVNxbCA9IGNvbm5lY3Rpb24ucXVvdGVDb2x1bW4obW9kZWxDbGFzcy5wcmltYXJ5S2V5KCkpXG4gIGNvbnN0IHRhYmxlU3FsID0gY29ubmVjdGlvbi5xdW90ZVRhYmxlKHRhYmxlTmFtZSlcbiAgY29uc3QgcXVvdGVkU2NvcGUgPSBjb25uZWN0aW9uLnF1b3RlKHJlc29sdmVkU2NvcGVWYWx1ZSlcblxuICAvLyBMb2FkIHJvd3MgaW4gYXNjZW5kaW5nIG9yZGVyIHNvIHdlIHNoaWZ0IHRoZSBsb3dlc3QgZ2FwIGZpcnN0XG4gIGxldCBxdWVyeSA9IHJlY29yZFxuICAgIC5xdWVyeUZvck1vZGVsKG1vZGVsQ2xhc3MpXG4gICAgLnNlbGVjdChtb2RlbENsYXNzLnByaW1hcnlLZXkoKSlcbiAgICAuc2VsZWN0KHBvc2l0aW9uQ29sdW1uKVxuICAgIC53aGVyZSh7W3Njb3BlQ29sdW1uTmFtZV06IHJlc29sdmVkU2NvcGVWYWx1ZX0pXG4gICAgLndoZXJlKGAke3Bvc2l0aW9uQ29sdW1uU3FsfSA+PSAke2Nvbm5lY3Rpb24ucXVvdGUoZnJvbVBvc2l0aW9uKX1gKVxuICAgIC53aGVyZShgJHtwb3NpdGlvbkNvbHVtblNxbH0gPiAwYClcbiAgICAud2hlcmUoYCR7cHJpbWFyeUtleVNxbH0gIT0gJHtjb25uZWN0aW9uLnF1b3RlKHJlY29yZC5pZCgpKX1gKVxuICAgIC5vcmRlcih7Y29sdW1uOiBwb3NpdGlvbkNvbHVtbk5hbWUsIGRpcmVjdGlvbjogXCJBU0NcIn0pXG5cbiAgaWYgKHRvUG9zaXRpb24gIT0gbnVsbCkge1xuICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoYCR7cG9zaXRpb25Db2x1bW5TcWx9IDwgJHtjb25uZWN0aW9uLnF1b3RlKHRvUG9zaXRpb24pfWApXG4gIH1cblxuICBjb25zdCByb3dzID0gYXdhaXQgcXVlcnkudG9BcnJheSgpXG5cbiAgc2V0U2hpZnRpbmdGbGFnKHJlY29yZCwgdHJ1ZSlcblxuICB0cnkge1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRQb3MgPSBOdW1iZXIocm93LnJlYWRBdHRyaWJ1dGUocG9zaXRpb25Db2x1bW4pKVxuXG4gICAgICBhd2FpdCBjb25uZWN0aW9uLnF1ZXJ5KFxuICAgICAgICBgVVBEQVRFICR7dGFibGVTcWx9IFNFVCAke3Bvc2l0aW9uQ29sdW1uU3FsfSA9ICR7cG9zaXRpb25Db2x1bW5TcWx9IC0gMSBXSEVSRSAke3ByaW1hcnlLZXlTcWx9ID0gJHtjb25uZWN0aW9uLnF1b3RlKHJvdy5pZCgpKX0gQU5EICR7c2NvcGVDb2x1bW5TcWx9ID0gJHtxdW90ZWRTY29wZX0gQU5EICR7cG9zaXRpb25Db2x1bW5TcWx9ID0gJHtjb25uZWN0aW9uLnF1b3RlKGN1cnJlbnRQb3MpfWBcbiAgICAgIClcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgc2V0U2hpZnRpbmdGbGFnKHJlY29yZCwgZmFsc2UpXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBoaWdoZXN0IGN1cnJlbnQgcG9zaXRpb24gdmFsdWUgaW4gdGhlIHJlY29yZCdzIHNjb3BlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5yZWNvcmQgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugd2hvc2Ugc2NvcGUgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnBvc2l0aW9uQ29sdW1uIC0gY2FtZWxDYXNlIHBvc2l0aW9uIGF0dHJpYnV0ZSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc2NvcGUgLSBjYW1lbENhc2Ugc2NvcGUgYXR0cmlidXRlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gW2FyZ3Muc2NvcGVWYWx1ZV0gLSBFeHBsaWNpdCBzY29wZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IC0gSGlnaGVzdCBwb3NpdGlvbiBpbiBzY29wZSwgb3IgMCB3aGVuIHNjb3BlIGlzIGVtcHR5LlxuICovXG5hc3luYyBmdW5jdGlvbiBoaWdoZXN0UG9zaXRpb25JblNjb3BlKHtyZWNvcmQsIHBvc2l0aW9uQ29sdW1uLCBzY29wZSwgc2NvcGVWYWx1ZX0pIHtcbiAgY29uc3QgbW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gKi8gKHJlY29yZC5jb25zdHJ1Y3RvcilcbiAgY29uc3QgY29ubmVjdGlvbiA9IHJlY29yZC5jb25uZWN0aW9uKClcbiAgY29uc3Qgc2NvcGVDb2x1bW5OYW1lID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lRm9yQXR0cmlidXRlTmFtZShzY29wZSlcbiAgY29uc3QgcG9zaXRpb25Db2x1bW5OYW1lID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lRm9yQXR0cmlidXRlTmFtZShwb3NpdGlvbkNvbHVtbilcbiAgY29uc3QgcG9zaXRpb25Db2x1bW5TcWwgPSBjb25uZWN0aW9uLnF1b3RlQ29sdW1uKHBvc2l0aW9uQ29sdW1uTmFtZSlcbiAgY29uc3QgcmVzb2x2ZWRTY29wZVZhbHVlID0gc2NvcGVWYWx1ZSAhPSBudWxsID8gc2NvcGVWYWx1ZSA6IHJlc29sdmVTY29wZVZhbHVlKHJlY29yZCwgc2NvcGUpXG5cbiAgaWYgKHJlc29sdmVkU2NvcGVWYWx1ZSA9PSBudWxsKSByZXR1cm4gMFxuXG4gIGNvbnN0IHJvd3MgPSBhd2FpdCByZWNvcmRcbiAgICAucXVlcnlGb3JNb2RlbChtb2RlbENsYXNzKVxuICAgIC5zZWxlY3QocG9zaXRpb25Db2x1bW4pXG4gICAgLndoZXJlKHtbc2NvcGVDb2x1bW5OYW1lXTogcmVzb2x2ZWRTY29wZVZhbHVlfSlcbiAgICAub3JkZXIoYCR7cG9zaXRpb25Db2x1bW5TcWx9IERFU0NgKVxuICAgIC5saW1pdCgxKVxuICAgIC50b0FycmF5KClcblxuICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgcmV0dXJuIE51bWJlcihyb3dzWzBdLnJlYWRBdHRyaWJ1dGUocG9zaXRpb25Db2x1bW4pKSB8fCAwXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBzY29wZSB2YWx1ZSBmcm9tIHRoZSBhdHRyaWJ1dGUgc3RvcmUgZmlyc3QsIHRoZW4gZmFsbHMgYmFja1xuICogdG8gdGhlIGxvYWRlZCBiZWxvbmdzVG8gcmVsYXRpb25zaGlwLiBUaGlzIGlzIG5lZWRlZCBkdXJpbmcgYmVmb3JlQ3JlYXRlXG4gKiBiZWNhdXNlIHRoZSBGSyBhdHRyaWJ1dGUgbWF5IG5vdCBiZSBzZXQgdW50aWwgX2NyZWF0ZU5ld1JlY29yZCBmbHVzaGVzXG4gKiBfYmVsb25nc1RvQ2hhbmdlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSByZWNvcmQgLSBNb2RlbCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzY29wZSAtIGNhbWVsQ2FzZSBzY29wZSBhdHRyaWJ1dGUgbmFtZSAoZS5nLiBcInByb2plY3RJZFwiKS5cbiAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXIgfCBudWxsfSAtIEN1cnJlbnQgbGlzdCBwb3NpdGlvbiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVNjb3BlVmFsdWUocmVjb3JkLCBzY29wZSkge1xuICBjb25zdCBhdHRyVmFsdWUgPSByZWNvcmQucmVhZEF0dHJpYnV0ZShzY29wZSlcblxuICBpZiAoYXR0clZhbHVlICE9IG51bGwpIHJldHVybiAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKGF0dHJWYWx1ZSlcblxuICBjb25zdCBtb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAocmVjb3JkLmNvbnN0cnVjdG9yKVxuICBjb25zdCByZWxhdGlvbnNoaXBzID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBzTWFwKClcbiAgY29uc3Qgc2NvcGVDb2x1bW5OYW1lID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lRm9yQXR0cmlidXRlTmFtZShzY29wZSlcblxuICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgaW4gcmVsYXRpb25zaGlwcykge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgIGlmIChyZWxhdGlvbnNoaXAuZ2V0VHlwZT8uKCkgIT09IFwiYmVsb25nc1RvXCIpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBmb3JlaWduS2V5ID0gcmVsYXRpb25zaGlwLmdldEZvcmVpZ25LZXkoKVxuXG4gICAgaWYgKGZvcmVpZ25LZXkgIT09IHNjb3BlQ29sdW1uTmFtZSkgY29udGludWVcblxuICAgIGNvbnN0IGluc3RhbmNlUmVsYXRpb25zaGlwID0gcmVjb3JkLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKVxuICAgIGNvbnN0IGxvYWRlZCA9IGluc3RhbmNlUmVsYXRpb25zaGlwLmxvYWRlZCgpXG5cbiAgICBpZiAobG9hZGVkICYmICFBcnJheS5pc0FycmF5KGxvYWRlZCkgJiYgdHlwZW9mIGxvYWRlZC5pZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gbG9hZGVkLmlkKClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIE1vdmVzIHRoZSByZWNvcmQgdG8gYSB0ZW1wb3JhcnkgcG9zaXRpb24gb3V0c2lkZSB0aGUgbm9ybWFsIHJhbmdlIHNvXG4gKiB0aGF0IHN1cnJvdW5kaW5nIHBvc2l0aW9uIHNoaWZ0cyBkbyBub3QgaGl0IHVuaXF1ZSBjb25zdHJhaW50IHZpb2xhdGlvbnMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlY29yZCAtIE1vZGVsIGluc3RhbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucG9zaXRpb25Db2x1bW4gLSBjYW1lbENhc2UgcG9zaXRpb24gYXR0cmlidXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc2NvcGUgLSBjYW1lbENhc2Ugc2NvcGUgYXR0cmlidXRlLlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBudWxsfSBbYXJncy5zY29wZVZhbHVlXSAtIFNjb3BlIGNvbnRhaW5pbmcgdGhlIHJlY29yZCBiZWZvcmUgbW92ZS1vdXQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbW92ZU91dE9mV2F5KHtyZWNvcmQsIHBvc2l0aW9uQ29sdW1uLCBzY29wZSwgc2NvcGVWYWx1ZX0pIHtcbiAgY29uc3QgbW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gKi8gKHJlY29yZC5jb25zdHJ1Y3RvcilcbiAgY29uc3QgY29ubmVjdGlvbiA9IHJlY29yZC5jb25uZWN0aW9uKClcbiAgY29uc3QgdGFibGVOYW1lID0gbW9kZWxDbGFzcy5fZ2V0VGFibGUoKS5nZXROYW1lKClcbiAgY29uc3QgcmVzb2x2ZWRTY29wZVZhbHVlID0gc2NvcGVWYWx1ZSAhPSBudWxsID8gc2NvcGVWYWx1ZSA6IHJlc29sdmVTY29wZVZhbHVlKHJlY29yZCwgc2NvcGUpXG5cbiAgaWYgKHJlc29sdmVkU2NvcGVWYWx1ZSA9PSBudWxsKSByZXR1cm5cblxuICBjb25zdCBwb3NpdGlvbkNvbHVtblNxbCA9IGNvbm5lY3Rpb24ucXVvdGVDb2x1bW4obW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lRm9yQXR0cmlidXRlTmFtZShwb3NpdGlvbkNvbHVtbikpXG4gIGNvbnN0IHNjb3BlQ29sdW1uU3FsID0gY29ubmVjdGlvbi5xdW90ZUNvbHVtbihtb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKHNjb3BlKSlcbiAgY29uc3QgdGFibGVTcWwgPSBjb25uZWN0aW9uLnF1b3RlVGFibGUodGFibGVOYW1lKVxuICBjb25zdCBwa1NxbCA9IGNvbm5lY3Rpb24ucXVvdGVDb2x1bW4obW9kZWxDbGFzcy5wcmltYXJ5S2V5KCkpXG5cbiAgc2V0U2hpZnRpbmdGbGFnKHJlY29yZCwgdHJ1ZSlcblxuICB0cnkge1xuICAgIGF3YWl0IGNvbm5lY3Rpb24ucXVlcnkoXG4gICAgICBgVVBEQVRFICR7dGFibGVTcWx9IFNFVCAke3Bvc2l0aW9uQ29sdW1uU3FsfSA9IC0ke3Bvc2l0aW9uQ29sdW1uU3FsfSBXSEVSRSAke3Njb3BlQ29sdW1uU3FsfSA9ICR7Y29ubmVjdGlvbi5xdW90ZShyZXNvbHZlZFNjb3BlVmFsdWUpfSBBTkQgJHtwa1NxbH0gPSAke2Nvbm5lY3Rpb24ucXVvdGUocmVjb3JkLmlkKCkpfWBcbiAgICApXG4gIH0gZmluYWxseSB7XG4gICAgLy8gRG9uJ3QgY2xlYXIgdGhlIGZsYWcgaGVyZSDigJQgdGhlIGNhbGxlciB3aWxsIGRvIHRoYXQgYWZ0ZXIgc2hpZnRzXG4gIH1cbn1cbiJdfQ==
|
|
403
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0cy1hcy1saXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3JlY29yZC9hY3RzLWFzLWxpc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxxQkFBcUIsRUFBRSwwQkFBMEIsRUFBQyxNQUFNLGtDQUFrQyxDQUFBO0FBRWxHLDJFQUEyRTtBQUUzRTs7O0dBR0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0FBRTFEOzs7O0dBSUc7QUFDSCxTQUFTLG9CQUFvQixDQUFDLFVBQVU7SUFDdEMsT0FBTyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEVBQUUsa0JBQWtCLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQzVGLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxNQUFNO0lBQ2hDLE9BQU8sMEJBQTBCLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLGtCQUFrQixNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtBQUNqRyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLE1BQU0sRUFBRSxLQUFLO0lBQ3BDLG1EQUFtRDtJQUNuRCxNQUFNLENBQUMscUJBQXFCLENBQUMsR0FBRyxLQUFLLENBQUE7QUFDdkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxNQUFNO0lBQ3hCLG1EQUFtRDtJQUNuRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFBO0FBQy9DLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sQ0FBQyxPQUFPLFVBQVUsMkJBQTJCLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxFQUFDLEtBQUssRUFBQztJQUNyRixV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V0FBVyxDQUFDLFVBQVUsQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQzlGLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDakQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO0lBRXRFLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFFN0IsSUFBSSxDQUFDO1FBQ0gsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUNwQixVQUFVLFFBQVEsUUFBUSxpQkFBaUIsT0FBTyxpQkFBaUIsVUFBVSxjQUFjLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEtBQUssTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FDdk0sQ0FBQTtJQUNILENBQUM7WUFBUyxDQUFDO1FBQ1QsbUVBQW1FO0lBQ3JFLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7c2NhbGFyTW9kZWxQcmltYXJ5S2V5LCBzY2FsYXJNb2RlbFByaW1hcnlLZXlWYWx1ZX0gZnJvbSBcIi4uLy4uL3V0aWxzL21vZGVsLXByaW1hcnkta2V5LmpzXCJcblxuLyoqIEBmaWxlIFJlZ2lzdGVycyBnYXAtbGVzcyBwb3NpdGlvbmFsIGxpc3QgY2FsbGJhY2tzIG9uIGEgbW9kZWwgY2xhc3MuICovXG5cbi8qKlxuICogQWN0cyBhcyBsaXN0IHNoaWZ0aW5nLlxuICogQHR5cGUge3N5bWJvbH0gLSBHdWFyZCBmbGFnIHNldCBvbiB0aGUgbW9kZWwgaW5zdGFuY2UgZHVyaW5nIHNoaWZ0IG9wZXJhdGlvbnMgdG8gcHJldmVudCByZS1lbnRyYW50IGxpZmVjeWNsZSBob29rcy5cbiAqL1xuY29uc3QgQUNUU19BU19MSVNUX1NISUZUSU5HID0gU3ltYm9sKFwiYWN0c0FzTGlzdFNoaWZ0aW5nXCIpXG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2NhbGFyIHByaW1hcnkta2V5IGNvbHVtbiByZXF1aXJlZCBieSBhY3RzLWFzLWxpc3QgU1FMLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbENsYXNzIC0gTGlzdCBtb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2NhbGFyIHByaW1hcnkta2V5IGNvbHVtbi5cbiAqL1xuZnVuY3Rpb24gYWN0c0FzTGlzdFByaW1hcnlLZXkobW9kZWxDbGFzcykge1xuICByZXR1cm4gc2NhbGFyTW9kZWxQcmltYXJ5S2V5KG1vZGVsQ2xhc3MucHJpbWFyeUtleSgpLCBgYWN0c0FzTGlzdCBmb3IgJHttb2RlbENsYXNzLm5hbWV9YClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzY2FsYXIgcmVjb3JkIGlkIHJlcXVpcmVkIGJ5IGFjdHMtYXMtbGlzdCBTUUwuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gcmVjb3JkIC0gTGlzdCByZWNvcmQuXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVtYmVyfSAtIFNjYWxhciByZWNvcmQgaWQuXG4gKi9cbmZ1bmN0aW9uIGFjdHNBc0xpc3RSZWNvcmRJZChyZWNvcmQpIHtcbiAgcmV0dXJuIHNjYWxhck1vZGVsUHJpbWFyeUtleVZhbHVlKHJlY29yZC5pZCgpLCBgYWN0c0FzTGlzdCBmb3IgJHtyZWNvcmQuZ2V0TW9kZWxDbGFzcygpLm5hbWV9YClcbn1cblxuLyoqXG4gKiBSdW5zIHNldCBzaGlmdGluZyBmbGFnLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IHJlY29yZCAtIE1vZGVsIGluc3RhbmNlLlxuICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAtIEZsYWcgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHNldFNoaWZ0aW5nRmxhZyhyZWNvcmQsIHZhbHVlKSB7XG4gIC8vIEB0cy1pZ25vcmUgLSBTeW1ib2wgaW5kZXhpbmcgb24gUmVjb3JkIGluc3RhbmNlc1xuICByZWNvcmRbQUNUU19BU19MSVNUX1NISUZUSU5HXSA9IHZhbHVlXG59XG5cbi8qKlxuICogUnVucyBpcyBzaGlmdGluZy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSByZWNvcmQgLSBNb2RlbCBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgbGlzdCBwb3NpdGlvbnMgYXJlIGN1cnJlbnRseSBzaGlmdGluZy5cbiAqL1xuZnVuY3Rpb24gaXNTaGlmdGluZyhyZWNvcmQpIHtcbiAgLy8gQHRzLWlnbm9yZSAtIFN5bWJvbCBpbmRleGluZyBvbiBSZWNvcmQgaW5zdGFuY2VzXG4gIHJldHVybiBCb29sZWFuKHJlY29yZFtBQ1RTX0FTX0xJU1RfU0hJRlRJTkddKVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBnYXAtbGVzcyBwb3NpdGlvbmFsIGxpc3QgY2FsbGJhY2tzIG9uIGEgbW9kZWwgY2xhc3MgdG8gbWFpbnRhaW5cbiAqIGEgZ2FwLWxlc3MgcG9zaXRpb25hbCBsaXN0LiBXaGVuIGEgcmVjb3JkIGlzIGluc2VydGVkLCB1cGRhdGVkLCBvclxuICogZGVzdHJveWVkLCB0aGUgc3Vycm91bmRpbmcgcG9zaXRpb25zIGFyZSBzaGlmdGVkIHNvIHRoZSBsaXN0IHN0YXlzIGNvbXBhY3RcbiAqICgxLDIsMywuLi4pIGFuZCBzY29wZWQgd2l0aGluIHRoZSBnaXZlbiBjb2x1bW4uXG4gKlxuICogQ2FsbGVycyBtdXN0IGFsc28gZW5zdXJlIGEgVU5JUVVFIGluZGV4IG9uIChzY29wZUNvbHVtbiwgcG9zaXRpb25Db2x1bW4pXG4gKiBleGlzdHMgaW4gdGhlIGRhdGFiYXNlIHNjaGVtYSDigJQgdXNlIGBNaWdyYXRpb24uYWRkQWN0c0FzTGlzdCgpYCBmb3IgdGhlXG4gKiBjb3JyZXNwb25kaW5nIHNjaGVtYSBzZXR1cC5cbiAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIFRoZSBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwb3NpdGlvbkNvbHVtbiAtIGNhbWVsQ2FzZSBuYW1lIG9mIHRoZSBwb3NpdGlvbiBhdHRyaWJ1dGUgKGUuZy4gXCJyb3dOdW1iZXJcIikuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5zY29wZSAtIGNhbWVsQ2FzZSBuYW1lIG9mIHRoZSBzY29wZSBhdHRyaWJ1dGUgKGUuZy4gXCJib2FyZENvbHVtbklkXCIpLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyQWN0c0FzTGlzdENhbGxiYWNrcyhtb2RlbENsYXNzLCBwb3NpdGlvbkNvbHVtbiwge3Njb3BlfSkge1xuICBtb2RlbENsYXNzLmJlZm9yZUNyZWF0ZShhc3luYyAocmVjb3JkKSA9PiB7XG4gICAgaWYgKGlzU2hpZnRpbmcocmVjb3JkKSkgcmV0dXJuXG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHJlY29yZC5yZWFkQXR0cmlidXRlKHBvc2l0aW9uQ29sdW1uKVxuXG4gICAgaWYgKHBvc2l0aW9uICE9IG51bGwpIHtcbiAgICAgIGFzc2VydFBvc2l0aXZlUG9zaXRpb24oe3Bvc2l0aW9uLCBwb3NpdGlvbkNvbHVtbn0pXG4gICAgICBhd2FpdCBzaGlmdFBvc2l0aW9uc1VwKHtyZWNvcmQsIHBvc2l0aW9uQ29sdW1uLCBzY29wZSwgZnJvbVBvc2l0aW9uOiBwb3NpdGlvbn0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5leHRQb3NpdGlvbiA9IGF3YWl0IGhpZ2hlc3RQb3NpdGlvbkluU2NvcGUoe3JlY29yZCwgcG9zaXRpb25Db2x1bW4sIHNjb3BlfSlcblxuICAgICAgcmVjb3JkLnNldEF0dHJpYnV0ZShwb3NpdGlvbkNvbHVtbiwgbmV4dFBvc2l0aW9uICsgMSlcbiAgICB9XG4gIH0pXG5cbiAgbW9kZWxDbGFzcy5iZWZvcmVVcGRhdGUoYXN5bmMgKHJlY29yZCkgPT4ge1xuICAgIGlmIChpc1NoaWZ0aW5nKHJlY29yZCkpIHJldHVyblxuICAgIGlmICghcmVjb3JkLmlzUGVyc2lzdGVkKCkpIHJldHVyblxuXG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gKi8gKHJlY29yZC5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCBwb3NDb2x1bW4gPSBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKHBvc2l0aW9uQ29sdW1uKVxuICAgIGNvbnN0IHNjb3BlQ29sID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lRm9yQXR0cmlidXRlTmFtZShzY29wZSlcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi9cbiAgICBjb25zdCByYXdBdHRyaWJ1dGVzID0gcmVjb3JkLl9hdHRyaWJ1dGVzIHx8IHt9XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gICAgY29uc3QgY2hhbmdlcyA9IHJlY29yZC5fY2hhbmdlcyB8fCB7fVxuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3QgYXNzaWduZWRBdHRyaWJ1dGVOYW1lcyA9IHJlY29yZC5fYXNzaWduZWRBdHRyaWJ1dGVOYW1lcyB8fCBuZXcgU2V0KClcbiAgICBjb25zdCBwb3NDaGFuZ2VkID0gcG9zQ29sdW1uIGluIGNoYW5nZXNcbiAgICBjb25zdCBzY29wZUNoYW5nZWQgPSBzY29wZUNvbCBpbiBjaGFuZ2VzXG4gICAgY29uc3QgcG9zQXNzaWduZWQgPSBhc3NpZ25lZEF0dHJpYnV0ZU5hbWVzLmhhcyhwb3NpdGlvbkNvbHVtbilcblxuICAgIGlmICghcG9zQ2hhbmdlZCAmJiAhc2NvcGVDaGFuZ2VkKSByZXR1cm5cblxuICAgIGFzc2VydFBvc2l0aXZlUG9zaXRpb24oe1xuICAgICAgcG9zaXRpb246IHJhd0F0dHJpYnV0ZXNbcG9zQ29sdW1uXSxcbiAgICAgIHBvc2l0aW9uQ29sdW1uLFxuICAgICAgcGVyc2lzdGVkOiB0cnVlXG4gICAgfSlcblxuICAgIGNvbnN0IG9sZFBvc2l0aW9uID0gcG9zQ2hhbmdlZCA/IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmF3QXR0cmlidXRlc1twb3NDb2x1bW5dKSA6IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVjb3JkLnJlYWRBdHRyaWJ1dGUocG9zaXRpb25Db2x1bW4pKVxuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gcG9zQ2hhbmdlZCA/IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY2hhbmdlc1twb3NDb2x1bW5dKSA6IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVjb3JkLnJlYWRBdHRyaWJ1dGUocG9zaXRpb25Db2x1bW4pKVxuICAgIGNvbnN0IG9sZFNjb3BlVmFsdWUgPSBzY29wZUNoYW5nZWQgPyAvKiogQHR5cGUge251bWJlcn0gKi8gKHJhd0F0dHJpYnV0ZXNbc2NvcGVDb2xdKSA6IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVjb3JkLnJlYWRBdHRyaWJ1dGUoc2NvcGUpKVxuICAgIGNvbnN0IG5ld1Njb3BlVmFsdWUgPSBzY29wZUNoYW5nZWQgPyAvKiogQHR5cGUge251bWJlcn0gKi8gKGNoYW5nZXNbc2NvcGVDb2xdKSA6IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVjb3JkLnJlYWRBdHRyaWJ1dGUoc2NvcGUpKVxuXG4gICAgYXNzZXJ0UG9zaXRpdmVQb3NpdGlvbih7cG9zaXRpb246IG5ld1Bvc2l0aW9uLCBwb3NpdGlvbkNvbHVtbn0pXG4gICAgaWYgKG9sZFBvc2l0aW9uID09IG51bGwpIHJldHVyblxuICAgIGlmIChuZXdQb3NpdGlvbiA9PT0gb2xkUG9zaXRpb24gJiYgbmV3U2NvcGVWYWx1ZSA9PT0gb2xkU2NvcGVWYWx1ZSkgcmV0dXJuXG5cbiAgICBpZiAoc2NvcGVDaGFuZ2VkICYmIG9sZFNjb3BlVmFsdWUgIT09IG5ld1Njb3BlVmFsdWUpIHtcbiAgICAgIC8vIFdoZW4gb25seSB0aGUgc2NvcGUgY2hhbmdlcyB3aXRob3V0IGEgbmV3IHBvc2l0aW9uLCBhcHBlbmQgdG8gdGhlIGVuZFxuICAgICAgLy8gb2YgdGhlIG5ldyBzY29wZS4gVGhlcmUgaXMgbm8gdGFyZ2V0LXNjb3BlIHJvdyB0byBzaGlmdCBvdXQgb2YgdGhlIHdheS5cbiAgICAgIGlmICghcG9zQXNzaWduZWQpIHtcbiAgICAgICAgYXdhaXQgbW92ZU91dE9mV2F5KHtyZWNvcmQsIHBvc2l0aW9uQ29sdW1uLCBzY29wZSwgc2NvcGVWYWx1ZTogb2xkU2NvcGVWYWx1ZX0pXG4gICAgICAgIHNldFNoaWZ0aW5nRmxhZyhyZWNvcmQsIGZhbHNlKVxuXG4gICAgICAgIGNvbnN0IGhpZ2hlc3ROZXcgPSBhd2FpdCBoaWdoZXN0UG9zaXRpb25JblNjb3BlKHtyZWNvcmQsIHBvc2l0aW9uQ29sdW1uLCBzY29wZSwgc2NvcGVWYWx1ZTogbmV3U2NvcGVWYWx1ZX0pXG4gICAgICAgIGNvbnN0IG5leHRQb3MgPSBoaWdoZXN0TmV3ICsgMVxuXG4gICAgICAgIHJlY29yZC5zZXRBdHRyaWJ1dGUocG9zaXRpb25Db2x1bW4sIG5leHRQb3MpXG4gICAgICAgIGF3YWl0IHNoaWZ0UG9zaXRpb25zRG93bih7cmVjb3JkLCBwb3NpdGlvbkNvbHVtbiwgc2NvcGUsIHNjb3BlVmFsdWU6IG9sZFNjb3BlVmFsdWUsIGZyb21Qb3NpdGlvbjogb2xkUG9zaXRpb24gKyAxfSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG1vdmVPdXRPZldheSh7cmVjb3JkLCBwb3NpdGlvbkNvbHVtbiwgc2NvcGUsIHNjb3BlVmFsdWU6IG9sZFNjb3BlVmFsdWV9KVxuICAgICAgc2V0U2hpZnRpbmdGbGFnKHJlY29yZCwgZmFsc2UpXG4gICAgICBhd2FpdCBzaGlmdFBvc2l0aW9uc0Rvd24oe3JlY29yZCwgcG9zaXRpb25Db2x1bW4sIHNjb3BlLCBzY29wZVZhbHVlOiBvbGRTY29wZVZhbHVlLCBmcm9tUG9zaXRpb246IG9sZFBvc2l0aW9uICsgMX0pXG4gICAgICBhd2FpdCBzaGlmdFBvc2l0aW9uc1VwKHtyZWNvcmQsIHBvc2l0aW9uQ29sdW1uLCBzY29wZSwgc2NvcGVWYWx1ZTogbmV3U2NvcGVWYWx1ZSwgZnJvbVBvc2l0aW9uOiBuZXdQb3NpdGlvbiwgZXhjbHVkZVJlY29yZElkOiBhY3RzQXNMaXN0UmVjb3JkSWQocmVjb3JkKX0pXG4gICAgICBhd2FpdCBwbGFjZU1vdmVkUmVjb3JkKHtyZWNvcmQsIHBvc2l0aW9uQ29sdW1uLCBzY29wZSwgc2NvcGVWYWx1ZTogbmV3U2NvcGVWYWx1ZSwgcG9zaXRpb246IG5ld1Bvc2l0aW9ufSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IG1vdmVPdXRPZldheSh7cmVjb3JkLCBwb3NpdGlvbkNvbHVtbiwgc2NvcGUsIHNjb3BlVmFsdWU6IG9sZFNjb3BlVmFsdWV9KVxuICAgIHNldFNoaWZ0aW5nRmxhZyhyZWNvcmQsIGZhbHNlKVxuXG4gICAgaWYgKG5ld1Bvc2l0aW9uIDwgb2xkUG9zaXRpb24pIHtcbiAgICAgIGF3YWl0IHNoaWZ0UG9zaXRpb25zVXAoe3JlY29yZCwgcG9zaXRpb25Db2x1bW4sIHNjb3BlLCBmcm9tUG9zaXRpb246IG5ld1Bvc2l0aW9uLCB0b1Bvc2l0aW9uOiBvbGRQb3NpdGlvbn0pXG4gICAgfSBlbHNlIGlmIChuZXdQb3NpdGlvbiA+IG9sZFBvc2l0aW9uKSB7XG4gICAgICBhd2FpdCBzaGlmdFBvc2l0aW9uc0Rvd24oe3JlY29yZCwgcG9zaXRpb25Db2x1bW4sIHNjb3BlLCBmcm9tUG9zaXRpb246IG9sZFBvc2l0aW9uICsgMSwgdG9Qb3NpdGlvbjogbmV3UG9zaXRpb24gKyAxfSlcbiAgICB9XG4gIH0pXG5cbiAgbW9kZWxDbGFzcy5iZWZvcmVEZXN0cm95KGFzeW5jIChyZWNvcmQpID0+IHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHJlY29yZC5yZWFkQXR0cmlidXRlKHBvc2l0aW9uQ29sdW1uKVxuXG4gICAgaWYgKHBvc2l0aW9uID09IG51bGwpIHtcbiAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIChyZWNvcmQuY29uc3RydWN0b3IpXG4gICAgICBjb25zdCBwb3NDb2x1bW4gPSBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKHBvc2l0aW9uQ29sdW1uKVxuXG4gICAgICBpZiAocG9zQ29sdW1uIGluIHJlY29yZC5fYXR0cmlidXRlcykgYXNzZXJ0UG9zaXRpdmVQb3NpdGlvbih7cG9zaXRpb24sIHBvc2l0aW9uQ29sdW1uLCBwZXJzaXN0ZWQ6IHRydWV9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGFzc2VydFBvc2l0aXZlUG9zaXRpb24oe3Bvc2l0aW9uLCBwb3NpdGlvbkNvbHVtbiwgcGVyc2lzdGVkOiB0cnVlfSlcblxuICAgIGF3YWl0IG1vdmVPdXRPZldheSh7cmVjb3JkLCBwb3NpdGlvbkNvbHVtbiwgc2NvcGV9KVxuICAgIHNldFNoaWZ0aW5nRmxhZyhyZWNvcmQsIGZhbHNlKVxuXG4gICAgYXdhaXQgc2hpZnRQb3NpdGlvbnNEb3duKHtyZWNvcmQsIHBvc2l0aW9uQ29sdW1uLCBzY29wZSwgZnJvbVBvc2l0aW9uOiBwb3NpdGlvbiArIDF9KVxuICB9KVxufVxuXG4vKipcbiAqIEVuZm9yY2VzIHRoZSBwdWJsaWMgZ2FwLWxlc3MgbGlzdCBwb3NpdGlvbiBpbnZhcmlhbnQgYmVmb3JlIGFueSBzaGlmdGluZy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLnBvc2l0aW9uIC0gUG9zaXRpb24gdG8gdmFsaWRhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wb3NpdGlvbkNvbHVtbiAtIFBvc2l0aW9uIGF0dHJpYnV0ZSBuYW1lLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5wZXJzaXN0ZWRdIC0gV2hldGhlciB0aGUgaW52YWxpZCB2YWx1ZSBjYW1lIGZyb20gcGVyc2lzdGVkIHN0YXRlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFzc2VydFBvc2l0aXZlUG9zaXRpb24oe3Bvc2l0aW9uLCBwb3NpdGlvbkNvbHVtbiwgcGVyc2lzdGVkID0gZmFsc2V9KSB7XG4gIGlmICh0eXBlb2YgcG9zaXRpb24gPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzSW50ZWdlcihwb3NpdGlvbikgJiYgcG9zaXRpb24gPiAwKSByZXR1cm5cblxuICBjb25zdCBzb3VyY2UgPSBwZXJzaXN0ZWQgPyBcIlBlcnNpc3RlZFwiIDogXCJSZXF1ZXN0ZWRcIlxuXG4gIHRocm93IG5ldyBFcnJvcihgJHtzb3VyY2V9IGFjdHNBc0xpc3QgJHtwb3NpdGlvbkNvbHVtbn0gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXJgKVxufVxuXG4vKipcbiAqIFBsYWNlcyBhIG1vdmVkIHJvdyBhZnRlciBzdXJyb3VuZGluZyByb3dzIGhhdmUgc2hpZnRlZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVjb3JkIC0gTW9kZWwgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wb3NpdGlvbkNvbHVtbiAtIFBvc2l0aW9uIGF0dHJpYnV0ZSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc2NvcGUgLSBTY29wZSBhdHRyaWJ1dGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhcmdzLnNjb3BlVmFsdWUgLSBEZXN0aW5hdGlvbiBzY29wZSB2YWx1ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLnBvc2l0aW9uIC0gRGVzdGluYXRpb24gcG9zaXRpb24uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgcGxhY2VtZW50LlxuICovXG5hc3luYyBmdW5jdGlvbiBwbGFjZU1vdmVkUmVjb3JkKHtyZWNvcmQsIHBvc2l0aW9uQ29sdW1uLCBzY29wZSwgc2NvcGVWYWx1ZSwgcG9zaXRpb259KSB7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIChyZWNvcmQuY29uc3RydWN0b3IpXG4gIGNvbnN0IGNvbm5lY3Rpb24gPSByZWNvcmQuY29ubmVjdGlvbigpXG4gIGNvbnN0IHRhYmxlU3FsID0gY29ubmVjdGlvbi5xdW90ZVRhYmxlKG1vZGVsQ2xhc3MuX2dldFRhYmxlKCkuZ2V0TmFtZSgpKVxuICBjb25zdCBzY29wZUNvbCA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZUZvckF0dHJpYnV0ZU5hbWUoc2NvcGUpXG4gIGNvbnN0IHBvc0NvbCA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZUZvckF0dHJpYnV0ZU5hbWUocG9zaXRpb25Db2x1bW4pXG4gIGNvbnN0IHByZXNlcnZlZENoYW5nZXMgPSB7Li4ucmVjb3JkLl9jaGFuZ2VzfVxuICBjb25zdCBzY29wZUNvbHVtblNxbCA9IGNvbm5lY3Rpb24ucXVvdGVDb2x1bW4oc2NvcGVDb2wpXG4gIGNvbnN0IHBvc2l0aW9uQ29sdW1uU3FsID0gY29ubmVjdGlvbi5xdW90ZUNvbHVtbihwb3NDb2wpXG4gIGNvbnN0IHByaW1hcnlLZXkgPSBhY3RzQXNMaXN0UHJpbWFyeUtleShtb2RlbENsYXNzKVxuICBjb25zdCBwcmltYXJ5S2V5U3FsID0gY29ubmVjdGlvbi5xdW90ZUNvbHVtbihwcmltYXJ5S2V5KVxuICBjb25zdCByZWNvcmRJZCA9IGFjdHNBc0xpc3RSZWNvcmRJZChyZWNvcmQpXG5cbiAgZGVsZXRlIHByZXNlcnZlZENoYW5nZXNbc2NvcGVDb2xdXG4gIGRlbGV0ZSBwcmVzZXJ2ZWRDaGFuZ2VzW3Bvc0NvbF1cblxuICBhd2FpdCBjb25uZWN0aW9uLnF1ZXJ5KFxuICAgIGBVUERBVEUgJHt0YWJsZVNxbH0gU0VUICR7c2NvcGVDb2x1bW5TcWx9ID0gJHtjb25uZWN0aW9uLnF1b3RlKHNjb3BlVmFsdWUpfSwgJHtwb3NpdGlvbkNvbHVtblNxbH0gPSAke2Nvbm5lY3Rpb24ucXVvdGUocG9zaXRpb24pfSBXSEVSRSAke3ByaW1hcnlLZXlTcWx9ID0gJHtjb25uZWN0aW9uLnF1b3RlKHJlY29yZElkKX1gXG4gIClcbiAgYXdhaXQgcmVjb3JkLl9yZWxvYWRXaXRoSWQocmVjb3JkSWQpXG4gIHJlY29yZC5fY2hhbmdlcyA9IHByZXNlcnZlZENoYW5nZXNcbiAgY2xlYXJCZWxvbmdzVG9DaGFuZ2VGb3JTY29wZShyZWNvcmQpXG59XG5cbi8qKlxuICogQ2xlYXJzIGRpcnR5IGJlbG9uZ3MtdG8gc3RhdGUgZm9yIHRoZSBzY29wZSBGSyBhZnRlciBkaXJlY3QgcGxhY2VtZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IHJlY29yZCAtIE1vZGVsIGluc3RhbmNlLlxuICogQHJldHVybnMge3ZvaWR9IE5vdGhpbmcuXG4gKi9cbmZ1bmN0aW9uIGNsZWFyQmVsb25nc1RvQ2hhbmdlRm9yU2NvcGUocmVjb3JkKSB7XG4gIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBpbiByZWNvcmQuX2luc3RhbmNlUmVsYXRpb25zaGlwcyB8fCB7fSkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHJlY29yZC5faW5zdGFuY2VSZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdXG5cbiAgICBpZiAocmVsYXRpb25zaGlwLmdldFR5cGUoKSAhPT0gXCJiZWxvbmdzVG9cIikgY29udGludWVcblxuICAgIHJlbGF0aW9uc2hpcC5zZXREaXJ0eShmYWxzZSlcbiAgfVxufVxuXG4vKipcbiAqIEJ1bXBzIHBvc2l0aW9ucyBVUCBieSAxIGluIHRoZSByYW5nZSBbZnJvbVBvc2l0aW9uLCB0b1Bvc2l0aW9uKSB3aXRoaW4gdGhlXG4gKiBzYW1lIHNjb3BlLiBVcGRhdGVzIGluIGRlc2NlbmRpbmcgb3JkZXIgdG8gYXZvaWQgaW50ZXJtZWRpYXRlIFVOSVFVRVxuICogY29uc3RyYWludCB2aW9sYXRpb25zLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5yZWNvcmQgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugd2hvc2Ugc2NvcGUgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnBvc2l0aW9uQ29sdW1uIC0gY2FtZWxDYXNlIHBvc2l0aW9uIGF0dHJpYnV0ZSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc2NvcGUgLSBjYW1lbENhc2Ugc2NvcGUgYXR0cmlidXRlIG5hbWUuXG4gKiBAcGFyYW0ge251bWJlcn0gYXJncy5mcm9tUG9zaXRpb24gLSBTdGFydGluZyBwb3NpdGlvbiAoaW5jbHVzaXZlKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy50b1Bvc2l0aW9uXSAtIEVuZGluZyBwb3NpdGlvbiAoZXhjbHVzaXZlKS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBbYXJncy5zY29wZVZhbHVlXSAtIEV4cGxpY2l0IHNjb3BlIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IFthcmdzLmV4Y2x1ZGVSZWNvcmRJZF0gLSBSZWNvcmQgaWQgdG8gZXhjbHVkZSBmcm9tIHNoaWZ0cy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBzaGlmdFBvc2l0aW9uc1VwKHtyZWNvcmQsIHBvc2l0aW9uQ29sdW1uLCBzY29wZSwgZnJvbVBvc2l0aW9uLCB0b1Bvc2l0aW9uLCBzY29wZVZhbHVlLCBleGNsdWRlUmVjb3JkSWR9KSB7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIChyZWNvcmQuY29uc3RydWN0b3IpXG4gIGNvbnN0IGNvbm5lY3Rpb24gPSByZWNvcmQuY29ubmVjdGlvbigpXG4gIGNvbnN0IHRhYmxlTmFtZSA9IG1vZGVsQ2xhc3MuX2dldFRhYmxlKCkuZ2V0TmFtZSgpXG4gIGNvbnN0IHJlc29sdmVkU2NvcGVWYWx1ZSA9IHNjb3BlVmFsdWUgIT0gbnVsbCA/IHNjb3BlVmFsdWUgOiByZXNvbHZlU2NvcGVWYWx1ZShyZWNvcmQsIHNjb3BlKVxuICBjb25zdCBzY29wZUNvbHVtbk5hbWUgPSBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKHNjb3BlKVxuXG4gIGlmIChyZXNvbHZlZFNjb3BlVmFsdWUgPT0gbnVsbCkgcmV0dXJuXG5cbiAgY29uc3QgcG9zaXRpb25Db2x1bW5OYW1lID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lRm9yQXR0cmlidXRlTmFtZShwb3NpdGlvbkNvbHVtbilcbiAgY29uc3QgcG9zaXRpb25Db2x1bW5TcWwgPSBjb25uZWN0aW9uLnF1b3RlQ29sdW1uKHBvc2l0aW9uQ29sdW1uTmFtZSlcbiAgY29uc3Qgc2NvcGVDb2x1bW5TcWwgPSBjb25uZWN0aW9uLnF1b3RlQ29sdW1uKHNjb3BlQ29sdW1uTmFtZSlcbiAgY29uc3QgcHJpbWFyeUtleSA9IGFjdHNBc0xpc3RQcmltYXJ5S2V5KG1vZGVsQ2xhc3MpXG4gIGNvbnN0IHByaW1hcnlLZXlTcWwgPSBjb25uZWN0aW9uLnF1b3RlQ29sdW1uKHByaW1hcnlLZXkpXG4gIGNvbnN0IHRhYmxlU3FsID0gY29ubmVjdGlvbi5xdW90ZVRhYmxlKHRhYmxlTmFtZSlcbiAgY29uc3QgcXVvdGVkU2NvcGUgPSBjb25uZWN0aW9uLnF1b3RlKHJlc29sdmVkU2NvcGVWYWx1ZSlcblxuICAvLyBMb2FkIHJvd3MgaW4gZGVzY2VuZGluZyBvcmRlciBzbyB3ZSBidW1wIHRoZSBoaWdoZXN0IGZpcnN0XG4gIGxldCBxdWVyeSA9IHJlY29yZFxuICAgIC5xdWVyeUZvck1vZGVsKG1vZGVsQ2xhc3MpXG4gICAgLnNlbGVjdChwcmltYXJ5S2V5KVxuICAgIC5zZWxlY3QocG9zaXRpb25Db2x1bW4pXG4gICAgLndoZXJlKHtbc2NvcGVDb2x1bW5OYW1lXTogcmVzb2x2ZWRTY29wZVZhbHVlfSlcbiAgICAud2hlcmUoYCR7cG9zaXRpb25Db2x1bW5TcWx9ID49ICR7Y29ubmVjdGlvbi5xdW90ZShmcm9tUG9zaXRpb24pfWApXG4gICAgLndoZXJlKGAke3Bvc2l0aW9uQ29sdW1uU3FsfSA+IDBgKVxuICAgIC5vcmRlcihgJHtwb3NpdGlvbkNvbHVtblNxbH0gREVTQ2ApXG5cbiAgY29uc3QgcmVjb3JkSWRUb0V4Y2x1ZGUgPSBleGNsdWRlUmVjb3JkSWQgfHwgKHJlY29yZC5pc1BlcnNpc3RlZCgpID8gYWN0c0FzTGlzdFJlY29yZElkKHJlY29yZCkgOiBudWxsKVxuXG4gIGlmIChyZWNvcmRJZFRvRXhjbHVkZSAhPSBudWxsKSB7XG4gICAgcXVlcnkgPSBxdWVyeS53aGVyZShgJHtwcmltYXJ5S2V5U3FsfSAhPSAke2Nvbm5lY3Rpb24ucXVvdGUocmVjb3JkSWRUb0V4Y2x1ZGUpfWApXG4gIH1cblxuICBpZiAodG9Qb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgcXVlcnkgPSBxdWVyeS53aGVyZShgJHtwb3NpdGlvbkNvbHVtblNxbH0gPCAke2Nvbm5lY3Rpb24ucXVvdGUodG9Qb3NpdGlvbil9YClcbiAgfVxuXG4gIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeS50b0FycmF5KClcblxuICBzZXRTaGlmdGluZ0ZsYWcocmVjb3JkLCB0cnVlKVxuXG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgY3VycmVudFBvcyA9IE51bWJlcihyb3cucmVhZEF0dHJpYnV0ZShwb3NpdGlvbkNvbHVtbikpXG5cbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24ucXVlcnkoXG4gICAgICAgIGBVUERBVEUgJHt0YWJsZVNxbH0gU0VUICR7cG9zaXRpb25Db2x1bW5TcWx9ID0gJHtwb3NpdGlvbkNvbHVtblNxbH0gKyAxIFdIRVJFICR7cHJpbWFyeUtleVNxbH0gPSAke2Nvbm5lY3Rpb24ucXVvdGUocm93LmlkKCkpfSBBTkQgJHtzY29wZUNvbHVtblNxbH0gPSAke3F1b3RlZFNjb3BlfSBBTkQgJHtwb3NpdGlvbkNvbHVtblNxbH0gPSAke2Nvbm5lY3Rpb24ucXVvdGUoY3VycmVudFBvcyl9YFxuICAgICAgKVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRTaGlmdGluZ0ZsYWcocmVjb3JkLCBmYWxzZSlcbiAgfVxufVxuXG4vKipcbiAqIEJ1bXBzIHBvc2l0aW9ucyBET1dOIGJ5IDEgaW4gdGhlIHJhbmdlIFtmcm9tUG9zaXRpb24sIHRvUG9zaXRpb24pIHdpdGhpblxuICogdGhlIHNhbWUgc2NvcGUuIFVwZGF0ZXMgaW4gYXNjZW5kaW5nIG9yZGVyIHRvIGF2b2lkIGludGVybWVkaWF0ZSBVTklRVUVcbiAqIGNvbnN0cmFpbnQgdmlvbGF0aW9ucy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVjb3JkIC0gVGhlIG1vZGVsIGluc3RhbmNlIHdob3NlIHNjb3BlIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGguXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wb3NpdGlvbkNvbHVtbiAtIGNhbWVsQ2FzZSBwb3NpdGlvbiBhdHRyaWJ1dGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNjb3BlIC0gY2FtZWxDYXNlIHNjb3BlIGF0dHJpYnV0ZSBuYW1lLlxuICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuZnJvbVBvc2l0aW9uIC0gU3RhcnRpbmcgcG9zaXRpb24gKGluY2x1c2l2ZSkuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MudG9Qb3NpdGlvbl0gLSBFbmRpbmcgcG9zaXRpb24gKGV4Y2x1c2l2ZSkuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gW2FyZ3Muc2NvcGVWYWx1ZV0gLSBFeHBsaWNpdCBzY29wZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBzaGlmdFBvc2l0aW9uc0Rvd24oe3JlY29yZCwgcG9zaXRpb25Db2x1bW4sIHNjb3BlLCBmcm9tUG9zaXRpb24sIHRvUG9zaXRpb24sIHNjb3BlVmFsdWV9KSB7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIChyZWNvcmQuY29uc3RydWN0b3IpXG4gIGNvbnN0IGNvbm5lY3Rpb24gPSByZWNvcmQuY29ubmVjdGlvbigpXG4gIGNvbnN0IHRhYmxlTmFtZSA9IG1vZGVsQ2xhc3MuX2dldFRhYmxlKCkuZ2V0TmFtZSgpXG4gIGNvbnN0IHJlc29sdmVkU2NvcGVWYWx1ZSA9IHNjb3BlVmFsdWUgIT0gbnVsbCA/IHNjb3BlVmFsdWUgOiByZXNvbHZlU2NvcGVWYWx1ZShyZWNvcmQsIHNjb3BlKVxuICBjb25zdCBzY29wZUNvbHVtbk5hbWUgPSBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKHNjb3BlKVxuXG4gIGlmIChyZXNvbHZlZFNjb3BlVmFsdWUgPT0gbnVsbCkgcmV0dXJuXG5cbiAgY29uc3QgcG9zaXRpb25Db2x1bW5OYW1lID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lRm9yQXR0cmlidXRlTmFtZShwb3NpdGlvbkNvbHVtbilcbiAgY29uc3QgcG9zaXRpb25Db2x1bW5TcWwgPSBjb25uZWN0aW9uLnF1b3RlQ29sdW1uKHBvc2l0aW9uQ29sdW1uTmFtZSlcbiAgY29uc3Qgc2NvcGVDb2x1bW5TcWwgPSBjb25uZWN0aW9uLnF1b3RlQ29sdW1uKHNjb3BlQ29sdW1uTmFtZSlcbiAgY29uc3QgcHJpbWFyeUtleSA9IGFjdHNBc0xpc3RQcmltYXJ5S2V5KG1vZGVsQ2xhc3MpXG4gIGNvbnN0IHByaW1hcnlLZXlTcWwgPSBjb25uZWN0aW9uLnF1b3RlQ29sdW1uKHByaW1hcnlLZXkpXG4gIGNvbnN0IHRhYmxlU3FsID0gY29ubmVjdGlvbi5xdW90ZVRhYmxlKHRhYmxlTmFtZSlcbiAgY29uc3QgcXVvdGVkU2NvcGUgPSBjb25uZWN0aW9uLnF1b3RlKHJlc29sdmVkU2NvcGVWYWx1ZSlcblxuICAvLyBMb2FkIHJvd3MgaW4gYXNjZW5kaW5nIG9yZGVyIHNvIHdlIHNoaWZ0IHRoZSBsb3dlc3QgZ2FwIGZpcnN0XG4gIGxldCBxdWVyeSA9IHJlY29yZFxuICAgIC5xdWVyeUZvck1vZGVsKG1vZGVsQ2xhc3MpXG4gICAgLnNlbGVjdChwcmltYXJ5S2V5KVxuICAgIC5zZWxlY3QocG9zaXRpb25Db2x1bW4pXG4gICAgLndoZXJlKHtbc2NvcGVDb2x1bW5OYW1lXTogcmVzb2x2ZWRTY29wZVZhbHVlfSlcbiAgICAud2hlcmUoYCR7cG9zaXRpb25Db2x1bW5TcWx9ID49ICR7Y29ubmVjdGlvbi5xdW90ZShmcm9tUG9zaXRpb24pfWApXG4gICAgLndoZXJlKGAke3Bvc2l0aW9uQ29sdW1uU3FsfSA+IDBgKVxuICAgIC53aGVyZShgJHtwcmltYXJ5S2V5U3FsfSAhPSAke2Nvbm5lY3Rpb24ucXVvdGUoYWN0c0FzTGlzdFJlY29yZElkKHJlY29yZCkpfWApXG4gICAgLm9yZGVyKHtjb2x1bW46IHBvc2l0aW9uQ29sdW1uTmFtZSwgZGlyZWN0aW9uOiBcIkFTQ1wifSlcblxuICBpZiAodG9Qb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgcXVlcnkgPSBxdWVyeS53aGVyZShgJHtwb3NpdGlvbkNvbHVtblNxbH0gPCAke2Nvbm5lY3Rpb24ucXVvdGUodG9Qb3NpdGlvbil9YClcbiAgfVxuXG4gIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeS50b0FycmF5KClcblxuICBzZXRTaGlmdGluZ0ZsYWcocmVjb3JkLCB0cnVlKVxuXG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgY3VycmVudFBvcyA9IE51bWJlcihyb3cucmVhZEF0dHJpYnV0ZShwb3NpdGlvbkNvbHVtbikpXG5cbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24ucXVlcnkoXG4gICAgICAgIGBVUERBVEUgJHt0YWJsZVNxbH0gU0VUICR7cG9zaXRpb25Db2x1bW5TcWx9ID0gJHtwb3NpdGlvbkNvbHVtblNxbH0gLSAxIFdIRVJFICR7cHJpbWFyeUtleVNxbH0gPSAke2Nvbm5lY3Rpb24ucXVvdGUocm93LmlkKCkpfSBBTkQgJHtzY29wZUNvbHVtblNxbH0gPSAke3F1b3RlZFNjb3BlfSBBTkQgJHtwb3NpdGlvbkNvbHVtblNxbH0gPSAke2Nvbm5lY3Rpb24ucXVvdGUoY3VycmVudFBvcyl9YFxuICAgICAgKVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRTaGlmdGluZ0ZsYWcocmVjb3JkLCBmYWxzZSlcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGhpZ2hlc3QgY3VycmVudCBwb3NpdGlvbiB2YWx1ZSBpbiB0aGUgcmVjb3JkJ3Mgc2NvcGUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlY29yZCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB3aG9zZSBzY29wZSBpcyB0aGUgc291cmNlIG9mIHRydXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucG9zaXRpb25Db2x1bW4gLSBjYW1lbENhc2UgcG9zaXRpb24gYXR0cmlidXRlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zY29wZSAtIGNhbWVsQ2FzZSBzY29wZSBhdHRyaWJ1dGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBbYXJncy5zY29wZVZhbHVlXSAtIEV4cGxpY2l0IHNjb3BlIHZhbHVlLlxuICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gLSBIaWdoZXN0IHBvc2l0aW9uIGluIHNjb3BlLCBvciAwIHdoZW4gc2NvcGUgaXMgZW1wdHkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhpZ2hlc3RQb3NpdGlvbkluU2NvcGUoe3JlY29yZCwgcG9zaXRpb25Db2x1bW4sIHNjb3BlLCBzY29wZVZhbHVlfSkge1xuICBjb25zdCBtb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAocmVjb3JkLmNvbnN0cnVjdG9yKVxuICBjb25zdCBjb25uZWN0aW9uID0gcmVjb3JkLmNvbm5lY3Rpb24oKVxuICBjb25zdCBzY29wZUNvbHVtbk5hbWUgPSBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKHNjb3BlKVxuICBjb25zdCBwb3NpdGlvbkNvbHVtbk5hbWUgPSBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKHBvc2l0aW9uQ29sdW1uKVxuICBjb25zdCBwb3NpdGlvbkNvbHVtblNxbCA9IGNvbm5lY3Rpb24ucXVvdGVDb2x1bW4ocG9zaXRpb25Db2x1bW5OYW1lKVxuICBjb25zdCByZXNvbHZlZFNjb3BlVmFsdWUgPSBzY29wZVZhbHVlICE9IG51bGwgPyBzY29wZVZhbHVlIDogcmVzb2x2ZVNjb3BlVmFsdWUocmVjb3JkLCBzY29wZSlcblxuICBpZiAocmVzb2x2ZWRTY29wZVZhbHVlID09IG51bGwpIHJldHVybiAwXG5cbiAgY29uc3Qgcm93cyA9IGF3YWl0IHJlY29yZFxuICAgIC5xdWVyeUZvck1vZGVsKG1vZGVsQ2xhc3MpXG4gICAgLnNlbGVjdChwb3NpdGlvbkNvbHVtbilcbiAgICAud2hlcmUoe1tzY29wZUNvbHVtbk5hbWVdOiByZXNvbHZlZFNjb3BlVmFsdWV9KVxuICAgIC5vcmRlcihgJHtwb3NpdGlvbkNvbHVtblNxbH0gREVTQ2ApXG4gICAgLmxpbWl0KDEpXG4gICAgLnRvQXJyYXkoKVxuXG4gIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICByZXR1cm4gTnVtYmVyKHJvd3NbMF0ucmVhZEF0dHJpYnV0ZShwb3NpdGlvbkNvbHVtbikpIHx8IDBcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIHNjb3BlIHZhbHVlIGZyb20gdGhlIGF0dHJpYnV0ZSBzdG9yZSBmaXJzdCwgdGhlbiBmYWxscyBiYWNrXG4gKiB0byB0aGUgbG9hZGVkIGJlbG9uZ3NUbyByZWxhdGlvbnNoaXAuIFRoaXMgaXMgbmVlZGVkIGR1cmluZyBiZWZvcmVDcmVhdGVcbiAqIGJlY2F1c2UgdGhlIEZLIGF0dHJpYnV0ZSBtYXkgbm90IGJlIHNldCB1bnRpbCBfY3JlYXRlTmV3UmVjb3JkIGZsdXNoZXNcbiAqIF9iZWxvbmdzVG9DaGFuZ2VzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IHJlY29yZCAtIE1vZGVsIGluc3RhbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNjb3BlIC0gY2FtZWxDYXNlIHNjb3BlIGF0dHJpYnV0ZSBuYW1lIChlLmcuIFwicHJvamVjdElkXCIpLlxuICogQHJldHVybnMge3N0cmluZyB8IG51bWJlciB8IG51bGx9IC0gQ3VycmVudCBsaXN0IHBvc2l0aW9uIHZhbHVlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlU2NvcGVWYWx1ZShyZWNvcmQsIHNjb3BlKSB7XG4gIGNvbnN0IGF0dHJWYWx1ZSA9IHJlY29yZC5yZWFkQXR0cmlidXRlKHNjb3BlKVxuXG4gIGlmIChhdHRyVmFsdWUgIT0gbnVsbCkgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAoYXR0clZhbHVlKVxuXG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIChyZWNvcmQuY29uc3RydWN0b3IpXG4gIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBtb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcHNNYXAoKVxuICBjb25zdCBzY29wZUNvbHVtbk5hbWUgPSBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKHNjb3BlKVxuXG4gIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBpbiByZWxhdGlvbnNoaXBzKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXVxuXG4gICAgaWYgKHJlbGF0aW9uc2hpcC5nZXRUeXBlPy4oKSAhPT0gXCJiZWxvbmdzVG9cIikgY29udGludWVcblxuICAgIGNvbnN0IGZvcmVpZ25LZXkgPSByZWxhdGlvbnNoaXAuZ2V0Rm9yZWlnbktleSgpXG5cbiAgICBpZiAoZm9yZWlnbktleSAhPT0gc2NvcGVDb2x1bW5OYW1lKSBjb250aW51ZVxuXG4gICAgY29uc3QgaW5zdGFuY2VSZWxhdGlvbnNoaXAgPSByZWNvcmQuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpXG4gICAgY29uc3QgbG9hZGVkID0gaW5zdGFuY2VSZWxhdGlvbnNoaXAubG9hZGVkKClcblxuICAgIGlmIChsb2FkZWQgJiYgIUFycmF5LmlzQXJyYXkobG9hZGVkKSAmJiB0eXBlb2YgbG9hZGVkLmlkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBzY2FsYXJNb2RlbFByaW1hcnlLZXlWYWx1ZShsb2FkZWQuaWQoKSwgYGFjdHNBc0xpc3Qgc2NvcGUgcmVsYXRpb25zaGlwIGZvciAke21vZGVsQ2xhc3MubmFtZX1gKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogTW92ZXMgdGhlIHJlY29yZCB0byBhIHRlbXBvcmFyeSBwb3NpdGlvbiBvdXRzaWRlIHRoZSBub3JtYWwgcmFuZ2Ugc29cbiAqIHRoYXQgc3Vycm91bmRpbmcgcG9zaXRpb24gc2hpZnRzIGRvIG5vdCBoaXQgdW5pcXVlIGNvbnN0cmFpbnQgdmlvbGF0aW9ucy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVjb3JkIC0gTW9kZWwgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wb3NpdGlvbkNvbHVtbiAtIGNhbWVsQ2FzZSBwb3NpdGlvbiBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zY29wZSAtIGNhbWVsQ2FzZSBzY29wZSBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IG51bGx9IFthcmdzLnNjb3BlVmFsdWVdIC0gU2NvcGUgY29udGFpbmluZyB0aGUgcmVjb3JkIGJlZm9yZSBtb3ZlLW91dC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBtb3ZlT3V0T2ZXYXkoe3JlY29yZCwgcG9zaXRpb25Db2x1bW4sIHNjb3BlLCBzY29wZVZhbHVlfSkge1xuICBjb25zdCBtb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAocmVjb3JkLmNvbnN0cnVjdG9yKVxuICBjb25zdCBjb25uZWN0aW9uID0gcmVjb3JkLmNvbm5lY3Rpb24oKVxuICBjb25zdCB0YWJsZU5hbWUgPSBtb2RlbENsYXNzLl9nZXRUYWJsZSgpLmdldE5hbWUoKVxuICBjb25zdCByZXNvbHZlZFNjb3BlVmFsdWUgPSBzY29wZVZhbHVlICE9IG51bGwgPyBzY29wZVZhbHVlIDogcmVzb2x2ZVNjb3BlVmFsdWUocmVjb3JkLCBzY29wZSlcblxuICBpZiAocmVzb2x2ZWRTY29wZVZhbHVlID09IG51bGwpIHJldHVyblxuXG4gIGNvbnN0IHBvc2l0aW9uQ29sdW1uU3FsID0gY29ubmVjdGlvbi5xdW90ZUNvbHVtbihtb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKHBvc2l0aW9uQ29sdW1uKSlcbiAgY29uc3Qgc2NvcGVDb2x1bW5TcWwgPSBjb25uZWN0aW9uLnF1b3RlQ29sdW1uKG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZUZvckF0dHJpYnV0ZU5hbWUoc2NvcGUpKVxuICBjb25zdCB0YWJsZVNxbCA9IGNvbm5lY3Rpb24ucXVvdGVUYWJsZSh0YWJsZU5hbWUpXG4gIGNvbnN0IHBrU3FsID0gY29ubmVjdGlvbi5xdW90ZUNvbHVtbihhY3RzQXNMaXN0UHJpbWFyeUtleShtb2RlbENsYXNzKSlcblxuICBzZXRTaGlmdGluZ0ZsYWcocmVjb3JkLCB0cnVlKVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgY29ubmVjdGlvbi5xdWVyeShcbiAgICAgIGBVUERBVEUgJHt0YWJsZVNxbH0gU0VUICR7cG9zaXRpb25Db2x1bW5TcWx9ID0gLSR7cG9zaXRpb25Db2x1bW5TcWx9IFdIRVJFICR7c2NvcGVDb2x1bW5TcWx9ID0gJHtjb25uZWN0aW9uLnF1b3RlKHJlc29sdmVkU2NvcGVWYWx1ZSl9IEFORCAke3BrU3FsfSA9ICR7Y29ubmVjdGlvbi5xdW90ZShhY3RzQXNMaXN0UmVjb3JkSWQocmVjb3JkKSl9YFxuICAgIClcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBEb24ndCBjbGVhciB0aGUgZmxhZyBoZXJlIOKAlCB0aGUgY2FsbGVyIHdpbGwgZG8gdGhhdCBhZnRlciBzaGlmdHNcbiAgfVxufVxuIl19
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
export type AttachmentDriverConstructor = import("../../../configuration-types.js").AttachmentDriverConstructor;
|
|
2
|
+
/**
|
|
3
|
+
* Returns the attachment store used before a model-level transaction starts.
|
|
4
|
+
* @param {typeof import("../index.js").default} modelClass - Model class opening the transaction.
|
|
5
|
+
* @param {import("../../drivers/base.js").default} connection - Selected physical connection.
|
|
6
|
+
* @returns {RecordAttachmentsStore} - Store instance.
|
|
7
|
+
*/
|
|
8
|
+
export declare function recordAttachmentsStoreForModelClass(modelClass: typeof import("../index.js").default, connection: import("../../drivers/base.js").default): RecordAttachmentsStore;
|
|
2
9
|
/**
|
|
3
10
|
* Runs the recordAttachmentsStoreForModel helper.
|
|
4
11
|
* @param {import("../index.js").default} model - Model instance.
|
|
@@ -12,6 +19,9 @@ export default class RecordAttachmentsStore {
|
|
|
12
19
|
configuration: import("../../../configuration.js").default;
|
|
13
20
|
databaseIdentifier: string;
|
|
14
21
|
_readyPromise: Promise<void> | null;
|
|
22
|
+
_schemaUpgradePromise: Promise<void> | null;
|
|
23
|
+
/** @type {number | undefined} */
|
|
24
|
+
_schemaReadyGeneration: number | undefined;
|
|
15
25
|
_driverColumnsAvailable: boolean;
|
|
16
26
|
_contentBase64Nullable: boolean;
|
|
17
27
|
/**
|
|
@@ -95,6 +105,39 @@ export default class RecordAttachmentsStore {
|
|
|
95
105
|
ensureAttachmentStoreSchema({ db }: {
|
|
96
106
|
db: import("../../../database/drivers/base.js").default;
|
|
97
107
|
}): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Returns the schema-cache generation for the connection's physical database.
|
|
110
|
+
* @param {import("../../../database/drivers/base.js").default} db - DB connection.
|
|
111
|
+
* @returns {number} - Current schema-cache generation.
|
|
112
|
+
*/
|
|
113
|
+
_schemaCacheGeneration(db: import("../../../database/drivers/base.js").default): number;
|
|
114
|
+
/**
|
|
115
|
+
* Ensures attachment columns and indexes after schema-upgrade serialization is acquired.
|
|
116
|
+
* @param {object} args - Options.
|
|
117
|
+
* @param {import("../../../database/drivers/base.js").default} args.db - DB connection.
|
|
118
|
+
* @returns {Promise<void>} - Resolves when schema columns are ensured.
|
|
119
|
+
*/
|
|
120
|
+
_ensureAttachmentStoreSchema({ db }: {
|
|
121
|
+
db: import("../../../database/drivers/base.js").default;
|
|
122
|
+
}): Promise<void>;
|
|
123
|
+
/**
|
|
124
|
+
* Backfills bounded attachment owner digests in small batches.
|
|
125
|
+
* @param {import("../../../database/drivers/base.js").default} db - Database connection.
|
|
126
|
+
* @returns {Promise<void>} - Resolves when every existing row has a digest.
|
|
127
|
+
*/
|
|
128
|
+
backfillAttachmentRecordIdDigests(db: import("../../../database/drivers/base.js").default): Promise<void>;
|
|
129
|
+
/**
|
|
130
|
+
* Makes the backfilled attachment owner digest required.
|
|
131
|
+
* @param {import("../../../database/drivers/base.js").default} db - Database connection.
|
|
132
|
+
* @returns {Promise<void>} - Resolves when the digest column is non-nullable.
|
|
133
|
+
*/
|
|
134
|
+
ensureAttachmentRecordIdDigestNotNull(db: import("../../../database/drivers/base.js").default): Promise<void>;
|
|
135
|
+
/**
|
|
136
|
+
* Ensures attachment owner queries retain a bounded composite index.
|
|
137
|
+
* @param {import("../../../database/drivers/base.js").default} db - Database connection.
|
|
138
|
+
* @returns {Promise<void>} - Resolves when the owner index exists.
|
|
139
|
+
*/
|
|
140
|
+
ensureAttachmentOwnerIndex(db: import("../../../database/drivers/base.js").default): Promise<void>;
|
|
98
141
|
/**
|
|
99
142
|
* Runs read attachment row.
|
|
100
143
|
* @param {object} args - Options.
|
|
@@ -145,6 +188,30 @@ export default class RecordAttachmentsStore {
|
|
|
145
188
|
model: import("../index.js").default;
|
|
146
189
|
name: string;
|
|
147
190
|
}): Promise<Array<Record<string, ReturnType<typeof JSON.parse>>>>;
|
|
191
|
+
/**
|
|
192
|
+
* Prepares attachment schema before a record transaction can migrate ownership.
|
|
193
|
+
* @param {object} args - Options.
|
|
194
|
+
* @param {import("../../drivers/base.js").default} args.connection - Record-owning database connection.
|
|
195
|
+
* @returns {Promise<void>} - Resolves when existing attachment schema is current.
|
|
196
|
+
*/
|
|
197
|
+
prepareRecordIdentityMigration({ connection }: {
|
|
198
|
+
connection: import("../../drivers/base.js").default;
|
|
199
|
+
}): Promise<void>;
|
|
200
|
+
/**
|
|
201
|
+
* Moves every attachment row to a record's new primary-key identity.
|
|
202
|
+
* @param {object} args - Options.
|
|
203
|
+
* @param {import("../../drivers/base.js").default} args.connection - Transaction-owning database connection.
|
|
204
|
+
* @param {import("../index.js").default} args.model - Attachment owner after the key change.
|
|
205
|
+
* @param {import("../../../utils/model-primary-key.js").ModelPrimaryKeyValue} args.nextIdentity - New owner identity.
|
|
206
|
+
* @param {import("../../../utils/model-primary-key.js").ModelPrimaryKeyValue} args.previousIdentity - Persisted owner identity.
|
|
207
|
+
* @returns {Promise<void>} - Resolves after ownership is migrated.
|
|
208
|
+
*/
|
|
209
|
+
migrateRecordIdentity({ connection, model, nextIdentity, previousIdentity }: {
|
|
210
|
+
connection: import("../../drivers/base.js").default;
|
|
211
|
+
model: import("../index.js").default;
|
|
212
|
+
nextIdentity: import("../../../utils/model-primary-key.js").ModelPrimaryKeyValue;
|
|
213
|
+
previousIdentity: import("../../../utils/model-primary-key.js").ModelPrimaryKeyValue;
|
|
214
|
+
}): Promise<void>;
|
|
148
215
|
/**
|
|
149
216
|
* Runs delete attachment row storage.
|
|
150
217
|
* @param {object} args - Options.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../../src/database/record/attachments/store.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../../src/database/record/attachments/store.js"],"names":[],"mappings":"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"}
|