| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525 |
1
3
21
7
24
1
1
1
1
1
1
1
1
18
18
18
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
4
1
1
1
1
1
1
1
1
2
2
5
2
1
1
1
1
2
1
2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
4
8
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
| "use strict";
var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; };
var _prototypeProperties = function (child, staticProps, instanceProps) { if (staticProps) Object.defineProperties(child, staticProps); if (instanceProps) Object.defineProperties(child.prototype, instanceProps); };
var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); Iif (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else Eif ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _inherits = function (subClass, superClass) { Iif (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); Eif (superClass) subClass.__proto__ = superClass; };
var _classCallCheck = function (instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
var _Flux = require("../Flux");
var Store = _Flux.Store;
var Flux = _Flux.Flux;
var Actions = _Flux.Actions;
var sinon = _interopRequire(require("sinon"));
describe("Store", function () {
var ExampleStore = (function (Store) {
function ExampleStore() {
_classCallCheck(this, ExampleStore);
_get(Object.getPrototypeOf(ExampleStore.prototype), "constructor", this).call(this);
this.state = { foo: "bar" };
}
_inherits(ExampleStore, Store);
return ExampleStore;
})(Store);
var actionId = "actionId";
describe("#register()", function () {
it("adds handler to internal collection of handlers", function () {
var _store$_handlers;
var store = new ExampleStore();
var handler = sinon.spy();
store.register(actionId, handler);
var mockArgs = ["foo", "bar"];
(_store$_handlers = store._handlers)[actionId].apply(_store$_handlers, mockArgs);
expect(handler.calledWith.apply(handler, mockArgs)).to.be["true"];
});
it("binds handler to store", function () {
var store = new ExampleStore();
store.foo = "bar";
function handler() {
return this.foo;
}
store.register(actionId, handler);
expect(store._handlers[actionId]()).to.equal("bar");
});
it("accepts actions instead of action ids", function () {
var _store$_handlers;
var ExampleActions = (function (Actions) {
function ExampleActions() {
_classCallCheck(this, ExampleActions);
Eif (Actions != null) {
Actions.apply(this, arguments);
}
}
_inherits(ExampleActions, Actions);
_prototypeProperties(ExampleActions, null, {
getFoo: {
value: function getFoo() {
return "foo";
},
writable: true,
configurable: true
}
});
return ExampleActions;
})(Actions);
var actions = new ExampleActions();
var store = new ExampleStore();
var handler = sinon.spy();
store.register(actions.getFoo, handler);
var mockArgs = ["foo", "bar"];
(_store$_handlers = store._handlers)[actions.getFoo._id].apply(_store$_handlers, mockArgs);
expect(handler.calledWith.apply(handler, mockArgs)).to.be["true"];
});
it("ignores non-function handlers", function () {
var store = new ExampleStore();
expect(store.register.bind(store, null)).not.to["throw"]();
});
});
it("default state is null", function () {
var store = new Store();
expect(store.state).to.be["null"];
});
describe("#registerAsync()", function () {
it("registers handlers for begin, success, and failure of async action", function callee$2$0() {
var error, ExampleActions, ExampleFlux, flux, actions, store, handler, begin, success, failure;
return regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
error = new Error();
ExampleActions = (function (Actions) {
function ExampleActions() {
_classCallCheck(this, ExampleActions);
Eif (Actions != null) {
Actions.apply(this, arguments);
}
}
_inherits(ExampleActions, Actions);
_prototypeProperties(ExampleActions, null, {
getFoo: {
value: function getFoo(message) {
var _success = arguments[1] === undefined ? true : arguments[1];
return regeneratorRuntime.async(function getFoo$(context$5$0) {
while (1) switch (context$5$0.prev = context$5$0.next) {
case 0:
if (_success) {
context$5$0.next = 2;
break;
}
throw error;
case 2:
return context$5$0.abrupt("return", message + " success");
case 3:
case "end":
return context$5$0.stop();
}
}, null, this);
},
writable: true,
configurable: true
},
getBar: {
value: function getBar(message) {
return regeneratorRuntime.async(function getBar$(context$5$0) {
while (1) switch (context$5$0.prev = context$5$0.next) {
case 0:
return context$5$0.abrupt("return", message);
case 1:
case "end":
return context$5$0.stop();
}
}, null, this);
},
writable: true,
configurable: true
}
});
return ExampleActions;
})(Actions);
ExampleFlux = (function (Flux) {
function ExampleFlux() {
_classCallCheck(this, ExampleFlux);
_get(Object.getPrototypeOf(ExampleFlux.prototype), "constructor", this).call(this);
this.createActions("example", ExampleActions);
this.createStore("example", ExampleStore);
}
_inherits(ExampleFlux, Flux);
return ExampleFlux;
})(Flux);
flux = new ExampleFlux();
actions = flux.getActions("example");
store = flux.getStore("example");
handler = sinon.spy();
store.register(actions.getBar, handler);
context$3$0.next = 10;
return actions.getBar("bar");
case 10:
expect(handler.calledOnce).to.be["true"];
expect(handler.firstCall.args).to.deep.equal(["bar"]);
begin = sinon.spy();
success = sinon.spy();
failure = sinon.spy();
store.registerAsync(actions.getFoo, begin, success, failure);
context$3$0.next = 18;
return actions.getFoo("foo", true);
case 18:
expect(begin.calledOnce).to.be["true"];
expect(begin.firstCall.args).to.deep.equal(["foo", true]);
expect(success.calledOnce).to.be["true"];
expect(success.firstCall.args[0]).to.equal("foo success");
expect(failure.called).to.be["false"];
context$3$0.next = 25;
return expect(actions.getFoo("bar", false)).to.be.rejected;
case 25:
expect(begin.calledTwice).to.be["true"];
expect(success.calledOnce).to.be["true"];
expect(failure.calledOnce).to.be["true"];
expect(failure.firstCall.args[0]).to.equal(error);
case 29:
case "end":
return context$3$0.stop();
}
}, null, this);
});
it("ignores non-function handlers", function () {
var store = new ExampleStore();
expect(store.registerAsync.bind(store, null)).not.to["throw"]();
});
});
describe("#handler()", function () {
it("delegates dispatches to registered handlers", function () {
var store = new ExampleStore();
var handler = sinon.spy();
store.register(actionId, handler);
// Simulate dispatch
var body = { foo: "bar" };
store.handler({ body: body, actionId: actionId });
expect(handler.calledWith(body)).to.be["true"];
});
});
describe("#waitFor()", function () {
it("waits for other stores", function () {
var flux = new Flux();
var result = [];
var store2 = undefined;
var Store1 = (function (Store) {
function Store1() {
_classCallCheck(this, Store1);
_get(Object.getPrototypeOf(Store1.prototype), "constructor", this).call(this);
this.register(actionId, function () {
this.waitFor(store2);
result.push(1);
});
}
_inherits(Store1, Store);
return Store1;
})(Store);
var Store2 = (function (Store) {
function Store2() {
_classCallCheck(this, Store2);
_get(Object.getPrototypeOf(Store2.prototype), "constructor", this).call(this);
this.register(actionId, function () {
result.push(2);
});
}
_inherits(Store2, Store);
return Store2;
})(Store);
flux.createStore("store1", Store1);
flux.createStore("store2", Store2);
store2 = flux.getStore("store2");
flux.dispatch(actionId, "foobar");
expect(result).to.deep.equal([2, 1]);
});
});
describe("#forceUpdate()", function () {
it("emits change event", function () {
var store = new ExampleStore();
var listener = sinon.spy();
store.addListener("change", listener);
store.forceUpdate();
expect(listener.calledOnce).to.be["true"];
});
it("doesn't modify existing state", function () {
var store = new ExampleStore();
var listener = sinon.spy();
store.addListener("change", listener);
store.register(actionId, function () {
this.replaceState({ bar: "baz" });
this.forceUpdate();
expect(this.state).to.deep.equal({ foo: "bar" });
expect(listener.called).to.be["false"];
this.setState({ foo: "bar" });
this.forceUpdate();
this.replaceState({ baz: "foo" });
});
// Simulate dispatch
store.handler({ actionId: actionId, body: "foobar" });
expect(listener.calledOnce).to.be["true"];
expect(store.state).to.deep.equal({ baz: "foo" });
});
});
describe("#setState()", function () {
it("shallow merges old state with new state", function () {
var store = new ExampleStore();
store.setState({ bar: "baz" });
expect(store.state).to.deep.equal({
foo: "bar",
bar: "baz" });
});
it("supports transactional updates", function () {
var store = new Store();
store.state = { a: 1 };
store.setState(function (state) {
return { a: state.a + 1 };
});
expect(store.state.a).to.equal(2);
store.setState(function (state) {
return { a: state.a + 1 };
});
expect(store.state.a).to.equal(3);
store.setState(function (state) {
return { a: state.a + 1 };
});
expect(store.state.a).to.equal(4);
});
it("emits change event", function () {
var store = new ExampleStore();
var listener = sinon.spy();
store.addListener("change", listener);
store.setState({ foo: "bar" });
expect(listener.calledOnce).to.be["true"];
});
it("batches multiple state updates within action handler", function () {
var store = new ExampleStore();
var listener = sinon.spy();
store.addListener("change", listener);
store.register(actionId, function () {
this.setState({ bar: "baz" });
expect(this.state).to.deep.equal({ foo: "bar" });
expect(listener.called).to.be["false"];
this.setState({ baz: "foo" });
});
// Simulate dispatch
store.handler({ actionId: actionId, body: "foobar" });
expect(listener.calledOnce).to.be["true"];
expect(store.state).to.deep.equal({ foo: "bar", bar: "baz", baz: "foo" });
});
it("warns if called from outside an action handler", function () {
var store = new ExampleStore();
var warn = sinon.spy(console, "warn");
store.setState({ foo: "bar" });
expect(warn.firstCall.args[0]).to.equal("Store#setState() called from outside an action handler. This is " + "likely a mistake. Flux stores should manage their own state.");
console.warn.restore();
});
});
describe("#replaceState()", function () {
it("replaces old state with new state", function () {
var store = new ExampleStore();
store.replaceState({ bar: "baz" });
expect(store.state).to.deep.equal({
bar: "baz" });
});
it("batches multiple state updates within action handler", function () {
var store = new ExampleStore();
var listener = sinon.spy();
store.addListener("change", listener);
store.register(actionId, function () {
this.replaceState({ bar: "baz" });
expect(this.state).to.deep.equal({ foo: "bar" });
expect(listener.called).to.be["false"];
this.setState({ foo: "bar" });
this.replaceState({ baz: "foo" });
});
// Simulate dispatch
store.handler({ actionId: actionId, body: "foobar" });
expect(listener.calledOnce).to.be["true"];
expect(store.state).to.deep.equal({ baz: "foo" });
});
it("emits change event", function () {
var store = new ExampleStore();
var listener = sinon.spy();
store.addListener("change", listener);
store.replaceState({ foo: "bar" });
expect(listener.calledOnce).to.be["true"];
});
});
describe(".assignState", function () {
it("can be overridden to enable custom state types", function () {
var StringStore = (function (Store) {
function StringStore() {
_classCallCheck(this, StringStore);
Eif (Store != null) {
Store.apply(this, arguments);
}
}
_inherits(StringStore, Store);
_prototypeProperties(StringStore, {
assignState: {
value: function assignState(prevState, nextState) {
return [prevState, nextState].filter(function (state) {
return typeof state === "string";
}).join("");
},
writable: true,
configurable: true
}
});
return StringStore;
})(Store);
var store = new StringStore();
expect(store.state).to.be["null"];
store.setState("a");
expect(store.state).to.equal("a");
store.setState("b");
expect(store.state).to.equal("ab");
store.replaceState("xyz");
expect(store.state).to.equal("xyz");
store.setState("zyx");
expect(store.state).to.equal("xyzzyx");
});
});
describe("#forceUpdate()", function () {
it("emits change event", function () {
var store = new ExampleStore();
var listener = sinon.spy();
store.addListener("change", listener);
store.forceUpdate();
expect(listener.calledOnce).to.be["true"];
});
it("doesn't modify existing state", function () {
var store = new ExampleStore();
var listener = sinon.spy();
store.addListener("change", listener);
store.register(actionId, function () {
this.replaceState({ bar: "baz" });
this.forceUpdate();
expect(this.state).to.deep.equal({ foo: "bar" });
expect(listener.called).to.be["false"];
this.setState({ foo: "bar" });
this.forceUpdate();
this.replaceState({ baz: "foo" });
});
// Simulate dispatch
store.handler({ actionId: actionId, body: "foobar" });
expect(listener.calledOnce).to.be["true"];
expect(store.state).to.deep.equal({ baz: "foo" });
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9fX3Rlc3RzX18vU3RvcmUtdGVzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7b0JBQXFDLFNBQVM7O0lBQXJDLEtBQUssU0FBTCxLQUFLO0lBQUUsSUFBSSxTQUFKLElBQUk7SUFBRSxPQUFPLFNBQVAsT0FBTztJQUN0QixLQUFLLDJCQUFNLE9BQU87O0FBRXpCLFFBQVEsQ0FBQyxPQUFPLEVBQUUsWUFBTTtNQUNoQixZQUFZLGNBQVMsS0FBSztBQUNuQixhQURQLFlBQVk7NEJBQVosWUFBWTs7QUFFZCxpQ0FGRSxZQUFZLDZDQUVOO0FBQ1IsVUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztLQUM3Qjs7Y0FKRyxZQUFZLEVBQVMsS0FBSzs7V0FBMUIsWUFBWTtLQUFTLEtBQUs7O0FBT2hDLE1BQUksUUFBUSxHQUFHLFVBQVUsQ0FBQzs7QUFFMUIsVUFBUSxDQUFDLGFBQWEsRUFBRSxZQUFNO0FBQzVCLE1BQUUsQ0FBQyxpREFBaUQsRUFBRSxZQUFNOztBQUMxRCxVQUFJLEtBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0FBQy9CLFVBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixXQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFbEMsVUFBSSxRQUFRLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUIsMEJBQUEsS0FBSyxDQUFDLFNBQVMsRUFBQyxRQUFRLE9BQUMsbUJBQUksUUFBUSxDQUFDLENBQUM7O0FBRXZDLFlBQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxNQUFBLENBQWxCLE9BQU8sRUFBZSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQUssQ0FBQztLQUNwRCxDQUFDLENBQUM7O0FBRUgsTUFBRSxDQUFDLHdCQUF3QixFQUFFLFlBQU07QUFDakMsVUFB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Q0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNuRCxDQUFDLENBQUM7R0FDSixDQUFDLENBQUM7Q0FFSixDQUFDLENBQUMiLCJmaWxlIjoibGliL19fdGVzdHNfXy9TdG9yZS10ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RvcmUsIEZsdXgsIEFjdGlvbnMgfSBmcm9tICcuLi9GbHV4JztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5cbmRlc2NyaWJlKCdTdG9yZScsICgpID0+IHtcbiAgY2xhc3MgRXhhbXBsZVN0b3JlIGV4dGVuZHMgU3RvcmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIHRoaXMuc3RhdGUgPSB7IGZvbzogJ2JhcicgfTtcbiAgICB9XG4gIH1cblxuICBsZXQgYWN0aW9uSWQgPSAnYWN0aW9uSWQnO1xuXG4gIGRlc2NyaWJlKCcjcmVnaXN0ZXIoKScsICgpID0+IHtcbiAgICBpdCgnYWRkcyBoYW5kbGVyIHRvIGludGVybmFsIGNvbGxlY3Rpb24gb2YgaGFuZGxlcnMnLCAoKSA9PiB7XG4gICAgICBsZXQgc3RvcmUgPSBuZXcgRXhhbXBsZVN0b3JlKCk7XG4gICAgICBsZXQgaGFuZGxlciA9IHNpbm9uLnNweSgpO1xuICAgICAgc3RvcmUucmVnaXN0ZXIoYWN0aW9uSWQsIGhhbmRsZXIpO1xuXG4gICAgICBsZXQgbW9ja0FyZ3MgPSBbJ2ZvbycsICdiYXInXTtcbiAgICAgIHN0b3JlLl9oYW5kbGVyc1thY3Rpb25JZF0oLi4ubW9ja0FyZ3MpO1xuXG4gICAgICBleHBlY3QoaGFuZGxlci5jYWxsZWRXaXRoKC4uLm1vY2tBcmdzKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdiaW5kcyBoYW5kbGVyIHRvIHN0b3JlJywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuICAgICAgc3RvcmUuZm9vID0gJ2Jhcic7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvbztcbiAgICAgIH1cblxuICAgICAgc3RvcmUucmVnaXN0ZXIoYWN0aW9uSWQsIGhhbmRsZXIpO1xuXG4gICAgICBleHBlY3Qoc3RvcmUuX2hhbmRsZXJzW2FjdGlvbklkXSgpKS50by5lcXVhbCgnYmFyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYWNjZXB0cyBhY3Rpb25zIGluc3RlYWQgb2YgYWN0aW9uIGlkcycsICgpID0+IHtcbiAgICAgIGNsYXNzIEV4YW1wbGVBY3Rpb25zIGV4dGVuZHMgQWN0aW9ucyB7XG4gICAgICAgIGdldEZvbygpIHtcbiAgICAgICAgICByZXR1cm4gJ2Zvbyc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGFjdGlvbnMgPSBuZXcgRXhhbXBsZUFjdGlvbnMoKTtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGxldCBoYW5kbGVyID0gc2lub24uc3B5KCk7XG4gICAgICBzdG9yZS5yZWdpc3RlcihhY3Rpb25zLmdldEZvbywgaGFuZGxlcik7XG5cbiAgICAgIGxldCBtb2NrQXJncyA9IFsnZm9vJywgJ2JhciddO1xuICAgICAgc3RvcmUuX2hhbmRsZXJzW2FjdGlvbnMuZ2V0Rm9vLl9pZF0oLi4ubW9ja0FyZ3MpO1xuXG4gICAgICBleHBlY3QoaGFuZGxlci5jYWxsZWRXaXRoKC4uLm1vY2tBcmdzKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdpZ25vcmVzIG5vbi1mdW5jdGlvbiBoYW5kbGVycycsICgpID0+IHtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGV4cGVjdChzdG9yZS5yZWdpc3Rlci5iaW5kKHN0b3JlLCBudWxsKSkubm90LnRvLnRocm93KCk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgaXQoJ2RlZmF1bHQgc3RhdGUgaXMgbnVsbCcsICgpID0+IHtcbiAgICBjb25zdCBzdG9yZSA9IG5ldyBTdG9yZSgpO1xuICAgIGV4cGVjdChzdG9yZS5zdGF0ZSkudG8uYmUubnVsbDtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNyZWdpc3RlckFzeW5jKCknLCAoKSA9PiB7XG4gICAgaXQoJ3JlZ2lzdGVycyBoYW5kbGVycyBmb3IgYmVnaW4sIHN1Y2Nlc3MsIGFuZCBmYWlsdXJlIG9mIGFzeW5jIGFjdGlvbicsIGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKCk7XG5cbiAgICAgIGNsYXNzIEV4YW1wbGVBY3Rpb25zIGV4dGVuZHMgQWN0aW9ucyB7XG4gICAgICAgIGFzeW5jIGdldEZvbyhtZXNzYWdlLCBfc3VjY2VzcyA9IHRydWUpIHtcbiAgICAgICAgICBpZiAoIV9zdWNjZXNzKSB0aHJvdyBlcnJvcjtcblxuICAgICAgICAgIHJldHVybiBtZXNzYWdlICsgJyBzdWNjZXNzJztcbiAgICAgICAgfVxuXG4gICAgICAgIGFzeW5jIGdldEJhcihtZXNzYWdlKSB7XG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xhc3MgRXhhbXBsZUZsdXggZXh0ZW5kcyBGbHV4IHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUFjdGlvbnMoJ2V4YW1wbGUnLCBFeGFtcGxlQWN0aW9ucyk7XG4gICAgICAgICAgdGhpcy5jcmVhdGVTdG9yZSgnZXhhbXBsZScsIEV4YW1wbGVTdG9yZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGZsdXggPSBuZXcgRXhhbXBsZUZsdXgoKTtcbiAgICAgIGxldCBhY3Rpb25zID0gZmx1eC5nZXRBY3Rpb25zKCdleGFtcGxlJyk7XG4gICAgICBsZXQgc3RvcmUgPSBmbHV4LmdldFN0b3JlKCdleGFtcGxlJyk7XG5cbiAgICAgIGxldCBoYW5kbGVyID0gc2lub24uc3B5KCk7XG4gICAgICBzdG9yZS5yZWdpc3RlcihhY3Rpb25zLmdldEJhciwgaGFuZGxlcik7XG5cbiAgICAgIGF3YWl0IGFjdGlvbnMuZ2V0QmFyKCdiYXInKTtcbiAgICAgIGV4cGVjdChoYW5kbGVyLmNhbGxlZE9uY2UpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3QoaGFuZGxlci5maXJzdENhbGwuYXJncykudG8uZGVlcC5lcXVhbChbJ2JhciddKTtcblxuICAgICAgbGV0IGJlZ2luID0gc2lub24uc3B5KCk7XG4gICAgICBsZXQgc3VjY2VzcyA9IHNpbm9uLnNweSgpO1xuICAgICAgbGV0IGZhaWx1cmUgPSBzaW5vbi5zcHkoKTtcbiAgICAgIHN0b3JlLnJlZ2lzdGVyQXN5bmMoYWN0aW9ucy5nZXRGb28sIGJlZ2luLCBzdWNjZXNzLCBmYWlsdXJlKTtcblxuICAgICAgYXdhaXQgYWN0aW9ucy5nZXRGb28oJ2ZvbycsIHRydWUpO1xuICAgICAgZXhwZWN0KGJlZ2luLmNhbGxlZE9uY2UpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3QoYmVnaW4uZmlyc3RDYWxsLmFyZ3MpLnRvLmRlZXAuZXF1YWwoWydmb28nLCB0cnVlXSk7XG4gICAgICBleHBlY3Qoc3VjY2Vzcy5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHN1Y2Nlc3MuZmlyc3RDYWxsLmFyZ3NbMF0pLnRvLmVxdWFsKCdmb28gc3VjY2VzcycpO1xuICAgICAgZXhwZWN0KGZhaWx1cmUuY2FsbGVkKS50by5iZS5mYWxzZTtcblxuICAgICAgYXdhaXQgZXhwZWN0KGFjdGlvbnMuZ2V0Rm9vKCdiYXInLCBmYWxzZSkpLnRvLmJlLnJlamVjdGVkO1xuXG4gICAgICBleHBlY3QoYmVnaW4uY2FsbGVkVHdpY2UpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3VjY2Vzcy5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KGZhaWx1cmUuY2FsbGVkT25jZSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChmYWlsdXJlLmZpcnN0Q2FsbC5hcmdzWzBdKS50by5lcXVhbChlcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnaWdub3JlcyBub24tZnVuY3Rpb24gaGFuZGxlcnMnLCAoKSA9PiB7XG4gICAgICBsZXQgc3RvcmUgPSBuZXcgRXhhbXBsZVN0b3JlKCk7XG4gICAgICBleHBlY3Qoc3RvcmUucmVnaXN0ZXJBc3luYy5iaW5kKHN0b3JlLCBudWxsKSkubm90LnRvLnRocm93KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjaGFuZGxlcigpJywgKCkgPT4ge1xuICAgIGl0KCdkZWxlZ2F0ZXMgZGlzcGF0Y2hlcyB0byByZWdpc3RlcmVkIGhhbmRsZXJzJywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuICAgICAgbGV0IGhhbmRsZXIgPSBzaW5vbi5zcHkoKTtcbiAgICAgIHN0b3JlLnJlZ2lzdGVyKGFjdGlvbklkLCBoYW5kbGVyKTtcblxuICAgICAgLy8gU2ltdWxhdGUgZGlzcGF0Y2hcbiAgICAgIGxldCBib2R5ID0geyBmb286ICdiYXInIH07XG4gICAgICBzdG9yZS5oYW5kbGVyKHsgYm9keSwgYWN0aW9uSWQgfSk7XG5cbiAgICAgIGV4cGVjdChoYW5kbGVyLmNhbGxlZFdpdGgoYm9keSkpLnRvLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjd2FpdEZvcigpJywgKCkgPT4ge1xuICAgIGl0KCd3YWl0cyBmb3Igb3RoZXIgc3RvcmVzJywgKCkgPT4ge1xuICAgICAgbGV0IGZsdXggPSBuZXcgRmx1eCgpO1xuICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuXG4gICAgICBsZXQgc3RvcmUyO1xuXG4gICAgICBjbGFzcyBTdG9yZTEgZXh0ZW5kcyBTdG9yZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyKGFjdGlvbklkLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMud2FpdEZvcihzdG9yZTIpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goMSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xhc3MgU3RvcmUyIGV4dGVuZHMgU3RvcmUge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgICAgdGhpcy5yZWdpc3RlcihhY3Rpb25JZCwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goMik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZmx1eC5jcmVhdGVTdG9yZSgnc3RvcmUxJywgU3RvcmUxKTtcbiAgICAgIGZsdXguY3JlYXRlU3RvcmUoJ3N0b3JlMicsIFN0b3JlMik7XG5cbiAgICAgIHN0b3JlMiA9IGZsdXguZ2V0U3RvcmUoJ3N0b3JlMicpO1xuXG4gICAgICBmbHV4LmRpc3BhdGNoKGFjdGlvbklkLCAnZm9vYmFyJyk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoWzIsIDFdKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNmb3JjZVVwZGF0ZSgpJywgKCkgPT4ge1xuICAgIGl0KCdlbWl0cyBjaGFuZ2UgZXZlbnQnLCAoKSA9PiB7XG4gICAgICBsZXQgc3RvcmUgPSBuZXcgRXhhbXBsZVN0b3JlKCk7XG4gICAgICBsZXQgbGlzdGVuZXIgPSBzaW5vbi5zcHkoKTtcbiAgICAgIHN0b3JlLmFkZExpc3RlbmVyKCdjaGFuZ2UnLCBsaXN0ZW5lcik7XG5cbiAgICAgIHN0b3JlLmZvcmNlVXBkYXRlKCk7XG5cbiAgICAgIGV4cGVjdChsaXN0ZW5lci5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXNuXFwndCBtb2RpZnkgZXhpc3Rpbmcgc3RhdGUnLCAoKSA9PiB7XG4gICAgICBsZXQgc3RvcmUgPSBuZXcgRXhhbXBsZVN0b3JlKCk7XG4gICAgICBsZXQgbGlzdGVuZXIgPSBzaW5vbi5zcHkoKTtcbiAgICAgIHN0b3JlLmFkZExpc3RlbmVyKCdjaGFuZ2UnLCBsaXN0ZW5lcik7XG5cbiAgICAgIHN0b3JlLnJlZ2lzdGVyKGFjdGlvbklkLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5yZXBsYWNlU3RhdGUoeyBiYXI6ICdiYXonIH0pO1xuICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG5cbiAgICAgICAgZXhwZWN0KHRoaXMuc3RhdGUpLnRvLmRlZXAuZXF1YWwoeyBmb286ICdiYXInIH0pO1xuICAgICAgICBleHBlY3QobGlzdGVuZXIuY2FsbGVkKS50by5iZS5mYWxzZTtcblxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZm9vOiAnYmFyJyB9KTtcbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICB0aGlzLnJlcGxhY2VTdGF0ZSh7IGJhejogJ2ZvbycgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2ltdWxhdGUgZGlzcGF0Y2hcbiAgICAgIHN0b3JlLmhhbmRsZXIoeyBhY3Rpb25JZCwgYm9keTogJ2Zvb2JhcicgfSk7XG5cbiAgICAgIGV4cGVjdChsaXN0ZW5lci5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlKS50by5kZWVwLmVxdWFsKHsgYmF6OiAnZm9vJyB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNzZXRTdGF0ZSgpJywgKCkgPT4ge1xuICAgIGl0KCdzaGFsbG93IG1lcmdlcyBvbGQgc3RhdGUgd2l0aCBuZXcgc3RhdGUnLCAoKSA9PiB7XG4gICAgICBsZXQgc3RvcmUgPSBuZXcgRXhhbXBsZVN0b3JlKCk7XG5cbiAgICAgIHN0b3JlLnNldFN0YXRlKHsgYmFyOiAnYmF6JyB9KTtcblxuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlKS50by5kZWVwLmVxdWFsKHtcbiAgICAgICAgZm9vOiAnYmFyJyxcbiAgICAgICAgYmFyOiAnYmF6JyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N1cHBvcnRzIHRyYW5zYWN0aW9uYWwgdXBkYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlID0gbmV3IFN0b3JlKCk7XG4gICAgICBzdG9yZS5zdGF0ZSA9IHsgYTogMSB9O1xuICAgICAgc3RvcmUuc2V0U3RhdGUoc3RhdGUgPT4gKHsgYTogc3RhdGUuYSArIDEgfSkpO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlLmEpLnRvLmVxdWFsKDIpO1xuICAgICAgc3RvcmUuc2V0U3RhdGUoc3RhdGUgPT4gKHsgYTogc3RhdGUuYSArIDEgfSkpO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlLmEpLnRvLmVxdWFsKDMpO1xuICAgICAgc3RvcmUuc2V0U3RhdGUoc3RhdGUgPT4gKHsgYTogc3RhdGUuYSArIDEgfSkpO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlLmEpLnRvLmVxdWFsKDQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2VtaXRzIGNoYW5nZSBldmVudCcsICgpID0+IHtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IHNpbm9uLnNweSgpO1xuICAgICAgc3RvcmUuYWRkTGlzdGVuZXIoJ2NoYW5nZScsIGxpc3RlbmVyKTtcblxuICAgICAgc3RvcmUuc2V0U3RhdGUoeyBmb286ICdiYXInIH0pO1xuXG4gICAgICBleHBlY3QobGlzdGVuZXIuY2FsbGVkT25jZSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdiYXRjaGVzIG11bHRpcGxlIHN0YXRlIHVwZGF0ZXMgd2l0aGluIGFjdGlvbiBoYW5kbGVyJywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuICAgICAgbGV0IGxpc3RlbmVyID0gc2lub24uc3B5KCk7XG4gICAgICBzdG9yZS5hZGRMaXN0ZW5lcignY2hhbmdlJywgbGlzdGVuZXIpO1xuXG4gICAgICBzdG9yZS5yZWdpc3RlcihhY3Rpb25JZCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBiYXI6ICdiYXonIH0pO1xuXG4gICAgICAgIGV4cGVjdCh0aGlzLnN0YXRlKS50by5kZWVwLmVxdWFsKHsgZm9vOiAnYmFyJyB9KTtcbiAgICAgICAgZXhwZWN0KGxpc3RlbmVyLmNhbGxlZCkudG8uYmUuZmFsc2U7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGJhejogJ2ZvbycgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2ltdWxhdGUgZGlzcGF0Y2hcbiAgICAgIHN0b3JlLmhhbmRsZXIoeyBhY3Rpb25JZCwgYm9keTogJ2Zvb2JhcicgfSk7XG5cbiAgICAgIGV4cGVjdChsaXN0ZW5lci5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlKS50by5kZWVwLmVxdWFsKHsgZm9vOiAnYmFyJywgYmFyOiAnYmF6JywgYmF6OiAnZm9vJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCd3YXJucyBpZiBjYWxsZWQgZnJvbSBvdXRzaWRlIGFuIGFjdGlvbiBoYW5kbGVyJywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuICAgICAgbGV0IHdhcm4gPSBzaW5vbi5zcHkoY29uc29sZSwgJ3dhcm4nKTtcblxuICAgICAgc3RvcmUuc2V0U3RhdGUoeyBmb286ICdiYXInIH0pO1xuXG4gICAgICBleHBlY3Qod2Fybi5maXJzdENhbGwuYXJnc1swXSkudG8uZXF1YWwoXG4gICAgICAgICdTdG9yZSNzZXRTdGF0ZSgpIGNhbGxlZCBmcm9tIG91dHNpZGUgYW4gYWN0aW9uIGhhbmRsZXIuIFRoaXMgaXMgJ1xuICAgICAgKyAnbGlrZWx5IGEgbWlzdGFrZS4gRmx1eCBzdG9yZXMgc2hvdWxkIG1hbmFnZSB0aGVpciBvd24gc3RhdGUuJ1xuICAgICAgKTtcblxuICAgICAgY29uc29sZS53YXJuLnJlc3RvcmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNyZXBsYWNlU3RhdGUoKScsICgpID0+IHtcbiAgICBpdCgncmVwbGFjZXMgb2xkIHN0YXRlIHdpdGggbmV3IHN0YXRlJywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuXG4gICAgICBzdG9yZS5yZXBsYWNlU3RhdGUoeyBiYXI6ICdiYXonIH0pO1xuXG4gICAgICBleHBlY3Qoc3RvcmUuc3RhdGUpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICBiYXI6ICdiYXonLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYmF0Y2hlcyBtdWx0aXBsZSBzdGF0ZSB1cGRhdGVzIHdpdGhpbiBhY3Rpb24gaGFuZGxlcicsICgpID0+IHtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IHNpbm9uLnNweSgpO1xuICAgICAgc3RvcmUuYWRkTGlzdGVuZXIoJ2NoYW5nZScsIGxpc3RlbmVyKTtcblxuICAgICAgc3RvcmUucmVnaXN0ZXIoYWN0aW9uSWQsIGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnJlcGxhY2VTdGF0ZSh7IGJhcjogJ2JheicgfSk7XG5cbiAgICAgICAgZXhwZWN0KHRoaXMuc3RhdGUpLnRvLmRlZXAuZXF1YWwoeyBmb286ICdiYXInIH0pO1xuICAgICAgICBleHBlY3QobGlzdGVuZXIuY2FsbGVkKS50by5iZS5mYWxzZTtcblxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZm9vOiAnYmFyJyB9KTtcbiAgICAgICAgdGhpcy5yZXBsYWNlU3RhdGUoeyBiYXo6ICdmb28nIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNpbXVsYXRlIGRpc3BhdGNoXG4gICAgICBzdG9yZS5oYW5kbGVyKHsgYWN0aW9uSWQsIGJvZHk6ICdmb29iYXInIH0pO1xuXG4gICAgICBleHBlY3QobGlzdGVuZXIuY2FsbGVkT25jZSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzdG9yZS5zdGF0ZSkudG8uZGVlcC5lcXVhbCh7IGJhejogJ2ZvbycgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZW1pdHMgY2hhbmdlIGV2ZW50JywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuICAgICAgbGV0IGxpc3RlbmVyID0gc2lub24uc3B5KCk7XG4gICAgICBzdG9yZS5hZGRMaXN0ZW5lcignY2hhbmdlJywgbGlzdGVuZXIpO1xuXG4gICAgICBzdG9yZS5yZXBsYWNlU3RhdGUoeyBmb286ICdiYXInIH0pO1xuXG4gICAgICBleHBlY3QobGlzdGVuZXIuY2FsbGVkT25jZSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5hc3NpZ25TdGF0ZScsICgpID0+IHtcbiAgICBpdCgnY2FuIGJlIG92ZXJyaWRkZW4gdG8gZW5hYmxlIGN1c3RvbSBzdGF0ZSB0eXBlcycsICgpID0+IHtcbiAgICAgIGNsYXNzIFN0cmluZ1N0b3JlIGV4dGVuZHMgU3RvcmUge1xuICAgICAgICBzdGF0aWMgYXNzaWduU3RhdGUocHJldlN0YXRlLCBuZXh0U3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4gW3ByZXZTdGF0ZSwgbmV4dFN0YXRlXVxuICAgICAgICAgICAgLmZpbHRlcihzdGF0ZSA9PiB0eXBlb2Ygc3RhdGUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0b3JlID0gbmV3IFN0cmluZ1N0b3JlKCk7XG5cbiAgICAgIGV4cGVjdChzdG9yZS5zdGF0ZSkudG8uYmUubnVsbDtcbiAgICAgIHN0b3JlLnNldFN0YXRlKCdhJyk7XG4gICAgICBleHBlY3Qoc3RvcmUuc3RhdGUpLnRvLmVxdWFsKCdhJyk7XG4gICAgICBzdG9yZS5zZXRTdGF0ZSgnYicpO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlKS50by5lcXVhbCgnYWInKTtcbiAgICAgIHN0b3JlLnJlcGxhY2VTdGF0ZSgneHl6Jyk7XG4gICAgICBleHBlY3Qoc3RvcmUuc3RhdGUpLnRvLmVxdWFsKCd4eXonKTtcbiAgICAgIHN0b3JlLnNldFN0YXRlKCd6eXgnKTtcbiAgICAgIGV4cGVjdChzdG9yZS5zdGF0ZSkudG8uZXF1YWwoJ3h5enp5eCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnI2ZvcmNlVXBkYXRlKCknLCAoKSA9PiB7XG4gICAgaXQoJ2VtaXRzIGNoYW5nZSBldmVudCcsICgpID0+IHtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IHNpbm9uLnNweSgpO1xuICAgICAgc3RvcmUuYWRkTGlzdGVuZXIoJ2NoYW5nZScsIGxpc3RlbmVyKTtcblxuICAgICAgc3RvcmUuZm9yY2VVcGRhdGUoKTtcblxuICAgICAgZXhwZWN0KGxpc3RlbmVyLmNhbGxlZE9uY2UpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lc25cXCd0IG1vZGlmeSBleGlzdGluZyBzdGF0ZScsICgpID0+IHtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IHNpbm9uLnNweSgpO1xuICAgICAgc3RvcmUuYWRkTGlzdGVuZXIoJ2NoYW5nZScsIGxpc3RlbmVyKTtcblxuICAgICAgc3RvcmUucmVnaXN0ZXIoYWN0aW9uSWQsIGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnJlcGxhY2VTdGF0ZSh7IGJhcjogJ2JheicgfSk7XG4gICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcblxuICAgICAgICBleHBlY3QodGhpcy5zdGF0ZSkudG8uZGVlcC5lcXVhbCh7IGZvbzogJ2JhcicgfSk7XG4gICAgICAgIGV4cGVjdChsaXN0ZW5lci5jYWxsZWQpLnRvLmJlLmZhbHNlO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBmb286ICdiYXInIH0pO1xuICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgIHRoaXMucmVwbGFjZVN0YXRlKHsgYmF6OiAnZm9vJyB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTaW11bGF0ZSBkaXNwYXRjaFxuICAgICAgc3RvcmUuaGFuZGxlcih7IGFjdGlvbklkLCBib2R5OiAnZm9vYmFyJyB9KTtcblxuICAgICAgZXhwZWN0KGxpc3RlbmVyLmNhbGxlZE9uY2UpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3RvcmUuc3RhdGUpLnRvLmRlZXAuZXF1YWwoeyBiYXo6ICdmb28nIH0pO1xuICAgIH0pO1xuICB9KTtcblxufSk7XG4iXX0= |