@sot1986/appsync-precognition 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,3 +1,6 @@
1
+ import { Context } from "@aws-appsync/utils";
2
+
3
+ //#region rolldown:runtime
1
4
  //#endregion
2
5
  //#region src/types.d.ts
3
6
  interface Rule<T = unknown> {
@@ -13,9 +16,12 @@ interface HasConstructor {
13
16
  }
14
17
  type NestedKeyOf<T> = T extends Record<infer Key, unknown> ? T extends HasConstructor ? never : T extends CallableFunction ? never : Key extends string | number ? (ObjectKeys<T> | (T[Key] extends object ? `${ObjectKeys<Pick<T, Key>>}.${NestedKeyOf<T[Key]>}` : T extends unknown[] ? T extends [unknown, ...unknown[]] ? never : T[number] extends object ? `${number}.${NestedKeyOf<T[number]>}` : never : never)) : never : never;
15
18
  declare namespace rules_d_exports {
16
- export { names, parse };
19
+ export { names, parse, requiredRule };
17
20
  }
18
21
  declare const names: {
22
+ readonly required: "required";
23
+ readonly nullable: "nullable";
24
+ readonly sometimes: "sometimes";
19
25
  readonly min: "min";
20
26
  readonly max: "max";
21
27
  readonly between: "between";
@@ -24,11 +30,16 @@ declare const names: {
24
30
  readonly uuid: "uuid";
25
31
  readonly regex: "regex";
26
32
  readonly in: "in";
33
+ readonly notIn: "notIn";
34
+ readonly before: "before";
35
+ readonly after: "after";
27
36
  };
28
37
  declare function parse<T>(value: T, rule: ShortRule<keyof typeof names>): Rule<T>;
38
+ declare function requiredRule<T>(value: T, ..._params: string[]): Rule<T>;
29
39
  //#endregion
30
40
  //#region src/index.d.ts
31
41
  declare function validate<T extends object>(obj: T, checks: Partial<Record<NestedKeyOf<T>, (ShortRule<keyof typeof rules_d_exports["names"]> | Rule)[]>>): T;
42
+ declare function precognition<T extends object>(ctx: Context<T>, checks: Partial<Record<NestedKeyOf<T>, (ShortRule<keyof typeof rules_d_exports["names"]> | Rule)[]>>): T;
32
43
  //#endregion
33
- export { validate };
34
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvcnVsZXMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOltdLCJtYXBwaW5ncyI6Ijs7VUFFaUI7OztTQUdSOztLQUdHLDhCQUE4QixPQUFPO0tBRTVDLGlDQUNELG9DQUNFLFVBQVU7S0FPWCwrQkFDRCxzQkFDRSxVQUFVLFdBQ0o7VUFFRixjQUFBOzs7S0FJRSxpQkFBaUIsVUFBVSw2QkFDbkMsVUFBVSx5QkFFUixVQUFVLDBEQUdMLFdBQVcsTUFBTSxFQUFFLHlCQUNiLFdBQVcsS0FBSyxHQUFHLFNBQVMsWUFBWSxFQUFFLFVBQzdDLHNCQUNFLDRDQUVFLHdDQUNlLFlBQVk7Ozs7Y0NwQ2hDOzs7Ozs7Ozs7O2lCQVdHLGdCQUFnQixTQUFTLHVCQUF1QixTQUFTLEtBQUs7OztpQkNWOUQsZ0NBQ1QsV0FDRyxRQUFRLE9BQU8sWUFBWSxLQUFLLHVCQUF1Qiw0QkFBa0IsWUFDaEYifQ==
44
+ export { precognition, validate };
45
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvcnVsZXMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7VUFFaUI7OztTQUdSOztLQUdHLDhCQUE4QixPQUFPO0tBRTVDLGlDQUNELG9DQUNFLFVBQVU7S0FPWCwrQkFDRCxzQkFDRSxVQUFVLFdBQ0o7VUFFRixjQUFBOzs7S0FJRSxpQkFBaUIsVUFBVSw2QkFDbkMsVUFBVSx5QkFFUixVQUFVLDBEQUdMLFdBQVcsTUFBTSxFQUFFLHlCQUNiLFdBQVcsS0FBSyxHQUFHLFNBQVMsWUFBWSxFQUFFLFVBQzdDLHNCQUNFLDRDQUVFLHdDQUNlLFlBQVk7Ozs7Y0NwQ2hDOzs7Ozs7Ozs7Ozs7Ozs7O2lCQWlCRyxnQkFBZ0IsU0FBUyx1QkFBdUIsU0FBUyxLQUFLO2lCQXVLOUQsdUJBQXVCLDBCQUEwQixLQUFLOzs7aUJDdEx0RCxnQ0FDVCxXQUNHLFFBQVEsT0FBTyxZQUFZLEtBQUssdUJBQXVCLDRCQUFrQixZQUNoRjtpQkEyQ2Esb0NBQ1QsUUFBUSxZQUNMLFFBQVEsT0FBTyxZQUFZLEtBQUssdUJBQXVCLDRCQUFrQixZQUNoRiJ9
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { util } from "@aws-appsync/utils";
1
+ import { runtime, util } from "@aws-appsync/utils";
2
2
 
3
3
  //#region src/utils.ts
4
4
  function isArray(value) {
@@ -18,12 +18,30 @@ function setNestedValue(obj, path, value) {
18
18
  const parentObject = getNestedValue(obj, keys.join("."));
19
19
  if (typeof parentObject === "object" && !!parentObject) parentObject[lastKey] = value;
20
20
  }
21
+ function getHeader(name, ctx) {
22
+ return Object.entries(ctx.request.headers).reduce((prev, [key, value]) => typeof prev === "string" ? prev : key.toLowerCase() === name.toLowerCase() && typeof value === "string" ? value : null, null);
23
+ }
24
+ function isPrecognitiveRequest(ctx) {
25
+ return getHeader("precognition", ctx) === "true";
26
+ }
27
+ function precognitiveKeys(ctx) {
28
+ const keys = getHeader("Precognition-Validate-Only", ctx);
29
+ return keys ? keys.split(",").map((key) => key.trim()) : null;
30
+ }
31
+ function cleanString(value) {
32
+ let parsed = value.trim();
33
+ if (parsed === "") parsed = null;
34
+ return parsed;
35
+ }
21
36
 
22
37
  //#endregion
23
38
  //#region src/rules.ts
24
39
  function parse(value, rule) {
25
40
  const [ruleName, params] = rule.includes(":") ? rule.split(":", 2) : [rule, ""];
26
41
  switch (ruleName) {
42
+ case "required": return requiredRule(value);
43
+ case "nullable": return nullableRule(value);
44
+ case "sometimes": return sometimesRule(value);
27
45
  case "min": return minRule(value, ...params.split(","));
28
46
  case "max": return maxRule(value, ...params.split(", "));
29
47
  case "between": return betweenRule(value, ...params.split(", "));
@@ -43,14 +61,11 @@ function minRule(value, ...params) {
43
61
  const minValue = Number(params[0] ?? "0");
44
62
  const result = {
45
63
  check: false,
46
- message: `Value must be greater than or equal to ${minValue}`,
64
+ message: `:attribute must be greater than or equal to ${minValue}`,
47
65
  value
48
66
  };
49
67
  if (typeof value === "number") result.check = value >= minValue;
50
- if (typeof result.value === "string") {
51
- result.value = result.value.trim();
52
- result.check = result.value.length >= minValue;
53
- }
68
+ if (typeof result.value === "string") result.check = result.value.length >= minValue;
54
69
  if (isArray(value)) {
55
70
  result.check = value.length >= minValue;
56
71
  result.message = `Array must contain at least ${minValue} elements`;
@@ -61,12 +76,11 @@ function maxRule(value, ...params) {
61
76
  const maxValue = Number(params[0] ?? "0");
62
77
  const result = {
63
78
  check: false,
64
- message: `Value must be less than or equal to ${maxValue}`,
79
+ message: `:attribute must be less than or equal to ${maxValue}`,
65
80
  value
66
81
  };
67
82
  if (typeof value === "number") result.check = value <= maxValue;
68
83
  if (typeof result.value === "string") {
69
- result.value = result.value.trim();
70
84
  result.check = result.value.length <= maxValue;
71
85
  result.message = `String must contain at most ${maxValue} characters`;
72
86
  }
@@ -81,12 +95,11 @@ function betweenRule(value, ...params) {
81
95
  const maxValue = Number(params[1] ?? "0");
82
96
  const result = {
83
97
  check: false,
84
- message: `Value must be between ${minValue} and ${maxValue}`,
98
+ message: `:attribute must be between ${minValue} and ${maxValue}`,
85
99
  value
86
100
  };
87
101
  if (typeof value === "number") result.check = value >= minValue && value <= maxValue;
88
102
  if (typeof result.value === "string") {
89
- result.value = result.value.trim();
90
103
  result.check = result.value.length >= minValue && result.value.length <= maxValue;
91
104
  result.message = `String must contain between ${minValue} and ${maxValue} characters`;
92
105
  }
@@ -99,31 +112,25 @@ function betweenRule(value, ...params) {
99
112
  function emailRule(value) {
100
113
  const result = {
101
114
  check: false,
102
- message: "Value must be a valid email address",
115
+ message: ":attribute must be a valid email address",
103
116
  value
104
117
  };
105
- if (typeof value === "string") {
106
- result.value = value.trim();
107
- result.check = util.matches("^[^s@]+@[^s@]+.[^s@]+$", result.value);
108
- }
118
+ if (typeof value === "string") result.check = util.matches("^[^s@]+@[^s@]+.[^s@]+$", result.value);
109
119
  return result;
110
120
  }
111
121
  function urlRule(value) {
112
122
  const result = {
113
123
  check: false,
114
- message: "Value must be a valid URL",
124
+ message: ":attribute must be a valid URL",
115
125
  value
116
126
  };
117
- if (typeof value === "string") {
118
- result.value = value.trim();
119
- result.check = util.matches("^(http|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?$", result.value);
120
- }
127
+ if (typeof value === "string") result.check = util.matches("^(http|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?$", result.value);
121
128
  return result;
122
129
  }
123
130
  function uuidRule(value) {
124
131
  const result = {
125
132
  check: false,
126
- message: "Value must be a valid UUID",
133
+ message: ":attribute must be a valid UUID",
127
134
  value
128
135
  };
129
136
  if (typeof result.value === "string") result.check = util.matches("^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$", value);
@@ -133,7 +140,7 @@ function regexRule(value, ...params) {
133
140
  const regex = params[0] ?? "";
134
141
  const result = {
135
142
  check: false,
136
- message: "Value must match the specified regular expression",
143
+ message: ":attribute must match the specified regular expression",
137
144
  value
138
145
  };
139
146
  if (typeof result.value === "string") {
@@ -145,16 +152,41 @@ function regexRule(value, ...params) {
145
152
  function inRule(value, ...params) {
146
153
  const result = {
147
154
  check: false,
148
- message: "Value must be one of the specified values",
155
+ message: ":attribute must be one of the specified values",
149
156
  value
150
157
  };
151
- if (typeof result.value === "string") {
152
- result.value = result.value.trim();
153
- result.check = params.includes(result.value);
154
- }
158
+ if (typeof result.value === "string") result.check = params.includes(result.value);
155
159
  if (typeof value === "number") result.check = params.map(Number).includes(value);
156
160
  return result;
157
161
  }
162
+ function requiredRule(value, ..._params) {
163
+ const result = {
164
+ check: true,
165
+ message: ":attribute is required",
166
+ value
167
+ };
168
+ if (typeof result.value === "string") result.check = result.value.length > 0;
169
+ if (isArray(result.value)) result.check = result.value.length > 0;
170
+ if (typeof result.value === "number") result.check = true;
171
+ if (result.check === false) result.message = ":attribute is required";
172
+ return result;
173
+ }
174
+ function nullableRule(value, ..._params) {
175
+ return {
176
+ check: true,
177
+ message: "",
178
+ value
179
+ };
180
+ }
181
+ function sometimesRule(value, ..._params) {
182
+ const result = {
183
+ check: true,
184
+ message: "",
185
+ value
186
+ };
187
+ if (typeof result.value === "undefined") return result;
188
+ return requiredRule(value, ..._params);
189
+ }
158
190
 
159
191
  //#endregion
160
192
  //#region src/index.ts
@@ -162,9 +194,16 @@ function validate(obj, checks) {
162
194
  let hasErrors = false;
163
195
  const errorMessages = [];
164
196
  Object.keys(checks).forEach((path) => {
165
- const value = getNestedValue(obj, path);
166
- if (typeof value === "string") setNestedValue(obj, path, value.trim());
197
+ let value = getNestedValue(obj, path);
198
+ if (typeof value === "string") {
199
+ value = cleanString(value);
200
+ setNestedValue(obj, path, value);
201
+ }
202
+ let skip = false;
167
203
  checks[path]?.forEach((rule) => {
204
+ if (skip) return;
205
+ if (rule === "nullable" && value === null) skip = true;
206
+ if (rule === "sometimes" && typeof value === "undefined") skip = true;
168
207
  const result = typeof rule === "string" ? parse(value, rule) : { ...rule };
169
208
  if (result.check) return;
170
209
  hasErrors = true;
@@ -173,12 +212,31 @@ function validate(obj, checks) {
173
212
  path,
174
213
  value
175
214
  });
215
+ if (rule === "required") skip = true;
176
216
  });
177
217
  });
178
218
  if (hasErrors) util.error(errorMessages[0], "ValidationError");
179
219
  return obj;
180
220
  }
221
+ function precognition(ctx, checks) {
222
+ if (!isPrecognitiveRequest(ctx)) return validate(ctx.args, checks);
223
+ const validationKeys = precognitiveKeys(ctx);
224
+ util.http.addResponseHeader("Precognition", "true");
225
+ if (!validationKeys) {
226
+ validate(ctx.args, checks);
227
+ util.http.addResponseHeader("Precognition-Success", "true");
228
+ runtime.earlyReturn(null);
229
+ }
230
+ util.http.addResponseHeader("Precognition-Validate-Only", validationKeys.join(","));
231
+ const precognitionChecks = {};
232
+ validationKeys.forEach((key) => {
233
+ precognitionChecks[key] = checks[key];
234
+ });
235
+ validate(ctx.args, precognitionChecks);
236
+ util.http.addResponseHeader("Precognition-Success", "true");
237
+ runtime.earlyReturn(null);
238
+ }
181
239
 
182
240
  //#endregion
183
- export { validate };
184
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJyZXN1bHQ6IFJ1bGU8VD4iLCJlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSIsInJ1bGVzLnBhcnNlIl0sInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL3J1bGVzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTmVzdGVkS2V5T2YgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB1bmtub3duW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhIXZhbHVlICYmIE9iamVjdC5oYXNPd24odmFsdWUsICdsZW5ndGgnKSkge1xuICAgIHJldHVybiB0eXBlb2YgKHZhbHVlIGFzIHVua25vd25bXSkubGVuZ3RoID09PSAnbnVtYmVyJ1xuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWU8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBULCBwYXRoOiBOZXN0ZWRLZXlPZjxUPik6IGFueSB7XG4gIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlPHVua25vd24+KChjdXJyZW50LCBrZXkpID0+IHV0aWwubWF0Y2hlcygnXlxcZCskJywga2V5KVxuICAgID8gKGN1cnJlbnQgYXMgdW5rbm93bltdKVtOdW1iZXIoa2V5KV1cbiAgICA6IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLCBvYmopXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRWYWx1ZTxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQsIHBhdGg6IE5lc3RlZEtleU9mPFQ+LCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgIG9ialtrZXlzWzBdIGFzIGtleW9mIHR5cGVvZiBvYmpdID0gdmFsdWUgYXMgYW55XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgbGFzdEtleSA9IGtleXMucG9wKCkgYXMgc3RyaW5nXG4gIGNvbnN0IHBhcmVudE9iamVjdCA9IGdldE5lc3RlZFZhbHVlKG9iaiwga2V5cy5qb2luKCcuJykgYXMgTmVzdGVkS2V5T2Y8VD4pXG4gIGlmICh0eXBlb2YgcGFyZW50T2JqZWN0ID09PSAnb2JqZWN0JyAmJiAhIXBhcmVudE9iamVjdCkge1xuICAgIHBhcmVudE9iamVjdFtsYXN0S2V5XSA9IHZhbHVlXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUnVsZSwgU2hvcnRSdWxlIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnLi91dGlscydcblxuZXhwb3J0IGNvbnN0IG5hbWVzID0ge1xuICBtaW46ICdtaW4nLFxuICBtYXg6ICdtYXgnLFxuICBiZXR3ZWVuOiAnYmV0d2VlbicsXG4gIGVtYWlsOiAnZW1haWwnLFxuICB1cmw6ICd1cmwnLFxuICB1dWlkOiAndXVpZCcsXG4gIHJlZ2V4OiAncmVnZXgnLFxuICBpbjogJ2luJyxcbn0gYXMgY29uc3RcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlPFQ+KHZhbHVlOiBULCBydWxlOiBTaG9ydFJ1bGU8a2V5b2YgdHlwZW9mIG5hbWVzPik6IFJ1bGU8VD4ge1xuICBjb25zdCBbcnVsZU5hbWUsIHBhcmFtc10gPSBydWxlLmluY2x1ZGVzKCc6JykgPyBydWxlLnNwbGl0KCc6JywgMikgOiBbcnVsZSwgJyddXG5cbiAgc3dpdGNoIChydWxlTmFtZSBhcyBrZXlvZiB0eXBlb2YgbmFtZXMpIHtcbiAgICBjYXNlICdtaW4nOlxuICAgICAgcmV0dXJuIG1pblJ1bGUodmFsdWUsIC4uLnBhcmFtcy5zcGxpdCgnLCcpKVxuICAgIGNhc2UgJ21heCc6XG4gICAgICByZXR1cm4gbWF4UnVsZSh2YWx1ZSwgLi4ucGFyYW1zLnNwbGl0KCcsICcpKVxuICAgIGNhc2UgJ2JldHdlZW4nOlxuICAgICAgcmV0dXJuIGJldHdlZW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMuc3BsaXQoJywgJykpXG4gICAgY2FzZSAnZW1haWwnOlxuICAgICAgcmV0dXJuIGVtYWlsUnVsZSh2YWx1ZSlcbiAgICBjYXNlICd1cmwnOlxuICAgICAgcmV0dXJuIHVybFJ1bGUodmFsdWUpXG4gICAgY2FzZSAndXVpZCc6XG4gICAgICByZXR1cm4gdXVpZFJ1bGUodmFsdWUpXG4gICAgY2FzZSAncmVnZXgnOlxuICAgICAgcmV0dXJuIHJlZ2V4UnVsZSh2YWx1ZSwgcGFyYW1zKVxuICAgIGNhc2UgJ2luJzpcbiAgICAgIHJldHVybiBpblJ1bGUodmFsdWUsIC4uLnBhcmFtcy5zcGxpdCgnLCAnKSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHsgY2hlY2s6IGZhbHNlLCBtZXNzYWdlOiBgVW5rbm93biBydWxlICR7cnVsZU5hbWV9YCwgdmFsdWUgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1pblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgbWluVmFsdWUgPSBOdW1iZXIocGFyYW1zWzBdID8/ICcwJylcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHttaW5WYWx1ZX1gLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUgPj0gbWluVmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQudmFsdWUgPSByZXN1bHQudmFsdWUudHJpbSgpIGFzIFRcbiAgICByZXN1bHQuY2hlY2sgPSAocmVzdWx0LnZhbHVlIGFzIHN0cmluZykubGVuZ3RoID49IG1pblZhbHVlXG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUubGVuZ3RoID49IG1pblZhbHVlXG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBgQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0ICR7bWluVmFsdWV9IGVsZW1lbnRzYFxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gbWF4UnVsZTxUPih2YWx1ZTogVCwgLi4ucGFyYW1zOiBzdHJpbmdbXSk6IFJ1bGU8VD4ge1xuICBjb25zdCBtYXhWYWx1ZSA9IE51bWJlcihwYXJhbXNbMF0gPz8gJzAnKVxuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6IGBWYWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAke21heFZhbHVlfWAsXG4gICAgdmFsdWUsXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlIDw9IG1heFZhbHVlXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LnZhbHVlID0gcmVzdWx0LnZhbHVlLnRyaW0oKSBhcyBUXG4gICAgcmVzdWx0LmNoZWNrID0gKHJlc3VsdC52YWx1ZSBhcyBzdHJpbmcpLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYFN0cmluZyBtdXN0IGNvbnRhaW4gYXQgbW9zdCAke21heFZhbHVlfSBjaGFyYWN0ZXJzYFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiBhdCBtb3N0ICR7bWF4VmFsdWV9IGVsZW1lbnRzYFxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gYmV0d2VlblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgbWluVmFsdWUgPSBOdW1iZXIocGFyYW1zWzBdID8/ICcwJylcbiAgY29uc3QgbWF4VmFsdWUgPSBOdW1iZXIocGFyYW1zWzFdID8/ICcwJylcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgVmFsdWUgbXVzdCBiZSBiZXR3ZWVuICR7bWluVmFsdWV9IGFuZCAke21heFZhbHVlfWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA+PSBtaW5WYWx1ZSAmJiB2YWx1ZSA8PSBtYXhWYWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC52YWx1ZSA9IHJlc3VsdC52YWx1ZS50cmltKCkgYXMgVFxuICAgIHJlc3VsdC5jaGVjayA9IChyZXN1bHQudmFsdWUgYXMgc3RyaW5nKS5sZW5ndGggPj0gbWluVmFsdWUgJiYgKHJlc3VsdC52YWx1ZSBhcyBzdHJpbmcpLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYFN0cmluZyBtdXN0IGNvbnRhaW4gYmV0d2VlbiAke21pblZhbHVlfSBhbmQgJHttYXhWYWx1ZX0gY2hhcmFjdGVyc2BcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZS5sZW5ndGggPj0gbWluVmFsdWUgJiYgdmFsdWUubGVuZ3RoIDw9IG1heFZhbHVlXG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBgQXJyYXkgbXVzdCBjb250YWluIGJldHdlZW4gJHttaW5WYWx1ZX0gYW5kICR7bWF4VmFsdWV9IGVsZW1lbnRzYFxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gZW1haWxSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJ1ZhbHVlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzJyxcbiAgICB2YWx1ZSxcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LnZhbHVlID0gdmFsdWUudHJpbSgpIGFzIFRcbiAgICByZXN1bHQuY2hlY2sgPSB1dGlsLm1hdGNoZXMoJ15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJCcsIHJlc3VsdC52YWx1ZSBhcyBzdHJpbmcpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiB1cmxSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJ1ZhbHVlIG11c3QgYmUgYSB2YWxpZCBVUkwnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LnZhbHVlID0gdmFsdWUudHJpbSgpIGFzIFRcbiAgICByZXN1bHQuY2hlY2sgPSB1dGlsLm1hdGNoZXMoXG4gICAgICAnXihodHRwfGh0dHBzKTpcXFxcL1xcXFwvW1xcXFx3XFxcXC1fXSsoXFxcXC5bXFxcXHdcXFxcLV9dKykrKFtcXFxcd1xcXFwtXFxcXC4sQD9ePSUmOi9+XFxcXCsjXSpbXFxcXHdcXFxcLVxcXFxAP149JSYvflxcXFwrI10pPyQnLFxuICAgICAgcmVzdWx0LnZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiB1dWlkUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICdWYWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVVJRCcsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdXRpbC5tYXRjaGVzKFxuICAgICAgJ15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfSQnLFxuICAgICAgdmFsdWUgYXMgc3RyaW5nLFxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHJlZ2V4UnVsZTxUPih2YWx1ZTogVCwgLi4ucGFyYW1zOiBzdHJpbmdbXSk6IFJ1bGU8VD4ge1xuICBjb25zdCByZWdleCA9IHBhcmFtc1swXSA/PyAnJ1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICdWYWx1ZSBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQudmFsdWUgPSByZXN1bHQudmFsdWUudHJpbSgpIGFzIFRcbiAgICByZXN1bHQuY2hlY2sgPSB1dGlsLm1hdGNoZXMocmVnZXgsIHJlc3VsdC52YWx1ZSBhcyBzdHJpbmcpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBpblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnVmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZXMnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC52YWx1ZSA9IHJlc3VsdC52YWx1ZS50cmltKCkgYXMgVFxuICAgIHJlc3VsdC5jaGVjayA9IHBhcmFtcy5pbmNsdWRlcyhyZXN1bHQudmFsdWUgYXMgc3RyaW5nKVxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcGFyYW1zLm1hcChOdW1iZXIpLmluY2x1ZGVzKHZhbHVlKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cbiIsImltcG9ydCB0eXBlIHsgTmVzdGVkS2V5T2YsIFJ1bGUsIFNob3J0UnVsZSB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGF3cy1hcHBzeW5jL3V0aWxzJ1xuaW1wb3J0ICogYXMgcnVsZXMgZnJvbSAnLi9ydWxlcydcbmltcG9ydCB7IGdldE5lc3RlZFZhbHVlLCBzZXROZXN0ZWRWYWx1ZSB9IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgb2JqOiBULFxuICBjaGVja3M6IFBhcnRpYWw8UmVjb3JkPE5lc3RlZEtleU9mPFQ+LCAoU2hvcnRSdWxlPGtleW9mIHR5cGVvZiBydWxlc1snbmFtZXMnXT4gfCBSdWxlKVtdPj4sXG4pOiBUIHtcbiAgbGV0IGhhc0Vycm9ycyA9IGZhbHNlXG4gIGNvbnN0IGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdID0gW11cblxuICBPYmplY3Qua2V5cyhjaGVja3MpLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldE5lc3RlZFZhbHVlKG9iaiwgcGF0aCBhcyBOZXN0ZWRLZXlPZjxUPilcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgc2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+LCB2YWx1ZS50cmltKCkpXG4gICAgfVxuXG4gICAgY2hlY2tzW3BhdGggYXMgTmVzdGVkS2V5T2Y8VD5dPy5mb3JFYWNoKChydWxlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSAodHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnKSA/IHJ1bGVzLnBhcnNlKHZhbHVlLCBydWxlKSA6IHsgLi4ucnVsZSB9XG4gICAgICBpZiAocmVzdWx0LmNoZWNrKVxuICAgICAgICByZXR1cm5cbiAgICAgIGhhc0Vycm9ycyA9IHRydWVcbiAgICAgIGVycm9yTWVzc2FnZXMucHVzaChyZXN1bHQubWVzc2FnZSlcbiAgICAgIHV0aWwuYXBwZW5kRXJyb3IocmVzdWx0Lm1lc3NhZ2UsICdWYWxpZGF0aW9uRXJyb3InLCBudWxsLCB7IHBhdGgsIHZhbHVlIH0pXG4gICAgfSlcbiAgfSlcblxuICBpZiAoaGFzRXJyb3JzKSB7XG4gICAgdXRpbC5lcnJvcihlcnJvck1lc3NhZ2VzWzBdLCAnVmFsaWRhdGlvbkVycm9yJylcbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBT0EsU0FBZ0IsUUFBUSxPQUFvQztBQUMxRCxLQUFJLE9BQU8sVUFBVSxZQUFZLENBQUMsQ0FBQyxTQUFTLE9BQU8sT0FBTyxPQUFPLFNBQVMsQ0FDeEUsUUFBTyxPQUFRLE1BQW9CLFdBQVc7QUFFaEQsUUFBTzs7QUFHVCxTQUFnQixlQUFpQyxLQUFRLE1BQTJCO0FBQ2xGLFFBQU8sS0FBSyxNQUFNLElBQUksQ0FBQyxRQUFpQixTQUFTLFFBQVEsS0FBSyxRQUFRLFFBQVMsSUFBSSxHQUM5RSxRQUFzQixPQUFPLElBQUksSUFD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
241
+ export { precognition, validate };
242
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJwYXJzZWQ6IHN0cmluZyB8IG51bGwiLCJyZXN1bHQ6IFJ1bGU8VD4iLCJlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSIsInJ1bGVzLnBhcnNlIl0sInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL3J1bGVzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCB0eXBlIHsgTmVzdGVkS2V5T2YgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB1bmtub3duW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhIXZhbHVlICYmIE9iamVjdC5oYXNPd24odmFsdWUsICdsZW5ndGgnKSkge1xuICAgIHJldHVybiB0eXBlb2YgKHZhbHVlIGFzIHVua25vd25bXSkubGVuZ3RoID09PSAnbnVtYmVyJ1xuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWU8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBULCBwYXRoOiBOZXN0ZWRLZXlPZjxUPik6IGFueSB7XG4gIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlPHVua25vd24+KChjdXJyZW50LCBrZXkpID0+IHV0aWwubWF0Y2hlcygnXlxcZCskJywga2V5KVxuICAgID8gKGN1cnJlbnQgYXMgdW5rbm93bltdKVtOdW1iZXIoa2V5KV1cbiAgICA6IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLCBvYmopXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRWYWx1ZTxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQsIHBhdGg6IE5lc3RlZEtleU9mPFQ+LCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgIG9ialtrZXlzWzBdIGFzIGtleW9mIHR5cGVvZiBvYmpdID0gdmFsdWUgYXMgYW55XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgbGFzdEtleSA9IGtleXMucG9wKCkgYXMgc3RyaW5nXG4gIGNvbnN0IHBhcmVudE9iamVjdCA9IGdldE5lc3RlZFZhbHVlKG9iaiwga2V5cy5qb2luKCcuJykgYXMgTmVzdGVkS2V5T2Y8VD4pXG4gIGlmICh0eXBlb2YgcGFyZW50T2JqZWN0ID09PSAnb2JqZWN0JyAmJiAhIXBhcmVudE9iamVjdCkge1xuICAgIHBhcmVudE9iamVjdFtsYXN0S2V5XSA9IHZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRlcihuYW1lOiBzdHJpbmcsIGN0eDogQ29udGV4dCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY3R4LnJlcXVlc3QuaGVhZGVycylcbiAgICAucmVkdWNlKChwcmV2LCBba2V5LCB2YWx1ZV0pID0+IHR5cGVvZiBwcmV2ID09PSAnc3RyaW5nJ1xuICAgICAgPyBwcmV2XG4gICAgICA6IChrZXkudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgOiBudWxsKSwgbnVsbCBhcyBzdHJpbmcgfCBudWxsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmVjb2duaXRpdmVSZXF1ZXN0KGN0eDogQ29udGV4dCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0SGVhZGVyKCdwcmVjb2duaXRpb24nLCBjdHgpID09PSAndHJ1ZSdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZWNvZ25pdGl2ZUtleXMoY3R4OiBDb250ZXh0KTogc3RyaW5nW10gfCBudWxsIHtcbiAgY29uc3Qga2V5cyA9IGdldEhlYWRlcignUHJlY29nbml0aW9uLVZhbGlkYXRlLU9ubHknLCBjdHgpXG4gIHJldHVybiBrZXlzID8ga2V5cy5zcGxpdCgnLCcpLm1hcChrZXkgPT4ga2V5LnRyaW0oKSkgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblN0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGxldCBwYXJzZWQ6IHN0cmluZyB8IG51bGwgPSB2YWx1ZS50cmltKClcbiAgaWYgKHBhcnNlZCA9PT0gJycpXG4gICAgcGFyc2VkID0gbnVsbFxuICByZXR1cm4gcGFyc2VkXG59XG4iLCJpbXBvcnQgdHlwZSB7IFJ1bGUsIFNob3J0UnVsZSB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGF3cy1hcHBzeW5jL3V0aWxzJ1xuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBuYW1lcyA9IHtcbiAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gIG51bGxhYmxlOiAnbnVsbGFibGUnLFxuICBzb21ldGltZXM6ICdzb21ldGltZXMnLFxuICBtaW46ICdtaW4nLFxuICBtYXg6ICdtYXgnLFxuICBiZXR3ZWVuOiAnYmV0d2VlbicsXG4gIGVtYWlsOiAnZW1haWwnLFxuICB1cmw6ICd1cmwnLFxuICB1dWlkOiAndXVpZCcsXG4gIHJlZ2V4OiAncmVnZXgnLFxuICBpbjogJ2luJyxcbiAgbm90SW46ICdub3RJbicsXG4gIGJlZm9yZTogJ2JlZm9yZScsXG4gIGFmdGVyOiAnYWZ0ZXInLFxufSBhcyBjb25zdFxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2U8VD4odmFsdWU6IFQsIHJ1bGU6IFNob3J0UnVsZTxrZXlvZiB0eXBlb2YgbmFtZXM+KTogUnVsZTxUPiB7XG4gIGNvbnN0IFtydWxlTmFtZSwgcGFyYW1zXSA9IHJ1bGUuaW5jbHVkZXMoJzonKSA/IHJ1bGUuc3BsaXQoJzonLCAyKSA6IFtydWxlLCAnJ11cblxuICBzd2l0Y2ggKHJ1bGVOYW1lIGFzIGtleW9mIHR5cGVvZiBuYW1lcykge1xuICAgIGNhc2UgJ3JlcXVpcmVkJzpcbiAgICAgIHJldHVybiByZXF1aXJlZFJ1bGUodmFsdWUpXG4gICAgY2FzZSAnbnVsbGFibGUnOlxuICAgICAgcmV0dXJuIG51bGxhYmxlUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdzb21ldGltZXMnOlxuICAgICAgcmV0dXJuIHNvbWV0aW1lc1J1bGUodmFsdWUpXG4gICAgY2FzZSAnbWluJzpcbiAgICAgIHJldHVybiBtaW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMuc3BsaXQoJywnKSlcbiAgICBjYXNlICdtYXgnOlxuICAgICAgcmV0dXJuIG1heFJ1bGUodmFsdWUsIC4uLnBhcmFtcy5zcGxpdCgnLCAnKSlcbiAgICBjYXNlICdiZXR3ZWVuJzpcbiAgICAgIHJldHVybiBiZXR3ZWVuUnVsZSh2YWx1ZSwgLi4ucGFyYW1zLnNwbGl0KCcsICcpKVxuICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgIHJldHVybiBlbWFpbFJ1bGUodmFsdWUpXG4gICAgY2FzZSAndXJsJzpcbiAgICAgIHJldHVybiB1cmxSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3V1aWQnOlxuICAgICAgcmV0dXJuIHV1aWRSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3JlZ2V4JzpcbiAgICAgIHJldHVybiByZWdleFJ1bGUodmFsdWUsIHBhcmFtcylcbiAgICBjYXNlICdpbic6XG4gICAgICByZXR1cm4gaW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMuc3BsaXQoJywgJykpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IGNoZWNrOiBmYWxzZSwgbWVzc2FnZTogYFVua25vd24gcnVsZSAke3J1bGVOYW1lfWAsIHZhbHVlIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtaW5SdWxlPFQ+KHZhbHVlOiBULCAuLi5wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IG1pblZhbHVlID0gTnVtYmVyKHBhcmFtc1swXSA/PyAnMCcpXG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHttaW5WYWx1ZX1gLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUgPj0gbWluVmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQuY2hlY2sgPSAocmVzdWx0LnZhbHVlKS5sZW5ndGggPj0gbWluVmFsdWVcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZS5sZW5ndGggPj0gbWluVmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJHttaW5WYWx1ZX0gZWxlbWVudHNgXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBtYXhSdWxlPFQ+KHZhbHVlOiBULCAuLi5wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IG1heFZhbHVlID0gTnVtYmVyKHBhcmFtc1swXSA/PyAnMCcpXG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHttYXhWYWx1ZX1gLFxuICAgIHZhbHVlLFxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA8PSBtYXhWYWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHJlc3VsdC52YWx1ZS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBTdHJpbmcgbXVzdCBjb250YWluIGF0IG1vc3QgJHttYXhWYWx1ZX0gY2hhcmFjdGVyc2BcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gYXQgbW9zdCAke21heFZhbHVlfSBlbGVtZW50c2BcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGJldHdlZW5SdWxlPFQ+KHZhbHVlOiBULCAuLi5wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IG1pblZhbHVlID0gTnVtYmVyKHBhcmFtc1swXSA/PyAnMCcpXG4gIGNvbnN0IG1heFZhbHVlID0gTnVtYmVyKHBhcmFtc1sxXSA/PyAnMCcpXG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBiZXR3ZWVuICR7bWluVmFsdWV9IGFuZCAke21heFZhbHVlfWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA+PSBtaW5WYWx1ZSAmJiB2YWx1ZSA8PSBtYXhWYWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHJlc3VsdC52YWx1ZS5sZW5ndGggPj0gbWluVmFsdWUgJiYgKHJlc3VsdC52YWx1ZSkubGVuZ3RoIDw9IG1heFZhbHVlXG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiBiZXR3ZWVuICR7bWluVmFsdWV9IGFuZCAke21heFZhbHVlfSBjaGFyYWN0ZXJzYFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA+PSBtaW5WYWx1ZSAmJiB2YWx1ZS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gYmV0d2VlbiAke21pblZhbHVlfSBhbmQgJHttYXhWYWx1ZX0gZWxlbWVudHNgXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBlbWFpbFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcycsXG4gICAgdmFsdWUsXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcygnXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskJywgcmVzdWx0LnZhbHVlIGFzIHN0cmluZylcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHVybFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgdmFsaWQgVVJMJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeKGh0dHB8aHR0cHMpOlxcXFwvXFxcXC9bXFxcXHdcXFxcLV9dKyhcXFxcLltcXFxcd1xcXFwtX10rKSsoW1xcXFx3XFxcXC1cXFxcLixAP149JSY6L35cXFxcKyNdKltcXFxcd1xcXFwtXFxcXEA/Xj0lJi9+XFxcXCsjXSk/JCcsXG4gICAgICByZXN1bHQudmFsdWUgYXMgc3RyaW5nLFxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHV1aWRSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgbXVzdCBiZSBhIHZhbGlkIFVVSUQnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kJyxcbiAgICAgIHZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiByZWdleFJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVnZXggPSBwYXJhbXNbMF0gPz8gJydcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQudmFsdWUgPSByZXN1bHQudmFsdWUudHJpbSgpIGFzIFRcbiAgICByZXN1bHQuY2hlY2sgPSB1dGlsLm1hdGNoZXMocmVnZXgsIHJlc3VsdC52YWx1ZSBhcyBzdHJpbmcpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBpblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcycsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcGFyYW1zLmluY2x1ZGVzKHJlc3VsdC52YWx1ZSlcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHBhcmFtcy5tYXAoTnVtYmVyKS5pbmNsdWRlcyh2YWx1ZSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZFJ1bGU8VD4odmFsdWU6IFQsIC4uLl9wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBpcyByZXF1aXJlZCcsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcmVzdWx0LnZhbHVlLmxlbmd0aCA+IDBcbiAgfVxuICBpZiAoaXNBcnJheShyZXN1bHQudmFsdWUpKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcmVzdWx0LnZhbHVlLmxlbmd0aCA+IDBcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB0cnVlXG4gIH1cbiAgaWYgKHJlc3VsdC5jaGVjayA9PT0gZmFsc2UpIHtcbiAgICByZXN1bHQubWVzc2FnZSA9ICc6YXR0cmlidXRlIGlzIHJlcXVpcmVkJ1xuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gbnVsbGFibGVSdWxlPFQ+KHZhbHVlOiBULCAuLi5fcGFyYW1zOiBzdHJpbmdbXSk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IHRydWUsXG4gICAgbWVzc2FnZTogJycsXG4gICAgdmFsdWUsXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBzb21ldGltZXNSdWxlPFQ+KHZhbHVlOiBULCAuLi5fcGFyYW1zOiBzdHJpbmdbXSk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IHRydWUsXG4gICAgbWVzc2FnZTogJycsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG4gIHJldHVybiByZXF1aXJlZFJ1bGUodmFsdWUsIC4uLl9wYXJhbXMpXG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnXG5pbXBvcnQgdHlwZSB7IE5lc3RlZEtleU9mLCBSdWxlLCBTaG9ydFJ1bGUgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgcnVudGltZSwgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCAqIGFzIHJ1bGVzIGZyb20gJy4vcnVsZXMnXG5pbXBvcnQgeyBjbGVhblN0cmluZywgZ2V0TmVzdGVkVmFsdWUsIGlzUHJlY29nbml0aXZlUmVxdWVzdCwgcHJlY29nbml0aXZlS2V5cywgc2V0TmVzdGVkVmFsdWUgfSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGU8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbiAgY2hlY2tzOiBQYXJ0aWFsPFJlY29yZDxOZXN0ZWRLZXlPZjxUPiwgKFNob3J0UnVsZTxrZXlvZiB0eXBlb2YgcnVsZXNbJ25hbWVzJ10+IHwgUnVsZSlbXT4+LFxuKTogVCB7XG4gIGxldCBoYXNFcnJvcnMgPSBmYWxzZVxuICBjb25zdCBlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdXG5cbiAgT2JqZWN0LmtleXMoY2hlY2tzKS5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+KVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IGNsZWFuU3RyaW5nKHZhbHVlKVxuICAgICAgc2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBsZXQgc2tpcCA9IGZhbHNlXG4gICAgY2hlY2tzW3BhdGggYXMgTmVzdGVkS2V5T2Y8VD5dPy5mb3JFYWNoKChydWxlKSA9PiB7XG4gICAgICBpZiAoc2tpcCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHJ1bGUgPT09ICdudWxsYWJsZScgJiYgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgc2tpcCA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChydWxlID09PSAnc29tZXRpbWVzJyAmJiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNraXAgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9ICh0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZycpID8gcnVsZXMucGFyc2UodmFsdWUsIHJ1bGUpIDogeyAuLi5ydWxlIH1cbiAgICAgIGlmIChyZXN1bHQuY2hlY2spXG4gICAgICAgIHJldHVyblxuICAgICAgaGFzRXJyb3JzID0gdHJ1ZVxuICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKHJlc3VsdC5tZXNzYWdlKVxuICAgICAgdXRpbC5hcHBlbmRFcnJvcihyZXN1bHQubWVzc2FnZSwgJ1ZhbGlkYXRpb25FcnJvcicsIG51bGwsIHsgcGF0aCwgdmFsdWUgfSlcbiAgICAgIGlmIChydWxlID09PSAncmVxdWlyZWQnKSB7XG4gICAgICAgIHNraXAgPSB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfSlcblxuICBpZiAoaGFzRXJyb3JzKSB7XG4gICAgdXRpbC5lcnJvcihlcnJvck1lc3NhZ2VzWzBdLCAnVmFsaWRhdGlvbkVycm9yJylcbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZWNvZ25pdGlvbjxUIGV4dGVuZHMgb2JqZWN0PihcbiAgY3R4OiBDb250ZXh0PFQ+LFxuICBjaGVja3M6IFBhcnRpYWw8UmVjb3JkPE5lc3RlZEtleU9mPFQ+LCAoU2hvcnRSdWxlPGtleW9mIHR5cGVvZiBydWxlc1snbmFtZXMnXT4gfCBSdWxlKVtdPj4sXG4pOiBUIHtcbiAgaWYgKCFpc1ByZWNvZ25pdGl2ZVJlcXVlc3QoY3R4KSkge1xuICAgIHJldHVybiB2YWxpZGF0ZShjdHguYXJncywgY2hlY2tzKVxuICB9XG4gIGNvbnN0IHZhbGlkYXRpb25LZXlzID0gcHJlY29nbml0aXZlS2V5cyhjdHgpXG4gIHV0aWwuaHR0cC5hZGRSZXNwb25zZUhlYWRlcignUHJlY29nbml0aW9uJywgJ3RydWUnKVxuXG4gIGlmICghdmFsaWRhdGlvbktleXMpIHtcbiAgICB2YWxpZGF0ZShjdHguYXJncywgY2hlY2tzKVxuICAgIHV0aWwuaHR0cC5hZGRSZXNwb25zZUhlYWRlcignUHJlY29nbml0aW9uLVN1Y2Nlc3MnLCAndHJ1ZScpXG4gICAgcnVudGltZS5lYXJseVJldHVybihudWxsKVxuICB9XG5cbiAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24tVmFsaWRhdGUtT25seScsIHZhbGlkYXRpb25LZXlzLmpvaW4oJywnKSlcbiAgY29uc3QgcHJlY29nbml0aW9uQ2hlY2tzID0ge30gYXMgUGFydGlhbDx0eXBlb2YgY2hlY2tzPlxuICB2YWxpZGF0aW9uS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBwcmVjb2duaXRpb25DaGVja3Nba2V5IGFzIE5lc3RlZEtleU9mPFQ+XSA9IGNoZWNrc1trZXkgYXMgTmVzdGVkS2V5T2Y8VD5dXG4gIH0pXG5cbiAgdmFsaWRhdGUoY3R4LmFyZ3MsIHByZWNvZ25pdGlvbkNoZWNrcylcbiAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24tU3VjY2VzcycsICd0cnVlJylcbiAgcnVudGltZS5lYXJseVJldHVybihudWxsKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUFRQSxTQUFnQixRQUFRLE9BQW9DO0FBQzFELEtBQUksT0FBTyxVQUFVLFlBQVksQ0FBQyxDQUFDLFNBQVMsT0FBTyxPQUFPLE9BQU8sU0FBUyxDQUN4RSxRQUFPLE9BQVEsTUFBb0IsV0FBVztBQUVoRCxRQUFPOztBQUdULFNBQWdCLGVBQWlDLEtBQVEsTUFBMkI7QUFDbEYsUUFBTyxLQUFLLE1BQU0sSUFBSSxDQUFDLFFBQWlCLFNBQVMsUUFBUSxLQUFLLFFBQVEsUUFBUyxJQUFJLEdBQzlFLFFBQXNCLE9BQU8sSUFBSSxJQUNqQyxRQUFvQyxNQUFNLElBQUk7O0FBR3JELFNBQWdCLGVBQWlDLEtBQVEsTUFBc0IsT0FBc0I7Q0FDbkcsTUFBTSxPQUFPLEtBQUssTUFBTSxJQUFJO0FBQzVCLEtBQUksS0FBSyxXQUFXLEdBQUc7QUFDckIsTUFBSSxLQUFLLE1BQTBCO0FBQ25DOztDQUVGLE1BQU0sVUFBVSxLQUFLLEtBQUs7Q0FDMUIsTUFBTSxlQUFlLGVBQWUsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFtQjtBQUMxRSxLQUFJLE9BQU8saUJBQWlCLFlBQVksQ0FBQyxDQUFDLGFBQ3hDLGNBQWEsV0FBVzs7QUFJNUIsU0FBZ0IsVUFBVSxNQUFjLEtBQTZCO0FBQ25FLFFBQU8s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
package/package.json CHANGED
@@ -1,15 +1,20 @@
1
1
  {
2
2
  "name": "@sot1986/appsync-precognition",
3
3
  "type": "module",
4
- "version": "0.0.1",
4
+ "version": "0.0.2",
5
5
  "description": "JavaScript resolver validation utilities for AWS AppSync",
6
6
  "author": "sot1986",
7
7
  "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/sot1986/appsync-precognition.git"
11
+ },
8
12
  "keywords": [
9
13
  "appsync",
10
14
  "validation",
11
15
  "resolver",
12
- "aws"
16
+ "aws",
17
+ "precognition"
13
18
  ],
14
19
  "exports": {
15
20
  ".": {
@@ -28,7 +33,6 @@
28
33
  "scripts": {
29
34
  "build": "tsdown --format esm --config tsdown.config.ts",
30
35
  "bundle": "cd playground && ./bundle-resolvers.sh && cd .. && eslint --ext playground/resolvers/**/*.{ts,js} . --fix",
31
- "prepublishOnly": "pnpm run build",
32
36
  "test": "vitest",
33
37
  "lint:resolvers": "eslint --ext playground/resolvers/**/*.{ts,js} . --fix"
34
38
  },