@omujs/omu 0.9.32 → 0.9.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/dts/api/asset/extension.d.ts +3 -3
  3. package/dist/dts/api/asset/index.d.ts +1 -1
  4. package/dist/dts/api/dashboard/extension.d.ts +13 -3
  5. package/dist/dts/api/dashboard/handler.d.ts +2 -1
  6. package/dist/dts/api/dashboard/index.d.ts +1 -1
  7. package/dist/dts/api/http/extension.d.ts +2 -135
  8. package/dist/dts/api/http/http.d.ts +36 -0
  9. package/dist/dts/api/http/websocket.d.ts +123 -0
  10. package/dist/dts/api/permission/extension.d.ts +1 -0
  11. package/dist/dts/index.d.ts +1 -3
  12. package/dist/dts/version.d.ts +1 -1
  13. package/dist/esm/api/asset/extension.js +43 -18
  14. package/dist/esm/api/asset/index.js +42 -17
  15. package/dist/esm/api/dashboard/extension.js +17 -13
  16. package/dist/esm/api/dashboard/index.js +17 -13
  17. package/dist/esm/api/endpoint/extension.js +3 -3
  18. package/dist/esm/api/extension.js +3 -3
  19. package/dist/esm/api/http/extension.js +262 -277
  20. package/dist/esm/api/http/http.js +442 -0
  21. package/dist/esm/api/http/index.js +262 -165
  22. package/dist/esm/api/http/websocket.js +220 -0
  23. package/dist/esm/api/i18n/extension.js +3 -3
  24. package/dist/esm/api/i18n/index.js +3 -3
  25. package/dist/esm/api/index.js +3 -3
  26. package/dist/esm/api/logger/extension.js +3 -3
  27. package/dist/esm/api/logger/index.js +3 -3
  28. package/dist/esm/api/permission/extension.js +6 -3
  29. package/dist/esm/api/plugin/extension.js +3 -3
  30. package/dist/esm/api/plugin/index.js +3 -3
  31. package/dist/esm/api/registry/extension.js +3 -3
  32. package/dist/esm/api/registry/index.js +3 -3
  33. package/dist/esm/api/server/extension.js +3 -3
  34. package/dist/esm/api/server/index.js +3 -3
  35. package/dist/esm/api/session/extension.js +3 -3
  36. package/dist/esm/api/session/index.js +3 -3
  37. package/dist/esm/api/signal/extension.js +3 -3
  38. package/dist/esm/api/table/extension.js +3 -3
  39. package/dist/esm/api/table/index.js +3 -3
  40. package/dist/esm/index.js +319 -189
  41. package/dist/esm/network/index.js +3 -3
  42. package/dist/esm/network/network.js +3 -3
  43. package/dist/esm/omu.js +318 -186
  44. package/dist/esm/version.js +3 -3
  45. package/package.json +1 -1
  46. package/src/api/asset/extension.ts +46 -12
  47. package/src/api/asset/index.ts +1 -2
  48. package/src/api/dashboard/extension.ts +29 -13
  49. package/src/api/dashboard/handler.ts +2 -1
  50. package/src/api/dashboard/index.ts +2 -0
  51. package/src/api/extension.ts +1 -1
  52. package/src/api/http/extension.ts +13 -364
  53. package/src/api/http/http.ts +79 -0
  54. package/src/api/http/websocket.ts +283 -0
  55. package/src/api/permission/extension.ts +4 -0
  56. package/src/index.ts +3 -5
  57. package/src/version.ts +1 -1
  58. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,442 @@
