@milkio/redis 1.0.0-beta.9 → 1.0.0-beta.90

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.
@@ -20,5 +20,5 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
20
20
 
21
21
  export { __toESM, __commonJS, __require };
22
22
 
23
- //# debugId=EC252AD077A7708464756E2164756E21
24
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICBdLAogICJtYXBwaW5ncyI6ICIiLAogICJkZWJ1Z0lkIjogIkVDMjUyQUQwNzdBNzcwODQ2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
23
+ //# debugId=21F72A06ECE4C28164756E2164756E21
24
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICBdLAogICJtYXBwaW5ncyI6ICIiLAogICJkZWJ1Z0lkIjogIjIxRjcyQTA2RUNFNEMyODE2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  __commonJS,
3
3
  __require
4
- } from "./chunk-6pvqjhjf.js";
4
+ } from "./chunk-6sxyen7j.js";
5
5
 
6
6
  // packages/milkio-redis/node_modules/@redis/client/dist/lib/commands/APPEND.js
7
7
  var require_APPEND = __commonJS((exports) => {
package/index.d.ts CHANGED
@@ -1,6 +1,19 @@
1
1
  import type { RedisClientOptions } from "redis";
2
+ export type MilkioRedisCacheOptions<T> = {
3
+ defaultValue?: T | undefined;
4
+ expireMs: number;
5
+ };
6
+ export type MilkioRedisFetchOptions<T> = {
7
+ defaultValue?: T | undefined;
8
+ expireMs: number;
9
+ realExpireMs?: number;
10
+ lockInterval?: number;
11
+ refreshLockInterval?: number;
12
+ notFoundExpireMs?: number;
13
+ fetch: () => T | undefined | Promise<T | undefined>;
14
+ };
2
15
  export declare function createRedis<Options extends RedisClientOptions>(options: Options): Promise<{
3
- raw: import("@redis/client").RedisClientType<{
16
+ redis: import("@redis/client").RedisClientType<{
4
17
  graph: {
5
18
  CONFIG_GET: typeof import("@redis/graph/dist/commands/CONFIG_GET.js");
6
19
  configGet: typeof import("@redis/graph/dist/commands/CONFIG_GET.js");
@@ -290,22 +303,24 @@ export declare function createRedis<Options extends RedisClientOptions>(options:
290
303
  reserve: typeof import("@redis/bloom/dist/commands/top-k/RESERVE.js");
291
304
  };
292
305
  } & import("redis").RedisModules, import("redis").RedisFunctions, import("redis").RedisScripts>;
293
- useCache: <T>(key: string, defaultValue?: T | undefined) => {
306
+ useCache: <T>(key: string, options?: MilkioRedisCacheOptions<T>) => {
294
307
  set: (value: T, expireMs: number) => Promise<T>;
295
- get: () => Promise<undefined | T>;
308
+ get: () => Promise<T | undefined>;
296
309
  pull: () => Promise<any>;
297
310
  has: () => Promise<boolean>;
298
311
  del: () => Promise<void>;
299
312
  };
313
+ useFetch: <Options_1 extends MilkioRedisFetchOptions<any>>(key: string, options: Options_1) => {
314
+ has: () => Promise<boolean>;
315
+ del: () => Promise<void>;
316
+ fetch: () => Promise<Awaited<ReturnType<Options_1["fetch"]>>>;
317
+ refresh: () => Promise<void>;
318
+ };
300
319
  useCount: (key: string) => {
301
320
  get: () => Promise<number>;
302
321
  add: (amount: number, expireMs?: number) => Promise<number>;
303
- sub: (key: string, amount: number) => Promise<number>;
322
+ sub: (amount: number) => Promise<number>;
304
323
  };
305
- useResultCache: <Handler extends () => unknown | Promise<unknown>>(key: string, expireMs: number, handler: Handler, options?: {
306
- realExpireMs?: number;
307
- lockInterval?: number;
308
- }) => Promise<Awaited<ReturnType<Handler>>>;
309
324
  useClockIn: (key: string, cleanDate: Date) => {
310
325
  clockIn: (offset: number) => Promise<void>;
311
326
  check: (offset: number) => Promise<boolean>;
package/index.js CHANGED
@@ -1,137 +1,31 @@
1
1
  import {
2
2
  __require,
3
3
  __toESM
4
- } from "./chunk-6pvqjhjf.js";
5
-
6
- // packages/milkio-redis/node_modules/@southern-aurora/tson/dist/tson.js
7
- var c = {
8
- rules: {
9
- stringify: [
10
- {
11
- match: (t) => typeof t == "bigint",
12
- handler: (t) => `t!bigint:${t.toString()}`
13
- },
14
- {
15
- match: (t) => t instanceof Date,
16
- handler: (t) => `t!Date:${t.toISOString()}`
17
- },
18
- {
19
- match: (t) => t instanceof URL,
20
- handler: (t) => `t!URL:${t.toString()}`
21
- },
22
- {
23
- match: (t) => t instanceof RegExp,
24
- handler: (t) => `t!RegExp:${t.toString()}`
25
- },
26
- {
27
- match: (t) => t instanceof Uint8Array,
28
- handler: (t) => `t!Uint8Array:${new TextDecoder().decode(t)}`
29
- },
30
- {
31
- match: (t) => t instanceof ArrayBuffer,
32
- handler: (t) => `t!ArrayBuffer:${new TextDecoder().decode(t)}`
33
- }
34
- ],
35
- parse: [
36
- {
37
- match: (t) => t.startsWith("t!bigint:"),
38
- handler: (t) => BigInt(t.slice(9))
39
- },
40
- {
41
- match: (t) => t.startsWith("t!Date:"),
42
- handler: (t) => new Date(t.slice(7))
43
- },
44
- {
45
- match: (t) => t.startsWith("t!URL:"),
46
- handler: (t) => new URL(t.slice(6))
47
- },
48
- {
49
- match: (t) => t.startsWith("t!RegExp:"),
50
- handler: (t) => new RegExp(t.slice(9))
51
- },
52
- {
53
- match: (t) => t.startsWith("t!Uint8Array:"),
54
- handler: (t) => new TextEncoder().encode(t.slice(13))
55
- },
56
- {
57
- match: (t) => t.startsWith("t!ArrayBuffer:"),
58
- handler: (t) => new TextEncoder().encode(t.slice(14)).buffer
59
- }
60
- ]
61
- },
62
- stringify(t) {
63
- return JSON.stringify(c.encode(t));
64
- },
65
- parse(t) {
66
- return c.decode(JSON.parse(t));
67
- },
68
- encode(t) {
69
- function n(e) {
70
- if (!e || typeof e != "object" && typeof e != "bigint")
71
- return e;
72
- if (e) {
73
- if (Array.isArray(e)) {
74
- const s = [];
75
- for (let i = 0;i < e.length; i++)
76
- s[i] = n(e[i]);
77
- return s;
78
- }
79
- } else
80
- return e;
81
- for (const s of c.rules.stringify)
82
- if (s.match(e))
83
- return s.handler(e);
84
- const r = {};
85
- for (var a in e)
86
- r[a] = n(e[a]);
87
- return r;
88
- }
89
- return n(t);
90
- },
91
- decode(t) {
92
- function n(e) {
93
- if (Array.isArray(e))
94
- return e.map(n);
95
- if (typeof e == "object" && e !== null) {
96
- const r = {};
97
- for (const a in e)
98
- e.hasOwnProperty(a) && (r[a] = n(e[a]));
99
- return r;
100
- } else if (typeof e == "string") {
101
- for (const r of c.rules.parse)
102
- if (r.match(e) === true)
103
- return r.handler(e);
104
- return e;
105
- }
106
- return e;
107
- }
108
- return n(t);
109
- }
110
- };
4
+ } from "./chunk-6sxyen7j.js";
111
5
 
112
6
  // packages/milkio-redis/index.ts
113
7
  async function createRedis(options) {
114
- const NodeRedis = await import("./chunk-c39qv53g.js");
8
+ const NodeRedis = await import("./chunk-xt8gwvgg.js");
115
9
  const redis = await NodeRedis.default.createClient(options).connect();
116
10
  const milkioRedis = {
117
- raw: redis,
118
- useCache: (key, defaultValue = undefined) => ({
11
+ redis,
12
+ useCache: (key, options2) => ({
119
13
  set: async (value, expireMs) => {
120
- await redis.PSETEX(key, expireMs, c.stringify(value));
14
+ await redis.PSETEX(key, expireMs, JSON.stringify(value));
121
15
  return value;
122
16
  },
123
17
  get: async () => {
124
18
  const result = await redis.GET(key);
125
19
  if (result === null)
126
- return defaultValue;
127
- return c.parse(result);
20
+ return options2?.defaultValue;
21
+ return reviveJSONParse(JSON.parse(result));
128
22
  },
129
23
  pull: async () => {
130
24
  const resultRaw = await redis.MULTI().GET(key).DEL(key).EXEC();
131
25
  const result = resultRaw[0];
132
26
  if (result === null)
133
- return defaultValue;
134
- return c.parse(result);
27
+ return options2?.defaultValue;
28
+ return reviveJSONParse(JSON.parse(result));
135
29
  },
136
30
  has: async () => {
137
31
  const result = await redis.GET(key);
@@ -141,6 +35,107 @@ async function createRedis(options) {
141
35
  await redis.DEL(key);
142
36
  }
143
37
  }),
38
+ useFetch: (key, options2) => {
39
+ if (typeof options2.expireMs !== "number" || options2.expireMs <= 0) {
40
+ throw new Error("expireMs must be a positive number");
41
+ }
42
+ if (options2.lockInterval !== undefined && (typeof options2.lockInterval !== "number" || options2.lockInterval <= 0)) {
43
+ throw new Error("lockInterval must be a positive number if provided");
44
+ }
45
+ if (options2.realExpireMs !== undefined && (typeof options2.realExpireMs !== "number" || options2.realExpireMs <= 0)) {
46
+ throw new Error("realExpireMs must be a positive number if provided");
47
+ }
48
+ if (options2.notFoundExpireMs !== undefined && (typeof options2.notFoundExpireMs !== "number" || options2.notFoundExpireMs <= 0)) {
49
+ throw new Error("notFoundExpireMs must be a positive number if provided");
50
+ }
51
+ if (options2.refreshLockInterval !== undefined) {
52
+ if (typeof options2.refreshLockInterval !== "number" || options2.refreshLockInterval <= 0) {
53
+ throw new Error("refreshLockInterval must be a positive number if provided");
54
+ }
55
+ const lockInterval = options2.lockInterval ?? 8192;
56
+ if (options2.refreshLockInterval <= lockInterval) {
57
+ throw new Error("refreshLockInterval must be greater than lockInterval");
58
+ }
59
+ }
60
+ if (typeof options2.fetch !== "function") {
61
+ throw new Error("fetch must be a function");
62
+ }
63
+ return {
64
+ has: async () => {
65
+ const result = await redis.GET(key);
66
+ return result !== null;
67
+ },
68
+ del: async () => {
69
+ await redis.DEL(key);
70
+ },
71
+ fetch: async () => {
72
+ const lockInterval = options2.lockInterval ?? 8192;
73
+ const realExpireMs = options2.realExpireMs ?? Math.floor(options2.expireMs * (Math.random() + 0.5)) + 8192;
74
+ const notFoundExpireMs = options2.notFoundExpireMs ?? Math.min(options2.expireMs, 16384);
75
+ const resultRaw = await redis.GET(key);
76
+ const result = resultRaw ? reviveJSONParse(JSON.parse(resultRaw)) : undefined;
77
+ const now = Date.now();
78
+ if (result && result.T > now) {
79
+ return result.R;
80
+ }
81
+ const refreshLockKey = `${key}:refresh-lock`;
82
+ if (await redis.EXISTS(refreshLockKey)) {
83
+ return result ? result.R : options2?.defaultValue;
84
+ }
85
+ const lockKey = `${key}:lock`;
86
+ const lockSet = await redis.SET(lockKey, "1", { PX: lockInterval, NX: true });
87
+ const gotLock = lockSet === "OK";
88
+ if (!gotLock)
89
+ return result ? result.R : options2.defaultValue;
90
+ const recheckRaw = await redis.GET(key);
91
+ const recheck = recheckRaw ? reviveJSONParse(JSON.parse(recheckRaw)) : undefined;
92
+ if (recheck && recheck.T > now) {
93
+ return recheck.R;
94
+ }
95
+ let data;
96
+ try {
97
+ data = await options2.fetch();
98
+ } catch (error) {
99
+ await redis.DEL(lockKey);
100
+ throw error;
101
+ }
102
+ const effectiveExpireMs = data !== undefined ? options2.expireMs + realExpireMs : notFoundExpireMs;
103
+ const cacheValue = {
104
+ T: now + (data !== undefined ? options2.expireMs : notFoundExpireMs),
105
+ R: data
106
+ };
107
+ const refreshLockExists = await redis.EXISTS(refreshLockKey);
108
+ if (refreshLockExists) {
109
+ await redis.DEL(lockKey);
110
+ return data;
111
+ }
112
+ await redis.MULTI().PSETEX(key, effectiveExpireMs, JSON.stringify(cacheValue)).DEL(lockKey).EXEC();
113
+ return data;
114
+ },
115
+ refresh: async () => {
116
+ const refreshLockKey = `${key}:refresh-lock`;
117
+ const refreshLockInterval = options2.refreshLockInterval ?? (options2.lockInterval ?? 8192) + 1024;
118
+ await redis.SET(refreshLockKey, "1", {
119
+ PX: refreshLockInterval
120
+ });
121
+ const now = Date.now();
122
+ let data;
123
+ try {
124
+ data = await options2.fetch();
125
+ } catch (error) {
126
+ await redis.DEL(refreshLockKey);
127
+ throw error;
128
+ }
129
+ const realExpireMs = options2.realExpireMs ?? Math.floor(options2.expireMs * (Math.random() + 0.5)) + 8192;
130
+ const effectiveExpireMs = data !== undefined ? options2.expireMs + realExpireMs : options2.notFoundExpireMs ?? Math.min(options2.expireMs, 16384);
131
+ const cacheValue = {
132
+ T: now + (data !== undefined ? options2.expireMs : options2.notFoundExpireMs ?? Math.min(options2.expireMs, 16384)),
133
+ R: data
134
+ };
135
+ await redis.PSETEX(key, effectiveExpireMs, JSON.stringify(cacheValue));
136
+ }
137
+ };
138
+ },
144
139
  useCount: (key) => ({
145
140
  get: async () => {
146
141
  const result = await redis.GET(key);
@@ -155,26 +150,11 @@ async function createRedis(options) {
155
150
  return Number(result[0]);
156
151
  }
157
152
  },
158
- sub: async (key2, amount) => {
159
- const result = await redis.DECRBY(key2, amount);
153
+ sub: async (amount) => {
154
+ const result = await redis.DECRBY(key, amount);
160
155
  return result;
161
156
  }
162
157
  }),
163
- useResultCache: async (key, expireMs, handler, options2) => {
164
- const resultRaw = await redis.get(key);
165
- if (resultRaw) {
166
- const result2 = c.parse(resultRaw);
167
- if (result2.T > new Date().getTime())
168
- return result2.R;
169
- const lock = await redis.GET(`${key}:lock`);
170
- if (lock === "1")
171
- return result2.R;
172
- await redis.PSETEX(`${key}:lock`, options2?.lockInterval ?? 6000, "1");
173
- }
174
- const result = { R: await handler(), T: new Date().getTime() + expireMs };
175
- await redis.PSETEX(key, expireMs + (options2?.realExpireMs ?? expireMs + Math.floor(expireMs * Math.random())) + (options2?.lockInterval ?? 6000), c.stringify(result));
176
- return result.R;
177
- },
178
158
  useClockIn: (key, cleanDate) => ({
179
159
  clockIn: async (offset) => {
180
160
  await redis.MULTI().SETBIT(key, offset, 1).PEXPIREAT(key, cleanDate.getTime()).EXEC();
@@ -216,9 +196,31 @@ async function createRedis(options) {
216
196
  };
217
197
  return milkioRedis;
218
198
  }
199
+ function reviveJSONParse(json) {
200
+ const isoDatePattern = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?)(Z|[+-]\d{2}:?\d{2})?$/;
201
+ if (json instanceof Date)
202
+ return json;
203
+ if (Array.isArray(json)) {
204
+ return json.map((item) => reviveJSONParse(item));
205
+ }
206
+ if (typeof json === "object" && json !== null) {
207
+ return Object.entries(json).reduce((acc, [key, value]) => {
208
+ acc[key] = reviveJSONParse(value);
209
+ return acc;
210
+ }, {});
211
+ }
212
+ if (typeof json === "string") {
213
+ const match = json.match(isoDatePattern);
214
+ if (match) {
215
+ const normalizedDateString = match[2] ? `${match[1]}${match[2].replace(":", "")}` : `${match[1]}Z`;
216
+ return new Date(normalizedDateString);
217
+ }
218
+ }
219
+ return json;
220
+ }
219
221
  export {
220
222
  createRedis
221
223
  };
222
224
 
223
- //# debugId=06364BA54369166064756E2164756E21
224
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXG5vZGVfbW9kdWxlc1xcQHNvdXRoZXJuLWF1cm9yYVxcdHNvblxcZGlzdFxcdHNvbi5qcyIsICIuLlxcaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiY29uc3QgYyA9IHtcbiAgcnVsZXM6IHtcbiAgICBzdHJpbmdpZnk6IFtcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0eXBlb2YgdCA9PSBcImJpZ2ludFwiLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gYHQhYmlnaW50OiR7dC50b1N0cmluZygpfWBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdCBpbnN0YW5jZW9mIERhdGUsXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBgdCFEYXRlOiR7dC50b0lTT1N0cmluZygpfWBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdCBpbnN0YW5jZW9mIFVSTCxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IGB0IVVSTDoke3QudG9TdHJpbmcoKX1gXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQgaW5zdGFuY2VvZiBSZWdFeHAsXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBgdCFSZWdFeHA6JHt0LnRvU3RyaW5nKCl9YFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0IGluc3RhbmNlb2YgVWludDhBcnJheSxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IGB0IVVpbnQ4QXJyYXk6JHtuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUodCl9YFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIsXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBgdCFBcnJheUJ1ZmZlcjoke25ldyBUZXh0RGVjb2RlcigpLmRlY29kZSh0KX1gXG4gICAgICB9XG4gICAgXSxcbiAgICBwYXJzZTogW1xuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQuc3RhcnRzV2l0aChcInQhYmlnaW50OlwiKSxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IEJpZ0ludCh0LnNsaWNlKDkpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0LnN0YXJ0c1dpdGgoXCJ0IURhdGU6XCIpLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gbmV3IERhdGUodC5zbGljZSg3KSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdC5zdGFydHNXaXRoKFwidCFVUkw6XCIpLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gbmV3IFVSTCh0LnNsaWNlKDYpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0LnN0YXJ0c1dpdGgoXCJ0IVJlZ0V4cDpcIiksXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBuZXcgUmVnRXhwKHQuc2xpY2UoOSkpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQuc3RhcnRzV2l0aChcInQhVWludDhBcnJheTpcIiksXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodC5zbGljZSgxMykpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQuc3RhcnRzV2l0aChcInQhQXJyYXlCdWZmZXI6XCIpLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHQuc2xpY2UoMTQpKS5idWZmZXJcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHN0cmluZ2lmeSh0KSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGMuZW5jb2RlKHQpKTtcbiAgfSxcbiAgcGFyc2UodCkge1xuICAgIHJldHVybiBjLmRlY29kZShKU09OLnBhcnNlKHQpKTtcbiAgfSxcbiAgZW5jb2RlKHQpIHtcbiAgICBmdW5jdGlvbiBuKGUpIHtcbiAgICAgIGlmICghZSB8fCB0eXBlb2YgZSAhPSBcIm9iamVjdFwiICYmIHR5cGVvZiBlICE9IFwiYmlnaW50XCIpXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgICAgICBjb25zdCBzID0gW107XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgc1tpXSA9IG4oZVtpXSk7XG4gICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZVxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIGZvciAoY29uc3QgcyBvZiBjLnJ1bGVzLnN0cmluZ2lmeSlcbiAgICAgICAgaWYgKHMubWF0Y2goZSkpXG4gICAgICAgICAgcmV0dXJuIHMuaGFuZGxlcihlKTtcbiAgICAgIGNvbnN0IHIgPSB7fTtcbiAgICAgIGZvciAodmFyIGEgaW4gZSlcbiAgICAgICAgclthXSA9IG4oZVthXSk7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG4gICAgcmV0dXJuIG4odCk7XG4gIH0sXG4gIGRlY29kZSh0KSB7XG4gICAgZnVuY3Rpb24gbihlKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSlcbiAgICAgICAgcmV0dXJuIGUubWFwKG4pO1xuICAgICAgaWYgKHR5cGVvZiBlID09IFwib2JqZWN0XCIgJiYgZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCByID0ge307XG4gICAgICAgIGZvciAoY29uc3QgYSBpbiBlKVxuICAgICAgICAgIGUuaGFzT3duUHJvcGVydHkoYSkgJiYgKHJbYV0gPSBuKGVbYV0pKTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCByIG9mIGMucnVsZXMucGFyc2UpXG4gICAgICAgICAgaWYgKHIubWF0Y2goZSkgPT09ICEwKVxuICAgICAgICAgICAgcmV0dXJuIHIuaGFuZGxlcihlKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZTtcbiAgICB9XG4gICAgcmV0dXJuIG4odCk7XG4gIH1cbn07XG5leHBvcnQge1xuICBjIGFzIFRTT05cbn07XG4iLAogICAgImltcG9ydCB0eXBlIHsgUmVkaXNDbGllbnRPcHRpb25zIH0gZnJvbSBcInJlZGlzXCI7XG5pbXBvcnQgeyBUU09OIH0gZnJvbSBcIkBzb3V0aGVybi1hdXJvcmEvdHNvblwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUmVkaXM8T3B0aW9ucyBleHRlbmRzIFJlZGlzQ2xpZW50T3B0aW9ucz4ob3B0aW9uczogT3B0aW9ucykge1xuICBjb25zdCBOb2RlUmVkaXMgPSBhd2FpdCBpbXBvcnQoXCJyZWRpc1wiKTtcbiAgY29uc3QgcmVkaXMgPSBhd2FpdCBOb2RlUmVkaXMuZGVmYXVsdC5jcmVhdGVDbGllbnQob3B0aW9ucykuY29ubmVjdCgpO1xuXG4gIGNvbnN0IG1pbGtpb1JlZGlzID0ge1xuICAgIHJhdzogcmVkaXMsXG4gICAgdXNlQ2FjaGU6IDxUPihrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBUIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKSA9PiAoe1xuICAgICAgc2V0OiBhc3luYyAodmFsdWU6IFQsIGV4cGlyZU1zOiBudW1iZXIpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICAgICAgYXdhaXQgcmVkaXMuUFNFVEVYKGtleSwgZXhwaXJlTXMsIFRTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICBnZXQ6IGFzeW5jICgpOiBQcm9taXNlPHVuZGVmaW5lZCB8IFQ+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuR0VUKGtleSk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIHJldHVybiBUU09OLnBhcnNlKHJlc3VsdCk7XG4gICAgICB9LFxuICAgICAgcHVsbDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRSYXcgPSBhd2FpdCByZWRpcy5NVUxUSSgpLkdFVChrZXkpLkRFTChrZXkpLkVYRUMoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0UmF3WzBdO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICByZXR1cm4gVFNPTi5wYXJzZShyZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAgIH0sXG4gICAgICBoYXM6IGFzeW5jICgpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuR0VUKGtleSk7XG4gICAgICAgIHJldHVybiByZXN1bHQgIT09IG51bGw7XG4gICAgICB9LFxuICAgICAgZGVsOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHJlZGlzLkRFTChrZXkpO1xuICAgICAgfSxcbiAgICB9KSxcbiAgICB1c2VDb3VudDogKGtleTogc3RyaW5nKSA9PiAoe1xuICAgICAgZ2V0OiBhc3luYyAoKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuR0VUKGtleSk7XG4gICAgICAgIHJldHVybiByZXN1bHQgPyBOdW1iZXIocmVzdWx0KSA6IDA7XG4gICAgICB9LFxuICAgICAgYWRkOiBhc3luYyAoYW1vdW50OiBudW1iZXIsIGV4cGlyZU1zPzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICAgICAgaWYgKCFleHBpcmVNcykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLklOQ1JCWShrZXksIGFtb3VudCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5NVUxUSSgpLklOQ1JCWShrZXksIGFtb3VudCkuUEVYUElSRShrZXksIGV4cGlyZU1zKS5FWEVDKCk7XG4gICAgICAgICAgcmV0dXJuIE51bWJlcihyZXN1bHRbMF0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc3ViOiBhc3luYyAoa2V5OiBzdHJpbmcsIGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuREVDUkJZKGtleSwgYW1vdW50KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgdXNlUmVzdWx0Q2FjaGU6IGFzeW5jIDxIYW5kbGVyIGV4dGVuZHMgKCkgPT4gdW5rbm93biB8IFByb21pc2U8dW5rbm93bj4+KGtleTogc3RyaW5nLCBleHBpcmVNczogbnVtYmVyLCBoYW5kbGVyOiBIYW5kbGVyLCBvcHRpb25zPzogeyByZWFsRXhwaXJlTXM/OiBudW1iZXI7IGxvY2tJbnRlcnZhbD86IG51bWJlciB9KTogUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8SGFuZGxlcj4+PiA9PiB7XG4gICAgICBjb25zdCByZXN1bHRSYXcgPSBhd2FpdCByZWRpcy5nZXQoa2V5KTtcbiAgICAgIGlmIChyZXN1bHRSYXcpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiB7IFQ6IG51bWJlcjsgUjogYW55IH0gPSBUU09OLnBhcnNlKHJlc3VsdFJhdyk7XG4gICAgICAgIGlmIChyZXN1bHQuVCA+IG5ldyBEYXRlKCkuZ2V0VGltZSgpKSByZXR1cm4gcmVzdWx0LlI7XG4gICAgICAgIGNvbnN0IGxvY2sgPSBhd2FpdCByZWRpcy5HRVQoYCR7a2V5fTpsb2NrYCk7XG4gICAgICAgIGlmIChsb2NrID09PSBcIjFcIikgcmV0dXJuIHJlc3VsdC5SO1xuICAgICAgICBhd2FpdCByZWRpcy5QU0VURVgoYCR7a2V5fTpsb2NrYCwgb3B0aW9ucz8ubG9ja0ludGVydmFsID8/IDYwMDAsIFwiMVwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHsgUjogKGF3YWl0IGhhbmRsZXIoKSkgYXMgQXdhaXRlZDxSZXR1cm5UeXBlPEhhbmRsZXI+PiwgVDogbmV3IERhdGUoKS5nZXRUaW1lKCkgKyBleHBpcmVNcyB9O1xuICAgICAgYXdhaXQgcmVkaXMuUFNFVEVYKGtleSwgZXhwaXJlTXMgKyAob3B0aW9ucz8ucmVhbEV4cGlyZU1zID8/IGV4cGlyZU1zICsgTWF0aC5mbG9vcihleHBpcmVNcyAqIE1hdGgucmFuZG9tKCkpKSArIChvcHRpb25zPy5sb2NrSW50ZXJ2YWwgPz8gNjAwMCksIFRTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xuXG4gICAgICByZXR1cm4gcmVzdWx0LlI7XG4gICAgfSxcbiAgICB1c2VDbG9ja0luOiAoa2V5OiBzdHJpbmcsIGNsZWFuRGF0ZTogRGF0ZSkgPT4gKHtcbiAgICAgIGNsb2NrSW46IGFzeW5jIChvZmZzZXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBhd2FpdCByZWRpcy5NVUxUSSgpLlNFVEJJVChrZXksIG9mZnNldCwgMSkuUEVYUElSRUFUKGtleSwgY2xlYW5EYXRlLmdldFRpbWUoKSkuRVhFQygpO1xuICAgICAgfSxcbiAgICAgIGNoZWNrOiBhc3luYyAob2Zmc2V0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuR0VUQklUKGtleSwgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gMTtcbiAgICAgIH0sXG4gICAgICBmaXJzdENsb2NrSW46IGFzeW5jICgpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5CSVRQT1Moa2V5LCAxKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICBsYXN0Q2xvY2tJbjogYXN5bmMgKCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkJJVFBPUyhrZXksIDEsIC0xKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICB0b0FycmF5OiBhc3luYyAobGVuZ3RoOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW5bXT4gPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRSYXcgPSBhd2FpdCByZWRpcy5CSVRGSUVMRChrZXksIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwiR0VUXCIsXG4gICAgICAgICAgICBlbmNvZGluZzogYHUke2xlbmd0aH1gLFxuICAgICAgICAgICAgb2Zmc2V0OiBcIiMwXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE51bWJlci5wYXJzZUludChgJHtyZXN1bHRSYXd9YCkudG9TdHJpbmcoMikuc3BsaXQoXCJcIik7XG4gICAgICAgIGNvbnN0IGZpbGwgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGggLSByZXN1bHQubGVuZ3RoOyBpKyspIGZpbGwucHVzaChcIjBcIik7XG4gICAgICAgIHJldHVybiBbLi4uZmlsbCwgLi4ucmVzdWx0XS5tYXAoKHYpID0+IHYgPT09IFwiMVwiKTtcbiAgICAgIH0sXG4gICAgICBjb3VudDogYXN5bmMgKCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkJJVENPVU5UKGtleSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAgY2xlYW46IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgYXdhaXQgcmVkaXMuREVMKGtleSk7XG4gICAgICB9LFxuICAgIH0pLFxuICB9O1xuXG4gIHJldHVybiBtaWxraW9SZWRpcztcbn1cblxuZXhwb3J0IHR5cGUgUmVkaXMgPSBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVJlZGlzPj47XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7QUFBQSxJQUFNLElBQUk7QUFBQSxFQUNSLE9BQU87QUFBQSxJQUNMLFdBQVc7QUFBQSxNQUNUO0FBQUEsUUFDRSxPQUFPLENBQUMsTUFBTSxPQUFPLEtBQUs7QUFBQSxRQUMxQixTQUFTLENBQUMsTUFBTSxZQUFZLEVBQUUsU0FBUztBQUFBLE1BQ3pDO0FBQUEsTUFDQTtBQUFBLFFBQ0UsT0FBTyxDQUFDLE1BQU0sYUFBYTtBQUFBLFFBQzNCLFNBQVMsQ0FBQyxNQUFNLFVBQVUsRUFBRSxZQUFZO0FBQUEsTUFDMUM7QUFBQSxNQUNBO0FBQUEsUUFDRSxPQUFPLENBQUMsTUFBTSxhQUFhO0FBQUEsUUFDM0IsU0FBUyxDQUFDLE1BQU0sU0FBUyxFQUFFLFNBQVM7QUFBQSxNQUN0QztBQUFBLE1BQ0E7QUFBQSxRQUNFLE9BQU8sQ0FBQyxNQUFNLGFBQWE7QUFBQSxRQUMzQixTQUFTLENBQUMsTUFBTSxZQUFZLEVBQUUsU0FBUztBQUFBLE1BQ3pDO0FBQUEsTUFDQTtBQUFBLFFBQ0UsT0FBTyxDQUFDLE1BQU0sYUFBYTtBQUFBLFFBQzNCLFNBQVMsQ0FBQyxNQUFNLGdCQUFnQixJQUFJLFlBQVksRUFBRSxPQUFPLENBQUM7QUFBQSxNQUM1RDtBQUFBLE1BQ0E7QUFBQSxRQUNFLE9BQU8sQ0FBQyxNQUFNLGFBQWE7QUFBQSxRQUMzQixTQUFTLENBQUMsTUFBTSxpQkFBaUIsSUFBSSxZQUFZLEVBQUUsT0FBTyxDQUFDO0FBQUEsTUFDN0Q7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTDtBQUFBLFFBQ0UsT0FBTyxDQUFDLE1BQU0sRUFBRSxXQUFXLFdBQVc7QUFBQSxRQUN0QyxTQUFTLENBQUMsTUFBTSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFBQSxNQUNuQztBQUFB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QUFXLEtBQUssT0FBTyxDQUFDLE1BQU0sVUFBUyxnQkFBZ0IsT0FBTyxFQUFLLFVBQVUsTUFBTSxDQUFDO0FBQUEsTUFFdkssT0FBTyxPQUFPO0FBQUE7QUFBQSxJQUVoQixZQUFZLENBQUMsS0FBYSxlQUFxQjtBQUFBLE1BQzdDLFNBQVMsT0FBTyxXQUFrQztBQUFBLFFBQ2hELE1BQU0sTUFBTSxNQUFNLEVBQUUsT0FBTyxLQUFLLFFBQVEsQ0FBQyxFQUFFLFVBQVUsS0FBSyxVQUFVLFFBQVEsQ0FBQyxFQUFFLEtBQUs7QUFBQTtBQUFBLE1BRXRGLE9BQU8sT0FBTyxXQUFxQztBQUFBLFFBQ2pELE1BQU0sU0FBUyxNQUFNLE1BQU0sT0FBTyxLQUFLLE1BQU07QUFBQSxRQUM3QyxPQUFPLFdBQVc7QUFBQTtBQUFBLE1BRXBCLGNBQWMsWUFBNkI7QUFBQSxRQUN6QyxNQUFNLFNBQVMsTUFBTSxNQUFNLE9BQU8sS0FBSyxDQUFDO0FBQUEsUUFDeEMsT0FBTztBQUFBO0FBQUEsTUFFVCxhQUFhLFlBQTZCO0FBQUEsUUFDeEMsTUFBTSxTQUFTLE1BQU0sTUFBTSxPQUFPLEtBQUssR0FBRyxFQUFFO0FBQUEsUUFDNUMsT0FBTztBQUFBO0FBQUEsTUFFVCxTQUFTLE9BQU8sV0FBdUM7QUFBQSxRQUNyRCxNQUFNLFlBQVksTUFBTSxNQUFNLFNBQVMsS0FBSztBQUFBLFVBQzFDO0FBQUEsWUFDRSxXQUFXO0FBQUEsWUFDWCxVQUFVLElBQUk7QUFBQSxZQUNkLFFBQVE7QUFBQSxVQUNWO0FBQUEsUUFDRixDQUFDO0FBQUEsUUFDRCxNQUFNLFNBQVMsT0FBTyxTQUFTLEdBQUcsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRTtBQUFBLFFBQ25FLE1BQU0sT0FBTyxDQUFDO0FBQUEsUUFDZCxTQUFTLElBQUksRUFBRyxJQUFJLFNBQVMsT0FBTyxRQUFRO0FBQUEsVUFBSyxLQUFLLEtBQUssR0FBRztBQUFBLFFBQzlELE9BQU8sQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sTUFBTSxHQUFHO0FBQUE7QUFBQSxNQUVsRCxPQUFPLFlBQTZCO0FBQUEsUUFDbEMsTUFBTSxTQUFTLE1BQU0sTUFBTSxTQUFTLEdBQUc7QUFBQSxRQUN2QyxPQUFPO0FBQUE7QUFBQSxNQUVULE9BQU8sWUFBMkI7QUFBQSxRQUNoQyxNQUFNLE1BQU0sSUFBSSxHQUFHO0FBQUE7QUFBQSxJQUV2QjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE9BQU87QUFBQTsiLAogICJkZWJ1Z0lkIjogIjA2MzY0QkE1NDM2OTE2NjA2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
225
+ //# debugId=6F6F9ACDCC3531F264756E2164756E21
226
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXGluZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIHsgUmVkaXNDbGllbnRPcHRpb25zIH0gZnJvbSBcInJlZGlzXCI7XG5cbmV4cG9ydCB0eXBlIE1pbGtpb1JlZGlzQ2FjaGVPcHRpb25zPFQ+ID0ge1xuICBkZWZhdWx0VmFsdWU/OiBUIHwgdW5kZWZpbmVkO1xuICBleHBpcmVNczogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTWlsa2lvUmVkaXNGZXRjaE9wdGlvbnM8VD4gPSB7XG4gIGRlZmF1bHRWYWx1ZT86IFQgfCB1bmRlZmluZWQ7XG4gIGV4cGlyZU1zOiBudW1iZXI7XG4gIHJlYWxFeHBpcmVNcz86IG51bWJlcjtcbiAgbG9ja0ludGVydmFsPzogbnVtYmVyO1xuICByZWZyZXNoTG9ja0ludGVydmFsPzogbnVtYmVyO1xuICBub3RGb3VuZEV4cGlyZU1zPzogbnVtYmVyO1xuICBmZXRjaDogKCkgPT4gVCB8IHVuZGVmaW5lZCB8IFByb21pc2U8VCB8IHVuZGVmaW5lZD47XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUmVkaXM8T3B0aW9ucyBleHRlbmRzIFJlZGlzQ2xpZW50T3B0aW9ucz4ob3B0aW9uczogT3B0aW9ucykge1xuICBjb25zdCBOb2RlUmVkaXMgPSBhd2FpdCBpbXBvcnQoXCJyZWRpc1wiKTtcbiAgY29uc3QgcmVkaXMgPSBhd2FpdCBOb2RlUmVkaXMuZGVmYXVsdC5jcmVhdGVDbGllbnQob3B0aW9ucykuY29ubmVjdCgpO1xuXG4gIGNvbnN0IG1pbGtpb1JlZGlzID0ge1xuICAgIHJlZGlzLFxuICAgIHVzZUNhY2hlOiA8VD4oa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBNaWxraW9SZWRpc0NhY2hlT3B0aW9uczxUPikgPT4gKHtcbiAgICAgIHNldDogYXN5bmMgKHZhbHVlOiBULCBleHBpcmVNczogbnVtYmVyKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgICAgIGF3YWl0IHJlZGlzLlBTRVRFWChrZXksIGV4cGlyZU1zLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9LFxuICAgICAgZ2V0OiBhc3luYyAoKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkdFVChrZXkpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gb3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xuICAgICAgICByZXR1cm4gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UocmVzdWx0KSk7XG4gICAgICB9LFxuICAgICAgcHVsbDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRSYXcgPSBhd2FpdCByZWRpcy5NVUxUSSgpLkdFVChrZXkpLkRFTChrZXkpLkVYRUMoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0UmF3WzBdO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gb3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xuICAgICAgICByZXR1cm4gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UocmVzdWx0IGFzIHN0cmluZykpO1xuICAgICAgfSxcbiAgICAgIGhhczogYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5HRVQoa2V5KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAhPT0gbnVsbDtcbiAgICAgIH0sXG4gICAgICBkZWw6IGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgcmVkaXMuREVMKGtleSk7XG4gICAgICB9LFxuICAgIH0pLFxuXG4gICAgdXNlRmV0Y2g6IDxPcHRpb25zIGV4dGVuZHMgTWlsa2lvUmVkaXNGZXRjaE9wdGlvbnM8YW55Pj4oa2V5OiBzdHJpbmcsIG9wdGlvbnM6IE9wdGlvbnMpID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5leHBpcmVNcyAhPT0gXCJudW1iZXJcIiB8fCBvcHRpb25zLmV4cGlyZU1zIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwaXJlTXMgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlclwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMubG9ja0ludGVydmFsICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLmxvY2tJbnRlcnZhbCAhPT0gXCJudW1iZXJcIiB8fCBvcHRpb25zLmxvY2tJbnRlcnZhbCA8PSAwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJsb2NrSW50ZXJ2YWwgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBpZiBwcm92aWRlZFwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMucmVhbEV4cGlyZU1zICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLnJlYWxFeHBpcmVNcyAhPT0gXCJudW1iZXJcIiB8fCBvcHRpb25zLnJlYWxFeHBpcmVNcyA8PSAwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWFsRXhwaXJlTXMgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBpZiBwcm92aWRlZFwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMubm90Rm91bmRFeHBpcmVNcyAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2Ygb3B0aW9ucy5ub3RGb3VuZEV4cGlyZU1zICE9PSBcIm51bWJlclwiIHx8IG9wdGlvbnMubm90Rm91bmRFeHBpcmVNcyA8PSAwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3RGb3VuZEV4cGlyZU1zIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIgaWYgcHJvdmlkZWRcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnJlZnJlc2hMb2NrSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVmcmVzaExvY2tJbnRlcnZhbCAhPT0gXCJudW1iZXJcIiB8fCBvcHRpb25zLnJlZnJlc2hMb2NrSW50ZXJ2YWwgPD0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlZnJlc2hMb2NrSW50ZXJ2YWwgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBpZiBwcm92aWRlZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2tJbnRlcnZhbCA9IG9wdGlvbnMubG9ja0ludGVydmFsID8/IDgxOTI7XG4gICAgICAgIGlmIChvcHRpb25zLnJlZnJlc2hMb2NrSW50ZXJ2YWwgPD0gbG9ja0ludGVydmFsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVmcmVzaExvY2tJbnRlcnZhbCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBsb2NrSW50ZXJ2YWxcIik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmZldGNoICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmV0Y2ggbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBoYXM6IGFzeW5jICgpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5HRVQoa2V5KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ICE9PSBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBkZWw6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCByZWRpcy5ERUwoa2V5KTtcbiAgICAgICAgfSxcbiAgICAgICAgZmV0Y2g6IGFzeW5jICgpOiBQcm9taXNlPEF3YWl0ZWQ8UmV0dXJuVHlwZTxPcHRpb25zW1wiZmV0Y2hcIl0+Pj4gPT4ge1xuICAgICAgICAgIGNvbnN0IGxvY2tJbnRlcnZhbCA9IG9wdGlvbnMubG9ja0ludGVydmFsID8/IDgxOTI7XG4gICAgICAgICAgY29uc3QgcmVhbEV4cGlyZU1zID0gb3B0aW9ucy5yZWFsRXhwaXJlTXMgPz8gTWF0aC5mbG9vcihvcHRpb25zLmV4cGlyZU1zICogKE1hdGgucmFuZG9tKCkgKyAwLjUpKSArIDgxOTI7XG5cbiAgICAgICAgICBjb25zdCBub3RGb3VuZEV4cGlyZU1zID0gb3B0aW9ucy5ub3RGb3VuZEV4cGlyZU1zID8/IE1hdGgubWluKG9wdGlvbnMuZXhwaXJlTXMsIDE2Mzg0KTtcblxuICAgICAgICAgIGNvbnN0IHJlc3VsdFJhdyA9IGF3YWl0IHJlZGlzLkdFVChrZXkpO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdFJhdyA/IChyZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShyZXN1bHRSYXcpKSBhcyB7IFQ6IG51bWJlcjsgUjogQXdhaXRlZDxSZXR1cm5UeXBlPE9wdGlvbnNbXCJmZXRjaFwiXT4+IH0pIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5UID4gbm93KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LlI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmVmcmVzaExvY2tLZXkgPSBgJHtrZXl9OnJlZnJlc2gtbG9ja2A7XG4gICAgICAgICAgaWYgKGF3YWl0IHJlZGlzLkVYSVNUUyhyZWZyZXNoTG9ja0tleSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPyByZXN1bHQuUiA6IG9wdGlvbnM/LmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBsb2NrS2V5ID0gYCR7a2V5fTpsb2NrYDtcbiAgICAgICAgICBjb25zdCBsb2NrU2V0ID0gYXdhaXQgcmVkaXMuU0VUKGxvY2tLZXksIFwiMVwiLCB7IFBYOiBsb2NrSW50ZXJ2YWwsIE5YOiB0cnVlIH0pO1xuICAgICAgICAgIGNvbnN0IGdvdExvY2sgPSBsb2NrU2V0ID09PSBcIk9LXCI7XG5cbiAgICAgICAgICBpZiAoIWdvdExvY2spIHJldHVybiByZXN1bHQgPyByZXN1bHQuUiA6IG9wdGlvbnMuZGVmYXVsdFZhbHVlO1xuXG4gICAgICAgICAgY29uc3QgcmVjaGVja1JhdyA9IGF3YWl0IHJlZGlzLkdFVChrZXkpO1xuICAgICAgICAgIGNvbnN0IHJlY2hlY2sgPSByZWNoZWNrUmF3ID8gKHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKHJlY2hlY2tSYXcpKSBhcyB7IFQ6IG51bWJlcjsgUjogQXdhaXRlZDxSZXR1cm5UeXBlPE9wdGlvbnNbXCJmZXRjaFwiXT4+IH0pIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKHJlY2hlY2sgJiYgcmVjaGVjay5UID4gbm93KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVjaGVjay5SO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBkYXRhOiBBd2FpdGVkPFJldHVyblR5cGU8T3B0aW9uc1tcImZldGNoXCJdPj47XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRhdGEgPSBhd2FpdCBvcHRpb25zLmZldGNoKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlZGlzLkRFTChsb2NrS2V5KTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZUV4cGlyZU1zID0gZGF0YSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5leHBpcmVNcyArIHJlYWxFeHBpcmVNcyA6IG5vdEZvdW5kRXhwaXJlTXM7XG5cbiAgICAgICAgICBjb25zdCBjYWNoZVZhbHVlID0ge1xuICAgICAgICAgICAgVDogbm93ICsgKGRhdGEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZXhwaXJlTXMgOiBub3RGb3VuZEV4cGlyZU1zKSxcbiAgICAgICAgICAgIFI6IGRhdGEsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IHJlZnJlc2hMb2NrRXhpc3RzID0gYXdhaXQgcmVkaXMuRVhJU1RTKHJlZnJlc2hMb2NrS2V5KTtcbiAgICAgICAgICBpZiAocmVmcmVzaExvY2tFeGlzdHMpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlZGlzLkRFTChsb2NrS2V5KTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IHJlZGlzLk1VTFRJKCkuUFNFVEVYKGtleSwgZWZmZWN0aXZlRXhwaXJlTXMsIEpTT04uc3RyaW5naWZ5KGNhY2hlVmFsdWUpKS5ERUwobG9ja0tleSkuRVhFQygpO1xuXG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZnJlc2g6IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICBjb25zdCByZWZyZXNoTG9ja0tleSA9IGAke2tleX06cmVmcmVzaC1sb2NrYDtcbiAgICAgICAgICBjb25zdCByZWZyZXNoTG9ja0ludGVydmFsID0gb3B0aW9ucy5yZWZyZXNoTG9ja0ludGVydmFsID8/IChvcHRpb25zLmxvY2tJbnRlcnZhbCA/PyA4MTkyKSArIDEwMjQ7XG5cbiAgICAgICAgICBhd2FpdCByZWRpcy5TRVQocmVmcmVzaExvY2tLZXksIFwiMVwiLCB7XG4gICAgICAgICAgICBQWDogcmVmcmVzaExvY2tJbnRlcnZhbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgbGV0IGRhdGE6IEF3YWl0ZWQ8UmV0dXJuVHlwZTxPcHRpb25zW1wiZmV0Y2hcIl0+PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IG9wdGlvbnMuZmV0Y2goKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgcmVkaXMuREVMKHJlZnJlc2hMb2NrS2V5KTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlYWxFeHBpcmVNcyA9IG9wdGlvbnMucmVhbEV4cGlyZU1zID8/IE1hdGguZmxvb3Iob3B0aW9ucy5leHBpcmVNcyAqIChNYXRoLnJhbmRvbSgpICsgMC41KSkgKyA4MTkyO1xuICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZUV4cGlyZU1zID0gZGF0YSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5leHBpcmVNcyArIHJlYWxFeHBpcmVNcyA6IChvcHRpb25zLm5vdEZvdW5kRXhwaXJlTXMgPz8gTWF0aC5taW4ob3B0aW9ucy5leHBpcmVNcywgMTYzODQpKTtcblxuICAgICAgICAgIGNvbnN0IGNhY2hlVmFsdWUgPSB7XG4gICAgICAgICAgICBUOiBub3cgKyAoZGF0YSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5leHBpcmVNcyA6IChvcHRpb25zLm5vdEZvdW5kRXhwaXJlTXMgPz8gTWF0aC5taW4ob3B0aW9ucy5leHBpcmVNcywgMTYzODQpKSksXG4gICAgICAgICAgICBSOiBkYXRhLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBhd2FpdCByZWRpcy5QU0VURVgoa2V5LCBlZmZlY3RpdmVFeHBpcmVNcywgSlNPTi5zdHJpbmdpZnkoY2FjaGVWYWx1ZSkpOyAvLyBEbyBub3QgY2xlYW4gdGhlIHVwZGF0ZSBsb2NrISBJbnN0ZWFkLCB3YWl0IGZvciBpdCB0byBleHBpcmUgbmF0dXJhbGx5XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICB1c2VDb3VudDogKGtleTogc3RyaW5nKSA9PiAoe1xuICAgICAgZ2V0OiBhc3luYyAoKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuR0VUKGtleSk7XG4gICAgICAgIHJldHVybiByZXN1bHQgPyBOdW1iZXIocmVzdWx0KSA6IDA7XG4gICAgICB9LFxuICAgICAgYWRkOiBhc3luYyAoYW1vdW50OiBudW1iZXIsIGV4cGlyZU1zPzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICAgICAgaWYgKCFleHBpcmVNcykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLklOQ1JCWShrZXksIGFtb3VudCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5NVUxUSSgpLklOQ1JCWShrZXksIGFtb3VudCkuUEVYUElSRShrZXksIGV4cGlyZU1zKS5FWEVDKCk7XG4gICAgICAgICAgcmV0dXJuIE51bWJlcihyZXN1bHRbMF0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc3ViOiBhc3luYyAoYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5ERUNSQlkoa2V5LCBhbW91bnQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICB9KSxcblxuICAgIHVzZUNsb2NrSW46IChrZXk6IHN0cmluZywgY2xlYW5EYXRlOiBEYXRlKSA9PiAoe1xuICAgICAgY2xvY2tJbjogYXN5bmMgKG9mZnNldDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGF3YWl0IHJlZGlzLk1VTFRJKCkuU0VUQklUKGtleSwgb2Zmc2V0LCAxKS5QRVhQSVJFQVQoa2V5LCBjbGVhbkRhdGUuZ2V0VGltZSgpKS5FWEVDKCk7XG4gICAgICB9LFxuICAgICAgY2hlY2s6IGFzeW5jIChvZmZzZXQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5HRVRCSVQoa2V5LCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSAxO1xuICAgICAgfSxcbiAgICAgIGZpcnN0Q2xvY2tJbjogYXN5bmMgKCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkJJVFBPUyhrZXksIDEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIGxhc3RDbG9ja0luOiBhc3luYyAoKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuQklUUE9TKGtleSwgMSwgLTEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHRvQXJyYXk6IGFzeW5jIChsZW5ndGg6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbltdPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdFJhdyA9IGF3YWl0IHJlZGlzLkJJVEZJRUxEKGtleSwgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogXCJHRVRcIixcbiAgICAgICAgICAgIGVuY29kaW5nOiBgdSR7bGVuZ3RofWAsXG4gICAgICAgICAgICBvZmZzZXQ6IFwiIzBcIixcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gTnVtYmVyLnBhcnNlSW50KGAke3Jlc3VsdFJhd31gKS50b1N0cmluZygyKS5zcGxpdChcIlwiKTtcbiAgICAgICAgY29uc3QgZmlsbCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aCAtIHJlc3VsdC5sZW5ndGg7IGkrKykgZmlsbC5wdXNoKFwiMFwiKTtcbiAgICAgICAgcmV0dXJuIFsuLi5maWxsLCAuLi5yZXN1bHRdLm1hcCgodikgPT4gdiA9PT0gXCIxXCIpO1xuICAgICAgfSxcbiAgICAgIGNvdW50OiBhc3luYyAoKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuQklUQ09VTlQoa2V5KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICBjbGVhbjogYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBhd2FpdCByZWRpcy5ERUwoa2V5KTtcbiAgICAgIH0sXG4gICAgfSksXG4gIH07XG5cbiAgcmV0dXJuIG1pbGtpb1JlZGlzO1xufVxuXG5mdW5jdGlvbiByZXZpdmVKU09OUGFyc2U8VD4oanNvbjogVCk6IFQge1xuICBjb25zdCBpc29EYXRlUGF0dGVybiA9IC9eKFxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkezEsM30pPykoWnxbKy1dXFxkezJ9Oj9cXGR7Mn0pPyQvO1xuXG4gIGlmIChqc29uIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGpzb247XG4gIGlmIChBcnJheS5pc0FycmF5KGpzb24pKSB7XG4gICAgcmV0dXJuIGpzb24ubWFwKChpdGVtKSA9PiByZXZpdmVKU09OUGFyc2UoaXRlbSkpIGFzIGFueTtcbiAgfVxuICBpZiAodHlwZW9mIGpzb24gPT09IFwib2JqZWN0XCIgJiYganNvbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhqc29uKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBhY2Nba2V5IGFzIGtleW9mIFRdID0gcmV2aXZlSlNPTlBhcnNlKHZhbHVlKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgVCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBqc29uID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBqc29uLm1hdGNoKGlzb0RhdGVQYXR0ZXJuKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRlU3RyaW5nID0gbWF0Y2hbMl0gPyBgJHttYXRjaFsxXX0ke21hdGNoWzJdLnJlcGxhY2UoXCI6XCIsIFwiXCIpfWAgOiBgJHttYXRjaFsxXX1aYDtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShub3JtYWxpemVkRGF0ZVN0cmluZykgYXMgYW55O1xuICAgIH1cbiAgfVxuICByZXR1cm4ganNvbjtcbn1cblxuZXhwb3J0IHR5cGUgUmVkaXMgPSBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVJlZGlzPj47XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7QUFpQkEsZUFBc0IsV0FBK0MsQ0FBQyxTQUFrQjtBQUFBLEVBQ3RGLE1BQU0sWUFBWSxNQUFhO0FBQUEsRUFDL0IsTUFBTSxRQUFRLE1BQU0sVUFBVSxRQUFRLGFBQWEsT0FBTyxFQUFFLFFBQVE7QUFBQSxFQUVwRSxNQUFNLGNBQWM7QUFBQSxJQUNsQjtBQUFBLElBQ0EsVUFBVSxDQUFJLEtBQWEsY0FBMEM7QUFBQSxNQUNuRSxLQUFLLE9BQU8sT0FBVSxhQUFpQztBQUFBLFFBQ3JELE1BQU0sTUFBTSxPQUFPLEtBQUssVUFBVSxLQUFLLFVBQVUsS0FBSyxDQUFDO0FBQUEsUUFDdkQsT0FBTztBQUFBO0FBQUEsTUFFVCxLQUFLLFlBQW9DO0FBQUEsUUFDdkMsTUFBTSxTQUFTLE1BQU0sTUFBTSxJQUFJLEdBQUc7QUFBQSxRQUNsQyxJQUFJLFdBQVc7QUFBQSxVQUFNLE9BQU8sVUFBUztBQUFBLFFBQ3JDLE9BQU8sZ0JBQWdCLEtBQUssTUFBTSxNQUFNLENBQUM7QUFBQTtBQUFBLE1BRTNDLE1BQU0sWUFBWTtBQUFBLFFBQ2hCLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUs7QUFBQSxRQUM3RCxNQUFNLFNBQVMsVUFBVTtBQUFBLFFBQ3pCLElBQUksV0FBVztBQUFBLFVBQU0sT0FBTyxVQUFTO0FBQUEsUUFDckMsT0FBTyxnQkFBZ0IsS0FBSyxNQUFNLE1BQWdCLENBQUM7QUFBQTtBQUFBLE1BRXJELEtBQUssWUFBOEI7QUFBQSxRQUNqQyxNQUFNLFNBQVMsTUFBTSxNQUFNLElBQUksR0FBRztBQUFBLFFBQ2xDLE9BQU8sV0FBVztBQUFBO0FBQUEsTUFFcEIsS0FBSyxZQUFZO0FBQUEsUUFD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QUksR0FBRztBQUFBO0FBQUEsSUFFdkI7QUFBQSxFQUNGO0FBQUEsRUFFQSxPQUFPO0FBQUE7QUFHVCxTQUFTLGVBQWtCLENBQUMsTUFBWTtBQUFBLEVBQ3RDLE1BQU0saUJBQWlCO0FBQUEsRUFFdkIsSUFBSSxnQkFBZ0I7QUFBQSxJQUFNLE9BQU87QUFBQSxFQUNqQyxJQUFJLE1BQU0sUUFBUSxJQUFJLEdBQUc7QUFBQSxJQUN2QixPQUFPLEtBQUssSUFBSSxDQUFDLFNBQVMsZ0JBQWdCLElBQUksQ0FBQztBQUFBLEVBQ2pEO0FBQUEsRUFDQSxJQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVMsTUFBTTtBQUFBLElBQzdDLE9BQU8sT0FBTyxRQUFRLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxLQUFLLFdBQVc7QUFBQSxNQUN4RCxJQUFJLE9BQWtCLGdCQUFnQixLQUFLO0FBQUEsTUFDM0MsT0FBTztBQUFBLE9BQ04sQ0FBQyxDQUFNO0FBQUEsRUFDWjtBQUFBLEVBQ0EsSUFBSSxPQUFPLFNBQVMsVUFBVTtBQUFBLElBQzVCLE1BQU0sUUFBUSxLQUFLLE1BQU0sY0FBYztBQUFBLElBQ3ZDLElBQUksT0FBTztBQUFBLE1BQ1QsTUFBTSx1QkFBdUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFLLE1BQU0sR0FBRyxRQUFRLEtBQUssRUFBRSxNQUFNLEdBQUcsTUFBTTtBQUFBLE1BQzdGLE9BQU8sSUFBSSxLQUFLLG9CQUFvQjtBQUFBLElBQ3RDO0FBQUEsRUFDRjtBQUFBLEVBQ0EsT0FBTztBQUFBOyIsCiAgImRlYnVnSWQiOiAiNkY2RjlBQ0RDQzM1MzFGMjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@milkio/redis","version":"1.0.0-beta.9","type":"module","module":"./index.js","types":"./index.d.ts","dependencies":{}}
1
+ {"name":"@milkio/redis","version":"1.0.0-beta.90","type":"module","module":"./index.js","types":"./index.d.ts","dependencies":{}}