velocious 1.0.643 → 1.0.645
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -10
- package/build/authorization/ability.js +36 -13
- package/build/background-jobs/adapter.js +9 -0
- package/build/background-jobs/main.js +35 -10
- package/build/background-jobs/store.js +217 -38
- package/build/background-jobs/types.js +15 -0
- package/build/configuration-types.js +1 -1
- package/build/configuration.js +45 -9
- package/build/database/drivers/base-column.js +8 -0
- package/build/database/drivers/mssql/sql/update.js +1 -3
- package/build/database/drivers/mysql/sql/update.js +1 -3
- package/build/database/drivers/pgsql/column.js +22 -0
- package/build/database/drivers/pgsql/sql/update.js +1 -3
- package/build/database/drivers/sqlite/sql/alter-table.js +11 -1
- package/build/database/drivers/sqlite/sql/update.js +1 -3
- package/build/database/query/index.js +2 -2
- package/build/database/query/model-class-query.js +26 -10
- package/build/database/query/preloader/has-many.js +4 -1
- package/build/database/query/query-data.js +2 -1
- package/build/database/query/update-base.js +14 -0
- package/build/database/query/with-count.js +3 -1
- package/build/database/record/acts-as-list.js +37 -13
- package/build/database/record/attachments/store.js +336 -26
- package/build/database/record/auditing.js +6 -3
- package/build/database/record/index.js +197 -42
- package/build/database/record/instance-relationships/belongs-to.js +2 -1
- package/build/database/record/validators/uniqueness.js +8 -5
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
- package/build/frontend-model-controller.js +136 -53
- package/build/frontend-model-resource/base-resource.js +87 -37
- package/build/frontend-model-resource/velocious-attachment-resource.js +98 -31
- package/build/frontend-models/base.js +307 -59
- package/build/frontend-models/preloader.js +6 -3
- package/build/frontend-models/query.js +15 -6
- package/build/frontend-models/resource-definition.js +21 -2
- package/build/frontend-models/use-destroyed-event.js +1 -1
- package/build/frontend-models/use-model-class-event.js +2 -2
- package/build/frontend-models/use-updated-event.js +1 -1
- package/build/frontend-models/websocket-channel.js +256 -93
- package/build/frontend-models/websocket-publishers.js +218 -18
- package/build/http-server/client/websocket-session.js +13 -1
- package/build/http-server/websocket-channel.js +15 -2
- package/build/src/authorization/ability.d.ts +9 -3
- package/build/src/authorization/ability.d.ts.map +1 -1
- package/build/src/authorization/ability.js +33 -14
- package/build/src/background-jobs/adapter.d.ts +6 -0
- package/build/src/background-jobs/adapter.d.ts.map +1 -1
- package/build/src/background-jobs/adapter.js +9 -1
- package/build/src/background-jobs/main.d.ts +6 -0
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +34 -11
- package/build/src/background-jobs/store.d.ts +66 -12
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +191 -35
- package/build/src/background-jobs/types.d.ts +55 -0
- package/build/src/background-jobs/types.d.ts.map +1 -1
- package/build/src/background-jobs/types.js +16 -1
- package/build/src/configuration-types.d.ts +3 -3
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +2 -2
- package/build/src/configuration.d.ts +18 -8
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +38 -7
- package/build/src/database/drivers/base-column.d.ts +5 -0
- package/build/src/database/drivers/base-column.d.ts.map +1 -1
- package/build/src/database/drivers/base-column.js +8 -1
- package/build/src/database/drivers/mssql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/update.js +2 -4
- package/build/src/database/drivers/mysql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/sql/update.js +2 -4
- package/build/src/database/drivers/pgsql/column.d.ts +5 -0
- package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/column.js +19 -1
- package/build/src/database/drivers/pgsql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/update.js +2 -4
- package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/alter-table.js +6 -2
- package/build/src/database/drivers/sqlite/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/update.js +2 -4
- package/build/src/database/query/index.d.ts +4 -4
- package/build/src/database/query/index.d.ts.map +1 -1
- package/build/src/database/query/index.js +3 -3
- package/build/src/database/query/model-class-query.d.ts +8 -2
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +25 -11
- package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
- package/build/src/database/query/preloader/has-many.js +4 -2
- package/build/src/database/query/query-data.d.ts.map +1 -1
- package/build/src/database/query/query-data.js +3 -2
- package/build/src/database/query/update-base.d.ts +7 -0
- package/build/src/database/query/update-base.d.ts.map +1 -1
- package/build/src/database/query/update-base.js +13 -1
- package/build/src/database/query/with-count.d.ts.map +1 -1
- package/build/src/database/query/with-count.js +3 -2
- package/build/src/database/record/acts-as-list.d.ts.map +1 -1
- package/build/src/database/record/acts-as-list.js +35 -14
- package/build/src/database/record/attachments/store.d.ts +67 -0
- package/build/src/database/record/attachments/store.d.ts.map +1 -1
- package/build/src/database/record/attachments/store.js +301 -25
- package/build/src/database/record/auditing.d.ts.map +1 -1
- package/build/src/database/record/auditing.js +7 -4
- package/build/src/database/record/index.d.ts +78 -26
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +171 -42
- package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/belongs-to.js +3 -2
- package/build/src/database/record/validators/uniqueness.d.ts.map +1 -1
- package/build/src/database/record/validators/uniqueness.js +8 -6
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +4 -4
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -12
- package/build/src/frontend-model-controller.d.ts +29 -8
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +122 -51
- package/build/src/frontend-model-resource/base-resource.d.ts +51 -24
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +83 -37
- package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts +45 -26
- package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/velocious-attachment-resource.js +89 -31
- package/build/src/frontend-models/base.d.ts +53 -20
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +275 -59
- package/build/src/frontend-models/preloader.d.ts.map +1 -1
- package/build/src/frontend-models/preloader.js +6 -4
- package/build/src/frontend-models/query.d.ts +2 -2
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +14 -7
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +20 -3
- package/build/src/frontend-models/use-destroyed-event.d.ts +1 -1
- package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-destroyed-event.js +2 -2
- package/build/src/frontend-models/use-model-class-event.d.ts +2 -2
- package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-model-class-event.js +3 -3
- package/build/src/frontend-models/use-updated-event.d.ts +1 -1
- package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-updated-event.js +2 -2
- package/build/src/frontend-models/websocket-channel.d.ts +60 -41
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +225 -85
- package/build/src/frontend-models/websocket-publishers.d.ts +9 -0
- package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-publishers.js +190 -19
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +11 -2
- package/build/src/http-server/websocket-channel.d.ts +20 -8
- package/build/src/http-server/websocket-channel.d.ts.map +1 -1
- package/build/src/http-server/websocket-channel.js +15 -3
- package/build/src/sync/assets/cache.d.ts +288 -0
- package/build/src/sync/assets/cache.d.ts.map +1 -0
- package/build/src/sync/assets/cache.js +883 -0
- package/build/src/sync/assets/types.d.ts +199 -0
- package/build/src/sync/assets/types.d.ts.map +1 -0
- package/build/src/sync/assets/types.js +56 -0
- package/build/src/sync/sync-api-client.d.ts.map +1 -1
- package/build/src/sync/sync-api-client.js +4 -3
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +3 -2
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +6 -5
- package/build/src/sync/sync-publisher.d.ts.map +1 -1
- package/build/src/sync/sync-publisher.js +4 -3
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +2 -2
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +3 -3
- package/build/src/testing/test-profiler.d.ts +4 -4
- package/build/src/testing/test-profiler.d.ts.map +1 -1
- package/build/src/testing/test-profiler.js +3 -3
- package/build/src/testing/test-runner.d.ts +279 -117
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +503 -933
- package/build/src/testing/test.d.ts +11 -72
- package/build/src/testing/test.d.ts.map +1 -1
- package/build/src/testing/test.js +131 -284
- package/build/src/testing/velocious-attempt-executor.d.ts +54 -0
- package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -0
- package/build/src/testing/velocious-attempt-executor.js +408 -0
- package/build/src/testing/velocious-runner-reporter.d.ts +67 -0
- package/build/src/testing/velocious-runner-reporter.d.ts.map +1 -0
- package/build/src/testing/velocious-runner-reporter.js +240 -0
- package/build/src/testing/velocious-suite-hook-executor.d.ts +19 -0
- package/build/src/testing/velocious-suite-hook-executor.d.ts.map +1 -0
- package/build/src/testing/velocious-suite-hook-executor.js +41 -0
- package/build/src/testing/velocious-test-arguments.d.ts +39 -0
- package/build/src/testing/velocious-test-arguments.d.ts.map +1 -0
- package/build/src/testing/velocious-test-arguments.js +55 -0
- package/build/src/utils/model-primary-key.d.ts +73 -0
- package/build/src/utils/model-primary-key.d.ts.map +1 -0
- package/build/src/utils/model-primary-key.js +144 -0
- package/build/src/utils/sha256-bytes-hex.d.ts +7 -0
- package/build/src/utils/sha256-bytes-hex.d.ts.map +1 -0
- package/build/src/utils/sha256-bytes-hex.js +117 -0
- package/build/src/utils/sha256-hex.d.ts +2 -4
- package/build/src/utils/sha256-hex.d.ts.map +1 -1
- package/build/src/utils/sha256-hex.js +6 -120
- package/build/sync/assets/cache.js +998 -0
- package/build/sync/assets/types.js +62 -0
- package/build/sync/sync-api-client.js +3 -2
- package/build/sync/sync-client.js +2 -1
- package/build/sync/sync-envelope-replay-service.js +5 -4
- package/build/sync/sync-publisher.js +3 -2
- package/build/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
- package/build/testing/test-profiler.js +2 -2
- package/build/testing/test-runner.js +496 -990
- package/build/testing/test.js +164 -306
- package/build/testing/velocious-attempt-executor.js +441 -0
- package/build/testing/velocious-runner-reporter.js +264 -0
- package/build/testing/velocious-suite-hook-executor.js +43 -0
- package/build/testing/velocious-test-arguments.js +64 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/utils/model-primary-key.js +171 -0
- package/build/utils/sha256-bytes-hex.js +132 -0
- package/build/utils/sha256-hex.js +7 -135
- package/package.json +5 -4
- package/src/authorization/ability.js +36 -13
- package/src/background-jobs/adapter.js +9 -0
- package/src/background-jobs/main.js +35 -10
- package/src/background-jobs/store.js +217 -38
- package/src/background-jobs/types.js +15 -0
- package/src/configuration-types.js +1 -1
- package/src/configuration.js +45 -9
- package/src/database/drivers/base-column.js +8 -0
- package/src/database/drivers/mssql/sql/update.js +1 -3
- package/src/database/drivers/mysql/sql/update.js +1 -3
- package/src/database/drivers/pgsql/column.js +22 -0
- package/src/database/drivers/pgsql/sql/update.js +1 -3
- package/src/database/drivers/sqlite/sql/alter-table.js +11 -1
- package/src/database/drivers/sqlite/sql/update.js +1 -3
- package/src/database/query/index.js +2 -2
- package/src/database/query/model-class-query.js +26 -10
- package/src/database/query/preloader/has-many.js +4 -1
- package/src/database/query/query-data.js +2 -1
- package/src/database/query/update-base.js +14 -0
- package/src/database/query/with-count.js +3 -1
- package/src/database/record/acts-as-list.js +37 -13
- package/src/database/record/attachments/store.js +336 -26
- package/src/database/record/auditing.js +6 -3
- package/src/database/record/index.js +197 -42
- package/src/database/record/instance-relationships/belongs-to.js +2 -1
- package/src/database/record/validators/uniqueness.js +8 -5
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
- package/src/frontend-model-controller.js +136 -53
- package/src/frontend-model-resource/base-resource.js +87 -37
- package/src/frontend-model-resource/velocious-attachment-resource.js +98 -31
- package/src/frontend-models/base.js +307 -59
- package/src/frontend-models/preloader.js +6 -3
- package/src/frontend-models/query.js +15 -6
- package/src/frontend-models/resource-definition.js +21 -2
- package/src/frontend-models/use-destroyed-event.js +1 -1
- package/src/frontend-models/use-model-class-event.js +2 -2
- package/src/frontend-models/use-updated-event.js +1 -1
- package/src/frontend-models/websocket-channel.js +256 -93
- package/src/frontend-models/websocket-publishers.js +218 -18
- package/src/http-server/client/websocket-session.js +13 -1
- package/src/http-server/websocket-channel.js +15 -2
- package/src/sync/assets/cache.js +998 -0
- package/src/sync/assets/types.js +62 -0
- package/src/sync/sync-api-client.js +3 -2
- package/src/sync/sync-client.js +2 -1
- package/src/sync/sync-envelope-replay-service.js +5 -4
- package/src/sync/sync-publisher.js +3 -2
- package/src/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
- package/src/testing/test-profiler.js +2 -2
- package/src/testing/test-runner.js +496 -990
- package/src/testing/test.js +164 -306
- package/src/testing/velocious-attempt-executor.js +441 -0
- package/src/testing/velocious-runner-reporter.js +264 -0
- package/src/testing/velocious-suite-hook-executor.js +43 -0
- package/src/testing/velocious-test-arguments.js +64 -0
- package/src/utils/model-primary-key.js +171 -0
- package/src/utils/sha256-bytes-hex.js +132 -0
- package/src/utils/sha256-hex.js +7 -135
- package/build/src/testing/testing-package-adapter.d.ts +0 -9
- package/build/src/testing/testing-package-adapter.d.ts.map +0 -1
- package/build/src/testing/testing-package-adapter.js +0 -69
- package/build/testing/testing-package-adapter.js +0 -76
- package/src/testing/testing-package-adapter.js +0 -76
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import isPlainObject from "./plain-object.js";
|
|
3
|
+
/** @typedef {string | number} ModelPrimaryKeyScalar */
|
|
4
|
+
/** @typedef {string | string[]} ModelPrimaryKeyDefinition */
|
|
5
|
+
/** @typedef {Record<string, ModelPrimaryKeyScalar>} CompositeModelPrimaryKeyValue */
|
|
6
|
+
/** @typedef {ModelPrimaryKeyScalar | CompositeModelPrimaryKeyValue} ModelPrimaryKeyValue */
|
|
7
|
+
/**
|
|
8
|
+
* Validates an untrusted composite identity and returns its definition-ordered values.
|
|
9
|
+
* @param {string[]} primaryKey - Composite primary-key definition.
|
|
10
|
+
* @param {ReturnType<typeof JSON.parse>} value - Candidate identity.
|
|
11
|
+
* @returns {CompositeModelPrimaryKeyValue} - Validated identity.
|
|
12
|
+
*/
|
|
13
|
+
export function validatedCompositePrimaryKeyValue(primaryKey, value) {
|
|
14
|
+
if (!isPlainObject(value)) {
|
|
15
|
+
throw new TypeError("Expected composite primary key identity to be a plain object.");
|
|
16
|
+
}
|
|
17
|
+
const valueKeys = Object.keys(value);
|
|
18
|
+
if (valueKeys.length !== primaryKey.length || primaryKey.some((key) => !Object.prototype.hasOwnProperty.call(value, key))) {
|
|
19
|
+
throw new TypeError(`Expected composite primary key identity fields: ${primaryKey.join(", ")}.`);
|
|
20
|
+
}
|
|
21
|
+
/** @type {CompositeModelPrimaryKeyValue} */
|
|
22
|
+
const validatedValue = {};
|
|
23
|
+
for (const key of primaryKey) {
|
|
24
|
+
const keyValue = value[key];
|
|
25
|
+
if (typeof keyValue !== "string" && typeof keyValue !== "number") {
|
|
26
|
+
throw new TypeError(`Expected composite primary key identity field '${key}' to be a string or number.`);
|
|
27
|
+
}
|
|
28
|
+
validatedValue[key] = keyValue;
|
|
29
|
+
}
|
|
30
|
+
return validatedValue;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Returns a scalar primary-key definition or fails at a feature boundary that cannot represent composite identities.
|
|
34
|
+
* @param {ModelPrimaryKeyDefinition} primaryKey - Primary-key definition.
|
|
35
|
+
* @param {string} operation - Operation requiring a scalar identity.
|
|
36
|
+
* @returns {string} - Scalar primary-key column or attribute name.
|
|
37
|
+
*/
|
|
38
|
+
export function scalarModelPrimaryKey(primaryKey, operation) {
|
|
39
|
+
if (Array.isArray(primaryKey)) {
|
|
40
|
+
throw new Error(`${operation} does not support composite primary keys.`);
|
|
41
|
+
}
|
|
42
|
+
return primaryKey;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Returns a scalar identity or fails at a feature boundary that cannot represent composite identities.
|
|
46
|
+
* @param {ModelPrimaryKeyValue} value - Model identity.
|
|
47
|
+
* @param {string} operation - Operation requiring a scalar identity.
|
|
48
|
+
* @returns {ModelPrimaryKeyScalar} - Scalar identity.
|
|
49
|
+
*/
|
|
50
|
+
export function scalarModelPrimaryKeyValue(value, operation) {
|
|
51
|
+
if (typeof value !== "string" && typeof value !== "number") {
|
|
52
|
+
throw new Error(`${operation} does not support composite primary keys.`);
|
|
53
|
+
}
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Builds query conditions from a scalar or composite model identity.
|
|
58
|
+
* @param {ModelPrimaryKeyDefinition} primaryKey - Primary-key definition.
|
|
59
|
+
* @param {ReturnType<typeof JSON.parse>} value - Candidate identity.
|
|
60
|
+
* @returns {Record<string, ModelPrimaryKeyScalar>} - Primary-key query conditions.
|
|
61
|
+
*/
|
|
62
|
+
export function modelPrimaryKeyConditions(primaryKey, value) {
|
|
63
|
+
if (Array.isArray(primaryKey))
|
|
64
|
+
return validatedCompositePrimaryKeyValue(primaryKey, value);
|
|
65
|
+
return { [primaryKey]: /** @type {ModelPrimaryKeyScalar} */ (value) };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Builds a qualified SQL predicate matching any supplied composite identity.
|
|
69
|
+
* @param {object} args - Arguments.
|
|
70
|
+
* @param {typeof import("../database/record/index.js").default} args.modelClass - Model class owning the identity attributes.
|
|
71
|
+
* @param {string[]} args.primaryKey - Composite primary-key definition.
|
|
72
|
+
* @param {import("../database/query/model-class-query.js").default<typeof import("../database/record/index.js").default>} args.query - Query receiving the predicate.
|
|
73
|
+
* @param {ModelPrimaryKeyValue[]} args.values - Candidate identities.
|
|
74
|
+
* @returns {string} - Qualified SQL predicate.
|
|
75
|
+
*/
|
|
76
|
+
export function compositeModelPrimaryKeyCohortSql({ modelClass, primaryKey, query, values }) {
|
|
77
|
+
if (values.length === 0)
|
|
78
|
+
return "(1 = 0)";
|
|
79
|
+
const tableSql = query.driver.quoteTable(query.getTableReferenceForJoin());
|
|
80
|
+
return `(${values.map((value) => {
|
|
81
|
+
const conditions = modelPrimaryKeyConditions(primaryKey, value);
|
|
82
|
+
const identitySql = primaryKey.map((attributeName) => {
|
|
83
|
+
const columnName = modelClass.getColumnNameForAttributeName(attributeName);
|
|
84
|
+
return `${tableSql}.${query.driver.quoteColumn(columnName)} = ${query.driver.quote(conditions[attributeName])}`;
|
|
85
|
+
}).join(" AND ");
|
|
86
|
+
return `(${identitySql})`;
|
|
87
|
+
}).join(" OR ")})`;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Reads a scalar or composite identity through the owning model's value reader.
|
|
91
|
+
* @param {ModelPrimaryKeyDefinition} primaryKey - Primary-key definition.
|
|
92
|
+
* @param {(key: string) => ReturnType<typeof JSON.parse>} read - Primary-key value reader.
|
|
93
|
+
* @returns {ModelPrimaryKeyValue} - Model identity.
|
|
94
|
+
*/
|
|
95
|
+
export function readModelPrimaryKeyValue(primaryKey, read) {
|
|
96
|
+
if (!Array.isArray(primaryKey))
|
|
97
|
+
return /** @type {ModelPrimaryKeyScalar} */ (read(primaryKey));
|
|
98
|
+
/** @type {CompositeModelPrimaryKeyValue} */
|
|
99
|
+
const value = {};
|
|
100
|
+
for (const key of primaryKey)
|
|
101
|
+
value[key] = /** @type {ModelPrimaryKeyScalar} */ (read(key));
|
|
102
|
+
return validatedCompositePrimaryKeyValue(primaryKey, value);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Returns an unambiguous map key while preserving legacy scalar map keys.
|
|
106
|
+
* @param {ModelPrimaryKeyDefinition} primaryKey - Primary-key definition.
|
|
107
|
+
* @param {ReturnType<typeof JSON.parse>} value - Candidate identity.
|
|
108
|
+
* @returns {string} - Canonical identity key.
|
|
109
|
+
*/
|
|
110
|
+
export function modelPrimaryKeyCacheKey(primaryKey, value) {
|
|
111
|
+
if (!Array.isArray(primaryKey))
|
|
112
|
+
return String(value);
|
|
113
|
+
const validatedValue = validatedCompositePrimaryKeyValue(primaryKey, value);
|
|
114
|
+
return JSON.stringify(primaryKey.map((key) => validatedValue[key]));
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Restores a model identity from its canonical string representation.
|
|
118
|
+
* @param {ModelPrimaryKeyDefinition} primaryKey - Primary-key definition.
|
|
119
|
+
* @param {string} cacheKey - Canonical identity key.
|
|
120
|
+
* @returns {ModelPrimaryKeyValue} - Restored identity.
|
|
121
|
+
*/
|
|
122
|
+
export function modelPrimaryKeyValueFromCacheKey(primaryKey, cacheKey) {
|
|
123
|
+
if (!Array.isArray(primaryKey))
|
|
124
|
+
return cacheKey;
|
|
125
|
+
let parsed;
|
|
126
|
+
try {
|
|
127
|
+
parsed = JSON.parse(cacheKey);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
if (!(error instanceof SyntaxError))
|
|
131
|
+
throw error;
|
|
132
|
+
throw new TypeError("Expected composite primary key cache value to be valid JSON.", { cause: error });
|
|
133
|
+
}
|
|
134
|
+
if (!Array.isArray(parsed) || parsed.length !== primaryKey.length) {
|
|
135
|
+
throw new TypeError(`Expected composite primary key cache value with ${primaryKey.length} fields.`);
|
|
136
|
+
}
|
|
137
|
+
/** @type {CompositeModelPrimaryKeyValue} */
|
|
138
|
+
const value = {};
|
|
139
|
+
for (let index = 0; index < primaryKey.length; index += 1) {
|
|
140
|
+
value[primaryKey[index]] = parsed[index];
|
|
141
|
+
}
|
|
142
|
+
return validatedCompositePrimaryKeyValue(primaryKey, value);
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtcHJpbWFyeS1rZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbW9kZWwtcHJpbWFyeS1rZXkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sYUFBYSxNQUFNLG1CQUFtQixDQUFBO0FBRTdDLHVEQUF1RDtBQUN2RCw2REFBNkQ7QUFDN0QscUZBQXFGO0FBQ3JGLDRGQUE0RjtBQUU1Rjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxpQ0FBaUMsQ0FBQyxVQUFVLEVBQUUsS0FBSztJQUNqRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLFNBQVMsQ0FBQywrREFBK0QsQ0FBQyxDQUFBO0lBQ3RGLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRXBDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUgsTUFBTSxJQUFJLFNBQVMsQ0FBQyxtREFBbUQsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDbEcsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUE7SUFFekIsS0FBSyxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUM3QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFM0IsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDakUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxrREFBa0QsR0FBRyw2QkFBNkIsQ0FBQyxDQUFBO1FBQ3pHLENBQUM7UUFFRCxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFBO0lBQ2hDLENBQUM7SUFFRCxPQUFPLGNBQWMsQ0FBQTtBQUN2QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsVUFBVSxFQUFFLFNBQVM7SUFDekQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFNBQVMsMkNBQTJDLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUE7QUFDbkIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUFDLEtBQUssRUFBRSxTQUFTO0lBQ3pELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxTQUFTLDJDQUEyQyxDQUFDLENBQUE7SUFDMUUsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUFDLFVBQVUsRUFBRSxLQUFLO0lBQ3pELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFBRSxPQUFPLGlDQUFpQyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUUxRixPQUFPLEVBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUE7QUFDckUsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGlDQUFpQyxDQUFDLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDO0lBQ3ZGLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUE7SUFFekMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLENBQUMsQ0FBQTtJQUUxRSxPQUFPLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzlCLE1BQU0sVUFBVSxHQUFHLHlCQUF5QixDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUMvRCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDbkQsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBRTFFLE9BQU8sR0FBRyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUNqSCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFaEIsT0FBTyxJQUFJLFdBQVcsR0FBRyxDQUFBO0lBQzNCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFBO0FBQ3BCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsSUFBSTtJQUN2RCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFBRSxPQUFPLG9DQUFvQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7SUFFOUYsNENBQTRDO0lBQzVDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQTtJQUVoQixLQUFLLE1BQU0sR0FBRyxJQUFJLFVBQVU7UUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsb0NBQW9DLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUUzRixPQUFPLGlDQUFpQyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUM3RCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsVUFBVSxFQUFFLEtBQUs7SUFDdkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFcEQsTUFBTSxjQUFjLEdBQUcsaUNBQWlDLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBRTNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3JFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxnQ0FBZ0MsQ0FBQyxVQUFVLEVBQUUsUUFBUTtJQUNuRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFBRSxPQUFPLFFBQVEsQ0FBQTtJQUUvQyxJQUFJLE1BQU0sQ0FBQTtJQUVWLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQy9CLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLFdBQVcsQ0FBQztZQUFFLE1BQU0sS0FBSyxDQUFBO1FBRWhELE1BQU0sSUFBSSxTQUFTLENBQUMsOERBQThELEVBQUUsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtJQUNyRyxDQUFDO0lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxtREFBbUQsVUFBVSxDQUFDLE1BQU0sVUFBVSxDQUFDLENBQUE7SUFDckcsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUE7SUFFaEIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzFELEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDMUMsQ0FBQztJQUVELE9BQU8saUNBQWlDLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFBO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSBcIi4vcGxhaW4tb2JqZWN0LmpzXCJcblxuLyoqIEB0eXBlZGVmIHtzdHJpbmcgfCBudW1iZXJ9IE1vZGVsUHJpbWFyeUtleVNjYWxhciAqL1xuLyoqIEB0eXBlZGVmIHtzdHJpbmcgfCBzdHJpbmdbXX0gTW9kZWxQcmltYXJ5S2V5RGVmaW5pdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBNb2RlbFByaW1hcnlLZXlTY2FsYXI+fSBDb21wb3NpdGVNb2RlbFByaW1hcnlLZXlWYWx1ZSAqL1xuLyoqIEB0eXBlZGVmIHtNb2RlbFByaW1hcnlLZXlTY2FsYXIgfCBDb21wb3NpdGVNb2RlbFByaW1hcnlLZXlWYWx1ZX0gTW9kZWxQcmltYXJ5S2V5VmFsdWUgKi9cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW4gdW50cnVzdGVkIGNvbXBvc2l0ZSBpZGVudGl0eSBhbmQgcmV0dXJucyBpdHMgZGVmaW5pdGlvbi1vcmRlcmVkIHZhbHVlcy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHByaW1hcnlLZXkgLSBDb21wb3NpdGUgcHJpbWFyeS1rZXkgZGVmaW5pdGlvbi5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gQ2FuZGlkYXRlIGlkZW50aXR5LlxuICogQHJldHVybnMge0NvbXBvc2l0ZU1vZGVsUHJpbWFyeUtleVZhbHVlfSAtIFZhbGlkYXRlZCBpZGVudGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlZENvbXBvc2l0ZVByaW1hcnlLZXlWYWx1ZShwcmltYXJ5S2V5LCB2YWx1ZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSBpZGVudGl0eSB0byBiZSBhIHBsYWluIG9iamVjdC5cIilcbiAgfVxuXG4gIGNvbnN0IHZhbHVlS2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKVxuXG4gIGlmICh2YWx1ZUtleXMubGVuZ3RoICE9PSBwcmltYXJ5S2V5Lmxlbmd0aCB8fCBwcmltYXJ5S2V5LnNvbWUoKGtleSkgPT4gIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBjb21wb3NpdGUgcHJpbWFyeSBrZXkgaWRlbnRpdHkgZmllbGRzOiAke3ByaW1hcnlLZXkuam9pbihcIiwgXCIpfS5gKVxuICB9XG5cbiAgLyoqIEB0eXBlIHtDb21wb3NpdGVNb2RlbFByaW1hcnlLZXlWYWx1ZX0gKi9cbiAgY29uc3QgdmFsaWRhdGVkVmFsdWUgPSB7fVxuXG4gIGZvciAoY29uc3Qga2V5IG9mIHByaW1hcnlLZXkpIHtcbiAgICBjb25zdCBrZXlWYWx1ZSA9IHZhbHVlW2tleV1cblxuICAgIGlmICh0eXBlb2Yga2V5VmFsdWUgIT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGtleVZhbHVlICE9PSBcIm51bWJlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBjb21wb3NpdGUgcHJpbWFyeSBrZXkgaWRlbnRpdHkgZmllbGQgJyR7a2V5fScgdG8gYmUgYSBzdHJpbmcgb3IgbnVtYmVyLmApXG4gICAgfVxuXG4gICAgdmFsaWRhdGVkVmFsdWVba2V5XSA9IGtleVZhbHVlXG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkVmFsdWVcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc2NhbGFyIHByaW1hcnkta2V5IGRlZmluaXRpb24gb3IgZmFpbHMgYXQgYSBmZWF0dXJlIGJvdW5kYXJ5IHRoYXQgY2Fubm90IHJlcHJlc2VudCBjb21wb3NpdGUgaWRlbnRpdGllcy5cbiAqIEBwYXJhbSB7TW9kZWxQcmltYXJ5S2V5RGVmaW5pdGlvbn0gcHJpbWFyeUtleSAtIFByaW1hcnkta2V5IGRlZmluaXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIHJlcXVpcmluZyBhIHNjYWxhciBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2NhbGFyIHByaW1hcnkta2V5IGNvbHVtbiBvciBhdHRyaWJ1dGUgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYWxhck1vZGVsUHJpbWFyeUtleShwcmltYXJ5S2V5LCBvcGVyYXRpb24pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocHJpbWFyeUtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b3BlcmF0aW9ufSBkb2VzIG5vdCBzdXBwb3J0IGNvbXBvc2l0ZSBwcmltYXJ5IGtleXMuYClcbiAgfVxuXG4gIHJldHVybiBwcmltYXJ5S2V5XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNjYWxhciBpZGVudGl0eSBvciBmYWlscyBhdCBhIGZlYXR1cmUgYm91bmRhcnkgdGhhdCBjYW5ub3QgcmVwcmVzZW50IGNvbXBvc2l0ZSBpZGVudGl0aWVzLlxuICogQHBhcmFtIHtNb2RlbFByaW1hcnlLZXlWYWx1ZX0gdmFsdWUgLSBNb2RlbCBpZGVudGl0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRpb24gLSBPcGVyYXRpb24gcmVxdWlyaW5nIGEgc2NhbGFyIGlkZW50aXR5LlxuICogQHJldHVybnMge01vZGVsUHJpbWFyeUtleVNjYWxhcn0gLSBTY2FsYXIgaWRlbnRpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2FsYXJNb2RlbFByaW1hcnlLZXlWYWx1ZSh2YWx1ZSwgb3BlcmF0aW9uKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke29wZXJhdGlvbn0gZG9lcyBub3Qgc3VwcG9ydCBjb21wb3NpdGUgcHJpbWFyeSBrZXlzLmApXG4gIH1cblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBCdWlsZHMgcXVlcnkgY29uZGl0aW9ucyBmcm9tIGEgc2NhbGFyIG9yIGNvbXBvc2l0ZSBtb2RlbCBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TW9kZWxQcmltYXJ5S2V5RGVmaW5pdGlvbn0gcHJpbWFyeUtleSAtIFByaW1hcnkta2V5IGRlZmluaXRpb24uXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIENhbmRpZGF0ZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBNb2RlbFByaW1hcnlLZXlTY2FsYXI+fSAtIFByaW1hcnkta2V5IHF1ZXJ5IGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFByaW1hcnlLZXlDb25kaXRpb25zKHByaW1hcnlLZXksIHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHByaW1hcnlLZXkpKSByZXR1cm4gdmFsaWRhdGVkQ29tcG9zaXRlUHJpbWFyeUtleVZhbHVlKHByaW1hcnlLZXksIHZhbHVlKVxuXG4gIHJldHVybiB7W3ByaW1hcnlLZXldOiAvKiogQHR5cGUge01vZGVsUHJpbWFyeUtleVNjYWxhcn0gKi8gKHZhbHVlKX1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBxdWFsaWZpZWQgU1FMIHByZWRpY2F0ZSBtYXRjaGluZyBhbnkgc3VwcGxpZWQgY29tcG9zaXRlIGlkZW50aXR5LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbENsYXNzIC0gTW9kZWwgY2xhc3Mgb3duaW5nIHRoZSBpZGVudGl0eSBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5wcmltYXJ5S2V5IC0gQ29tcG9zaXRlIHByaW1hcnkta2V5IGRlZmluaXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gYXJncy5xdWVyeSAtIFF1ZXJ5IHJlY2VpdmluZyB0aGUgcHJlZGljYXRlLlxuICogQHBhcmFtIHtNb2RlbFByaW1hcnlLZXlWYWx1ZVtdfSBhcmdzLnZhbHVlcyAtIENhbmRpZGF0ZSBpZGVudGl0aWVzLlxuICogQHJldHVybnMge3N0cmluZ30gLSBRdWFsaWZpZWQgU1FMIHByZWRpY2F0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2l0ZU1vZGVsUHJpbWFyeUtleUNvaG9ydFNxbCh7bW9kZWxDbGFzcywgcHJpbWFyeUtleSwgcXVlcnksIHZhbHVlc30pIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiBcIigxID0gMClcIlxuXG4gIGNvbnN0IHRhYmxlU3FsID0gcXVlcnkuZHJpdmVyLnF1b3RlVGFibGUocXVlcnkuZ2V0VGFibGVSZWZlcmVuY2VGb3JKb2luKCkpXG5cbiAgcmV0dXJuIGAoJHt2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBtb2RlbFByaW1hcnlLZXlDb25kaXRpb25zKHByaW1hcnlLZXksIHZhbHVlKVxuICAgIGNvbnN0IGlkZW50aXR5U3FsID0gcHJpbWFyeUtleS5tYXAoKGF0dHJpYnV0ZU5hbWUpID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICAgIHJldHVybiBgJHt0YWJsZVNxbH0uJHtxdWVyeS5kcml2ZXIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSl9ID0gJHtxdWVyeS5kcml2ZXIucXVvdGUoY29uZGl0aW9uc1thdHRyaWJ1dGVOYW1lXSl9YFxuICAgIH0pLmpvaW4oXCIgQU5EIFwiKVxuXG4gICAgcmV0dXJuIGAoJHtpZGVudGl0eVNxbH0pYFxuICB9KS5qb2luKFwiIE9SIFwiKX0pYFxufVxuXG4vKipcbiAqIFJlYWRzIGEgc2NhbGFyIG9yIGNvbXBvc2l0ZSBpZGVudGl0eSB0aHJvdWdoIHRoZSBvd25pbmcgbW9kZWwncyB2YWx1ZSByZWFkZXIuXG4gKiBAcGFyYW0ge01vZGVsUHJpbWFyeUtleURlZmluaXRpb259IHByaW1hcnlLZXkgLSBQcmltYXJ5LWtleSBkZWZpbml0aW9uLlxuICogQHBhcmFtIHsoa2V5OiBzdHJpbmcpID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSByZWFkIC0gUHJpbWFyeS1rZXkgdmFsdWUgcmVhZGVyLlxuICogQHJldHVybnMge01vZGVsUHJpbWFyeUtleVZhbHVlfSAtIE1vZGVsIGlkZW50aXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZE1vZGVsUHJpbWFyeUtleVZhbHVlKHByaW1hcnlLZXksIHJlYWQpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHByaW1hcnlLZXkpKSByZXR1cm4gLyoqIEB0eXBlIHtNb2RlbFByaW1hcnlLZXlTY2FsYXJ9ICovIChyZWFkKHByaW1hcnlLZXkpKVxuXG4gIC8qKiBAdHlwZSB7Q29tcG9zaXRlTW9kZWxQcmltYXJ5S2V5VmFsdWV9ICovXG4gIGNvbnN0IHZhbHVlID0ge31cblxuICBmb3IgKGNvbnN0IGtleSBvZiBwcmltYXJ5S2V5KSB2YWx1ZVtrZXldID0gLyoqIEB0eXBlIHtNb2RlbFByaW1hcnlLZXlTY2FsYXJ9ICovIChyZWFkKGtleSkpXG5cbiAgcmV0dXJuIHZhbGlkYXRlZENvbXBvc2l0ZVByaW1hcnlLZXlWYWx1ZShwcmltYXJ5S2V5LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIHVuYW1iaWd1b3VzIG1hcCBrZXkgd2hpbGUgcHJlc2VydmluZyBsZWdhY3kgc2NhbGFyIG1hcCBrZXlzLlxuICogQHBhcmFtIHtNb2RlbFByaW1hcnlLZXlEZWZpbml0aW9ufSBwcmltYXJ5S2V5IC0gUHJpbWFyeS1rZXkgZGVmaW5pdGlvbi5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gQ2FuZGlkYXRlIGlkZW50aXR5LlxuICogQHJldHVybnMge3N0cmluZ30gLSBDYW5vbmljYWwgaWRlbnRpdHkga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxQcmltYXJ5S2V5Q2FjaGVLZXkocHJpbWFyeUtleSwgdmFsdWUpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHByaW1hcnlLZXkpKSByZXR1cm4gU3RyaW5nKHZhbHVlKVxuXG4gIGNvbnN0IHZhbGlkYXRlZFZhbHVlID0gdmFsaWRhdGVkQ29tcG9zaXRlUHJpbWFyeUtleVZhbHVlKHByaW1hcnlLZXksIHZhbHVlKVxuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShwcmltYXJ5S2V5Lm1hcCgoa2V5KSA9PiB2YWxpZGF0ZWRWYWx1ZVtrZXldKSlcbn1cblxuLyoqXG4gKiBSZXN0b3JlcyBhIG1vZGVsIGlkZW50aXR5IGZyb20gaXRzIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0ge01vZGVsUHJpbWFyeUtleURlZmluaXRpb259IHByaW1hcnlLZXkgLSBQcmltYXJ5LWtleSBkZWZpbml0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlS2V5IC0gQ2Fub25pY2FsIGlkZW50aXR5IGtleS5cbiAqIEByZXR1cm5zIHtNb2RlbFByaW1hcnlLZXlWYWx1ZX0gLSBSZXN0b3JlZCBpZGVudGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsUHJpbWFyeUtleVZhbHVlRnJvbUNhY2hlS2V5KHByaW1hcnlLZXksIGNhY2hlS2V5KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShwcmltYXJ5S2V5KSkgcmV0dXJuIGNhY2hlS2V5XG5cbiAgbGV0IHBhcnNlZFxuXG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShjYWNoZUtleSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSkgdGhyb3cgZXJyb3JcblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBjb21wb3NpdGUgcHJpbWFyeSBrZXkgY2FjaGUgdmFsdWUgdG8gYmUgdmFsaWQgSlNPTi5cIiwge2NhdXNlOiBlcnJvcn0pXG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkocGFyc2VkKSB8fCBwYXJzZWQubGVuZ3RoICE9PSBwcmltYXJ5S2V5Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSBjYWNoZSB2YWx1ZSB3aXRoICR7cHJpbWFyeUtleS5sZW5ndGh9IGZpZWxkcy5gKVxuICB9XG5cbiAgLyoqIEB0eXBlIHtDb21wb3NpdGVNb2RlbFByaW1hcnlLZXlWYWx1ZX0gKi9cbiAgY29uc3QgdmFsdWUgPSB7fVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBwcmltYXJ5S2V5Lmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHZhbHVlW3ByaW1hcnlLZXlbaW5kZXhdXSA9IHBhcnNlZFtpbmRleF1cbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZWRDb21wb3NpdGVQcmltYXJ5S2V5VmFsdWUocHJpbWFyeUtleSwgdmFsdWUpXG59XG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Computes a SHA-256 hex digest for arbitrary bytes without Node-only imports.
|
|
3
|
+
* @param {Uint8Array} bytes - Bytes to digest.
|
|
4
|
+
* @returns {string} Hex digest.
|
|
5
|
+
*/
|
|
6
|
+
export default function sha256BytesHex(bytes: Uint8Array): string;
|
|
7
|
+
//# sourceMappingURL=sha256-bytes-hex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sha256-bytes-hex.d.ts","sourceRoot":"","sources":["../../../src/utils/sha256-bytes-hex.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,KAAK,EAHjC,UAGiC,GAF/B,MAAM,CAmFlB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/**
|
|
3
|
+
* Computes a SHA-256 hex digest for arbitrary bytes without Node-only imports.
|
|
4
|
+
* @param {Uint8Array} bytes - Bytes to digest.
|
|
5
|
+
* @returns {string} Hex digest.
|
|
6
|
+
*/
|
|
7
|
+
export default function sha256BytesHex(bytes) {
|
|
8
|
+
const bitLength = bytes.length * 8;
|
|
9
|
+
const blockCount = Math.ceil((bytes.length + 9) / 64);
|
|
10
|
+
const block = new Uint8Array(64);
|
|
11
|
+
const hash = SHA256_INITIAL_HASH.slice();
|
|
12
|
+
/** @type {number[]} */
|
|
13
|
+
const words = new Array(64);
|
|
14
|
+
const highLength = Math.floor(bitLength / 0x100000000);
|
|
15
|
+
const lowLength = bitLength >>> 0;
|
|
16
|
+
for (let blockIndex = 0; blockIndex < blockCount; blockIndex += 1) {
|
|
17
|
+
const offset = blockIndex * 64;
|
|
18
|
+
const chunkLength = Math.min(64, Math.max(0, bytes.length - offset));
|
|
19
|
+
block.fill(0);
|
|
20
|
+
if (chunkLength > 0)
|
|
21
|
+
block.set(bytes.subarray(offset, offset + chunkLength));
|
|
22
|
+
if (bytes.length >= offset && bytes.length < offset + 64)
|
|
23
|
+
block[bytes.length - offset] = 0x80;
|
|
24
|
+
if (blockIndex === blockCount - 1) {
|
|
25
|
+
block[56] = (highLength >>> 24) & 0xff;
|
|
26
|
+
block[57] = (highLength >>> 16) & 0xff;
|
|
27
|
+
block[58] = (highLength >>> 8) & 0xff;
|
|
28
|
+
block[59] = highLength & 0xff;
|
|
29
|
+
block[60] = (lowLength >>> 24) & 0xff;
|
|
30
|
+
block[61] = (lowLength >>> 16) & 0xff;
|
|
31
|
+
block[62] = (lowLength >>> 8) & 0xff;
|
|
32
|
+
block[63] = lowLength & 0xff;
|
|
33
|
+
}
|
|
34
|
+
for (let index = 0; index < 16; index++) {
|
|
35
|
+
const byteIndex = index * 4;
|
|
36
|
+
words[index] = ((block[byteIndex] << 24) | (block[byteIndex + 1] << 16) | (block[byteIndex + 2] << 8) | block[byteIndex + 3]) >>> 0;
|
|
37
|
+
}
|
|
38
|
+
for (let index = 16; index < 64; index++) {
|
|
39
|
+
const s0 = rotateRight(words[index - 15], 7) ^ rotateRight(words[index - 15], 18) ^ (words[index - 15] >>> 3);
|
|
40
|
+
const s1 = rotateRight(words[index - 2], 17) ^ rotateRight(words[index - 2], 19) ^ (words[index - 2] >>> 10);
|
|
41
|
+
words[index] = add32(words[index - 16], s0, words[index - 7], s1);
|
|
42
|
+
}
|
|
43
|
+
let a = hash[0];
|
|
44
|
+
let b = hash[1];
|
|
45
|
+
let c = hash[2];
|
|
46
|
+
let d = hash[3];
|
|
47
|
+
let e = hash[4];
|
|
48
|
+
let f = hash[5];
|
|
49
|
+
let g = hash[6];
|
|
50
|
+
let h = hash[7];
|
|
51
|
+
for (let index = 0; index < 64; index++) {
|
|
52
|
+
const s1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25);
|
|
53
|
+
const ch = (e & f) ^ ((~e) & g);
|
|
54
|
+
const temp1 = add32(h, s1, ch, SHA256_K[index], words[index]);
|
|
55
|
+
const s0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22);
|
|
56
|
+
const maj = (a & b) ^ (a & c) ^ (b & c);
|
|
57
|
+
const temp2 = add32(s0, maj);
|
|
58
|
+
h = g;
|
|
59
|
+
g = f;
|
|
60
|
+
f = e;
|
|
61
|
+
e = add32(d, temp1);
|
|
62
|
+
d = c;
|
|
63
|
+
c = b;
|
|
64
|
+
b = a;
|
|
65
|
+
a = add32(temp1, temp2);
|
|
66
|
+
}
|
|
67
|
+
hash[0] = add32(hash[0], a);
|
|
68
|
+
hash[1] = add32(hash[1], b);
|
|
69
|
+
hash[2] = add32(hash[2], c);
|
|
70
|
+
hash[3] = add32(hash[3], d);
|
|
71
|
+
hash[4] = add32(hash[4], e);
|
|
72
|
+
hash[5] = add32(hash[5], f);
|
|
73
|
+
hash[6] = add32(hash[6], g);
|
|
74
|
+
hash[7] = add32(hash[7], h);
|
|
75
|
+
}
|
|
76
|
+
return hash.map((value) => value.toString(16).padStart(8, "0")).join("");
|
|
77
|
+
}
|
|
78
|
+
const SHA256_INITIAL_HASH = [
|
|
79
|
+
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
|
|
80
|
+
0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
|
|
81
|
+
];
|
|
82
|
+
const SHA256_K = [
|
|
83
|
+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
|
|
84
|
+
0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
85
|
+
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
|
|
86
|
+
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
|
87
|
+
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
|
|
88
|
+
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
89
|
+
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
|
|
90
|
+
0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
|
91
|
+
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
|
|
92
|
+
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
93
|
+
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
|
|
94
|
+
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
95
|
+
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
|
|
96
|
+
0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
97
|
+
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
|
|
98
|
+
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
|
99
|
+
];
|
|
100
|
+
/**
|
|
101
|
+
* Rotates an unsigned value right.
|
|
102
|
+
* @param {number} value Unsigned value.
|
|
103
|
+
* @param {number} bits Rotation count.
|
|
104
|
+
* @returns {number} Rotated value.
|
|
105
|
+
*/
|
|
106
|
+
function rotateRight(value, bits) {
|
|
107
|
+
return (value >>> bits) | (value << (32 - bits));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Adds numbers with unsigned 32-bit overflow.
|
|
111
|
+
* @param {...number} values Values to add.
|
|
112
|
+
* @returns {number} Unsigned sum.
|
|
113
|
+
*/
|
|
114
|
+
function add32(...values) {
|
|
115
|
+
return values.reduce((sum, value) => (sum + value) >>> 0, 0);
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhMjU2LWJ5dGVzLWhleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaGEyNTYtYnl0ZXMtaGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sVUFBVSxjQUFjLENBQUMsS0FBSztJQUMxQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtJQUNsQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtJQUNyRCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNoQyxNQUFNLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUN4Qyx1QkFBdUI7SUFDdkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLENBQUE7SUFDdEQsTUFBTSxTQUFTLEdBQUcsU0FBUyxLQUFLLENBQUMsQ0FBQTtJQUVqQyxLQUFLLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRSxVQUFVLEdBQUcsVUFBVSxFQUFFLFVBQVUsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsRSxNQUFNLE1BQU0sR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFBO1FBQzlCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUVwRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2IsSUFBSSxXQUFXLEdBQUcsQ0FBQztZQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFDNUUsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sR0FBRyxFQUFFO1lBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFBO1FBRTdGLElBQUksVUFBVSxLQUFLLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFBO1lBQ3RDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUE7WUFDdEMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQTtZQUNyQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQTtZQUM3QixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFBO1lBQ3JDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUE7WUFDckMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQTtZQUNwQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQTtRQUM5QixDQUFDO1FBRUQsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sU0FBUyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUE7WUFFM0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JJLENBQUM7UUFFRCxLQUFLLElBQUksS0FBSyxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDekMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQzdHLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtZQUU1RyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDbkUsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUVmLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN4QyxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUN0RSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUMvQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQzdELE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBQ3RFLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFFNUIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNMLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDTCxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ0wsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDbkIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNMLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDTCxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ0wsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDekIsQ0FBQztRQUVELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQzdCLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUMxRSxDQUFDO0FBRUQsTUFBTSxtQkFBbUIsR0FBRztJQUMxQixVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7Q0FDL0MsQ0FBQTtBQUVELE1BQU0sUUFBUSxHQUFHO0lBQ2YsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtDQUMvQyxDQUFBO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSTtJQUM5QixPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7QUFDbEQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLEtBQUssQ0FBQyxHQUFHLE1BQU07SUFDdEIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBDb21wdXRlcyBhIFNIQS0yNTYgaGV4IGRpZ2VzdCBmb3IgYXJiaXRyYXJ5IGJ5dGVzIHdpdGhvdXQgTm9kZS1vbmx5IGltcG9ydHMuXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzIC0gQnl0ZXMgdG8gZGlnZXN0LlxuICogQHJldHVybnMge3N0cmluZ30gSGV4IGRpZ2VzdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2hhMjU2Qnl0ZXNIZXgoYnl0ZXMpIHtcbiAgY29uc3QgYml0TGVuZ3RoID0gYnl0ZXMubGVuZ3RoICogOFxuICBjb25zdCBibG9ja0NvdW50ID0gTWF0aC5jZWlsKChieXRlcy5sZW5ndGggKyA5KSAvIDY0KVxuICBjb25zdCBibG9jayA9IG5ldyBVaW50OEFycmF5KDY0KVxuICBjb25zdCBoYXNoID0gU0hBMjU2X0lOSVRJQUxfSEFTSC5zbGljZSgpXG4gIC8qKiBAdHlwZSB7bnVtYmVyW119ICovXG4gIGNvbnN0IHdvcmRzID0gbmV3IEFycmF5KDY0KVxuXG4gIGNvbnN0IGhpZ2hMZW5ndGggPSBNYXRoLmZsb29yKGJpdExlbmd0aCAvIDB4MTAwMDAwMDAwKVxuICBjb25zdCBsb3dMZW5ndGggPSBiaXRMZW5ndGggPj4+IDBcblxuICBmb3IgKGxldCBibG9ja0luZGV4ID0gMDsgYmxvY2tJbmRleCA8IGJsb2NrQ291bnQ7IGJsb2NrSW5kZXggKz0gMSkge1xuICAgIGNvbnN0IG9mZnNldCA9IGJsb2NrSW5kZXggKiA2NFxuICAgIGNvbnN0IGNodW5rTGVuZ3RoID0gTWF0aC5taW4oNjQsIE1hdGgubWF4KDAsIGJ5dGVzLmxlbmd0aCAtIG9mZnNldCkpXG5cbiAgICBibG9jay5maWxsKDApXG4gICAgaWYgKGNodW5rTGVuZ3RoID4gMCkgYmxvY2suc2V0KGJ5dGVzLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgY2h1bmtMZW5ndGgpKVxuICAgIGlmIChieXRlcy5sZW5ndGggPj0gb2Zmc2V0ICYmIGJ5dGVzLmxlbmd0aCA8IG9mZnNldCArIDY0KSBibG9ja1tieXRlcy5sZW5ndGggLSBvZmZzZXRdID0gMHg4MFxuXG4gICAgaWYgKGJsb2NrSW5kZXggPT09IGJsb2NrQ291bnQgLSAxKSB7XG4gICAgICBibG9ja1s1Nl0gPSAoaGlnaExlbmd0aCA+Pj4gMjQpICYgMHhmZlxuICAgICAgYmxvY2tbNTddID0gKGhpZ2hMZW5ndGggPj4+IDE2KSAmIDB4ZmZcbiAgICAgIGJsb2NrWzU4XSA9IChoaWdoTGVuZ3RoID4+PiA4KSAmIDB4ZmZcbiAgICAgIGJsb2NrWzU5XSA9IGhpZ2hMZW5ndGggJiAweGZmXG4gICAgICBibG9ja1s2MF0gPSAobG93TGVuZ3RoID4+PiAyNCkgJiAweGZmXG4gICAgICBibG9ja1s2MV0gPSAobG93TGVuZ3RoID4+PiAxNikgJiAweGZmXG4gICAgICBibG9ja1s2Ml0gPSAobG93TGVuZ3RoID4+PiA4KSAmIDB4ZmZcbiAgICAgIGJsb2NrWzYzXSA9IGxvd0xlbmd0aCAmIDB4ZmZcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMTY7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGJ5dGVJbmRleCA9IGluZGV4ICogNFxuXG4gICAgICB3b3Jkc1tpbmRleF0gPSAoKGJsb2NrW2J5dGVJbmRleF0gPDwgMjQpIHwgKGJsb2NrW2J5dGVJbmRleCArIDFdIDw8IDE2KSB8IChibG9ja1tieXRlSW5kZXggKyAyXSA8PCA4KSB8IGJsb2NrW2J5dGVJbmRleCArIDNdKSA+Pj4gMFxuICAgIH1cblxuICAgIGZvciAobGV0IGluZGV4ID0gMTY7IGluZGV4IDwgNjQ7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHMwID0gcm90YXRlUmlnaHQod29yZHNbaW5kZXggLSAxNV0sIDcpIF4gcm90YXRlUmlnaHQod29yZHNbaW5kZXggLSAxNV0sIDE4KSBeICh3b3Jkc1tpbmRleCAtIDE1XSA+Pj4gMylcbiAgICAgIGNvbnN0IHMxID0gcm90YXRlUmlnaHQod29yZHNbaW5kZXggLSAyXSwgMTcpIF4gcm90YXRlUmlnaHQod29yZHNbaW5kZXggLSAyXSwgMTkpIF4gKHdvcmRzW2luZGV4IC0gMl0gPj4+IDEwKVxuXG4gICAgICB3b3Jkc1tpbmRleF0gPSBhZGQzMih3b3Jkc1tpbmRleCAtIDE2XSwgczAsIHdvcmRzW2luZGV4IC0gN10sIHMxKVxuICAgIH1cblxuICAgIGxldCBhID0gaGFzaFswXVxuICAgIGxldCBiID0gaGFzaFsxXVxuICAgIGxldCBjID0gaGFzaFsyXVxuICAgIGxldCBkID0gaGFzaFszXVxuICAgIGxldCBlID0gaGFzaFs0XVxuICAgIGxldCBmID0gaGFzaFs1XVxuICAgIGxldCBnID0gaGFzaFs2XVxuICAgIGxldCBoID0gaGFzaFs3XVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDY0OyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBzMSA9IHJvdGF0ZVJpZ2h0KGUsIDYpIF4gcm90YXRlUmlnaHQoZSwgMTEpIF4gcm90YXRlUmlnaHQoZSwgMjUpXG4gICAgICBjb25zdCBjaCA9IChlICYgZikgXiAoKH5lKSAmIGcpXG4gICAgICBjb25zdCB0ZW1wMSA9IGFkZDMyKGgsIHMxLCBjaCwgU0hBMjU2X0tbaW5kZXhdLCB3b3Jkc1tpbmRleF0pXG4gICAgICBjb25zdCBzMCA9IHJvdGF0ZVJpZ2h0KGEsIDIpIF4gcm90YXRlUmlnaHQoYSwgMTMpIF4gcm90YXRlUmlnaHQoYSwgMjIpXG4gICAgICBjb25zdCBtYWogPSAoYSAmIGIpIF4gKGEgJiBjKSBeIChiICYgYylcbiAgICAgIGNvbnN0IHRlbXAyID0gYWRkMzIoczAsIG1hailcblxuICAgICAgaCA9IGdcbiAgICAgIGcgPSBmXG4gICAgICBmID0gZVxuICAgICAgZSA9IGFkZDMyKGQsIHRlbXAxKVxuICAgICAgZCA9IGNcbiAgICAgIGMgPSBiXG4gICAgICBiID0gYVxuICAgICAgYSA9IGFkZDMyKHRlbXAxLCB0ZW1wMilcbiAgICB9XG5cbiAgICBoYXNoWzBdID0gYWRkMzIoaGFzaFswXSwgYSlcbiAgICBoYXNoWzFdID0gYWRkMzIoaGFzaFsxXSwgYilcbiAgICBoYXNoWzJdID0gYWRkMzIoaGFzaFsyXSwgYylcbiAgICBoYXNoWzNdID0gYWRkMzIoaGFzaFszXSwgZClcbiAgICBoYXNoWzRdID0gYWRkMzIoaGFzaFs0XSwgZSlcbiAgICBoYXNoWzVdID0gYWRkMzIoaGFzaFs1XSwgZilcbiAgICBoYXNoWzZdID0gYWRkMzIoaGFzaFs2XSwgZylcbiAgICBoYXNoWzddID0gYWRkMzIoaGFzaFs3XSwgaClcbiAgfVxuXG4gIHJldHVybiBoYXNoLm1hcCgodmFsdWUpID0+IHZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCBcIjBcIikpLmpvaW4oXCJcIilcbn1cblxuY29uc3QgU0hBMjU2X0lOSVRJQUxfSEFTSCA9IFtcbiAgMHg2YTA5ZTY2NywgMHhiYjY3YWU4NSwgMHgzYzZlZjM3MiwgMHhhNTRmZjUzYSxcbiAgMHg1MTBlNTI3ZiwgMHg5YjA1Njg4YywgMHgxZjgzZDlhYiwgMHg1YmUwY2QxOVxuXVxuXG5jb25zdCBTSEEyNTZfSyA9IFtcbiAgMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSxcbiAgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSxcbiAgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMyxcbiAgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhjMTliZjE3NCxcbiAgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYyxcbiAgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSxcbiAgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNyxcbiAgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NyxcbiAgMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMyxcbiAgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSxcbiAgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMyxcbiAgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCxcbiAgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSxcbiAgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMyxcbiAgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCxcbiAgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMlxuXVxuXG4vKipcbiAqIFJvdGF0ZXMgYW4gdW5zaWduZWQgdmFsdWUgcmlnaHQuXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVW5zaWduZWQgdmFsdWUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0cyBSb3RhdGlvbiBjb3VudC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJvdGF0ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHJvdGF0ZVJpZ2h0KHZhbHVlLCBiaXRzKSB7XG4gIHJldHVybiAodmFsdWUgPj4+IGJpdHMpIHwgKHZhbHVlIDw8ICgzMiAtIGJpdHMpKVxufVxuXG4vKipcbiAqIEFkZHMgbnVtYmVycyB3aXRoIHVuc2lnbmVkIDMyLWJpdCBvdmVyZmxvdy5cbiAqIEBwYXJhbSB7Li4ubnVtYmVyfSB2YWx1ZXMgVmFsdWVzIHRvIGFkZC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFVuc2lnbmVkIHN1bS5cbiAqL1xuZnVuY3Rpb24gYWRkMzIoLi4udmFsdWVzKSB7XG4gIHJldHVybiB2YWx1ZXMucmVkdWNlKChzdW0sIHZhbHVlKSA9PiAoc3VtICsgdmFsdWUpID4+PiAwLCAwKVxufVxuIl19
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Computes SHA-256 without importing Node-only crypto modules, keeping this
|
|
3
|
-
* module safe for Expo/browser bundles.
|
|
4
|
-
* pure-JavaScript SHA-256 derived from FIPS 180-4, using only 32-bit unsigned
|
|
5
|
-
* integer arithmetic.
|
|
3
|
+
* module safe for Expo/browser bundles.
|
|
6
4
|
* @param {string} message - UTF-8 message.
|
|
7
|
-
* @returns {string}
|
|
5
|
+
* @returns {string} Hex digest.
|
|
8
6
|
*/
|
|
9
7
|
export default function sha256Hex(message: string): string;
|
|
10
8
|
//# sourceMappingURL=sha256-hex.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sha256-hex.d.ts","sourceRoot":"","sources":["../../../src/utils/sha256-hex.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sha256-hex.d.ts","sourceRoot":"","sources":["../../../src/utils/sha256-hex.js"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,OAAO,EAH9B,MAG8B,GAF5B,MAAM,CAIlB"}
|
|
@@ -1,126 +1,12 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import sha256BytesHex from "./sha256-bytes-hex.js";
|
|
1
3
|
/**
|
|
2
4
|
* Computes SHA-256 without importing Node-only crypto modules, keeping this
|
|
3
|
-
* module safe for Expo/browser bundles.
|
|
4
|
-
* pure-JavaScript SHA-256 derived from FIPS 180-4, using only 32-bit unsigned
|
|
5
|
-
* integer arithmetic.
|
|
5
|
+
* module safe for Expo/browser bundles.
|
|
6
6
|
* @param {string} message - UTF-8 message.
|
|
7
|
-
* @returns {string}
|
|
7
|
+
* @returns {string} Hex digest.
|
|
8
8
|
*/
|
|
9
9
|
export default function sha256Hex(message) {
|
|
10
|
-
|
|
11
|
-
const padded = [...bytes];
|
|
12
|
-
const bitLength = bytes.length * 8;
|
|
13
|
-
const hash = [...SHA256_INITIAL_HASH];
|
|
14
|
-
/** @type {number[]} */
|
|
15
|
-
const words = new Array(64);
|
|
16
|
-
padded.push(0x80);
|
|
17
|
-
while (padded.length % 64 !== 56)
|
|
18
|
-
padded.push(0);
|
|
19
|
-
const highLength = Math.floor(bitLength / 0x100000000);
|
|
20
|
-
const lowLength = bitLength >>> 0;
|
|
21
|
-
for (const value of [highLength, lowLength]) {
|
|
22
|
-
padded.push((value >>> 24) & 0xff, (value >>> 16) & 0xff, (value >>> 8) & 0xff, value & 0xff);
|
|
23
|
-
}
|
|
24
|
-
for (let offset = 0; offset < padded.length; offset += 64) {
|
|
25
|
-
for (let i = 0; i < 16; i++) {
|
|
26
|
-
const index = offset + (i * 4);
|
|
27
|
-
words[i] = (((padded[index] || 0) << 24) | ((padded[index + 1] || 0) << 16) | ((padded[index + 2] || 0) << 8) | (padded[index + 3] || 0)) >>> 0;
|
|
28
|
-
}
|
|
29
|
-
for (let i = 16; i < 64; i++) {
|
|
30
|
-
const s0 = rotateRight(words[i - 15], 7) ^ rotateRight(words[i - 15], 18) ^ (words[i - 15] >>> 3);
|
|
31
|
-
const s1 = rotateRight(words[i - 2], 17) ^ rotateRight(words[i - 2], 19) ^ (words[i - 2] >>> 10);
|
|
32
|
-
words[i] = add32(words[i - 16], s0, words[i - 7], s1);
|
|
33
|
-
}
|
|
34
|
-
let [a, b, c, d, e, f, g, h] = hash;
|
|
35
|
-
for (let i = 0; i < 64; i++) {
|
|
36
|
-
const s1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25);
|
|
37
|
-
const ch = (e & f) ^ ((~e) & g);
|
|
38
|
-
const temp1 = add32(h, s1, ch, SHA256_K[i], words[i]);
|
|
39
|
-
const s0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22);
|
|
40
|
-
const maj = (a & b) ^ (a & c) ^ (b & c);
|
|
41
|
-
const temp2 = add32(s0, maj);
|
|
42
|
-
h = g;
|
|
43
|
-
g = f;
|
|
44
|
-
f = e;
|
|
45
|
-
e = add32(d, temp1);
|
|
46
|
-
d = c;
|
|
47
|
-
c = b;
|
|
48
|
-
b = a;
|
|
49
|
-
a = add32(temp1, temp2);
|
|
50
|
-
}
|
|
51
|
-
hash[0] = add32(hash[0], a);
|
|
52
|
-
hash[1] = add32(hash[1], b);
|
|
53
|
-
hash[2] = add32(hash[2], c);
|
|
54
|
-
hash[3] = add32(hash[3], d);
|
|
55
|
-
hash[4] = add32(hash[4], e);
|
|
56
|
-
hash[5] = add32(hash[5], f);
|
|
57
|
-
hash[6] = add32(hash[6], g);
|
|
58
|
-
hash[7] = add32(hash[7], h);
|
|
59
|
-
}
|
|
60
|
-
return hash.map((value) => value.toString(16).padStart(8, "0")).join("");
|
|
10
|
+
return sha256BytesHex(new TextEncoder().encode(message));
|
|
61
11
|
}
|
|
62
|
-
|
|
63
|
-
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
|
|
64
|
-
0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
|
|
65
|
-
];
|
|
66
|
-
const SHA256_K = [
|
|
67
|
-
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
|
|
68
|
-
0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
69
|
-
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
|
|
70
|
-
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
|
71
|
-
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
|
|
72
|
-
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
73
|
-
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
|
|
74
|
-
0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
|
75
|
-
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
|
|
76
|
-
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
77
|
-
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
|
|
78
|
-
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
79
|
-
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
|
|
80
|
-
0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
81
|
-
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
|
|
82
|
-
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
|
83
|
-
];
|
|
84
|
-
/**
|
|
85
|
-
* Converts a string to UTF-8 bytes.
|
|
86
|
-
* @param {string} value - String value.
|
|
87
|
-
* @returns {number[]} - UTF-8 bytes.
|
|
88
|
-
*/
|
|
89
|
-
function utf8Bytes(value) {
|
|
90
|
-
/** @type {number[]} */
|
|
91
|
-
const bytes = [];
|
|
92
|
-
for (const character of value) {
|
|
93
|
-
const codePoint = /** @type {number} */ (character.codePointAt(0));
|
|
94
|
-
if (codePoint <= 0x7f) {
|
|
95
|
-
bytes.push(codePoint);
|
|
96
|
-
}
|
|
97
|
-
else if (codePoint <= 0x7ff) {
|
|
98
|
-
bytes.push(0xc0 | (codePoint >>> 6), 0x80 | (codePoint & 0x3f));
|
|
99
|
-
}
|
|
100
|
-
else if (codePoint <= 0xffff) {
|
|
101
|
-
bytes.push(0xe0 | (codePoint >>> 12), 0x80 | ((codePoint >>> 6) & 0x3f), 0x80 | (codePoint & 0x3f));
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
bytes.push(0xf0 | (codePoint >>> 18), 0x80 | ((codePoint >>> 12) & 0x3f), 0x80 | ((codePoint >>> 6) & 0x3f), 0x80 | (codePoint & 0x3f));
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return bytes;
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Adds unsigned 32-bit integers.
|
|
111
|
-
* @param {...number} values - Values to add.
|
|
112
|
-
* @returns {number} - Unsigned 32-bit result.
|
|
113
|
-
*/
|
|
114
|
-
function add32(...values) {
|
|
115
|
-
return values.reduce((sum, value) => (sum + value) >>> 0, 0);
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Rotates a 32-bit integer right.
|
|
119
|
-
* @param {number} value - Value to rotate.
|
|
120
|
-
* @param {number} bits - Bit count.
|
|
121
|
-
* @returns {number} - Rotated value.
|
|
122
|
-
*/
|
|
123
|
-
function rotateRight(value, bits) {
|
|
124
|
-
return (value >>> bits) | (value << (32 - bits));
|
|
125
|
-
}
|
|
126
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhMjU2LWhleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaGEyNTYtaGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsT0FBTyxVQUFVLFNBQVMsQ0FBQyxPQUFPO0lBQ3ZDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNoQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUE7SUFDekIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFDbEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLENBQUE7SUFDckMsdUJBQXVCO0lBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRTNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDakIsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUUsS0FBSyxFQUFFO1FBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUVoRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsQ0FBQTtJQUN0RCxNQUFNLFNBQVMsR0FBRyxTQUFTLEtBQUssQ0FBQyxDQUFBO0lBRWpDLEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQTtJQUMvRixDQUFDO0lBRUQsS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzFELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QixNQUFNLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFFOUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDakosQ0FBQztRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3QixNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDakcsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1lBRWhHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUN2RCxDQUFDO1FBRUQsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUE7UUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVCLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBQ3RFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQy9CLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDckQsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFDdEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDdkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUU1QixDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ0wsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNMLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDTCxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUNuQixDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ0wsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNMLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDTCxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN6QixDQUFDO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDN0IsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQzFFLENBQUM7QUFFRCxNQUFNLG1CQUFtQixHQUFHO0lBQzFCLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtDQUMvQyxDQUFBO0FBRUQsTUFBTSxRQUFRLEdBQUc7SUFDZixVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0NBQy9DLENBQUE7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBSztJQUN0Qix1QkFBdUI7SUFDdkIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFBO0lBRWhCLEtBQUssTUFBTSxTQUFTLElBQUksS0FBSyxFQUFFLENBQUM7UUFDOUIsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFbEUsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN2QixDQUFDO2FBQU0sSUFBSSxTQUFTLElBQUksS0FBSyxFQUFFLENBQUM7WUFDOUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDakUsQ0FBQzthQUFNLElBQUksU0FBUyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3JHLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDekksQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxLQUFLLENBQUMsR0FBRyxNQUFNO0lBQ3RCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUM5RCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSTtJQUM5QixPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7QUFDbEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tcHV0ZXMgU0hBLTI1NiB3aXRob3V0IGltcG9ydGluZyBOb2RlLW9ubHkgY3J5cHRvIG1vZHVsZXMsIGtlZXBpbmcgdGhpc1xuICogbW9kdWxlIHNhZmUgZm9yIEV4cG8vYnJvd3NlciBidW5kbGVzLiBJbXBsZW1lbnRhdGlvbiBpcyBhIHN0cmFpZ2h0Zm9yd2FyZFxuICogcHVyZS1KYXZhU2NyaXB0IFNIQS0yNTYgZGVyaXZlZCBmcm9tIEZJUFMgMTgwLTQsIHVzaW5nIG9ubHkgMzItYml0IHVuc2lnbmVkXG4gKiBpbnRlZ2VyIGFyaXRobWV0aWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFVURi04IG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEhleCBkaWdlc3QuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNoYTI1NkhleChtZXNzYWdlKSB7XG4gIGNvbnN0IGJ5dGVzID0gdXRmOEJ5dGVzKG1lc3NhZ2UpXG4gIGNvbnN0IHBhZGRlZCA9IFsuLi5ieXRlc11cbiAgY29uc3QgYml0TGVuZ3RoID0gYnl0ZXMubGVuZ3RoICogOFxuICBjb25zdCBoYXNoID0gWy4uLlNIQTI1Nl9JTklUSUFMX0hBU0hdXG4gIC8qKiBAdHlwZSB7bnVtYmVyW119ICovXG4gIGNvbnN0IHdvcmRzID0gbmV3IEFycmF5KDY0KVxuXG4gIHBhZGRlZC5wdXNoKDB4ODApXG4gIHdoaWxlIChwYWRkZWQubGVuZ3RoICUgNjQgIT09IDU2KSBwYWRkZWQucHVzaCgwKVxuXG4gIGNvbnN0IGhpZ2hMZW5ndGggPSBNYXRoLmZsb29yKGJpdExlbmd0aCAvIDB4MTAwMDAwMDAwKVxuICBjb25zdCBsb3dMZW5ndGggPSBiaXRMZW5ndGggPj4+IDBcblxuICBmb3IgKGNvbnN0IHZhbHVlIG9mIFtoaWdoTGVuZ3RoLCBsb3dMZW5ndGhdKSB7XG4gICAgcGFkZGVkLnB1c2goKHZhbHVlID4+PiAyNCkgJiAweGZmLCAodmFsdWUgPj4+IDE2KSAmIDB4ZmYsICh2YWx1ZSA+Pj4gOCkgJiAweGZmLCB2YWx1ZSAmIDB4ZmYpXG4gIH1cblxuICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBwYWRkZWQubGVuZ3RoOyBvZmZzZXQgKz0gNjQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gb2Zmc2V0ICsgKGkgKiA0KVxuXG4gICAgICB3b3Jkc1tpXSA9ICgoKHBhZGRlZFtpbmRleF0gfHwgMCkgPDwgMjQpIHwgKChwYWRkZWRbaW5kZXggKyAxXSB8fCAwKSA8PCAxNikgfCAoKHBhZGRlZFtpbmRleCArIDJdIHx8IDApIDw8IDgpIHwgKHBhZGRlZFtpbmRleCArIDNdIHx8IDApKSA+Pj4gMFxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAxNjsgaSA8IDY0OyBpKyspIHtcbiAgICAgIGNvbnN0IHMwID0gcm90YXRlUmlnaHQod29yZHNbaSAtIDE1XSwgNykgXiByb3RhdGVSaWdodCh3b3Jkc1tpIC0gMTVdLCAxOCkgXiAod29yZHNbaSAtIDE1XSA+Pj4gMylcbiAgICAgIGNvbnN0IHMxID0gcm90YXRlUmlnaHQod29yZHNbaSAtIDJdLCAxNykgXiByb3RhdGVSaWdodCh3b3Jkc1tpIC0gMl0sIDE5KSBeICh3b3Jkc1tpIC0gMl0gPj4+IDEwKVxuXG4gICAgICB3b3Jkc1tpXSA9IGFkZDMyKHdvcmRzW2kgLSAxNl0sIHMwLCB3b3Jkc1tpIC0gN10sIHMxKVxuICAgIH1cblxuICAgIGxldCBbYSwgYiwgYywgZCwgZSwgZiwgZywgaF0gPSBoYXNoXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY0OyBpKyspIHtcbiAgICAgIGNvbnN0IHMxID0gcm90YXRlUmlnaHQoZSwgNikgXiByb3RhdGVSaWdodChlLCAxMSkgXiByb3RhdGVSaWdodChlLCAyNSlcbiAgICAgIGNvbnN0IGNoID0gKGUgJiBmKSBeICgofmUpICYgZylcbiAgICAgIGNvbnN0IHRlbXAxID0gYWRkMzIoaCwgczEsIGNoLCBTSEEyNTZfS1tpXSwgd29yZHNbaV0pXG4gICAgICBjb25zdCBzMCA9IHJvdGF0ZVJpZ2h0KGEsIDIpIF4gcm90YXRlUmlnaHQoYSwgMTMpIF4gcm90YXRlUmlnaHQoYSwgMjIpXG4gICAgICBjb25zdCBtYWogPSAoYSAmIGIpIF4gKGEgJiBjKSBeIChiICYgYylcbiAgICAgIGNvbnN0IHRlbXAyID0gYWRkMzIoczAsIG1hailcblxuICAgICAgaCA9IGdcbiAgICAgIGcgPSBmXG4gICAgICBmID0gZVxuICAgICAgZSA9IGFkZDMyKGQsIHRlbXAxKVxuICAgICAgZCA9IGNcbiAgICAgIGMgPSBiXG4gICAgICBiID0gYVxuICAgICAgYSA9IGFkZDMyKHRlbXAxLCB0ZW1wMilcbiAgICB9XG5cbiAgICBoYXNoWzBdID0gYWRkMzIoaGFzaFswXSwgYSlcbiAgICBoYXNoWzFdID0gYWRkMzIoaGFzaFsxXSwgYilcbiAgICBoYXNoWzJdID0gYWRkMzIoaGFzaFsyXSwgYylcbiAgICBoYXNoWzNdID0gYWRkMzIoaGFzaFszXSwgZClcbiAgICBoYXNoWzRdID0gYWRkMzIoaGFzaFs0XSwgZSlcbiAgICBoYXNoWzVdID0gYWRkMzIoaGFzaFs1XSwgZilcbiAgICBoYXNoWzZdID0gYWRkMzIoaGFzaFs2XSwgZylcbiAgICBoYXNoWzddID0gYWRkMzIoaGFzaFs3XSwgaClcbiAgfVxuXG4gIHJldHVybiBoYXNoLm1hcCgodmFsdWUpID0+IHZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCBcIjBcIikpLmpvaW4oXCJcIilcbn1cblxuY29uc3QgU0hBMjU2X0lOSVRJQUxfSEFTSCA9IFtcbiAgMHg2YTA5ZTY2NywgMHhiYjY3YWU4NSwgMHgzYzZlZjM3MiwgMHhhNTRmZjUzYSxcbiAgMHg1MTBlNTI3ZiwgMHg5YjA1Njg4YywgMHgxZjgzZDlhYiwgMHg1YmUwY2QxOVxuXVxuXG5jb25zdCBTSEEyNTZfSyA9IFtcbiAgMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSxcbiAgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSxcbiAgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMyxcbiAgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhjMTliZjE3NCxcbiAgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYyxcbiAgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSxcbiAgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNyxcbiAgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NyxcbiAgMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMyxcbiAgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSxcbiAgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMyxcbiAgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCxcbiAgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSxcbiAgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMyxcbiAgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCxcbiAgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMlxuXVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIFVURi04IGJ5dGVzLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gU3RyaW5nIHZhbHVlLlxuICogQHJldHVybnMge251bWJlcltdfSAtIFVURi04IGJ5dGVzLlxuICovXG5mdW5jdGlvbiB1dGY4Qnl0ZXModmFsdWUpIHtcbiAgLyoqIEB0eXBlIHtudW1iZXJbXX0gKi9cbiAgY29uc3QgYnl0ZXMgPSBbXVxuXG4gIGZvciAoY29uc3QgY2hhcmFjdGVyIG9mIHZhbHVlKSB7XG4gICAgY29uc3QgY29kZVBvaW50ID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChjaGFyYWN0ZXIuY29kZVBvaW50QXQoMCkpXG5cbiAgICBpZiAoY29kZVBvaW50IDw9IDB4N2YpIHtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDw9IDB4N2ZmKSB7XG4gICAgICBieXRlcy5wdXNoKDB4YzAgfCAoY29kZVBvaW50ID4+PiA2KSwgMHg4MCB8IChjb2RlUG9pbnQgJiAweDNmKSlcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8PSAweGZmZmYpIHtcbiAgICAgIGJ5dGVzLnB1c2goMHhlMCB8IChjb2RlUG9pbnQgPj4+IDEyKSwgMHg4MCB8ICgoY29kZVBvaW50ID4+PiA2KSAmIDB4M2YpLCAweDgwIHwgKGNvZGVQb2ludCAmIDB4M2YpKVxuICAgIH0gZWxzZSB7XG4gICAgICBieXRlcy5wdXNoKDB4ZjAgfCAoY29kZVBvaW50ID4+PiAxOCksIDB4ODAgfCAoKGNvZGVQb2ludCA+Pj4gMTIpICYgMHgzZiksIDB4ODAgfCAoKGNvZGVQb2ludCA+Pj4gNikgJiAweDNmKSwgMHg4MCB8IChjb2RlUG9pbnQgJiAweDNmKSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuLyoqXG4gKiBBZGRzIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2Vycy5cbiAqIEBwYXJhbSB7Li4ubnVtYmVyfSB2YWx1ZXMgLSBWYWx1ZXMgdG8gYWRkLlxuICogQHJldHVybnMge251bWJlcn0gLSBVbnNpZ25lZCAzMi1iaXQgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBhZGQzMiguLi52YWx1ZXMpIHtcbiAgcmV0dXJuIHZhbHVlcy5yZWR1Y2UoKHN1bSwgdmFsdWUpID0+IChzdW0gKyB2YWx1ZSkgPj4+IDAsIDApXG59XG5cbi8qKlxuICogUm90YXRlcyBhIDMyLWJpdCBpbnRlZ2VyIHJpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVmFsdWUgdG8gcm90YXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdHMgLSBCaXQgY291bnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIFJvdGF0ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHJvdGF0ZVJpZ2h0KHZhbHVlLCBiaXRzKSB7XG4gIHJldHVybiAodmFsdWUgPj4+IGJpdHMpIHwgKHZhbHVlIDw8ICgzMiAtIGJpdHMpKVxufVxuIl19
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhMjU2LWhleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaGEyNTYtaGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxPQUFPLFVBQVUsU0FBUyxDQUFDLE9BQU87SUFDdkMsT0FBTyxjQUFjLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtBQUMxRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBzaGEyNTZCeXRlc0hleCBmcm9tIFwiLi9zaGEyNTYtYnl0ZXMtaGV4LmpzXCJcblxuLyoqXG4gKiBDb21wdXRlcyBTSEEtMjU2IHdpdGhvdXQgaW1wb3J0aW5nIE5vZGUtb25seSBjcnlwdG8gbW9kdWxlcywga2VlcGluZyB0aGlzXG4gKiBtb2R1bGUgc2FmZSBmb3IgRXhwby9icm93c2VyIGJ1bmRsZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFVURi04IG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBIZXggZGlnZXN0LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaGEyNTZIZXgobWVzc2FnZSkge1xuICByZXR1cm4gc2hhMjU2Qnl0ZXNIZXgobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG1lc3NhZ2UpKVxufVxuIl19
|