@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.
- package/{chunk-6pvqjhjf.js → chunk-6sxyen7j.js} +2 -2
- package/{chunk-c39qv53g.js → chunk-xt8gwvgg.js} +1 -1
- package/index.d.ts +23 -8
- package/index.js +136 -134
- package/package.json +1 -1
|
@@ -20,5 +20,5 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
|
20
20
|
|
|
21
21
|
export { __toESM, __commonJS, __require };
|
|
22
22
|
|
|
23
|
-
//# debugId=
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# debugId=21F72A06ECE4C28164756E2164756E21
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICBdLAogICJtYXBwaW5ncyI6ICIiLAogICJkZWJ1Z0lkIjogIjIxRjcyQTA2RUNFNEMyODE2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
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
|
-
|
|
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,
|
|
306
|
+
useCache: <T>(key: string, options?: MilkioRedisCacheOptions<T>) => {
|
|
294
307
|
set: (value: T, expireMs: number) => Promise<T>;
|
|
295
|
-
get: () => Promise<
|
|
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: (
|
|
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-
|
|
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-
|
|
8
|
+
const NodeRedis = await import("./chunk-xt8gwvgg.js");
|
|
115
9
|
const redis = await NodeRedis.default.createClient(options).connect();
|
|
116
10
|
const milkioRedis = {
|
|
117
|
-
|
|
118
|
-
useCache: (key,
|
|
11
|
+
redis,
|
|
12
|
+
useCache: (key, options2) => ({
|
|
119
13
|
set: async (value, expireMs) => {
|
|
120
|
-
await redis.PSETEX(key, expireMs,
|
|
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
|
|
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
|
|
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 (
|
|
159
|
-
const result = await redis.DECRBY(
|
|
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=
|
|
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.
|
|
1
|
+
{"name":"@milkio/redis","version":"1.0.0-beta.90","type":"module","module":"./index.js","types":"./index.d.ts","dependencies":{}}
|