@omujs/omu 0.9.47 → 0.9.49
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/dts/api/asset/extension.d.ts +25 -0
- package/dist/dts/api/asset/index.d.ts +2 -0
- package/dist/dts/api/dashboard/extension.d.ts +183 -0
- package/{src/api/dashboard/handler.ts → dist/dts/api/dashboard/handler.d.ts} +0 -2
- package/dist/dts/api/dashboard/index.d.ts +3 -0
- package/dist/dts/api/dashboard/packets.d.ts +73 -0
- package/dist/dts/api/endpoint/endpoint.d.ts +21 -0
- package/dist/dts/api/endpoint/extension.d.ts +17 -0
- package/{src/api/endpoint/index.ts → dist/dts/api/endpoint/index.d.ts} +0 -1
- package/dist/dts/api/endpoint/packets.d.ts +51 -0
- package/dist/dts/api/extension-registry.d.ts +8 -0
- package/dist/dts/api/extension.d.ts +11 -0
- package/dist/dts/api/http/extension.d.ts +41 -0
- package/dist/dts/api/http/http.d.ts +36 -0
- package/{src/api/http/index.ts → dist/dts/api/http/index.d.ts} +0 -1
- package/dist/dts/api/http/websocket.d.ts +125 -0
- package/dist/dts/api/i18n/extension.d.ts +19 -0
- package/{src/api/i18n/index.ts → dist/dts/api/i18n/index.d.ts} +0 -1
- package/{src/api/index.ts → dist/dts/api/index.d.ts} +0 -1
- package/dist/dts/api/logger/extension.d.ts +25 -0
- package/dist/dts/api/logger/index.d.ts +1 -0
- package/dist/dts/api/logger/packets.d.ts +18 -0
- package/dist/dts/api/permission/extension.d.ts +19 -0
- package/{src/api/permission/index.ts → dist/dts/api/permission/index.d.ts} +0 -1
- package/dist/dts/api/permission/permission.d.ts +25 -0
- package/dist/dts/api/plugin/extension.d.ts +43 -0
- package/{src/api/plugin/index.ts → dist/dts/api/plugin/index.d.ts} +0 -1
- package/{src/api/plugin/package-info.ts → dist/dts/api/plugin/package-info.d.ts} +0 -7
- package/dist/dts/api/registry/extension.d.ts +23 -0
- package/{src/api/registry/index.ts → dist/dts/api/registry/index.d.ts} +0 -1
- package/dist/dts/api/registry/packets.d.ts +20 -0
- package/{src/api/registry/registry.ts → dist/dts/api/registry/registry.d.ts} +11 -53
- package/dist/dts/api/server/extension.d.ts +61 -0
- package/dist/dts/api/server/index.d.ts +1 -0
- package/dist/dts/api/session/extension.d.ts +52 -0
- package/dist/dts/api/session/index.d.ts +1 -0
- package/dist/dts/api/signal/extension.d.ts +19 -0
- package/dist/dts/api/signal/packets.d.ts +21 -0
- package/dist/dts/api/signal/signal.d.ts +33 -0
- package/dist/dts/api/table/extension.d.ts +26 -0
- package/{src/api/table/index.ts → dist/dts/api/table/index.d.ts} +0 -1
- package/dist/dts/api/table/packets.d.ts +65 -0
- package/dist/dts/api/table/table.d.ts +75 -0
- package/dist/dts/app.d.ts +49 -0
- package/dist/dts/const.d.ts +2 -0
- package/dist/dts/errors.d.ts +36 -0
- package/dist/dts/event/index.d.ts +6 -0
- package/dist/dts/helper.d.ts +10 -0
- package/dist/dts/identifier.d.ts +51 -0
- package/dist/dts/index.d.ts +36 -0
- package/{src/localization/index.ts → dist/dts/localization/index.d.ts} +0 -1
- package/dist/dts/localization/locale.d.ts +735 -0
- package/{src/localization/localization.ts → dist/dts/localization/localization.d.ts} +0 -2
- package/dist/dts/lock.d.ts +6 -0
- package/dist/dts/network/connection.d.ts +17 -0
- package/dist/dts/network/encryption.d.ts +38 -0
- package/dist/dts/network/frame-transport.d.ts +22 -0
- package/{src/network/index.ts → dist/dts/network/index.d.ts} +0 -1
- package/dist/dts/network/network.d.ts +59 -0
- package/{src/network/packet/index.ts → dist/dts/network/packet/index.d.ts} +0 -1
- package/dist/dts/network/packet/packet-types.d.ts +84 -0
- package/dist/dts/network/packet/packet.d.ts +25 -0
- package/dist/dts/network/websocket-transport.d.ts +24 -0
- package/dist/dts/omu.d.ts +61 -0
- package/dist/dts/result.d.ts +26 -0
- package/dist/dts/serialize/bytebuffer.d.ts +73 -0
- package/dist/dts/serialize/serializer.d.ts +26 -0
- package/dist/dts/token.d.ts +14 -0
- package/dist/dts/version.d.ts +2 -0
- package/dist/esm/address.js +4 -0
- package/dist/esm/api/asset/extension.js +911 -0
- package/dist/esm/api/asset/index.js +909 -0
- package/dist/esm/api/dashboard/extension.js +1362 -0
- package/dist/esm/api/dashboard/handler.js +4 -0
- package/dist/esm/api/dashboard/index.js +1361 -0
- package/dist/esm/api/dashboard/packets.js +419 -0
- package/dist/esm/api/endpoint/endpoint.js +383 -0
- package/dist/esm/api/endpoint/extension.js +1096 -0
- package/dist/esm/api/endpoint/index.js +383 -0
- package/dist/esm/api/endpoint/packets.js +799 -0
- package/dist/esm/api/extension-registry.js +23 -0
- package/dist/esm/api/extension.js +278 -0
- package/dist/esm/api/http/extension.js +1420 -0
- package/dist/esm/api/http/http.js +448 -0
- package/dist/esm/api/http/index.js +1419 -0
- package/dist/esm/api/http/websocket.js +220 -0
- package/dist/esm/api/i18n/extension.js +1339 -0
- package/dist/esm/api/i18n/index.js +1337 -0
- package/dist/esm/api/index.js +295 -0
- package/dist/esm/api/logger/extension.js +856 -0
- package/dist/esm/api/logger/index.js +852 -0
- package/dist/esm/api/logger/packets.js +673 -0
- package/dist/esm/api/permission/extension.js +535 -0
- package/dist/esm/api/permission/index.js +294 -0
- package/dist/esm/api/permission/permission.js +294 -0
- package/dist/esm/api/plugin/extension.js +531 -0
- package/dist/esm/api/plugin/index.js +529 -0
- package/dist/esm/api/plugin/package-info.js +4 -0
- package/dist/esm/api/registry/extension.js +1286 -0
- package/dist/esm/api/registry/index.js +1285 -0
- package/dist/esm/api/registry/packets.js +694 -0
- package/dist/esm/api/registry/registry.js +383 -0
- package/dist/esm/api/server/extension.js +2140 -0
- package/dist/esm/api/server/index.js +2118 -0
- package/dist/esm/api/session/extension.js +2235 -0
- package/dist/esm/api/session/index.js +2235 -0
- package/dist/esm/api/signal/extension.js +1031 -0
- package/dist/esm/api/signal/index.js +379 -0
- package/dist/esm/api/signal/packets.js +690 -0
- package/dist/esm/api/signal/signal.js +379 -0
- package/dist/esm/api/table/extension.js +1553 -0
- package/dist/esm/api/table/index.js +1552 -0
- package/dist/esm/api/table/packets.js +904 -0
- package/dist/esm/api/table/table.js +383 -0
- package/dist/esm/app.js +264 -0
- package/dist/esm/const.js +11 -0
- package/dist/esm/errors.js +548 -0
- package/dist/esm/event/index.js +22 -0
- package/dist/esm/helper.js +15 -0
- package/dist/esm/identifier.js +266 -0
- package/dist/esm/index.js +5186 -0
- package/dist/esm/localization/index.js +742 -0
- package/dist/esm/localization/locale.js +742 -0
- package/dist/esm/localization/localization.js +4 -0
- package/dist/esm/lock.js +46 -0
- package/dist/esm/network/connection.js +293 -0
- package/dist/esm/network/encryption.js +986 -0
- package/dist/esm/network/frame-transport.js +531 -0
- package/dist/esm/network/index.js +1627 -0
- package/dist/esm/network/network.js +1368 -0
- package/dist/esm/network/packet/index.js +485 -0
- package/dist/esm/network/packet/packet-types.js +486 -0
- package/dist/esm/network/packet/packet.js +126 -0
- package/dist/esm/network/websocket-transport.js +493 -0
- package/dist/esm/omu.js +4945 -0
- package/dist/esm/result.js +68 -0
- package/dist/esm/serialize/bytebuffer.js +384 -0
- package/dist/esm/serialize/index.js +471 -0
- package/dist/esm/serialize/serializer.js +97 -0
- package/dist/esm/token.js +42 -0
- package/dist/esm/version.js +11 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +4 -1
- package/CHANGELOG.md +0 -1837
- package/src/api/asset/extension.ts +0 -193
- package/src/api/asset/index.ts +0 -5
- package/src/api/dashboard/extension.ts +0 -651
- package/src/api/dashboard/index.ts +0 -38
- package/src/api/dashboard/packets.ts +0 -126
- package/src/api/endpoint/endpoint.ts +0 -56
- package/src/api/endpoint/extension.ts +0 -133
- package/src/api/endpoint/packets.ts +0 -176
- package/src/api/extension-registry.ts +0 -17
- package/src/api/extension.ts +0 -19
- package/src/api/http/extension.ts +0 -401
- package/src/api/http/http.ts +0 -79
- package/src/api/http/websocket.ts +0 -283
- package/src/api/i18n/extension.ts +0 -65
- package/src/api/logger/extension.ts +0 -75
- package/src/api/logger/index.ts +0 -4
- package/src/api/logger/packets.ts +0 -38
- package/src/api/permission/extension.ts +0 -107
- package/src/api/permission/permission.ts +0 -53
- package/src/api/plugin/extension.ts +0 -100
- package/src/api/registry/extension.ts +0 -326
- package/src/api/registry/packets.ts +0 -64
- package/src/api/server/extension.ts +0 -155
- package/src/api/server/index.ts +0 -11
- package/src/api/session/extension.ts +0 -205
- package/src/api/session/index.ts +0 -7
- package/src/api/signal/extension.ts +0 -125
- package/src/api/signal/packets.ts +0 -61
- package/src/api/signal/signal.ts +0 -67
- package/src/api/table/extension.ts +0 -554
- package/src/api/table/packets.ts +0 -252
- package/src/api/table/table.ts +0 -113
- package/src/app.ts +0 -95
- package/src/const.ts +0 -2
- package/src/errors.ts +0 -70
- package/src/event/index.ts +0 -18
- package/src/helper.ts +0 -16
- package/src/identifier.ts +0 -256
- package/src/index.ts +0 -87
- package/src/localization/locale.ts +0 -737
- package/src/lock.ts +0 -43
- package/src/network/connection.ts +0 -45
- package/src/network/encryption.ts +0 -221
- package/src/network/frame-transport.ts +0 -186
- package/src/network/network.ts +0 -322
- package/src/network/packet/packet-types.ts +0 -164
- package/src/network/packet/packet.ts +0 -55
- package/src/network/websocket-transport.ts +0 -123
- package/src/omu.ts +0 -156
- package/src/result.ts +0 -78
- package/src/serialize/bytebuffer.ts +0 -432
- package/src/serialize/serializer.ts +0 -149
- package/src/token.ts +0 -39
- package/src/version.ts +0 -2
- package/tsconfig.json +0 -18
- /package/{src/address.ts → dist/dts/address.d.ts} +0 -0
- /package/{src/api/signal/index.ts → dist/dts/api/signal/index.d.ts} +0 -0
- /package/{src/serialize/index.ts → dist/dts/serialize/index.d.ts} +0 -0
|
@@ -0,0 +1,904 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/app.ts
|
|
3
|
+
class App {
|
|
4
|
+
id;
|
|
5
|
+
type;
|
|
6
|
+
parentId;
|
|
7
|
+
version;
|
|
8
|
+
url;
|
|
9
|
+
metadata;
|
|
10
|
+
dependencies;
|
|
11
|
+
constructor(id, options) {
|
|
12
|
+
this.id = Identifier.from(id);
|
|
13
|
+
this.parentId = Identifier.fromOptional(options.parentId);
|
|
14
|
+
this.version = options.version;
|
|
15
|
+
this.url = options.url;
|
|
16
|
+
this.metadata = options.metadata;
|
|
17
|
+
this.type = options.type ?? "app";
|
|
18
|
+
this.dependencies = options.dependencies ?? {};
|
|
19
|
+
}
|
|
20
|
+
static deserialize(info) {
|
|
21
|
+
const id = Identifier.fromKey(info.id);
|
|
22
|
+
return new App(id, {
|
|
23
|
+
parentId: Identifier.fromOptional(info.parent_id),
|
|
24
|
+
version: info.version,
|
|
25
|
+
url: info.url,
|
|
26
|
+
type: info.type,
|
|
27
|
+
metadata: info.metadata,
|
|
28
|
+
dependencies: info.dependencies ?? {}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
static serialize(data) {
|
|
32
|
+
return {
|
|
33
|
+
id: data.id.key(),
|
|
34
|
+
type: data.type,
|
|
35
|
+
parent_id: data.parentId?.key(),
|
|
36
|
+
version: data.version,
|
|
37
|
+
url: data.url,
|
|
38
|
+
metadata: data.metadata,
|
|
39
|
+
dependencies: data.dependencies
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
join(...paths) {
|
|
43
|
+
return new App(this.id.join(...paths), {
|
|
44
|
+
parentId: this.parentId,
|
|
45
|
+
version: this.version,
|
|
46
|
+
url: this.url,
|
|
47
|
+
type: this.type,
|
|
48
|
+
metadata: this.metadata,
|
|
49
|
+
dependencies: this.dependencies
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// src/identifier.ts
|
|
55
|
+
var NAMESPACE_REGEX = /^(\.[^/:.]|[\w-])+$/;
|
|
56
|
+
var NAME_REGEX = /^[^/:]+$/;
|
|
57
|
+
|
|
58
|
+
class Identifier {
|
|
59
|
+
namespace;
|
|
60
|
+
path;
|
|
61
|
+
constructor(namespace, ...path) {
|
|
62
|
+
Identifier.validate(namespace, path);
|
|
63
|
+
this.namespace = namespace;
|
|
64
|
+
this.path = path;
|
|
65
|
+
}
|
|
66
|
+
static serialize(identifier) {
|
|
67
|
+
return identifier.key();
|
|
68
|
+
}
|
|
69
|
+
static deserialize(json) {
|
|
70
|
+
return Identifier.fromJson(json);
|
|
71
|
+
}
|
|
72
|
+
static from(id) {
|
|
73
|
+
if (id instanceof Identifier) {
|
|
74
|
+
return id;
|
|
75
|
+
} else if (id instanceof App) {
|
|
76
|
+
return id.id;
|
|
77
|
+
} else if (typeof id === "string") {
|
|
78
|
+
return Identifier.fromKey(id);
|
|
79
|
+
} else {
|
|
80
|
+
const idCasted = id;
|
|
81
|
+
if (typeof idCasted.namespace === "string" && Array.isArray(idCasted.path) && idCasted.path.every((p) => typeof p === "string")) {
|
|
82
|
+
return new Identifier(idCasted.namespace, ...idCasted.path);
|
|
83
|
+
}
|
|
84
|
+
const idWithId = id;
|
|
85
|
+
if (typeof idWithId.id !== "undefined") {
|
|
86
|
+
return Identifier.from(idWithId.id);
|
|
87
|
+
}
|
|
88
|
+
throw new Error(`Cannot convert to Identifier: ${id}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
static fromOptional(id) {
|
|
92
|
+
if (id === undefined || id === null) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
return Identifier.from(id);
|
|
96
|
+
}
|
|
97
|
+
static validate(namespace, path) {
|
|
98
|
+
if (!namespace) {
|
|
99
|
+
throw new Error("Invalid namespace: Namespace cannot be empty");
|
|
100
|
+
}
|
|
101
|
+
if (path.length === 0) {
|
|
102
|
+
throw new Error("Invalid path: Path must have at least one name");
|
|
103
|
+
}
|
|
104
|
+
if (!NAMESPACE_REGEX.test(namespace)) {
|
|
105
|
+
throw new Error(`Invalid namespace: Namespace must match ${NAMESPACE_REGEX}`);
|
|
106
|
+
}
|
|
107
|
+
for (const name of path) {
|
|
108
|
+
if (!NAME_REGEX.test(name)) {
|
|
109
|
+
throw new Error(`Invalid path: Name must match ${NAME_REGEX} but got ${name}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
static format(namespace, ...path) {
|
|
114
|
+
Identifier.validate(namespace, path);
|
|
115
|
+
return `${namespace}:${path.join("/")}`;
|
|
116
|
+
}
|
|
117
|
+
static fromKey(key) {
|
|
118
|
+
const separator = key.indexOf(":");
|
|
119
|
+
if (separator === -1) {
|
|
120
|
+
throw new Error(`Invalid key: No separator found in ${key}`);
|
|
121
|
+
}
|
|
122
|
+
if (key.indexOf(":", separator + 1) !== -1) {
|
|
123
|
+
throw new Error(`Invalid key: Multiple separators found in ${key}`);
|
|
124
|
+
}
|
|
125
|
+
const namespace = key.slice(0, separator);
|
|
126
|
+
const path = key.slice(separator + 1);
|
|
127
|
+
if (!namespace || !path) {
|
|
128
|
+
throw new Error("Invalid key: Namespace and path cannot be empty");
|
|
129
|
+
}
|
|
130
|
+
return new Identifier(namespace, ...path.split("/"));
|
|
131
|
+
}
|
|
132
|
+
static fromUrl(url) {
|
|
133
|
+
const parsedUrl = new URL(url);
|
|
134
|
+
const namespace = Identifier.namespaceFromUrl(parsedUrl.href);
|
|
135
|
+
const path = parsedUrl.pathname.slice(1).split("/");
|
|
136
|
+
return new Identifier(namespace, ...path);
|
|
137
|
+
}
|
|
138
|
+
static namespaceFromUrl(url) {
|
|
139
|
+
const parsed = new URL(url);
|
|
140
|
+
return parsed.hostname.split(".").reverse().join(".");
|
|
141
|
+
}
|
|
142
|
+
get base() {
|
|
143
|
+
return new Identifier(this.namespace, this.path[0]);
|
|
144
|
+
}
|
|
145
|
+
toJson() {
|
|
146
|
+
return this.key();
|
|
147
|
+
}
|
|
148
|
+
static fromJson(json) {
|
|
149
|
+
return Identifier.fromKey(json);
|
|
150
|
+
}
|
|
151
|
+
key() {
|
|
152
|
+
return Identifier.format(this.namespace, ...this.path);
|
|
153
|
+
}
|
|
154
|
+
isEqual(other) {
|
|
155
|
+
return this.key() === other.key();
|
|
156
|
+
}
|
|
157
|
+
isNamespaceEqual(other) {
|
|
158
|
+
return this.namespace === other.namespace;
|
|
159
|
+
}
|
|
160
|
+
isSubpathOf(other) {
|
|
161
|
+
if (this.namespace !== other.namespace) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
if (this.path.length < other.path.length) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
for (let i = 0;i < other.path.length; i++) {
|
|
168
|
+
if (this.path[i] !== other.path[i]) {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
join(...path) {
|
|
175
|
+
return new Identifier(this.namespace, ...this.path, ...path);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
class IdentifierMap {
|
|
180
|
+
map = new Map;
|
|
181
|
+
constructor(entries) {
|
|
182
|
+
if (!entries)
|
|
183
|
+
return;
|
|
184
|
+
for (const [id, value] of entries) {
|
|
185
|
+
this.map.set(id.key(), value);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
get size() {
|
|
189
|
+
return this.map.size;
|
|
190
|
+
}
|
|
191
|
+
set(identifier, value) {
|
|
192
|
+
this.map.set(identifier.key(), value);
|
|
193
|
+
}
|
|
194
|
+
get(identifier) {
|
|
195
|
+
return this.map.get(identifier.key());
|
|
196
|
+
}
|
|
197
|
+
has(identifier) {
|
|
198
|
+
return this.map.has(identifier.key());
|
|
199
|
+
}
|
|
200
|
+
delete(identifier) {
|
|
201
|
+
this.map.delete(identifier.key());
|
|
202
|
+
}
|
|
203
|
+
clear() {
|
|
204
|
+
this.map.clear();
|
|
205
|
+
}
|
|
206
|
+
*keys() {
|
|
207
|
+
for (const key of this.map.keys()) {
|
|
208
|
+
yield Identifier.fromKey(key);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
values() {
|
|
212
|
+
return this.map.values();
|
|
213
|
+
}
|
|
214
|
+
*entries() {
|
|
215
|
+
for (const [key, value] of this.map.entries()) {
|
|
216
|
+
yield [Identifier.fromKey(key), value];
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
[Symbol.iterator]() {
|
|
220
|
+
return this.entries();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
class IdentifierSet {
|
|
225
|
+
set = new Set;
|
|
226
|
+
get size() {
|
|
227
|
+
return this.set.size;
|
|
228
|
+
}
|
|
229
|
+
add(identifier) {
|
|
230
|
+
this.set.add(identifier.key());
|
|
231
|
+
}
|
|
232
|
+
has(identifier) {
|
|
233
|
+
return this.set.has(identifier.key());
|
|
234
|
+
}
|
|
235
|
+
delete(identifier) {
|
|
236
|
+
this.set.delete(identifier.key());
|
|
237
|
+
}
|
|
238
|
+
clear() {
|
|
239
|
+
this.set.clear();
|
|
240
|
+
}
|
|
241
|
+
*keys() {
|
|
242
|
+
for (const key of this.set.keys()) {
|
|
243
|
+
yield Identifier.fromKey(key);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
values() {
|
|
247
|
+
return this.keys();
|
|
248
|
+
}
|
|
249
|
+
*entries() {
|
|
250
|
+
for (const key of this.set.keys()) {
|
|
251
|
+
const identifier = Identifier.fromKey(key);
|
|
252
|
+
yield [identifier, identifier];
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
[Symbol.iterator]() {
|
|
256
|
+
return this.entries();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// src/const.ts
|
|
261
|
+
var textEncoder = new TextEncoder;
|
|
262
|
+
var textDecoder = new TextDecoder;
|
|
263
|
+
|
|
264
|
+
// src/serialize/bytebuffer.ts
|
|
265
|
+
class Flags {
|
|
266
|
+
value;
|
|
267
|
+
length;
|
|
268
|
+
constructor(options) {
|
|
269
|
+
this.value = options.value ?? 0;
|
|
270
|
+
this.length = options.length ?? 32;
|
|
271
|
+
}
|
|
272
|
+
has(position) {
|
|
273
|
+
return (this.value & 1 << position) !== 0;
|
|
274
|
+
}
|
|
275
|
+
get(position) {
|
|
276
|
+
return (this.value & 1 << position) !== 0;
|
|
277
|
+
}
|
|
278
|
+
ifSet(position, callback) {
|
|
279
|
+
if (this.has(position)) {
|
|
280
|
+
return callback();
|
|
281
|
+
}
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
set(position, value) {
|
|
285
|
+
if (value) {
|
|
286
|
+
this.value |= 1 << position;
|
|
287
|
+
} else {
|
|
288
|
+
this.value &= ~(1 << position);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
write(writer) {
|
|
292
|
+
const bits = new Uint8Array((this.length + 7) / 8);
|
|
293
|
+
for (let i = 0;i < bits.length; i++) {
|
|
294
|
+
bits[i] = this.value >> i * 8 & 255;
|
|
295
|
+
}
|
|
296
|
+
writer.write(bits);
|
|
297
|
+
}
|
|
298
|
+
static read(reader, length) {
|
|
299
|
+
let value = 0;
|
|
300
|
+
for (let i = 0;i < (length + 7) / 8; i++) {
|
|
301
|
+
value |= reader.readUint8() << i * 8;
|
|
302
|
+
}
|
|
303
|
+
return new Flags({ value, length });
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
function readFloat16(dataView, offset) {
|
|
307
|
+
const sign = dataView.getUint16(offset) & 32768 ? -1 : 1;
|
|
308
|
+
const exponent = (dataView.getUint16(offset) & 31744) >> 10;
|
|
309
|
+
const mantissa = dataView.getUint16(offset) & 1023;
|
|
310
|
+
if (exponent === 0 && mantissa === 0) {
|
|
311
|
+
return 0;
|
|
312
|
+
} else if (exponent === 31) {
|
|
313
|
+
return mantissa === 0 ? Infinity * sign : NaN;
|
|
314
|
+
} else {
|
|
315
|
+
const normalizedExponent = exponent - 15;
|
|
316
|
+
const normalizedMantissa = mantissa / 1024;
|
|
317
|
+
return sign * Math.pow(2, normalizedExponent) * (1 + normalizedMantissa);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
function writeFloat16(dataView, offset, value) {
|
|
321
|
+
if (value === 0) {
|
|
322
|
+
dataView.setUint16(offset, 0);
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
const sign = value < 0 ? 1 : 0;
|
|
326
|
+
value = Math.abs(value);
|
|
327
|
+
if (!isFinite(value)) {
|
|
328
|
+
dataView.setUint16(offset, 31744 | sign << 15);
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
const exponent = Math.floor(Math.log2(value));
|
|
332
|
+
const mantissa = value / Math.pow(2, exponent) - 1;
|
|
333
|
+
const normalizedExponent = exponent + 15;
|
|
334
|
+
const normalizedMantissa = Math.round(mantissa * 1024);
|
|
335
|
+
if (normalizedExponent <= 0) {
|
|
336
|
+
dataView.setUint16(offset, sign << 15);
|
|
337
|
+
} else if (normalizedExponent >= 31) {
|
|
338
|
+
dataView.setUint16(offset, 31744 | sign << 15);
|
|
339
|
+
} else {
|
|
340
|
+
dataView.setUint16(offset, sign << 15 | normalizedExponent << 10 | normalizedMantissa);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
class ByteWriter {
|
|
345
|
+
dataView;
|
|
346
|
+
buffer;
|
|
347
|
+
offset = 0;
|
|
348
|
+
finished = false;
|
|
349
|
+
constructor(init, offset) {
|
|
350
|
+
this.offset = offset ?? 0;
|
|
351
|
+
this.buffer = init ?? new ArrayBuffer(1024);
|
|
352
|
+
this.dataView = new DataView(this.buffer);
|
|
353
|
+
}
|
|
354
|
+
static fromUint8Array(buffer) {
|
|
355
|
+
const arrayBuffer = new ArrayBuffer(buffer.byteLength);
|
|
356
|
+
const uint8Array = new Uint8Array(arrayBuffer);
|
|
357
|
+
uint8Array.set(new Uint8Array(buffer));
|
|
358
|
+
return new ByteWriter(arrayBuffer, buffer.byteLength);
|
|
359
|
+
}
|
|
360
|
+
allocate(length) {
|
|
361
|
+
if (this.offset + length > this.buffer.byteLength) {
|
|
362
|
+
const newByteLength = Math.max(this.buffer.byteLength * 2, this.offset + length);
|
|
363
|
+
const newBuffer = new ArrayBuffer(newByteLength);
|
|
364
|
+
new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));
|
|
365
|
+
this.buffer = newBuffer;
|
|
366
|
+
this.dataView = new DataView(this.buffer);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
write(data) {
|
|
370
|
+
if (this.finished) {
|
|
371
|
+
throw new Error("Buffer already finished");
|
|
372
|
+
}
|
|
373
|
+
this.allocate(data.length);
|
|
374
|
+
new Uint8Array(this.buffer).set(data, this.offset);
|
|
375
|
+
this.offset += data.length;
|
|
376
|
+
return this;
|
|
377
|
+
}
|
|
378
|
+
writeBoolean(value) {
|
|
379
|
+
this.allocate(1);
|
|
380
|
+
this.dataView.setInt8(this.offset, value ? 1 : 0);
|
|
381
|
+
this.offset += 1;
|
|
382
|
+
return this;
|
|
383
|
+
}
|
|
384
|
+
writeInt8(value) {
|
|
385
|
+
this.allocate(1);
|
|
386
|
+
this.dataView.setInt8(this.offset, value);
|
|
387
|
+
this.offset += 1;
|
|
388
|
+
return this;
|
|
389
|
+
}
|
|
390
|
+
writeUint8(value) {
|
|
391
|
+
this.allocate(1);
|
|
392
|
+
this.dataView.setUint8(this.offset, value);
|
|
393
|
+
this.offset += 1;
|
|
394
|
+
return this;
|
|
395
|
+
}
|
|
396
|
+
writeInt16(value) {
|
|
397
|
+
this.allocate(2);
|
|
398
|
+
this.dataView.setInt16(this.offset, value);
|
|
399
|
+
this.offset += 2;
|
|
400
|
+
return this;
|
|
401
|
+
}
|
|
402
|
+
writeUint16(value) {
|
|
403
|
+
this.allocate(2);
|
|
404
|
+
this.dataView.setUint16(this.offset, value);
|
|
405
|
+
this.offset += 2;
|
|
406
|
+
return this;
|
|
407
|
+
}
|
|
408
|
+
writeInt32(value) {
|
|
409
|
+
this.allocate(4);
|
|
410
|
+
this.dataView.setInt32(this.offset, value);
|
|
411
|
+
this.offset += 4;
|
|
412
|
+
return this;
|
|
413
|
+
}
|
|
414
|
+
writeUint32(value) {
|
|
415
|
+
this.allocate(4);
|
|
416
|
+
this.dataView.setUint32(this.offset, value);
|
|
417
|
+
this.offset += 4;
|
|
418
|
+
return this;
|
|
419
|
+
}
|
|
420
|
+
writeInt64(value) {
|
|
421
|
+
this.allocate(8);
|
|
422
|
+
this.dataView.setBigInt64(this.offset, value);
|
|
423
|
+
this.offset += 8;
|
|
424
|
+
return this;
|
|
425
|
+
}
|
|
426
|
+
writeUint64(value) {
|
|
427
|
+
this.allocate(8);
|
|
428
|
+
this.dataView.setBigUint64(this.offset, value);
|
|
429
|
+
this.offset += 8;
|
|
430
|
+
return this;
|
|
431
|
+
}
|
|
432
|
+
writeULEB128(value) {
|
|
433
|
+
if (value < 0) {
|
|
434
|
+
throw new Error("Value must be non-negative");
|
|
435
|
+
}
|
|
436
|
+
while (value > 127) {
|
|
437
|
+
this.allocate(1);
|
|
438
|
+
this.dataView.setUint8(this.offset, value & 127 | 128);
|
|
439
|
+
this.offset += 1;
|
|
440
|
+
value >>= 7;
|
|
441
|
+
}
|
|
442
|
+
this.allocate(1);
|
|
443
|
+
this.dataView.setUint8(this.offset, value & 127);
|
|
444
|
+
this.offset += 1;
|
|
445
|
+
return this;
|
|
446
|
+
}
|
|
447
|
+
writeFloat16(value) {
|
|
448
|
+
this.allocate(2);
|
|
449
|
+
writeFloat16(this.dataView, this.offset, value);
|
|
450
|
+
this.offset += 2;
|
|
451
|
+
return this;
|
|
452
|
+
}
|
|
453
|
+
writeFloat32(value) {
|
|
454
|
+
this.allocate(4);
|
|
455
|
+
this.dataView.setFloat32(this.offset, value);
|
|
456
|
+
this.offset += 4;
|
|
457
|
+
return this;
|
|
458
|
+
}
|
|
459
|
+
writeFloat64(value) {
|
|
460
|
+
this.allocate(4);
|
|
461
|
+
this.dataView.setFloat64(this.offset, value);
|
|
462
|
+
this.offset += 4;
|
|
463
|
+
return this;
|
|
464
|
+
}
|
|
465
|
+
writeUint8Array(value) {
|
|
466
|
+
this.writeULEB128(value.byteLength);
|
|
467
|
+
this.write(value);
|
|
468
|
+
return this;
|
|
469
|
+
}
|
|
470
|
+
writeString(value) {
|
|
471
|
+
this.writeUint8Array(textEncoder.encode(value));
|
|
472
|
+
return this;
|
|
473
|
+
}
|
|
474
|
+
writeJSON(value) {
|
|
475
|
+
this.writeString(JSON.stringify(value));
|
|
476
|
+
return this;
|
|
477
|
+
}
|
|
478
|
+
writeFlags(flags) {
|
|
479
|
+
flags.write(this);
|
|
480
|
+
return this;
|
|
481
|
+
}
|
|
482
|
+
finish() {
|
|
483
|
+
if (this.finished) {
|
|
484
|
+
throw new Error("Buffer already finished");
|
|
485
|
+
}
|
|
486
|
+
this.finished = true;
|
|
487
|
+
return new Uint8Array(this.buffer, 0, this.offset);
|
|
488
|
+
}
|
|
489
|
+
toUint8Array() {
|
|
490
|
+
return new Uint8Array(this.buffer, 0, this.offset);
|
|
491
|
+
}
|
|
492
|
+
toArrayBuffer() {
|
|
493
|
+
return this.buffer.slice(0, this.offset);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
class ByteReader {
|
|
498
|
+
dataView;
|
|
499
|
+
offset;
|
|
500
|
+
finished;
|
|
501
|
+
constructor(data) {
|
|
502
|
+
this.dataView = data;
|
|
503
|
+
this.offset = 0;
|
|
504
|
+
this.finished = false;
|
|
505
|
+
}
|
|
506
|
+
static fromUint8Array(buffer) {
|
|
507
|
+
const arrayBuffer = new ArrayBuffer(buffer.byteLength);
|
|
508
|
+
const uint8Array = new Uint8Array(arrayBuffer);
|
|
509
|
+
uint8Array.set(new Uint8Array(buffer));
|
|
510
|
+
const dataView = new DataView(arrayBuffer);
|
|
511
|
+
return new ByteReader(dataView);
|
|
512
|
+
}
|
|
513
|
+
static fromArrayBuffer(buffer) {
|
|
514
|
+
const dataView = new DataView(buffer);
|
|
515
|
+
return new ByteReader(dataView);
|
|
516
|
+
}
|
|
517
|
+
static async fromBlob(blob) {
|
|
518
|
+
const arrayBuffer = await blob.arrayBuffer();
|
|
519
|
+
const dataView = new DataView(arrayBuffer);
|
|
520
|
+
return new ByteReader(dataView);
|
|
521
|
+
}
|
|
522
|
+
read(size) {
|
|
523
|
+
if (this.finished) {
|
|
524
|
+
throw new Error("Buffer already finished");
|
|
525
|
+
}
|
|
526
|
+
if (size < 0) {
|
|
527
|
+
throw new Error("Size must be positive");
|
|
528
|
+
}
|
|
529
|
+
if (this.offset + size > this.dataView.byteLength) {
|
|
530
|
+
throw new Error("Buffer not fully read");
|
|
531
|
+
}
|
|
532
|
+
const value = new Uint8Array(this.dataView.buffer, this.offset, size);
|
|
533
|
+
this.offset += size;
|
|
534
|
+
return value;
|
|
535
|
+
}
|
|
536
|
+
readBoolean() {
|
|
537
|
+
const value = this.dataView.getInt8(this.offset);
|
|
538
|
+
this.offset += 1;
|
|
539
|
+
return value !== 0;
|
|
540
|
+
}
|
|
541
|
+
readInt8() {
|
|
542
|
+
const value = this.dataView.getInt8(this.offset);
|
|
543
|
+
this.offset += 1;
|
|
544
|
+
return value;
|
|
545
|
+
}
|
|
546
|
+
readUint8() {
|
|
547
|
+
const value = this.dataView.getUint8(this.offset);
|
|
548
|
+
this.offset += 1;
|
|
549
|
+
return value;
|
|
550
|
+
}
|
|
551
|
+
readInt16() {
|
|
552
|
+
const value = this.dataView.getInt16(this.offset);
|
|
553
|
+
this.offset += 2;
|
|
554
|
+
return value;
|
|
555
|
+
}
|
|
556
|
+
readUint16() {
|
|
557
|
+
const value = this.dataView.getUint16(this.offset);
|
|
558
|
+
this.offset += 2;
|
|
559
|
+
return value;
|
|
560
|
+
}
|
|
561
|
+
readInt32() {
|
|
562
|
+
const value = this.dataView.getInt32(this.offset);
|
|
563
|
+
this.offset += 4;
|
|
564
|
+
return value;
|
|
565
|
+
}
|
|
566
|
+
readUint32() {
|
|
567
|
+
const value = this.dataView.getUint32(this.offset);
|
|
568
|
+
this.offset += 4;
|
|
569
|
+
return value;
|
|
570
|
+
}
|
|
571
|
+
readInt64() {
|
|
572
|
+
const value = this.dataView.getBigInt64(this.offset);
|
|
573
|
+
this.offset += 8;
|
|
574
|
+
return value;
|
|
575
|
+
}
|
|
576
|
+
readUint64() {
|
|
577
|
+
const value = this.dataView.getBigUint64(this.offset);
|
|
578
|
+
this.offset += 8;
|
|
579
|
+
return value;
|
|
580
|
+
}
|
|
581
|
+
readULEB128() {
|
|
582
|
+
let value = 0;
|
|
583
|
+
let shift = 0;
|
|
584
|
+
let byte;
|
|
585
|
+
do {
|
|
586
|
+
if (this.offset >= this.dataView.byteLength) {
|
|
587
|
+
throw new Error("Buffer not fully read");
|
|
588
|
+
}
|
|
589
|
+
byte = this.dataView.getUint8(this.offset);
|
|
590
|
+
this.offset += 1;
|
|
591
|
+
value |= (byte & 127) << shift;
|
|
592
|
+
shift += 7;
|
|
593
|
+
} while ((byte & 128) !== 0);
|
|
594
|
+
return value;
|
|
595
|
+
}
|
|
596
|
+
readFloat16() {
|
|
597
|
+
const value = readFloat16(this.dataView, this.offset);
|
|
598
|
+
this.offset += 2;
|
|
599
|
+
return value;
|
|
600
|
+
}
|
|
601
|
+
readFloat32() {
|
|
602
|
+
const value = this.dataView.getFloat32(this.offset);
|
|
603
|
+
this.offset += 4;
|
|
604
|
+
return value;
|
|
605
|
+
}
|
|
606
|
+
readFloat64() {
|
|
607
|
+
const value = this.dataView.getFloat64(this.offset);
|
|
608
|
+
this.offset += 8;
|
|
609
|
+
return value;
|
|
610
|
+
}
|
|
611
|
+
readUint8Array() {
|
|
612
|
+
const length = this.readULEB128();
|
|
613
|
+
return this.read(length);
|
|
614
|
+
}
|
|
615
|
+
readString() {
|
|
616
|
+
const byteArray = this.readUint8Array();
|
|
617
|
+
return textDecoder.decode(byteArray);
|
|
618
|
+
}
|
|
619
|
+
readJSON() {
|
|
620
|
+
return JSON.parse(this.readString());
|
|
621
|
+
}
|
|
622
|
+
readFlags(length) {
|
|
623
|
+
return Flags.read(this, length);
|
|
624
|
+
}
|
|
625
|
+
finish() {
|
|
626
|
+
if (this.finished) {
|
|
627
|
+
throw new Error("Buffer already finished");
|
|
628
|
+
}
|
|
629
|
+
this.finished = true;
|
|
630
|
+
if (this.offset !== this.dataView.byteLength) {
|
|
631
|
+
throw new Error("Buffer not fully read");
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
// src/api/table/packets.ts
|
|
636
|
+
class TablePacket {
|
|
637
|
+
id;
|
|
638
|
+
constructor(id) {
|
|
639
|
+
this.id = id;
|
|
640
|
+
}
|
|
641
|
+
static serialize(packet) {
|
|
642
|
+
const writer = new ByteWriter;
|
|
643
|
+
writer.writeString(packet.id.key());
|
|
644
|
+
return writer.finish();
|
|
645
|
+
}
|
|
646
|
+
static deserialize(data) {
|
|
647
|
+
const reader = ByteReader.fromUint8Array(data);
|
|
648
|
+
const id = Identifier.fromKey(reader.readString());
|
|
649
|
+
return new TablePacket(id);
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
class TableItemsPacket {
|
|
654
|
+
id;
|
|
655
|
+
items;
|
|
656
|
+
constructor(id, items) {
|
|
657
|
+
this.id = id;
|
|
658
|
+
this.items = items;
|
|
659
|
+
}
|
|
660
|
+
static serialize(packet) {
|
|
661
|
+
const writer = new ByteWriter;
|
|
662
|
+
writer.writeString(packet.id.key());
|
|
663
|
+
writer.writeULEB128(Object.keys(packet.items).length);
|
|
664
|
+
for (const [key, value] of Object.entries(packet.items)) {
|
|
665
|
+
writer.writeString(key);
|
|
666
|
+
writer.writeUint8Array(value);
|
|
667
|
+
}
|
|
668
|
+
return writer.finish();
|
|
669
|
+
}
|
|
670
|
+
static deserialize(data) {
|
|
671
|
+
const reader = ByteReader.fromUint8Array(data);
|
|
672
|
+
const id = Identifier.fromKey(reader.readString());
|
|
673
|
+
const count = reader.readULEB128();
|
|
674
|
+
const items = {};
|
|
675
|
+
for (let i = 0;i < count; i++) {
|
|
676
|
+
const key = reader.readString();
|
|
677
|
+
const value = reader.readUint8Array();
|
|
678
|
+
items[key] = value;
|
|
679
|
+
}
|
|
680
|
+
return new TableItemsPacket(id, items);
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
class TableKeysPacket {
|
|
685
|
+
id;
|
|
686
|
+
keys;
|
|
687
|
+
constructor(id, keys) {
|
|
688
|
+
this.id = id;
|
|
689
|
+
this.keys = keys;
|
|
690
|
+
}
|
|
691
|
+
static serialize(packet) {
|
|
692
|
+
const writer = new ByteWriter;
|
|
693
|
+
writer.writeString(packet.id.key());
|
|
694
|
+
writer.writeULEB128(packet.keys.length);
|
|
695
|
+
for (const key of packet.keys) {
|
|
696
|
+
writer.writeString(key);
|
|
697
|
+
}
|
|
698
|
+
return writer.finish();
|
|
699
|
+
}
|
|
700
|
+
static deserialize(data) {
|
|
701
|
+
const reader = ByteReader.fromUint8Array(data);
|
|
702
|
+
const id = Identifier.fromKey(reader.readString());
|
|
703
|
+
const count = reader.readULEB128();
|
|
704
|
+
const keys = [];
|
|
705
|
+
for (let i = 0;i < count; i++) {
|
|
706
|
+
keys.push(reader.readString());
|
|
707
|
+
}
|
|
708
|
+
return new TableKeysPacket(id, keys);
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
class TableProxyPacket {
|
|
713
|
+
id;
|
|
714
|
+
items;
|
|
715
|
+
key;
|
|
716
|
+
constructor(id, items, key) {
|
|
717
|
+
this.id = id;
|
|
718
|
+
this.items = items;
|
|
719
|
+
this.key = key;
|
|
720
|
+
}
|
|
721
|
+
static serialize(packet) {
|
|
722
|
+
const writer = new ByteWriter;
|
|
723
|
+
writer.writeString(packet.id.key());
|
|
724
|
+
writer.writeULEB128(packet.key);
|
|
725
|
+
writer.writeULEB128(Object.keys(packet.items).length);
|
|
726
|
+
for (const [key, value] of Object.entries(packet.items)) {
|
|
727
|
+
writer.writeString(key);
|
|
728
|
+
writer.writeUint8Array(value);
|
|
729
|
+
}
|
|
730
|
+
return writer.finish();
|
|
731
|
+
}
|
|
732
|
+
static deserialize(data) {
|
|
733
|
+
const reader = ByteReader.fromUint8Array(data);
|
|
734
|
+
const id = Identifier.fromKey(reader.readString());
|
|
735
|
+
const key = reader.readULEB128();
|
|
736
|
+
const count = reader.readULEB128();
|
|
737
|
+
const items = {};
|
|
738
|
+
for (let i = 0;i < count; i++) {
|
|
739
|
+
const key2 = reader.readString();
|
|
740
|
+
const value = reader.readUint8Array();
|
|
741
|
+
items[key2] = value;
|
|
742
|
+
}
|
|
743
|
+
return new TableProxyPacket(id, items, key);
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
class TableFetchPacket {
|
|
748
|
+
id;
|
|
749
|
+
limit;
|
|
750
|
+
backward;
|
|
751
|
+
cursor;
|
|
752
|
+
constructor(id, limit, backward = false, cursor = null) {
|
|
753
|
+
this.id = id;
|
|
754
|
+
this.limit = limit;
|
|
755
|
+
this.backward = backward;
|
|
756
|
+
this.cursor = cursor;
|
|
757
|
+
}
|
|
758
|
+
static serialize(packet) {
|
|
759
|
+
const writer = new ByteWriter;
|
|
760
|
+
writer.writeString(packet.id.key());
|
|
761
|
+
writer.writeULEB128(packet.limit);
|
|
762
|
+
const flags = new Flags({ length: 2 });
|
|
763
|
+
flags.set(0, packet.backward);
|
|
764
|
+
flags.set(1, packet.cursor !== null);
|
|
765
|
+
writer.writeFlags(flags);
|
|
766
|
+
if (packet.cursor !== null) {
|
|
767
|
+
writer.writeString(packet.cursor);
|
|
768
|
+
}
|
|
769
|
+
return writer.finish();
|
|
770
|
+
}
|
|
771
|
+
static deserialize(data) {
|
|
772
|
+
const reader = ByteReader.fromUint8Array(data);
|
|
773
|
+
const id = Identifier.fromKey(reader.readString());
|
|
774
|
+
const limit = reader.readULEB128();
|
|
775
|
+
const flags = reader.readFlags(2);
|
|
776
|
+
const backward = flags.get(0);
|
|
777
|
+
const cursor = flags.ifSet(1, () => reader.readString());
|
|
778
|
+
return new TableFetchPacket(id, limit, backward, cursor);
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
class TableFetchRangePacket {
|
|
783
|
+
id;
|
|
784
|
+
start;
|
|
785
|
+
end;
|
|
786
|
+
constructor(id, start, end) {
|
|
787
|
+
this.id = id;
|
|
788
|
+
this.start = start;
|
|
789
|
+
this.end = end;
|
|
790
|
+
}
|
|
791
|
+
static serialize(packet) {
|
|
792
|
+
const writer = new ByteWriter;
|
|
793
|
+
writer.writeString(packet.id.key());
|
|
794
|
+
writer.writeString(packet.start);
|
|
795
|
+
writer.writeString(packet.end);
|
|
796
|
+
return writer.finish();
|
|
797
|
+
}
|
|
798
|
+
static deserialize(data) {
|
|
799
|
+
const reader = ByteReader.fromUint8Array(data);
|
|
800
|
+
const id = Identifier.fromKey(reader.readString());
|
|
801
|
+
const start = reader.readString();
|
|
802
|
+
const end = reader.readString();
|
|
803
|
+
return new TableFetchRangePacket(id, start, end);
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
class SetConfigPacket {
|
|
808
|
+
id;
|
|
809
|
+
config;
|
|
810
|
+
constructor(id, config) {
|
|
811
|
+
this.id = id;
|
|
812
|
+
this.config = config;
|
|
813
|
+
}
|
|
814
|
+
static serialize(packet) {
|
|
815
|
+
const writer = new ByteWriter;
|
|
816
|
+
writer.writeString(packet.id.key());
|
|
817
|
+
writer.writeString(JSON.stringify(packet.config));
|
|
818
|
+
return writer.finish();
|
|
819
|
+
}
|
|
820
|
+
static deserialize(data) {
|
|
821
|
+
const reader = ByteReader.fromUint8Array(data);
|
|
822
|
+
const id = Identifier.fromKey(reader.readString());
|
|
823
|
+
const config = JSON.parse(reader.readString());
|
|
824
|
+
return new SetConfigPacket(id, config);
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
class SetPermissionPacket {
|
|
829
|
+
id;
|
|
830
|
+
all;
|
|
831
|
+
read;
|
|
832
|
+
write;
|
|
833
|
+
remove;
|
|
834
|
+
proxy;
|
|
835
|
+
constructor(id, all, read, write, remove, proxy) {
|
|
836
|
+
this.id = id;
|
|
837
|
+
this.all = all;
|
|
838
|
+
this.read = read;
|
|
839
|
+
this.write = write;
|
|
840
|
+
this.remove = remove;
|
|
841
|
+
this.proxy = proxy;
|
|
842
|
+
}
|
|
843
|
+
static serialize(packet) {
|
|
844
|
+
const writer = new ByteWriter;
|
|
845
|
+
writer.writeString(packet.id.key());
|
|
846
|
+
let flags = 0;
|
|
847
|
+
if (packet.all !== null) {
|
|
848
|
+
flags |= 1;
|
|
849
|
+
}
|
|
850
|
+
if (packet.read !== null) {
|
|
851
|
+
flags |= 2;
|
|
852
|
+
}
|
|
853
|
+
if (packet.write !== null) {
|
|
854
|
+
flags |= 4;
|
|
855
|
+
}
|
|
856
|
+
if (packet.remove !== null) {
|
|
857
|
+
flags |= 8;
|
|
858
|
+
}
|
|
859
|
+
if (packet.proxy !== null) {
|
|
860
|
+
flags |= 16;
|
|
861
|
+
}
|
|
862
|
+
writer.writeUint8(flags);
|
|
863
|
+
if (packet.all) {
|
|
864
|
+
writer.writeString(packet.all.key());
|
|
865
|
+
}
|
|
866
|
+
if (packet.read) {
|
|
867
|
+
writer.writeString(packet.read.key());
|
|
868
|
+
}
|
|
869
|
+
if (packet.write) {
|
|
870
|
+
writer.writeString(packet.write.key());
|
|
871
|
+
}
|
|
872
|
+
if (packet.remove) {
|
|
873
|
+
writer.writeString(packet.remove.key());
|
|
874
|
+
}
|
|
875
|
+
if (packet.proxy) {
|
|
876
|
+
writer.writeString(packet.proxy.key());
|
|
877
|
+
}
|
|
878
|
+
return writer.finish();
|
|
879
|
+
}
|
|
880
|
+
static deserialize(data) {
|
|
881
|
+
const reader = ByteReader.fromUint8Array(data);
|
|
882
|
+
const id = Identifier.fromKey(reader.readString());
|
|
883
|
+
const flags = reader.readUint8();
|
|
884
|
+
const all = flags & 1 ? Identifier.fromKey(reader.readString()) : null;
|
|
885
|
+
const read = flags & 2 ? Identifier.fromKey(reader.readString()) : null;
|
|
886
|
+
const write = flags & 4 ? Identifier.fromKey(reader.readString()) : null;
|
|
887
|
+
const remove = flags & 8 ? Identifier.fromKey(reader.readString()) : null;
|
|
888
|
+
const proxy = flags & 16 ? Identifier.fromKey(reader.readString()) : null;
|
|
889
|
+
return new SetPermissionPacket(id, all, read, write, remove, proxy);
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
export {
|
|
893
|
+
TableProxyPacket,
|
|
894
|
+
TablePacket,
|
|
895
|
+
TableKeysPacket,
|
|
896
|
+
TableItemsPacket,
|
|
897
|
+
TableFetchRangePacket,
|
|
898
|
+
TableFetchPacket,
|
|
899
|
+
SetPermissionPacket,
|
|
900
|
+
SetConfigPacket
|
|
901
|
+
};
|
|
902
|
+
|
|
903
|
+
//# debugId=25FB34C319472B2A64756E2164756E21
|
|
904
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FwcC50cyIsICIuLi8uLi9zcmMvaWRlbnRpZmllci50cyIsICIuLi8uLi9zcmMvY29uc3QudHMiLCAiLi4vLi4vc3JjL3NlcmlhbGl6ZS9ieXRlYnVmZmVyLnRzIiwgIi4uLy4uL3NyYy9hcGkvdGFibGUvcGFja2V0cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuL2lkZW50aWZpZXInO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGUgfSBmcm9tICcuL2xvY2FsaXphdGlvbi9sb2NhbGUuanMnO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGl6ZWRUZXh0IH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgQXBwTWV0YWRhdGEgPSB7XG4gICAgbG9jYWxlOiBMb2NhbGU7XG4gICAgbmFtZT86IExvY2FsaXplZFRleHQ7XG4gICAgaWNvbj86IExvY2FsaXplZFRleHQ7XG4gICAgZGVzY3JpcHRpb24/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGltYWdlPzogTG9jYWxpemVkVGV4dDtcbiAgICBzaXRlPzogTG9jYWxpemVkVGV4dDtcbiAgICByZXBvc2l0b3J5PzogTG9jYWxpemVkVGV4dDtcbiAgICBhdXRob3JzPzogTG9jYWxpemVkVGV4dDtcbiAgICBsaWNlbnNlPzogTG9jYWxpemVkVGV4dDtcbiAgICB0YWdzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBBcHBUeXBlID0gJ2FwcCcgfCAnc2VydmljZScgfCAncmVtb3RlJyB8ICdwbHVnaW4nIHwgJ2Rhc2hib2FyZCc7XG5cbmV4cG9ydCB0eXBlIERlcGVuZGVuY3lTcGVjaWZpZXIgPSB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICAgIGluZGV4Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQXBwSnNvbiA9IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IEFwcFR5cGU7XG4gICAgcGFyZW50X2lkPzogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIG1ldGFkYXRhPzogQXBwTWV0YWRhdGE7XG4gICAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgRGVwZW5kZW5jeVNwZWNpZmllciB8IHN0cmluZz47XG59O1xuXG5leHBvcnQgY2xhc3MgQXBwIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXI7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEFwcFR5cGU7XG4gICAgcHVibGljIHJlYWRvbmx5IHBhcmVudElkPzogSWRlbnRpZmllcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgdXJsPzogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBtZXRhZGF0YT86IEFwcE1ldGFkYXRhO1xuICAgIHB1YmxpYyByZWFkb25seSBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IEludG9JZCwgb3B0aW9uczoge1xuICAgICAgICB0eXBlPzogQXBwVHlwZTtcbiAgICAgICAgcGFyZW50SWQ/OiBJbnRvSWQ7XG4gICAgICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgICAgIHVybD86IHN0cmluZztcbiAgICAgICAgbWV0YWRhdGE/OiBBcHBNZXRhZGF0YTtcbiAgICAgICAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgRGVwZW5kZW5jeVNwZWNpZmllciB8IHN0cmluZz47XG4gICAgfSkge1xuICAgICAgICB0aGlzLmlkID0gSWRlbnRpZmllci5mcm9tKGlkKTtcbiAgICAgICAgdGhpcy5wYXJlbnRJZCA9IElkZW50aWZpZXIuZnJvbU9wdGlvbmFsKG9wdGlvbnMucGFyZW50SWQpO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBvcHRpb25zLnZlcnNpb247XG4gICAgICAgIHRoaXMudXJsID0gb3B0aW9ucy51cmw7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBvcHRpb25zLm1ldGFkYXRhO1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGUgPz8gJ2FwcCc7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gb3B0aW9ucy5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpbmZvOiBBcHBKc29uKTogQXBwIHtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkoaW5mby5pZCk7XG4gICAgICAgIHJldHVybiBuZXcgQXBwKGlkLCB7XG4gICAgICAgICAgICBwYXJlbnRJZDogSWRlbnRpZmllci5mcm9tT3B0aW9uYWwoaW5mby5wYXJlbnRfaWQpLFxuICAgICAgICAgICAgdmVyc2lvbjogaW5mby52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiBpbmZvLnVybCxcbiAgICAgICAgICAgIHR5cGU6IGluZm8udHlwZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBpbmZvLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBpbmZvLmRlcGVuZGVuY2llcyA/PyB7fSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogQXBwKTogQXBwSnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogZGF0YS5pZC5rZXkoKSxcbiAgICAgICAgICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICAgICAgICAgIHBhcmVudF9pZDogZGF0YS5wYXJlbnRJZD8ua2V5KCksXG4gICAgICAgICAgICB2ZXJzaW9uOiBkYXRhLnZlcnNpb24sXG4gICAgICAgICAgICB1cmw6IGRhdGEudXJsLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGRhdGEubWV0YWRhdGEsXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXM6IGRhdGEuZGVwZW5kZW5jaWVzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBqb2luKC4uLnBhdGhzOiBzdHJpbmdbXSk6IEFwcCB7XG4gICAgICAgIHJldHVybiBuZXcgQXBwKHRoaXMuaWQuam9pbiguLi5wYXRocyksIHtcbiAgICAgICAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkLFxuICAgICAgICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiB0aGlzLmRlcGVuZGVuY2llcyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBBcHAgfSBmcm9tICcuL2FwcCc7XG5cbmNvbnN0IE5BTUVTUEFDRV9SRUdFWCA9IC9eKFxcLlteLzouXXxbXFx3LV0pKyQvO1xuY29uc3QgTkFNRV9SRUdFWCA9IC9eW14vOl0rJC87XG5cbmV4cG9ydCB0eXBlIEludG9JZCA9IElkZW50aWZpZXIgfCBzdHJpbmcgfCBFeHRlbnNpb25UeXBlIHwgQXBwO1xuXG5leHBvcnQgY2xhc3MgSWRlbnRpZmllciB7XG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmdbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICAgICAgLi4ucGF0aDogc3RyaW5nW11cbiAgICApIHtcbiAgICAgICAgSWRlbnRpZmllci52YWxpZGF0ZShuYW1lc3BhY2UsIHBhdGgpO1xuICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXIua2V5KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShqc29uOiBzdHJpbmcpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbUpzb24oanNvbik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tKGlkOiBJbnRvSWQpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgaWYgKGlkIGluc3RhbmNlb2YgSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9IGVsc2UgaWYgKGlkIGluc3RhbmNlb2YgQXBwKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQuaWQ7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbUtleShpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gaW5mZXJcbiAgICAgICAgICAgIC8vIFZpdGUgZG9lcyBub3QgcHJlc2VydmUgY2xhc3MgaW5mb3JtYXRpb24gd2hlbiBpbXBvcnRpbmcgZnJvbSBkaWZmZXJlbnQgcGFja2FnZXNcbiAgICAgICAgICAgIGNvbnN0IGlkQ2FzdGVkID0gaWQgYXMgeyBuYW1lc3BhY2U6IHN0cmluZzsgcGF0aDogc3RyaW5nW10gfTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgaWRDYXN0ZWQubmFtZXNwYWNlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaWRDYXN0ZWQucGF0aCkgJiZcbiAgICAgICAgICAgICAgICBpZENhc3RlZC5wYXRoLmV2ZXJ5KChwKSA9PiB0eXBlb2YgcCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIoaWRDYXN0ZWQubmFtZXNwYWNlLCAuLi5pZENhc3RlZC5wYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkV2l0aElkID0gaWQgYXMgeyBpZDogSW50b0lkIHwgdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkV2l0aElkLmlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb20oaWRXaXRoSWQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCB0byBJZGVudGlmaWVyOiAke2lkfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tT3B0aW9uYWwoaWQ6IEludG9JZCB8IHVuZGVmaW5lZCB8IG51bGwpOiBJZGVudGlmaWVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbShpZCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHZhbGlkYXRlKG5hbWVzcGFjZTogc3RyaW5nLCBwYXRoOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIW5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG5hbWVzcGFjZTogTmFtZXNwYWNlIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhdGg6IFBhdGggbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFOQU1FU1BBQ0VfUkVHRVgudGVzdChuYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbmFtZXNwYWNlOiBOYW1lc3BhY2UgbXVzdCBtYXRjaCAke05BTUVTUEFDRV9SRUdFWH1gKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcGF0aCkge1xuICAgICAgICAgICAgaWYgKCFOQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGF0aDogTmFtZSBtdXN0IG1hdGNoICR7TkFNRV9SRUdFWH0gYnV0IGdvdCAke25hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZm9ybWF0KG5hbWVzcGFjZTogc3RyaW5nLCAuLi5wYXRoOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICAgIElkZW50aWZpZXIudmFsaWRhdGUobmFtZXNwYWNlLCBwYXRoKTtcbiAgICAgICAgcmV0dXJuIGAke25hbWVzcGFjZX06JHtwYXRoLmpvaW4oJy8nKX1gO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tS2V5KGtleTogc3RyaW5nKTogSWRlbnRpZmllciB7XG4gICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IGtleS5pbmRleE9mKCc6Jyk7XG4gICAgICAgIGlmIChzZXBhcmF0b3IgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5OiBObyBzZXBhcmF0b3IgZm91bmQgaW4gJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleS5pbmRleE9mKCc6Jywgc2VwYXJhdG9yICsgMSkgIT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5OiBNdWx0aXBsZSBzZXBhcmF0b3JzIGZvdW5kIGluICR7a2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hbWVzcGFjZSA9IGtleS5zbGljZSgwLCBzZXBhcmF0b3IpO1xuICAgICAgICBjb25zdCBwYXRoID0ga2V5LnNsaWNlKHNlcGFyYXRvciArIDEpO1xuICAgICAgICBpZiAoIW5hbWVzcGFjZSB8fCAhcGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleTogTmFtZXNwYWNlIGFuZCBwYXRoIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihuYW1lc3BhY2UsIC4uLnBhdGguc3BsaXQoJy8nKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tVXJsKHVybDogc3RyaW5nIHwgVVJMKTogSWRlbnRpZmllciB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlID0gSWRlbnRpZmllci5uYW1lc3BhY2VGcm9tVXJsKHBhcnNlZFVybC5ocmVmKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IHBhcnNlZFVybC5wYXRobmFtZS5zbGljZSgxKS5zcGxpdCgnLycpO1xuICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIobmFtZXNwYWNlLCAuLi5wYXRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5hbWVzcGFjZUZyb21VcmwodXJsOiBzdHJpbmcgfCBVUkwpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHVybCk7XG4gICAgICAgIHJldHVybiBwYXJzZWQuaG9zdG5hbWUuc3BsaXQoJy4nKS5yZXZlcnNlKCkuam9pbignLicpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYmFzZSgpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKHRoaXMubmFtZXNwYWNlLCB0aGlzLnBhdGhbMF0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0pzb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5KCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21Kc29uKGpzb246IHN0cmluZyk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tS2V5KGpzb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBrZXkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZm9ybWF0KHRoaXMubmFtZXNwYWNlLCAuLi50aGlzLnBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VxdWFsKG90aGVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleSgpID09PSBvdGhlci5rZXkoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNOYW1lc3BhY2VFcXVhbChvdGhlcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2UgPT09IG90aGVyLm5hbWVzcGFjZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNTdWJwYXRoT2Yob3RoZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubmFtZXNwYWNlICE9PSBvdGhlci5uYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXRoLmxlbmd0aCA8IG90aGVyLnBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdGhlci5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXRoW2ldICE9PSBvdGhlci5wYXRoW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBqb2luKC4uLnBhdGg6IHN0cmluZ1tdKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcih0aGlzLm5hbWVzcGFjZSwgLi4udGhpcy5wYXRoLCAuLi5wYXRoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyTWFwPFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hcDogTWFwPHN0cmluZywgVD4gPSBuZXcgTWFwKCk7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVudHJpZXM/OiBJdGVyYWJsZTxbSWRlbnRpZmllciwgVF0+LFxuICAgICkge1xuICAgICAgICBpZiAoIWVudHJpZXMpIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCBbaWQsIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQoaWQua2V5KCksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGlkZW50aWZpZXI6IElkZW50aWZpZXIsIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwLnNldChpZGVudGlmaWVyLmtleSgpLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldChpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5oYXMoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZShpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwLmRlbGV0ZShpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljICprZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SWRlbnRpZmllcj4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLm1hcC5rZXlzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIElkZW50aWZpZXIuZnJvbUtleShrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLnZhbHVlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtJZGVudGlmaWVyLCBUXT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLm1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIFtJZGVudGlmaWVyLmZyb21LZXkoa2V5KSwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIFRdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyU2V0IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0LnNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZChpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0LmFkZChpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0LmhhcyhpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuZGVsZXRlKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuc2V0LmtleXMoKSkge1xuICAgICAgICAgICAgeWllbGQgSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SWRlbnRpZmllcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXlzKCk7XG4gICAgfVxuXG4gICAgcHVibGljICplbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIElkZW50aWZpZXJdPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuc2V0LmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IElkZW50aWZpZXIuZnJvbUtleShrZXkpO1xuICAgICAgICAgICAgeWllbGQgW2lkZW50aWZpZXIsIGlkZW50aWZpZXJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIElkZW50aWZpZXJdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG59XG4iLAogICAgImV4cG9ydCBjb25zdCB0ZXh0RW5jb2RlcjogVGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmV4cG9ydCBjb25zdCB0ZXh0RGVjb2RlcjogVGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiIsCiAgICAiaW1wb3J0IHsgdGV4dERlY29kZXIsIHRleHRFbmNvZGVyIH0gZnJvbSAnLi4vY29uc3QuanMnO1xuaW1wb3J0IHsgSnNvblR5cGUgfSBmcm9tICcuL3NlcmlhbGl6ZXIuanMnO1xuXG5leHBvcnQgY2xhc3MgRmxhZ3Mge1xuICAgIHByaXZhdGUgdmFsdWU6IG51bWJlcjtcbiAgICBwcml2YXRlIGxlbmd0aDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogeyB2YWx1ZT86IG51bWJlcjsgbGVuZ3RoPzogbnVtYmVyIH0pIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG9wdGlvbnMudmFsdWUgPz8gMDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRpb25zLmxlbmd0aCA/PyAzMjtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKHBvc2l0aW9uOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlICYgKDEgPDwgcG9zaXRpb24pKSAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KHBvc2l0aW9uOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlICYgKDEgPDwgcG9zaXRpb24pKSAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaWZTZXQ8VD4ocG9zaXRpb246IG51bWJlciwgY2FsbGJhY2s6ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KHBvc2l0aW9uOiBudW1iZXIsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSB8PSAxIDw8IHBvc2l0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSAmPSB+KDEgPDwgcG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKHdyaXRlcjogQnl0ZVdyaXRlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBiaXRzID0gbmV3IFVpbnQ4QXJyYXkoKHRoaXMubGVuZ3RoICsgNykgLyA4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBiaXRzW2ldID0gKHRoaXMudmFsdWUgPj4gKGkgKiA4KSkgJiAweGZmO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci53cml0ZShiaXRzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWQocmVhZGVyOiBCeXRlUmVhZGVyLCBsZW5ndGg6IG51bWJlcik6IEZsYWdzIHtcbiAgICAgICAgbGV0IHZhbHVlID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAobGVuZ3RoICsgNykgLyA4OyBpKyspIHtcbiAgICAgICAgICAgIHZhbHVlIHw9IHJlYWRlci5yZWFkVWludDgoKSA8PCAoaSAqIDgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRmxhZ3MoeyB2YWx1ZSwgbGVuZ3RoIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVhZEZsb2F0MTYoZGF0YVZpZXc6IERhdGFWaWV3LCBvZmZzZXQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc2lnbiA9IChkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0KSAmIDB4ODAwMCkgPyAtMSA6IDE7XG4gICAgY29uc3QgZXhwb25lbnQgPSAoZGF0YVZpZXcuZ2V0VWludDE2KG9mZnNldCkgJiAweDdjMDApID4+IDEwO1xuICAgIGNvbnN0IG1hbnRpc3NhID0gKGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQpICYgMHgwM2ZmKTtcbiAgICBpZiAoZXhwb25lbnQgPT09IDAgJiYgbWFudGlzc2EgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChleHBvbmVudCA9PT0gMHgxZikge1xuICAgICAgICByZXR1cm4gbWFudGlzc2EgPT09IDAgPyBJbmZpbml0eSAqIHNpZ24gOiBOYU47XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEV4cG9uZW50ID0gZXhwb25lbnQgLSAxNTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE1hbnRpc3NhID0gbWFudGlzc2EgLyAxMDI0O1xuICAgICAgICByZXR1cm4gc2lnbiAqIE1hdGgucG93KDIsIG5vcm1hbGl6ZWRFeHBvbmVudCkgKiAoMSArIG5vcm1hbGl6ZWRNYW50aXNzYSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0MTYoZGF0YVZpZXc6IERhdGFWaWV3LCBvZmZzZXQ6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCAwKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaWduID0gdmFsdWUgPCAwID8gMSA6IDA7XG4gICAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSk7XG4gICAgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgMHg3YzAwIHwgKHNpZ24gPDwgMTUpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleHBvbmVudCA9IE1hdGguZmxvb3IoTWF0aC5sb2cyKHZhbHVlKSk7XG4gICAgY29uc3QgbWFudGlzc2EgPSB2YWx1ZSAvIE1hdGgucG93KDIsIGV4cG9uZW50KSAtIDE7XG4gICAgY29uc3Qgbm9ybWFsaXplZEV4cG9uZW50ID0gZXhwb25lbnQgKyAxNTtcbiAgICBjb25zdCBub3JtYWxpemVkTWFudGlzc2EgPSBNYXRoLnJvdW5kKG1hbnRpc3NhICogMTAyNCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRFeHBvbmVudCA8PSAwKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIHNpZ24gPDwgMTUpO1xuICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZEV4cG9uZW50ID49IDB4MWYpIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgMHg3YzAwIHwgKHNpZ24gPDwgMTUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCAoc2lnbiA8PCAxNSkgfCAobm9ybWFsaXplZEV4cG9uZW50IDw8IDEwKSB8IG5vcm1hbGl6ZWRNYW50aXNzYSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQnl0ZVdyaXRlciB7XG4gICAgcHJpdmF0ZSBkYXRhVmlldzogRGF0YVZpZXc7XG4gICAgcHJpdmF0ZSBidWZmZXI6IEFycmF5QnVmZmVyO1xuICAgIHByaXZhdGUgb2Zmc2V0ID0gMDtcbiAgICBwcml2YXRlIGZpbmlzaGVkID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihpbml0PzogQXJyYXlCdWZmZXIsIG9mZnNldD86IG51bWJlcikge1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldCA/PyAwO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGluaXQgPz8gbmV3IEFycmF5QnVmZmVyKDEwMjQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMuYnVmZmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21VaW50OEFycmF5KGJ1ZmZlcjogVWludDhBcnJheSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICAgIHVpbnQ4QXJyYXkuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgICAgICByZXR1cm4gbmV3IEJ5dGVXcml0ZXIoYXJyYXlCdWZmZXIsIGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFsbG9jYXRlKGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCArIGxlbmd0aCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0J5dGVMZW5ndGggPSBNYXRoLm1heCh0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoICogMiwgdGhpcy5vZmZzZXQgKyBsZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgbmV3QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKG5ld0J5dGVMZW5ndGgpO1xuICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkobmV3QnVmZmVyKS5zZXQobmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIpKTtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbmV3QnVmZmVyO1xuICAgICAgICAgICAgdGhpcy5kYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGUoZGF0YTogVWludDhBcnJheSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICBpZiAodGhpcy5maW5pc2hlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgYWxyZWFkeSBmaW5pc2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoZGF0YS5sZW5ndGgpO1xuICAgICAgICBuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlcikuc2V0KGRhdGEsIHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUJvb2xlYW4odmFsdWU6IGJvb2xlYW4pOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSA/IDEgOiAwKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50OCh2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50OCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50OCh2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDgodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDE2KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQxNih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMik7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDE2KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDMyKHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQzMih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50MzIodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQzMih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQ2NCh2YWx1ZTogYmlnaW50KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoOCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0QmlnSW50NjQodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDY0KHZhbHVlOiBiaWdpbnQpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg4KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRCaWdVaW50NjQodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVUxFQjEyOCh2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIC8vIFVuc2lnbmVkIExFQjEyOFxuICAgICAgICBpZiAodmFsdWUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHZhbHVlID4gMHg3Zikge1xuICAgICAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDgodGhpcy5vZmZzZXQsICh2YWx1ZSAmIDB4N2YpIHwgMHg4MCk7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICAgICAgdmFsdWUgPj49IDc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50OCh0aGlzLm9mZnNldCwgdmFsdWUgJiAweDdmKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxvYXQxNih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMik7XG4gICAgICAgIHdyaXRlRmxvYXQxNih0aGlzLmRhdGFWaWV3LCB0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbG9hdDMyKHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRGbG9hdDMyKHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsb2F0NjQodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEZsb2F0NjQodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDhBcnJheSh2YWx1ZTogVWludDhBcnJheSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLndyaXRlVUxFQjEyOCh2YWx1ZS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgdGhpcy53cml0ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVN0cmluZyh2YWx1ZTogc3RyaW5nKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMud3JpdGVVaW50OEFycmF5KHRleHRFbmNvZGVyLmVuY29kZSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVKU09OKHZhbHVlOiBKc29uVHlwZSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLndyaXRlU3RyaW5nKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsYWdzKGZsYWdzOiBGbGFncyk6IEJ5dGVXcml0ZXIge1xuICAgICAgICBmbGFncy53cml0ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmlzaCgpOiBVaW50OEFycmF5IHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyLCAwLCB0aGlzLm9mZnNldCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvVWludDhBcnJheSgpOiBVaW50OEFycmF5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyLCAwLCB0aGlzLm9mZnNldCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvQXJyYXlCdWZmZXIoKTogQXJyYXlCdWZmZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIuc2xpY2UoMCwgdGhpcy5vZmZzZXQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ5dGVSZWFkZXIge1xuICAgIHByaXZhdGUgZGF0YVZpZXc6IERhdGFWaWV3O1xuICAgIHByaXZhdGUgb2Zmc2V0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBmaW5pc2hlZDogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoZGF0YTogRGF0YVZpZXcpIHtcbiAgICAgICAgdGhpcy5kYXRhVmlldyA9IGRhdGE7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVVpbnQ4QXJyYXkoYnVmZmVyOiBVaW50OEFycmF5KTogQnl0ZVJlYWRlciB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICAgICAgdWludDhBcnJheS5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSk7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlUmVhZGVyKGRhdGFWaWV3KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21BcnJheUJ1ZmZlcihidWZmZXI6IEFycmF5QnVmZmVyKTogQnl0ZVJlYWRlciB7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBmcm9tQmxvYihibG9iOiBCbG9iKTogUHJvbWlzZTxCeXRlUmVhZGVyPiB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpO1xuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWQoc2l6ZTogbnVtYmVyKTogVWludDhBcnJheSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpemUgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCArIHNpemUgPiB0aGlzLmRhdGFWaWV3LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIG5vdCBmdWxseSByZWFkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgVWludDhBcnJheSh0aGlzLmRhdGFWaWV3LmJ1ZmZlciwgdGhpcy5vZmZzZXQsIHNpemUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSBzaXplO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRCb29sZWFuKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50OCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQxNigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50MTYodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDMyKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQzMigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50NjQoKTogYmlnaW50IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEJpZ0ludDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDY0KCk6IGJpZ2ludCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRCaWdVaW50NjQodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVTEVCMTI4KCk6IG51bWJlciB7XG4gICAgICAgIC8vIFVuc2lnbmVkIExFQjEyOFxuICAgICAgICBsZXQgdmFsdWUgPSAwO1xuICAgICAgICBsZXQgc2hpZnQgPSAwO1xuICAgICAgICBsZXQgYnl0ZTogbnVtYmVyO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgbm90IGZ1bGx5IHJlYWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ5dGUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICB2YWx1ZSB8PSAoYnl0ZSAmIDBiMDExMTExMTEpIDw8IHNoaWZ0O1xuICAgICAgICAgICAgc2hpZnQgKz0gNztcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoKGJ5dGUgJiAwYjEwMDAwMDAwKSAhPT0gMCk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZWFkRmxvYXQxNih0aGlzLmRhdGFWaWV3LCB0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0MzIoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEZsb2F0MzIodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbG9hdDY0KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRGbG9hdDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDhBcnJheSgpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yZWFkVUxFQjEyOCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkKGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYnl0ZUFycmF5ID0gdGhpcy5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVBcnJheSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRKU09OPFQgZXh0ZW5kcyBKc29uVHlwZT4oKTogVCB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMucmVhZFN0cmluZygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsYWdzKGxlbmd0aDogbnVtYmVyKTogRmxhZ3Mge1xuICAgICAgICByZXR1cm4gRmxhZ3MucmVhZCh0aGlzLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5pc2goKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCAhPT0gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBub3QgZnVsbHkgcmVhZCcpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyLCBGbGFncyB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmltcG9ydCB0eXBlIHsgVGFibGVDb25maWcgfSBmcm9tICcuL3RhYmxlLmpzJztcblxuZXhwb3J0IGNsYXNzIFRhYmxlUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIpIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFRhYmxlUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVQYWNrZXQoaWQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlSXRlbXNQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpdGVtczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4sXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZUl0ZW1zUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KE9iamVjdC5rZXlzKHBhY2tldC5pdGVtcykubGVuZ3RoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFja2V0Lml0ZW1zKSkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGtleSk7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlSXRlbXNQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgY291bnQgPSByZWFkZXIucmVhZFVMRUIxMjgoKTtcbiAgICAgICAgY29uc3QgaXRlbXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+ID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgICAgICBpdGVtc1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUl0ZW1zUGFja2V0KGlkLCBpdGVtcyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVLZXlzUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkga2V5czogc3RyaW5nW10sXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZUtleXNQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVMRUIxMjgocGFja2V0LmtleXMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcGFja2V0LmtleXMpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogVGFibGVLZXlzUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAga2V5cy5wdXNoKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVLZXlzUGFja2V0KGlkLCBrZXlzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZVByb3h5UGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaXRlbXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkga2V5OiBudW1iZXIsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZVByb3h5UGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KHBhY2tldC5rZXkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KE9iamVjdC5rZXlzKHBhY2tldC5pdGVtcykubGVuZ3RoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFja2V0Lml0ZW1zKSkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGtleSk7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlUHJveHlQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3Qga2V5ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICAgICAgaXRlbXNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVQcm94eVBhY2tldChpZCwgaXRlbXMsIGtleSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFRhYmxlRmV0Y2hQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBsaW1pdDogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYmFja3dhcmQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZUZldGNoUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KHBhY2tldC5saW1pdCk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gbmV3IEZsYWdzKHsgbGVuZ3RoOiAyIH0pO1xuICAgICAgICBmbGFncy5zZXQoMCwgcGFja2V0LmJhY2t3YXJkKTtcbiAgICAgICAgZmxhZ3Muc2V0KDEsIHBhY2tldC5jdXJzb3IgIT09IG51bGwpO1xuICAgICAgICB3cml0ZXIud3JpdGVGbGFncyhmbGFncyk7XG4gICAgICAgIGlmIChwYWNrZXQuY3Vyc29yICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmN1cnNvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZUZldGNoUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gcmVhZGVyLnJlYWRGbGFncygyKTtcbiAgICAgICAgY29uc3QgYmFja3dhcmQgPSBmbGFncy5nZXQoMCk7XG4gICAgICAgIGNvbnN0IGN1cnNvciA9IGZsYWdzLmlmU2V0KDEsICgpID0+IHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlRmV0Y2hQYWNrZXQoaWQsIGxpbWl0LCBiYWNrd2FyZCwgY3Vyc29yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUZldGNoUmFuZ2VQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGFydDogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZW5kOiBzdHJpbmcsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZUZldGNoUmFuZ2VQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuc3RhcnQpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmVuZCk7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogVGFibGVGZXRjaFJhbmdlUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgZW5kID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUZldGNoUmFuZ2VQYWNrZXQoaWQsIHN0YXJ0LCBlbmQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldENvbmZpZ1BhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNvbmZpZzogVGFibGVDb25maWcsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBTZXRDb25maWdQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhKU09OLnN0cmluZ2lmeShwYWNrZXQuY29uZmlnKSk7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogU2V0Q29uZmlnUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIHJldHVybiBuZXcgU2V0Q29uZmlnUGFja2V0KGlkLCBjb25maWcpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldFBlcm1pc3Npb25QYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBhbGw6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVhZDogSWRlbnRpZmllciB8IG51bGwsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB3cml0ZTogSWRlbnRpZmllciB8IG51bGwsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZW1vdmU6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcHJveHk6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogU2V0UGVybWlzc2lvblBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgbGV0IGZsYWdzID0gMDtcbiAgICAgICAgaWYgKHBhY2tldC5hbGwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDBiMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFja2V0LnJlYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDBiMTA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC53cml0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZmxhZ3MgfD0gMGIxMDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZW1vdmUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDBiMTAwMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFja2V0LnByb3h5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjEwMDAwO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4KGZsYWdzKTtcbiAgICAgICAgaWYgKHBhY2tldC5hbGwpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuYWxsLmtleSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFja2V0LnJlYWQpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQucmVhZC5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC53cml0ZSkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC53cml0ZS5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZW1vdmUpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQucmVtb3ZlLmtleSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFja2V0LnByb3h5KSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnByb3h5LmtleSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFNldFBlcm1pc3Npb25QYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgZmxhZ3MgPSByZWFkZXIucmVhZFVpbnQ4KCk7XG4gICAgICAgIGNvbnN0IGFsbCA9IGZsYWdzICYgMGIxID8gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpIDogbnVsbDtcbiAgICAgICAgY29uc3QgcmVhZCA9IGZsYWdzICYgMGIxMCA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHdyaXRlID0gZmxhZ3MgJiAwYjEwMCA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IGZsYWdzICYgMGIxMDAwID8gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpIDogbnVsbDtcbiAgICAgICAgY29uc3QgcHJveHkgPSBmbGFncyAmIDBiMTAwMDAgPyBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IFNldFBlcm1pc3Npb25QYWNrZXQoaWQsIGFsbCwgcmVhZCwgd3JpdGUsIHJlbW92ZSwgcHJveHkpO1xuICAgIH1cbn1cblxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7QUFrQ08sTUFBTSxJQUFJO0FBQUEsRUFDRztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBRWhCLFdBQVcsQ0FBQyxJQUFZLFNBT3JCO0FBQUEsSUFDQyxLQUFLLEtBQUssV0FBVyxLQUFLLEVBQUU7QUFBQSxJQUM1QixLQUFLLFdBQVcsV0FBVyxhQUFhLFFBQVEsUUFBUTtBQUFBLElBQ3hELEtBQUssVUFBVSxRQUFRO0FBQUEsSUFDdkIsS0FBSyxNQUFNLFFBQVE7QUFBQSxJQUNuQixLQUFLLFdBQVcsUUFBUTtBQUFBLElBQ3hCLEtBQUssT0FBTyxRQUFRLFFBQVE7QUFBQSxJQUM1QixLQUFLLGVBQWUsUUFBUSxnQkFBZ0IsQ0FBQztBQUFBO0FBQUEsU0FHbkMsV0FBVyxD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USxPQUFPLFVBQVU7QUFBQSxJQUMvQixNQUFNLE1BQU0sUUFBUSxJQUFNLFdBQVcsUUFBUSxPQUFPLFdBQVcsQ0FBQyxJQUFJO0FBQUEsSUFDcEUsTUFBTSxPQUFPLFFBQVEsSUFBTyxXQUFXLFFBQVEsT0FBTyxXQUFXLENBQUMsSUFBSTtBQUFBLElBQ3RFLE1BQU0sUUFBUSxRQUFRLElBQVEsV0FBVyxRQUFRLE9BQU8sV0FBVyxDQUFDLElBQUk7QUFBQSxJQUN4RSxNQUFNLFNBQVMsUUFBUSxJQUFTLFdBQVcsUUFBUSxPQUFPLFdBQVcsQ0FBQyxJQUFJO0FBQUEsSUFDMUUsTUFBTSxRQUFRLFFBQVEsS0FBVSxXQUFXLFFBQVEsT0FBTyxXQUFXLENBQUMsSUFBSTtBQUFBLElBQzFFLE9BQU8sSUFBSSxvQkFBb0IsSUFBSSxLQUFLLE1BQU0sT0FBTyxRQUFRLEtBQUs7QUFBQTtBQUUxRTsiLAogICJkZWJ1Z0lkIjogIjI1RkIzNEMzMTk0NzJCMkE2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|