velocious 1.0.562 → 1.0.564
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 +5 -1
- package/build/background-jobs/cron-expression.js +12 -13
- package/build/background-jobs/main.js +6 -6
- package/build/background-jobs/runner-graceful-shutdown.js +2 -3
- package/build/background-jobs/scheduler.js +3 -3
- package/build/background-jobs/worker.js +8 -9
- package/build/beacon/client.js +3 -4
- package/build/configuration-types.js +1 -0
- package/build/configuration.js +44 -3
- package/build/database/drivers/sqlite/web-persistence.js +2 -5
- package/build/database/pool/async-tracked-multi-connection.js +65 -15
- package/build/database/pool/base.js +23 -7
- package/build/database/query/index.js +21 -22
- package/build/database/query/model-class-query.js +5 -6
- package/build/database/record/attachments/normalize-input.js +9 -10
- package/build/database/record/attachments/store.js +2 -2
- package/build/database/record/auditing.js +7 -8
- package/build/database/record/index.js +4 -5
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +1 -2
- package/build/frontend-model-controller.js +49 -56
- package/build/frontend-models/base.js +17 -19
- package/build/frontend-models/outgoing-event-buffer.js +3 -4
- package/build/frontend-models/query.js +40 -44
- package/build/frontend-models/resource-definition.js +7 -8
- package/build/frontend-models/transport-serialization.js +10 -12
- package/build/frontend-models/websocket-channel.js +12 -13
- package/build/http-server/client/websocket-session.js +7 -8
- package/build/http-server/client-delivery-queue.js +167 -0
- package/build/http-server/server-client.js +9 -0
- package/build/http-server/websocket-event-log-store.js +4 -6
- package/build/http-server/websocket-events-host.js +42 -12
- package/build/http-server/worker-handler/in-process.js +53 -14
- package/build/http-server/worker-handler/index.js +88 -18
- package/build/http-server/worker-handler/worker-thread.js +2 -2
- package/build/plugins/sqljs-wasm-route.js +3 -5
- package/build/src/background-jobs/cron-expression.d.ts +0 -12
- package/build/src/background-jobs/cron-expression.d.ts.map +1 -1
- package/build/src/background-jobs/cron-expression.js +13 -13
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +7 -7
- package/build/src/background-jobs/runner-graceful-shutdown.d.ts +0 -6
- package/build/src/background-jobs/runner-graceful-shutdown.d.ts.map +1 -1
- package/build/src/background-jobs/runner-graceful-shutdown.js +3 -3
- package/build/src/background-jobs/scheduler.d.ts +0 -3
- package/build/src/background-jobs/scheduler.d.ts.map +1 -1
- package/build/src/background-jobs/scheduler.js +4 -4
- package/build/src/background-jobs/worker.d.ts +0 -8
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +9 -9
- package/build/src/beacon/client.d.ts +0 -4
- package/build/src/beacon/client.d.ts.map +1 -1
- package/build/src/beacon/client.js +4 -4
- package/build/src/configuration-types.d.ts +8 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +2 -1
- package/build/src/configuration.d.ts +34 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +40 -4
- package/build/src/database/drivers/sqlite/web-persistence.d.ts +0 -14
- package/build/src/database/drivers/sqlite/web-persistence.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/web-persistence.js +3 -3
- package/build/src/database/pool/async-tracked-multi-connection.d.ts +29 -1
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +57 -15
- package/build/src/database/pool/base.d.ts +53 -4
- package/build/src/database/pool/base.d.ts.map +1 -1
- package/build/src/database/pool/base.js +23 -6
- package/build/src/database/query/index.d.ts +18 -39
- package/build/src/database/query/index.d.ts.map +1 -1
- package/build/src/database/query/index.js +22 -22
- package/build/src/database/query/model-class-query.d.ts +0 -5
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +6 -6
- package/build/src/database/record/attachments/normalize-input.d.ts +0 -9
- package/build/src/database/record/attachments/normalize-input.d.ts.map +1 -1
- package/build/src/database/record/attachments/normalize-input.js +10 -10
- package/build/src/database/record/attachments/store.d.ts.map +1 -1
- package/build/src/database/record/attachments/store.js +2 -2
- package/build/src/database/record/auditing.d.ts +17 -24
- package/build/src/database/record/auditing.d.ts.map +1 -1
- package/build/src/database/record/auditing.js +8 -8
- package/build/src/database/record/index.d.ts +4 -4
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +5 -5
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +0 -39
- 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 +2 -2
- package/build/src/frontend-model-controller.d.ts +1 -1
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +50 -50
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +18 -18
- package/build/src/frontend-models/outgoing-event-buffer.d.ts.map +1 -1
- package/build/src/frontend-models/outgoing-event-buffer.js +3 -3
- package/build/src/frontend-models/query.d.ts +56 -37
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +39 -39
- package/build/src/frontend-models/resource-definition.d.ts +0 -7
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +8 -8
- package/build/src/frontend-models/transport-serialization.d.ts +0 -10
- package/build/src/frontend-models/transport-serialization.d.ts.map +1 -1
- package/build/src/frontend-models/transport-serialization.js +11 -11
- package/build/src/frontend-models/websocket-channel.d.ts +0 -12
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +13 -13
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +8 -8
- package/build/src/http-server/client-delivery-queue.d.ts +121 -0
- package/build/src/http-server/client-delivery-queue.d.ts.map +1 -0
- package/build/src/http-server/client-delivery-queue.js +152 -0
- package/build/src/http-server/server-client.d.ts +6 -0
- package/build/src/http-server/server-client.d.ts.map +1 -1
- package/build/src/http-server/server-client.js +10 -1
- package/build/src/http-server/websocket-event-log-store.d.ts +0 -14
- package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
- package/build/src/http-server/websocket-event-log-store.js +5 -5
- package/build/src/http-server/websocket-events-host.d.ts +15 -4
- package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
- package/build/src/http-server/websocket-events-host.js +39 -13
- package/build/src/http-server/worker-handler/in-process.d.ts +19 -1
- package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/in-process.js +50 -14
- package/build/src/http-server/worker-handler/index.d.ts +36 -4
- package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/index.js +82 -18
- package/build/src/http-server/worker-handler/worker-thread.js +3 -3
- package/build/src/plugins/sqljs-wasm-route.d.ts.map +1 -1
- package/build/src/plugins/sqljs-wasm-route.js +4 -4
- package/build/src/sync/conflict-strategy.d.ts +0 -15
- package/build/src/sync/conflict-strategy.d.ts.map +1 -1
- package/build/src/sync/conflict-strategy.js +3 -3
- package/build/src/sync/device-identity.d.ts +0 -45
- package/build/src/sync/device-identity.d.ts.map +1 -1
- package/build/src/sync/device-identity.js +4 -4
- package/build/src/sync/local-mutation-log.d.ts +0 -41
- package/build/src/sync/local-mutation-log.d.ts.map +1 -1
- package/build/src/sync/local-mutation-log.js +9 -9
- package/build/src/sync/offline-grant.d.ts +0 -26
- package/build/src/sync/offline-grant.d.ts.map +1 -1
- package/build/src/sync/offline-grant.js +4 -4
- package/build/src/sync/peer-mutation-bundle.d.ts +0 -14
- package/build/src/sync/peer-mutation-bundle.d.ts.map +1 -1
- package/build/src/sync/peer-mutation-bundle.js +3 -3
- package/build/src/sync/server-change-feed.d.ts.map +1 -1
- package/build/src/sync/server-change-feed.js +33 -33
- package/build/src/sync/sync-api-client.d.ts +0 -9
- package/build/src/sync/sync-api-client.d.ts.map +1 -1
- package/build/src/sync/sync-api-client.js +2 -2
- package/build/src/sync/sync-envelope-replay-service.d.ts +38 -21
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +18 -18
- package/build/src/sync/sync-resource-base.d.ts +0 -7
- package/build/src/sync/sync-resource-base.d.ts.map +1 -1
- package/build/src/sync/sync-resource-base.js +2 -2
- package/build/src/sync/sync-scope-store.d.ts +0 -9
- package/build/src/sync/sync-scope-store.d.ts.map +1 -1
- package/build/src/sync/sync-scope-store.js +10 -10
- package/build/src/testing/test-filter-parser.d.ts +0 -10
- package/build/src/testing/test-filter-parser.d.ts.map +1 -1
- package/build/src/testing/test-filter-parser.js +11 -11
- package/build/src/testing/test-runner.d.ts +25 -91
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +113 -98
- package/build/src/testing/test.d.ts +8 -0
- package/build/src/testing/test.d.ts.map +1 -1
- package/build/src/testing/test.js +9 -9
- package/build/src/utils/backtrace-cleaner.d.ts.map +1 -1
- package/build/src/utils/backtrace-cleaner.js +9 -9
- package/build/src/utils/model-scope.d.ts +0 -8
- package/build/src/utils/model-scope.d.ts.map +1 -1
- package/build/src/utils/model-scope.js +3 -3
- package/build/src/utils/ransack.d.ts +52 -19
- package/build/src/utils/ransack.d.ts.map +1 -1
- package/build/src/utils/ransack.js +26 -26
- package/build/sync/conflict-strategy.js +3 -6
- package/build/sync/device-identity.js +4 -9
- package/build/sync/local-mutation-log.js +9 -14
- package/build/sync/offline-grant.js +4 -7
- package/build/sync/peer-mutation-bundle.js +2 -4
- package/build/sync/server-change-feed.js +32 -34
- package/build/sync/sync-api-client.js +1 -2
- package/build/sync/sync-envelope-replay-service.js +17 -19
- package/build/sync/sync-resource-base.js +1 -2
- package/build/sync/sync-scope-store.js +9 -10
- package/build/testing/test-filter-parser.js +10 -11
- package/build/testing/test-runner.js +116 -108
- package/build/testing/test.js +8 -9
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/utils/backtrace-cleaner.js +8 -9
- package/build/utils/model-scope.js +3 -4
- package/build/utils/ransack.js +27 -34
- package/package.json +3 -1
- package/scripts/eslint-rules/typedefs-first.js +67 -0
- package/scripts/prewarm-chromedriver.js +26 -0
- package/src/background-jobs/cron-expression.js +12 -13
- package/src/background-jobs/main.js +6 -6
- package/src/background-jobs/runner-graceful-shutdown.js +2 -3
- package/src/background-jobs/scheduler.js +3 -3
- package/src/background-jobs/worker.js +8 -9
- package/src/beacon/client.js +3 -4
- package/src/configuration-types.js +1 -0
- package/src/configuration.js +44 -3
- package/src/database/drivers/sqlite/web-persistence.js +2 -5
- package/src/database/pool/async-tracked-multi-connection.js +65 -15
- package/src/database/pool/base.js +23 -7
- package/src/database/query/index.js +21 -22
- package/src/database/query/model-class-query.js +5 -6
- package/src/database/record/attachments/normalize-input.js +9 -10
- package/src/database/record/attachments/store.js +2 -2
- package/src/database/record/auditing.js +7 -8
- package/src/database/record/index.js +4 -5
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +1 -2
- package/src/frontend-model-controller.js +49 -56
- package/src/frontend-models/base.js +17 -19
- package/src/frontend-models/outgoing-event-buffer.js +3 -4
- package/src/frontend-models/query.js +40 -44
- package/src/frontend-models/resource-definition.js +7 -8
- package/src/frontend-models/transport-serialization.js +10 -12
- package/src/frontend-models/websocket-channel.js +12 -13
- package/src/http-server/client/websocket-session.js +7 -8
- package/src/http-server/client-delivery-queue.js +167 -0
- package/src/http-server/server-client.js +9 -0
- package/src/http-server/websocket-event-log-store.js +4 -6
- package/src/http-server/websocket-events-host.js +42 -12
- package/src/http-server/worker-handler/in-process.js +53 -14
- package/src/http-server/worker-handler/index.js +88 -18
- package/src/http-server/worker-handler/worker-thread.js +2 -2
- package/src/plugins/sqljs-wasm-route.js +3 -5
- package/src/sync/conflict-strategy.js +3 -6
- package/src/sync/device-identity.js +4 -9
- package/src/sync/local-mutation-log.js +9 -14
- package/src/sync/offline-grant.js +4 -7
- package/src/sync/peer-mutation-bundle.js +2 -4
- package/src/sync/server-change-feed.js +32 -34
- package/src/sync/sync-api-client.js +1 -2
- package/src/sync/sync-envelope-replay-service.js +17 -19
- package/src/sync/sync-resource-base.js +1 -2
- package/src/sync/sync-scope-store.js +9 -10
- package/src/testing/test-filter-parser.js +10 -11
- package/src/testing/test-runner.js +116 -108
- package/src/testing/test.js +8 -9
- package/src/utils/backtrace-cleaner.js +8 -9
- package/src/utils/model-scope.js +3 -4
- package/src/utils/ransack.js +27 -34
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// @ts-check
|
|
2
|
-
const CONFLICT_STRATEGIES = new Set(["optimisticVersion", "serverWins", "lastWriterWins", "fieldThreeWay", "appendOnly"]);
|
|
3
1
|
/**
|
|
4
2
|
* @typedef {null | string | number | boolean | unknown[] | Record<string, unknown>} SyncJsonValue
|
|
5
3
|
*/
|
|
@@ -15,6 +13,8 @@ const CONFLICT_STRATEGIES = new Set(["optimisticVersion", "serverWins", "lastWri
|
|
|
15
13
|
* @property {"applied" | "conflict" | "rejected"} status - Conflict decision.
|
|
16
14
|
* @property {string} strategy - Strategy that produced the decision.
|
|
17
15
|
*/
|
|
16
|
+
// @ts-check
|
|
17
|
+
const CONFLICT_STRATEGIES = new Set(["optimisticVersion", "serverWins", "lastWriterWins", "fieldThreeWay", "appendOnly"]);
|
|
18
18
|
/**
|
|
19
19
|
* Evaluates a replay mutation against server/base state using a sync conflict strategy.
|
|
20
20
|
* @param {object} args - Arguments.
|
|
@@ -212,4 +212,4 @@ function stableJsonStringify(value) {
|
|
|
212
212
|
}
|
|
213
213
|
return JSON.stringify(value);
|
|
214
214
|
}
|
|
215
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmxpY3Qtc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9jb25mbGljdC1zdHJhdGVneS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQTtBQUV6SDs7R0FFRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxFQUFDLFVBQVUsR0FBRyxJQUFJLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxZQUFZLEdBQUcsSUFBSSxFQUFFLFFBQVEsR0FBRyxtQkFBbUIsRUFBRSxnQkFBZ0IsR0FBRyxXQUFXLEVBQUM7SUFDekssSUFBSSxhQUFhO1FBQUUsT0FBTyx1QkFBdUIsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDbEosSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxRQUFRLEdBQUcsQ0FBQyxDQUFBO0lBRXZHLE1BQU0sa0JBQWtCLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFMUQsSUFBSSxRQUFRLEtBQUssWUFBWSxJQUFJLFFBQVEsS0FBSyxnQkFBZ0I7UUFBRSxPQUFPLEVBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFDLENBQUE7SUFDcEksSUFBSSxRQUFRLEtBQUssZUFBZTtRQUFFLE9BQU8sbUJB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QTtBQUNqRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsS0FBSztJQUNoQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUE7SUFDbEcsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksbUJBQW1CLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQTtJQUN0SyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuY29uc3QgQ09ORkxJQ1RfU1RSQVRFR0lFUyA9IG5ldyBTZXQoW1wib3B0aW1pc3RpY1ZlcnNpb25cIiwgXCJzZXJ2ZXJXaW5zXCIsIFwibGFzdFdyaXRlcldpbnNcIiwgXCJmaWVsZFRocmVlV2F5XCIsIFwiYXBwZW5kT25seVwiXSlcblxuLyoqXG4gKiBAdHlwZWRlZiB7bnVsbCB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmtub3duW10gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gU3luY0pzb25WYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY0NvbmZsaWN0UmVjb3JkXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSBhdHRyaWJ1dGVzIC0gUmVjb3JkIGF0dHJpYnV0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsfSBbdmVyc2lvbl0gLSBSZWNvcmQgdmVyc2lvbiB2YWx1ZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNDb25mbGljdFJlc3VsdFxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gW2F0dHJpYnV0ZXNdIC0gQXR0cmlidXRlcyB0byBhcHBseSB3aGVuIHJlcGxheSBtYXkgY29udGludWUuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSBbY29uZmxpY3RdIC0gU3RydWN0dXJlZCBjb25mbGljdCBwYXlsb2FkIGZvciB0aGUgY2xpZW50L2xvY2FsIGxvZy5cbiAqIEBwcm9wZXJ0eSB7XCJhcHBsaWVkXCIgfCBcImNvbmZsaWN0XCIgfCBcInJlamVjdGVkXCJ9IHN0YXR1cyAtIENvbmZsaWN0IGRlY2lzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0cmF0ZWd5IC0gU3RyYXRlZ3kgdGhhdCBwcm9kdWNlZCB0aGUgZGVjaXNpb24uXG4gKi9cblxuLyoqXG4gKiBFdmFsdWF0ZXMgYSByZXBsYXkgbXV0YXRpb24gYWdhaW5zdCBzZXJ2ZXIvYmFzZSBzdGF0ZSB1c2luZyBhIHN5bmMgY29uZmxpY3Qgc3RyYXRlZ3kuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7U3luY0NvbmZsaWN0UmVjb3JkIHwgbnVsbH0gW2FyZ3MuYmFzZVJlY29yZF0gLSBSZWNvcmQgc3RhdGUgb2JzZXJ2ZWQgd2hlbiB0aGUgbXV0YXRpb24gd2FzIG1hZGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKG9iamVjdCk6IChTeW5jQ29uZmxpY3RSZXN1bHQgfCBQcm9taXNlPFN5bmNDb25mbGljdFJlc3VsdD4pfSBbYXJncy5jdXN0b21IYW5kbGVyXSAtIFJlc291cmNlLXNwZWNpZmljIGNvbmZsaWN0IGhvb2suXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIFJlcGxheWVkIG11dGF0aW9uLlxuICogQHBhcmFtIHtTeW5jQ29uZmxpY3RSZWNvcmQgfCBudWxsfSBbYXJncy5zZXJ2ZXJSZWNvcmRdIC0gQ3VycmVudCBhdXRob3JpdGF0aXZlIHNlcnZlciByZWNvcmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Muc3RyYXRlZ3ldIC0gQ29uZmxpY3Qgc3RyYXRlZ3kuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudmVyc2lvbkF0dHJpYnV0ZV0gLSBBdHRyaWJ1dGUgdXNlZCBmb3Igb3B0aW1pc3RpYyB2ZXJzaW9uIGNoZWNrcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFN5bmNDb25mbGljdFJlc3VsdD59IC0gQ29uZmxpY3QgZGVjaXNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU3luY0NvbmZsaWN0KHtiYXNlUmVjb3JkID0gbnVsbCwgY3VzdG9tSGFuZGxlciwgbXV0YXRpb24sIHNlcnZlclJlY29yZCA9IG51bGwsIHN0cmF0ZWd5ID0gXCJvcHRpbWlzdGljVmVyc2lvblwiLCB2ZXJzaW9uQXR0cmlidXRlID0gXCJ1cGRhdGVkQXRcIn0pIHtcbiAgaWYgKGN1c3RvbUhhbmRsZXIpIHJldHVybiBub3JtYWxpemVDb25mbGljdFJlc3VsdChhd2FpdCBjdXN0b21IYW5kbGVyKHtiYXNlUmVjb3JkLCBtdXRhdGlvbiwgc2VydmVyUmVjb3JkLCBzdHJhdGVneSwgdmVyc2lvbkF0dHJpYnV0ZX0pLCBzdHJhdGVneSlcbiAgaWYgKCFDT05GTElDVF9TVFJBVEVHSUVTLmhhcyhzdHJhdGVneSkpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzeW5jIGNvbmZsaWN0IHN0cmF0ZWd5ICcke3N0cmF0ZWd5fSdgKVxuXG4gIGNvbnN0IG11dGF0aW9uQXR0cmlidXRlcyA9IG11dGF0aW9uQXR0cmlidXRlc0ZvcihtdXRhdGlvbilcblxuICBpZiAoc3RyYXRlZ3kgPT09IFwiYXBwZW5kT25seVwiIHx8IHN0cmF0ZWd5ID09PSBcImxhc3RXcml0ZXJXaW5zXCIpIHJldHVybiB7YXR0cmlidXRlczogbXV0YXRpb25BdHRyaWJ1dGVzLCBzdGF0dXM6IFwiYXBwbGllZFwiLCBzdHJhdGVneX1cbiAgaWYgKHN0cmF0ZWd5ID09PSBcImZpZWxkVGhyZWVXYXlcIikgcmV0dXJuIGZpZWxkVGhyZWVXYXlSZXN1bHQoe2Jhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSlcbiAgaWYgKGhhc1ZlcnNpb25Db25mbGljdCh7bXV0YXRpb24sIHNlcnZlclJlY29yZCwgdmVyc2lvbkF0dHJpYnV0ZX0pKSByZXR1cm4gY29uZmxpY3RSZXN1bHQoe2Jhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSlcblxuICByZXR1cm4ge2F0dHJpYnV0ZXM6IG11dGF0aW9uQXR0cmlidXRlcywgc3RhdHVzOiBcImFwcGxpZWRcIiwgc3RyYXRlZ3l9XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHNlcnZlciByZXBsYXkgcmVzdWx0IHRvIGEgbG9jYWwgbXV0YXRpb24tbG9nIHJlY29yZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5kZWZhdWx0fSBhcmdzLm11dGF0aW9uTG9nIC0gTG9jYWwgbXV0YXRpb24gbG9nLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkfSBhcmdzLnJlY29yZCAtIExvY2FsIG11dGF0aW9uLWxvZyByZWNvcmQuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSBhcmdzLnJlc3VsdCAtIFNlcnZlciByZXBsYXkgcmVzdWx0IHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkPn0gLSBVcGRhdGVkIGxvY2FsIHJlY29yZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5U3luY1JlcGxheVJlc3VsdFRvTG9jYWxNdXRhdGlvbkxvZyh7bXV0YXRpb25Mb2csIHJlY29yZCwgcmVzdWx0fSkge1xuICByZXR1cm4gYXdhaXQgbXV0YXRpb25Mb2cudXBkYXRlU3RhdHVzKHtcbiAgICBpZDogcmVjb3JkLmlkLFxuICAgIHN0YXR1czogcmVwbGF5UmVzdWx0TG9jYWxTdGF0dXMocmVzdWx0KSxcbiAgICBzeW5jUmVzdWx0OiByZXN1bHRcbiAgfSlcbn1cblxuLyoqXG4gKiBNYXBzIGEgc2VydmVyIHJlcGxheSByZXN1bHQgdG8gYSBsb2NhbCBtdXRhdGlvbi1sb2cgc3RhdHVzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gcmVzdWx0IC0gUmVwbGF5IHJlc3VsdC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uU3RhdHVzfSAtIExvY2FsIG11dGF0aW9uLWxvZyBzdGF0dXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYXlSZXN1bHRMb2NhbFN0YXR1cyhyZXN1bHQpIHtcbiAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiY29uZmxpY3RcIikgcmV0dXJuIFwiY29uZmxpY3RcIlxuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJlcnJvclwiIHx8IHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikgcmV0dXJuIFwicmVqZWN0ZWRcIlxuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIgJiYgcmVwbGF5UmVzdWx0SGFzRmFpbGVkQXBwbGljYXRpb24ocmVzdWx0KSkgcmV0dXJuIFwicmVqZWN0ZWRcIlxuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIgfHwgcmVzdWx0LnN0YXR1cyA9PT0gXCJhcHBsaWVkXCIgfHwgcmVzdWx0LnN0YXR1cyA9PT0gXCJkdXBsaWNhdGVcIikgcmV0dXJuIFwic3luY2VkXCJcblxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3luYyByZXBsYXkgcmVzdWx0IHN0YXR1cyAnJHtTdHJpbmcocmVzdWx0LnN0YXR1cyl9J2ApXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYW4gb3RoZXJ3aXNlIHN1Y2Nlc3NmdWwgcmVwbGF5IHJlc3VsdCBjb250YWlucyBhIGZhaWxlZFxuICogZnJvbnRlbmQtbW9kZWwgY29tbWFuZCBvciBjaGFuZ2UtZmVlZCB3cml0ZS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgU3luY0pzb25WYWx1ZT59IHJlc3VsdCAtIFJlcGxheSByZXN1bHQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBsb2NhbCBtdXRhdGlvbiBtdXN0IHN0YXkgdW5zeW5jZWQuXG4gKi9cbmZ1bmN0aW9uIHJlcGxheVJlc3VsdEhhc0ZhaWxlZEFwcGxpY2F0aW9uKHJlc3VsdCkge1xuICBpZiAocmVzdWx0LnNlcnZlclNlcXVlbmNlID09PSBudWxsIHx8IHJlc3VsdC5zZXJ2ZXJDaGFuZ2VGZWVkU3RhdHVzID09PSBcImVycm9yXCIpIHJldHVybiB0cnVlXG4gIGlmICghcmVzdWx0LnJlc3BvbnNlIHx8IHR5cGVvZiByZXN1bHQucmVzcG9uc2UgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShyZXN1bHQucmVzcG9uc2UpKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gKi8gKHJlc3VsdC5yZXNwb25zZSkuc3RhdHVzID09PSBcImVycm9yXCJcbn1cblxuLyoqXG4gKiBSdW5zIGEgZmllbGQtbGV2ZWwgdGhyZWUtd2F5IG1lcmdlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge1N5bmNDb25mbGljdFJlY29yZCB8IG51bGx9IGFyZ3MuYmFzZVJlY29yZCAtIEJhc2UgcmVjb3JkLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2RldmljZS1pZGVudGl0eS5qc1wiKS5TeW5jTXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBNdXRhdGlvbi5cbiAqIEBwYXJhbSB7U3luY0NvbmZsaWN0UmVjb3JkIHwgbnVsbH0gYXJncy5zZXJ2ZXJSZWNvcmQgLSBTZXJ2ZXIgcmVjb3JkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3RyYXRlZ3kgLSBTdHJhdGVneS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZlcnNpb25BdHRyaWJ1dGUgLSBWZXJzaW9uIGF0dHJpYnV0ZS5cbiAqIEByZXR1cm5zIHtTeW5jQ29uZmxpY3RSZXN1bHR9IC0gQ29uZmxpY3QgZGVjaXNpb24uXG4gKi9cbmZ1bmN0aW9uIGZpZWxkVGhyZWVXYXlSZXN1bHQoe2Jhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSkge1xuICBpZiAoIWJhc2VSZWNvcmQgfHwgIXNlcnZlclJlY29yZCkgcmV0dXJuIHthdHRyaWJ1dGVzOiBtdXRhdGlvbkF0dHJpYnV0ZXNGb3IobXV0YXRpb24pLCBzdGF0dXM6IFwiYXBwbGllZFwiLCBzdHJhdGVneX1cblxuICBjb25zdCBtdXRhdGlvbkF0dHJpYnV0ZXMgPSBtdXRhdGlvbkF0dHJpYnV0ZXNGb3IobXV0YXRpb24pXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IGFmZmVjdGVkRmllbGRzID0gW11cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gKi9cbiAgY29uc3QgbWVyZ2VkQXR0cmlidXRlcyA9IHt9XG5cbiAgZm9yIChjb25zdCBbZmllbGQsIGxvY2FsVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG11dGF0aW9uQXR0cmlidXRlcykpIHtcbiAgICBjb25zdCBiYXNlVmFsdWUgPSBiYXNlUmVjb3JkLmF0dHJpYnV0ZXNbZmllbGRdXG4gICAgY29uc3Qgc2VydmVyVmFsdWUgPSBzZXJ2ZXJSZWNvcmQuYXR0cmlidXRlc1tmaWVsZF1cblxuICAgIGlmIChqc29uVmFsdWVzRXF1YWwoc2VydmVyVmFsdWUsIGJhc2VWYWx1ZSkgfHwganNvblZhbHVlc0VxdWFsKHNlcnZlclZhbHVlLCBsb2NhbFZhbHVlKSkge1xuICAgICAgbWVyZ2VkQXR0cmlidXRlc1tmaWVsZF0gPSBsb2NhbFZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIGFmZmVjdGVkRmllbGRzLnB1c2goZmllbGQpXG4gICAgfVxuICB9XG5cbiAgaWYgKGFmZmVjdGVkRmllbGRzLmxlbmd0aCA+IDApIHJldHVybiBjb25mbGljdFJlc3VsdCh7YWZmZWN0ZWRGaWVsZHMsIGJhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSlcblxuICByZXR1cm4ge2F0dHJpYnV0ZXM6IG1lcmdlZEF0dHJpYnV0ZXMsIHN0YXR1czogXCJhcHBsaWVkXCIsIHN0cmF0ZWd5fVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGN1cnJlbnQgc2VydmVyIHN0YXRlIGNvbmZsaWN0cyB3aXRoIGEgbXV0YXRpb24gYmFzZSB2ZXJzaW9uLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uLlxuICogQHBhcmFtIHtTeW5jQ29uZmxpY3RSZWNvcmQgfCBudWxsfSBhcmdzLnNlcnZlclJlY29yZCAtIFNlcnZlciByZWNvcmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52ZXJzaW9uQXR0cmlidXRlIC0gVmVyc2lvbiBhdHRyaWJ1dGUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHZlcnNpb25zIGNvbmZsaWN0LlxuICovXG5mdW5jdGlvbiBoYXNWZXJzaW9uQ29uZmxpY3Qoe211dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHZlcnNpb25BdHRyaWJ1dGV9KSB7XG4gIGlmICghc2VydmVyUmVjb3JkKSByZXR1cm4gZmFsc2VcbiAgaWYgKG11dGF0aW9uLmJhc2VWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgbXV0YXRpb24uYmFzZVZlcnNpb24gPT09IG51bGwpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHNlcnZlclZlcnNpb24gPSBzZXJ2ZXJSZWNvcmQudmVyc2lvbiA/PyBzZXJ2ZXJSZWNvcmQuYXR0cmlidXRlc1t2ZXJzaW9uQXR0cmlidXRlXSA/PyBudWxsXG5cbiAgcmV0dXJuICFqc29uVmFsdWVzRXF1YWwoc2VydmVyVmVyc2lvbiwgbXV0YXRpb24uYmFzZVZlcnNpb24pXG59XG5cbi8qKlxuICogQnVpbGRzIGEgc3RydWN0dXJlZCBjb25mbGljdCByZXN1bHQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzLmFmZmVjdGVkRmllbGRzXSAtIEV4cGxpY2l0IGFmZmVjdGVkIGZpZWxkcy5cbiAqIEBwYXJhbSB7U3luY0NvbmZsaWN0UmVjb3JkIHwgbnVsbH0gYXJncy5iYXNlUmVjb3JkIC0gQmFzZSByZWNvcmQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uLlxuICogQHBhcmFtIHtTeW5jQ29uZmxpY3RSZWNvcmQgfCBudWxsfSBhcmdzLnNlcnZlclJlY29yZCAtIFNlcnZlciByZWNvcmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdHJhdGVneSAtIFN0cmF0ZWd5LlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudmVyc2lvbkF0dHJpYnV0ZSAtIFZlcnNpb24gYXR0cmlidXRlLlxuICogQHJldHVybnMge1N5bmNDb25mbGljdFJlc3VsdH0gLSBDb25mbGljdCByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGNvbmZsaWN0UmVzdWx0KHthZmZlY3RlZEZpZWxkcywgYmFzZVJlY29yZCwgbXV0YXRpb24sIHNlcnZlclJlY29yZCwgc3RyYXRlZ3ksIHZlcnNpb25BdHRyaWJ1dGV9KSB7XG4gIGNvbnN0IG11dGF0aW9uQXR0cmlidXRlcyA9IG11dGF0aW9uQXR0cmlidXRlc0ZvcihtdXRhdGlvbilcblxuICByZXR1cm4ge1xuICAgIGNvbmZsaWN0OiB7XG4gICAgICBhZmZlY3RlZEZpZWxkczogYWZmZWN0ZWRGaWVsZHMgfHwgT2JqZWN0LmtleXMobXV0YXRpb25BdHRyaWJ1dGVzKSxcbiAgICAgIGJhc2VSZWNvcmQ6IGJhc2VSZWNvcmQgPyBiYXNlUmVjb3JkLmF0dHJpYnV0ZXMgOiBudWxsLFxuICAgICAgYmFzZVZlcnNpb246IC8qKiBAdHlwZSB7U3luY0pzb25WYWx1ZX0gKi8gKG11dGF0aW9uLmJhc2VWZXJzaW9uID8/IG51bGwpLFxuICAgICAgbG9jYWxNdXRhdGlvbjoge1xuICAgICAgICBhdHRyaWJ1dGVzOiBtdXRhdGlvbkF0dHJpYnV0ZXMsXG4gICAgICAgIGNsaWVudE11dGF0aW9uSWQ6IG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsXG4gICAgICAgIG1vZGVsOiBtdXRhdGlvbi5tb2RlbCxcbiAgICAgICAgb3BlcmF0aW9uOiBtdXRhdGlvbi5vcGVyYXRpb24sXG4gICAgICAgIHBheWxvYWQ6IC8qKiBAdHlwZSB7U3luY0pzb25WYWx1ZX0gKi8gKG11dGF0aW9uLnBheWxvYWQgfHwgbnVsbClcbiAgICAgIH0sXG4gICAgICBzZXJ2ZXJNb2RlbDogc2VydmVyUmVjb3JkID8gc2VydmVyUmVjb3JkLmF0dHJpYnV0ZXMgOiBudWxsLFxuICAgICAgc2VydmVyVmVyc2lvbjogc2VydmVyUmVjb3JkID8gLyoqIEB0eXBlIHtTeW5jSnNvblZhbHVlfSAqLyAoc2VydmVyUmVjb3JkLnZlcnNpb24gPz8gc2VydmVyUmVjb3JkLmF0dHJpYnV0ZXNbdmVyc2lvbkF0dHJpYnV0ZV0gPz8gbnVsbCkgOiBudWxsLFxuICAgICAgc3VnZ2VzdGVkUmVzb2x1dGlvbjogc3RyYXRlZ3kgPT09IFwic2VydmVyV2luc1wiID8gXCJrZWVwX3NlcnZlclwiIDogXCJtYW51YWxcIixcbiAgICAgIHZlcnNpb25BdHRyaWJ1dGVcbiAgICB9LFxuICAgIHN0YXR1czogXCJjb25mbGljdFwiLFxuICAgIHN0cmF0ZWd5XG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgY3VzdG9tIHJlc291cmNlIGNvbmZsaWN0IHJlc3VsdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gcmVzdWx0IC0gUmF3IHJlc3VsdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJhdGVneSAtIFJlcXVlc3RlZCBzdHJhdGVneS5cbiAqIEByZXR1cm5zIHtTeW5jQ29uZmxpY3RSZXN1bHR9IC0gTm9ybWFsaXplZCByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbmZsaWN0UmVzdWx0KHJlc3VsdCwgc3RyYXRlZ3kpIHtcbiAgaWYgKCFyZXN1bHQgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHJlc3VsdCkpIHRocm93IG5ldyBFcnJvcihcIlN5bmMgY29uZmxpY3QgaGFuZGxlciBtdXN0IHJldHVybiBhbiBvYmplY3RcIilcbiAgY29uc3QgcmVzdWx0UmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHJlc3VsdClcbiAgaWYgKCFbXCJhcHBsaWVkXCIsIFwiY29uZmxpY3RcIiwgXCJyZWplY3RlZFwiXS5pbmNsdWRlcyhTdHJpbmcocmVzdWx0UmVjb3JkLnN0YXR1cykpKSB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIGNvbmZsaWN0IGhhbmRsZXIgcmV0dXJuZWQgYW4gdW5rbm93biBzdGF0dXNcIilcblxuICByZXR1cm4gLyoqIEB0eXBlIHtTeW5jQ29uZmxpY3RSZXN1bHR9ICovICh7c3RyYXRlZ3ksIC4uLnJlc3VsdFJlY29yZH0pXG59XG5cbi8qKlxuICogUmV0dXJucyBtdXRhdGlvbiBhdHRyaWJ1dGVzIGFzIGEgSlNPTiBvYmplY3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gbXV0YXRpb24gLSBNdXRhdGlvbi5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gLSBBdHRyaWJ1dGVzLlxuICovXG5mdW5jdGlvbiBtdXRhdGlvbkF0dHJpYnV0ZXNGb3IobXV0YXRpb24pIHtcbiAgaWYgKCFtdXRhdGlvbi5hdHRyaWJ1dGVzIHx8IHR5cGVvZiBtdXRhdGlvbi5hdHRyaWJ1dGVzICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobXV0YXRpb24uYXR0cmlidXRlcykpIHJldHVybiB7fVxuXG4gIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSAqLyAoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtdXRhdGlvbi5hdHRyaWJ1dGVzKSkpXG59XG5cbi8qKlxuICogQ29tcGFyZXMgSlNPTiB2YWx1ZXMgYnkgc3RhYmxlIHNlcmlhbGl6YXRpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IGxlZnQgLSBMZWZ0IHZhbHVlLlxuICogQHBhcmFtIHt1bmtub3dufSByaWdodCAtIFJpZ2h0IHZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB2YWx1ZXMgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIGpzb25WYWx1ZXNFcXVhbChsZWZ0LCByaWdodCkge1xuICByZXR1cm4gc3RhYmxlSnNvblN0cmluZ2lmeShsZWZ0KSA9PT0gc3RhYmxlSnNvblN0cmluZ2lmeShyaWdodClcbn1cblxuLyoqXG4gKiBTdGFibGUgSlNPTiBzdHJpbmdpZnkgaGVscGVyLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBTdGFibGUgSlNPTi5cbiAqL1xuZnVuY3Rpb24gc3RhYmxlSnNvblN0cmluZ2lmeSh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBgWyR7dmFsdWUubWFwKChlbnRyeSkgPT4gc3RhYmxlSnNvblN0cmluZ2lmeShlbnRyeSkpLmpvaW4oXCIsXCIpfV1gXG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gYHske09iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkubWFwKChrZXkpID0+IGAke0pTT04uc3RyaW5naWZ5KGtleSl9OiR7c3RhYmxlSnNvblN0cmluZ2lmeSgvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpW2tleV0pfWApLmpvaW4oXCIsXCIpfX1gXG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG59XG4iXX0=
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmxpY3Qtc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9jb25mbGljdC1zdHJhdGVneS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNIOzs7O0dBSUc7QUFDSDs7Ozs7O0dBTUc7QUFDSCxZQUFZO0FBRVosTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQTtBQUV6SDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxFQUFDLFVBQVUsR0FBRyxJQUFJLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxZQUFZLEdBQUcsSUFBSSxFQUFFLFFBQVEsR0FBRyxtQkFBbUIsRUFBRSxnQkFBZ0IsR0FBRyxXQUFXLEVBQUM7SUFDekssSUFBSSxhQUFhO1FBQUUsT0FBTyx1QkFBdUIsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDbEosSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxRQUFRLEdBQUcsQ0FBQyxDQUFBO0lBRXZHLE1BQU0sa0JBQWtCLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFMUQsSUFBSSxRQUFRLEtBQUssWUFBWSxJQUFJLFFBQVEsS0FBSyxnQkFBZ0I7UUFBRSxPQUFPLEVBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFDLENBQUE7SUFDcEksSUFBSSxRQUFRLEtBQUssZUFBZTtRQUFFLE9BQU8sbUJB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QTtBQUNqRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsS0FBSztJQUNoQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUE7SUFDbEcsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksbUJBQW1CLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQTtJQUN0SyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEB0eXBlZGVmIHtudWxsIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVua25vd25bXSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBTeW5jSnNvblZhbHVlXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY0NvbmZsaWN0UmVjb3JkXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSBhdHRyaWJ1dGVzIC0gUmVjb3JkIGF0dHJpYnV0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsfSBbdmVyc2lvbl0gLSBSZWNvcmQgdmVyc2lvbiB2YWx1ZS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jQ29uZmxpY3RSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgU3luY0pzb25WYWx1ZT59IFthdHRyaWJ1dGVzXSAtIEF0dHJpYnV0ZXMgdG8gYXBwbHkgd2hlbiByZXBsYXkgbWF5IGNvbnRpbnVlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gW2NvbmZsaWN0XSAtIFN0cnVjdHVyZWQgY29uZmxpY3QgcGF5bG9hZCBmb3IgdGhlIGNsaWVudC9sb2NhbCBsb2cuXG4gKiBAcHJvcGVydHkge1wiYXBwbGllZFwiIHwgXCJjb25mbGljdFwiIHwgXCJyZWplY3RlZFwifSBzdGF0dXMgLSBDb25mbGljdCBkZWNpc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdHJhdGVneSAtIFN0cmF0ZWd5IHRoYXQgcHJvZHVjZWQgdGhlIGRlY2lzaW9uLlxuICovXG4vLyBAdHMtY2hlY2tcblxuY29uc3QgQ09ORkxJQ1RfU1RSQVRFR0lFUyA9IG5ldyBTZXQoW1wib3B0aW1pc3RpY1ZlcnNpb25cIiwgXCJzZXJ2ZXJXaW5zXCIsIFwibGFzdFdyaXRlcldpbnNcIiwgXCJmaWVsZFRocmVlV2F5XCIsIFwiYXBwZW5kT25seVwiXSlcblxuLyoqXG4gKiBFdmFsdWF0ZXMgYSByZXBsYXkgbXV0YXRpb24gYWdhaW5zdCBzZXJ2ZXIvYmFzZSBzdGF0ZSB1c2luZyBhIHN5bmMgY29uZmxpY3Qgc3RyYXRlZ3kuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7U3luY0NvbmZsaWN0UmVjb3JkIHwgbnVsbH0gW2FyZ3MuYmFzZVJlY29yZF0gLSBSZWNvcmQgc3RhdGUgb2JzZXJ2ZWQgd2hlbiB0aGUgbXV0YXRpb24gd2FzIG1hZGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKG9iamVjdCk6IChTeW5jQ29uZmxpY3RSZXN1bHQgfCBQcm9taXNlPFN5bmNDb25mbGljdFJlc3VsdD4pfSBbYXJncy5jdXN0b21IYW5kbGVyXSAtIFJlc291cmNlLXNwZWNpZmljIGNvbmZsaWN0IGhvb2suXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIFJlcGxheWVkIG11dGF0aW9uLlxuICogQHBhcmFtIHtTeW5jQ29uZmxpY3RSZWNvcmQgfCBudWxsfSBbYXJncy5zZXJ2ZXJSZWNvcmRdIC0gQ3VycmVudCBhdXRob3JpdGF0aXZlIHNlcnZlciByZWNvcmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Muc3RyYXRlZ3ldIC0gQ29uZmxpY3Qgc3RyYXRlZ3kuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudmVyc2lvbkF0dHJpYnV0ZV0gLSBBdHRyaWJ1dGUgdXNlZCBmb3Igb3B0aW1pc3RpYyB2ZXJzaW9uIGNoZWNrcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFN5bmNDb25mbGljdFJlc3VsdD59IC0gQ29uZmxpY3QgZGVjaXNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU3luY0NvbmZsaWN0KHtiYXNlUmVjb3JkID0gbnVsbCwgY3VzdG9tSGFuZGxlciwgbXV0YXRpb24sIHNlcnZlclJlY29yZCA9IG51bGwsIHN0cmF0ZWd5ID0gXCJvcHRpbWlzdGljVmVyc2lvblwiLCB2ZXJzaW9uQXR0cmlidXRlID0gXCJ1cGRhdGVkQXRcIn0pIHtcbiAgaWYgKGN1c3RvbUhhbmRsZXIpIHJldHVybiBub3JtYWxpemVDb25mbGljdFJlc3VsdChhd2FpdCBjdXN0b21IYW5kbGVyKHtiYXNlUmVjb3JkLCBtdXRhdGlvbiwgc2VydmVyUmVjb3JkLCBzdHJhdGVneSwgdmVyc2lvbkF0dHJpYnV0ZX0pLCBzdHJhdGVneSlcbiAgaWYgKCFDT05GTElDVF9TVFJBVEVHSUVTLmhhcyhzdHJhdGVneSkpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzeW5jIGNvbmZsaWN0IHN0cmF0ZWd5ICcke3N0cmF0ZWd5fSdgKVxuXG4gIGNvbnN0IG11dGF0aW9uQXR0cmlidXRlcyA9IG11dGF0aW9uQXR0cmlidXRlc0ZvcihtdXRhdGlvbilcblxuICBpZiAoc3RyYXRlZ3kgPT09IFwiYXBwZW5kT25seVwiIHx8IHN0cmF0ZWd5ID09PSBcImxhc3RXcml0ZXJXaW5zXCIpIHJldHVybiB7YXR0cmlidXRlczogbXV0YXRpb25BdHRyaWJ1dGVzLCBzdGF0dXM6IFwiYXBwbGllZFwiLCBzdHJhdGVneX1cbiAgaWYgKHN0cmF0ZWd5ID09PSBcImZpZWxkVGhyZWVXYXlcIikgcmV0dXJuIGZpZWxkVGhyZWVXYXlSZXN1bHQoe2Jhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSlcbiAgaWYgKGhhc1ZlcnNpb25Db25mbGljdCh7bXV0YXRpb24sIHNlcnZlclJlY29yZCwgdmVyc2lvbkF0dHJpYnV0ZX0pKSByZXR1cm4gY29uZmxpY3RSZXN1bHQoe2Jhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSlcblxuICByZXR1cm4ge2F0dHJpYnV0ZXM6IG11dGF0aW9uQXR0cmlidXRlcywgc3RhdHVzOiBcImFwcGxpZWRcIiwgc3RyYXRlZ3l9XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHNlcnZlciByZXBsYXkgcmVzdWx0IHRvIGEgbG9jYWwgbXV0YXRpb24tbG9nIHJlY29yZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5kZWZhdWx0fSBhcmdzLm11dGF0aW9uTG9nIC0gTG9jYWwgbXV0YXRpb24gbG9nLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkfSBhcmdzLnJlY29yZCAtIExvY2FsIG11dGF0aW9uLWxvZyByZWNvcmQuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSBhcmdzLnJlc3VsdCAtIFNlcnZlciByZXBsYXkgcmVzdWx0IHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkPn0gLSBVcGRhdGVkIGxvY2FsIHJlY29yZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5U3luY1JlcGxheVJlc3VsdFRvTG9jYWxNdXRhdGlvbkxvZyh7bXV0YXRpb25Mb2csIHJlY29yZCwgcmVzdWx0fSkge1xuICByZXR1cm4gYXdhaXQgbXV0YXRpb25Mb2cudXBkYXRlU3RhdHVzKHtcbiAgICBpZDogcmVjb3JkLmlkLFxuICAgIHN0YXR1czogcmVwbGF5UmVzdWx0TG9jYWxTdGF0dXMocmVzdWx0KSxcbiAgICBzeW5jUmVzdWx0OiByZXN1bHRcbiAgfSlcbn1cblxuLyoqXG4gKiBNYXBzIGEgc2VydmVyIHJlcGxheSByZXN1bHQgdG8gYSBsb2NhbCBtdXRhdGlvbi1sb2cgc3RhdHVzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gcmVzdWx0IC0gUmVwbGF5IHJlc3VsdC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uU3RhdHVzfSAtIExvY2FsIG11dGF0aW9uLWxvZyBzdGF0dXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYXlSZXN1bHRMb2NhbFN0YXR1cyhyZXN1bHQpIHtcbiAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiY29uZmxpY3RcIikgcmV0dXJuIFwiY29uZmxpY3RcIlxuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJlcnJvclwiIHx8IHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikgcmV0dXJuIFwicmVqZWN0ZWRcIlxuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIgJiYgcmVwbGF5UmVzdWx0SGFzRmFpbGVkQXBwbGljYXRpb24ocmVzdWx0KSkgcmV0dXJuIFwicmVqZWN0ZWRcIlxuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIgfHwgcmVzdWx0LnN0YXR1cyA9PT0gXCJhcHBsaWVkXCIgfHwgcmVzdWx0LnN0YXR1cyA9PT0gXCJkdXBsaWNhdGVcIikgcmV0dXJuIFwic3luY2VkXCJcblxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3luYyByZXBsYXkgcmVzdWx0IHN0YXR1cyAnJHtTdHJpbmcocmVzdWx0LnN0YXR1cyl9J2ApXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYW4gb3RoZXJ3aXNlIHN1Y2Nlc3NmdWwgcmVwbGF5IHJlc3VsdCBjb250YWlucyBhIGZhaWxlZFxuICogZnJvbnRlbmQtbW9kZWwgY29tbWFuZCBvciBjaGFuZ2UtZmVlZCB3cml0ZS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgU3luY0pzb25WYWx1ZT59IHJlc3VsdCAtIFJlcGxheSByZXN1bHQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBsb2NhbCBtdXRhdGlvbiBtdXN0IHN0YXkgdW5zeW5jZWQuXG4gKi9cbmZ1bmN0aW9uIHJlcGxheVJlc3VsdEhhc0ZhaWxlZEFwcGxpY2F0aW9uKHJlc3VsdCkge1xuICBpZiAocmVzdWx0LnNlcnZlclNlcXVlbmNlID09PSBudWxsIHx8IHJlc3VsdC5zZXJ2ZXJDaGFuZ2VGZWVkU3RhdHVzID09PSBcImVycm9yXCIpIHJldHVybiB0cnVlXG4gIGlmICghcmVzdWx0LnJlc3BvbnNlIHx8IHR5cGVvZiByZXN1bHQucmVzcG9uc2UgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShyZXN1bHQucmVzcG9uc2UpKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gKi8gKHJlc3VsdC5yZXNwb25zZSkuc3RhdHVzID09PSBcImVycm9yXCJcbn1cblxuLyoqXG4gKiBSdW5zIGEgZmllbGQtbGV2ZWwgdGhyZWUtd2F5IG1lcmdlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge1N5bmNDb25mbGljdFJlY29yZCB8IG51bGx9IGFyZ3MuYmFzZVJlY29yZCAtIEJhc2UgcmVjb3JkLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2RldmljZS1pZGVudGl0eS5qc1wiKS5TeW5jTXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBNdXRhdGlvbi5cbiAqIEBwYXJhbSB7U3luY0NvbmZsaWN0UmVjb3JkIHwgbnVsbH0gYXJncy5zZXJ2ZXJSZWNvcmQgLSBTZXJ2ZXIgcmVjb3JkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3RyYXRlZ3kgLSBTdHJhdGVneS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZlcnNpb25BdHRyaWJ1dGUgLSBWZXJzaW9uIGF0dHJpYnV0ZS5cbiAqIEByZXR1cm5zIHtTeW5jQ29uZmxpY3RSZXN1bHR9IC0gQ29uZmxpY3QgZGVjaXNpb24uXG4gKi9cbmZ1bmN0aW9uIGZpZWxkVGhyZWVXYXlSZXN1bHQoe2Jhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSkge1xuICBpZiAoIWJhc2VSZWNvcmQgfHwgIXNlcnZlclJlY29yZCkgcmV0dXJuIHthdHRyaWJ1dGVzOiBtdXRhdGlvbkF0dHJpYnV0ZXNGb3IobXV0YXRpb24pLCBzdGF0dXM6IFwiYXBwbGllZFwiLCBzdHJhdGVneX1cblxuICBjb25zdCBtdXRhdGlvbkF0dHJpYnV0ZXMgPSBtdXRhdGlvbkF0dHJpYnV0ZXNGb3IobXV0YXRpb24pXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IGFmZmVjdGVkRmllbGRzID0gW11cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gKi9cbiAgY29uc3QgbWVyZ2VkQXR0cmlidXRlcyA9IHt9XG5cbiAgZm9yIChjb25zdCBbZmllbGQsIGxvY2FsVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG11dGF0aW9uQXR0cmlidXRlcykpIHtcbiAgICBjb25zdCBiYXNlVmFsdWUgPSBiYXNlUmVjb3JkLmF0dHJpYnV0ZXNbZmllbGRdXG4gICAgY29uc3Qgc2VydmVyVmFsdWUgPSBzZXJ2ZXJSZWNvcmQuYXR0cmlidXRlc1tmaWVsZF1cblxuICAgIGlmIChqc29uVmFsdWVzRXF1YWwoc2VydmVyVmFsdWUsIGJhc2VWYWx1ZSkgfHwganNvblZhbHVlc0VxdWFsKHNlcnZlclZhbHVlLCBsb2NhbFZhbHVlKSkge1xuICAgICAgbWVyZ2VkQXR0cmlidXRlc1tmaWVsZF0gPSBsb2NhbFZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIGFmZmVjdGVkRmllbGRzLnB1c2goZmllbGQpXG4gICAgfVxuICB9XG5cbiAgaWYgKGFmZmVjdGVkRmllbGRzLmxlbmd0aCA+IDApIHJldHVybiBjb25mbGljdFJlc3VsdCh7YWZmZWN0ZWRGaWVsZHMsIGJhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSlcblxuICByZXR1cm4ge2F0dHJpYnV0ZXM6IG1lcmdlZEF0dHJpYnV0ZXMsIHN0YXR1czogXCJhcHBsaWVkXCIsIHN0cmF0ZWd5fVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGN1cnJlbnQgc2VydmVyIHN0YXRlIGNvbmZsaWN0cyB3aXRoIGEgbXV0YXRpb24gYmFzZSB2ZXJzaW9uLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uLlxuICogQHBhcmFtIHtTeW5jQ29uZmxpY3RSZWNvcmQgfCBudWxsfSBhcmdzLnNlcnZlclJlY29yZCAtIFNlcnZlciByZWNvcmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52ZXJzaW9uQXR0cmlidXRlIC0gVmVyc2lvbiBhdHRyaWJ1dGUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHZlcnNpb25zIGNvbmZsaWN0LlxuICovXG5mdW5jdGlvbiBoYXNWZXJzaW9uQ29uZmxpY3Qoe211dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHZlcnNpb25BdHRyaWJ1dGV9KSB7XG4gIGlmICghc2VydmVyUmVjb3JkKSByZXR1cm4gZmFsc2VcbiAgaWYgKG11dGF0aW9uLmJhc2VWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgbXV0YXRpb24uYmFzZVZlcnNpb24gPT09IG51bGwpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHNlcnZlclZlcnNpb24gPSBzZXJ2ZXJSZWNvcmQudmVyc2lvbiA/PyBzZXJ2ZXJSZWNvcmQuYXR0cmlidXRlc1t2ZXJzaW9uQXR0cmlidXRlXSA/PyBudWxsXG5cbiAgcmV0dXJuICFqc29uVmFsdWVzRXF1YWwoc2VydmVyVmVyc2lvbiwgbXV0YXRpb24uYmFzZVZlcnNpb24pXG59XG5cbi8qKlxuICogQnVpbGRzIGEgc3RydWN0dXJlZCBjb25mbGljdCByZXN1bHQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzLmFmZmVjdGVkRmllbGRzXSAtIEV4cGxpY2l0IGFmZmVjdGVkIGZpZWxkcy5cbiAqIEBwYXJhbSB7U3luY0NvbmZsaWN0UmVjb3JkIHwgbnVsbH0gYXJncy5iYXNlUmVjb3JkIC0gQmFzZSByZWNvcmQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uLlxuICogQHBhcmFtIHtTeW5jQ29uZmxpY3RSZWNvcmQgfCBudWxsfSBhcmdzLnNlcnZlclJlY29yZCAtIFNlcnZlciByZWNvcmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdHJhdGVneSAtIFN0cmF0ZWd5LlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudmVyc2lvbkF0dHJpYnV0ZSAtIFZlcnNpb24gYXR0cmlidXRlLlxuICogQHJldHVybnMge1N5bmNDb25mbGljdFJlc3VsdH0gLSBDb25mbGljdCByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGNvbmZsaWN0UmVzdWx0KHthZmZlY3RlZEZpZWxkcywgYmFzZVJlY29yZCwgbXV0YXRpb24sIHNlcnZlclJlY29yZCwgc3RyYXRlZ3ksIHZlcnNpb25BdHRyaWJ1dGV9KSB7XG4gIGNvbnN0IG11dGF0aW9uQXR0cmlidXRlcyA9IG11dGF0aW9uQXR0cmlidXRlc0ZvcihtdXRhdGlvbilcblxuICByZXR1cm4ge1xuICAgIGNvbmZsaWN0OiB7XG4gICAgICBhZmZlY3RlZEZpZWxkczogYWZmZWN0ZWRGaWVsZHMgfHwgT2JqZWN0LmtleXMobXV0YXRpb25BdHRyaWJ1dGVzKSxcbiAgICAgIGJhc2VSZWNvcmQ6IGJhc2VSZWNvcmQgPyBiYXNlUmVjb3JkLmF0dHJpYnV0ZXMgOiBudWxsLFxuICAgICAgYmFzZVZlcnNpb246IC8qKiBAdHlwZSB7U3luY0pzb25WYWx1ZX0gKi8gKG11dGF0aW9uLmJhc2VWZXJzaW9uID8/IG51bGwpLFxuICAgICAgbG9jYWxNdXRhdGlvbjoge1xuICAgICAgICBhdHRyaWJ1dGVzOiBtdXRhdGlvbkF0dHJpYnV0ZXMsXG4gICAgICAgIGNsaWVudE11dGF0aW9uSWQ6IG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsXG4gICAgICAgIG1vZGVsOiBtdXRhdGlvbi5tb2RlbCxcbiAgICAgICAgb3BlcmF0aW9uOiBtdXRhdGlvbi5vcGVyYXRpb24sXG4gICAgICAgIHBheWxvYWQ6IC8qKiBAdHlwZSB7U3luY0pzb25WYWx1ZX0gKi8gKG11dGF0aW9uLnBheWxvYWQgfHwgbnVsbClcbiAgICAgIH0sXG4gICAgICBzZXJ2ZXJNb2RlbDogc2VydmVyUmVjb3JkID8gc2VydmVyUmVjb3JkLmF0dHJpYnV0ZXMgOiBudWxsLFxuICAgICAgc2VydmVyVmVyc2lvbjogc2VydmVyUmVjb3JkID8gLyoqIEB0eXBlIHtTeW5jSnNvblZhbHVlfSAqLyAoc2VydmVyUmVjb3JkLnZlcnNpb24gPz8gc2VydmVyUmVjb3JkLmF0dHJpYnV0ZXNbdmVyc2lvbkF0dHJpYnV0ZV0gPz8gbnVsbCkgOiBudWxsLFxuICAgICAgc3VnZ2VzdGVkUmVzb2x1dGlvbjogc3RyYXRlZ3kgPT09IFwic2VydmVyV2luc1wiID8gXCJrZWVwX3NlcnZlclwiIDogXCJtYW51YWxcIixcbiAgICAgIHZlcnNpb25BdHRyaWJ1dGVcbiAgICB9LFxuICAgIHN0YXR1czogXCJjb25mbGljdFwiLFxuICAgIHN0cmF0ZWd5XG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgY3VzdG9tIHJlc291cmNlIGNvbmZsaWN0IHJlc3VsdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gcmVzdWx0IC0gUmF3IHJlc3VsdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJhdGVneSAtIFJlcXVlc3RlZCBzdHJhdGVneS5cbiAqIEByZXR1cm5zIHtTeW5jQ29uZmxpY3RSZXN1bHR9IC0gTm9ybWFsaXplZCByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbmZsaWN0UmVzdWx0KHJlc3VsdCwgc3RyYXRlZ3kpIHtcbiAgaWYgKCFyZXN1bHQgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHJlc3VsdCkpIHRocm93IG5ldyBFcnJvcihcIlN5bmMgY29uZmxpY3QgaGFuZGxlciBtdXN0IHJldHVybiBhbiBvYmplY3RcIilcbiAgY29uc3QgcmVzdWx0UmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHJlc3VsdClcbiAgaWYgKCFbXCJhcHBsaWVkXCIsIFwiY29uZmxpY3RcIiwgXCJyZWplY3RlZFwiXS5pbmNsdWRlcyhTdHJpbmcocmVzdWx0UmVjb3JkLnN0YXR1cykpKSB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIGNvbmZsaWN0IGhhbmRsZXIgcmV0dXJuZWQgYW4gdW5rbm93biBzdGF0dXNcIilcblxuICByZXR1cm4gLyoqIEB0eXBlIHtTeW5jQ29uZmxpY3RSZXN1bHR9ICovICh7c3RyYXRlZ3ksIC4uLnJlc3VsdFJlY29yZH0pXG59XG5cbi8qKlxuICogUmV0dXJucyBtdXRhdGlvbiBhdHRyaWJ1dGVzIGFzIGEgSlNPTiBvYmplY3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gbXV0YXRpb24gLSBNdXRhdGlvbi5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gLSBBdHRyaWJ1dGVzLlxuICovXG5mdW5jdGlvbiBtdXRhdGlvbkF0dHJpYnV0ZXNGb3IobXV0YXRpb24pIHtcbiAgaWYgKCFtdXRhdGlvbi5hdHRyaWJ1dGVzIHx8IHR5cGVvZiBtdXRhdGlvbi5hdHRyaWJ1dGVzICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobXV0YXRpb24uYXR0cmlidXRlcykpIHJldHVybiB7fVxuXG4gIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSAqLyAoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtdXRhdGlvbi5hdHRyaWJ1dGVzKSkpXG59XG5cbi8qKlxuICogQ29tcGFyZXMgSlNPTiB2YWx1ZXMgYnkgc3RhYmxlIHNlcmlhbGl6YXRpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IGxlZnQgLSBMZWZ0IHZhbHVlLlxuICogQHBhcmFtIHt1bmtub3dufSByaWdodCAtIFJpZ2h0IHZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB2YWx1ZXMgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIGpzb25WYWx1ZXNFcXVhbChsZWZ0LCByaWdodCkge1xuICByZXR1cm4gc3RhYmxlSnNvblN0cmluZ2lmeShsZWZ0KSA9PT0gc3RhYmxlSnNvblN0cmluZ2lmeShyaWdodClcbn1cblxuLyoqXG4gKiBTdGFibGUgSlNPTiBzdHJpbmdpZnkgaGVscGVyLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBTdGFibGUgSlNPTi5cbiAqL1xuZnVuY3Rpb24gc3RhYmxlSnNvblN0cmluZ2lmeSh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBgWyR7dmFsdWUubWFwKChlbnRyeSkgPT4gc3RhYmxlSnNvblN0cmluZ2lmeShlbnRyeSkpLmpvaW4oXCIsXCIpfV1gXG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gYHske09iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkubWFwKChrZXkpID0+IGAke0pTT04uc3RyaW5naWZ5KGtleSl9OiR7c3RhYmxlSnNvblN0cmluZ2lmeSgvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpW2tleV0pfWApLmpvaW4oXCIsXCIpfX1gXG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG59XG4iXX0=
|
|
@@ -1,48 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* JSON Web Key used by the sync signing helpers.
|
|
3
|
-
* @typedef {import("node:crypto").webcrypto.JsonWebKey} SyncJsonWebKey
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Backend-signed device certificate payload.
|
|
7
|
-
* @typedef {object} DeviceCertificatePayload
|
|
8
|
-
* @property {string} actorDeviceId - Device id allowed to sign mutations.
|
|
9
|
-
* @property {string} actorUserId - User id represented by the device.
|
|
10
|
-
* @property {string} certificateId - Certificate id.
|
|
11
|
-
* @property {SyncJsonWebKey} devicePublicKey - Device public key peers/backends use to verify mutations.
|
|
12
|
-
* @property {string} expiresAt - ISO timestamp after which the certificate is invalid.
|
|
13
|
-
* @property {string} issuedAt - ISO timestamp when the backend issued the certificate.
|
|
14
|
-
*/
|
|
15
|
-
/**
|
|
16
|
-
* Backend-signed device certificate envelope.
|
|
17
|
-
* @typedef {object} DeviceCertificate
|
|
18
|
-
* @property {"ECDSA-P256-SHA256"} algorithm - Signature algorithm.
|
|
19
|
-
* @property {DeviceCertificatePayload} certificate - Certificate payload.
|
|
20
|
-
* @property {string} signature - Backend signature over the certificate payload.
|
|
21
|
-
*/
|
|
22
|
-
/**
|
|
23
|
-
* Sync mutation payload signed by a device.
|
|
24
|
-
* @typedef {object} SyncMutation
|
|
25
|
-
* @property {string} actorDeviceId - Device that signed the mutation.
|
|
26
|
-
* @property {string} actorUserId - User represented by the signing device.
|
|
27
|
-
* @property {Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue>} [attributes] - Model attributes for CRUD mutations.
|
|
28
|
-
* @property {string | number | null} [baseVersion] - Base server/client version.
|
|
29
|
-
* @property {string} clientMutationId - Device-local idempotency id.
|
|
30
|
-
* @property {string} [command] - Domain command name for command mutations.
|
|
31
|
-
* @property {string} model - Sync model/resource name.
|
|
32
|
-
* @property {string} occurredAt - ISO timestamp when the mutation occurred.
|
|
33
|
-
* @property {string} offlineGrantId - Offline grant id authorizing the mutation.
|
|
34
|
-
* @property {string} operation - CRUD operation or command operation.
|
|
35
|
-
* @property {Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue>} [payload] - Domain command payload.
|
|
36
|
-
* @property {string} policyHash - Sync policy hash the mutation was checked against.
|
|
37
|
-
*/
|
|
38
|
-
/**
|
|
39
|
-
* Device-signed mutation envelope.
|
|
40
|
-
* @typedef {object} SignedSyncMutation
|
|
41
|
-
* @property {"ECDSA-P256-SHA256"} algorithm - Signature algorithm.
|
|
42
|
-
* @property {DeviceCertificate} deviceCertificate - Backend-signed device certificate.
|
|
43
|
-
* @property {SyncMutation} mutation - Mutation payload.
|
|
44
|
-
* @property {string} signature - Device signature over the mutation envelope.
|
|
45
|
-
*/
|
|
46
1
|
/**
|
|
47
2
|
* Generates an ECDSA P-256 keypair exported as JWKs.
|
|
48
3
|
* @returns {Promise<{privateKey: SyncJsonWebKey, publicKey: SyncJsonWebKey}>} - Exported keypair.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-identity.d.ts","sourceRoot":"","sources":["../../../src/sync/device-identity.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"device-identity.d.ts","sourceRoot":"","sources":["../../../src/sync/device-identity.js"],"names":[],"mappings":"AAkDA;;;GAGG;AACH,8CAFa,OAAO,CAAC;IAAC,UAAU,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAC,CAAC,CAa5E;AAED;;;;;;GAMG;AACH,4EAJG;IAA6B,iBAAiB,EAAtC,cAAc;IACiB,WAAW,EAA1C,wBAAwB;CAChC,GAAU,OAAO,CAAC,iBAAiB,CAAC,CAatC;AAED;;;;;;;GAOG;AACH,gFALG;IAA6B,gBAAgB,EAArC,cAAc;IACU,WAAW,EAAnC,iBAAiB;IACL,GAAG;CACvB,GAAU,OAAO,CAAC,wBAAwB,CAAC,CAc7C;AAED;;;;;;;GAOG;AACH,wFALG;IAAgC,iBAAiB,EAAzC,iBAAiB;IACI,gBAAgB,EAArC,cAAc;IACK,QAAQ,EAA3B,YAAY;CACpB,GAAU,OAAO,CAAC,kBAAkB,CAAC,CAoBvC;AAED;;;;;;;GAOG;AACH,gFALG;IAA6B,gBAAgB,EAArC,cAAc;IACF,GAAG;IACU,cAAc,EAAvC,kBAAkB;CAC1B,GAAU,OAAO,CAAC,YAAY,CAAC,CAwBjC;AAED;;;;GAIG;AACH,uDAHW;IAAC,QAAQ,EAAE;QAAC,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAC,CAAA;CAAC,GACtF,MAAM,CAUlB;;;;6BApLY,OAAO,aAAa,EAAE,SAAS,CAAC,UAAU;;;;;;;;mBAKzC,MAAM;;;;iBACN,MAAM;;;;mBACN,MAAM;;;;qBACN,cAAc;;;;eACd,MAAM;;;;cACN,MAAM;;;;;;;;;eAKN,mBAAmB;;;;iBACnB,wBAAwB;;;;eACxB,MAAM;;;;;;;;;mBAKN,MAAM;;;;iBACN,MAAM;;;;;;;;;;;;sBAGN,MAAM;;;;;;;;WAEN,MAAM;;;;gBACN,MAAM;;;;oBACN,MAAM;;;;eACN,MAAM;;;;;;;;gBAEN,MAAM;;;;;;;;;eAKN,mBAAmB;;;;uBACnB,iBAAiB;;;;cACjB,YAAY;;;;eACZ,MAAM"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
// @ts-check
|
|
2
|
-
const ECDSA_P256_SHA256_ALGORITHM = "ECDSA-P256-SHA256";
|
|
3
|
-
const ECDSA_P256_SHA256_SIGNATURE_PREFIX = "ecdsa-p256-sha256-";
|
|
4
1
|
/**
|
|
5
2
|
* JSON Web Key used by the sync signing helpers.
|
|
6
3
|
* @typedef {import("node:crypto").webcrypto.JsonWebKey} SyncJsonWebKey
|
|
@@ -46,6 +43,9 @@ const ECDSA_P256_SHA256_SIGNATURE_PREFIX = "ecdsa-p256-sha256-";
|
|
|
46
43
|
* @property {SyncMutation} mutation - Mutation payload.
|
|
47
44
|
* @property {string} signature - Device signature over the mutation envelope.
|
|
48
45
|
*/
|
|
46
|
+
// @ts-check
|
|
47
|
+
const ECDSA_P256_SHA256_ALGORITHM = "ECDSA-P256-SHA256";
|
|
48
|
+
const ECDSA_P256_SHA256_SIGNATURE_PREFIX = "ecdsa-p256-sha256-";
|
|
49
49
|
/**
|
|
50
50
|
* Generates an ECDSA P-256 keypair exported as JWKs.
|
|
51
51
|
* @returns {Promise<{privateKey: SyncJsonWebKey, publicKey: SyncJsonWebKey}>} - Exported keypair.
|
|
@@ -451,4 +451,4 @@ function deterministicJson({ label, value }) {
|
|
|
451
451
|
}
|
|
452
452
|
throw new Error(`Sync ${label} must be deterministic JSON`);
|
|
453
453
|
}
|
|
454
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWlkZW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvZGV2aWNlLWlkZW50aXR5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixNQUFNLDJCQUEyQixHQUFHLG1CQUFtQixDQUFBO0FBQ3ZELE1BQU0sa0NBQWtDLEdBQUcsb0JBQW9CLENBQUE7QUFFL0Q7OztHQUdHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCO0lBQzlDLE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxFQUFFLENBQUMsV0FBVyxDQUM5QyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBQyxFQUNwQyxJQUFJLEVBQ0osQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQ25CLENBQUE7SUFFRCxPQUFPO1FBQ0wsVUFBVSxFQUFFLE1BQU0sWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3JFLFNBQVMsRUFBRSxNQUFNLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQztLQUNwRSxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQUMsRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUM7SUFDNUUsTUFBTSxxQkFBcUIsR0FBRyxpQ0FBaUMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUU1RSxPQUFPO1FBQ0wsU0FBUyxFQUFFLDJCQUEyQjtRQUN0QyxXQUFXLEVBQUUscUJBQXFCO1FBQ2xDLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztZQUM5QixVQUFVLEVB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QU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFVBQVUsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBRXRFLElBQUksVUFBVSxLQUFLLFNBQVM7Z0JBQUUsU0FBUTtZQUN0QyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsRUFBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7UUFDcEYsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyw2QkFBNkIsQ0FBQyxDQUFBO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuY29uc3QgRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNID0gXCJFQ0RTQS1QMjU2LVNIQTI1NlwiXG5jb25zdCBFQ0RTQV9QMjU2X1NIQTI1Nl9TSUdOQVRVUkVfUFJFRklYID0gXCJlY2RzYS1wMjU2LXNoYTI1Ni1cIlxuXG4vKipcbiAqIEpTT04gV2ViIEtleSB1c2VkIGJ5IHRoZSBzeW5jIHNpZ25pbmcgaGVscGVycy5cbiAqIEB0eXBlZGVmIHtpbXBvcnQoXCJub2RlOmNyeXB0b1wiKS53ZWJjcnlwdG8uSnNvbldlYktleX0gU3luY0pzb25XZWJLZXlcbiAqL1xuXG4vKipcbiAqIEJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICogQHR5cGVkZWYge29iamVjdH0gRGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0b3JEZXZpY2VJZCAtIERldmljZSBpZCBhbGxvd2VkIHRvIHNpZ24gbXV0YXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdG9yVXNlcklkIC0gVXNlciBpZCByZXByZXNlbnRlZCBieSB0aGUgZGV2aWNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNlcnRpZmljYXRlSWQgLSBDZXJ0aWZpY2F0ZSBpZC5cbiAqIEBwcm9wZXJ0eSB7U3luY0pzb25XZWJLZXl9IGRldmljZVB1YmxpY0tleSAtIERldmljZSBwdWJsaWMga2V5IHBlZXJzL2JhY2tlbmRzIHVzZSB0byB2ZXJpZnkgbXV0YXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4cGlyZXNBdCAtIElTTyB0aW1lc3RhbXAgYWZ0ZXIgd2hpY2ggdGhlIGNlcnRpZmljYXRlIGlzIGludmFsaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaXNzdWVkQXQgLSBJU08gdGltZXN0YW1wIHdoZW4gdGhlIGJhY2tlbmQgaXNzdWVkIHRoZSBjZXJ0aWZpY2F0ZS5cbiAqL1xuXG4vKipcbiAqIEJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZSBlbnZlbG9wZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERldmljZUNlcnRpZmljYXRlXG4gKiBAcHJvcGVydHkge1wiRUNEU0EtUDI1Ni1TSEEyNTZcIn0gYWxnb3JpdGhtIC0gU2lnbmF0dXJlIGFsZ29yaXRobS5cbiAqIEBwcm9wZXJ0eSB7RGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkfSBjZXJ0aWZpY2F0ZSAtIENlcnRpZmljYXRlIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2lnbmF0dXJlIC0gQmFja2VuZCBzaWduYXR1cmUgb3ZlciB0aGUgY2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqL1xuXG4vKipcbiAqIFN5bmMgbXV0YXRpb24gcGF5bG9hZCBzaWduZWQgYnkgYSBkZXZpY2UuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jTXV0YXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3RvckRldmljZUlkIC0gRGV2aWNlIHRoYXQgc2lnbmVkIHRoZSBtdXRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3RvclVzZXJJZCAtIFVzZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHNpZ25pbmcgZGV2aWNlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gW2F0dHJpYnV0ZXNdIC0gTW9kZWwgYXR0cmlidXRlcyBmb3IgQ1JVRCBtdXRhdGlvbnMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bWJlciB8IG51bGx9IFtiYXNlVmVyc2lvbl0gLSBCYXNlIHNlcnZlci9jbGllbnQgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGllbnRNdXRhdGlvbklkIC0gRGV2aWNlLWxvY2FsIGlkZW1wb3RlbmN5IGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb21tYW5kXSAtIERvbWFpbiBjb21tYW5kIG5hbWUgZm9yIGNvbW1hbmQgbXV0YXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsIC0gU3luYyBtb2RlbC9yZXNvdXJjZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9jY3VycmVkQXQgLSBJU08gdGltZXN0YW1wIHdoZW4gdGhlIG11dGF0aW9uIG9jY3VycmVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9mZmxpbmVHcmFudElkIC0gT2ZmbGluZSBncmFudCBpZCBhdXRob3JpemluZyB0aGUgbXV0YXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gQ1JVRCBvcGVyYXRpb24gb3IgY29tbWFuZCBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSBbcGF5bG9hZF0gLSBEb21haW4gY29tbWFuZCBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBvbGljeUhhc2ggLSBTeW5jIHBvbGljeSBoYXNoIHRoZSBtdXRhdGlvbiB3YXMgY2hlY2tlZCBhZ2FpbnN0LlxuICovXG5cbi8qKlxuICogRGV2aWNlLXNpZ25lZCBtdXRhdGlvbiBlbnZlbG9wZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNpZ25lZFN5bmNNdXRhdGlvblxuICogQHByb3BlcnR5IHtcIkVDRFNBLVAyNTYtU0hBMjU2XCJ9IGFsZ29yaXRobSAtIFNpZ25hdHVyZSBhbGdvcml0aG0uXG4gKiBAcHJvcGVydHkge0RldmljZUNlcnRpZmljYXRlfSBkZXZpY2VDZXJ0aWZpY2F0ZSAtIEJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZS5cbiAqIEBwcm9wZXJ0eSB7U3luY011dGF0aW9ufSBtdXRhdGlvbiAtIE11dGF0aW9uIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2lnbmF0dXJlIC0gRGV2aWNlIHNpZ25hdHVyZSBvdmVyIHRoZSBtdXRhdGlvbiBlbnZlbG9wZS5cbiAqL1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhbiBFQ0RTQSBQLTI1NiBrZXlwYWlyIGV4cG9ydGVkIGFzIEpXS3MuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7cHJpdmF0ZUtleTogU3luY0pzb25XZWJLZXksIHB1YmxpY0tleTogU3luY0pzb25XZWJLZXl9Pn0gLSBFeHBvcnRlZCBrZXlwYWlyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTeW5jU2lnbmluZ0tleVBhaXIoKSB7XG4gIGNvbnN0IGtleVBhaXIgPSBhd2FpdCBjcnlwdG9TdWJ0bGUoKS5nZW5lcmF0ZUtleShcbiAgICB7bmFtZTogXCJFQ0RTQVwiLCBuYW1lZEN1cnZlOiBcIlAtMjU2XCJ9LFxuICAgIHRydWUsXG4gICAgW1wic2lnblwiLCBcInZlcmlmeVwiXVxuICApXG5cbiAgcmV0dXJuIHtcbiAgICBwcml2YXRlS2V5OiBhd2FpdCBjcnlwdG9TdWJ0bGUoKS5leHBvcnRLZXkoXCJqd2tcIiwga2V5UGFpci5wcml2YXRlS2V5KSxcbiAgICBwdWJsaWNLZXk6IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmV4cG9ydEtleShcImp3a1wiLCBrZXlQYWlyLnB1YmxpY0tleSlcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBiYWNrZW5kLXNpZ25lZCBkZXZpY2UgY2VydGlmaWNhdGUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7U3luY0pzb25XZWJLZXl9IGFyZ3MuYmFja2VuZFByaXZhdGVLZXkgLSBCYWNrZW5kIHByaXZhdGUgc2lnbmluZyBrZXkuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlUGF5bG9hZH0gYXJncy5jZXJ0aWZpY2F0ZSAtIENlcnRpZmljYXRlIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxEZXZpY2VDZXJ0aWZpY2F0ZT59IC0gU2lnbmVkIGNlcnRpZmljYXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGV2aWNlQ2VydGlmaWNhdGUoe2JhY2tlbmRQcml2YXRlS2V5LCBjZXJ0aWZpY2F0ZX0pIHtcbiAgY29uc3Qgbm9ybWFsaXplZENlcnRpZmljYXRlID0gbm9ybWFsaXplRGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkKGNlcnRpZmljYXRlKVxuXG4gIHJldHVybiB7XG4gICAgYWxnb3JpdGhtOiBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0sXG4gICAgY2VydGlmaWNhdGU6IG5vcm1hbGl6ZWRDZXJ0aWZpY2F0ZSxcbiAgICBzaWduYXR1cmU6IGF3YWl0IHNpZ25TdGFibGVKc29uKHtcbiAgICAgIHByaXZhdGVLZXk6IGJhY2tlbmRQcml2YXRlS2V5LFxuICAgICAgdmFsdWU6IGRldmljZUNlcnRpZmljYXRlU2lnbmF0dXJlVmFsdWUobm9ybWFsaXplZENlcnRpZmljYXRlKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyBhIGJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5iYWNrZW5kUHVibGljS2V5IC0gQmFja2VuZCBwdWJsaWMga2V5LlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZX0gYXJncy5jZXJ0aWZpY2F0ZSAtIFNpZ25lZCBjZXJ0aWZpY2F0ZS5cbiAqIEBwYXJhbSB7RGF0ZX0gW2FyZ3Mubm93XSAtIFZlcmlmaWNhdGlvbiB0aW1lLiBEZWZhdWx0cyB0byBjdXJyZW50IHRpbWUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWQ+fSAtIFZlcmlmaWVkIGNlcnRpZmljYXRlIHBheWxvYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlEZXZpY2VDZXJ0aWZpY2F0ZSh7YmFja2VuZFB1YmxpY0tleSwgY2VydGlmaWNhdGUsIG5vdyA9IG5ldyBEYXRlKCl9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDZXJ0aWZpY2F0ZSA9IG5vcm1hbGl6ZURldmljZUNlcnRpZmljYXRlKGNlcnRpZmljYXRlKVxuICBjb25zdCB2ZXJpZmllZCA9IGF3YWl0IHZlcmlmeVN0YWJsZUpzb25TaWduYXR1cmUoe1xuICAgIHB1YmxpY0tleTogYmFja2VuZFB1YmxpY0tleSxcbiAgICBzaWduYXR1cmU6IG5vcm1hbGl6ZWRDZXJ0aWZpY2F0ZS5zaWduYXR1cmUsXG4gICAgdmFsdWU6IGRldmljZUNlcnRpZmljYXRlU2lnbmF0dXJlVmFsdWUobm9ybWFsaXplZENlcnRpZmljYXRlLmNlcnRpZmljYXRlKVxuICB9KVxuXG4gIGlmICghdmVyaWZpZWQpIHRocm93IG5ldyBFcnJvcihcIkRldmljZSBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgZGlkIG5vdCBtYXRjaFwiKVxuICBhc3NlcnROb3RFeHBpcmVkKHtleHBpcmVzQXQ6IG5vcm1hbGl6ZWRDZXJ0aWZpY2F0ZS5jZXJ0aWZpY2F0ZS5leHBpcmVzQXQsIGxhYmVsOiBcIkRldmljZSBjZXJ0aWZpY2F0ZVwiLCBub3d9KVxuXG4gIHJldHVybiBub3JtYWxpemVkQ2VydGlmaWNhdGUuY2VydGlmaWNhdGVcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGV2aWNlLXNpZ25lZCBtdXRhdGlvbiBlbnZlbG9wZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZX0gYXJncy5kZXZpY2VDZXJ0aWZpY2F0ZSAtIEJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZS5cbiAqIEBwYXJhbSB7U3luY0pzb25XZWJLZXl9IGFyZ3MuZGV2aWNlUHJpdmF0ZUtleSAtIERldmljZSBwcml2YXRlIHNpZ25pbmcga2V5LlxuICogQHBhcmFtIHtTeW5jTXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBNdXRhdGlvbiBwYXlsb2FkLlxuICogQHJldHVybnMge1Byb21pc2U8U2lnbmVkU3luY011dGF0aW9uPn0gLSBTaWduZWQgbXV0YXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTaWduZWRNdXRhdGlvbih7ZGV2aWNlQ2VydGlmaWNhdGUsIGRldmljZVByaXZhdGVLZXksIG11dGF0aW9ufSkge1xuICBjb25zdCBub3JtYWxpemVkRGV2aWNlQ2VydGlmaWNhdGUgPSBub3JtYWxpemVEZXZpY2VDZXJ0aWZpY2F0ZShkZXZpY2VDZXJ0aWZpY2F0ZSlcbiAgY29uc3Qgbm9ybWFsaXplZE11dGF0aW9uID0gbm9ybWFsaXplU3luY011dGF0aW9uKG11dGF0aW9uKVxuXG4gIGFzc2VydE11dGF0aW9uTWF0Y2hlc0NlcnRpZmljYXRlKHtjZXJ0aWZpY2F0ZTogbm9ybWFsaXplZERldmljZUNlcnRpZmljYXRlLmNlcnRpZmljYXRlLCBtdXRhdGlvbjogbm9ybWFsaXplZE11dGF0aW9ufSlcblxuICByZXR1cm4ge1xuICAgIGFsZ29yaXRobTogRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNLFxuICAgIGRldmljZUNlcnRpZmljYXRlOiBub3JtYWxpemVkRGV2aWNlQ2VydGlmaWNhdGUsXG4gICAgbXV0YXRpb246IG5vcm1hbGl6ZWRNdXRhdGlvbixcbiAgICBzaWduYXR1cmU6IGF3YWl0IHNpZ25TdGFibGVKc29uKHtcbiAgICAgIHByaXZhdGVLZXk6IGRldmljZVByaXZhdGVLZXksXG4gICAgICB2YWx1ZTogc2lnbmVkTXV0YXRpb25TaWduYXR1cmVWYWx1ZSh7XG4gICAgICAgIGRldmljZUNlcnRpZmljYXRlOiBub3JtYWxpemVkRGV2aWNlQ2VydGlmaWNhdGUsXG4gICAgICAgIG11dGF0aW9uOiBub3JtYWxpemVkTXV0YXRpb25cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGEgc2lnbmVkIHN5bmMgbXV0YXRpb24gYW5kIGl0cyBkZXZpY2UgY2VydGlmaWNhdGUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7U3luY0pzb25XZWJLZXl9IGFyZ3MuYmFja2VuZFB1YmxpY0tleSAtIEJhY2tlbmQgcHVibGljIGtleSB1c2VkIHRvIHZlcmlmeSB0aGUgZGV2aWNlIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIHtEYXRlfSBbYXJncy5ub3ddIC0gVmVyaWZpY2F0aW9uIHRpbWUuIERlZmF1bHRzIHRvIGN1cnJlbnQgdGltZS5cbiAqIEBwYXJhbSB7U2lnbmVkU3luY011dGF0aW9ufSBhcmdzLnNpZ25lZE11dGF0aW9uIC0gU2lnbmVkIG11dGF0aW9uIGVudmVsb3BlLlxuICogQHJldHVybnMge1Byb21pc2U8U3luY011dGF0aW9uPn0gLSBWZXJpZmllZCBtdXRhdGlvbiBwYXlsb2FkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U2lnbmVkTXV0YXRpb24oe2JhY2tlbmRQdWJsaWNLZXksIG5vdyA9IG5ldyBEYXRlKCksIHNpZ25lZE11dGF0aW9ufSkge1xuICBjb25zdCBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24gPSBub3JtYWxpemVTaWduZWRTeW5jTXV0YXRpb24oc2lnbmVkTXV0YXRpb24pXG4gIGNvbnN0IGNlcnRpZmljYXRlUGF5bG9hZCA9IGF3YWl0IHZlcmlmeURldmljZUNlcnRpZmljYXRlKHtcbiAgICBiYWNrZW5kUHVibGljS2V5LFxuICAgIGNlcnRpZmljYXRlOiBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24uZGV2aWNlQ2VydGlmaWNhdGUsXG4gICAgbm93XG4gIH0pXG5cbiAgYXNzZXJ0TXV0YXRpb25NYXRjaGVzQ2VydGlmaWNhdGUoe2NlcnRpZmljYXRlOiBjZXJ0aWZpY2F0ZVBheWxvYWQsIG11dGF0aW9uOiBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24ubXV0YXRpb259KVxuXG4gIGNvbnN0IHZlcmlmaWVkID0gYXdhaXQgdmVyaWZ5U3RhYmxlSnNvblNpZ25hdHVyZSh7XG4gICAgcHVibGljS2V5OiBjZXJ0aWZpY2F0ZVBheWxvYWQuZGV2aWNlUHVibGljS2V5LFxuICAgIHNpZ25hdHVyZTogbm9ybWFsaXplZFNpZ25lZE11dGF0aW9uLnNpZ25hdHVyZSxcbiAgICB2YWx1ZTogc2lnbmVkTXV0YXRpb25TaWduYXR1cmVWYWx1ZSh7XG4gICAgICBkZXZpY2VDZXJ0aWZpY2F0ZTogbm9ybWFsaXplZFNpZ25lZE11dGF0aW9uLmRldmljZUNlcnRpZmljYXRlLFxuICAgICAgbXV0YXRpb246IG5vcm1hbGl6ZWRTaWduZWRNdXRhdGlvbi5tdXRhdGlvblxuICAgIH0pXG4gIH0pXG5cbiAgaWYgKCF2ZXJpZmllZCkgdGhyb3cgbmV3IEVycm9yKFwiU3luYyBtdXRhdGlvbiBzaWduYXR1cmUgZGlkIG5vdCBtYXRjaFwiKVxuXG4gIHJldHVybiBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24ubXV0YXRpb25cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZXBsYXkvaWRlbXBvdGVuY3kga2V5IGZvciBhIHNpZ25lZCBtdXRhdGlvbi5cbiAqIEBwYXJhbSB7e211dGF0aW9uOiB7YWN0b3JEZXZpY2VJZD86IHVua25vd24sIGFjdG9yVXNlcklkPzogdW5rbm93biwgY2xpZW50TXV0YXRpb25JZD86IHVua25vd259fX0gc2lnbmVkTXV0YXRpb24gLSBTaWduZWQgbXV0YXRpb24tbGlrZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIElkZW1wb3RlbmN5IGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11dGF0aW9uSWRlbXBvdGVuY3lLZXkoc2lnbmVkTXV0YXRpb24pIHtcbiAgY29uc3QgbXV0YXRpb24gPSBzaWduZWRNdXRhdGlvbi5tdXRhdGlvblxuXG4gIHJldHVybiBbXG4gICAgcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uYWN0b3JVc2VySWQsIFwiYWN0b3JVc2VySWRcIiksXG4gICAgcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uYWN0b3JEZXZpY2VJZCwgXCJhY3RvckRldmljZUlkXCIpLFxuICAgIHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsIFwiY2xpZW50TXV0YXRpb25JZFwiKVxuICBdLmpvaW4oXCI6XCIpXG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzdGFibGUgdmFsdWUgc2lnbmVkIGJ5IGJhY2tlbmQgZGV2aWNlIGNlcnRpZmljYXRlcy5cbiAqIEBwYXJhbSB7RGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkfSBjZXJ0aWZpY2F0ZSAtIENlcnRpZmljYXRlIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IC0gU3RhYmxlIHNpZ25hdHVyZSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGV2aWNlQ2VydGlmaWNhdGVTaWduYXR1cmVWYWx1ZShjZXJ0aWZpY2F0ZSkge1xuICByZXR1cm4ge1xuICAgIGFsZ29yaXRobTogRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNLFxuICAgIGNlcnRpZmljYXRlOiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqLyAoZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsOiBcImNlcnRpZmljYXRlXCIsIHZhbHVlOiBjZXJ0aWZpY2F0ZX0pKVxuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzdGFibGUgdmFsdWUgc2lnbmVkIGJ5IHN5bmMgbXV0YXRpb25zLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlfSBhcmdzLmRldmljZUNlcnRpZmljYXRlIC0gRGV2aWNlIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIHtTeW5jTXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBNdXRhdGlvbiBwYXlsb2FkLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAtIFN0YWJsZSBzaWduYXR1cmUgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHNpZ25lZE11dGF0aW9uU2lnbmF0dXJlVmFsdWUoe2RldmljZUNlcnRpZmljYXRlLCBtdXRhdGlvbn0pIHtcbiAgcmV0dXJuIHtcbiAgICBhbGdvcml0aG06IEVDRFNBX1AyNTZfU0hBMjU2X0FMR09SSVRITSxcbiAgICBkZXZpY2VDZXJ0aWZpY2F0ZTogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gKi8gKGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbDogXCJkZXZpY2VDZXJ0aWZpY2F0ZVwiLCB2YWx1ZTogZGV2aWNlQ2VydGlmaWNhdGV9KSksXG4gICAgbXV0YXRpb246IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovIChkZXRlcm1pbmlzdGljSnNvbk9iamVjdCh7bGFiZWw6IFwibXV0YXRpb25cIiwgdmFsdWU6IG11dGF0aW9ufSkpXG4gIH1cbn1cblxuLyoqXG4gKiBTaWducyBhIGRldGVybWluaXN0aWMgSlNPTiB2YWx1ZSB3aXRoIEVDRFNBIFAtMjU2L1NIQS0yNTYuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7U3luY0pzb25XZWJLZXl9IGFyZ3MucHJpdmF0ZUtleSAtIFByaXZhdGUgSldLLlxuICogQHBhcmFtIHt1bmtub3dufSBhcmdzLnZhbHVlIC0gVmFsdWUgdG8gc2lnbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gUHJlZml4ZWQgYmFzZTY0dXJsIHNpZ25hdHVyZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2lnblN0YWJsZUpzb24oe3ByaXZhdGVLZXksIHZhbHVlfSkge1xuICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG9TdWJ0bGUoKS5pbXBvcnRLZXkoXCJqd2tcIiwgcHJpdmF0ZUtleSwge25hbWU6IFwiRUNEU0FcIiwgbmFtZWRDdXJ2ZTogXCJQLTI1NlwifSwgZmFsc2UsIFtcInNpZ25cIl0pXG4gIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IGNyeXB0b1N1YnRsZSgpLnNpZ24oe2hhc2g6IFwiU0hBLTI1NlwiLCBuYW1lOiBcIkVDRFNBXCJ9LCBrZXksIC8qKiBAdHlwZSB7VWludDhBcnJheTxBcnJheUJ1ZmZlcj59ICovICh1dGY4KHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpKSkpXG5cbiAgcmV0dXJuIGAke0VDRFNBX1AyNTZfU0hBMjU2X1NJR05BVFVSRV9QUkVGSVh9JHtiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSl9YFxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGEgZGV0ZXJtaW5pc3RpYyBKU09OIHZhbHVlIHdpdGggRUNEU0EgUC0yNTYvU0hBLTI1Ni5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5wdWJsaWNLZXkgLSBQdWJsaWMgSldLLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc2lnbmF0dXJlIC0gUHJlZml4ZWQgYmFzZTY0dXJsIHNpZ25hdHVyZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy52YWx1ZSAtIFZhbHVlIHRvIHZlcmlmeS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIHNpZ25hdHVyZSBtYXRjaGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlTdGFibGVKc29uU2lnbmF0dXJlKHtwdWJsaWNLZXksIHNpZ25hdHVyZSwgdmFsdWV9KSB7XG4gIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmltcG9ydEtleShcImp3a1wiLCBwdWJsaWNLZXksIHtuYW1lOiBcIkVDRFNBXCIsIG5hbWVkQ3VydmU6IFwiUC0yNTZcIn0sIGZhbHNlLCBbXCJ2ZXJpZnlcIl0pXG4gIGNvbnN0IHNpZ25hdHVyZUJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKHNpZ25hdHVyZVdpdGhvdXRQcmVmaXgoc2lnbmF0dXJlKSlcblxuICByZXR1cm4gYXdhaXQgY3J5cHRvU3VidGxlKCkudmVyaWZ5KHtoYXNoOiBcIlNIQS0yNTZcIiwgbmFtZTogXCJFQ0RTQVwifSwga2V5LCAvKiogQHR5cGUge1VpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+fSAqLyAoc2lnbmF0dXJlQnl0ZXMpLCAvKiogQHR5cGUge1VpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+fSAqLyAodXRmOChzdGFibGVKc29uU3RyaW5naWZ5KHZhbHVlKSkpKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzaWduZWQgZGV2aWNlIGNlcnRpZmljYXRlIGVudmVsb3BlLlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZX0gY2VydGlmaWNhdGUgLSBTaWduZWQgY2VydGlmaWNhdGUuXG4gKiBAcmV0dXJucyB7RGV2aWNlQ2VydGlmaWNhdGV9IC0gTm9ybWFsaXplZCBjZXJ0aWZpY2F0ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRGV2aWNlQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpIHtcbiAgaWYgKCFjZXJ0aWZpY2F0ZSB8fCB0eXBlb2YgY2VydGlmaWNhdGUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjZXJ0aWZpY2F0ZSkpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGRldmljZSBjZXJ0aWZpY2F0ZSBvYmplY3RcIilcbiAgaWYgKGNlcnRpZmljYXRlLmFsZ29yaXRobSAhPT0gRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRldmljZSBjZXJ0aWZpY2F0ZSBhbGdvcml0aG0gJyR7U3RyaW5nKGNlcnRpZmljYXRlLmFsZ29yaXRobSl9J2ApXG5cbiAgcmV0dXJuIHtcbiAgICBhbGdvcml0aG06IGNlcnRpZmljYXRlLmFsZ29yaXRobSxcbiAgICBjZXJ0aWZpY2F0ZTogbm9ybWFsaXplRGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkKGNlcnRpZmljYXRlLmNlcnRpZmljYXRlKSxcbiAgICBzaWduYXR1cmU6IG5vcm1hbGl6ZVNpZ25hdHVyZShjZXJ0aWZpY2F0ZS5zaWduYXR1cmUsIFwiZGV2aWNlIGNlcnRpZmljYXRlIHNpZ25hdHVyZVwiKVxuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIGRldmljZSBjZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWR9IGNlcnRpZmljYXRlIC0gQ2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWR9IC0gTm9ybWFsaXplZCBjZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWQoY2VydGlmaWNhdGUpIHtcbiAgaWYgKCFjZXJ0aWZpY2F0ZSB8fCB0eXBlb2YgY2VydGlmaWNhdGUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjZXJ0aWZpY2F0ZSkpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGRldmljZSBjZXJ0aWZpY2F0ZSBwYXlsb2FkIG9iamVjdFwiKVxuXG4gIHJldHVybiB7XG4gICAgYWN0b3JEZXZpY2VJZDogcmVxdWlyZWRTdHJpbmcoY2VydGlmaWNhdGUuYWN0b3JEZXZpY2VJZCwgXCJhY3RvckRldmljZUlkXCIpLFxuICAgIGFjdG9yVXNlcklkOiByZXF1aXJlZFN0cmluZyhjZXJ0aWZpY2F0ZS5hY3RvclVzZXJJZCwgXCJhY3RvclVzZXJJZFwiKSxcbiAgICBjZXJ0aWZpY2F0ZUlkOiByZXF1aXJlZFN0cmluZyhjZXJ0aWZpY2F0ZS5jZXJ0aWZpY2F0ZUlkLCBcImNlcnRpZmljYXRlSWRcIiksXG4gICAgZGV2aWNlUHVibGljS2V5OiBub3JtYWxpemVKd2soY2VydGlmaWNhdGUuZGV2aWNlUHVibGljS2V5LCBcImRldmljZVB1YmxpY0tleVwiKSxcbiAgICBleHBpcmVzQXQ6IGlzb0RhdGVTdHJpbmcobmV3IERhdGUocmVxdWlyZWRTdHJpbmcoY2VydGlmaWNhdGUuZXhwaXJlc0F0LCBcImV4cGlyZXNBdFwiKSksIFwiZXhwaXJlc0F0XCIpLFxuICAgIGlzc3VlZEF0OiBpc29EYXRlU3RyaW5nKG5ldyBEYXRlKHJlcXVpcmVkU3RyaW5nKGNlcnRpZmljYXRlLmlzc3VlZEF0LCBcImlzc3VlZEF0XCIpKSwgXCJpc3N1ZWRBdFwiKVxuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHNpZ25lZCBzeW5jIG11dGF0aW9uIGVudmVsb3BlLlxuICogQHBhcmFtIHtTaWduZWRTeW5jTXV0YXRpb259IHNpZ25lZE11dGF0aW9uIC0gU2lnbmVkIG11dGF0aW9uLlxuICogQHJldHVybnMge1NpZ25lZFN5bmNNdXRhdGlvbn0gLSBOb3JtYWxpemVkIHNpZ25lZCBtdXRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2lnbmVkU3luY011dGF0aW9uKHNpZ25lZE11dGF0aW9uKSB7XG4gIGlmICghc2lnbmVkTXV0YXRpb24gfHwgdHlwZW9mIHNpZ25lZE11dGF0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoc2lnbmVkTXV0YXRpb24pKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBzaWduZWQgc3luYyBtdXRhdGlvbiBvYmplY3RcIilcbiAgaWYgKHNpZ25lZE11dGF0aW9uLmFsZ29yaXRobSAhPT0gRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHN5bmMgbXV0YXRpb24gYWxnb3JpdGhtICcke1N0cmluZyhzaWduZWRNdXRhdGlvbi5hbGdvcml0aG0pfSdgKVxuXG4gIHJldHVybiB7XG4gICAgYWxnb3JpdGhtOiBzaWduZWRNdXRhdGlvbi5hbGdvcml0aG0sXG4gICAgZGV2aWNlQ2VydGlmaWNhdGU6IG5vcm1hbGl6ZURldmljZUNlcnRpZmljYXRlKHNpZ25lZE11dGF0aW9uLmRldmljZUNlcnRpZmljYXRlKSxcbiAgICBtdXRhdGlvbjogbm9ybWFsaXplU3luY011dGF0aW9uKHNpZ25lZE11dGF0aW9uLm11dGF0aW9uKSxcbiAgICBzaWduYXR1cmU6IG5vcm1hbGl6ZVNpZ25hdHVyZShzaWduZWRNdXRhdGlvbi5zaWduYXR1cmUsIFwic3luYyBtdXRhdGlvbiBzaWduYXR1cmVcIilcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzeW5jIG11dGF0aW9uIHBheWxvYWQuXG4gKiBAcGFyYW0ge1N5bmNNdXRhdGlvbn0gbXV0YXRpb24gLSBNdXRhdGlvbiBwYXlsb2FkLlxuICogQHJldHVybnMge1N5bmNNdXRhdGlvbn0gLSBOb3JtYWxpemVkIG11dGF0aW9uIHBheWxvYWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN5bmNNdXRhdGlvbihtdXRhdGlvbikge1xuICBpZiAoIW11dGF0aW9uIHx8IHR5cGVvZiBtdXRhdGlvbiAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG11dGF0aW9uKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgc3luYyBtdXRhdGlvbiBvYmplY3RcIilcblxuICAvKiogQHR5cGUge1N5bmNNdXRhdGlvbn0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHtcbiAgICBhY3RvckRldmljZUlkOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5hY3RvckRldmljZUlkLCBcImFjdG9yRGV2aWNlSWRcIiksXG4gICAgYWN0b3JVc2VySWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmFjdG9yVXNlcklkLCBcImFjdG9yVXNlcklkXCIpLFxuICAgIGNsaWVudE11dGF0aW9uSWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsIFwiY2xpZW50TXV0YXRpb25JZFwiKSxcbiAgICBtb2RlbDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24ubW9kZWwsIFwibW9kZWxcIiksXG4gICAgb2NjdXJyZWRBdDogaXNvRGF0ZVN0cmluZyhuZXcgRGF0ZShyZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5vY2N1cnJlZEF0LCBcIm9jY3VycmVkQXRcIikpLCBcIm9jY3VycmVkQXRcIiksXG4gICAgb2ZmbGluZUdyYW50SWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLm9mZmxpbmVHcmFudElkLCBcIm9mZmxpbmVHcmFudElkXCIpLFxuICAgIG9wZXJhdGlvbjogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24ub3BlcmF0aW9uLCBcIm9wZXJhdGlvblwiKSxcbiAgICBwb2xpY3lIYXNoOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5wb2xpY3lIYXNoLCBcInBvbGljeUhhc2hcIilcbiAgfVxuXG4gIGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQuYXR0cmlidXRlcyA9IGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbDogXCJhdHRyaWJ1dGVzXCIsIHZhbHVlOiBtdXRhdGlvbi5hdHRyaWJ1dGVzfSlcbiAgaWYgKG11dGF0aW9uLmJhc2VWZXJzaW9uICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQuYmFzZVZlcnNpb24gPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlciB8IG51bGx9ICovIChkZXRlcm1pbmlzdGljSnNvbih7bGFiZWw6IFwiYmFzZVZlcnNpb25cIiwgdmFsdWU6IG11dGF0aW9uLmJhc2VWZXJzaW9ufSkpXG4gIGlmIChtdXRhdGlvbi5jb21tYW5kICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQuY29tbWFuZCA9IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmNvbW1hbmQsIFwiY29tbWFuZFwiKVxuICBpZiAobXV0YXRpb24ucGF5bG9hZCAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLnBheWxvYWQgPSBkZXRlcm1pbmlzdGljSnNvbk9iamVjdCh7bGFiZWw6IFwicGF5bG9hZFwiLCB2YWx1ZTogbXV0YXRpb24ucGF5bG9hZH0pXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgbXV0YXRpb24gYWN0b3IgZmllbGRzIG1hdGNoIHRoZSBjZXJ0aWZpY2F0ZSBhY3Rvci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWR9IGFyZ3MuY2VydGlmaWNhdGUgLSBEZXZpY2UgY2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEBwYXJhbSB7U3luY011dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTXV0YXRpb24gcGF5bG9hZC5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0TXV0YXRpb25NYXRjaGVzQ2VydGlmaWNhdGUoe2NlcnRpZmljYXRlLCBtdXRhdGlvbn0pIHtcbiAgaWYgKG11dGF0aW9uLmFjdG9yRGV2aWNlSWQgIT09IGNlcnRpZmljYXRlLmFjdG9yRGV2aWNlSWQgfHwgbXV0YXRpb24uYWN0b3JVc2VySWQgIT09IGNlcnRpZmljYXRlLmFjdG9yVXNlcklkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3luYyBtdXRhdGlvbiBhY3RvciBkb2VzIG5vdCBtYXRjaCBkZXZpY2UgY2VydGlmaWNhdGVcIilcbiAgfVxufVxuXG4vKipcbiAqIEFzc2VydHMgYSB0aW1lc3RhbXAgaXMgbm90IGV4cGlyZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmV4cGlyZXNBdCAtIEV4cGlyeSB0aW1lc3RhbXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYWJlbCAtIEVycm9yIGxhYmVsLlxuICogQHBhcmFtIHtEYXRlfSBhcmdzLm5vdyAtIFZlcmlmaWNhdGlvbiB0aW1lLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhc3NlcnROb3RFeHBpcmVkKHtleHBpcmVzQXQsIGxhYmVsLCBub3d9KSB7XG4gIGlmIChOdW1iZXIuaXNOYU4obm93LmdldFRpbWUoKSkpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3luYyB2ZXJpZmljYXRpb24gdGltZVwiKVxuICBpZiAobmV3IERhdGUoZXhwaXJlc0F0KS5nZXRUaW1lKCkgPD0gbm93LmdldFRpbWUoKSkgdGhyb3cgbmV3IEVycm9yKGAke2xhYmVsfSBleHBpcmVkYClcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgSlNPTiBXZWIgS2V5IG9iamVjdC5cbiAqIEBwYXJhbSB7U3luY0pzb25XZWJLZXl9IGtleSAtIEpXSy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEtleSBsYWJlbC5cbiAqIEByZXR1cm5zIHtTeW5jSnNvbldlYktleX0gLSBOb3JtYWxpemVkIEpXSy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSndrKGtleSwgbGFiZWwpIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbCwgdmFsdWU6IGtleX0pXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7U3luY0pzb25XZWJLZXl9ICovIChub3JtYWxpemVkKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBwcmVmaXhlZCBzaWduYXR1cmUgc3RyaW5nLlxuICogQHBhcmFtIHt1bmtub3dufSBzaWduYXR1cmUgLSBTaWduYXR1cmUgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBFcnJvciBsYWJlbC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2lnbmF0dXJlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2lnbmF0dXJlKHNpZ25hdHVyZSwgbGFiZWwpIHtcbiAgaWYgKHR5cGVvZiBzaWduYXR1cmUgIT09IFwic3RyaW5nXCIgfHwgIXNpZ25hdHVyZS5zdGFydHNXaXRoKEVDRFNBX1AyNTZfU0hBMjU2X1NJR05BVFVSRV9QUkVGSVgpKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7bGFiZWx9YClcblxuICByZXR1cm4gc2lnbmF0dXJlXG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgc2lnbmF0dXJlIHByZWZpeC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmUgLSBQcmVmaXhlZCBzaWduYXR1cmUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEJhc2U2NHVybCBzaWduYXR1cmUgYm9keS5cbiAqL1xuZnVuY3Rpb24gc2lnbmF0dXJlV2l0aG91dFByZWZpeChzaWduYXR1cmUpIHtcbiAgcmV0dXJuIHNpZ25hdHVyZS5zbGljZShFQ0RTQV9QMjU2X1NIQTI1Nl9TSUdOQVRVUkVfUFJFRklYLmxlbmd0aClcbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBhIG5vbi1lbXB0eSBzdHJpbmcgZmllbGQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIEZpZWxkIG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0cmluZyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZWRTdHJpbmcodmFsdWUsIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5sZW5ndGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHN5bmMgJHtuYW1lfWApXG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIERhdGUgdG8gYW4gSVNPIHRpbWVzdGFtcC5cbiAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSAtIERhdGUgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBGaWVsZCBsYWJlbC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSVNPIHRpbWVzdGFtcC5cbiAqL1xuZnVuY3Rpb24gaXNvRGF0ZVN0cmluZyhkYXRlLCBsYWJlbCkge1xuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHN5bmMgJHtsYWJlbH1gKVxuXG4gIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGVuY29kZWQgVVRGLTggYnl0ZXMgZm9yIGEgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gU3RyaW5nIHZhbHVlLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IC0gVVRGLTggYnl0ZXMuXG4gKi9cbmZ1bmN0aW9uIHV0ZjgodmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh2YWx1ZSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIFdlYkNyeXB0byBzdWJ0bGUgQVBJLlxuICogQHJldHVybnMge1N1YnRsZUNyeXB0b30gLSBTdWJ0bGVDcnlwdG8gaW1wbGVtZW50YXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNyeXB0b1N1YnRsZSgpIHtcbiAgaWYgKCFnbG9iYWxUaGlzLmNyeXB0bz8uc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJXZWJDcnlwdG8gc3VidGxlIEFQSSBpcyByZXF1aXJlZCBmb3Igc3luYyBzaWduaW5nXCIpXG5cbiAgcmV0dXJuIGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZVxufVxuXG4vKipcbiAqIEJhc2U2NHVybC1lbmNvZGVzIGJ5dGVzLlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlcyAtIEJ5dGVzLlxuICogQHJldHVybnMge3N0cmluZ30gLSBCYXNlNjR1cmwgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlNjRVcmxFbmNvZGUoYnl0ZXMpIHtcbiAgbGV0IGJpbmFyeSA9IFwiXCJcblxuICBmb3IgKGNvbnN0IGJ5dGUgb2YgYnl0ZXMpIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpXG5cbiAgcmV0dXJuIGJ0b2EoYmluYXJ5KS5yZXBsYWNlQWxsKFwiK1wiLCBcIi1cIikucmVwbGFjZUFsbChcIi9cIiwgXCJfXCIpLnJlcGxhY2VBbGwoXCI9XCIsIFwiXCIpXG59XG5cbi8qKlxuICogQmFzZTY0dXJsLWRlY29kZXMgYnl0ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBCYXNlNjR1cmwgc3RyaW5nLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IC0gQnl0ZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2U2NFVybERlY29kZSh2YWx1ZSkge1xuICBjb25zdCBiYXNlNjQgPSB2YWx1ZS5yZXBsYWNlQWxsKFwiLVwiLCBcIitcIikucmVwbGFjZUFsbChcIl9cIiwgXCIvXCIpLnBhZEVuZChNYXRoLmNlaWwodmFsdWUubGVuZ3RoIC8gNCkgKiA0LCBcIj1cIilcbiAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpXG5cbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShiaW5hcnksIChjaGFyKSA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpXG59XG5cbi8qKlxuICogU3RhYmxlIEpTT04gc3RyaW5naWZpZXIgd2l0aCBzb3J0ZWQgb2JqZWN0IGtleXMuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEpTT04gc3RyaW5nLlxuICovXG5mdW5jdGlvbiBzdGFibGVKc29uU3RyaW5naWZ5KHZhbHVlKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShkZXRlcm1pbmlzdGljSnNvbih7bGFiZWw6IFwicm9vdFwiLCB2YWx1ZX0pKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSB2YWx1ZSBhcyBhIEpTT04gb2JqZWN0LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYWJlbCAtIERpYWdub3N0aWMgbGFiZWwuXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZ3MudmFsdWUgLSBWYWx1ZS5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gLSBKU09OIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsLCB2YWx1ZX0pIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGRldGVybWluaXN0aWNKc29uKHtsYWJlbCwgdmFsdWV9KVxuXG4gIGlmICghbm9ybWFsaXplZCB8fCB0eXBlb2Ygbm9ybWFsaXplZCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWQpKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHN5bmMgJHtsYWJlbH0gb2JqZWN0YClcblxuICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gKi8gKG5vcm1hbGl6ZWQpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBkZXRlcm1pbmlzdGljIEpTT04gd2l0aCBzb3J0ZWQgb2JqZWN0IGtleXMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmxhYmVsIC0gRGlhZ25vc3RpYyBsYWJlbC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy52YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWV9IC0gTm9ybWFsaXplZCBKU09OIHZhbHVlLlxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmlzdGljSnNvbih7bGFiZWwsIHZhbHVlfSkge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gdmFsdWVcblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoKGVudHJ5LCBpbmRleCkgPT4gZGV0ZXJtaW5pc3RpY0pzb24oe2xhYmVsOiBgJHtsYWJlbH0vJHtpbmRleH1gLCB2YWx1ZTogZW50cnl9KSlcblxuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKSkge1xuICAgICAgY29uc3QgY2hpbGRWYWx1ZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlba2V5XVxuXG4gICAgICBpZiAoY2hpbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgbm9ybWFsaXplZFtrZXldID0gZGV0ZXJtaW5pc3RpY0pzb24oe2xhYmVsOiBgJHtsYWJlbH0vJHtrZXl9YCwgdmFsdWU6IGNoaWxkVmFsdWV9KVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgJHtsYWJlbH0gbXVzdCBiZSBkZXRlcm1pbmlzdGljIEpTT05gKVxufVxuIl19
|
|
454
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWlkZW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvZGV2aWNlLWlkZW50aXR5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNIOzs7Ozs7Ozs7R0FTRztBQUNIOzs7Ozs7R0FNRztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNIOzs7Ozs7O0dBT0c7QUFDSCxZQUFZO0FBRVosTUFBTSwyQkFBMkIsR0FBRyxtQkFBbUIsQ0FBQTtBQUN2RCxNQUFNLGtDQUFrQyxHQUFHLG9CQUFvQixDQUFBO0FBRS9EOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCO0lBQzlDLE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxFQUFFLENBQUMsV0FBVyxDQUM5QyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBQyxFQUNwQyxJQUFJLEVBQ0osQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQ25CLENBQUE7SUFFRCxPQUFPO1FBQ0wsVUFBVSxFQUFFLE1BQU0sWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3JFLFNBQVMsRUFBRSxNQUFNLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQztLQUNwRSxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQUMsRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUM7SUFDNUUsTUFBTSxxQkFBcUIsR0FBRyxpQ0FBaUMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUU1RSxPQUFPO1FBQ0wsU0FBUyxFQUFFLDJCQUEyQjtRQUN0QyxXQUFXLEVBQUUscUJBQXFCO1FBQ2xDLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztZQUM5QixVQUFVLEVB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QU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFVBQVUsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBRXRFLElBQUksVUFBVSxLQUFLLFNBQVM7Z0JBQUUsU0FBUTtZQUN0QyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsRUFBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7UUFDcEYsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyw2QkFBNkIsQ0FBQyxDQUFBO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEpTT04gV2ViIEtleSB1c2VkIGJ5IHRoZSBzeW5jIHNpZ25pbmcgaGVscGVycy5cbiAqIEB0eXBlZGVmIHtpbXBvcnQoXCJub2RlOmNyeXB0b1wiKS53ZWJjcnlwdG8uSnNvbldlYktleX0gU3luY0pzb25XZWJLZXlcbiAqL1xuLyoqXG4gKiBCYWNrZW5kLXNpZ25lZCBkZXZpY2UgY2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERldmljZUNlcnRpZmljYXRlUGF5bG9hZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdG9yRGV2aWNlSWQgLSBEZXZpY2UgaWQgYWxsb3dlZCB0byBzaWduIG11dGF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3RvclVzZXJJZCAtIFVzZXIgaWQgcmVwcmVzZW50ZWQgYnkgdGhlIGRldmljZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjZXJ0aWZpY2F0ZUlkIC0gQ2VydGlmaWNhdGUgaWQuXG4gKiBAcHJvcGVydHkge1N5bmNKc29uV2ViS2V5fSBkZXZpY2VQdWJsaWNLZXkgLSBEZXZpY2UgcHVibGljIGtleSBwZWVycy9iYWNrZW5kcyB1c2UgdG8gdmVyaWZ5IG11dGF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHBpcmVzQXQgLSBJU08gdGltZXN0YW1wIGFmdGVyIHdoaWNoIHRoZSBjZXJ0aWZpY2F0ZSBpcyBpbnZhbGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlzc3VlZEF0IC0gSVNPIHRpbWVzdGFtcCB3aGVuIHRoZSBiYWNrZW5kIGlzc3VlZCB0aGUgY2VydGlmaWNhdGUuXG4gKi9cbi8qKlxuICogQmFja2VuZC1zaWduZWQgZGV2aWNlIGNlcnRpZmljYXRlIGVudmVsb3BlLlxuICogQHR5cGVkZWYge29iamVjdH0gRGV2aWNlQ2VydGlmaWNhdGVcbiAqIEBwcm9wZXJ0eSB7XCJFQ0RTQS1QMjU2LVNIQTI1NlwifSBhbGdvcml0aG0gLSBTaWduYXR1cmUgYWxnb3JpdGhtLlxuICogQHByb3BlcnR5IHtEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWR9IGNlcnRpZmljYXRlIC0gQ2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzaWduYXR1cmUgLSBCYWNrZW5kIHNpZ25hdHVyZSBvdmVyIHRoZSBjZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICovXG4vKipcbiAqIFN5bmMgbXV0YXRpb24gcGF5bG9hZCBzaWduZWQgYnkgYSBkZXZpY2UuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jTXV0YXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3RvckRldmljZUlkIC0gRGV2aWNlIHRoYXQgc2lnbmVkIHRoZSBtdXRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3RvclVzZXJJZCAtIFVzZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHNpZ25pbmcgZGV2aWNlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gW2F0dHJpYnV0ZXNdIC0gTW9kZWwgYXR0cmlidXRlcyBmb3IgQ1JVRCBtdXRhdGlvbnMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bWJlciB8IG51bGx9IFtiYXNlVmVyc2lvbl0gLSBCYXNlIHNlcnZlci9jbGllbnQgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGllbnRNdXRhdGlvbklkIC0gRGV2aWNlLWxvY2FsIGlkZW1wb3RlbmN5IGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb21tYW5kXSAtIERvbWFpbiBjb21tYW5kIG5hbWUgZm9yIGNvbW1hbmQgbXV0YXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsIC0gU3luYyBtb2RlbC9yZXNvdXJjZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9jY3VycmVkQXQgLSBJU08gdGltZXN0YW1wIHdoZW4gdGhlIG11dGF0aW9uIG9jY3VycmVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9mZmxpbmVHcmFudElkIC0gT2ZmbGluZSBncmFudCBpZCBhdXRob3JpemluZyB0aGUgbXV0YXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gQ1JVRCBvcGVyYXRpb24gb3IgY29tbWFuZCBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSBbcGF5bG9hZF0gLSBEb21haW4gY29tbWFuZCBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBvbGljeUhhc2ggLSBTeW5jIHBvbGljeSBoYXNoIHRoZSBtdXRhdGlvbiB3YXMgY2hlY2tlZCBhZ2FpbnN0LlxuICovXG4vKipcbiAqIERldmljZS1zaWduZWQgbXV0YXRpb24gZW52ZWxvcGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaWduZWRTeW5jTXV0YXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFQ0RTQS1QMjU2LVNIQTI1NlwifSBhbGdvcml0aG0gLSBTaWduYXR1cmUgYWxnb3JpdGhtLlxuICogQHByb3BlcnR5IHtEZXZpY2VDZXJ0aWZpY2F0ZX0gZGV2aWNlQ2VydGlmaWNhdGUgLSBCYWNrZW5kLXNpZ25lZCBkZXZpY2UgY2VydGlmaWNhdGUuXG4gKiBAcHJvcGVydHkge1N5bmNNdXRhdGlvbn0gbXV0YXRpb24gLSBNdXRhdGlvbiBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNpZ25hdHVyZSAtIERldmljZSBzaWduYXR1cmUgb3ZlciB0aGUgbXV0YXRpb24gZW52ZWxvcGUuXG4gKi9cbi8vIEB0cy1jaGVja1xuXG5jb25zdCBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0gPSBcIkVDRFNBLVAyNTYtU0hBMjU2XCJcbmNvbnN0IEVDRFNBX1AyNTZfU0hBMjU2X1NJR05BVFVSRV9QUkVGSVggPSBcImVjZHNhLXAyNTYtc2hhMjU2LVwiXG5cbi8qKlxuICogR2VuZXJhdGVzIGFuIEVDRFNBIFAtMjU2IGtleXBhaXIgZXhwb3J0ZWQgYXMgSldLcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtwcml2YXRlS2V5OiBTeW5jSnNvbldlYktleSwgcHVibGljS2V5OiBTeW5jSnNvbldlYktleX0+fSAtIEV4cG9ydGVkIGtleXBhaXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVN5bmNTaWduaW5nS2V5UGFpcigpIHtcbiAgY29uc3Qga2V5UGFpciA9IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmdlbmVyYXRlS2V5KFxuICAgIHtuYW1lOiBcIkVDRFNBXCIsIG5hbWVkQ3VydmU6IFwiUC0yNTZcIn0sXG4gICAgdHJ1ZSxcbiAgICBbXCJzaWduXCIsIFwidmVyaWZ5XCJdXG4gIClcblxuICByZXR1cm4ge1xuICAgIHByaXZhdGVLZXk6IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmV4cG9ydEtleShcImp3a1wiLCBrZXlQYWlyLnByaXZhdGVLZXkpLFxuICAgIHB1YmxpY0tleTogYXdhaXQgY3J5cHRvU3VidGxlKCkuZXhwb3J0S2V5KFwiandrXCIsIGtleVBhaXIucHVibGljS2V5KVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5iYWNrZW5kUHJpdmF0ZUtleSAtIEJhY2tlbmQgcHJpdmF0ZSBzaWduaW5nIGtleS5cbiAqIEBwYXJhbSB7RGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkfSBhcmdzLmNlcnRpZmljYXRlIC0gQ2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPERldmljZUNlcnRpZmljYXRlPn0gLSBTaWduZWQgY2VydGlmaWNhdGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVEZXZpY2VDZXJ0aWZpY2F0ZSh7YmFja2VuZFByaXZhdGVLZXksIGNlcnRpZmljYXRlfSkge1xuICBjb25zdCBub3JtYWxpemVkQ2VydGlmaWNhdGUgPSBub3JtYWxpemVEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWQoY2VydGlmaWNhdGUpXG5cbiAgcmV0dXJuIHtcbiAgICBhbGdvcml0aG06IEVDRFNBX1AyNTZfU0hBMjU2X0FMR09SSVRITSxcbiAgICBjZXJ0aWZpY2F0ZTogbm9ybWFsaXplZENlcnRpZmljYXRlLFxuICAgIHNpZ25hdHVyZTogYXdhaXQgc2lnblN0YWJsZUpzb24oe1xuICAgICAgcHJpdmF0ZUtleTogYmFja2VuZFByaXZhdGVLZXksXG4gICAgICB2YWx1ZTogZGV2aWNlQ2VydGlmaWNhdGVTaWduYXR1cmVWYWx1ZShub3JtYWxpemVkQ2VydGlmaWNhdGUpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGEgYmFja2VuZC1zaWduZWQgZGV2aWNlIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge1N5bmNKc29uV2ViS2V5fSBhcmdzLmJhY2tlbmRQdWJsaWNLZXkgLSBCYWNrZW5kIHB1YmxpYyBrZXkuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlfSBhcmdzLmNlcnRpZmljYXRlIC0gU2lnbmVkIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIHtEYXRlfSBbYXJncy5ub3ddIC0gVmVyaWZpY2F0aW9uIHRpbWUuIERlZmF1bHRzIHRvIGN1cnJlbnQgdGltZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPERldmljZUNlcnRpZmljYXRlUGF5bG9hZD59IC0gVmVyaWZpZWQgY2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeURldmljZUNlcnRpZmljYXRlKHtiYWNrZW5kUHVibGljS2V5LCBjZXJ0aWZpY2F0ZSwgbm93ID0gbmV3IERhdGUoKX0pIHtcbiAgY29uc3Qgbm9ybWFsaXplZENlcnRpZmljYXRlID0gbm9ybWFsaXplRGV2aWNlQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpXG4gIGNvbnN0IHZlcmlmaWVkID0gYXdhaXQgdmVyaWZ5U3RhYmxlSnNvblNpZ25hdHVyZSh7XG4gICAgcHVibGljS2V5OiBiYWNrZW5kUHVibGljS2V5LFxuICAgIHNpZ25hdHVyZTogbm9ybWFsaXplZENlcnRpZmljYXRlLnNpZ25hdHVyZSxcbiAgICB2YWx1ZTogZGV2aWNlQ2VydGlmaWNhdGVTaWduYXR1cmVWYWx1ZShub3JtYWxpemVkQ2VydGlmaWNhdGUuY2VydGlmaWNhdGUpXG4gIH0pXG5cbiAgaWYgKCF2ZXJpZmllZCkgdGhyb3cgbmV3IEVycm9yKFwiRGV2aWNlIGNlcnRpZmljYXRlIHNpZ25hdHVyZSBkaWQgbm90IG1hdGNoXCIpXG4gIGFzc2VydE5vdEV4cGlyZWQoe2V4cGlyZXNBdDogbm9ybWFsaXplZENlcnRpZmljYXRlLmNlcnRpZmljYXRlLmV4cGlyZXNBdCwgbGFiZWw6IFwiRGV2aWNlIGNlcnRpZmljYXRlXCIsIG5vd30pXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRDZXJ0aWZpY2F0ZS5jZXJ0aWZpY2F0ZVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkZXZpY2Utc2lnbmVkIG11dGF0aW9uIGVudmVsb3BlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlfSBhcmdzLmRldmljZUNlcnRpZmljYXRlIC0gQmFja2VuZC1zaWduZWQgZGV2aWNlIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5kZXZpY2VQcml2YXRlS2V5IC0gRGV2aWNlIHByaXZhdGUgc2lnbmluZyBrZXkuXG4gKiBAcGFyYW0ge1N5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTaWduZWRTeW5jTXV0YXRpb24+fSAtIFNpZ25lZCBtdXRhdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNpZ25lZE11dGF0aW9uKHtkZXZpY2VDZXJ0aWZpY2F0ZSwgZGV2aWNlUHJpdmF0ZUtleSwgbXV0YXRpb259KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWREZXZpY2VDZXJ0aWZpY2F0ZSA9IG5vcm1hbGl6ZURldmljZUNlcnRpZmljYXRlKGRldmljZUNlcnRpZmljYXRlKVxuICBjb25zdCBub3JtYWxpemVkTXV0YXRpb24gPSBub3JtYWxpemVTeW5jTXV0YXRpb24obXV0YXRpb24pXG5cbiAgYXNzZXJ0TXV0YXRpb25NYXRjaGVzQ2VydGlmaWNhdGUoe2NlcnRpZmljYXRlOiBub3JtYWxpemVkRGV2aWNlQ2VydGlmaWNhdGUuY2VydGlmaWNhdGUsIG11dGF0aW9uOiBub3JtYWxpemVkTXV0YXRpb259KVxuXG4gIHJldHVybiB7XG4gICAgYWxnb3JpdGhtOiBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0sXG4gICAgZGV2aWNlQ2VydGlmaWNhdGU6IG5vcm1hbGl6ZWREZXZpY2VDZXJ0aWZpY2F0ZSxcbiAgICBtdXRhdGlvbjogbm9ybWFsaXplZE11dGF0aW9uLFxuICAgIHNpZ25hdHVyZTogYXdhaXQgc2lnblN0YWJsZUpzb24oe1xuICAgICAgcHJpdmF0ZUtleTogZGV2aWNlUHJpdmF0ZUtleSxcbiAgICAgIHZhbHVlOiBzaWduZWRNdXRhdGlvblNpZ25hdHVyZVZhbHVlKHtcbiAgICAgICAgZGV2aWNlQ2VydGlmaWNhdGU6IG5vcm1hbGl6ZWREZXZpY2VDZXJ0aWZpY2F0ZSxcbiAgICAgICAgbXV0YXRpb246IG5vcm1hbGl6ZWRNdXRhdGlvblxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogVmVyaWZpZXMgYSBzaWduZWQgc3luYyBtdXRhdGlvbiBhbmQgaXRzIGRldmljZSBjZXJ0aWZpY2F0ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5iYWNrZW5kUHVibGljS2V5IC0gQmFja2VuZCBwdWJsaWMga2V5IHVzZWQgdG8gdmVyaWZ5IHRoZSBkZXZpY2UgY2VydGlmaWNhdGUuXG4gKiBAcGFyYW0ge0RhdGV9IFthcmdzLm5vd10gLSBWZXJpZmljYXRpb24gdGltZS4gRGVmYXVsdHMgdG8gY3VycmVudCB0aW1lLlxuICogQHBhcmFtIHtTaWduZWRTeW5jTXV0YXRpb259IGFyZ3Muc2lnbmVkTXV0YXRpb24gLSBTaWduZWQgbXV0YXRpb24gZW52ZWxvcGUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTeW5jTXV0YXRpb24+fSAtIFZlcmlmaWVkIG11dGF0aW9uIHBheWxvYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlTaWduZWRNdXRhdGlvbih7YmFja2VuZFB1YmxpY0tleSwgbm93ID0gbmV3IERhdGUoKSwgc2lnbmVkTXV0YXRpb259KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTaWduZWRNdXRhdGlvbiA9IG5vcm1hbGl6ZVNpZ25lZFN5bmNNdXRhdGlvbihzaWduZWRNdXRhdGlvbilcbiAgY29uc3QgY2VydGlmaWNhdGVQYXlsb2FkID0gYXdhaXQgdmVyaWZ5RGV2aWNlQ2VydGlmaWNhdGUoe1xuICAgIGJhY2tlbmRQdWJsaWNLZXksXG4gICAgY2VydGlmaWNhdGU6IG5vcm1hbGl6ZWRTaWduZWRNdXRhdGlvbi5kZXZpY2VDZXJ0aWZpY2F0ZSxcbiAgICBub3dcbiAgfSlcblxuICBhc3NlcnRNdXRhdGlvbk1hdGNoZXNDZXJ0aWZpY2F0ZSh7Y2VydGlmaWNhdGU6IGNlcnRpZmljYXRlUGF5bG9hZCwgbXV0YXRpb246IG5vcm1hbGl6ZWRTaWduZWRNdXRhdGlvbi5tdXRhdGlvbn0pXG5cbiAgY29uc3QgdmVyaWZpZWQgPSBhd2FpdCB2ZXJpZnlTdGFibGVKc29uU2lnbmF0dXJlKHtcbiAgICBwdWJsaWNLZXk6IGNlcnRpZmljYXRlUGF5bG9hZC5kZXZpY2VQdWJsaWNLZXksXG4gICAgc2lnbmF0dXJlOiBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24uc2lnbmF0dXJlLFxuICAgIHZhbHVlOiBzaWduZWRNdXRhdGlvblNpZ25hdHVyZVZhbHVlKHtcbiAgICAgIGRldmljZUNlcnRpZmljYXRlOiBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24uZGV2aWNlQ2VydGlmaWNhdGUsXG4gICAgICBtdXRhdGlvbjogbm9ybWFsaXplZFNpZ25lZE11dGF0aW9uLm11dGF0aW9uXG4gICAgfSlcbiAgfSlcblxuICBpZiAoIXZlcmlmaWVkKSB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIG11dGF0aW9uIHNpZ25hdHVyZSBkaWQgbm90IG1hdGNoXCIpXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRTaWduZWRNdXRhdGlvbi5tdXRhdGlvblxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlcGxheS9pZGVtcG90ZW5jeSBrZXkgZm9yIGEgc2lnbmVkIG11dGF0aW9uLlxuICogQHBhcmFtIHt7bXV0YXRpb246IHthY3RvckRldmljZUlkPzogdW5rbm93biwgYWN0b3JVc2VySWQ/OiB1bmtub3duLCBjbGllbnRNdXRhdGlvbklkPzogdW5rbm93bn19fSBzaWduZWRNdXRhdGlvbiAtIFNpZ25lZCBtdXRhdGlvbi1saWtlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSWRlbXBvdGVuY3kga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbXV0YXRpb25JZGVtcG90ZW5jeUtleShzaWduZWRNdXRhdGlvbikge1xuICBjb25zdCBtdXRhdGlvbiA9IHNpZ25lZE11dGF0aW9uLm11dGF0aW9uXG5cbiAgcmV0dXJuIFtcbiAgICByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5hY3RvclVzZXJJZCwgXCJhY3RvclVzZXJJZFwiKSxcbiAgICByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5hY3RvckRldmljZUlkLCBcImFjdG9yRGV2aWNlSWRcIiksXG4gICAgcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCwgXCJjbGllbnRNdXRhdGlvbklkXCIpXG4gIF0uam9pbihcIjpcIilcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHN0YWJsZSB2YWx1ZSBzaWduZWQgYnkgYmFja2VuZCBkZXZpY2UgY2VydGlmaWNhdGVzLlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWR9IGNlcnRpZmljYXRlIC0gQ2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gLSBTdGFibGUgc2lnbmF0dXJlIHZhbHVlLlxuICovXG5mdW5jdGlvbiBkZXZpY2VDZXJ0aWZpY2F0ZVNpZ25hdHVyZVZhbHVlKGNlcnRpZmljYXRlKSB7XG4gIHJldHVybiB7XG4gICAgYWxnb3JpdGhtOiBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0sXG4gICAgY2VydGlmaWNhdGU6IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovIChkZXRlcm1pbmlzdGljSnNvbk9iamVjdCh7bGFiZWw6IFwiY2VydGlmaWNhdGVcIiwgdmFsdWU6IGNlcnRpZmljYXRlfSkpXG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHN0YWJsZSB2YWx1ZSBzaWduZWQgYnkgc3luYyBtdXRhdGlvbnMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7RGV2aWNlQ2VydGlmaWNhdGV9IGFyZ3MuZGV2aWNlQ2VydGlmaWNhdGUgLSBEZXZpY2UgY2VydGlmaWNhdGUuXG4gKiBAcGFyYW0ge1N5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IC0gU3RhYmxlIHNpZ25hdHVyZSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc2lnbmVkTXV0YXRpb25TaWduYXR1cmVWYWx1ZSh7ZGV2aWNlQ2VydGlmaWNhdGUsIG11dGF0aW9ufSkge1xuICByZXR1cm4ge1xuICAgIGFsZ29yaXRobTogRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNLFxuICAgIGRldmljZUNlcnRpZmljYXRlOiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqLyAoZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsOiBcImRldmljZUNlcnRpZmljYXRlXCIsIHZhbHVlOiBkZXZpY2VDZXJ0aWZpY2F0ZX0pKSxcbiAgICBtdXRhdGlvbjogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gKi8gKGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbDogXCJtdXRhdGlvblwiLCB2YWx1ZTogbXV0YXRpb259KSlcbiAgfVxufVxuXG4vKipcbiAqIFNpZ25zIGEgZGV0ZXJtaW5pc3RpYyBKU09OIHZhbHVlIHdpdGggRUNEU0EgUC0yNTYvU0hBLTI1Ni5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5wcml2YXRlS2V5IC0gUHJpdmF0ZSBKV0suXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZ3MudmFsdWUgLSBWYWx1ZSB0byBzaWduLlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBQcmVmaXhlZCBiYXNlNjR1cmwgc2lnbmF0dXJlLlxuICovXG5hc3luYyBmdW5jdGlvbiBzaWduU3RhYmxlSnNvbih7cHJpdmF0ZUtleSwgdmFsdWV9KSB7XG4gIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmltcG9ydEtleShcImp3a1wiLCBwcml2YXRlS2V5LCB7bmFtZTogXCJFQ0RTQVwiLCBuYW1lZEN1cnZlOiBcIlAtMjU2XCJ9LCBmYWxzZSwgW1wic2lnblwiXSlcbiAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgY3J5cHRvU3VidGxlKCkuc2lnbih7aGFzaDogXCJTSEEtMjU2XCIsIG5hbWU6IFwiRUNEU0FcIn0sIGtleSwgLyoqIEB0eXBlIHtVaW50OEFycmF5PEFycmF5QnVmZmVyPn0gKi8gKHV0Zjgoc3RhYmxlSnNvblN0cmluZ2lmeSh2YWx1ZSkpKSlcblxuICByZXR1cm4gYCR7RUNEU0FfUDI1Nl9TSEEyNTZfU0lHTkFUVVJFX1BSRUZJWH0ke2Jhc2U2NFVybEVuY29kZShuZXcgVWludDhBcnJheShzaWduYXR1cmUpKX1gXG59XG5cbi8qKlxuICogVmVyaWZpZXMgYSBkZXRlcm1pbmlzdGljIEpTT04gdmFsdWUgd2l0aCBFQ0RTQSBQLTI1Ni9TSEEtMjU2LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge1N5bmNKc29uV2ViS2V5fSBhcmdzLnB1YmxpY0tleSAtIFB1YmxpYyBKV0suXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zaWduYXR1cmUgLSBQcmVmaXhlZCBiYXNlNjR1cmwgc2lnbmF0dXJlLlxuICogQHBhcmFtIHt1bmtub3dufSBhcmdzLnZhbHVlIC0gVmFsdWUgdG8gdmVyaWZ5LlxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgc2lnbmF0dXJlIG1hdGNoZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeVN0YWJsZUpzb25TaWduYXR1cmUoe3B1YmxpY0tleSwgc2lnbmF0dXJlLCB2YWx1ZX0pIHtcbiAgY29uc3Qga2V5ID0gYXdhaXQgY3J5cHRvU3VidGxlKCkuaW1wb3J0S2V5KFwiandrXCIsIHB1YmxpY0tleSwge25hbWU6IFwiRUNEU0FcIiwgbmFtZWRDdXJ2ZTogXCJQLTI1NlwifSwgZmFsc2UsIFtcInZlcmlmeVwiXSlcbiAgY29uc3Qgc2lnbmF0dXJlQnl0ZXMgPSBiYXNlNjRVcmxEZWNvZGUoc2lnbmF0dXJlV2l0aG91dFByZWZpeChzaWduYXR1cmUpKVxuXG4gIHJldHVybiBhd2FpdCBjcnlwdG9TdWJ0bGUoKS52ZXJpZnkoe2hhc2g6IFwiU0hBLTI1NlwiLCBuYW1lOiBcIkVDRFNBXCJ9LCBrZXksIC8qKiBAdHlwZSB7VWludDhBcnJheTxBcnJheUJ1ZmZlcj59ICovIChzaWduYXR1cmVCeXRlcyksIC8qKiBAdHlwZSB7VWludDhBcnJheTxBcnJheUJ1ZmZlcj59ICovICh1dGY4KHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpKSkpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHNpZ25lZCBkZXZpY2UgY2VydGlmaWNhdGUgZW52ZWxvcGUuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlfSBjZXJ0aWZpY2F0ZSAtIFNpZ25lZCBjZXJ0aWZpY2F0ZS5cbiAqIEByZXR1cm5zIHtEZXZpY2VDZXJ0aWZpY2F0ZX0gLSBOb3JtYWxpemVkIGNlcnRpZmljYXRlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEZXZpY2VDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSkge1xuICBpZiAoIWNlcnRpZmljYXRlIHx8IHR5cGVvZiBjZXJ0aWZpY2F0ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGNlcnRpZmljYXRlKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgZGV2aWNlIGNlcnRpZmljYXRlIG9iamVjdFwiKVxuICBpZiAoY2VydGlmaWNhdGUuYWxnb3JpdGhtICE9PSBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0pIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGV2aWNlIGNlcnRpZmljYXRlIGFsZ29yaXRobSAnJHtTdHJpbmcoY2VydGlmaWNhdGUuYWxnb3JpdGhtKX0nYClcblxuICByZXR1cm4ge1xuICAgIGFsZ29yaXRobTogY2VydGlmaWNhdGUuYWxnb3JpdGhtLFxuICAgIGNlcnRpZmljYXRlOiBub3JtYWxpemVEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWQoY2VydGlmaWNhdGUuY2VydGlmaWNhdGUpLFxuICAgIHNpZ25hdHVyZTogbm9ybWFsaXplU2lnbmF0dXJlKGNlcnRpZmljYXRlLnNpZ25hdHVyZSwgXCJkZXZpY2UgY2VydGlmaWNhdGUgc2lnbmF0dXJlXCIpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgZGV2aWNlIGNlcnRpZmljYXRlIHBheWxvYWQuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlUGF5bG9hZH0gY2VydGlmaWNhdGUgLSBDZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICogQHJldHVybnMge0RldmljZUNlcnRpZmljYXRlUGF5bG9hZH0gLSBOb3JtYWxpemVkIGNlcnRpZmljYXRlIHBheWxvYWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZURldmljZUNlcnRpZmljYXRlUGF5bG9hZChjZXJ0aWZpY2F0ZSkge1xuICBpZiAoIWNlcnRpZmljYXRlIHx8IHR5cGVvZiBjZXJ0aWZpY2F0ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGNlcnRpZmljYXRlKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgZGV2aWNlIGNlcnRpZmljYXRlIHBheWxvYWQgb2JqZWN0XCIpXG5cbiAgcmV0dXJuIHtcbiAgICBhY3RvckRldmljZUlkOiByZXF1aXJlZFN0cmluZyhjZXJ0aWZpY2F0ZS5hY3RvckRldmljZUlkLCBcImFjdG9yRGV2aWNlSWRcIiksXG4gICAgYWN0b3JVc2VySWQ6IHJlcXVpcmVkU3RyaW5nKGNlcnRpZmljYXRlLmFjdG9yVXNlcklkLCBcImFjdG9yVXNlcklkXCIpLFxuICAgIGNlcnRpZmljYXRlSWQ6IHJlcXVpcmVkU3RyaW5nKGNlcnRpZmljYXRlLmNlcnRpZmljYXRlSWQsIFwiY2VydGlmaWNhdGVJZFwiKSxcbiAgICBkZXZpY2VQdWJsaWNLZXk6IG5vcm1hbGl6ZUp3ayhjZXJ0aWZpY2F0ZS5kZXZpY2VQdWJsaWNLZXksIFwiZGV2aWNlUHVibGljS2V5XCIpLFxuICAgIGV4cGlyZXNBdDogaXNvRGF0ZVN0cmluZyhuZXcgRGF0ZShyZXF1aXJlZFN0cmluZyhjZXJ0aWZpY2F0ZS5leHBpcmVzQXQsIFwiZXhwaXJlc0F0XCIpKSwgXCJleHBpcmVzQXRcIiksXG4gICAgaXNzdWVkQXQ6IGlzb0RhdGVTdHJpbmcobmV3IERhdGUocmVxdWlyZWRTdHJpbmcoY2VydGlmaWNhdGUuaXNzdWVkQXQsIFwiaXNzdWVkQXRcIikpLCBcImlzc3VlZEF0XCIpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgc2lnbmVkIHN5bmMgbXV0YXRpb24gZW52ZWxvcGUuXG4gKiBAcGFyYW0ge1NpZ25lZFN5bmNNdXRhdGlvbn0gc2lnbmVkTXV0YXRpb24gLSBTaWduZWQgbXV0YXRpb24uXG4gKiBAcmV0dXJucyB7U2lnbmVkU3luY011dGF0aW9ufSAtIE5vcm1hbGl6ZWQgc2lnbmVkIG11dGF0aW9uLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTaWduZWRTeW5jTXV0YXRpb24oc2lnbmVkTXV0YXRpb24pIHtcbiAgaWYgKCFzaWduZWRNdXRhdGlvbiB8fCB0eXBlb2Ygc2lnbmVkTXV0YXRpb24gIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzaWduZWRNdXRhdGlvbikpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIHNpZ25lZCBzeW5jIG11dGF0aW9uIG9iamVjdFwiKVxuICBpZiAoc2lnbmVkTXV0YXRpb24uYWxnb3JpdGhtICE9PSBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0pIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc3luYyBtdXRhdGlvbiBhbGdvcml0aG0gJyR7U3RyaW5nKHNpZ25lZE11dGF0aW9uLmFsZ29yaXRobSl9J2ApXG5cbiAgcmV0dXJuIHtcbiAgICBhbGdvcml0aG06IHNpZ25lZE11dGF0aW9uLmFsZ29yaXRobSxcbiAgICBkZXZpY2VDZXJ0aWZpY2F0ZTogbm9ybWFsaXplRGV2aWNlQ2VydGlmaWNhdGUoc2lnbmVkTXV0YXRpb24uZGV2aWNlQ2VydGlmaWNhdGUpLFxuICAgIG11dGF0aW9uOiBub3JtYWxpemVTeW5jTXV0YXRpb24oc2lnbmVkTXV0YXRpb24ubXV0YXRpb24pLFxuICAgIHNpZ25hdHVyZTogbm9ybWFsaXplU2lnbmF0dXJlKHNpZ25lZE11dGF0aW9uLnNpZ25hdHVyZSwgXCJzeW5jIG11dGF0aW9uIHNpZ25hdHVyZVwiKVxuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHN5bmMgbXV0YXRpb24gcGF5bG9hZC5cbiAqIEBwYXJhbSB7U3luY011dGF0aW9ufSBtdXRhdGlvbiAtIE11dGF0aW9uIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7U3luY011dGF0aW9ufSAtIE5vcm1hbGl6ZWQgbXV0YXRpb24gcGF5bG9hZC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU3luY011dGF0aW9uKG11dGF0aW9uKSB7XG4gIGlmICghbXV0YXRpb24gfHwgdHlwZW9mIG11dGF0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobXV0YXRpb24pKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBzeW5jIG11dGF0aW9uIG9iamVjdFwiKVxuXG4gIC8qKiBAdHlwZSB7U3luY011dGF0aW9ufSAqL1xuICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgIGFjdG9yRGV2aWNlSWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmFjdG9yRGV2aWNlSWQsIFwiYWN0b3JEZXZpY2VJZFwiKSxcbiAgICBhY3RvclVzZXJJZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uYWN0b3JVc2VySWQsIFwiYWN0b3JVc2VySWRcIiksXG4gICAgY2xpZW50TXV0YXRpb25JZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCwgXCJjbGllbnRNdXRhdGlvbklkXCIpLFxuICAgIG1vZGVsOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5tb2RlbCwgXCJtb2RlbFwiKSxcbiAgICBvY2N1cnJlZEF0OiBpc29EYXRlU3RyaW5nKG5ldyBEYXRlKHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLm9jY3VycmVkQXQsIFwib2NjdXJyZWRBdFwiKSksIFwib2NjdXJyZWRBdFwiKSxcbiAgICBvZmZsaW5lR3JhbnRJZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24ub2ZmbGluZUdyYW50SWQsIFwib2ZmbGluZUdyYW50SWRcIiksXG4gICAgb3BlcmF0aW9uOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5vcGVyYXRpb24sIFwib3BlcmF0aW9uXCIpLFxuICAgIHBvbGljeUhhc2g6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLnBvbGljeUhhc2gsIFwicG9saWN5SGFzaFwiKVxuICB9XG5cbiAgaWYgKG11dGF0aW9uLmF0dHJpYnV0ZXMgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5hdHRyaWJ1dGVzID0gZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsOiBcImF0dHJpYnV0ZXNcIiwgdmFsdWU6IG11dGF0aW9uLmF0dHJpYnV0ZXN9KVxuICBpZiAobXV0YXRpb24uYmFzZVZlcnNpb24gIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5iYXNlVmVyc2lvbiA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0gKi8gKGRldGVybWluaXN0aWNKc29uKHtsYWJlbDogXCJiYXNlVmVyc2lvblwiLCB2YWx1ZTogbXV0YXRpb24uYmFzZVZlcnNpb259KSlcbiAgaWYgKG11dGF0aW9uLmNvbW1hbmQgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5jb21tYW5kID0gcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uY29tbWFuZCwgXCJjb21tYW5kXCIpXG4gIGlmIChtdXRhdGlvbi5wYXlsb2FkICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucGF5bG9hZCA9IGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbDogXCJwYXlsb2FkXCIsIHZhbHVlOiBtdXRhdGlvbi5wYXlsb2FkfSlcblxuICByZXR1cm4gbm9ybWFsaXplZFxufVxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBtdXRhdGlvbiBhY3RvciBmaWVsZHMgbWF0Y2ggdGhlIGNlcnRpZmljYXRlIGFjdG9yLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlUGF5bG9hZH0gYXJncy5jZXJ0aWZpY2F0ZSAtIERldmljZSBjZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICogQHBhcmFtIHtTeW5jTXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBNdXRhdGlvbiBwYXlsb2FkLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhc3NlcnRNdXRhdGlvbk1hdGNoZXNDZXJ0aWZpY2F0ZSh7Y2VydGlmaWNhdGUsIG11dGF0aW9ufSkge1xuICBpZiAobXV0YXRpb24uYWN0b3JEZXZpY2VJZCAhPT0gY2VydGlmaWNhdGUuYWN0b3JEZXZpY2VJZCB8fCBtdXRhdGlvbi5hY3RvclVzZXJJZCAhPT0gY2VydGlmaWNhdGUuYWN0b3JVc2VySWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIG11dGF0aW9uIGFjdG9yIGRvZXMgbm90IG1hdGNoIGRldmljZSBjZXJ0aWZpY2F0ZVwiKVxuICB9XG59XG5cbi8qKlxuICogQXNzZXJ0cyBhIHRpbWVzdGFtcCBpcyBub3QgZXhwaXJlZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZXhwaXJlc0F0IC0gRXhwaXJ5IHRpbWVzdGFtcC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmxhYmVsIC0gRXJyb3IgbGFiZWwuXG4gKiBAcGFyYW0ge0RhdGV9IGFyZ3Mubm93IC0gVmVyaWZpY2F0aW9uIHRpbWUuXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vdEV4cGlyZWQoe2V4cGlyZXNBdCwgbGFiZWwsIG5vd30pIHtcbiAgaWYgKE51bWJlci5pc05hTihub3cuZ2V0VGltZSgpKSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzeW5jIHZlcmlmaWNhdGlvbiB0aW1lXCIpXG4gIGlmIChuZXcgRGF0ZShleHBpcmVzQXQpLmdldFRpbWUoKSA8PSBub3cuZ2V0VGltZSgpKSB0aHJvdyBuZXcgRXJyb3IoYCR7bGFiZWx9IGV4cGlyZWRgKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBKU09OIFdlYiBLZXkgb2JqZWN0LlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0ga2V5IC0gSldLLlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gS2V5IGxhYmVsLlxuICogQHJldHVybnMge1N5bmNKc29uV2ViS2V5fSAtIE5vcm1hbGl6ZWQgSldLLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVKd2soa2V5LCBsYWJlbCkge1xuICBjb25zdCBub3JtYWxpemVkID0gZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsLCB2YWx1ZToga2V5fSlcblxuICByZXR1cm4gLyoqIEB0eXBlIHtTeW5jSnNvbldlYktleX0gKi8gKG5vcm1hbGl6ZWQpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHByZWZpeGVkIHNpZ25hdHVyZSBzdHJpbmcuXG4gKiBAcGFyYW0ge3Vua25vd259IHNpZ25hdHVyZSAtIFNpZ25hdHVyZSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEVycm9yIGxhYmVsLlxuICogQHJldHVybnMge3N0cmluZ30gLSBTaWduYXR1cmUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTaWduYXR1cmUoc2lnbmF0dXJlLCBsYWJlbCkge1xuICBpZiAodHlwZW9mIHNpZ25hdHVyZSAhPT0gXCJzdHJpbmdcIiB8fCAhc2lnbmF0dXJlLnN0YXJ0c1dpdGgoRUNEU0FfUDI1Nl9TSEEyNTZfU0lHTkFUVVJFX1BSRUZJWCkpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtsYWJlbH1gKVxuXG4gIHJldHVybiBzaWduYXR1cmVcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBzaWduYXR1cmUgcHJlZml4LlxuICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZSAtIFByZWZpeGVkIHNpZ25hdHVyZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQmFzZTY0dXJsIHNpZ25hdHVyZSBib2R5LlxuICovXG5mdW5jdGlvbiBzaWduYXR1cmVXaXRob3V0UHJlZml4KHNpZ25hdHVyZSkge1xuICByZXR1cm4gc2lnbmF0dXJlLnNsaWNlKEVDRFNBX1AyNTZfU0hBMjU2X1NJR05BVFVSRV9QUkVGSVgubGVuZ3RoKVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGEgbm9uLWVtcHR5IHN0cmluZyBmaWVsZC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBWYWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gRmllbGQgbmFtZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RyaW5nIHZhbHVlLlxuICovXG5mdW5jdGlvbiByZXF1aXJlZFN0cmluZyh2YWx1ZSwgbmFtZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlLmxlbmd0aCA8IDEpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgc3luYyAke25hbWV9YClcblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgRGF0ZSB0byBhbiBJU08gdGltZXN0YW1wLlxuICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gRGF0ZSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEZpZWxkIGxhYmVsLlxuICogQHJldHVybnMge3N0cmluZ30gLSBJU08gdGltZXN0YW1wLlxuICovXG5mdW5jdGlvbiBpc29EYXRlU3RyaW5nKGRhdGUsIGxhYmVsKSB7XG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3luYyAke2xhYmVsfWApXG5cbiAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxufVxuXG4vKipcbiAqIFJldHVybnMgZW5jb2RlZCBVVEYtOCBieXRlcyBmb3IgYSBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBTdHJpbmcgdmFsdWUuXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gLSBVVEYtOCBieXRlcy5cbiAqL1xuZnVuY3Rpb24gdXRmOCh2YWx1ZSkge1xuICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHZhbHVlKVxufVxuXG4vKipcbiAqIFJldHVybnMgV2ViQ3J5cHRvIHN1YnRsZSBBUEkuXG4gKiBAcmV0dXJucyB7U3VidGxlQ3J5cHRvfSAtIFN1YnRsZUNyeXB0byBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3J5cHRvU3VidGxlKCkge1xuICBpZiAoIWdsb2JhbFRoaXMuY3J5cHRvPy5zdWJ0bGUpIHRocm93IG5ldyBFcnJvcihcIldlYkNyeXB0byBzdWJ0bGUgQVBJIGlzIHJlcXVpcmVkIGZvciBzeW5jIHNpZ25pbmdcIilcblxuICByZXR1cm4gZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlXG59XG5cbi8qKlxuICogQmFzZTY0dXJsLWVuY29kZXMgYnl0ZXMuXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzIC0gQnl0ZXMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEJhc2U2NHVybCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2U2NFVybEVuY29kZShieXRlcykge1xuICBsZXQgYmluYXJ5ID0gXCJcIlxuXG4gIGZvciAoY29uc3QgYnl0ZSBvZiBieXRlcykgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSlcblxuICByZXR1cm4gYnRvYShiaW5hcnkpLnJlcGxhY2VBbGwoXCIrXCIsIFwiLVwiKS5yZXBsYWNlQWxsKFwiL1wiLCBcIl9cIikucmVwbGFjZUFsbChcIj1cIiwgXCJcIilcbn1cblxuLyoqXG4gKiBCYXNlNjR1cmwtZGVjb2RlcyBieXRlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIEJhc2U2NHVybCBzdHJpbmcuXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gLSBCeXRlcy5cbiAqL1xuZnVuY3Rpb24gYmFzZTY0VXJsRGVjb2RlKHZhbHVlKSB7XG4gIGNvbnN0IGJhc2U2NCA9IHZhbHVlLnJlcGxhY2VBbGwoXCItXCIsIFwiK1wiKS5yZXBsYWNlQWxsKFwiX1wiLCBcIi9cIikucGFkRW5kKE1hdGguY2VpbCh2YWx1ZS5sZW5ndGggLyA0KSAqIDQsIFwiPVwiKVxuICBjb25zdCBiaW5hcnkgPSBhdG9iKGJhc2U2NClcblxuICByZXR1cm4gVWludDhBcnJheS5mcm9tKGJpbmFyeSwgKGNoYXIpID0+IGNoYXIuY2hhckNvZGVBdCgwKSlcbn1cblxuLyoqXG4gKiBTdGFibGUgSlNPTiBzdHJpbmdpZmllciB3aXRoIHNvcnRlZCBvYmplY3Qga2V5cy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBWYWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSlNPTiBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRldGVybWluaXN0aWNKc29uKHtsYWJlbDogXCJyb290XCIsIHZhbHVlfSkpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHZhbHVlIGFzIGEgSlNPTiBvYmplY3QuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmxhYmVsIC0gRGlhZ25vc3RpYyBsYWJlbC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy52YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAtIEpTT04gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmlzdGljSnNvbk9iamVjdCh7bGFiZWwsIHZhbHVlfSkge1xuICBjb25zdCBub3JtYWxpemVkID0gZGV0ZXJtaW5pc3RpY0pzb24oe2xhYmVsLCB2YWx1ZX0pXG5cbiAgaWYgKCFub3JtYWxpemVkIHx8IHR5cGVvZiBub3JtYWxpemVkICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobm9ybWFsaXplZCkpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgc3luYyAke2xhYmVsfSBvYmplY3RgKVxuXG4gIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqLyAobm9ybWFsaXplZClcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGRldGVybWluaXN0aWMgSlNPTiB3aXRoIHNvcnRlZCBvYmplY3Qga2V5cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubGFiZWwgLSBEaWFnbm9zdGljIGxhYmVsLlxuICogQHBhcmFtIHt1bmtub3dufSBhcmdzLnZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZX0gLSBOb3JtYWxpemVkIEpTT04gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRldGVybWluaXN0aWNKc29uKHtsYWJlbCwgdmFsdWV9KSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB2YWx1ZVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLm1hcCgoZW50cnksIGluZGV4KSA9PiBkZXRlcm1pbmlzdGljSnNvbih7bGFiZWw6IGAke2xhYmVsfS8ke2luZGV4fWAsIHZhbHVlOiBlbnRyeX0pKVxuXG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpKSB7XG4gICAgICBjb25zdCBjaGlsZFZhbHVlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKVtrZXldXG5cbiAgICAgIGlmIChjaGlsZFZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICBub3JtYWxpemVkW2tleV0gPSBkZXRlcm1pbmlzdGljSnNvbih7bGFiZWw6IGAke2xhYmVsfS8ke2tleX1gLCB2YWx1ZTogY2hpbGRWYWx1ZX0pXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgU3luYyAke2xhYmVsfSBtdXN0IGJlIGRldGVybWluaXN0aWMgSlNPTmApXG59XG4iXX0=
|
|
@@ -1,44 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Local mutation log record query options.
|
|
3
|
-
* @typedef {object} LocalMutationLogRecordsOptions
|
|
4
|
-
* @property {LocalMutationStatus[]} [statuses] - Optional status filter.
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Local mutation log row-oriented storage adapter.
|
|
8
|
-
*
|
|
9
|
-
* Implementations should store each mutation log record as its own row/entry.
|
|
10
|
-
* Native apps should back this with SQLite and indexes on storage key, status,
|
|
11
|
-
* and sequence. Avoid storing the whole log as one JSON blob.
|
|
12
|
-
* @typedef {object} LocalMutationLogStorage
|
|
13
|
-
* @property {(storageKey: string, record: LocalMutationLogRecord) => Promise<void> | void} appendRecord - Appends one log record.
|
|
14
|
-
* @property {(storageKey: string, ids: string[]) => Promise<void> | void} deleteRecords - Deletes log records by id.
|
|
15
|
-
* @property {(storageKey: string) => Promise<number> | number} nextSequence - Returns the next local sequence number.
|
|
16
|
-
* @property {(storageKey: string, id: string) => Promise<LocalMutationLogRecord | null | undefined> | LocalMutationLogRecord | null | undefined} record - Reads one log record by id.
|
|
17
|
-
* @property {(storageKey: string, options?: LocalMutationLogRecordsOptions) => Promise<LocalMutationLogRecord[]> | LocalMutationLogRecord[]} records - Reads log records.
|
|
18
|
-
* @property {(storageKey: string, record: LocalMutationLogRecord) => Promise<void> | void} updateRecord - Replaces one log record.
|
|
19
|
-
*/
|
|
20
|
-
/**
|
|
21
|
-
* Local sync mutation dependency metadata.
|
|
22
|
-
* @typedef {object} LocalMutationDependency
|
|
23
|
-
* @property {string} clientMutationId - Client mutation id this mutation depends on.
|
|
24
|
-
* @property {string} model - Dependent model/resource name.
|
|
25
|
-
*/
|
|
26
|
-
/**
|
|
27
|
-
* Local mutation log status.
|
|
28
|
-
* @typedef {"pending" | "applied-locally" | "peer-applied" | "conflict" | "rejected" | "synced"} LocalMutationStatus
|
|
29
|
-
* */
|
|
30
|
-
/**
|
|
31
|
-
* Local mutation log record.
|
|
32
|
-
* @typedef {object} LocalMutationLogRecord
|
|
33
|
-
* @property {string} createdAt - ISO timestamp when the record was created locally.
|
|
34
|
-
* @property {LocalMutationDependency[]} dependencies - Other local mutations that must replay first.
|
|
35
|
-
* @property {string} id - Local log record id.
|
|
36
|
-
* @property {import("./device-identity.js").SyncMutation} mutation - Device mutation payload.
|
|
37
|
-
* @property {number} sequence - Monotonic local sequence.
|
|
38
|
-
* @property {LocalMutationStatus} status - Local replay/apply status.
|
|
39
|
-
* @property {Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue>} [syncResult] - Backend replay/result metadata.
|
|
40
|
-
* @property {string} updatedAt - ISO timestamp when the record was last changed.
|
|
41
|
-
*/
|
|
42
1
|
/** Client-side append-only sync mutation log with pluggable persistent storage. */
|
|
43
2
|
export default class LocalMutationLog {
|
|
44
3
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-mutation-log.d.ts","sourceRoot":"","sources":["../../../src/sync/local-mutation-log.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"local-mutation-log.d.ts","sourceRoot":"","sources":["../../../src/sync/local-mutation-log.js"],"names":[],"mappings":"AAmDA,mFAAmF;AACnF;IACE;;;;;;;OAOG;IACH,uDALG;QAA4B,WAAW,UAAzB,MAAM;QACM,GAAG,UAAf,IAAI;QACoB,OAAO,EAArC,uBAAuB;QACT,UAAU;KAClC,EAUA;IAJC,mBAVe,MAAM,CAUS;IAC9B,WAVe,IAAI,CAUL;IACd,iCAAsB;IACtB,mBAA4B;IAG9B;;;;;;OAMG;IACH,mCAJG;QAAyC,YAAY;QACK,QAAQ,EAA1D,OAAO,sBAAsB,EAAE,YAAY;KACnD,GAAU,OAAO,CAAC,sBAAsB,CAAC,CAmB3C;IAED;;;OAGG;IACH,WAFa,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAI7C;IAED;;;OAGG;IACH,kBAFa,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAI7C;IAED;;;;;;;OAOG;IACH,yCALG;QAAqB,EAAE,EAAf,MAAM;QACoB,MAAM,EAAhC,mBAAmB;QACmE,UAAU;KACxG,GAAU,OAAO,CAAC,sBAAsB,CAAC,CAmB3C;IAED;;;;;;OAMG;IACH,sDAJG;QAAsB,kBAAkB;QAClB,mBAAmB;KACzC,GAAU,OAAO,CAAC;QAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAC,CAAC,CAkCjD;IAED;;;OAGG;IACH,oBAFa,MAAM,CAQlB;CACF;;;;;;;;;;;;;;;;;;;;;kBArLa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;;;mBAC5E,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;;;kBAC3D,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM;;;;YAChD,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,sBAAsB,GAAG,IAAI,GAAG,SAAS;;;;aAClI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,8BAA8B,KAAK,OAAO,CAAC,sBAAsB,EAAE,CAAC,GAAG,sBAAsB,EAAE;;;;kBAC9H,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;;;;;;;;sBAK5E,MAAM;;;;WACN,MAAM;;;;;kCAIP,SAAS,GAAG,iBAAiB,GAAG,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ;;;;;;;;eAKlF,MAAM;;;;kBACN,uBAAuB,EAAE;;;;QACzB,MAAM;;;;cACN,OAAO,sBAAsB,EAAE,YAAY;;;;cAC3C,MAAM;;;;YACN,mBAAmB;;;;;;;;eAEnB,MAAM"}
|