payload 3.0.0-alpha.2 → 3.0.0-alpha.21
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/auth.js +5 -44
- package/bin.js +40 -1
- package/components.d.ts +14 -0
- package/components.js +71 -0
- package/config.js +10 -59
- package/database.js +21 -108
- package/dist/admin/RichText.js +2 -5
- package/dist/admin/elements/Cell.js +2 -5
- package/dist/admin/elements/DatePicker.js +2 -5
- package/dist/admin/elements/PreviewButton.js +2 -5
- package/dist/admin/elements/PublishButton.js +2 -5
- package/dist/admin/elements/SaveButton.js +2 -5
- package/dist/admin/elements/SaveDraftButton.js +2 -5
- package/dist/admin/elements/Tab.js +2 -5
- package/dist/admin/forms/Error.js +2 -5
- package/dist/admin/forms/FieldDescription.js +2 -5
- package/dist/admin/forms/FieldTypes.js +2 -5
- package/dist/admin/forms/Form.d.ts +22 -0
- package/dist/admin/forms/Form.d.ts.map +1 -1
- package/dist/admin/forms/Form.js +2 -5
- package/dist/admin/forms/Label.js +2 -5
- package/dist/admin/forms/RowLabel.js +2 -5
- package/dist/admin/types.d.ts +2 -1
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/admin/types.js +2 -5
- package/dist/admin/views/types.d.ts +41 -0
- package/dist/admin/views/types.d.ts.map +1 -0
- package/dist/admin/views/types.js +3 -0
- package/dist/assets/assets.d.js +0 -1
- package/dist/auth/baseFields/accountLock.js +2 -12
- package/dist/auth/baseFields/apiKey.js +6 -21
- package/dist/auth/baseFields/auth.js +6 -16
- package/dist/auth/baseFields/verification.js +4 -14
- package/dist/auth/cookies.js +6 -33
- package/dist/auth/crypto.js +7 -30
- package/dist/auth/defaultAccess.js +2 -12
- package/dist/auth/defaultUser.js +4 -14
- package/dist/auth/executeAccess.js +5 -15
- package/dist/auth/extractJWT.js +4 -14
- package/dist/auth/getAccessResults.js +5 -15
- package/dist/auth/getAuthenticatedUser.js +2 -12
- package/dist/auth/getFieldsToSign.js +5 -15
- package/dist/auth/index.js +4 -27
- package/dist/auth/isLocked.js +2 -12
- package/dist/auth/operations/access.js +12 -22
- package/dist/auth/operations/forgotPassword.js +17 -32
- package/dist/auth/operations/init.js +2 -12
- package/dist/auth/operations/local/forgotPassword.js +8 -18
- package/dist/auth/operations/local/index.js +12 -27
- package/dist/auth/operations/local/login.js +8 -18
- package/dist/auth/operations/local/resetPassword.js +8 -18
- package/dist/auth/operations/local/unlock.js +8 -18
- package/dist/auth/operations/local/verifyEmail.js +8 -18
- package/dist/auth/operations/login.js +32 -47
- package/dist/auth/operations/logout.js +6 -21
- package/dist/auth/operations/me.js +4 -19
- package/dist/auth/operations/refresh.js +19 -34
- package/dist/auth/operations/registerFirstUser.js +10 -20
- package/dist/auth/operations/resetPassword.js +20 -43
- package/dist/auth/operations/unlock.js +16 -39
- package/dist/auth/operations/verifyEmail.js +14 -37
- package/dist/auth/sendVerificationEmail.js +4 -14
- package/dist/auth/strategies/apiKey.js +4 -19
- package/dist/auth/strategies/jwt.js +6 -21
- package/dist/auth/strategies/local/authenticate.js +6 -21
- package/dist/auth/strategies/local/generatePasswordSaltHash.js +7 -22
- package/dist/auth/strategies/local/incrementLoginAttempts.js +2 -12
- package/dist/auth/strategies/local/register.js +6 -16
- package/dist/auth/strategies/local/resetLoginAttempts.js +2 -12
- package/dist/auth/types.js +2 -12
- package/dist/bin/generateTypes.js +12 -27
- package/dist/bin/index.js +11 -53
- package/dist/bin/loadEnv.js +13 -26
- package/dist/bin/migrate.js +15 -30
- package/dist/bundlers/mocks/db-mongodb.js +0 -1
- package/dist/bundlers/mocks/db-postgres.js +2 -12
- package/dist/bundlers/mocks/dotENV.js +2 -12
- package/dist/bundlers/mocks/emptyModule.js +2 -12
- package/dist/bundlers/mocks/fileMock.js +2 -12
- package/dist/bundlers/types.js +2 -5
- package/dist/collections/config/build.js +2 -12
- package/dist/collections/config/defaults.js +9 -32
- package/dist/collections/config/sanitize.js +34 -49
- package/dist/collections/config/schema.js +157 -172
- package/dist/collections/config/types.d.ts +5 -5
- package/dist/collections/config/types.d.ts.map +1 -1
- package/dist/collections/config/types.js +2 -5
- package/dist/collections/dataloader.js +8 -23
- package/dist/collections/operations/create.js +38 -53
- package/dist/collections/operations/delete.js +27 -42
- package/dist/collections/operations/deleteByID.js +27 -42
- package/dist/collections/operations/docAccess.js +10 -20
- package/dist/collections/operations/find.js +25 -40
- package/dist/collections/operations/findByID.js +21 -36
- package/dist/collections/operations/findVersionByID.js +19 -34
- package/dist/collections/operations/findVersions.js +20 -35
- package/dist/collections/operations/local/create.js +10 -25
- package/dist/collections/operations/local/delete.js +10 -20
- package/dist/collections/operations/local/find.js +8 -18
- package/dist/collections/operations/local/findByID.js +8 -18
- package/dist/collections/operations/local/findVersionByID.js +8 -18
- package/dist/collections/operations/local/findVersions.js +8 -18
- package/dist/collections/operations/local/index.js +20 -35
- package/dist/collections/operations/local/restoreVersion.js +8 -18
- package/dist/collections/operations/local/update.js +12 -27
- package/dist/collections/operations/restoreVersion.js +26 -41
- package/dist/collections/operations/update.js +43 -58
- package/dist/collections/operations/updateByID.js +44 -59
- package/dist/collections/operations/utils.js +3 -12
- package/dist/config/build.js +9 -15
- package/dist/config/clientFiles.js +2 -12
- package/dist/config/createClientConfig.d.ts.map +1 -1
- package/dist/config/createClientConfig.js +12 -25
- package/dist/config/defaults.js +4 -19
- package/dist/config/find.js +18 -33
- package/dist/config/load.d.ts +1 -3
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +8 -37
- package/dist/config/sanitize.js +25 -40
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +116 -133
- package/dist/config/shared/adminViewSchema.js +9 -24
- package/dist/config/shared/componentSchema.js +21 -50
- package/dist/config/types.d.ts +12 -21
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +9 -21
- package/dist/config/validate.js +15 -71
- package/dist/database/combineQueries.js +4 -14
- package/dist/database/createDatabaseAdapter.js +14 -24
- package/dist/database/flattenWhereToOperators.js +2 -12
- package/dist/database/getLocalizedPaths.js +7 -22
- package/dist/database/migrations/createMigration.js +7 -22
- package/dist/database/migrations/getMigrations.js +4 -12
- package/dist/database/migrations/migrate.js +12 -22
- package/dist/database/migrations/migrateDown.js +12 -22
- package/dist/database/migrations/migrateRefresh.js +16 -24
- package/dist/database/migrations/migrateReset.js +12 -22
- package/dist/database/migrations/migrateStatus.js +8 -18
- package/dist/database/migrations/migrationTemplate.js +2 -12
- package/dist/database/migrations/migrationsCollection.js +2 -12
- package/dist/database/migrations/readMigrationFiles.d.ts.map +1 -1
- package/dist/database/migrations/readMigrationFiles.js +12 -24
- package/dist/database/queryValidation/types.js +2 -5
- package/dist/database/queryValidation/validateQueryPaths.js +13 -28
- package/dist/database/queryValidation/validateSearchParams.js +13 -21
- package/dist/database/types.d.ts +5 -2
- package/dist/database/types.d.ts.map +1 -1
- package/dist/database/types.js +2 -5
- package/dist/email/build.js +11 -26
- package/dist/email/defaults.js +2 -12
- package/dist/email/mockHandler.js +8 -23
- package/dist/email/sendEmail.js +2 -12
- package/dist/email/types.js +2 -5
- package/dist/errors/APIError.js +4 -19
- package/dist/errors/AuthenticationError.js +7 -22
- package/dist/errors/DuplicateCollection.js +4 -19
- package/dist/errors/DuplicateFieldName.js +4 -19
- package/dist/errors/DuplicateGlobal.js +4 -19
- package/dist/errors/ErrorDeletingFile.js +7 -22
- package/dist/errors/FileUploadError.js +7 -22
- package/dist/errors/Forbidden.js +7 -22
- package/dist/errors/InvalidConfiguration.js +6 -21
- package/dist/errors/InvalidFieldName.js +4 -19
- package/dist/errors/InvalidFieldRelationship.js +4 -19
- package/dist/errors/InvalidSchema.js +6 -21
- package/dist/errors/LockedAuth.js +7 -22
- package/dist/errors/MissingCollectionLabel.js +4 -19
- package/dist/errors/MissingFieldInputOptions.js +4 -19
- package/dist/errors/MissingFieldType.js +6 -21
- package/dist/errors/MissingFile.js +7 -22
- package/dist/errors/NotFound.js +7 -22
- package/dist/errors/QueryError.js +6 -21
- package/dist/errors/TimestampsRequired.js +4 -19
- package/dist/errors/UnathorizedError.js +7 -22
- package/dist/errors/ValidationError.js +8 -23
- package/dist/errors/index.js +20 -94
- package/dist/errors/types.js +2 -19
- package/dist/exports/auth.js +5 -44
- package/dist/exports/components/utilities.d.ts +0 -1
- package/dist/exports/components/utilities.js +0 -1
- package/dist/exports/config.js +10 -59
- package/dist/exports/database.js +21 -108
- package/dist/exports/errors.js +2 -68
- package/dist/exports/fields/index.js +3 -26
- package/dist/exports/fields/validations.js +2 -19
- package/dist/exports/operations.js +29 -125
- package/dist/exports/types.js +4 -74
- package/dist/exports/utilities.js +28 -141
- package/dist/exports/versions.js +9 -45
- package/dist/express/middleware/errorHandler.d.ts +0 -1
- package/dist/express/middleware/errorHandler.js +0 -1
- package/dist/express/middleware/index.d.ts +0 -1
- package/dist/express/middleware/index.js +0 -1
- package/dist/fields/baseFields/baseBlockFields.js +4 -14
- package/dist/fields/baseFields/baseIDField.js +4 -19
- package/dist/fields/config/sanitize.js +24 -39
- package/dist/fields/config/sanitize.spec.js +25 -29
- package/dist/fields/config/schema.js +329 -424
- package/dist/fields/config/types.js +15 -69
- package/dist/fields/getDefaultValue.js +2 -12
- package/dist/fields/hooks/afterChange/index.js +6 -16
- package/dist/fields/hooks/afterChange/promise.js +14 -22
- package/dist/fields/hooks/afterChange/traverseFields.js +4 -14
- package/dist/fields/hooks/afterRead/index.js +6 -16
- package/dist/fields/hooks/afterRead/promise.js +28 -36
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js +5 -15
- package/dist/fields/hooks/afterRead/traverseFields.js +4 -14
- package/dist/fields/hooks/beforeChange/cloneDataFromOriginalDoc.js +2 -12
- package/dist/fields/hooks/beforeChange/getExistingRowDoc.js +2 -12
- package/dist/fields/hooks/beforeChange/index.js +8 -18
- package/dist/fields/hooks/beforeChange/promise.js +26 -35
- package/dist/fields/hooks/beforeChange/traverseFields.js +4 -14
- package/dist/fields/hooks/beforeValidate/index.js +6 -16
- package/dist/fields/hooks/beforeValidate/promise.js +30 -39
- package/dist/fields/hooks/beforeValidate/traverseFields.js +4 -14
- package/dist/fields/mergeBaseFields.js +8 -23
- package/dist/fields/sortableFieldTypes.js +2 -12
- package/dist/fields/validations.js +31 -97
- package/dist/fields/validations.spec.js +93 -87
- package/dist/globals/config/build.d.ts +0 -1
- package/dist/globals/config/build.js +0 -1
- package/dist/globals/config/sanitize.js +17 -32
- package/dist/globals/config/schema.js +55 -70
- package/dist/globals/config/types.d.ts +5 -5
- package/dist/globals/config/types.d.ts.map +1 -1
- package/dist/globals/config/types.js +2 -5
- package/dist/globals/graphql/resolvers/docAccess.d.ts +0 -1
- package/dist/globals/graphql/resolvers/docAccess.js +0 -1
- package/dist/globals/operations/docAccess.js +10 -20
- package/dist/globals/operations/findOne.js +14 -29
- package/dist/globals/operations/findVersionByID.js +18 -33
- package/dist/globals/operations/findVersions.js +20 -35
- package/dist/globals/operations/local/findOne.js +8 -18
- package/dist/globals/operations/local/findVersionByID.js +8 -18
- package/dist/globals/operations/local/findVersions.js +8 -18
- package/dist/globals/operations/local/index.js +12 -27
- package/dist/globals/operations/local/restoreVersion.js +8 -18
- package/dist/globals/operations/local/update.js +8 -18
- package/dist/globals/operations/restoreVersion.js +16 -31
- package/dist/globals/operations/update.js +23 -38
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -70
- package/dist/localization/middleware.js +2 -12
- package/dist/localization/sanitizeFallbackLocale.js +2 -12
- package/dist/preferences/deleteUserPreferences.js +2 -12
- package/dist/preferences/operations/delete.js +10 -25
- package/dist/preferences/operations/findOne.js +2 -12
- package/dist/preferences/operations/update.js +8 -23
- package/dist/preferences/preferencesCollection.js +8 -18
- package/dist/preferences/requestHandlers/delete.js +6 -21
- package/dist/preferences/requestHandlers/findOne.js +6 -21
- package/dist/preferences/requestHandlers/update.js +6 -21
- package/dist/preferences/types.js +2 -5
- package/dist/translations/extractTranslations.js +4 -14
- package/dist/translations/getLocalI18n.js +5 -15
- package/dist/types/constants.js +2 -12
- package/dist/types/index.js +2 -12
- package/dist/uploads/canResizeImage.js +2 -12
- package/dist/uploads/cropImage.d.ts +3 -7
- package/dist/uploads/cropImage.d.ts.map +1 -1
- package/dist/uploads/cropImage.js +4 -28
- package/dist/uploads/deleteAssociatedFiles.js +11 -26
- package/dist/uploads/docWithFilenameExists.js +2 -12
- package/dist/uploads/fileExists.js +4 -19
- package/dist/uploads/formatFilesize.js +2 -12
- package/dist/uploads/generateFileData.d.ts.map +1 -1
- package/dist/uploads/generateFileData.js +40 -53
- package/dist/uploads/getBaseFields.js +6 -16
- package/dist/uploads/getExternalFile.js +5 -15
- package/dist/uploads/getFileByPath.js +10 -25
- package/dist/uploads/getImageSize.js +7 -22
- package/dist/uploads/getSafeFilename.js +8 -23
- package/dist/uploads/imageResizer.d.ts +3 -1
- package/dist/uploads/imageResizer.d.ts.map +1 -1
- package/dist/uploads/imageResizer.js +28 -44
- package/dist/uploads/isImage.js +2 -12
- package/dist/uploads/mimeTypeValidator.js +2 -12
- package/dist/uploads/mimeTypeValidator.spec.js +11 -15
- package/dist/uploads/saveBufferToFile.js +6 -21
- package/dist/uploads/types.d.ts +7 -1
- package/dist/uploads/types.d.ts.map +1 -1
- package/dist/uploads/types.js +2 -5
- package/dist/uploads/unlinkTempFiles.js +9 -22
- package/dist/uploads/uploadFiles.js +6 -21
- package/dist/utilities/checkDuplicateCollections.js +4 -14
- package/dist/utilities/combineMerge.js +4 -19
- package/dist/utilities/commitTransaction.js +4 -12
- package/dist/utilities/configToJSONSchema.js +22 -41
- package/dist/utilities/configToJSONSchema.spec.js +5 -9
- package/dist/utilities/convertData.js +3 -23
- package/dist/utilities/createArrayFromCommaDelineated.js +2 -12
- package/dist/utilities/createLocalReq.js +6 -16
- package/dist/utilities/deepCopyObject.js +2 -12
- package/dist/utilities/deepMerge.js +2 -12
- package/dist/utilities/fieldSchemaToJSON.js +2 -12
- package/dist/utilities/flattenTopLevelFields.js +6 -16
- package/dist/utilities/formatLabels.js +9 -70
- package/dist/utilities/formatLabels.spec.js +8 -12
- package/dist/utilities/getCSSVariable.js +2 -12
- package/dist/utilities/getEntityPolicies.js +4 -14
- package/dist/utilities/getIDType.js +2 -12
- package/dist/utilities/getObjectDotNotation.js +2 -12
- package/dist/utilities/getUniqueListBy.js +2 -12
- package/dist/utilities/initTransaction.js +5 -12
- package/dist/utilities/isEntityHidden.js +2 -12
- package/dist/utilities/isNumber.js +2 -12
- package/dist/utilities/isValidID.js +5 -20
- package/dist/utilities/isolateObjectProperty.js +2 -12
- package/dist/utilities/killTransaction.js +4 -12
- package/dist/utilities/logger.d.ts.map +1 -1
- package/dist/utilities/logger.js +16 -37
- package/dist/utilities/mapAsync.js +2 -12
- package/dist/utilities/overwriteMerge.js +2 -12
- package/dist/utilities/parseCookies.js +4 -14
- package/dist/utilities/pinoPretty.d.ts +1 -0
- package/dist/utilities/pinoPretty.d.ts.map +1 -0
- package/dist/utilities/pinoPretty.js +2 -0
- package/dist/utilities/sanitizeInternalFields.js +2 -12
- package/dist/utilities/setsAreEqual.js +2 -12
- package/dist/utilities/telemetry/events/adminInit.js +7 -17
- package/dist/utilities/telemetry/events/serverInit.js +4 -14
- package/dist/utilities/telemetry/index.js +17 -40
- package/dist/utilities/telemetry/oneWayHash.js +4 -14
- package/dist/utilities/timestamp.js +2 -12
- package/dist/utilities/toKebabCase.js +2 -12
- package/dist/utilities/wait.js +2 -12
- package/dist/utilities/wordBoundariesRegex.js +3 -13
- package/dist/versions/baseFields.js +5 -23
- package/dist/versions/buildCollectionFields.js +2 -12
- package/dist/versions/buildGlobalFields.js +2 -12
- package/dist/versions/deleteCollectionVersions.js +2 -12
- package/dist/versions/drafts/appendVersionToQueryKey.js +2 -12
- package/dist/versions/drafts/getQueryDraftsSort.js +2 -12
- package/dist/versions/drafts/replaceWithDraftIfAvailable.js +12 -27
- package/dist/versions/enforceMaxVersions.js +2 -12
- package/dist/versions/getLatestCollectionVersion.js +4 -14
- package/dist/versions/getLatestGlobalVersion.js +4 -14
- package/dist/versions/getVersionsModelName.js +2 -12
- package/dist/versions/saveVersion.js +8 -23
- package/dist/versions/types.js +2 -5
- package/errors.js +2 -68
- package/graphql.d.ts +3 -0
- package/graphql.js +27 -0
- package/operations.js +29 -125
- package/package.json +17 -5
- package/types.js +4 -74
- package/utilities.js +28 -141
- package/versions.js +9 -45
|
@@ -1,25 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
const _validations = require("./validations");
|
|
1
|
+
import { number, password, point, relationship, select, text, textarea } from './validations';
|
|
6
2
|
const t = jest.fn((string)=>string);
|
|
7
3
|
let options = {
|
|
8
4
|
data: undefined,
|
|
9
5
|
operation: 'create',
|
|
10
6
|
siblingData: undefined,
|
|
11
|
-
|
|
7
|
+
req: {
|
|
8
|
+
t,
|
|
9
|
+
context: {},
|
|
10
|
+
payload: {
|
|
11
|
+
config: {}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
12
14
|
};
|
|
13
15
|
describe('Field Validations', ()=>{
|
|
14
16
|
describe('text', ()=>{
|
|
15
17
|
it('should validate', ()=>{
|
|
16
18
|
const val = 'test';
|
|
17
|
-
const result =
|
|
19
|
+
const result = text(val, options);
|
|
18
20
|
expect(result).toBe(true);
|
|
19
21
|
});
|
|
20
22
|
it('should show required message', ()=>{
|
|
21
23
|
const val = undefined;
|
|
22
|
-
const result =
|
|
24
|
+
const result = text(val, {
|
|
23
25
|
...options,
|
|
24
26
|
required: true
|
|
25
27
|
});
|
|
@@ -27,12 +29,12 @@ describe('Field Validations', ()=>{
|
|
|
27
29
|
});
|
|
28
30
|
it('should handle undefined', ()=>{
|
|
29
31
|
const val = undefined;
|
|
30
|
-
const result =
|
|
32
|
+
const result = text(val, options);
|
|
31
33
|
expect(result).toBe(true);
|
|
32
34
|
});
|
|
33
35
|
it('should validate maxLength', ()=>{
|
|
34
36
|
const val = 'toolong';
|
|
35
|
-
const result =
|
|
37
|
+
const result = text(val, {
|
|
36
38
|
...options,
|
|
37
39
|
maxLength: 5
|
|
38
40
|
});
|
|
@@ -40,7 +42,7 @@ describe('Field Validations', ()=>{
|
|
|
40
42
|
});
|
|
41
43
|
it('should validate minLength', ()=>{
|
|
42
44
|
const val = 'short';
|
|
43
|
-
const result =
|
|
45
|
+
const result = text(val, {
|
|
44
46
|
...options,
|
|
45
47
|
minLength: 10
|
|
46
48
|
});
|
|
@@ -48,7 +50,7 @@ describe('Field Validations', ()=>{
|
|
|
48
50
|
});
|
|
49
51
|
it('should validate maxLength with no value', ()=>{
|
|
50
52
|
const val = undefined;
|
|
51
|
-
const result =
|
|
53
|
+
const result = text(val, {
|
|
52
54
|
...options,
|
|
53
55
|
maxLength: 5
|
|
54
56
|
});
|
|
@@ -56,7 +58,7 @@ describe('Field Validations', ()=>{
|
|
|
56
58
|
});
|
|
57
59
|
it('should validate minLength with no value', ()=>{
|
|
58
60
|
const val = undefined;
|
|
59
|
-
const result =
|
|
61
|
+
const result = text(val, {
|
|
60
62
|
...options,
|
|
61
63
|
minLength: 10
|
|
62
64
|
});
|
|
@@ -66,7 +68,7 @@ describe('Field Validations', ()=>{
|
|
|
66
68
|
const val = [
|
|
67
69
|
'test'
|
|
68
70
|
];
|
|
69
|
-
const result =
|
|
71
|
+
const result = text(val, {
|
|
70
72
|
...options,
|
|
71
73
|
hasMany: true
|
|
72
74
|
});
|
|
@@ -76,7 +78,7 @@ describe('Field Validations', ()=>{
|
|
|
76
78
|
const val = [
|
|
77
79
|
'test'
|
|
78
80
|
];
|
|
79
|
-
const result =
|
|
81
|
+
const result = text(val, {
|
|
80
82
|
...options,
|
|
81
83
|
hasMany: true,
|
|
82
84
|
required: true
|
|
@@ -94,12 +96,12 @@ describe('Field Validations', ()=>{
|
|
|
94
96
|
};
|
|
95
97
|
it('should validate', ()=>{
|
|
96
98
|
const val = 'test';
|
|
97
|
-
const result =
|
|
99
|
+
const result = textarea(val, options);
|
|
98
100
|
expect(result).toBe(true);
|
|
99
101
|
});
|
|
100
102
|
it('should show required message', ()=>{
|
|
101
103
|
const val = undefined;
|
|
102
|
-
const result =
|
|
104
|
+
const result = textarea(val, {
|
|
103
105
|
...options,
|
|
104
106
|
required: true
|
|
105
107
|
});
|
|
@@ -107,12 +109,12 @@ describe('Field Validations', ()=>{
|
|
|
107
109
|
});
|
|
108
110
|
it('should handle undefined', ()=>{
|
|
109
111
|
const val = undefined;
|
|
110
|
-
const result =
|
|
112
|
+
const result = textarea(val, options);
|
|
111
113
|
expect(result).toBe(true);
|
|
112
114
|
});
|
|
113
115
|
it('should validate maxLength', ()=>{
|
|
114
116
|
const val = 'toolong';
|
|
115
|
-
const result =
|
|
117
|
+
const result = textarea(val, {
|
|
116
118
|
...options,
|
|
117
119
|
maxLength: 5
|
|
118
120
|
});
|
|
@@ -120,7 +122,7 @@ describe('Field Validations', ()=>{
|
|
|
120
122
|
});
|
|
121
123
|
it('should validate minLength', ()=>{
|
|
122
124
|
const val = 'short';
|
|
123
|
-
const result =
|
|
125
|
+
const result = textarea(val, {
|
|
124
126
|
...options,
|
|
125
127
|
minLength: 10
|
|
126
128
|
});
|
|
@@ -128,7 +130,7 @@ describe('Field Validations', ()=>{
|
|
|
128
130
|
});
|
|
129
131
|
it('should validate maxLength with no value', ()=>{
|
|
130
132
|
const val = undefined;
|
|
131
|
-
const result =
|
|
133
|
+
const result = textarea(val, {
|
|
132
134
|
...options,
|
|
133
135
|
maxLength: 5
|
|
134
136
|
});
|
|
@@ -136,7 +138,7 @@ describe('Field Validations', ()=>{
|
|
|
136
138
|
});
|
|
137
139
|
it('should validate minLength with no value', ()=>{
|
|
138
140
|
const val = undefined;
|
|
139
|
-
const result =
|
|
141
|
+
const result = textarea(val, {
|
|
140
142
|
...options,
|
|
141
143
|
minLength: 10
|
|
142
144
|
});
|
|
@@ -151,12 +153,12 @@ describe('Field Validations', ()=>{
|
|
|
151
153
|
};
|
|
152
154
|
it('should validate', ()=>{
|
|
153
155
|
const val = 'test';
|
|
154
|
-
const result =
|
|
156
|
+
const result = password(val, passwordOptions);
|
|
155
157
|
expect(result).toBe(true);
|
|
156
158
|
});
|
|
157
159
|
it('should show required message', ()=>{
|
|
158
160
|
const val = undefined;
|
|
159
|
-
const result =
|
|
161
|
+
const result = password(val, {
|
|
160
162
|
...passwordOptions,
|
|
161
163
|
required: true
|
|
162
164
|
});
|
|
@@ -164,12 +166,12 @@ describe('Field Validations', ()=>{
|
|
|
164
166
|
});
|
|
165
167
|
it('should handle undefined', ()=>{
|
|
166
168
|
const val = undefined;
|
|
167
|
-
const result =
|
|
169
|
+
const result = password(val, passwordOptions);
|
|
168
170
|
expect(result).toBe(true);
|
|
169
171
|
});
|
|
170
172
|
it('should validate maxLength', ()=>{
|
|
171
173
|
const val = 'toolong';
|
|
172
|
-
const result =
|
|
174
|
+
const result = password(val, {
|
|
173
175
|
...passwordOptions,
|
|
174
176
|
maxLength: 5
|
|
175
177
|
});
|
|
@@ -177,7 +179,7 @@ describe('Field Validations', ()=>{
|
|
|
177
179
|
});
|
|
178
180
|
it('should validate minLength', ()=>{
|
|
179
181
|
const val = 'short';
|
|
180
|
-
const result =
|
|
182
|
+
const result = password(val, {
|
|
181
183
|
...passwordOptions,
|
|
182
184
|
minLength: 10
|
|
183
185
|
});
|
|
@@ -185,7 +187,7 @@ describe('Field Validations', ()=>{
|
|
|
185
187
|
});
|
|
186
188
|
it('should validate maxLength with no value', ()=>{
|
|
187
189
|
const val = undefined;
|
|
188
|
-
const result =
|
|
190
|
+
const result = password(val, {
|
|
189
191
|
...passwordOptions,
|
|
190
192
|
maxLength: 5
|
|
191
193
|
});
|
|
@@ -193,7 +195,7 @@ describe('Field Validations', ()=>{
|
|
|
193
195
|
});
|
|
194
196
|
it('should validate minLength with no value', ()=>{
|
|
195
197
|
const val = undefined;
|
|
196
|
-
const result =
|
|
198
|
+
const result = password(val, {
|
|
197
199
|
...passwordOptions,
|
|
198
200
|
minLength: 10
|
|
199
201
|
});
|
|
@@ -211,7 +213,7 @@ describe('Field Validations', ()=>{
|
|
|
211
213
|
'0.1',
|
|
212
214
|
'0.2'
|
|
213
215
|
];
|
|
214
|
-
const result =
|
|
216
|
+
const result = point(val, pointOptions);
|
|
215
217
|
expect(result).toBe(true);
|
|
216
218
|
});
|
|
217
219
|
it('should validate strings that could be numbers', ()=>{
|
|
@@ -219,12 +221,12 @@ describe('Field Validations', ()=>{
|
|
|
219
221
|
'0.1',
|
|
220
222
|
'0.2'
|
|
221
223
|
];
|
|
222
|
-
const result =
|
|
224
|
+
const result = point(val, pointOptions);
|
|
223
225
|
expect(result).toBe(true);
|
|
224
226
|
});
|
|
225
227
|
it('should show required message when undefined', ()=>{
|
|
226
228
|
const val = undefined;
|
|
227
|
-
const result =
|
|
229
|
+
const result = point(val, {
|
|
228
230
|
...pointOptions,
|
|
229
231
|
required: true
|
|
230
232
|
});
|
|
@@ -232,7 +234,7 @@ describe('Field Validations', ()=>{
|
|
|
232
234
|
});
|
|
233
235
|
it('should show required message when array', ()=>{
|
|
234
236
|
const val = [];
|
|
235
|
-
const result =
|
|
237
|
+
const result = point(val, {
|
|
236
238
|
...pointOptions,
|
|
237
239
|
required: true
|
|
238
240
|
});
|
|
@@ -243,7 +245,7 @@ describe('Field Validations', ()=>{
|
|
|
243
245
|
undefined,
|
|
244
246
|
undefined
|
|
245
247
|
];
|
|
246
|
-
const result =
|
|
248
|
+
const result = point(val, {
|
|
247
249
|
...pointOptions,
|
|
248
250
|
required: true
|
|
249
251
|
});
|
|
@@ -251,12 +253,12 @@ describe('Field Validations', ()=>{
|
|
|
251
253
|
});
|
|
252
254
|
it('should handle undefined not required', ()=>{
|
|
253
255
|
const val = undefined;
|
|
254
|
-
const result =
|
|
256
|
+
const result = password(val, pointOptions);
|
|
255
257
|
expect(result).toBe(true);
|
|
256
258
|
});
|
|
257
259
|
it('should handle empty array not required', ()=>{
|
|
258
260
|
const val = [];
|
|
259
|
-
const result =
|
|
261
|
+
const result = point(val, pointOptions);
|
|
260
262
|
expect(result).toBe(true);
|
|
261
263
|
});
|
|
262
264
|
it('should handle array of undefined not required', ()=>{
|
|
@@ -264,7 +266,7 @@ describe('Field Validations', ()=>{
|
|
|
264
266
|
undefined,
|
|
265
267
|
undefined
|
|
266
268
|
];
|
|
267
|
-
const result =
|
|
269
|
+
const result = point(val, pointOptions);
|
|
268
270
|
expect(result).toBe(true);
|
|
269
271
|
});
|
|
270
272
|
it('should prevent text input', ()=>{
|
|
@@ -272,14 +274,14 @@ describe('Field Validations', ()=>{
|
|
|
272
274
|
'bad',
|
|
273
275
|
'input'
|
|
274
276
|
];
|
|
275
|
-
const result =
|
|
277
|
+
const result = point(val, pointOptions);
|
|
276
278
|
expect(result).not.toBe(true);
|
|
277
279
|
});
|
|
278
280
|
it('should prevent missing value', ()=>{
|
|
279
281
|
const val = [
|
|
280
282
|
0.1
|
|
281
283
|
];
|
|
282
|
-
const result =
|
|
284
|
+
const result = point(val, pointOptions);
|
|
283
285
|
expect(result).not.toBe(true);
|
|
284
286
|
});
|
|
285
287
|
});
|
|
@@ -295,15 +297,19 @@ describe('Field Validations', ()=>{
|
|
|
295
297
|
};
|
|
296
298
|
const relationshipOptions = {
|
|
297
299
|
...options,
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
300
|
+
req: {
|
|
301
|
+
...options.req,
|
|
302
|
+
payload: {
|
|
303
|
+
...options.req.payload,
|
|
304
|
+
config: {
|
|
305
|
+
collections: [
|
|
306
|
+
relationCollection
|
|
307
|
+
]
|
|
308
|
+
},
|
|
309
|
+
collections: {
|
|
310
|
+
relation: {
|
|
311
|
+
config: relationCollection
|
|
312
|
+
}
|
|
307
313
|
}
|
|
308
314
|
}
|
|
309
315
|
},
|
|
@@ -311,7 +317,7 @@ describe('Field Validations', ()=>{
|
|
|
311
317
|
};
|
|
312
318
|
it('should handle required', async ()=>{
|
|
313
319
|
const val = undefined;
|
|
314
|
-
const result = await
|
|
320
|
+
const result = await relationship(val, {
|
|
315
321
|
...relationshipOptions,
|
|
316
322
|
required: true
|
|
317
323
|
});
|
|
@@ -319,7 +325,7 @@ describe('Field Validations', ()=>{
|
|
|
319
325
|
});
|
|
320
326
|
it('should handle required with hasMany', async ()=>{
|
|
321
327
|
const val = [];
|
|
322
|
-
const result = await
|
|
328
|
+
const result = await relationship(val, {
|
|
323
329
|
...relationshipOptions,
|
|
324
330
|
hasMany: true,
|
|
325
331
|
required: true
|
|
@@ -335,9 +341,9 @@ describe('Field Validations', ()=>{
|
|
|
335
341
|
const val = [
|
|
336
342
|
'a'
|
|
337
343
|
];
|
|
338
|
-
const result = await
|
|
344
|
+
const result = await relationship(val, minOptions);
|
|
339
345
|
expect(result).not.toBe(true);
|
|
340
|
-
const allowed = await
|
|
346
|
+
const allowed = await relationship([
|
|
341
347
|
'a',
|
|
342
348
|
'b'
|
|
343
349
|
], minOptions);
|
|
@@ -354,12 +360,12 @@ describe('Field Validations', ()=>{
|
|
|
354
360
|
'b',
|
|
355
361
|
'c'
|
|
356
362
|
];
|
|
357
|
-
const result = await
|
|
363
|
+
const result = await relationship(val, maxOptions);
|
|
358
364
|
expect(result).not.toBe(true);
|
|
359
365
|
val = [
|
|
360
366
|
'a'
|
|
361
367
|
];
|
|
362
|
-
const allowed = await
|
|
368
|
+
const allowed = await relationship(val, maxOptions);
|
|
363
369
|
expect(allowed).toStrictEqual(true);
|
|
364
370
|
});
|
|
365
371
|
});
|
|
@@ -406,52 +412,52 @@ describe('Field Validations', ()=>{
|
|
|
406
412
|
};
|
|
407
413
|
it('should allow valid input', ()=>{
|
|
408
414
|
const val = 'one';
|
|
409
|
-
const result =
|
|
415
|
+
const result = select(val, selectOptions);
|
|
410
416
|
expect(result).toStrictEqual(true);
|
|
411
417
|
});
|
|
412
418
|
it('should prevent invalid input', ()=>{
|
|
413
419
|
const val = 'bad';
|
|
414
|
-
const result =
|
|
420
|
+
const result = select(val, selectOptions);
|
|
415
421
|
expect(result).not.toStrictEqual(true);
|
|
416
422
|
});
|
|
417
423
|
it('should allow null input', ()=>{
|
|
418
424
|
const val = null;
|
|
419
|
-
const result =
|
|
425
|
+
const result = select(val, selectOptions);
|
|
420
426
|
expect(result).toStrictEqual(true);
|
|
421
427
|
});
|
|
422
428
|
it('should allow undefined input', ()=>{
|
|
423
429
|
let val;
|
|
424
|
-
const result =
|
|
430
|
+
const result = select(val, selectOptions);
|
|
425
431
|
expect(result).toStrictEqual(true);
|
|
426
432
|
});
|
|
427
433
|
it('should prevent empty string input', ()=>{
|
|
428
434
|
const val = '';
|
|
429
|
-
const result =
|
|
435
|
+
const result = select(val, selectOptions);
|
|
430
436
|
expect(result).not.toStrictEqual(true);
|
|
431
437
|
});
|
|
432
438
|
it('should prevent undefined input with required', ()=>{
|
|
433
439
|
let val;
|
|
434
|
-
const result =
|
|
440
|
+
const result = select(val, optionsRequired);
|
|
435
441
|
expect(result).not.toStrictEqual(true);
|
|
436
442
|
});
|
|
437
443
|
it('should prevent empty string input with required', ()=>{
|
|
438
|
-
const result =
|
|
444
|
+
const result = select('', optionsRequired);
|
|
439
445
|
expect(result).not.toStrictEqual(true);
|
|
440
446
|
});
|
|
441
447
|
it('should prevent undefined input with required and hasMany', ()=>{
|
|
442
448
|
let val;
|
|
443
449
|
options.hasMany = true;
|
|
444
|
-
const result =
|
|
450
|
+
const result = select(val, optionsRequired);
|
|
445
451
|
expect(result).not.toStrictEqual(true);
|
|
446
452
|
});
|
|
447
453
|
it('should prevent empty array input with required and hasMany', ()=>{
|
|
448
454
|
optionsRequired.hasMany = true;
|
|
449
|
-
const result =
|
|
455
|
+
const result = select([], optionsRequired);
|
|
450
456
|
expect(result).not.toStrictEqual(true);
|
|
451
457
|
});
|
|
452
458
|
it('should prevent empty string array input with required and hasMany', ()=>{
|
|
453
459
|
options.hasMany = true;
|
|
454
|
-
const result =
|
|
460
|
+
const result = select([
|
|
455
461
|
''
|
|
456
462
|
], optionsRequired);
|
|
457
463
|
expect(result).not.toStrictEqual(true);
|
|
@@ -459,30 +465,30 @@ describe('Field Validations', ()=>{
|
|
|
459
465
|
it('should prevent null input with required and hasMany', ()=>{
|
|
460
466
|
const val = null;
|
|
461
467
|
options.hasMany = true;
|
|
462
|
-
const result =
|
|
468
|
+
const result = select(val, optionsRequired);
|
|
463
469
|
expect(result).not.toStrictEqual(true);
|
|
464
470
|
});
|
|
465
471
|
it('should allow valid input with option objects', ()=>{
|
|
466
472
|
const val = 'one';
|
|
467
473
|
options.hasMany = false;
|
|
468
|
-
const result =
|
|
474
|
+
const result = select(val, optionsRequired);
|
|
469
475
|
expect(result).toStrictEqual(true);
|
|
470
476
|
});
|
|
471
477
|
it('should prevent invalid input with option objects', ()=>{
|
|
472
478
|
const val = 'bad';
|
|
473
479
|
options.hasMany = false;
|
|
474
|
-
const result =
|
|
480
|
+
const result = select(val, optionsRequired);
|
|
475
481
|
expect(result).not.toStrictEqual(true);
|
|
476
482
|
});
|
|
477
483
|
it('should allow empty string input with option object', ()=>{
|
|
478
484
|
const val = '';
|
|
479
|
-
const result =
|
|
485
|
+
const result = select(val, optionsWithEmptyString);
|
|
480
486
|
expect(result).toStrictEqual(true);
|
|
481
487
|
});
|
|
482
488
|
it('should allow empty string input with option object and required', ()=>{
|
|
483
489
|
const val = '';
|
|
484
490
|
optionsWithEmptyString.required = true;
|
|
485
|
-
const result =
|
|
491
|
+
const result = select(val, optionsWithEmptyString);
|
|
486
492
|
expect(result).toStrictEqual(true);
|
|
487
493
|
});
|
|
488
494
|
it('should allow valid input with hasMany', ()=>{
|
|
@@ -490,7 +496,7 @@ describe('Field Validations', ()=>{
|
|
|
490
496
|
'one',
|
|
491
497
|
'two'
|
|
492
498
|
];
|
|
493
|
-
const result =
|
|
499
|
+
const result = select(val, selectOptions);
|
|
494
500
|
expect(result).toStrictEqual(true);
|
|
495
501
|
});
|
|
496
502
|
it('should prevent invalid input with hasMany', ()=>{
|
|
@@ -498,7 +504,7 @@ describe('Field Validations', ()=>{
|
|
|
498
504
|
'one',
|
|
499
505
|
'bad'
|
|
500
506
|
];
|
|
501
|
-
const result =
|
|
507
|
+
const result = select(val, selectOptions);
|
|
502
508
|
expect(result).not.toStrictEqual(true);
|
|
503
509
|
});
|
|
504
510
|
it('should allow valid input with hasMany option objects', ()=>{
|
|
@@ -507,7 +513,7 @@ describe('Field Validations', ()=>{
|
|
|
507
513
|
'three'
|
|
508
514
|
];
|
|
509
515
|
optionsRequired.hasMany = true;
|
|
510
|
-
const result =
|
|
516
|
+
const result = select(val, optionsRequired);
|
|
511
517
|
expect(result).toStrictEqual(true);
|
|
512
518
|
});
|
|
513
519
|
it('should prevent invalid input with hasMany option objects', ()=>{
|
|
@@ -516,7 +522,7 @@ describe('Field Validations', ()=>{
|
|
|
516
522
|
'bad'
|
|
517
523
|
];
|
|
518
524
|
optionsRequired.hasMany = true;
|
|
519
|
-
const result =
|
|
525
|
+
const result = select(val, optionsRequired);
|
|
520
526
|
expect(result).not.toStrictEqual(true);
|
|
521
527
|
});
|
|
522
528
|
});
|
|
@@ -528,12 +534,12 @@ describe('Field Validations', ()=>{
|
|
|
528
534
|
};
|
|
529
535
|
it('should validate', ()=>{
|
|
530
536
|
const val = 1;
|
|
531
|
-
const result =
|
|
537
|
+
const result = number(val, numberOptions);
|
|
532
538
|
expect(result).toBe(true);
|
|
533
539
|
});
|
|
534
540
|
it('should validate 0', ()=>{
|
|
535
541
|
const val = 0;
|
|
536
|
-
const result =
|
|
542
|
+
const result = number(val, {
|
|
537
543
|
...numberOptions,
|
|
538
544
|
required: true
|
|
539
545
|
});
|
|
@@ -541,26 +547,26 @@ describe('Field Validations', ()=>{
|
|
|
541
547
|
});
|
|
542
548
|
it('should validate 2', ()=>{
|
|
543
549
|
const val = 1.5;
|
|
544
|
-
const result =
|
|
550
|
+
const result = number(val, numberOptions);
|
|
545
551
|
expect(result).toBe(true);
|
|
546
552
|
});
|
|
547
553
|
it('should show invalid number message', ()=>{
|
|
548
554
|
const val = 'test';
|
|
549
|
-
const result =
|
|
555
|
+
const result = number(val, {
|
|
550
556
|
...numberOptions
|
|
551
557
|
});
|
|
552
558
|
expect(result).toBe('validation:enterNumber');
|
|
553
559
|
});
|
|
554
560
|
it('should handle empty value', ()=>{
|
|
555
561
|
const val = '';
|
|
556
|
-
const result =
|
|
562
|
+
const result = number(val, {
|
|
557
563
|
...numberOptions
|
|
558
564
|
});
|
|
559
565
|
expect(result).toBe(true);
|
|
560
566
|
});
|
|
561
567
|
it('should handle required value', ()=>{
|
|
562
568
|
const val = '';
|
|
563
|
-
const result =
|
|
569
|
+
const result = number(val, {
|
|
564
570
|
...numberOptions,
|
|
565
571
|
required: true
|
|
566
572
|
});
|
|
@@ -568,7 +574,7 @@ describe('Field Validations', ()=>{
|
|
|
568
574
|
});
|
|
569
575
|
it('should validate minValue', ()=>{
|
|
570
576
|
const val = 2.4;
|
|
571
|
-
const result =
|
|
577
|
+
const result = number(val, {
|
|
572
578
|
...numberOptions,
|
|
573
579
|
min: 2.5
|
|
574
580
|
});
|
|
@@ -576,7 +582,7 @@ describe('Field Validations', ()=>{
|
|
|
576
582
|
});
|
|
577
583
|
it('should validate maxValue', ()=>{
|
|
578
584
|
const val = 1.25;
|
|
579
|
-
const result =
|
|
585
|
+
const result = number(val, {
|
|
580
586
|
...numberOptions,
|
|
581
587
|
max: 1
|
|
582
588
|
});
|
|
@@ -587,7 +593,7 @@ describe('Field Validations', ()=>{
|
|
|
587
593
|
1.25,
|
|
588
594
|
2.5
|
|
589
595
|
];
|
|
590
|
-
const result =
|
|
596
|
+
const result = number(val, {
|
|
591
597
|
...numberOptions,
|
|
592
598
|
hasMany: true
|
|
593
599
|
});
|
|
@@ -598,7 +604,7 @@ describe('Field Validations', ()=>{
|
|
|
598
604
|
1.25,
|
|
599
605
|
2.5
|
|
600
606
|
];
|
|
601
|
-
const result =
|
|
607
|
+
const result = number(val, {
|
|
602
608
|
...numberOptions,
|
|
603
609
|
hasMany: true,
|
|
604
610
|
min: 3
|
|
@@ -610,7 +616,7 @@ describe('Field Validations', ()=>{
|
|
|
610
616
|
1.25,
|
|
611
617
|
2.5
|
|
612
618
|
];
|
|
613
|
-
const result =
|
|
619
|
+
const result = number(val, {
|
|
614
620
|
...numberOptions,
|
|
615
621
|
hasMany: true,
|
|
616
622
|
max: 1
|
|
@@ -622,7 +628,7 @@ describe('Field Validations', ()=>{
|
|
|
622
628
|
1.25,
|
|
623
629
|
2.5
|
|
624
630
|
];
|
|
625
|
-
const result =
|
|
631
|
+
const result = number(val, {
|
|
626
632
|
...numberOptions,
|
|
627
633
|
hasMany: true,
|
|
628
634
|
minRows: 4
|
|
@@ -635,7 +641,7 @@ describe('Field Validations', ()=>{
|
|
|
635
641
|
2.5,
|
|
636
642
|
3.5
|
|
637
643
|
];
|
|
638
|
-
const result =
|
|
644
|
+
const result = number(val, {
|
|
639
645
|
...numberOptions,
|
|
640
646
|
hasMany: true,
|
|
641
647
|
maxRows: 2
|
|
@@ -645,4 +651,4 @@ describe('Field Validations', ()=>{
|
|
|
645
651
|
});
|
|
646
652
|
});
|
|
647
653
|
|
|
648
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maWVsZHMvdmFsaWRhdGlvbnMuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFZhbGlkYXRlT3B0aW9ucyB9IGZyb20gJy4vY29uZmlnL3R5cGVzJ1xuXG5pbXBvcnQgeyBudW1iZXIsIHBhc3N3b3JkLCBwb2ludCwgcmVsYXRpb25zaGlwLCBzZWxlY3QsIHRleHQsIHRleHRhcmVhIH0gZnJvbSAnLi92YWxpZGF0aW9ucydcblxuY29uc3QgdCA9IGplc3QuZm4oKHN0cmluZykgPT4gc3RyaW5nKVxuXG5sZXQgb3B0aW9uczogVmFsaWRhdGVPcHRpb25zPGFueSwgYW55LCBhbnk+ID0ge1xuICBkYXRhOiB1bmRlZmluZWQsXG4gIG9wZXJhdGlvbjogJ2NyZWF0ZScsXG4gIHNpYmxpbmdEYXRhOiB1bmRlZmluZWQsXG4gIHQsXG59XG5cbmRlc2NyaWJlKCdGaWVsZCBWYWxpZGF0aW9ucycsICgpID0+IHtcbiAgZGVzY3JpYmUoJ3RleHQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9ICd0ZXN0J1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGV4dCh2YWwsIG9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHNob3cgcmVxdWlyZWQgbWVzc2FnZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IHVuZGVmaW5lZFxuICAgICAgY29uc3QgcmVzdWx0ID0gdGV4dCh2YWwsIHsgLi4ub3B0aW9ucywgcmVxdWlyZWQ6IHRydWUgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ3ZhbGlkYXRpb246cmVxdWlyZWQnKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdW5kZWZpbmVkXG4gICAgICBjb25zdCByZXN1bHQgPSB0ZXh0KHZhbCwgb3B0aW9ucylcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbWF4TGVuZ3RoJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gJ3Rvb2xvbmcnXG4gICAgICBjb25zdCByZXN1bHQgPSB0ZXh0KHZhbCwgeyAuLi5vcHRpb25zLCBtYXhMZW5ndGg6IDUgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ3ZhbGlkYXRpb246c2hvcnRlclRoYW5NYXgnKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBtaW5MZW5ndGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAnc2hvcnQnXG4gICAgICBjb25zdCByZXN1bHQgPSB0ZXh0KHZhbCwgeyAuLi5vcHRpb25zLCBtaW5MZW5ndGg6IDEwIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCd2YWxpZGF0aW9uOmxvbmdlclRoYW5NaW4nKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBtYXhMZW5ndGggd2l0aCBubyB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IHVuZGVmaW5lZFxuICAgICAgY29uc3QgcmVzdWx0ID0gdGV4dCh2YWwsIHsgLi4ub3B0aW9ucywgbWF4TGVuZ3RoOiA1IH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIG1pbkxlbmd0aCB3aXRoIG5vIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdW5kZWZpbmVkXG4gICAgICBjb25zdCByZXN1bHQgPSB0ZXh0KHZhbCwgeyAuLi5vcHRpb25zLCBtaW5MZW5ndGg6IDEwIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGFuIGFycmF5IG9mIHRleHRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gWyd0ZXN0J11cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHQodmFsLCB7IC4uLm9wdGlvbnMsIGhhc01hbnk6IHRydWUgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHJlcXVpcmVkIGFycmF5IG9mIHRleHRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gWyd0ZXN0J11cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHQodmFsLCB7IC4uLm9wdGlvbnMsIGhhc01hbnk6IHRydWUsIHJlcXVpcmVkOiB0cnVlIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgndGV4dGFyZWEnLCAoKSA9PiB7XG4gICAgb3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgZmllbGQ6IHsgbmFtZTogJ3Rlc3QnLCB0eXBlOiAndGV4dGFyZWEnIH0gfVxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAndGVzdCdcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHRhcmVhKHZhbCwgb3B0aW9ucylcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgc2hvdyByZXF1aXJlZCBtZXNzYWdlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdW5kZWZpbmVkXG4gICAgICBjb25zdCByZXN1bHQgPSB0ZXh0YXJlYSh2YWwsIHsgLi4ub3B0aW9ucywgcmVxdWlyZWQ6IHRydWUgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ3ZhbGlkYXRpb246cmVxdWlyZWQnKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHRhcmVhKHZhbCwgb3B0aW9ucylcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbWF4TGVuZ3RoJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gJ3Rvb2xvbmcnXG4gICAgICBjb25zdCByZXN1bHQgPSB0ZXh0YXJlYSh2YWwsIHsgLi4ub3B0aW9ucywgbWF4TGVuZ3RoOiA1IH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCd2YWxpZGF0aW9uOnNob3J0ZXJUaGFuTWF4JylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBtaW5MZW5ndGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAnc2hvcnQnXG4gICAgICBjb25zdCByZXN1bHQgPSB0ZXh0YXJlYSh2YWwsIHsgLi4ub3B0aW9ucywgbWluTGVuZ3RoOiAxMCB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsaWRhdGlvbjpsb25nZXJUaGFuTWluJylcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbWF4TGVuZ3RoIHdpdGggbm8gdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHRhcmVhKHZhbCwgeyAuLi5vcHRpb25zLCBtYXhMZW5ndGg6IDUgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbWluTGVuZ3RoIHdpdGggbm8gdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHRhcmVhKHZhbCwgeyAuLi5vcHRpb25zLCBtaW5MZW5ndGg6IDEwIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgncGFzc3dvcmQnLCAoKSA9PiB7XG4gICAgY29uc3QgcGFzc3dvcmRPcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG5hbWU6ICd0ZXN0JyxcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXG4gICAgfVxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAndGVzdCdcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhc3N3b3JkKHZhbCwgcGFzc3dvcmRPcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBzaG93IHJlcXVpcmVkIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhc3N3b3JkKHZhbCwgeyAuLi5wYXNzd29yZE9wdGlvbnMsIHJlcXVpcmVkOiB0cnVlIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCd2YWxpZGF0aW9uOnJlcXVpcmVkJylcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IHVuZGVmaW5lZFxuICAgICAgY29uc3QgcmVzdWx0ID0gcGFzc3dvcmQodmFsLCBwYXNzd29yZE9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIG1heExlbmd0aCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9ICd0b29sb25nJ1xuICAgICAgY29uc3QgcmVzdWx0ID0gcGFzc3dvcmQodmFsLCB7IC4uLnBhc3N3b3JkT3B0aW9ucywgbWF4TGVuZ3RoOiA1IH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCd2YWxpZGF0aW9uOnNob3J0ZXJUaGFuTWF4JylcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbWluTGVuZ3RoJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gJ3Nob3J0J1xuICAgICAgY29uc3QgcmVzdWx0ID0gcGFzc3dvcmQodmFsLCB7IC4uLnBhc3N3b3JkT3B0aW9ucywgbWluTGVuZ3RoOiAxMCB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsaWRhdGlvbjpsb25nZXJUaGFuTWluJylcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbWF4TGVuZ3RoIHdpdGggbm8gdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhc3N3b3JkKHZhbCwgeyAuLi5wYXNzd29yZE9wdGlvbnMsIG1heExlbmd0aDogNSB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBtaW5MZW5ndGggd2l0aCBubyB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IHVuZGVmaW5lZFxuICAgICAgY29uc3QgcmVzdWx0ID0gcGFzc3dvcmQodmFsLCB7IC4uLnBhc3N3b3JkT3B0aW9ucywgbWluTGVuZ3RoOiAxMCB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3BvaW50JywgKCkgPT4ge1xuICAgIGNvbnN0IHBvaW50T3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBuYW1lOiAncG9pbnQnLFxuICAgICAgdHlwZTogJ3BvaW50JyxcbiAgICB9XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBudW1iZXJzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gWycwLjEnLCAnMC4yJ11cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50KHZhbCwgcG9pbnRPcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBzdHJpbmdzIHRoYXQgY291bGQgYmUgbnVtYmVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IFsnMC4xJywgJzAuMiddXG4gICAgICBjb25zdCByZXN1bHQgPSBwb2ludCh2YWwsIHBvaW50T3B0aW9ucylcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgc2hvdyByZXF1aXJlZCBtZXNzYWdlIHdoZW4gdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdW5kZWZpbmVkXG4gICAgICBjb25zdCByZXN1bHQgPSBwb2ludCh2YWwsIHsgLi4ucG9pbnRPcHRpb25zLCByZXF1aXJlZDogdHJ1ZSB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgc2hvdyByZXF1aXJlZCBtZXNzYWdlIHdoZW4gYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBbXVxuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnQodmFsLCB7IC4uLnBvaW50T3B0aW9ucywgcmVxdWlyZWQ6IHRydWUgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHNob3cgcmVxdWlyZWQgbWVzc2FnZSB3aGVuIGFycmF5IG9mIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IFt1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50KHZhbCwgeyAuLi5wb2ludE9wdGlvbnMsIHJlcXVpcmVkOiB0cnVlIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgdW5kZWZpbmVkIG5vdCByZXF1aXJlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IHVuZGVmaW5lZFxuICAgICAgY29uc3QgcmVzdWx0ID0gcGFzc3dvcmQodmFsLCBwb2ludE9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBhcnJheSBub3QgcmVxdWlyZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBbXVxuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnQodmFsLCBwb2ludE9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBhcnJheSBvZiB1bmRlZmluZWQgbm90IHJlcXVpcmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnQodmFsLCBwb2ludE9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHByZXZlbnQgdGV4dCBpbnB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IFsnYmFkJywgJ2lucHV0J11cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50KHZhbCwgcG9pbnRPcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgcHJldmVudCBtaXNzaW5nIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gWzAuMV1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50KHZhbCwgcG9pbnRPcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQmUodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdyZWxhdGlvbnNoaXAnLCAoKSA9PiB7XG4gICAgY29uc3QgcmVsYXRpb25Db2xsZWN0aW9uID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnaWQnLFxuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBzbHVnOiAncmVsYXRpb24nLFxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcE9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGNvbGxlY3Rpb25zOiBbcmVsYXRpb25Db2xsZWN0aW9uXSxcbiAgICAgIH0sXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGNvbGxlY3Rpb25zOiB7XG4gICAgICAgICAgcmVsYXRpb246IHtcbiAgICAgICAgICAgIGNvbmZpZzogcmVsYXRpb25Db2xsZWN0aW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmVsYXRpb25UbzogJ3JlbGF0aW9uJyxcbiAgICB9XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgcmVxdWlyZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlbGF0aW9uc2hpcCh2YWwsIHsgLi4ucmVsYXRpb25zaGlwT3B0aW9ucywgcmVxdWlyZWQ6IHRydWUgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSByZXF1aXJlZCB3aXRoIGhhc01hbnknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBbXVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVsYXRpb25zaGlwKHZhbCwge1xuICAgICAgICAuLi5yZWxhdGlvbnNoaXBPcHRpb25zLFxuICAgICAgICBoYXNNYW55OiB0cnVlLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBlbmZvcmNlIGhhc01hbnkgbWluJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbWluT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ucmVsYXRpb25zaGlwT3B0aW9ucyxcbiAgICAgICAgaGFzTWFueTogdHJ1ZSxcbiAgICAgICAgbWluUm93czogMixcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsID0gWydhJ11cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVsYXRpb25zaGlwKHZhbCwgbWluT3B0aW9ucylcbiAgICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0JlKHRydWUpXG5cbiAgICAgIGNvbnN0IGFsbG93ZWQgPSBhd2FpdCByZWxhdGlvbnNoaXAoWydhJywgJ2InXSwgbWluT3B0aW9ucylcbiAgICAgIGV4cGVjdChhbGxvd2VkKS50b1N0cmljdEVxdWFsKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIGVuZm9yY2UgaGFzTWFueSBtYXgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtYXhPcHRpb25zID0ge1xuICAgICAgICAuLi5yZWxhdGlvbnNoaXBPcHRpb25zLFxuICAgICAgICBoYXNNYW55OiB0cnVlLFxuICAgICAgICBtYXhSb3dzOiAyLFxuICAgICAgfVxuICAgICAgbGV0IHZhbCA9IFsnYScsICdiJywgJ2MnXVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWxhdGlvbnNoaXAodmFsLCBtYXhPcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQmUodHJ1ZSlcblxuICAgICAgdmFsID0gWydhJ11cbiAgICAgIGNvbnN0IGFsbG93ZWQgPSBhd2FpdCByZWxhdGlvbnNoaXAodmFsLCBtYXhPcHRpb25zKVxuICAgICAgZXhwZWN0KGFsbG93ZWQpLnRvU3RyaWN0RXF1YWwodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdzZWxlY3QnLCAoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0T3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBvcHRpb25zOiBbJ29uZScsICd0d28nLCAndGhyZWUnXSxcbiAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgIH1cbiAgICBjb25zdCBvcHRpb25zUmVxdWlyZWQgPSB7XG4gICAgICAuLi5zZWxlY3RPcHRpb25zLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdPbmUnLFxuICAgICAgICAgIHZhbHVlOiAnb25lJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAndHdvJyxcbiAgICAgICAgICB2YWx1ZTogJ3R3bycsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ3RocmVlJyxcbiAgICAgICAgICB2YWx1ZTogJ3RocmVlJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uc1dpdGhFbXB0eVN0cmluZyA9IHtcbiAgICAgIC4uLnNlbGVjdE9wdGlvbnMsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ05vbmUnLFxuICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnT3B0aW9uJyxcbiAgICAgICAgICB2YWx1ZTogJ29wdGlvbicsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cbiAgICBpdCgnc2hvdWxkIGFsbG93IHZhbGlkIGlucHV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gJ29uZSdcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdCh2YWwsIHNlbGVjdE9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS50b1N0cmljdEVxdWFsKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHByZXZlbnQgaW52YWxpZCBpbnB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9ICdiYWQnXG4gICAgICBjb25zdCByZXN1bHQgPSBzZWxlY3QodmFsLCBzZWxlY3RPcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvU3RyaWN0RXF1YWwodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgYWxsb3cgbnVsbCBpbnB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IG51bGxcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdCh2YWwsIHNlbGVjdE9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS50b1N0cmljdEVxdWFsKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIGFsbG93IHVuZGVmaW5lZCBpbnB1dCcsICgpID0+IHtcbiAgICAgIGxldCB2YWxcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdCh2YWwsIHNlbGVjdE9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS50b1N0cmljdEVxdWFsKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHByZXZlbnQgZW1wdHkgc3RyaW5nIGlucHV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gJydcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdCh2YWwsIHNlbGVjdE9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9TdHJpY3RFcXVhbCh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBwcmV2ZW50IHVuZGVmaW5lZCBpbnB1dCB3aXRoIHJlcXVpcmVkJywgKCkgPT4ge1xuICAgICAgbGV0IHZhbFxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VsZWN0KHZhbCwgb3B0aW9uc1JlcXVpcmVkKVxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvU3RyaWN0RXF1YWwodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgcHJldmVudCBlbXB0eSBzdHJpbmcgaW5wdXQgd2l0aCByZXF1aXJlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdCgnJywgb3B0aW9uc1JlcXVpcmVkKVxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvU3RyaWN0RXF1YWwodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgcHJldmVudCB1bmRlZmluZWQgaW5wdXQgd2l0aCByZXF1aXJlZCBhbmQgaGFzTWFueScsICgpID0+IHtcbiAgICAgIGxldCB2YWxcbiAgICAgIG9wdGlvbnMuaGFzTWFueSA9IHRydWVcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdCh2YWwsIG9wdGlvbnNSZXF1aXJlZClcbiAgICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b1N0cmljdEVxdWFsKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHByZXZlbnQgZW1wdHkgYXJyYXkgaW5wdXQgd2l0aCByZXF1aXJlZCBhbmQgaGFzTWFueScsICgpID0+IHtcbiAgICAgIG9wdGlvbnNSZXF1aXJlZC5oYXNNYW55ID0gdHJ1ZVxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VsZWN0KFtdLCBvcHRpb25zUmVxdWlyZWQpXG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9TdHJpY3RFcXVhbCh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBwcmV2ZW50IGVtcHR5IHN0cmluZyBhcnJheSBpbnB1dCB3aXRoIHJlcXVpcmVkIGFuZCBoYXNNYW55JywgKCkgPT4ge1xuICAgICAgb3B0aW9ucy5oYXNNYW55ID0gdHJ1ZVxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VsZWN0KFsnJ10sIG9wdGlvbnNSZXF1aXJlZClcbiAgICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b1N0cmljdEVxdWFsKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHByZXZlbnQgbnVsbCBpbnB1dCB3aXRoIHJlcXVpcmVkIGFuZCBoYXNNYW55JywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gbnVsbFxuICAgICAgb3B0aW9ucy5oYXNNYW55ID0gdHJ1ZVxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VsZWN0KHZhbCwgb3B0aW9uc1JlcXVpcmVkKVxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvU3RyaWN0RXF1YWwodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgYWxsb3cgdmFsaWQgaW5wdXQgd2l0aCBvcHRpb24gb2JqZWN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9ICdvbmUnXG4gICAgICBvcHRpb25zLmhhc01hbnkgPSBmYWxzZVxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VsZWN0KHZhbCwgb3B0aW9uc1JlcXVpcmVkKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9TdHJpY3RFcXVhbCh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBwcmV2ZW50IGludmFsaWQgaW5wdXQgd2l0aCBvcHRpb24gb2JqZWN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9ICdiYWQnXG4gICAgICBvcHRpb25zLmhhc01hbnkgPSBmYWxzZVxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VsZWN0KHZhbCwgb3B0aW9uc1JlcXVpcmVkKVxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvU3RyaWN0RXF1YWwodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgYWxsb3cgZW1wdHkgc3RyaW5nIGlucHV0IHdpdGggb3B0aW9uIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9ICcnXG4gICAgICBjb25zdCByZXN1bHQgPSBzZWxlY3QodmFsLCBvcHRpb25zV2l0aEVtcHR5U3RyaW5nKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9TdHJpY3RFcXVhbCh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBlbXB0eSBzdHJpbmcgaW5wdXQgd2l0aCBvcHRpb24gb2JqZWN0IGFuZCByZXF1aXJlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9ICcnXG4gICAgICBvcHRpb25zV2l0aEVtcHR5U3RyaW5nLnJlcXVpcmVkID0gdHJ1ZVxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VsZWN0KHZhbCwgb3B0aW9uc1dpdGhFbXB0eVN0cmluZylcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvU3RyaWN0RXF1YWwodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgYWxsb3cgdmFsaWQgaW5wdXQgd2l0aCBoYXNNYW55JywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gWydvbmUnLCAndHdvJ11cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdCh2YWwsIHNlbGVjdE9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS50b1N0cmljdEVxdWFsKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHByZXZlbnQgaW52YWxpZCBpbnB1dCB3aXRoIGhhc01hbnknLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBbJ29uZScsICdiYWQnXVxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VsZWN0KHZhbCwgc2VsZWN0T3B0aW9ucylcbiAgICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b1N0cmljdEVxdWFsKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIGFsbG93IHZhbGlkIGlucHV0IHdpdGggaGFzTWFueSBvcHRpb24gb2JqZWN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IFsnb25lJywgJ3RocmVlJ11cbiAgICAgIG9wdGlvbnNSZXF1aXJlZC5oYXNNYW55ID0gdHJ1ZVxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VsZWN0KHZhbCwgb3B0aW9uc1JlcXVpcmVkKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9TdHJpY3RFcXVhbCh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBwcmV2ZW50IGludmFsaWQgaW5wdXQgd2l0aCBoYXNNYW55IG9wdGlvbiBvYmplY3RzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gWyd0aHJlZScsICdiYWQnXVxuICAgICAgb3B0aW9uc1JlcXVpcmVkLmhhc01hbnkgPSB0cnVlXG4gICAgICBjb25zdCByZXN1bHQgPSBzZWxlY3QodmFsLCBvcHRpb25zUmVxdWlyZWQpXG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9TdHJpY3RFcXVhbCh0cnVlKVxuICAgIH0pXG4gIH0pXG4gIGRlc2NyaWJlKCdudW1iZXInLCAoKSA9PiB7XG4gICAgY29uc3QgbnVtYmVyT3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBuYW1lOiAndGVzdCcsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICB9XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IDFcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG51bWJlcih2YWwsIG51bWJlck9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIDAnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAwXG4gICAgICBjb25zdCByZXN1bHQgPSBudW1iZXIodmFsLCB7IC4uLm51bWJlck9wdGlvbnMsIHJlcXVpcmVkOiB0cnVlIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIDInLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAxLjVcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG51bWJlcih2YWwsIG51bWJlck9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHNob3cgaW52YWxpZCBudW1iZXIgbWVzc2FnZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9ICd0ZXN0J1xuICAgICAgY29uc3QgcmVzdWx0ID0gbnVtYmVyKHZhbCwgeyAuLi5udW1iZXJPcHRpb25zIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCd2YWxpZGF0aW9uOmVudGVyTnVtYmVyJylcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGVtcHR5IHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gJydcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG51bWJlcih2YWwsIHsgLi4ubnVtYmVyT3B0aW9ucyB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgcmVxdWlyZWQgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAnJ1xuICAgICAgY29uc3QgcmVzdWx0ID0gbnVtYmVyKHZhbCwgeyAuLi5udW1iZXJPcHRpb25zLCByZXF1aXJlZDogdHJ1ZSB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsaWRhdGlvbjpyZXF1aXJlZCcpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIG1pblZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gMi40XG4gICAgICBjb25zdCByZXN1bHQgPSBudW1iZXIodmFsLCB7IC4uLm51bWJlck9wdGlvbnMsIG1pbjogMi41IH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCd2YWxpZGF0aW9uOmxlc3NUaGFuTWluJylcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbWF4VmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAxLjI1XG4gICAgICBjb25zdCByZXN1bHQgPSBudW1iZXIodmFsLCB7IC4uLm51bWJlck9wdGlvbnMsIG1heDogMSB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsaWRhdGlvbjpncmVhdGVyVGhhbk1heCcpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGFuIGFycmF5IG9mIG51bWJlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBbMS4yNSwgMi41XVxuICAgICAgY29uc3QgcmVzdWx0ID0gbnVtYmVyKHZhbCwgeyAuLi5udW1iZXJPcHRpb25zLCBoYXNNYW55OiB0cnVlIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGFuIGFycmF5IG9mIG51bWJlcnMgdXNpbmcgbWluJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gWzEuMjUsIDIuNV1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG51bWJlcih2YWwsIHsgLi4ubnVtYmVyT3B0aW9ucywgaGFzTWFueTogdHJ1ZSwgbWluOiAzIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCd2YWxpZGF0aW9uOmxlc3NUaGFuTWluJylcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYW4gYXJyYXkgb2YgbnVtYmVycyB1c2luZyBtYXgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBbMS4yNSwgMi41XVxuICAgICAgY29uc3QgcmVzdWx0ID0gbnVtYmVyKHZhbCwgeyAuLi5udW1iZXJPcHRpb25zLCBoYXNNYW55OiB0cnVlLCBtYXg6IDEgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ3ZhbGlkYXRpb246Z3JlYXRlclRoYW5NYXgnKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhbiBhcnJheSBvZiBudW1iZXJzIHVzaW5nIG1pblJvd3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBbMS4yNSwgMi41XVxuICAgICAgY29uc3QgcmVzdWx0ID0gbnVtYmVyKHZhbCwgeyAuLi5udW1iZXJPcHRpb25zLCBoYXNNYW55OiB0cnVlLCBtaW5Sb3dzOiA0IH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCd2YWxpZGF0aW9uOnJlcXVpcmVzQXRMZWFzdCcpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGFuIGFycmF5IG9mIG51bWJlcnMgdXNpbmcgbWF4Um93cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IFsxLjI1LCAyLjUsIDMuNV1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG51bWJlcih2YWwsIHsgLi4ubnVtYmVyT3B0aW9ucywgaGFzTWFueTogdHJ1ZSwgbWF4Um93czogMiB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsaWRhdGlvbjpyZXF1aXJlc05vTW9yZVRoYW4nKVxuICAgIH0pXG4gIH0pXG59KVxuIl0sIm5hbWVzIjpbInQiLCJqZXN0IiwiZm4iLCJzdHJpbmciLCJvcHRpb25zIiwiZGF0YSIsInVuZGVmaW5lZCIsIm9wZXJhdGlvbiIsInNpYmxpbmdEYXRhIiwiZGVzY3JpYmUiLCJpdCIsInZhbCIsInJlc3VsdCIsInRleHQiLCJleHBlY3QiLCJ0b0JlIiwicmVxdWlyZWQiLCJtYXhMZW5ndGgiLCJtaW5MZW5ndGgiLCJoYXNNYW55IiwiZmllbGQiLCJuYW1lIiwidHlwZSIsInRleHRhcmVhIiwicGFzc3dvcmRPcHRpb25zIiwicGFzc3dvcmQiLCJwb2ludE9wdGlvbnMiLCJwb2ludCIsIm5vdCIsInJlbGF0aW9uQ29sbGVjdGlvbiIsImZpZWxkcyIsInNsdWciLCJyZWxhdGlvbnNoaXBPcHRpb25zIiwiY29uZmlnIiwiY29sbGVjdGlvbnMiLCJwYXlsb2FkIiwicmVsYXRpb24iLCJyZWxhdGlvblRvIiwicmVsYXRpb25zaGlwIiwibWluT3B0aW9ucyIsIm1pblJvd3MiLCJhbGxvd2VkIiwidG9TdHJpY3RFcXVhbCIsIm1heE9wdGlvbnMiLCJtYXhSb3dzIiwic2VsZWN0T3B0aW9ucyIsIm9wdGlvbnNSZXF1aXJlZCIsImxhYmVsIiwidmFsdWUiLCJvcHRpb25zV2l0aEVtcHR5U3RyaW5nIiwic2VsZWN0IiwibnVtYmVyT3B0aW9ucyIsIm51bWJlciIsIm1pbiIsIm1heCJdLCJtYXBwaW5ncyI6Ijs7Ozs2QkFFOEU7QUFFOUUsTUFBTUEsSUFBSUMsS0FBS0MsRUFBRSxDQUFDLENBQUNDLFNBQVdBO0FBRTlCLElBQUlDLFVBQTBDO0lBQzVDQyxNQUFNQztJQUNOQyxXQUFXO0lBQ1hDLGFBQWFGO0lBQ2JOO0FBQ0Y7QUFFQVMsU0FBUyxxQkFBcUI7SUFDNUJBLFNBQVMsUUFBUTtR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
|
|
654
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maWVsZHMvdmFsaWRhdGlvbnMuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFZhbGlkYXRlT3B0aW9ucyB9IGZyb20gJy4vY29uZmlnL3R5cGVzJ1xuXG5pbXBvcnQgeyBudW1iZXIsIHBhc3N3b3JkLCBwb2ludCwgcmVsYXRpb25zaGlwLCBzZWxlY3QsIHRleHQsIHRleHRhcmVhIH0gZnJvbSAnLi92YWxpZGF0aW9ucydcblxuY29uc3QgdCA9IGplc3QuZm4oKHN0cmluZykgPT4gc3RyaW5nKVxuXG5sZXQgb3B0aW9uczogVmFsaWRhdGVPcHRpb25zPGFueSwgYW55PiA9IHtcbiAgZGF0YTogdW5kZWZpbmVkLFxuICBvcGVyYXRpb246ICdjcmVhdGUnLFxuICBzaWJsaW5nRGF0YTogdW5kZWZpbmVkLFxuICByZXE6IHtcbiAgICB0LFxuICAgIGNvbnRleHQ6IHt9LFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGNvbmZpZzoge30sXG4gICAgfSxcbiAgfSxcbn1cblxuZGVzY3JpYmUoJ0ZpZWxkIFZhbGlkYXRpb25zJywgKCkgPT4ge1xuICBkZXNjcmliZSgndGV4dCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gJ3Rlc3QnXG4gICAgICBjb25zdCByZXN1bHQgPSB0ZXh0KHZhbCwgb3B0aW9ucylcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgc2hvdyByZXF1aXJlZCBtZXNzYWdlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdW5kZWZpbmVkXG4gICAgICBjb25zdCByZXN1bHQgPSB0ZXh0KHZhbCwgeyAuLi5vcHRpb25zLCByZXF1aXJlZDogdHJ1ZSB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsaWRhdGlvbjpyZXF1aXJlZCcpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHQodmFsLCBvcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBtYXhMZW5ndGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAndG9vbG9uZydcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHQodmFsLCB7IC4uLm9wdGlvbnMsIG1heExlbmd0aDogNSB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsaWRhdGlvbjpzaG9ydGVyVGhhbk1heCcpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIG1pbkxlbmd0aCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9ICdzaG9ydCdcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHQodmFsLCB7IC4uLm9wdGlvbnMsIG1pbkxlbmd0aDogMTAgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ3ZhbGlkYXRpb246bG9uZ2VyVGhhbk1pbicpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIG1heExlbmd0aCB3aXRoIG5vIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdW5kZWZpbmVkXG4gICAgICBjb25zdCByZXN1bHQgPSB0ZXh0KHZhbCwgeyAuLi5vcHRpb25zLCBtYXhMZW5ndGg6IDUgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbWluTGVuZ3RoIHdpdGggbm8gdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHQodmFsLCB7IC4uLm9wdGlvbnMsIG1pbkxlbmd0aDogMTAgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYW4gYXJyYXkgb2YgdGV4dHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBbJ3Rlc3QnXVxuICAgICAgY29uc3QgcmVzdWx0ID0gdGV4dCh2YWwsIHsgLi4ub3B0aW9ucywgaGFzTWFueTogdHJ1ZSB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgcmVxdWlyZWQgYXJyYXkgb2YgdGV4dHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBbJ3Rlc3QnXVxuICAgICAgY29uc3QgcmVzdWx0ID0gdGV4dCh2YWwsIHsgLi4ub3B0aW9ucywgaGFzTWFueTogdHJ1ZSwgcmVxdWlyZWQ6IHRydWUgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCd0ZXh0YXJlYScsICgpID0+IHtcbiAgICBvcHRpb25zID0geyAuLi5vcHRpb25zLCBmaWVsZDogeyBuYW1lOiAndGVzdCcsIHR5cGU6ICd0ZXh0YXJlYScgfSB9XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9ICd0ZXN0J1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGV4dGFyZWEodmFsLCBvcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBzaG93IHJlcXVpcmVkIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHRhcmVhKHZhbCwgeyAuLi5vcHRpb25zLCByZXF1aXJlZDogdHJ1ZSB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsaWRhdGlvbjpyZXF1aXJlZCcpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IHVuZGVmaW5lZFxuICAgICAgY29uc3QgcmVzdWx0ID0gdGV4dGFyZWEodmFsLCBvcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBtYXhMZW5ndGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAndG9vbG9uZydcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHRhcmVhKHZhbCwgeyAuLi5vcHRpb25zLCBtYXhMZW5ndGg6IDUgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ3ZhbGlkYXRpb246c2hvcnRlclRoYW5NYXgnKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIG1pbkxlbmd0aCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9ICdzaG9ydCdcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHRhcmVhKHZhbCwgeyAuLi5vcHRpb25zLCBtaW5MZW5ndGg6IDEwIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCd2YWxpZGF0aW9uOmxvbmdlclRoYW5NaW4nKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBtYXhMZW5ndGggd2l0aCBubyB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IHVuZGVmaW5lZFxuICAgICAgY29uc3QgcmVzdWx0ID0gdGV4dGFyZWEodmFsLCB7IC4uLm9wdGlvbnMsIG1heExlbmd0aDogNSB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBtaW5MZW5ndGggd2l0aCBubyB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IHVuZGVmaW5lZFxuICAgICAgY29uc3QgcmVzdWx0ID0gdGV4dGFyZWEodmFsLCB7IC4uLm9wdGlvbnMsIG1pbkxlbmd0aDogMTAgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdwYXNzd29yZCcsICgpID0+IHtcbiAgICBjb25zdCBwYXNzd29yZE9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbmFtZTogJ3Rlc3QnLFxuICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcbiAgICB9XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9ICd0ZXN0J1xuICAgICAgY29uc3QgcmVzdWx0ID0gcGFzc3dvcmQodmFsLCBwYXNzd29yZE9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHNob3cgcmVxdWlyZWQgbWVzc2FnZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IHVuZGVmaW5lZFxuICAgICAgY29uc3QgcmVzdWx0ID0gcGFzc3dvcmQodmFsLCB7IC4uLnBhc3N3b3JkT3B0aW9ucywgcmVxdWlyZWQ6IHRydWUgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ3ZhbGlkYXRpb246cmVxdWlyZWQnKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdW5kZWZpbmVkXG4gICAgICBjb25zdCByZXN1bHQgPSBwYXNzd29yZCh2YWwsIHBhc3N3b3JkT3B0aW9ucylcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbWF4TGVuZ3RoJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gJ3Rvb2xvbmcnXG4gICAgICBjb25zdCByZXN1bHQgPSBwYXNzd29yZCh2YWwsIHsgLi4ucGFzc3dvcmRPcHRpb25zLCBtYXhMZW5ndGg6IDUgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ3ZhbGlkYXRpb246c2hvcnRlclRoYW5NYXgnKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBtaW5MZW5ndGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAnc2hvcnQnXG4gICAgICBjb25zdCByZXN1bHQgPSBwYXNzd29yZCh2YWwsIHsgLi4ucGFzc3dvcmRPcHRpb25zLCBtaW5MZW5ndGg6IDEwIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCd2YWxpZGF0aW9uOmxvbmdlclRoYW5NaW4nKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBtYXhMZW5ndGggd2l0aCBubyB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IHVuZGVmaW5lZFxuICAgICAgY29uc3QgcmVzdWx0ID0gcGFzc3dvcmQodmFsLCB7IC4uLnBhc3N3b3JkT3B0aW9ucywgbWF4TGVuZ3RoOiA1IH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIG1pbkxlbmd0aCB3aXRoIG5vIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdW5kZWZpbmVkXG4gICAgICBjb25zdCByZXN1bHQgPSBwYXNzd29yZCh2YWwsIHsgLi4ucGFzc3dvcmRPcHRpb25zLCBtaW5MZW5ndGg6IDEwIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgncG9pbnQnLCAoKSA9PiB7XG4gICAgY29uc3QgcG9pbnRPcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG5hbWU6ICdwb2ludCcsXG4gICAgICB0eXBlOiAncG9pbnQnLFxuICAgIH1cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIG51bWJlcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBbJzAuMScsICcwLjInXVxuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnQodmFsLCBwb2ludE9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHN0cmluZ3MgdGhhdCBjb3VsZCBiZSBudW1iZXJzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gWycwLjEnLCAnMC4yJ11cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50KHZhbCwgcG9pbnRPcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBzaG93IHJlcXVpcmVkIG1lc3NhZ2Ugd2hlbiB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50KHZhbCwgeyAuLi5wb2ludE9wdGlvbnMsIHJlcXVpcmVkOiB0cnVlIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBzaG93IHJlcXVpcmVkIG1lc3NhZ2Ugd2hlbiBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IFtdXG4gICAgICBjb25zdCByZXN1bHQgPSBwb2ludCh2YWwsIHsgLi4ucG9pbnRPcHRpb25zLCByZXF1aXJlZDogdHJ1ZSB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgc2hvdyByZXF1aXJlZCBtZXNzYWdlIHdoZW4gYXJyYXkgb2YgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnQodmFsLCB7IC4uLnBvaW50T3B0aW9ucywgcmVxdWlyZWQ6IHRydWUgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0JlKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSB1bmRlZmluZWQgbm90IHJlcXVpcmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdW5kZWZpbmVkXG4gICAgICBjb25zdCByZXN1bHQgPSBwYXNzd29yZCh2YWwsIHBvaW50T3B0aW9ucylcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGVtcHR5IGFycmF5IG5vdCByZXF1aXJlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IFtdXG4gICAgICBjb25zdCByZXN1bHQgPSBwb2ludCh2YWwsIHBvaW50T3B0aW9ucylcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGFycmF5IG9mIHVuZGVmaW5lZCBub3QgcmVxdWlyZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBbdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gICAgICBjb25zdCByZXN1bHQgPSBwb2ludCh2YWwsIHBvaW50T3B0aW9ucylcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgcHJldmVudCB0ZXh0IGlucHV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gWydiYWQnLCAnaW5wdXQnXVxuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnQodmFsLCBwb2ludE9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBwcmV2ZW50IG1pc3NpbmcgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBbMC4xXVxuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnQodmFsLCBwb2ludE9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9CZSh0cnVlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3JlbGF0aW9uc2hpcCcsICgpID0+IHtcbiAgICBjb25zdCByZWxhdGlvbkNvbGxlY3Rpb24gPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdpZCcsXG4gICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHNsdWc6ICdyZWxhdGlvbicsXG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpb25zaGlwT3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICByZXE6IHtcbiAgICAgICAgLi4ub3B0aW9ucy5yZXEsXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAuLi5vcHRpb25zLnJlcS5wYXlsb2FkLFxuICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgY29sbGVjdGlvbnM6IFtyZWxhdGlvbkNvbGxlY3Rpb25dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29sbGVjdGlvbnM6IHtcbiAgICAgICAgICAgIHJlbGF0aW9uOiB7XG4gICAgICAgICAgICAgIGNvbmZpZzogcmVsYXRpb25Db2xsZWN0aW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlbGF0aW9uVG86ICdyZWxhdGlvbicsXG4gICAgfVxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHJlcXVpcmVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdW5kZWZpbmVkXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWxhdGlvbnNoaXAodmFsLCB7IC4uLnJlbGF0aW9uc2hpcE9wdGlvbnMsIHJlcXVpcmVkOiB0cnVlIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgcmVxdWlyZWQgd2l0aCBoYXNNYW55JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gW11cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlbGF0aW9uc2hpcCh2YWwsIHtcbiAgICAgICAgLi4ucmVsYXRpb25zaGlwT3B0aW9ucyxcbiAgICAgICAgaGFzTWFueTogdHJ1ZSxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgZW5mb3JjZSBoYXNNYW55IG1pbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1pbk9wdGlvbnMgPSB7XG4gICAgICAgIC4uLnJlbGF0aW9uc2hpcE9wdGlvbnMsXG4gICAgICAgIGhhc01hbnk6IHRydWUsXG4gICAgICAgIG1pblJvd3M6IDIsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbCA9IFsnYSddXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlbGF0aW9uc2hpcCh2YWwsIG1pbk9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9CZSh0cnVlKVxuXG4gICAgICBjb25zdCBhbGxvd2VkID0gYXdhaXQgcmVsYXRpb25zaGlwKFsnYScsICdiJ10sIG1pbk9wdGlvbnMpXG4gICAgICBleHBlY3QoYWxsb3dlZCkudG9TdHJpY3RFcXVhbCh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBlbmZvcmNlIGhhc01hbnkgbWF4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbWF4T3B0aW9ucyA9IHtcbiAgICAgICAgLi4ucmVsYXRpb25zaGlwT3B0aW9ucyxcbiAgICAgICAgaGFzTWFueTogdHJ1ZSxcbiAgICAgICAgbWF4Um93czogMixcbiAgICAgIH1cbiAgICAgIGxldCB2YWwgPSBbJ2EnLCAnYicsICdjJ11cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVsYXRpb25zaGlwKHZhbCwgbWF4T3B0aW9ucylcbiAgICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0JlKHRydWUpXG5cbiAgICAgIHZhbCA9IFsnYSddXG4gICAgICBjb25zdCBhbGxvd2VkID0gYXdhaXQgcmVsYXRpb25zaGlwKHZhbCwgbWF4T3B0aW9ucylcbiAgICAgIGV4cGVjdChhbGxvd2VkKS50b1N0cmljdEVxdWFsKHRydWUpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnc2VsZWN0JywgKCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdE9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgb3B0aW9uczogWydvbmUnLCAndHdvJywgJ3RocmVlJ10sXG4gICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uc1JlcXVpcmVkID0ge1xuICAgICAgLi4uc2VsZWN0T3B0aW9ucyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnT25lJyxcbiAgICAgICAgICB2YWx1ZTogJ29uZScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ3R3bycsXG4gICAgICAgICAgdmFsdWU6ICd0d28nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICd0aHJlZScsXG4gICAgICAgICAgdmFsdWU6ICd0aHJlZScsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnNXaXRoRW1wdHlTdHJpbmcgPSB7XG4gICAgICAuLi5zZWxlY3RPcHRpb25zLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdOb25lJyxcbiAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ09wdGlvbicsXG4gICAgICAgICAgdmFsdWU6ICdvcHRpb24nLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG4gICAgaXQoJ3Nob3VsZCBhbGxvdyB2YWxpZCBpbnB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9ICdvbmUnXG4gICAgICBjb25zdCByZXN1bHQgPSBzZWxlY3QodmFsLCBzZWxlY3RPcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9TdHJpY3RFcXVhbCh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBwcmV2ZW50IGludmFsaWQgaW5wdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAnYmFkJ1xuICAgICAgY29uc3QgcmVzdWx0ID0gc2VsZWN0KHZhbCwgc2VsZWN0T3B0aW9ucylcbiAgICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b1N0cmljdEVxdWFsKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIGFsbG93IG51bGwgaW5wdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBudWxsXG4gICAgICBjb25zdCByZXN1bHQgPSBzZWxlY3QodmFsLCBzZWxlY3RPcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9TdHJpY3RFcXVhbCh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyB1bmRlZmluZWQgaW5wdXQnLCAoKSA9PiB7XG4gICAgICBsZXQgdmFsXG4gICAgICBjb25zdCByZXN1bHQgPSBzZWxlY3QodmFsLCBzZWxlY3RPcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9TdHJpY3RFcXVhbCh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBwcmV2ZW50IGVtcHR5IHN0cmluZyBpbnB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9ICcnXG4gICAgICBjb25zdCByZXN1bHQgPSBzZWxlY3QodmFsLCBzZWxlY3RPcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvU3RyaWN0RXF1YWwodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgcHJldmVudCB1bmRlZmluZWQgaW5wdXQgd2l0aCByZXF1aXJlZCcsICgpID0+IHtcbiAgICAgIGxldCB2YWxcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdCh2YWwsIG9wdGlvbnNSZXF1aXJlZClcbiAgICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b1N0cmljdEVxdWFsKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHByZXZlbnQgZW1wdHkgc3RyaW5nIGlucHV0IHdpdGggcmVxdWlyZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBzZWxlY3QoJycsIG9wdGlvbnNSZXF1aXJlZClcbiAgICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b1N0cmljdEVxdWFsKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHByZXZlbnQgdW5kZWZpbmVkIGlucHV0IHdpdGggcmVxdWlyZWQgYW5kIGhhc01hbnknLCAoKSA9PiB7XG4gICAgICBsZXQgdmFsXG4gICAgICBvcHRpb25zLmhhc01hbnkgPSB0cnVlXG4gICAgICBjb25zdCByZXN1bHQgPSBzZWxlY3QodmFsLCBvcHRpb25zUmVxdWlyZWQpXG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9TdHJpY3RFcXVhbCh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBwcmV2ZW50IGVtcHR5IGFycmF5IGlucHV0IHdpdGggcmVxdWlyZWQgYW5kIGhhc01hbnknLCAoKSA9PiB7XG4gICAgICBvcHRpb25zUmVxdWlyZWQuaGFzTWFueSA9IHRydWVcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdChbXSwgb3B0aW9uc1JlcXVpcmVkKVxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvU3RyaWN0RXF1YWwodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgcHJldmVudCBlbXB0eSBzdHJpbmcgYXJyYXkgaW5wdXQgd2l0aCByZXF1aXJlZCBhbmQgaGFzTWFueScsICgpID0+IHtcbiAgICAgIG9wdGlvbnMuaGFzTWFueSA9IHRydWVcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdChbJyddLCBvcHRpb25zUmVxdWlyZWQpXG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9TdHJpY3RFcXVhbCh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBwcmV2ZW50IG51bGwgaW5wdXQgd2l0aCByZXF1aXJlZCBhbmQgaGFzTWFueScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IG51bGxcbiAgICAgIG9wdGlvbnMuaGFzTWFueSA9IHRydWVcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdCh2YWwsIG9wdGlvbnNSZXF1aXJlZClcbiAgICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b1N0cmljdEVxdWFsKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIGFsbG93IHZhbGlkIGlucHV0IHdpdGggb3B0aW9uIG9iamVjdHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAnb25lJ1xuICAgICAgb3B0aW9ucy5oYXNNYW55ID0gZmFsc2VcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdCh2YWwsIG9wdGlvbnNSZXF1aXJlZClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvU3RyaWN0RXF1YWwodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgcHJldmVudCBpbnZhbGlkIGlucHV0IHdpdGggb3B0aW9uIG9iamVjdHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAnYmFkJ1xuICAgICAgb3B0aW9ucy5oYXNNYW55ID0gZmFsc2VcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdCh2YWwsIG9wdGlvbnNSZXF1aXJlZClcbiAgICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b1N0cmljdEVxdWFsKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIGFsbG93IGVtcHR5IHN0cmluZyBpbnB1dCB3aXRoIG9wdGlvbiBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAnJ1xuICAgICAgY29uc3QgcmVzdWx0ID0gc2VsZWN0KHZhbCwgb3B0aW9uc1dpdGhFbXB0eVN0cmluZylcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvU3RyaWN0RXF1YWwodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgYWxsb3cgZW1wdHkgc3RyaW5nIGlucHV0IHdpdGggb3B0aW9uIG9iamVjdCBhbmQgcmVxdWlyZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAnJ1xuICAgICAgb3B0aW9uc1dpdGhFbXB0eVN0cmluZy5yZXF1aXJlZCA9IHRydWVcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdCh2YWwsIG9wdGlvbnNXaXRoRW1wdHlTdHJpbmcpXG4gICAgICBleHBlY3QocmVzdWx0KS50b1N0cmljdEVxdWFsKHRydWUpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIGFsbG93IHZhbGlkIGlucHV0IHdpdGggaGFzTWFueScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IFsnb25lJywgJ3R3byddXG4gICAgICBjb25zdCByZXN1bHQgPSBzZWxlY3QodmFsLCBzZWxlY3RPcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9TdHJpY3RFcXVhbCh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBwcmV2ZW50IGludmFsaWQgaW5wdXQgd2l0aCBoYXNNYW55JywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gWydvbmUnLCAnYmFkJ11cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdCh2YWwsIHNlbGVjdE9wdGlvbnMpXG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9TdHJpY3RFcXVhbCh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyB2YWxpZCBpbnB1dCB3aXRoIGhhc01hbnkgb3B0aW9uIG9iamVjdHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBbJ29uZScsICd0aHJlZSddXG4gICAgICBvcHRpb25zUmVxdWlyZWQuaGFzTWFueSA9IHRydWVcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlbGVjdCh2YWwsIG9wdGlvbnNSZXF1aXJlZClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvU3RyaWN0RXF1YWwodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgcHJldmVudCBpbnZhbGlkIGlucHV0IHdpdGggaGFzTWFueSBvcHRpb24gb2JqZWN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IFsndGhyZWUnLCAnYmFkJ11cbiAgICAgIG9wdGlvbnNSZXF1aXJlZC5oYXNNYW55ID0gdHJ1ZVxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VsZWN0KHZhbCwgb3B0aW9uc1JlcXVpcmVkKVxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvU3RyaWN0RXF1YWwodHJ1ZSlcbiAgICB9KVxuICB9KVxuICBkZXNjcmliZSgnbnVtYmVyJywgKCkgPT4ge1xuICAgIGNvbnN0IG51bWJlck9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbmFtZTogJ3Rlc3QnLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgfVxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAxXG4gICAgICBjb25zdCByZXN1bHQgPSBudW1iZXIodmFsLCBudW1iZXJPcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSAwJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gMFxuICAgICAgY29uc3QgcmVzdWx0ID0gbnVtYmVyKHZhbCwgeyAuLi5udW1iZXJPcHRpb25zLCByZXF1aXJlZDogdHJ1ZSB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSAyJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gMS41XG4gICAgICBjb25zdCByZXN1bHQgPSBudW1iZXIodmFsLCBudW1iZXJPcHRpb25zKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBzaG93IGludmFsaWQgbnVtYmVyIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAndGVzdCdcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG51bWJlcih2YWwsIHsgLi4ubnVtYmVyT3B0aW9ucyB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsaWRhdGlvbjplbnRlck51bWJlcicpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9ICcnXG4gICAgICBjb25zdCByZXN1bHQgPSBudW1iZXIodmFsLCB7IC4uLm51bWJlck9wdGlvbnMgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHJlcXVpcmVkIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gJydcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG51bWJlcih2YWwsIHsgLi4ubnVtYmVyT3B0aW9ucywgcmVxdWlyZWQ6IHRydWUgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ3ZhbGlkYXRpb246cmVxdWlyZWQnKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBtaW5WYWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IDIuNFxuICAgICAgY29uc3QgcmVzdWx0ID0gbnVtYmVyKHZhbCwgeyAuLi5udW1iZXJPcHRpb25zLCBtaW46IDIuNSB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsaWRhdGlvbjpsZXNzVGhhbk1pbicpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIG1heFZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gMS4yNVxuICAgICAgY29uc3QgcmVzdWx0ID0gbnVtYmVyKHZhbCwgeyAuLi5udW1iZXJPcHRpb25zLCBtYXg6IDEgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ3ZhbGlkYXRpb246Z3JlYXRlclRoYW5NYXgnKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhbiBhcnJheSBvZiBudW1iZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gWzEuMjUsIDIuNV1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG51bWJlcih2YWwsIHsgLi4ubnVtYmVyT3B0aW9ucywgaGFzTWFueTogdHJ1ZSB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhbiBhcnJheSBvZiBudW1iZXJzIHVzaW5nIG1pbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IFsxLjI1LCAyLjVdXG4gICAgICBjb25zdCByZXN1bHQgPSBudW1iZXIodmFsLCB7IC4uLm51bWJlck9wdGlvbnMsIGhhc01hbnk6IHRydWUsIG1pbjogMyB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsaWRhdGlvbjpsZXNzVGhhbk1pbicpXG4gICAgfSlcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGFuIGFycmF5IG9mIG51bWJlcnMgdXNpbmcgbWF4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gWzEuMjUsIDIuNV1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG51bWJlcih2YWwsIHsgLi4ubnVtYmVyT3B0aW9ucywgaGFzTWFueTogdHJ1ZSwgbWF4OiAxIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCd2YWxpZGF0aW9uOmdyZWF0ZXJUaGFuTWF4JylcbiAgICB9KVxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYW4gYXJyYXkgb2YgbnVtYmVycyB1c2luZyBtaW5Sb3dzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gWzEuMjUsIDIuNV1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG51bWJlcih2YWwsIHsgLi4ubnVtYmVyT3B0aW9ucywgaGFzTWFueTogdHJ1ZSwgbWluUm93czogNCB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsaWRhdGlvbjpyZXF1aXJlc0F0TGVhc3QnKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhbiBhcnJheSBvZiBudW1iZXJzIHVzaW5nIG1heFJvd3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBbMS4yNSwgMi41LCAzLjVdXG4gICAgICBjb25zdCByZXN1bHQgPSBudW1iZXIodmFsLCB7IC4uLm51bWJlck9wdGlvbnMsIGhhc01hbnk6IHRydWUsIG1heFJvd3M6IDIgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ3ZhbGlkYXRpb246cmVxdWlyZXNOb01vcmVUaGFuJylcbiAgICB9KVxuICB9KVxufSlcbiJdLCJuYW1lcyI6WyJudW1iZXIiLCJwYXNzd29yZCIsInBvaW50IiwicmVsYXRpb25zaGlwIiwic2VsZWN0IiwidGV4dCIsInRleHRhcmVhIiwidCIsImplc3QiLCJmbiIsInN0cmluZyIsIm9wdGlvbnMiLCJkYXRhIiwidW5kZWZpbmVkIiwib3BlcmF0aW9uIiwic2libGluZ0RhdGEiLCJyZXEiLCJjb250ZXh0IiwicGF5bG9hZCIsImNvbmZpZyIsImRlc2NyaWJlIiwiaXQiLCJ2YWwiLCJyZXN1bHQiLCJleHBlY3QiLCJ0b0JlIiwicmVxdWlyZWQiLCJtYXhMZW5ndGgiLCJtaW5MZW5ndGgiLCJoYXNNYW55IiwiZmllbGQiLCJuYW1lIiwidHlwZSIsInBhc3N3b3JkT3B0aW9ucyIsInBvaW50T3B0aW9ucyIsIm5vdCIsInJlbGF0aW9uQ29sbGVjdGlvbiIsImZpZWxkcyIsInNsdWciLCJyZWxhdGlvbnNoaXBPcHRpb25zIiwiY29sbGVjdGlvbnMiLCJyZWxhdGlvbiIsInJlbGF0aW9uVG8iLCJtaW5PcHRpb25zIiwibWluUm93cyIsImFsbG93ZWQiLCJ0b1N0cmljdEVxdWFsIiwibWF4T3B0aW9ucyIsIm1heFJvd3MiLCJzZWxlY3RPcHRpb25zIiwib3B0aW9uc1JlcXVpcmVkIiwibGFiZWwiLCJ2YWx1ZSIsIm9wdGlvbnNXaXRoRW1wdHlTdHJpbmci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
|