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