1
+ // @bun
2
+ // src/const.ts
3
+ var textEncoder = new TextEncoder;
4
+ var textDecoder = new TextDecoder;
5
+
6
+ // src/serialize/bytebuffer.ts
7
+ class Flags {
8
+ value;
9
+ length;
10
+ constructor(options) {
11
+ this.value = options.value ?? 0;
12
+ this.length = options.length ?? 32;
13
+ }
14
+ has(position) {
15
+ return (this.value & 1 << position) !== 0;
16
+ }
17
+ get(position) {
18
+ return (this.value & 1 << position) !== 0;
19
+ }
20
+ ifSet(position, callback) {
21
+ if (this.has(position)) {
22
+ return callback();
23
+ }
24
+ return;
25
+ }
26
+ set(position, value) {
27
+ if (value) {
28
+ this.value |= 1 << position;
29
+ } else {
30
+ this.value &= ~(1 << position);
31
+ }
32
+ }
33
+ write(writer) {
34
+ const bits = new Uint8Array((this.length + 7) / 8);
35
+ for (let i = 0;i < bits.length; i++) {
36
+ bits[i] = this.value >> i * 8 & 255;
37
+ }
38
+ writer.write(bits);
39
+ }
40
+ static read(reader, length) {
41
+ let value = 0;
42
+ for (let i = 0;i < (length + 7) / 8; i++) {
43
+ value |= reader.readUint8() << i * 8;
44
+ }
45
+ return new Flags({ value, length });
46
+ }
47
+ }
48
+ function readFloat16(dataView, offset) {
49
+ const sign = dataView.getUint16(offset) & 32768 ? -1 : 1;
50
+ const exponent = (dataView.getUint16(offset) & 31744) >> 10;
51
+ const mantissa = dataView.getUint16(offset) & 1023;
52
+ if (exponent === 0 && mantissa === 0) {
53
+ return 0;
54
+ } else if (exponent === 31) {
55
+ return mantissa === 0 ? Infinity * sign : NaN;
56
+ } else {
57
+ const normalizedExponent = exponent - 15;
58
+ const normalizedMantissa = mantissa / 1024;
59
+ return sign * Math.pow(2, normalizedExponent) * (1 + normalizedMantissa);
60
+ }
61
+ }
62
+ function writeFloat16(dataView, offset, value) {
63
+ if (value === 0) {
64
+ dataView.setUint16(offset, 0);
65
+ return;
66
+ }
67
+ const sign = value < 0 ? 1 : 0;
68
+ value = Math.abs(value);
69
+ if (!isFinite(value)) {
70
+ dataView.setUint16(offset, 31744 | sign << 15);
71
+ return;
72
+ }
73
+ const exponent = Math.floor(Math.log2(value));
74
+ const mantissa = value / Math.pow(2, exponent) - 1;
75
+ const normalizedExponent = exponent + 15;
76
+ const normalizedMantissa = Math.round(mantissa * 1024);
77
+ if (normalizedExponent <= 0) {
78
+ dataView.setUint16(offset, sign << 15);
79
+ } else if (normalizedExponent >= 31) {
80
+ dataView.setUint16(offset, 31744 | sign << 15);
81
+ } else {
82
+ dataView.setUint16(offset, sign << 15 | normalizedExponent << 10 | normalizedMantissa);
83
+ }
84
+ }
85
+
86
+ class ByteWriter {
87
+ dataView;
88
+ buffer;
89
+ offset = 0;
90
+ finished = false;
91
+ constructor(init, offset) {
92
+ this.offset = offset ?? 0;
93
+ this.buffer = init ?? new ArrayBuffer(1024);
94
+ this.dataView = new DataView(this.buffer);
95
+ }
96
+ static fromUint8Array(buffer) {
97
+ const arrayBuffer = new ArrayBuffer(buffer.byteLength);
98
+ const uint8Array = new Uint8Array(arrayBuffer);
99
+ uint8Array.set(new Uint8Array(buffer));
100
+ return new ByteWriter(arrayBuffer, buffer.byteLength);
101
+ }
102
+ allocate(length) {
103
+ if (this.offset + length > this.buffer.byteLength) {
104
+ const newByteLength = Math.max(this.buffer.byteLength * 2, this.offset + length);
105
+ const newBuffer = new ArrayBuffer(newByteLength);
106
+ new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));
107
+ this.buffer = newBuffer;
108
+ this.dataView = new DataView(this.buffer);
109
+ }
110
+ }
111
+ write(data) {
112
+ if (this.finished) {
113
+ throw new Error("Buffer already finished");
114
+ }
115
+ this.allocate(data.length);
116
+ new Uint8Array(this.buffer).set(data, this.offset);
117
+ this.offset += data.length;
118
+ return this;
119
+ }
120
+ writeBoolean(value) {
121
+ this.allocate(1);
122
+ this.dataView.setInt8(this.offset, value ? 1 : 0);
123
+ this.offset += 1;
124
+ return this;
125
+ }
126
+ writeInt8(value) {
127
+ this.allocate(1);
128
+ this.dataView.setInt8(this.offset, value);
129
+ this.offset += 1;
130
+ return this;
131
+ }
132
+ writeUint8(value) {
133
+ this.allocate(1);
134
+ this.dataView.setUint8(this.offset, value);
135
+ this.offset += 1;
136
+ return this;
137
+ }
138
+ writeInt16(value) {
139
+ this.allocate(2);
140
+ this.dataView.setInt16(this.offset, value);
141
+ this.offset += 2;
142
+ return this;
143
+ }
144
+ writeUint16(value) {
145
+ this.allocate(2);
146
+ this.dataView.setUint16(this.offset, value);
147
+ this.offset += 2;
148
+ return this;
149
+ }
150
+ writeInt32(value) {
151
+ this.allocate(4);
152
+ this.dataView.setInt32(this.offset, value);
153
+ this.offset += 4;
154
+ return this;
155
+ }
156
+ writeUint32(value) {
157
+ this.allocate(4);
158
+ this.dataView.setUint32(this.offset, value);
159
+ this.offset += 4;
160
+ return this;
161
+ }
162
+ writeInt64(value) {
163
+ this.allocate(8);
164
+ this.dataView.setBigInt64(this.offset, value);
165
+ this.offset += 8;
166
+ return this;
167
+ }
168
+ writeUint64(value) {
169
+ this.allocate(8);
170
+ this.dataView.setBigUint64(this.offset, value);
171
+ this.offset += 8;
172
+ return this;
173
+ }
174
+ writeULEB128(value) {
175
+ if (value < 0) {
176
+ throw new Error("Value must be non-negative");
177
+ }
178
+ while (value > 127) {
179
+ this.allocate(1);
180
+ this.dataView.setUint8(this.offset, value & 127 | 128);
181
+ this.offset += 1;
182
+ value >>= 7;
183
+ }
184
+ this.allocate(1);
185
+ this.dataView.setUint8(this.offset, value & 127);
186
+ this.offset += 1;
187
+ return this;
188
+ }
189
+ writeFloat16(value) {
190
+ this.allocate(2);
191
+ writeFloat16(this.dataView, this.offset, value);
192
+ this.offset += 2;
193
+ return this;
194
+ }
195
+ writeFloat32(value) {
196
+ this.allocate(4);
197
+ this.dataView.setFloat32(this.offset, value);
198
+ this.offset += 4;
199
+ return this;
200
+ }
201
+ writeFloat64(value) {
202
+ this.allocate(4);
203
+ this.dataView.setFloat64(this.offset, value);
204
+ this.offset += 4;
205
+ return this;
206
+ }
207
+ writeUint8Array(value) {
208
+ this.writeULEB128(value.byteLength);
209
+ this.write(value);
210
+ return this;
211
+ }
212
+ writeString(value) {
213
+ this.writeUint8Array(textEncoder.encode(value));
214
+ return this;
215
+ }
216
+ writeJSON(value) {
217
+ this.writeString(JSON.stringify(value));
218
+ return this;
219
+ }
220
+ writeFlags(flags) {
221
+ flags.write(this);
222
+ return this;
223
+ }
224
+ finish() {
225
+ if (this.finished) {
226
+ throw new Error("Buffer already finished");
227
+ }
228
+ this.finished = true;
229
+ return new Uint8Array(this.buffer, 0, this.offset);
230
+ }
231
+ }
232
+
233
+ class ByteReader {
234
+ dataView;
235
+ offset;
236
+ finished;
237
+ constructor(data) {
238
+ this.dataView = data;
239
+ this.offset = 0;
240
+ this.finished = false;
241
+ }
242
+ static fromUint8Array(buffer) {
243
+ const arrayBuffer = new ArrayBuffer(buffer.byteLength);
244
+ const uint8Array = new Uint8Array(arrayBuffer);
245
+ uint8Array.set(new Uint8Array(buffer));
246
+ const dataView = new DataView(arrayBuffer);
247
+ return new ByteReader(dataView);
248
+ }
249
+ static fromArrayBuffer(buffer) {
250
+ const dataView = new DataView(buffer);
251
+ return new ByteReader(dataView);
252
+ }
253
+ static async fromBlob(blob) {
254
+ const arrayBuffer = await blob.arrayBuffer();
255
+ const dataView = new DataView(arrayBuffer);
256
+ return new ByteReader(dataView);
257
+ }
258
+ read(size) {
259
+ if (this.finished) {
260
+ throw new Error("Buffer already finished");
261
+ }
262
+ if (size < 0) {
263
+ throw new Error("Size must be positive");
264
+ }
265
+ if (this.offset + size > this.dataView.byteLength) {
266
+ throw new Error("Buffer not fully read");
267
+ }
268
+ const value = new Uint8Array(this.dataView.buffer, this.offset, size);
269
+ this.offset += size;
270
+ return value;
271
+ }
272
+ readBoolean() {
273
+ const value = this.dataView.getInt8(this.offset);
274
+ this.offset += 1;
275
+ return value !== 0;
276
+ }
277
+ readInt8() {
278
+ const value = this.dataView.getInt8(this.offset);
279
+ this.offset += 1;
280
+ return value;
281
+ }
282
+ readUint8() {
283
+ const value = this.dataView.getUint8(this.offset);
284
+ this.offset += 1;
285
+ return value;
286
+ }
287
+ readInt16() {
288
+ const value = this.dataView.getInt16(this.offset);
289
+ this.offset += 2;
290
+ return value;
291
+ }
292
+ readUint16() {
293
+ const value = this.dataView.getUint16(this.offset);
294
+ this.offset += 2;
295
+ return value;
296
+ }
297
+ readInt32() {
298
+ const value = this.dataView.getInt32(this.offset);
299
+ this.offset += 4;
300
+ return value;
301
+ }
302
+ readUint32() {
303
+ const value = this.dataView.getUint32(this.offset);
304
+ this.offset += 4;
305
+ return value;
306
+ }
307
+ readInt64() {
308
+ const value = this.dataView.getBigInt64(this.offset);
309
+ this.offset += 8;
310
+ return value;
311
+ }
312
+ readUint64() {
313
+ const value = this.dataView.getBigUint64(this.offset);
314
+ this.offset += 8;
315
+ return value;
316
+ }
317
+ readULEB128() {
318
+ let value = 0;
319
+ let shift = 0;
320
+ let byte;
321
+ do {
322
+ if (this.offset >= this.dataView.byteLength) {
323
+ throw new Error("Buffer not fully read");
324
+ }
325
+ byte = this.dataView.getUint8(this.offset);
326
+ this.offset += 1;
327
+ value |= (byte & 127) << shift;
328
+ shift += 7;
329
+ } while ((byte & 128) !== 0);
330
+ return value;
331
+ }
332
+ readFloat16() {
333
+ const value = readFloat16(this.dataView, this.offset);
334
+ this.offset += 2;
335
+ return value;
336
+ }
337
+ readFloat32() {
338
+ const value = this.dataView.getFloat32(this.offset);
339
+ this.offset += 4;
340
+ return value;
341
+ }
342
+ readFloat64() {
343
+ const value = this.dataView.getFloat64(this.offset);
344
+ this.offset += 8;
345
+ return value;
346
+ }
347
+ readUint8Array() {
348
+ const length = this.readULEB128();
349
+ return this.read(length);
350
+ }
351
+ readString() {
352
+ const byteArray = this.readUint8Array();
353
+ return textDecoder.decode(byteArray);
354
+ }
355
+ readJSON() {
356
+ return JSON.parse(this.readString());
357
+ }
358
+ readFlags(length) {
359
+ return Flags.read(this, length);
360
+ }
361
+ finish() {
362
+ if (this.finished) {
363
+ throw new Error("Buffer already finished");
364
+ }
365
+ this.finished = true;
366
+ if (this.offset !== this.dataView.byteLength) {
367
+ throw new Error("Buffer not fully read");
368
+ }
369
+ }
370
+ }
371
+ // src/api/http/http.ts
372
+ class DataChunk {
373
+ meta;
374
+ body;
375
+ constructor(meta, body) {
376
+ this.meta = meta;
377
+ this.body = body;
378
+ }
379
+ static serialize(data) {
380
+ const writer = new ByteWriter;
381
+ writer.writeJSON(data.meta);
382
+ writer.writeUint8Array(data.body);
383
+ return writer.finish();
384
+ }
385
+ static deserialize(data) {
386
+ const reader = ByteReader.fromUint8Array(data);
387
+ const meta = reader.readJSON();
388
+ const body = reader.readUint8Array();
389
+ return new DataChunk(meta, body);
390
+ }
391
+ }
392
+
393
+ class OmuResponse {
394
+ headers;
395
+ ok;
396
+ redirected;
397
+ status;
398
+ statusText;
399
+ type;
400
+ url;
401
+ body;
402
+ bodyUsed;
403
+ constructor(headers, ok, redirected, status, statusText, type, url, body, bodyUsed) {
404
+ this.headers = headers;
405
+ this.ok = ok;
406
+ this.redirected = redirected;
407
+ this.status = status;
408
+ this.statusText = statusText;
409
+ this.type = type;
410
+ this.url = url;
411
+ this.body = body;
412
+ this.bodyUsed = bodyUsed;
413
+ }
414
+ clone() {
415
+ return new OmuResponse(this.headers, this.ok, this.redirected, this.status, this.statusText, this.type, this.url, this.body, this.bodyUsed);
416
+ }
417
+ async arrayBuffer() {
418
+ return await new Response(this.body).arrayBuffer();
419
+ }
420
+ blob() {
421
+ return new Response(this.body).blob();
422
+ }
423
+ bytes() {
424
+ return new Response(this.body).arrayBuffer().then((buf) => new Uint8Array(buf));
425
+ }
426
+ formData() {
427
+ return new Response(this.body).formData();
428
+ }
429
+ json() {
430
+ return new Response(this.body).json();
431
+ }
432
+ text() {
433
+ return new Response(this.body).text();
434
+ }
435
+ }
436
+ export {
437
+ OmuResponse,
438
+ DataChunk
439
+ };
440
+
441
+ //# debugId=69B36A1799FDA02064756E2164756E21
442
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NvbnN0LnRzIiwgIi4uLy4uL3NyYy9zZXJpYWxpemUvYnl0ZWJ1ZmZlci50cyIsICIuLi8uLi9zcmMvYXBpL2h0dHAvaHR0cC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJleHBvcnQgY29uc3QgdGV4dEVuY29kZXI6IFRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5leHBvcnQgY29uc3QgdGV4dERlY29kZXI6IFRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4iLAogICAgImltcG9ydCB7IHRleHREZWNvZGVyLCB0ZXh0RW5jb2RlciB9IGZyb20gJy4uL2NvbnN0LmpzJztcbmltcG9ydCB7IEpzb25UeXBlIH0gZnJvbSAnLi9zZXJpYWxpemVyLmpzJztcblxuZXhwb3J0IGNsYXNzIEZsYWdzIHtcbiAgICBwcml2YXRlIHZhbHVlOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBsZW5ndGg6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgdmFsdWU/OiBudW1iZXI7IGxlbmd0aD86IG51bWJlciB9KSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRpb25zLnZhbHVlID8/IDA7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0aW9ucy5sZW5ndGggPz8gMzI7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhwb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSAmICgxIDw8IHBvc2l0aW9uKSkgIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldChwb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSAmICgxIDw8IHBvc2l0aW9uKSkgIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGlmU2V0PFQ+KHBvc2l0aW9uOiBudW1iZXIsIGNhbGxiYWNrOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLmhhcyhwb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldChwb3NpdGlvbjogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgfD0gMSA8PCBwb3NpdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgJj0gfigxIDw8IHBvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZSh3cml0ZXI6IEJ5dGVXcml0ZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYml0cyA9IG5ldyBVaW50OEFycmF5KCh0aGlzLmxlbmd0aCArIDcpIC8gOCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYml0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYml0c1tpXSA9ICh0aGlzLnZhbHVlID4+IChpICogOCkpICYgMHhmZjtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIud3JpdGUoYml0cyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZWFkKHJlYWRlcjogQnl0ZVJlYWRlciwgbGVuZ3RoOiBudW1iZXIpOiBGbGFncyB7XG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKGxlbmd0aCArIDcpIC8gODsgaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZSB8PSByZWFkZXIucmVhZFVpbnQ4KCkgPDwgKGkgKiA4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZsYWdzKHsgdmFsdWUsIGxlbmd0aCB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRGbG9hdDE2KGRhdGFWaWV3OiBEYXRhVmlldywgb2Zmc2V0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHNpZ24gPSAoZGF0YVZpZXcuZ2V0VWludDE2KG9mZnNldCkgJiAweDgwMDApID8gLTEgOiAxO1xuICAgIGNvbnN0IGV4cG9uZW50ID0gKGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQpICYgMHg3YzAwKSA+PiAxMDtcbiAgICBjb25zdCBtYW50aXNzYSA9IChkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0KSAmIDB4MDNmZik7XG4gICAgaWYgKGV4cG9uZW50ID09PSAwICYmIG1hbnRpc3NhID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoZXhwb25lbnQgPT09IDB4MWYpIHtcbiAgICAgICAgcmV0dXJuIG1hbnRpc3NhID09PSAwID8gSW5maW5pdHkgKiBzaWduIDogTmFOO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHBvbmVudCA9IGV4cG9uZW50IC0gMTU7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNYW50aXNzYSA9IG1hbnRpc3NhIC8gMTAyNDtcbiAgICAgICAgcmV0dXJuIHNpZ24gKiBNYXRoLnBvdygyLCBub3JtYWxpemVkRXhwb25lbnQpICogKDEgKyBub3JtYWxpemVkTWFudGlzc2EpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdDE2KGRhdGFWaWV3OiBEYXRhVmlldywgb2Zmc2V0OiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09IDApIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgMCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2lnbiA9IHZhbHVlIDwgMCA/IDEgOiAwO1xuICAgIHZhbHVlID0gTWF0aC5hYnModmFsdWUpO1xuICAgIGlmICghaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIDB4N2MwMCB8IChzaWduIDw8IDE1KSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhwb25lbnQgPSBNYXRoLmZsb29yKE1hdGgubG9nMih2YWx1ZSkpO1xuICAgIGNvbnN0IG1hbnRpc3NhID0gdmFsdWUgLyBNYXRoLnBvdygyLCBleHBvbmVudCkgLSAxO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHBvbmVudCA9IGV4cG9uZW50ICsgMTU7XG4gICAgY29uc3Qgbm9ybWFsaXplZE1hbnRpc3NhID0gTWF0aC5yb3VuZChtYW50aXNzYSAqIDEwMjQpO1xuICAgIGlmIChub3JtYWxpemVkRXhwb25lbnQgPD0gMCkge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCBzaWduIDw8IDE1KTtcbiAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRFeHBvbmVudCA+PSAweDFmKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIDB4N2MwMCB8IChzaWduIDw8IDE1KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgKHNpZ24gPDwgMTUpIHwgKG5vcm1hbGl6ZWRFeHBvbmVudCA8PCAxMCkgfCBub3JtYWxpemVkTWFudGlzc2EpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ5dGVXcml0ZXIge1xuICAgIHByaXZhdGUgZGF0YVZpZXc6IERhdGFWaWV3O1xuICAgIHByaXZhdGUgYnVmZmVyOiBBcnJheUJ1ZmZlcjtcbiAgICBwcml2YXRlIG9mZnNldCA9IDA7XG4gICAgcHJpdmF0ZSBmaW5pc2hlZCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoaW5pdD86IEFycmF5QnVmZmVyLCBvZmZzZXQ/OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQgPz8gMDtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBpbml0ID8/IG5ldyBBcnJheUJ1ZmZlcigxMDI0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmJ1ZmZlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tVWludDhBcnJheShidWZmZXI6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICB1aW50OEFycmF5LnNldChuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlV3JpdGVyKGFycmF5QnVmZmVyLCBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhbGxvY2F0ZShsZW5ndGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vZmZzZXQgKyBsZW5ndGggPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdCeXRlTGVuZ3RoID0gTWF0aC5tYXgodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCAqIDIsIHRoaXMub2Zmc2V0ICsgbGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0J1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihuZXdCeXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KG5ld0J1ZmZlcikuc2V0KG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyKSk7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ld0J1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5idWZmZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKGRhdGE6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFsbG9jYXRlKGRhdGEubGVuZ3RoKTtcbiAgICAgICAgbmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIpLnNldChkYXRhLCB0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVCb29sZWFuKHZhbHVlOiBib29sZWFuKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50OCh0aGlzLm9mZnNldCwgdmFsdWUgPyAxIDogMCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDgodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDE2KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgyKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQxNih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQxNih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQzMih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50MzIodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDMyKHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50MzIodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50NjQodmFsdWU6IGJpZ2ludCk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDgpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEJpZ0ludDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQ2NCh2YWx1ZTogYmlnaW50KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoOCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0QmlnVWludDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVMRUIxMjgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICAvLyBVbnNpZ25lZCBMRUIxMjhcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh2YWx1ZSA+IDB4N2YpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQ4KHRoaXMub2Zmc2V0LCAodmFsdWUgJiAweDdmKSB8IDB4ODApO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgICAgIHZhbHVlID4+PSA3O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDgodGhpcy5vZmZzZXQsIHZhbHVlICYgMHg3Zik7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsb2F0MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB3cml0ZUZsb2F0MTYodGhpcy5kYXRhVmlldywgdGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxvYXQzMih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0RmxvYXQzMih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbG9hdDY0KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRGbG9hdDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQ4QXJyYXkodmFsdWU6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy53cml0ZVVMRUIxMjgodmFsdWUuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHRoaXMud3JpdGUodmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVTdHJpbmcodmFsdWU6IHN0cmluZyk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLndyaXRlVWludDhBcnJheSh0ZXh0RW5jb2Rlci5lbmNvZGUodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSlNPTih2YWx1ZTogSnNvblR5cGUpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy53cml0ZVN0cmluZyhKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbGFncyhmbGFnczogRmxhZ3MpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgZmxhZ3Mud3JpdGUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5pc2goKTogVWludDhBcnJheSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlciwgMCwgdGhpcy5vZmZzZXQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ5dGVSZWFkZXIge1xuICAgIHByaXZhdGUgZGF0YVZpZXc6IERhdGFWaWV3O1xuICAgIHByaXZhdGUgb2Zmc2V0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBmaW5pc2hlZDogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoZGF0YTogRGF0YVZpZXcpIHtcbiAgICAgICAgdGhpcy5kYXRhVmlldyA9IGRhdGE7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVVpbnQ4QXJyYXkoYnVmZmVyOiBVaW50OEFycmF5KTogQnl0ZVJlYWRlciB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICAgICAgdWludDhBcnJheS5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSk7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlUmVhZGVyKGRhdGFWaWV3KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21BcnJheUJ1ZmZlcihidWZmZXI6IEFycmF5QnVmZmVyKTogQnl0ZVJlYWRlciB7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBmcm9tQmxvYihibG9iOiBCbG9iKTogUHJvbWlzZTxCeXRlUmVhZGVyPiB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpO1xuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWQoc2l6ZTogbnVtYmVyKTogVWludDhBcnJheSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpemUgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCArIHNpemUgPiB0aGlzLmRhdGFWaWV3LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIG5vdCBmdWxseSByZWFkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgVWludDhBcnJheSh0aGlzLmRhdGFWaWV3LmJ1ZmZlciwgdGhpcy5vZmZzZXQsIHNpemUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSBzaXplO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRCb29sZWFuKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50OCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQxNigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50MTYodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDMyKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQzMigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50NjQoKTogYmlnaW50IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEJpZ0ludDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDY0KCk6IGJpZ2ludCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRCaWdVaW50NjQodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVTEVCMTI4KCk6IG51bWJlciB7XG4gICAgICAgIC8vIFVuc2lnbmVkIExFQjEyOFxuICAgICAgICBsZXQgdmFsdWUgPSAwO1xuICAgICAgICBsZXQgc2hpZnQgPSAwO1xuICAgICAgICBsZXQgYnl0ZTogbnVtYmVyO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgbm90IGZ1bGx5IHJlYWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ5dGUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICB2YWx1ZSB8PSAoYnl0ZSAmIDBiMDExMTExMTEpIDw8IHNoaWZ0O1xuICAgICAgICAgICAgc2hpZnQgKz0gNztcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoKGJ5dGUgJiAwYjEwMDAwMDAwKSAhPT0gMCk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZWFkRmxvYXQxNih0aGlzLmRhdGFWaWV3LCB0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0MzIoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEZsb2F0MzIodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbG9hdDY0KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRGbG9hdDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDhBcnJheSgpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yZWFkVUxFQjEyOCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkKGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYnl0ZUFycmF5ID0gdGhpcy5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVBcnJheSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRKU09OPFQgZXh0ZW5kcyBKc29uVHlwZT4oKTogVCB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMucmVhZFN0cmluZygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsYWdzKGxlbmd0aDogbnVtYmVyKTogRmxhZ3Mge1xuICAgICAgICByZXR1cm4gRmxhZ3MucmVhZCh0aGlzLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5pc2goKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCAhPT0gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBub3QgZnVsbHkgcmVhZCcpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyLCBKc29uVHlwZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RIYW5kbGUgPSB7XG4gICAgaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEh0dHBSZXF1ZXN0ID0gUmVxdWVzdEhhbmRsZSAmIHtcbiAgICBoZWFkZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgbWV0aG9kOiBzdHJpbmc7XG4gICAgcmVkaXJlY3Q6IFJlcXVlc3RSZWRpcmVjdDtcbiAgICB1cmw6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBEYXRhQ2h1bms8VCBleHRlbmRzIEpzb25UeXBlPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBtZXRhOiBULFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYm9keTogVWludDhBcnJheSxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemU8VCBleHRlbmRzIEpzb25UeXBlPihkYXRhOiBEYXRhQ2h1bms8VD4pOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlSlNPTihkYXRhLm1ldGEpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGRhdGEuYm9keSk7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZTxUIGV4dGVuZHMgSnNvblR5cGU+KGRhdGE6IFVpbnQ4QXJyYXkpOiBEYXRhQ2h1bms8VD4ge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBtZXRhID0gcmVhZGVyLnJlYWRKU09OPFQ+KCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhQ2h1bmsobWV0YSwgYm9keSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgT211UmVzcG9uc2UgaW1wbGVtZW50cyBSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgb2s6IGJvb2xlYW4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZWRpcmVjdGVkOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXNUZXh0OiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBSZXNwb25zZVR5cGUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJvZHk6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+PiB8IG51bGwsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBib2R5VXNlZDogYm9vbGVhbixcbiAgICApIHt9XG5cbiAgICBjbG9uZSgpOiBPbXVSZXNwb25zZSB7XG4gICAgICAgIHJldHVybiBuZXcgT211UmVzcG9uc2UoXG4gICAgICAgICAgICB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICB0aGlzLm9rLFxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdGVkLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICB0aGlzLnN0YXR1c1RleHQsXG4gICAgICAgICAgICB0aGlzLnR5cGUsXG4gICAgICAgICAgICB0aGlzLnVybCxcbiAgICAgICAgICAgIHRoaXMuYm9keSxcbiAgICAgICAgICAgIHRoaXMuYm9keVVzZWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIGFzeW5jIGFycmF5QnVmZmVyKCk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmFycmF5QnVmZmVyKCk7XG4gICAgfVxuICAgIGJsb2IoKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS5ibG9iKCk7XG4gICAgfVxuICAgIGJ5dGVzKCk6IFByb21pc2U8VWludDhBcnJheTxBcnJheUJ1ZmZlcj4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmFycmF5QnVmZmVyKCkudGhlbigoYnVmKSA9PiBuZXcgVWludDhBcnJheShidWYpKTtcbiAgICB9XG4gICAgZm9ybURhdGEoKTogUHJvbWlzZTxGb3JtRGF0YT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuZm9ybURhdGEoKTtcbiAgICB9XG4gICAganNvbigpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuanNvbigpO1xuICAgIH1cbiAgICB0ZXh0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS50ZXh0KCk7XG4gICAgfVxufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7QUFBTyxJQUFNLGNBQTJCLElBQUk7QUFDckMsSUFBTSxjQUEyQixJQUFJOzs7QUNFckMsTUFBTSxNQUFNO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxFQUVSLFdBQVcsQ0FBQyxTQUE4QztBQUFBLElBQ3RELEtBQUssUUFBUSxRQUFRLFNBQVM7QUFBQSxJQUM5QixLQUFLLFNBQVMsUUFBUSxVQUFVO0FBQUE7QUFBQSxFQUc3QixHQUFHLENBQUMsVUFBMkI7QUFBQSxJQUNsQyxRQUFRLEtBQUssUUFBUyxLQUFLLGNBQWU7QUFBQTtBQUFBLEVBR3ZDLEdBQUcsQ0FBQyxVQUEyQjtBQUFBLElBQ2xDLFFBQVEsS0FBSyxRQUFTLEtBQUssY0FBZTtBQUFBO0FBQUEsRUFHdkMsS0FBUSxDQUFDLFVBQWtCLFVBQWtDO0FBQUEsSUFDaEUsSUFBSSxLQUFLLElBQUksUUFBUSxHQUFHO0FBQUEsTUFDcEIsT0FBTyxTQUFTO0FBQUEsSUFDcEI7QUFBQSxJQUNBO0FBQUE7QUFBQSxFQUdHLEdBQUcsQ0FBQyxVQUFrQixPQUFzQjtBQUFBLElBQy9DLElBQUksT0FBTztBQUFBLE1BQ1AsS0FBSyxTQUFTLEtBQUs7QUFBQSxJQUN2QixFQUFPO0FBQUEsTUFDSCxLQUFLLFNBQVMsRUFBRSxLQUFLO0FBQUE7QUFBQTtBQUFBLEVBSXRCLEtBQUssQ0FBQyxRQUEwQjtBQUFBLElBQ25DLE1BQU0sT0FBTyxJQUFJLFlBQVksS0FBSyxTQUFTLEtBQUssQ0FBQztBQUFBLElBQ2pELFNBQVMsSUFBSSxFQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFBQSxNQUNsQyxLQUFLLEtBQU0sS0FBSyxTQUFVLElBQUksSUFBTTtBQUFBLElBQ3hDO0FB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QUMsTUFBZ0M7QUFBQSxJQUMxRSxNQUFNLFNBQVMsV0FBVyxlQUFlLElBQUk7QUFBQSxJQUM3QyxNQUFNLE9BQU8sT0FBTyxTQUFZO0FBQUEsSUFDaEMsTUFBTSxPQUFPLE9BQU8sZUFBZTtBQUFBLElBQ25DLE9BQU8sSUFBSSxVQUFVLE1BQU0sSUFBSTtBQUFBO0FBRXZDO0FBQUE7QUFFTyxNQUFNLFlBQWdDO0FBQUEsRUFFckI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBVHBCLFdBQVcsQ0FDUyxTQUNBLElBQ0EsWUFDQSxRQUNBLFlBQ0EsTUFDQSxLQUNBLE1BQ0EsVUFDbEI7QUFBQSxJQVRrQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUE7QUFBQSxFQUdwQixLQUFLLEdBQWdCO0FBQUEsSUFDakIsT0FBTyxJQUFJLFlBQ1AsS0FBSyxTQUNMLEtBQUssSUFDTCxLQUFLLFlBQ0wsS0FBSyxRQUNMLEtBQUssWUFDTCxLQUFLLE1BQ0wsS0FBSyxLQUNMLEtBQUssTUFDTCxLQUFLLFFBQ1Q7QUFBQTtBQUFBLE9BRUUsWUFBVyxHQUF5QjtBQUFBLElBQ3RDLE9BQU8sTUFBTSxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUUsWUFBWTtBQUFBO0FBQUEsRUFFckQsSUFBSSxHQUFrQjtBQUFBLElBQ2xCLE9BQU8sSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFLEtBQUs7QUFBQTtBQUFBLEVBRXhDLEtBQUssR0FBcUM7QUFBQSxJQUN0QyxPQUFPLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxXQUFXLEdBQUcsQ0FBQztBQUFBO0FBQUEsRUFFbEYsUUFBUSxHQUFzQjtBQUFBLElBQzFCLE9BQU8sSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFLFNBQVM7QUFBQTtBQUFBLEVBRTVDLElBQUksR0FBaUI7QUFBQSxJQUNqQixPQUFPLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxLQUFLO0FBQUE7QUFBQSxFQUV4QyxJQUFJLEdBQW9CO0FBQUEsSUFDcEIsT0FBTyxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUUsS0FBSztBQUFBO0FBRTVDOyIsCiAgImRlYnVnSWQiOiAiNjlCMzZBMTc5OUZEQTAyMDY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=